15 #include <trg/ecl/modules/MCMatcherTRGECL/MCMatcherTRGECLModule.h>
18 #include <framework/gearbox/Unit.h>
21 #include <ecl/dataobjects/ECLHit.h>
24 #include "trg/ecl/dataobjects/TRGECLHit.h"
25 #include "trg/ecl/dataobjects/TRGECLDigi0.h"
28 #include <mdst/dataobjects/MCParticle.h>
29 #include <framework/datastore/RelationArray.h>
43 using namespace boost;
60 setDescription(
"MCMatcherTRGECLModule");
61 setPropertyFlags(c_ParallelProcessingCertified);
65 for (
int ii = 0; ii < 100; ii++) {
69 SignalContribution[ii] = 0;
70 BKGContribution[ii] = 0;
74 SignalContributionHit[ii] = 0;
75 BKGContributionHit[ii] = 0;
77 for (
int icont = 0 ; icont < 3 ; icont ++) {
80 maxEnergy[ii][icont] = -1;
81 contribution[ii][icont] = 0;
82 TCPrimaryIndex[ii][icont] = -1;
83 XtalId[ii][icont] = -1 ;
88 trackId[ii][icont] = 0;
89 background_tag[ii][icont] = 0;
90 mother[ii][icont] = 0 ;
91 gmother[ii][icont] = 0;
92 ggmother[ii][icont] = 0;
93 gggmother[ii][icont] = 0;
94 MCEnergy[ii][icont] = 0;
96 ieclhit[ii][icont] = 0 ;
98 background_tagHit[ii][icont] = 0;
99 TCPrimaryIndexHit[ii][icont] = -1;
100 XtalIdHit[ii][icont] = -1 ;
101 pxHit[ii][icont] = 0;
102 pyHit[ii][icont] = 0;
103 pzHit[ii][icont] = 0;
104 pidHit[ii][icont] = 0;
105 trackIdHit[ii][icont] = 0;
106 background_tagHit[ii][icont] = 0;
107 motherHit[ii][icont] = 0 ;
108 gmotherHit[ii][icont] = 0;
109 ggmotherHit[ii][icont] = 0;
110 gggmotherHit[ii][icont] = 0;
111 MCEnergyHit[ii][icont] = 0;
112 contributionHit[ii][icont] = 0;
118 MCMatcherTRGECLModule::~MCMatcherTRGECLModule()
123 void MCMatcherTRGECLModule::initialize()
129 m_timeCPU = clock() * Unit::us;
131 m_trgECLDigi0MC.registerInDataStore();
132 m_trgECLHitMC.registerInDataStore();
144 void MCMatcherTRGECLModule::beginRun()
148 void MCMatcherTRGECLModule::event()
154 eclPrimaryMap.
clear();
157 for (
int iPart = 0; iPart < nParticles ; ++iPart) {
158 if (mcParticles[iPart]->getMother() == NULL) {
159 if (!mcParticles[iPart]->hasStatus(MCParticle::c_PrimaryParticle)) {
160 if (!mcParticles[iPart]->hasStatus(MCParticle::c_StableInGenerator)) {
168 bool adhoc_StableInGeneratorFlag(mcParticles[iPart]->hasStatus(MCParticle::c_StableInGenerator));
170 if (mcParticles[iPart]->hasStatus(MCParticle::c_PrimaryParticle)
171 && adhoc_StableInGeneratorFlag) {
172 if (mcParticles[iPart]->getArrayIndex() == -1) {
173 eclPrimaryMap.insert(pair<int, int>(iPart, iPart));
175 eclPrimaryMap.insert(pair<int, int>(mcParticles[iPart]->getArrayIndex(), mcParticles[iPart]->getArrayIndex()));
178 if (mcParticles[iPart]->getMother() == NULL)
continue;
179 if (eclPrimaryMap.find(mcParticles[iPart]->getMother()->getArrayIndex()) != eclPrimaryMap.end()) {
180 eclPrimaryMap.insert(
181 pair<int, int>(mcParticles[iPart]->getArrayIndex(), eclPrimaryMap[mcParticles[iPart]->getMother()->getArrayIndex()]));
192 RelationArray trgeclDigi0ToMCPart(trgeclDigi0Array, mcParticles);
197 const int NofTCDigiHit = trgeclDigi0Array.
getEntries();
201 for (
int ii = 0; ii < NofTCDigiHit; ii++) {
205 TCId[ihit] = (aTRGECLDigi0->
getTCId() - 1);
208 int itimeindex = (int)(TCRawTiming[ihit] / 100 + 40);
209 TCRawEnergy[ihit] = aTRGECLDigi0 ->
getRawEnergy() / Unit::GeV;
210 if (TCRawEnergy[ihit] < 0.1) {
continue;}
211 for (
int hit = 0; hit < nHits_hit; hit++) {
213 ECLHit* aECLHit = eclHitArray[hit];;
216 if (hitE < 0.1) {
continue;}
217 int hitCellId = aECLHit->
getCellId() - 1;
218 int hitTCId = _TCMap->getTCIdFromXtalId(hitCellId + 1) - 1;
219 int timeindex = (int)((aECLHit ->getTimeAve()) / 100 + 40);
222 if (hitTCId != TCId[ihit]) {
continue;}
223 if (itimeindex != timeindex) {
continue;}
224 if (backtag == 0) { SignalContribution[ihit] = SignalContribution[ihit] + hitE;}
225 else if (backtag != 0) { BKGContribution[ihit] = BKGContribution[ihit] + hitE;}
228 if (TCId[ihit] == hitTCId && maxEnergy[ihit][0] < hitE) {
230 ieclhit[ihit][0] = hit;
231 maxEnergy[ihit][0] = hitE;
232 contribution[ihit][0] = hitE;
233 XtalId[ihit][0] = hitCellId ;
234 background_tag[ihit][0] = backtag;
239 if (TCId[ihit] == hitTCId && maxEnergy[ihit][1] < hitE && hitE < maxEnergy[ihit][0]) {
240 ieclhit[ihit][1] = hit;
241 maxEnergy[ihit][1] = hitE;
242 contribution[ihit][1] = hitE;
243 XtalId[ihit][1] = hitCellId ;
244 background_tag[ihit][1] = backtag;
248 if (TCId[ihit] == hitTCId && maxEnergy[ihit][2] < hitE && hitE < maxEnergy[ihit][1]) {
249 ieclhit[ihit][2] = hit;
250 maxEnergy[ihit][2] = hitE;
251 contribution[ihit][2] = hitE;
252 XtalId[ihit][2] = hitCellId ;
253 background_tag[ihit][2] = backtag;
258 for (
int index = 0; index < eclHitRel.
getEntries(); index++) {
259 int PrimaryIndex = -1;
261 map<int, int>::iterator iter = eclPrimaryMap.find(eclHitRel[index].getFromIndex());
263 if (iter != eclPrimaryMap.end()) {
264 PrimaryIndex = iter->second;
266 int eclhitRelSize = eclHitRel[index].getToIndices().size();
267 for (
int pri_hit = 0; pri_hit < eclhitRelSize ; pri_hit++) {
268 int ieclHitRel = eclHitRel[index].getToIndex(pri_hit);
269 if (ieclhit[ihit][0] == ieclHitRel) {
270 TCPrimaryIndex[ihit][0] = PrimaryIndex;
273 if (ieclhit[ihit][1] == ieclHitRel) {
274 TCPrimaryIndex[ihit][1] = PrimaryIndex;
277 if (ieclhit[ihit][2] == ieclHitRel) {
278 TCPrimaryIndex[ihit][2] = PrimaryIndex;
285 trackId[ihit][0] = TCPrimaryIndex[ihit][0];
286 trackId[ihit][1] = TCPrimaryIndex[ihit][1];
287 trackId[ihit][2] = TCPrimaryIndex[ihit][2];
295 if (TCPrimaryIndex[ihit][0] > 0) {
297 MCEnergy[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getEnergy();
298 pid[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getPDG();
299 px[ihit][0] = (mcParticles[TCPrimaryIndex[ihit][0]]->getMomentum()).X();
300 py[ihit][0] = (mcParticles[TCPrimaryIndex[ihit][0]]->getMomentum()).Y();
301 pz[ihit][0] = (mcParticles[TCPrimaryIndex[ihit][0]]->getMomentum()).Z();
302 if (pid[ihit][0] != 0 && (mcParticles[TCPrimaryIndex[ihit][0]]->getMother())) {
303 mother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother() ->getPDG();
304 mclist = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()-> getIndex();
306 if (mclist != 1 && mother[ihit][0] != 0 && (mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother())) {
307 gmother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother() ->getPDG();
308 mclist = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()-> getIndex();
311 if (mclist != 1 && gmother[ihit][0] != 0 && (mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother())) {
312 ggmother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother() ->getPDG();
313 mclist = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother()-> getIndex();
317 if (mclist != 1 && ggmother[ihit][0] != 0) {
318 if (mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother()->getMother()) {
319 gggmother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother()->getMother() ->getPDG();
326 if (TCPrimaryIndex[ihit][1] > 0) {
328 MCEnergy[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getEnergy();
329 pid[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getPDG();
330 px[ihit][1] = (mcParticles[TCPrimaryIndex[ihit][1]]->getMomentum()).X();
331 py[ihit][1] = (mcParticles[TCPrimaryIndex[ihit][1]]->getMomentum()).Y();
332 pz[ihit][1] = (mcParticles[TCPrimaryIndex[ihit][1]]->getMomentum()).Z();
333 if (pid[ihit][1] != 0 && (mcParticles[TCPrimaryIndex[ihit][1]]->getMother())) {
334 mother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother() ->getPDG();
335 mclist = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()-> getIndex();
337 if (mclist != 1 && mother[ihit][1] != 0 && (mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother())) {
338 gmother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother() ->getPDG();
339 mclist = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()-> getIndex();
342 if (mclist != 1 && gmother[ihit][1] != 0 && (mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother())) {
343 ggmother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother() ->getPDG();
344 mclist = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother()-> getIndex();
346 if (mclist != 1 && ggmother[ihit][1] != 0) {
347 if (mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother()->getMother()) {
348 gggmother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother()->getMother() ->getPDG();
353 if (TCPrimaryIndex[ihit][2] > 0) {
355 MCEnergy[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getEnergy();
356 pid[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getPDG();
357 px[ihit][2] = (mcParticles[TCPrimaryIndex[ihit][2]]->getMomentum()).X();
358 py[ihit][2] = (mcParticles[TCPrimaryIndex[ihit][2]]->getMomentum()).Y();
359 pz[ihit][2] = (mcParticles[TCPrimaryIndex[ihit][2]]->getMomentum()).Z();
360 if (pid[ihit][2] != 0 && (mcParticles[TCPrimaryIndex[ihit][2]]->getMother())) {
361 mother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother() ->getPDG();
362 mclist = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()-> getIndex();
364 if (mclist != 1 && mother[ihit][2] != 0 && (mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother())) {
365 gmother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother() ->getPDG();
366 mclist = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()-> getIndex();
369 if (mclist != 1 && gmother[ihit][2] != 0 && (mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother())) {
370 ggmother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother() ->getPDG();
371 mclist = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother()-> getIndex();
373 if (mclist != 1 && ggmother[ihit][2] != 0) {
374 if (mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother()->getMother()) {
375 gggmother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother()->getMother() ->getPDG();
380 trgeclDigi0ToMCPart.
add(ii, TCPrimaryIndex[ihit][0]);
387 for (
int ii = 0; ii < ihit; ii++) {
389 if (TCRawEnergy[ii] < 0.1) {
continue;}
393 TCDigiArray[m_hitNum]->setEventId(m_nEvent);
394 TCDigiArray[m_hitNum]->setTCId(TCId[ii]);
396 TCDigiArray[m_hitNum]->setRawEnergy(TCRawEnergy[ii]);
397 TCDigiArray[m_hitNum]->setRawTiming(TCRawTiming[ii]);
398 TCDigiArray[m_hitNum]->setTrackId(trackId[ii]);
399 TCDigiArray[m_hitNum]->setCellId(XtalId[ii]);
401 TCDigiArray[m_hitNum]->setPDG(pid[ii]);
402 TCDigiArray[m_hitNum]->setMother(mother[ii]);
403 TCDigiArray[m_hitNum]->setGMother(gmother[ii]);
404 TCDigiArray[m_hitNum]->setGGMother(ggmother[ii]);
405 TCDigiArray[m_hitNum]->setGGGMother(gggmother[ii]);
407 TCDigiArray[m_hitNum]->setPX(px[ii]);
408 TCDigiArray[m_hitNum]->setPY(py[ii]);
409 TCDigiArray[m_hitNum]->setPZ(pz[ii]);
410 TCDigiArray[m_hitNum]->setMCEnergy(MCEnergy[ii]);
411 TCDigiArray[m_hitNum]->setContribution(contribution[ii]);
412 TCDigiArray[m_hitNum]->setBackgroundTag(background_tag[ii]);
413 TCDigiArray[m_hitNum]->setSignalContribution(SignalContribution[ii]);
414 TCDigiArray[m_hitNum]->setBKGContribution(BKGContribution[ii]);
420 RelationArray trgeclHitToMCPart(trgeclHitArray, mcParticles);
421 const int NofTCHit = trgeclHitArray.
getEntries();
424 for (
int ii = 0; ii < NofTCHit; ii++) {
426 TRGECLHit* aTRGECLHit = trgeclHitArray[ii];
427 TCIdHit[ii] = (aTRGECLHit->
getTCId() - 1);
429 TCHitEnergy[ii] = aTRGECLHit -> getEnergyDep();
430 int itimeindex = (int)(TCHitTiming[ii] / 100 + 40);
432 for (
int index = 0; index < trgeclDigi0ToMCPart.
getEntries(); index++) {
434 int idigitimeindex = (int)(TCRawTiming[idigi] / 100 + 40);
435 if (TCId[idigi] != TCIdHit[ii]) {
continue;}
436 if (itimeindex != idigitimeindex) {
continue;}
438 TCPrimaryIndexHit[ii][0] = TCPrimaryIndex[idigi][0];
439 contributionHit[ii][0] = contribution[idigi][0];
440 XtalIdHit[ii][0] = XtalId[idigi][0] ;
442 TCPrimaryIndexHit[ii][1] = TCPrimaryIndex[idigi][1];
443 contributionHit[ii][1] = contribution[idigi][1];
444 XtalIdHit[ii][1] = XtalId[idigi][1] ;
446 TCPrimaryIndexHit[ii][2] = TCPrimaryIndex[idigi][2];
447 contributionHit[ii][2] = contribution[idigi][2];
448 XtalIdHit[ii][2] = XtalId[idigi][2] ;
450 background_tagHit[ii][0] = background_tag[idigi][0] ;
451 background_tagHit[ii][1] = background_tag[idigi][1] ;
452 background_tagHit[ii][2] = background_tag[idigi][2] ;
454 SignalContributionHit[ii] = SignalContribution[idigi];
456 BKGContributionHit[ii] = BKGContribution[idigi];
459 trackIdHit[ii][0] = trackId[idigi][0];
460 trackIdHit[ii][1] = trackId[idigi][0];
461 trackIdHit[ii][2] = trackId[idigi][0];
463 MCEnergyHit[ii][0] = MCEnergy[idigi][0];
464 pidHit[ii][0] = pid[idigi][0] ;
465 pxHit[ii][0] = px[idigi][0];
466 pyHit[ii][0] = py[idigi][0];
467 pzHit[ii][0] = pz[idigi][0];
468 gmotherHit[ii][0] = gmother[idigi][0];
469 ggmotherHit[ii][0] = ggmother[idigi][0];
470 gggmotherHit[ii][0] = gggmother[idigi][0];
472 MCEnergyHit[ii][1] = MCEnergy[idigi][1];
473 pidHit[ii][1] = pid[idigi][1] ;
474 pxHit[ii][1] = px[idigi][1];
475 pyHit[ii][1] = py[idigi][1];
476 pzHit[ii][1] = pz[idigi][1];
477 gmotherHit[ii][1] = gmother[idigi][1];
478 ggmotherHit[ii][1] = ggmother[idigi][1];
479 gggmotherHit[ii][1] = gggmother[idigi][1];
481 MCEnergyHit[ii][2] = MCEnergy[idigi][2];
482 pidHit[ii][2] = pid[idigi][2] ;
483 pxHit[ii][2] = px[idigi][2];
484 pyHit[ii][2] = py[idigi][2];
485 pzHit[ii][2] = pz[idigi][2];
486 gmotherHit[ii][2] = gmother[idigi][2];
487 ggmotherHit[ii][2] = ggmother[idigi][2];
488 gggmotherHit[ii][2] = gggmother[idigi][2];
493 trgeclHitToMCPart.
add(ii, TCPrimaryIndexHit[ii][0]);
498 for (
int ii = 0; ii < trgeclHitArray.
getEntries(); ii++) {
502 TCHitArray[m_hitNum]->setEventId(m_nEvent);
503 TCHitArray[m_hitNum]-> setTCId(TCIdHit[ii]);
504 TCHitArray[m_hitNum]->setCellId(XtalIdHit[ii]);
505 TCHitArray[m_hitNum]->setEnergyDep(TCHitEnergy[ii]);
506 TCHitArray[m_hitNum]-> setTimeAve(TCHitTiming[ii]);
507 TCHitArray[m_hitNum]-> setTrackId(trackIdHit[ii]);
508 TCHitArray[m_hitNum]-> setPDG(pidHit[ii]);
509 TCHitArray[m_hitNum]->setMother(motherHit[ii]);
510 TCHitArray[m_hitNum]->setGMother(gmotherHit[ii]);
511 TCHitArray[m_hitNum]->setGGMother(ggmotherHit[ii]);
512 TCHitArray[m_hitNum]->setGGGMother(gggmotherHit[ii]);
513 TCHitArray[m_hitNum]->setPX(pxHit[ii]);
514 TCHitArray[m_hitNum]->setPY(pyHit[ii]);
515 TCHitArray[m_hitNum]->setPZ(pzHit[ii]);
516 TCHitArray[m_hitNum]->setMCEnergy(MCEnergyHit[ii]);
517 TCHitArray[m_hitNum]->setBackgroundTag(background_tagHit[ii]);
518 TCHitArray[m_hitNum]->setSignalContribution(SignalContributionHit[ii]);
519 TCHitArray[m_hitNum]->setBKGContribution(BKGContributionHit[ii]);
520 TCHitArray[m_hitNum]->setContribution(contributionHit[ii]);
529 void MCMatcherTRGECLModule::endRun()
534 void MCMatcherTRGECLModule::terminate()