9 #include <trg/ecl/modules/MCMatcherTRGECL/MCMatcherTRGECLModule.h>
12 #include <framework/gearbox/Unit.h>
15 #include <ecl/dataobjects/ECLHit.h>
18 #include "trg/ecl/dataobjects/TRGECLHit.h"
19 #include "trg/ecl/dataobjects/TRGECLDigi0.h"
22 #include <mdst/dataobjects/MCParticle.h>
23 #include <framework/datastore/RelationArray.h>
37 using namespace boost;
54 setDescription(
"MCMatcherTRGECLModule");
55 setPropertyFlags(c_ParallelProcessingCertified);
59 for (
int ii = 0; ii < 100; ii++) {
63 SignalContribution[ii] = 0;
64 BKGContribution[ii] = 0;
68 SignalContributionHit[ii] = 0;
69 BKGContributionHit[ii] = 0;
71 for (
int icont = 0 ; icont < 3 ; icont ++) {
74 maxEnergy[ii][icont] = -1;
75 contribution[ii][icont] = 0;
76 TCPrimaryIndex[ii][icont] = -1;
77 XtalId[ii][icont] = -1 ;
82 trackId[ii][icont] = 0;
83 background_tag[ii][icont] = 0;
84 mother[ii][icont] = 0 ;
85 gmother[ii][icont] = 0;
86 ggmother[ii][icont] = 0;
87 gggmother[ii][icont] = 0;
88 MCEnergy[ii][icont] = 0;
90 ieclhit[ii][icont] = 0 ;
92 background_tagHit[ii][icont] = 0;
93 TCPrimaryIndexHit[ii][icont] = -1;
94 XtalIdHit[ii][icont] = -1 ;
98 pidHit[ii][icont] = 0;
99 trackIdHit[ii][icont] = 0;
100 background_tagHit[ii][icont] = 0;
101 motherHit[ii][icont] = 0 ;
102 gmotherHit[ii][icont] = 0;
103 ggmotherHit[ii][icont] = 0;
104 gggmotherHit[ii][icont] = 0;
105 MCEnergyHit[ii][icont] = 0;
106 contributionHit[ii][icont] = 0;
112 MCMatcherTRGECLModule::~MCMatcherTRGECLModule()
117 void MCMatcherTRGECLModule::initialize()
123 m_timeCPU = clock() * Unit::us;
125 m_trgECLDigi0MC.registerInDataStore();
126 m_trgECLHitMC.registerInDataStore();
138 void MCMatcherTRGECLModule::beginRun()
142 void MCMatcherTRGECLModule::event()
148 eclPrimaryMap.
clear();
151 for (
int iPart = 0; iPart < nParticles ; ++iPart) {
152 if (mcParticles[iPart]->getMother() == NULL) {
153 if (!mcParticles[iPart]->hasStatus(MCParticle::c_PrimaryParticle)) {
154 if (!mcParticles[iPart]->hasStatus(MCParticle::c_StableInGenerator)) {
162 bool adhoc_StableInGeneratorFlag(mcParticles[iPart]->hasStatus(MCParticle::c_StableInGenerator));
164 if (mcParticles[iPart]->hasStatus(MCParticle::c_PrimaryParticle)
165 && adhoc_StableInGeneratorFlag) {
166 if (mcParticles[iPart]->getArrayIndex() == -1) {
167 eclPrimaryMap.insert(pair<int, int>(iPart, iPart));
169 eclPrimaryMap.insert(pair<int, int>(mcParticles[iPart]->getArrayIndex(), mcParticles[iPart]->getArrayIndex()));
172 if (mcParticles[iPart]->getMother() == NULL)
continue;
173 if (eclPrimaryMap.find(mcParticles[iPart]->getMother()->getArrayIndex()) != eclPrimaryMap.end()) {
174 eclPrimaryMap.insert(
175 pair<int, int>(mcParticles[iPart]->getArrayIndex(), eclPrimaryMap[mcParticles[iPart]->getMother()->getArrayIndex()]));
186 RelationArray trgeclDigi0ToMCPart(trgeclDigi0Array, mcParticles);
191 const int NofTCDigiHit = trgeclDigi0Array.
getEntries();
195 for (
int ii = 0; ii < NofTCDigiHit; ii++) {
199 TCId[ihit] = (aTRGECLDigi0->
getTCId() - 1);
202 int itimeindex = (int)(TCRawTiming[ihit] / 100 + 40);
203 TCRawEnergy[ihit] = aTRGECLDigi0 ->
getRawEnergy() / Unit::GeV;
204 if (TCRawEnergy[ihit] < 0.1) {
continue;}
205 for (
int hit = 0; hit < nHits_hit; hit++) {
207 ECLHit* aECLHit = eclHitArray[hit];;
210 if (hitE < 0.1) {
continue;}
211 int hitCellId = aECLHit->
getCellId() - 1;
212 int hitTCId = _TCMap->getTCIdFromXtalId(hitCellId + 1) - 1;
213 int timeindex = (int)((aECLHit ->getTimeAve()) / 100 + 40);
216 if (hitTCId != TCId[ihit]) {
continue;}
217 if (itimeindex != timeindex) {
continue;}
218 if (backtag == 0) { SignalContribution[ihit] = SignalContribution[ihit] + hitE;}
219 else { BKGContribution[ihit] = BKGContribution[ihit] + hitE;}
222 if (TCId[ihit] == hitTCId && maxEnergy[ihit][0] < hitE) {
224 ieclhit[ihit][0] = hit;
225 maxEnergy[ihit][0] = hitE;
226 contribution[ihit][0] = hitE;
227 XtalId[ihit][0] = hitCellId ;
228 background_tag[ihit][0] = backtag;
233 if (TCId[ihit] == hitTCId && maxEnergy[ihit][1] < hitE && hitE < maxEnergy[ihit][0]) {
234 ieclhit[ihit][1] = hit;
235 maxEnergy[ihit][1] = hitE;
236 contribution[ihit][1] = hitE;
237 XtalId[ihit][1] = hitCellId ;
238 background_tag[ihit][1] = backtag;
242 if (TCId[ihit] == hitTCId && maxEnergy[ihit][2] < hitE && hitE < maxEnergy[ihit][1]) {
243 ieclhit[ihit][2] = hit;
244 maxEnergy[ihit][2] = hitE;
245 contribution[ihit][2] = hitE;
246 XtalId[ihit][2] = hitCellId ;
247 background_tag[ihit][2] = backtag;
252 for (
int index = 0; index < eclHitRel.
getEntries(); index++) {
253 int PrimaryIndex = -1;
255 map<int, int>::iterator iter = eclPrimaryMap.find(eclHitRel[index].getFromIndex());
257 if (iter != eclPrimaryMap.end()) {
258 PrimaryIndex = iter->second;
260 int eclhitRelSize = eclHitRel[index].getToIndices().size();
261 for (
int pri_hit = 0; pri_hit < eclhitRelSize ; pri_hit++) {
262 int ieclHitRel = eclHitRel[index].getToIndex(pri_hit);
263 if (ieclhit[ihit][0] == ieclHitRel) {
264 TCPrimaryIndex[ihit][0] = PrimaryIndex;
267 if (ieclhit[ihit][1] == ieclHitRel) {
268 TCPrimaryIndex[ihit][1] = PrimaryIndex;
271 if (ieclhit[ihit][2] == ieclHitRel) {
272 TCPrimaryIndex[ihit][2] = PrimaryIndex;
279 trackId[ihit][0] = TCPrimaryIndex[ihit][0];
280 trackId[ihit][1] = TCPrimaryIndex[ihit][1];
281 trackId[ihit][2] = TCPrimaryIndex[ihit][2];
289 if (TCPrimaryIndex[ihit][0] > 0) {
291 MCEnergy[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getEnergy();
292 pid[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getPDG();
293 px[ihit][0] = (mcParticles[TCPrimaryIndex[ihit][0]]->getMomentum()).X();
294 py[ihit][0] = (mcParticles[TCPrimaryIndex[ihit][0]]->getMomentum()).Y();
295 pz[ihit][0] = (mcParticles[TCPrimaryIndex[ihit][0]]->getMomentum()).Z();
296 if (pid[ihit][0] != 0 && (mcParticles[TCPrimaryIndex[ihit][0]]->getMother())) {
297 mother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother() ->getPDG();
298 mclist = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()-> getIndex();
300 if (mclist != 1 && mother[ihit][0] != 0 && (mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother())) {
301 gmother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother() ->getPDG();
302 mclist = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()-> getIndex();
305 if (mclist != 1 && gmother[ihit][0] != 0 && (mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother())) {
306 ggmother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother() ->getPDG();
307 mclist = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother()-> getIndex();
311 if (mclist != 1 && ggmother[ihit][0] != 0) {
312 if (mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother()->getMother()) {
313 gggmother[ihit][0] = mcParticles[TCPrimaryIndex[ihit][0]]->getMother()->getMother()->getMother()->getMother() ->getPDG();
320 if (TCPrimaryIndex[ihit][1] > 0) {
322 MCEnergy[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getEnergy();
323 pid[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getPDG();
324 px[ihit][1] = (mcParticles[TCPrimaryIndex[ihit][1]]->getMomentum()).X();
325 py[ihit][1] = (mcParticles[TCPrimaryIndex[ihit][1]]->getMomentum()).Y();
326 pz[ihit][1] = (mcParticles[TCPrimaryIndex[ihit][1]]->getMomentum()).Z();
327 if (pid[ihit][1] != 0 && (mcParticles[TCPrimaryIndex[ihit][1]]->getMother())) {
328 mother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother() ->getPDG();
329 mclist = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()-> getIndex();
331 if (mclist != 1 && mother[ihit][1] != 0 && (mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother())) {
332 gmother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother() ->getPDG();
333 mclist = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()-> getIndex();
336 if (mclist != 1 && gmother[ihit][1] != 0 && (mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother())) {
337 ggmother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother() ->getPDG();
338 mclist = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother()-> getIndex();
340 if (mclist != 1 && ggmother[ihit][1] != 0) {
341 if (mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother()->getMother()) {
342 gggmother[ihit][1] = mcParticles[TCPrimaryIndex[ihit][1]]->getMother()->getMother()->getMother()->getMother() ->getPDG();
347 if (TCPrimaryIndex[ihit][2] > 0) {
349 MCEnergy[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getEnergy();
350 pid[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getPDG();
351 px[ihit][2] = (mcParticles[TCPrimaryIndex[ihit][2]]->getMomentum()).X();
352 py[ihit][2] = (mcParticles[TCPrimaryIndex[ihit][2]]->getMomentum()).Y();
353 pz[ihit][2] = (mcParticles[TCPrimaryIndex[ihit][2]]->getMomentum()).Z();
354 if (pid[ihit][2] != 0 && (mcParticles[TCPrimaryIndex[ihit][2]]->getMother())) {
355 mother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother() ->getPDG();
356 mclist = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()-> getIndex();
358 if (mclist != 1 && mother[ihit][2] != 0 && (mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother())) {
359 gmother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother() ->getPDG();
360 mclist = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()-> getIndex();
363 if (mclist != 1 && gmother[ihit][2] != 0 && (mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother())) {
364 ggmother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother() ->getPDG();
365 mclist = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother()-> getIndex();
367 if (mclist != 1 && ggmother[ihit][2] != 0) {
368 if (mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother()->getMother()) {
369 gggmother[ihit][2] = mcParticles[TCPrimaryIndex[ihit][2]]->getMother()->getMother()->getMother()->getMother() ->getPDG();
374 trgeclDigi0ToMCPart.
add(ii, TCPrimaryIndex[ihit][0]);
380 for (
int ii = 0; ii < ihit; ++ii) {
382 if (TCRawEnergy[ii] < 0.1) {
continue;}
386 TCDigiArray[m_hitNum]->setEventId(m_nEvent);
387 TCDigiArray[m_hitNum]->setTCId(TCId[ii]);
389 TCDigiArray[m_hitNum]->setRawEnergy(TCRawEnergy[ii]);
390 TCDigiArray[m_hitNum]->setRawTiming(TCRawTiming[ii]);
391 TCDigiArray[m_hitNum]->setTrackId(trackId[ii]);
392 TCDigiArray[m_hitNum]->setCellId(XtalId[ii]);
394 TCDigiArray[m_hitNum]->setPDG(pid[ii]);
395 TCDigiArray[m_hitNum]->setMother(mother[ii]);
396 TCDigiArray[m_hitNum]->setGMother(gmother[ii]);
397 TCDigiArray[m_hitNum]->setGGMother(ggmother[ii]);
398 TCDigiArray[m_hitNum]->setGGGMother(gggmother[ii]);
400 TCDigiArray[m_hitNum]->setPX(px[ii]);
401 TCDigiArray[m_hitNum]->setPY(py[ii]);
402 TCDigiArray[m_hitNum]->setPZ(pz[ii]);
403 TCDigiArray[m_hitNum]->setMCEnergy(MCEnergy[ii]);
404 TCDigiArray[m_hitNum]->setContribution(contribution[ii]);
405 TCDigiArray[m_hitNum]->setBackgroundTag(background_tag[ii]);
406 TCDigiArray[m_hitNum]->setSignalContribution(SignalContribution[ii]);
407 TCDigiArray[m_hitNum]->setBKGContribution(BKGContribution[ii]);
413 RelationArray trgeclHitToMCPart(trgeclHitArray, mcParticles);
414 const int NofTCHit = trgeclHitArray.
getEntries();
417 for (
int ii = 0; ii < NofTCHit; ++ii) {
419 TRGECLHit* aTRGECLHit = trgeclHitArray[ii];
420 TCIdHit[ii] = (aTRGECLHit->
getTCId() - 1);
422 TCHitEnergy[ii] = aTRGECLHit -> getEnergyDep();
423 int itimeindex = (int)(TCHitTiming[ii] / 100 + 40);
425 for (
int index = 0; index < trgeclDigi0ToMCPart.
getEntries(); ++index) {
427 int idigitimeindex = (int)(TCRawTiming[idigi] / 100 + 40);
428 if (TCId[idigi] != TCIdHit[ii]) {
continue;}
429 if (itimeindex != idigitimeindex) {
continue;}
431 TCPrimaryIndexHit[ii][0] = TCPrimaryIndex[idigi][0];
432 contributionHit[ii][0] = contribution[idigi][0];
433 XtalIdHit[ii][0] = XtalId[idigi][0] ;
435 TCPrimaryIndexHit[ii][1] = TCPrimaryIndex[idigi][1];
436 contributionHit[ii][1] = contribution[idigi][1];
437 XtalIdHit[ii][1] = XtalId[idigi][1] ;
439 TCPrimaryIndexHit[ii][2] = TCPrimaryIndex[idigi][2];
440 contributionHit[ii][2] = contribution[idigi][2];
441 XtalIdHit[ii][2] = XtalId[idigi][2] ;
443 background_tagHit[ii][0] = background_tag[idigi][0] ;
444 background_tagHit[ii][1] = background_tag[idigi][1] ;
445 background_tagHit[ii][2] = background_tag[idigi][2] ;
447 SignalContributionHit[ii] = SignalContribution[idigi];
449 BKGContributionHit[ii] = BKGContribution[idigi];
452 trackIdHit[ii][0] = trackId[idigi][0];
453 trackIdHit[ii][1] = trackId[idigi][0];
454 trackIdHit[ii][2] = trackId[idigi][0];
456 MCEnergyHit[ii][0] = MCEnergy[idigi][0];
457 pidHit[ii][0] = pid[idigi][0] ;
458 pxHit[ii][0] = px[idigi][0];
459 pyHit[ii][0] = py[idigi][0];
460 pzHit[ii][0] = pz[idigi][0];
461 gmotherHit[ii][0] = gmother[idigi][0];
462 ggmotherHit[ii][0] = ggmother[idigi][0];
463 gggmotherHit[ii][0] = gggmother[idigi][0];
465 MCEnergyHit[ii][1] = MCEnergy[idigi][1];
466 pidHit[ii][1] = pid[idigi][1] ;
467 pxHit[ii][1] = px[idigi][1];
468 pyHit[ii][1] = py[idigi][1];
469 pzHit[ii][1] = pz[idigi][1];
470 gmotherHit[ii][1] = gmother[idigi][1];
471 ggmotherHit[ii][1] = ggmother[idigi][1];
472 gggmotherHit[ii][1] = gggmother[idigi][1];
474 MCEnergyHit[ii][2] = MCEnergy[idigi][2];
475 pidHit[ii][2] = pid[idigi][2] ;
476 pxHit[ii][2] = px[idigi][2];
477 pyHit[ii][2] = py[idigi][2];
478 pzHit[ii][2] = pz[idigi][2];
479 gmotherHit[ii][2] = gmother[idigi][2];
480 ggmotherHit[ii][2] = ggmother[idigi][2];
481 gggmotherHit[ii][2] = gggmother[idigi][2];
486 trgeclHitToMCPart.
add(ii, TCPrimaryIndexHit[ii][0]);
490 for (
int ii = 0; ii < trgeclHitArray.
getEntries(); ++ii) {
494 TCHitArray[m_hitNum]->setEventId(m_nEvent);
495 TCHitArray[m_hitNum]-> setTCId(TCIdHit[ii]);
496 TCHitArray[m_hitNum]->setCellId(XtalIdHit[ii]);
497 TCHitArray[m_hitNum]->setEnergyDep(TCHitEnergy[ii]);
498 TCHitArray[m_hitNum]-> setTimeAve(TCHitTiming[ii]);
499 TCHitArray[m_hitNum]-> setTrackId(trackIdHit[ii]);
500 TCHitArray[m_hitNum]-> setPDG(pidHit[ii]);
501 TCHitArray[m_hitNum]->setMother(motherHit[ii]);
502 TCHitArray[m_hitNum]->setGMother(gmotherHit[ii]);
503 TCHitArray[m_hitNum]->setGGMother(ggmotherHit[ii]);
504 TCHitArray[m_hitNum]->setGGGMother(gggmotherHit[ii]);
505 TCHitArray[m_hitNum]->setPX(pxHit[ii]);
506 TCHitArray[m_hitNum]->setPY(pyHit[ii]);
507 TCHitArray[m_hitNum]->setPZ(pzHit[ii]);
508 TCHitArray[m_hitNum]->setMCEnergy(MCEnergyHit[ii]);
509 TCHitArray[m_hitNum]->setBackgroundTag(background_tagHit[ii]);
510 TCHitArray[m_hitNum]->setSignalContribution(SignalContributionHit[ii]);
511 TCHitArray[m_hitNum]->setBKGContribution(BKGContributionHit[ii]);
512 TCHitArray[m_hitNum]->setContribution(contributionHit[ii]);
521 void MCMatcherTRGECLModule::endRun()
526 void MCMatcherTRGECLModule::terminate()
Class to store simulated hits which equate to average of ECLSImHit on crystals input for digitization...
int getCellId() const
Get Cell ID.
double getEnergyDep() const
Get deposit energy.
Class to represent the hit of one cell.
std::map< int, int > PrimaryTrackMap
define a map for Primary Track
Low-level class to create/modify relations between StoreArrays.
int getEntries() const
Get the number of elements.
void add(index_type from, index_type to, weight_type weight=1.0)
Add a new element to the relation.
virtual unsigned short getBackgroundTag() const
Get background tag.
T * appendNew()
Construct a new T object at the end of the array.
int getEntries() const
Get the number of objects in the array.
void clear() override
Delete all entries in this array.
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Raw TC result nefor digitizing.
double getRawTiming() const
Get raw TC timing.
int getTCId() const
Get TC id.
double getRawEnergy() const
Get Energy and Timing Get raw TC energy.
double getTimeAve() const
The method to get hit average time.
int getTCId() const
The method to get TC id.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.