24 using namespace MuonStationIndex;
28 ATH_CHECK(m_truthTrajectoryBuilder.retrieve());
31 if (m_pdgsToBeConsidered.value().empty()) {
32 m_selectedPdgs.insert(13);
33 m_selectedPdgs.insert(-13);
36 for (
auto pdg : m_pdgsToBeConsidered.value()) { m_selectedPdgs.insert(pdg); }
37 ATH_MSG_DEBUG(
" PDG codes used for matching "<<m_selectedPdgs);
39 return StatusCode::SUCCESS;
43 if (m_manipulateBarCode)
return barcode % 10000;
53 const MuonTrackTruthTool::SegmentMatchResult& r2)
const {
59 if (
t1.truthTrack && !
t2.truthTrack)
return true;
60 if (!
t1.truthTrack &&
t2.truthTrack)
return false;
61 if (!
t1.truthTrack && !
t2.truthTrack)
return false;
73 for (;
tit != tit_end; ++
tit) {
75 if (!
match.truthTrack)
continue;
77 if (
match.numberOfMatchedHits() == 0)
continue;
90 const std::vector<const MuonSegment*>& segments)
const {
92 result.reserve(segments.size());
95 std::vector<const MuonSegment*>::const_iterator sit = segments.begin();
96 std::vector<const MuonSegment*>::const_iterator sit_end = segments.end();
97 for (; sit != sit_end; ++sit) {
110 const std::vector<const MuonSimDataCollection*>& muonSimData,
112 std::map<int, int> barcode_map;
114 if (truthTrackCol->
empty()) {
119 const HepMC::GenEvent* genEvent =
nullptr;
120 if (!mcEventCollection->
empty()) {
122 if (mcEventCollection->
size() == 1) genEvent = mcEventCollection->
front();
129 for (; tr_it != tr_it_end; ++tr_it) {
130 int PDGCode((*tr_it).GetPDGCode());
132 if (!m_matchAllParticles && !selectPdg(PDGCode)) {
138 if (barcode_map.count(
barcode)) {
144 std::unique_ptr<TruthTrajectory> truthTrajectory;
154 truthTrajectory = std::make_unique<TruthTrajectory>();
155 m_truthTrajectoryBuilder->buildTruthTrajectory(truthTrajectory.get(), genParticle);
156 if (!truthTrajectory->empty()) {
161 auto particle = truthTrajectory->front().cptr();
163 if (
particle->production_vertex()) {
165 <<
particle->production_vertex()->position().z());
170 std::vector<HepMcParticleLink>::const_iterator pit = truthTrajectory->begin();
171 std::vector<HepMcParticleLink>::const_iterator pit_end = truthTrajectory->end();
172 for (; pit != pit_end; ++pit) {
180 <<
particle->production_vertex()->position().z());
203 entry.truthTrack = &(*tr_it);
205 entry.truthTrajectory = std::move(truthTrajectory);
211 if (cscSimDataMap) { addCscSimDataToTree(
truth_tree, barcode_map, cscSimDataMap); }
213 unsigned int ngood(0);
214 std::vector<int> badBarcodes;
219 unsigned int nhits =
it->second.mdtHits.size() +
it->second.rpcHits.size() +
it->second.tgcHits.size() +
220 it->second.cscHits.size() +
it->second.stgcHits.size() +
it->second.mmHits.size();
221 if (!
it->second.truthTrack) erase =
true;
222 if (nhits < m_minHits) erase =
true;
226 badBarcodes.push_back(
it->first);
235 for (; badIt != badIt_end; ++badIt)
truth_tree.erase(*badIt);
245 for (;
it != it_end; ++
it) {
246 if (!
it->second.truthTrack)
251 if (!
it->second.mdtHits.empty())
ATH_MSG_INFO(
" mdt " <<
it->second.mdtHits.size());
252 if (!
it->second.rpcHits.empty())
ATH_MSG_INFO(
" rpc " <<
it->second.rpcHits.size());
253 if (!
it->second.tgcHits.empty())
ATH_MSG_INFO(
" tgc " <<
it->second.tgcHits.size());
254 if (!
it->second.cscHits.empty())
ATH_MSG_INFO(
" csc " <<
it->second.cscHits.size());
255 if (!
it->second.stgcHits.empty())
ATH_MSG_INFO(
" stgc " <<
it->second.stgcHits.size());
256 if (!
it->second.mmHits.empty())
ATH_MSG_INFO(
" mm " <<
it->second.mmHits.size());
257 if (
it->second.mdtHits.empty() &&
it->second.rpcHits.empty() &&
it->second.tgcHits.empty() &&
it->second.cscHits.empty() &&
258 it->second.stgcHits.empty() &&
it->second.mmHits.empty())
269 MuonSimDataCollection::const_iterator
it = simDataCol->begin();
270 MuonSimDataCollection::const_iterator it_end = simDataCol->end();
271 for (;
it != it_end; ++
it) {
275 std::vector<MuonSimData::Deposit>::const_iterator dit =
it->second.getdeposits().begin();
276 std::vector<MuonSimData::Deposit>::const_iterator dit_end =
it->second.getdeposits().end();
277 for (; dit != dit_end; ++dit) {
279 std::map<int, int>::const_iterator bit = barcode_map.find(barcodeIn);
280 if (bit == barcode_map.end()) {
282 <<
" " << m_idHelperSvc->toString(
id) <<
" barcode " << barcodeIn);
291 <<
" " << m_idHelperSvc->toString(
id) <<
" barcode " <<
barcode);
295 if (m_idHelperSvc->isMdt(
id)) {
296 eit->second.mdtHits.insert(*
it);
297 }
else if (m_idHelperSvc->isRpc(
id)) {
298 if (m_idHelperSvc->stationIndex(
id) ==
StIndex::BO && m_idHelperSvc->rpcIdHelper().doubletR(
id) == 2) {
299 ATH_MSG_VERBOSE(
" Discarding non existing RPC hit " << m_idHelperSvc->toString(
id));
303 eit->second.rpcHits.insert(*
it);
304 }
else if (m_idHelperSvc->isTgc(
id)) {
305 eit->second.tgcHits.insert(*
it);
306 }
else if (m_idHelperSvc->issTgc(
id)) {
307 eit->second.stgcHits.insert(*
it);
308 }
else if (m_idHelperSvc->isMM(
id)) {
309 eit->second.mmHits.insert(*
it);
322 CscSimDataCollection::const_iterator
it = simDataCol->begin();
323 CscSimDataCollection::const_iterator it_end = simDataCol->end();
324 for (;
it != it_end; ++
it) {
328 std::vector<CscSimData::Deposit>::const_iterator dit =
it->second.getdeposits().begin();
329 std::vector<CscSimData::Deposit>::const_iterator dit_end =
it->second.getdeposits().end();
330 for (; dit != dit_end; ++dit) {
332 std::map<int, int>::const_iterator bit = barcode_map.find(barcodeIn);
333 if (bit == barcode_map.end()) {
335 <<
" " << m_idHelperSvc->toString(
id) <<
" barcode " << barcodeIn);
344 <<
" " << m_idHelperSvc->toString(
id) <<
" barcode " <<
barcode);
352 eit->second.cscHits.insert(*
it);
367 bool restrictedTruth)
const {
368 std::set<Identifier>
ids;
369 std::vector<const Trk::MeasurementBase*> measurements;
370 std::vector<const MuonSegment*>::const_iterator sit = segments.begin();
371 std::vector<const MuonSegment*>::const_iterator sit_end = segments.end();
372 for (; sit != sit_end; ++sit) {
373 std::vector<const Trk::MeasurementBase*>::const_iterator mit = (*sit)->containedMeasurements().begin();
374 std::vector<const Trk::MeasurementBase*>::const_iterator mit_end = (*sit)->containedMeasurements().end();
375 for (; mit != mit_end; ++mit) {
384 if (!
id.is_valid() || !m_idHelperSvc->mdtIdHelper().is_muon(
id))
continue;
385 if (
ids.count(
id))
continue;
386 measurements.push_back(meas);
394 bool restrictedTruth)
const {
399 unsigned int nmatchedHitsBest = 0;
403 for (;
tit != tit_end; ++
tit) {
404 unsigned int nhits =
tit->second.mdtHits.size() +
tit->second.cscHits.size() +
tit->second.rpcHits.size() +
405 tit->second.tgcHits.size() +
tit->second.stgcHits.size() +
tit->second.mmHits.size();
406 if (nhits == 0)
continue;
410 ATH_MSG_DEBUG(
" performed truth match for particle with barcode: " <<
tit->first <<
" overlap " << nmatchedHits <<
" fraction "
411 << (
double)nmatchedHits / (
double)nhits);
412 if (nmatchedHits > 0 && nmatchedHits > nmatchedHitsBest) {
413 bestMatch = trackTruth;
414 nmatchedHitsBest = nmatchedHits;
422 const TruthTreeEntry& truthEntry,
bool restrictedTruth)
const {
424 trackTruth.
truthTrack = truthEntry.truthTrack;
427 std::vector<const Trk::MeasurementBase*>::const_iterator mit = measurements.begin();
428 std::vector<const Trk::MeasurementBase*>::const_iterator mit_end = measurements.end();
429 for (; mit != mit_end; ++mit) {
432 if (!meas) {
continue; }
441 if (!
id.is_valid() || !m_idHelperSvc->mdtIdHelper().is_muon(
id))
continue;
443 if (m_idHelperSvc->isMdt(
id)) {
444 addMdtTruth(trackTruth.
mdts,
id, *meas, truthEntry.mdtHits);
445 }
else if (m_idHelperSvc->isCsc(
id)) {
446 addClusterTruth(trackTruth.
cscs,
id, *meas, truthEntry.cscHits);
447 }
else if (m_idHelperSvc->isRpc(
id)) {
448 addClusterTruth(trackTruth.
rpcs,
id, *meas, truthEntry.rpcHits);
449 }
else if (m_idHelperSvc->isTgc(
id)) {
450 addClusterTruth(trackTruth.
tgcs,
id, *meas, truthEntry.tgcHits);
451 }
else if (m_idHelperSvc->issTgc(
id)) {
452 addClusterTruth(trackTruth.
stgcs,
id, *meas, truthEntry.stgcHits);
453 }
else if (m_idHelperSvc->isMM(
id)) {
454 addClusterTruth(trackTruth.
mms,
id, *meas, truthEntry.mmHits);
472 MuonSimDataCollection::const_iterator
it = simCol.begin();
473 MuonSimDataCollection::const_iterator it_end = simCol.end();
474 for (;
it != it_end; ++
it) {
477 if (m_idHelperSvc->isTrigger(
id) || m_idHelperSvc->isCsc(
id))
id = m_idHelperSvc->layerId(
id);
479 int isOnTrack =
ids.count(
id);
480 if (isOnTrack)
continue;
483 Identifier chid = m_idHelperSvc->chamberId(
id);
484 bool chamberHasHits = chids.count(chid);
485 if (restrictedTruth && !chamberHasHits)
continue;
488 std::vector<MuonSimData::Deposit>::const_iterator dit =
it->second.getdeposits().begin();
489 std::vector<MuonSimData::Deposit>::const_iterator dit_end =
it->second.getdeposits().end();
490 for (; dit != dit_end; ++dit) {
501 CscSimDataCollection::const_iterator
it = simCol.begin();
502 CscSimDataCollection::const_iterator it_end = simCol.end();
503 for (;
it != it_end; ++
it) {
506 int isOnTrack =
ids.count(
id);
507 if (isOnTrack)
continue;
510 Identifier chid = m_idHelperSvc->chamberId(
id);
511 bool chamberHasHits = chids.count(chid);
512 if (restrictedTruth && !chamberHasHits)
continue;
515 std::vector<CscSimData::Deposit>::const_iterator dit =
it->second.getdeposits().begin();
516 std::vector<CscSimData::Deposit>::const_iterator dit_end =
it->second.getdeposits().end();
517 for (; dit != dit_end; ++dit) {
529 ATH_MSG_WARNING(
" dynamic_cast to MdtDriftCircleOnTrack failed for measurement with id " << m_idHelperSvc->toString(
id));
533 Identifier chid = m_idHelperSvc->chamberId(
id);
536 MuonSimDataCollection::const_iterator
it = simCol.find(
id);
537 if (
it == simCol.end()) {
543 std::vector<MuonSimData::Deposit>::const_iterator dit =
it->second.getdeposits().begin();
544 std::vector<MuonSimData::Deposit>::const_iterator dit_end =
it->second.getdeposits().end();
545 for (; dit != dit_end; ++dit) {
546 double radius = dit->second.firstEntry();
550 if (checkSign >= 0) {
562 Identifier layid = m_idHelperSvc->layerId(
id);
563 Identifier chid = m_idHelperSvc->chamberId(
id);
565 MuonSimDataCollection::const_iterator
it = simCol.end();
567 bool goodCluster =
false;
572 if (!cluster)
continue;
575 if (
it != simCol.end()) {
587 const std::vector<Identifier> &rdoList = prd->
rdoList();
588 std::vector<Identifier>::const_iterator rit = rdoList.begin();
589 std::vector<Identifier>::const_iterator rit_end = rdoList.end();
590 for (; rit != rit_end; ++rit) {
591 it = simCol.find(*rit);
592 if (
it != simCol.end()) {
598 it = simCol.find(
id);
599 if (
it != simCol.end()) goodCluster =
true;
603 if (!goodCluster ||
it == simCol.end()) {
608 std::vector<MuonSimData::Deposit>::const_iterator dit =
it->second.getdeposits().begin();
609 std::vector<MuonSimData::Deposit>::const_iterator dit_end =
it->second.getdeposits().end();
610 for (; dit != dit_end; ++dit) {
618 Identifier layid = m_idHelperSvc->layerId(
id);
619 Identifier chid = m_idHelperSvc->chamberId(
id);
621 CscSimDataCollection::const_iterator
it = simCol.find(
id);
622 if (
it == simCol.end()) {
628 std::vector<CscSimData::Deposit>::const_iterator dit =
it->second.getdeposits().begin();
629 std::vector<CscSimData::Deposit>::const_iterator dit_end =
it->second.getdeposits().end();
630 for (; dit != dit_end; ++dit) {
638 int pdgFinal = ((traj.empty()) ? -999 : traj.front().cptr()->pdg_id());
639 bool foundBC =
false;
640 for (
const auto& pit : traj) {
650 if (
particle->pdg_id() != pdgFinal) {
659 bool foundBC =
false;
660 for (
const auto& pit : traj) {
678 const int barcodeIn)
const {
679 std::pair<HepMC::ConstGenParticlePtr, unsigned int> thePair(
nullptr, 0);
680 unsigned int scat = 0;
682 bool foundBC =
false;
686 for (
auto pit = traj.begin(); pit != traj.end(); ++pit) {
695 if (
particle->pdg_id() == pdgFinal) {
696 const auto& pit_p = *pit;
697 if ((theFirst != pit_p.scptr()) && (
particle->momentum().t() != ePrev))
702 theFirst = (*pit).scptr();
709 theFirst = (*pit).cptr();
710 pdgFinal = (*pit)->pdg_id();
712 if ((*pit)->pdg_id() == pdgFinal) {
714 if ((theFirst != pit_p.cptr()) && ((*pit).cptr()->momentum().t() != ePrev))
719 theFirst = (*pit).cptr();
729 if (theFirst && theFirst->pdg_id() != pdgFinal)
ATH_MSG_ERROR(
"Wrong pdgId association in getFirst()");
730 ATH_MSG_DEBUG(
"Number of scatters = " << scat <<
" pdgId = " << pdgFinal);
732 thePair.first = theFirst;
733 thePair.second = scat;
738 return getInitialPair(traj, barcodeIn).first;
742 return (getInitialPair(traj, barcodeIn)).second;