14 #include <ecl/modules/eclChargedPIDDataAnalysisExpert/ECLChargedPIDDataAnalysisModule.h>
15 #include <framework/dataobjects/EventMetaData.h>
16 #include <framework/datastore/StoreObjPtr.h>
17 #include <framework/datastore/StoreArray.h>
18 #include <framework/datastore/RelationVector.h>
19 #include <framework/logging/Logger.h>
20 #include <framework/gearbox/Const.h>
22 #include <mdst/dataobjects/MCParticle.h>
23 #include <mdst/dataobjects/Track.h>
24 #include <ecl/dataobjects/ECLShower.h>
43 m_eclShowers(eclShowerArrayName()),
52 n1_eclShowerMultip(0),
53 n1_eclShowerEnergy(0),
57 n1_eclShowerHypothesisId(0),
58 n1_eclShowerAbsZernike40(0),
59 n1_eclShowerAbsZernike51(0),
87 n2_eclShowerMultip(0),
88 n2_eclShowerEnergy(0),
92 n2_eclShowerHypothesisId(0),
93 n2_eclShowerAbsZernike40(0),
94 n2_eclShowerAbsZernike51(0),
116 setDescription(
"This module produces an ntuple with ECL-related quantities starting from mdst");
117 addParam(
"writeToRoot", m_writeToRoot,
118 "set true if you want to save the informations in a root file named by parameter 'rootFileName'",
120 addParam(
"rootFileName", m_rootFileName,
121 "fileName used for root file where info are saved. Will be ignored if parameter 'writeToRoot' is false (standard)",
122 string(
"eclChargedPID"));
125 ECLChargedPIDDataAnalysisModule::~ECLChargedPIDDataAnalysisModule()
129 void ECLChargedPIDDataAnalysisModule::initialize()
131 B2INFO(
"[ECLChargedPIDDataAnalysis Module]: Starting initialization of ECLChargedPIDDataAnalysis Module.");
134 m_rootFilePtr =
new TFile(m_rootFileName.c_str(),
"RECREATE");
136 m_rootFilePtr = NULL;
139 n1_tree =
new TTree(
"n1_tree",
"ECL Charged PID tree: N1 Hypothesis");
141 n1_tree->Branch(
"expNo", &n1_iExperiment,
"expNo/I");
142 n1_tree->Branch(
"runNo", &n1_iRun,
"runNo/I");
143 n1_tree->Branch(
"evtNo", &n1_iEvent,
"evtNo/I");
146 n1_tree->Branch(
"eclShowerMultip", &n1_eclShowerMultip,
"eclShowerMultip/I");
147 n1_tree->Branch(
"eclShowerEnergy",
"std::vector<double>", &n1_eclShowerEnergy);
148 n1_tree->Branch(
"eclShowerTheta",
"std::vector<double>", &n1_eclShowerTheta);
149 n1_tree->Branch(
"eclShowerPhi",
"std::vector<double>", &n1_eclShowerPhi);
150 n1_tree->Branch(
"eclShowerR",
"std::vector<double>", &n1_eclShowerR);
151 n1_tree->Branch(
"eclShowerHypothesisId",
"std::vector<int>", &n1_eclShowerHypothesisId);
152 n1_tree->Branch(
"eclShowerAbsZernike40",
"std::vector<double>", &n1_eclShowerAbsZernike40);
153 n1_tree->Branch(
"eclShowerAbsZernike51",
"std::vector<double>", &n1_eclShowerAbsZernike51);
156 n1_tree->Branch(
"mcMultip", &n1_mcMultip,
"mcMultip/I");
157 n1_tree->Branch(
"mcPdg",
"std::vector<int>", &n1_mcPdg);
158 n1_tree->Branch(
"mcMothPdg",
"std::vector<int>", &n1_mcMothPdg);
159 n1_tree->Branch(
"mcEnergy",
"std::vector<double>", &n1_mcEnergy);
160 n1_tree->Branch(
"mcP",
"std::vector<double>", &n1_mcP);
161 n1_tree->Branch(
"mcTheta",
"std::vector<double>", &n1_mcTheta);
162 n1_tree->Branch(
"mcPhi",
"std::vector<double>", &n1_mcPhi);
165 n1_tree->Branch(
"trkMultip", &n1_trkMultip,
"trkMulti/I");
166 n1_tree->Branch(
"trkPdg",
"std::vector<int>", &n1_trkPdg);
167 n1_tree->Branch(
"trkCharge",
"std::vector<int>", &n1_trkCharge);
168 n1_tree->Branch(
"trkP",
"std::vector<double>", &n1_trkP);
169 n1_tree->Branch(
"trkTheta",
"std::vector<double>", &n1_trkTheta);
170 n1_tree->Branch(
"trkPhi",
"std::vector<double>", &n1_trkPhi);
172 n1_tree->Branch(
"eclEoP",
"std::vector<double>", &n1_eclEoP);
175 n2_tree =
new TTree(
"n2_tree",
"ECL Charged PID tree: N2 Hypothesis");
177 n2_tree->Branch(
"expNo", &n2_iExperiment,
"expNo/I");
178 n2_tree->Branch(
"runNo", &n2_iRun,
"runNo/I");
179 n2_tree->Branch(
"evtNo", &n2_iEvent,
"evtNo/I");
182 n2_tree->Branch(
"eclShowerMultip", &n2_eclShowerMultip,
"eclShowerMultip/I");
183 n2_tree->Branch(
"eclShowerEnergy",
"std::vector<double>", &n2_eclShowerEnergy);
184 n2_tree->Branch(
"eclShowerTheta",
"std::vector<double>", &n2_eclShowerTheta);
185 n2_tree->Branch(
"eclShowerPhi",
"std::vector<double>", &n2_eclShowerPhi);
186 n2_tree->Branch(
"eclShowerR",
"std::vector<double>", &n2_eclShowerR);
187 n2_tree->Branch(
"eclShowerHypothesisId",
"std::vector<int>", &n2_eclShowerHypothesisId);
188 n2_tree->Branch(
"eclShowerAbsZernike40",
"std::vector<double>", &n2_eclShowerAbsZernike40);
189 n2_tree->Branch(
"eclShowerAbsZernike51",
"std::vector<double>", &n2_eclShowerAbsZernike51);
192 n2_tree->Branch(
"mcMultip", &n2_mcMultip,
"mcMultip/I");
193 n2_tree->Branch(
"mcPdg",
"std::vector<int>", &n2_mcPdg);
194 n2_tree->Branch(
"mcMothPdg",
"std::vector<int>", &n2_mcMothPdg);
195 n2_tree->Branch(
"mcEnergy",
"std::vector<double>", &n2_mcEnergy);
196 n2_tree->Branch(
"mcP",
"std::vector<double>", &n2_mcP);
197 n2_tree->Branch(
"mcTheta",
"std::vector<double>", &n2_mcTheta);
198 n2_tree->Branch(
"mcPhi",
"std::vector<double>", &n2_mcPhi);
201 n2_tree->Branch(
"trkMultip", &n2_trkMultip,
"trkMulti/I");
202 n2_tree->Branch(
"trkPdg",
"std::vector<int>", &n2_trkPdg);
203 n2_tree->Branch(
"trkCharge",
"std::vector<int>", &n2_trkCharge);
204 n2_tree->Branch(
"trkP",
"std::vector<double>", &n2_trkP);
205 n2_tree->Branch(
"trkTheta",
"std::vector<double>", &n2_trkTheta);
206 n2_tree->Branch(
"trkPhi",
"std::vector<double>", &n2_trkPhi);
208 n2_tree->Branch(
"eclEoP",
"std::vector<double>", &n2_eclEoP);
210 B2INFO(
"[ECLChargedPIDDataAnalysis Module]: Initialization of ECLChargedPIDDataAnalysis Module completed.");
213 void ECLChargedPIDDataAnalysisModule::beginRun()
217 void ECLChargedPIDDataAnalysisModule::event()
220 B2DEBUG(1,
" ++++++++++++++ ECLChargedPIDDataAnalysisModule");
223 n1_eclShowerMultip = 0;
224 n1_eclShowerEnergy->clear();
225 n1_eclShowerTheta->clear();
226 n1_eclShowerPhi->clear();
227 n1_eclShowerR->clear();
228 n1_eclShowerHypothesisId->clear();
229 n1_eclShowerAbsZernike40->clear();
230 n1_eclShowerAbsZernike51->clear();
235 n1_mcMothPdg->clear();
236 n1_mcEnergy->clear();
244 n1_trkCharge->clear();
246 n1_trkTheta->clear();
252 n2_eclShowerMultip = 0;
253 n2_eclShowerEnergy->clear();
254 n2_eclShowerTheta->clear();
255 n2_eclShowerPhi->clear();
256 n2_eclShowerR->clear();
257 n2_eclShowerHypothesisId->clear();
258 n2_eclShowerAbsZernike40->clear();
259 n2_eclShowerAbsZernike51->clear();
264 n2_mcMothPdg->clear();
265 n2_mcEnergy->clear();
273 n2_trkCharge->clear();
275 n2_trkTheta->clear();
282 n1_iExperiment = eventmetadata->getExperiment();
283 n1_iRun = eventmetadata->getRun();
284 n1_iEvent = eventmetadata->getEvent();
285 n2_iExperiment = eventmetadata->getExperiment();
286 n2_iRun = eventmetadata->getRun();
287 n2_iEvent = eventmetadata->getEvent();
301 if (!imcpart.hasStatus(MCParticle::c_PrimaryParticle))
continue;
302 if (imcpart.hasStatus(MCParticle::c_Initial))
continue;
303 if (imcpart.hasStatus(MCParticle::c_IsVirtual))
continue;
309 n1_mcPdg->push_back(imcpart.getPDG());
310 if (imcpart.getMother() != NULL) n1_mcMothPdg->push_back(imcpart.getMother()->getPDG());
311 else n1_mcMothPdg->push_back(-999);
312 n1_mcEnergy->push_back(imcpart.getEnergy());
313 n1_mcP->push_back(imcpart.getMomentum().Mag());
314 n1_mcTheta->push_back(imcpart.getMomentum().Theta());
315 n1_mcPhi->push_back(imcpart.getMomentum().Phi());
317 n2_mcPdg->push_back(imcpart.getPDG());
318 if (imcpart.getMother() != NULL) n2_mcMothPdg->push_back(imcpart.getMother()->getPDG());
319 else n2_mcMothPdg->push_back(-999);
320 n2_mcEnergy->push_back(imcpart.getEnergy());
321 n2_mcP->push_back(imcpart.getMomentum().Mag());
322 n2_mcTheta->push_back(imcpart.getMomentum().Theta());
323 n2_mcPhi->push_back(imcpart.getMomentum().Phi());
327 int index_max_mom = -1;
329 for (
const auto& itrk : imcpart.getRelationsFrom<
Track>()) {
331 const TrackFitResult* atrkF = itrk.getTrackFitResult(Const::pion);
332 if (atrkF ==
nullptr)
continue;
335 index_max_mom = index;
339 if (index_max_mom == -1)
continue;
342 const auto itrack = imcpart.getRelationsFrom<
Track>()[index_max_mom];
344 const TrackFitResult* atrkF = itrack->getTrackFitResult(Const::pion);
350 n1_trkPdg->push_back(atrkF->getParticleType().getPDGCode());
351 n1_trkCharge->push_back(atrkF->getChargeSign());
352 n1_trkP->push_back(atrkF->getMomentum().Mag());
353 n1_trkTheta->push_back(atrkF->getMomentum().Theta());
354 n1_trkPhi->push_back(atrkF->getMomentum().Phi());
356 n2_trkPdg->push_back(atrkF->getParticleType().getPDGCode());
357 n2_trkCharge->push_back(atrkF->getChargeSign());
358 n2_trkP->push_back(atrkF->getMomentum().Mag());
359 n2_trkTheta->push_back(atrkF->getMomentum().Theta());
360 n2_trkPhi->push_back(atrkF->getMomentum().Phi());
364 int jndex1_max_e = -1;
366 for (
const auto& i1sh : itrack->getRelationsTo<
ECLShower>()) {
369 if (i1sh.getHypothesisId() != 5)
continue;
371 if (abs(i1sh.getTime()) > i1sh.getDeltaTime99())
continue;
372 if (i1sh.getEnergy() > max_e1) {
374 jndex1_max_e = jndex1;
378 int jndex2_max_e = -1;
380 for (
const auto& i2sh : itrack->getRelationsTo<
ECLShower>()) {
383 if (i2sh.getHypothesisId() != 6)
continue;
385 if (abs(i2sh.getTime()) > i2sh.getDeltaTime99())
continue;
386 if (i2sh.getEnergy() > max_e2) {
387 max_e2 = i2sh.getEnergy();
388 jndex2_max_e = jndex2;
393 if (jndex1_max_e != -1) {
394 const auto i1shower = itrack->getRelationsTo<
ECLShower>()[jndex1_max_e];
396 n1_eclShowerEnergy->push_back(i1shower->getEnergy());
397 n1_eclShowerTheta->push_back(i1shower->getTheta());
398 n1_eclShowerPhi->push_back(i1shower->getPhi());
399 n1_eclShowerR->push_back(i1shower->getR());
400 n1_eclShowerHypothesisId->push_back(i1shower->getHypothesisId());
402 n1_eclShowerAbsZernike40->push_back(i1shower->getAbsZernike40());
403 n1_eclShowerAbsZernike51->push_back(i1shower->getAbsZernike51());
405 n1_eclEoP->push_back((i1shower->getEnergy()) / (atrkF->getMomentum().Mag()));
406 n1_eclShowerMultip++;
408 if (jndex2_max_e != -1) {
411 n2_eclShowerEnergy->push_back(i2shower->getEnergy());
412 n2_eclShowerTheta->push_back(i2shower->getTheta());
413 n2_eclShowerPhi->push_back(i2shower->getPhi());
414 n2_eclShowerR->push_back(i2shower->getR());
415 n2_eclShowerHypothesisId->push_back(i2shower->getHypothesisId());
417 n2_eclShowerAbsZernike40->push_back(i2shower->getAbsZernike40());
418 n2_eclShowerAbsZernike51->push_back(i2shower->getAbsZernike51());
420 n2_eclEoP->push_back((i2shower->getEnergy()) / (atrkF->getMomentum().Mag()));
421 n2_eclShowerMultip++;
430 void ECLChargedPIDDataAnalysisModule::endRun()
434 void ECLChargedPIDDataAnalysisModule::terminate()
436 if (m_rootFilePtr != NULL) {