41 return StatusCode::SUCCESS;
55 const MuonTrackTruthTool::SegmentMatchResult& r2)
const {
61 if (
t1.truthTrack && !
t2.truthTrack)
return true;
62 if (!
t1.truthTrack &&
t2.truthTrack)
return false;
63 if (!
t1.truthTrack && !
t2.truthTrack)
return false;
64 if (
t1.truthTrack->barcode() ==
t2.truthTrack->barcode())
return t1.numberOfMatchedHits() >
t2.numberOfMatchedHits();
65 return t1.truthTrack->barcode() <
t2.truthTrack->barcode();
75 for (;
tit != tit_end; ++
tit) {
77 if (!
match.truthTrack)
continue;
79 if (
match.numberOfMatchedHits() == 0)
continue;
92 const std::vector<const MuonSegment*>& segments)
const {
94 result.reserve(segments.size());
97 std::vector<const MuonSegment*>::const_iterator sit = segments.begin();
98 std::vector<const MuonSegment*>::const_iterator sit_end = segments.end();
99 for (; sit != sit_end; ++sit) {
112 const std::vector<const MuonSimDataCollection*>& muonSimData,
114 std::map<int, int> barcode_map;
116 if (truthTrackCol->
empty()) {
121 const HepMC::GenEvent* genEvent =
nullptr;
122 if (!mcEventCollection->
empty()) {
124 if (mcEventCollection->
size() == 1) genEvent = mcEventCollection->
front();
131 for (; tr_it != tr_it_end; ++tr_it) {
132 int PDGCode((*tr_it).GetPDGCode());
133 int barcode = (*tr_it).barcode();
140 if (barcode_map.count(
barcode)) {
146 std::unique_ptr<TruthTrajectory> truthTrajectory;
151 truthTrajectory = std::make_unique<TruthTrajectory>();
153 if (!truthTrajectory->empty()) {
155 barcode = truthTrajectory->front().barcode();
158 auto particle = truthTrajectory->front().cptr();
159 ATH_MSG_VERBOSE(
" found GenParticle: size " << truthTrajectory->size() <<
" fs barcode " <<
barcode <<
"particle "<< particle);
160 if (particle->production_vertex()) {
161 ATH_MSG_VERBOSE(
" vertex: r " << particle->production_vertex()->position().perp() <<
" z "
162 << particle->production_vertex()->position().z());
167 std::vector<HepMcParticleLink>::const_iterator pit = truthTrajectory->begin();
168 std::vector<HepMcParticleLink>::const_iterator pit_end = truthTrajectory->end();
169 for (; pit != pit_end; ++pit) {
170 int code = (*pit).barcode();
173 auto particle = (*pit).cptr();
175 if (particle->production_vertex())
176 ATH_MSG_VERBOSE(
" vertex: r " <<particle->production_vertex()->position().perp() <<
" z "
177 << particle->production_vertex()->position().z());
200 entry.truthTrack = &(*tr_it);
202 entry.truthTrajectory = std::move(truthTrajectory);
210 unsigned int ngood(0);
211 std::vector<int> badBarcodes;
216 unsigned int nhits =
it->second.mdtHits.size() +
it->second.rpcHits.size() +
it->second.tgcHits.size() +
217 it->second.cscHits.size() +
it->second.stgcHits.size() +
it->second.mmHits.size();
218 if (!
it->second.truthTrack) erase =
true;
222 ATH_MSG_VERBOSE(
" Erasing entry: barcode " <<
it->second.truthTrack->barcode() <<
" manip "
224 badBarcodes.push_back(
it->first);
227 ATH_MSG_VERBOSE(
" Keeping entry: barcode " <<
it->second.truthTrack->barcode() <<
" manip "
234 for (; badIt != badIt_end; ++badIt)
truth_tree.erase(*badIt);
244 for (;
it != it_end; ++
it) {
245 if (!
it->second.truthTrack)
248 ATH_MSG_INFO(
" PDG " <<
it->second.truthTrack->GetPDGCode() <<
" barcode " <<
it->second.truthTrack->barcode()
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) {
278 int barcodeIn = dit->first.barcode();
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);
296 eit->second.mdtHits.insert(*
it);
303 eit->second.rpcHits.insert(*
it);
305 eit->second.tgcHits.insert(*
it);
307 eit->second.stgcHits.insert(*
it);
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);
352 eit->second.cscHits.insert(*
it);
362 if (track.measurementsOnTrack())
return getTruth(
truth_tree, track.measurementsOnTrack()->stdcont(), restrictedTruth);
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;
472 MuonSimDataCollection::const_iterator
it = simCol.begin();
473 MuonSimDataCollection::const_iterator it_end = simCol.end();
474 for (;
it != it_end; ++
it) {
479 int isOnTrack =
ids.count(
id);
480 if (isOnTrack)
continue;
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;
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) {
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) {
565 MuonSimDataCollection::const_iterator
it = simCol.end();
567 bool goodCluster =
false;
572 if (!cluster)
continue;
574 it = simCol.find(cluster->identify());
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) {
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) {
642 if (pit.barcode() == barcodeIn || foundBC) {
646 auto particle = pit.scptr();
648 auto particle = pit.cptr();
650 if (particle->pdg_id() != pdgFinal) {
659 bool foundBC =
false;
660 for (
const auto& pit : traj) {
662 if (pit.barcode() == barcodeIn || foundBC) {
665 auto particle = pit.scptr();
667 auto particle = pit.cptr();
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) {
687 if ((*pit).barcode() == barcodeIn || foundBC) {
688 auto particle = (*pit).scptr();
693 pdgFinal = particle->pdg_id();
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();
724 ATH_MSG_DEBUG(
"getFirst() : pt = " << particle->momentum().perp() <<
" scat = " << scat);
725 ePrev = particle->momentum().t();
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;