39 return StatusCode::SUCCESS;
48 const MuonTrackTruthTool::MatchResult& r2)
const {
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;
68 result.reserve(tracks.
size());
73 for (; tit != tit_end; ++tit) {
75 if (!
match.truthTrack)
continue;
77 if (
match.numberOfMatchedHits() == 0)
continue;
80 result.emplace_back(*tit,
match);
90 const std::vector<const MuonSegment*>& segments)
const {
91 SegmentResultVec result;
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) {
99 result.emplace_back(*sit,
getTruth(truth_tree, **sit));
110 const std::vector<const MuonSimDataCollection*>& muonSimData,
112 std::map<int, int> barcode_map;
113 MuonTrackTruthTool::TruthTree truth_tree;
114 if (truthTrackCol->
empty()) {
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());
133 ATH_MSG_VERBOSE(
" discarding truth track: pdg " << PDGCode <<
" barcode " << barcode);
138 if (barcode_map.count(barcode)) {
139 ATH_MSG_VERBOSE(
" barcode " << barcode <<
" already in map, final state barcode " << barcode_map[barcode]);
142 ATH_MSG_VERBOSE(
" found new particle with pdgid " << PDGCode <<
" in truth record, barcode " << barcode);
144 std::unique_ptr<TruthTrajectory> truthTrajectory;
150 truthTrajectory = std::make_unique<TruthTrajectory>();
152 if (!truthTrajectory->empty()) {
156 if (msgLvl(MSG::VERBOSE)) {
157 auto particle = truthTrajectory->front().cptr();
158 ATH_MSG_VERBOSE(
" found GenParticle: size " << truthTrajectory->size() <<
" fs barcode " << barcode <<
"particle "<< particle);
159 if (particle->production_vertex()) {
160 ATH_MSG_VERBOSE(
" vertex: r " << particle->production_vertex()->position().perp() <<
" z "
161 << particle->production_vertex()->position().z());
166 std::vector<HepMcParticleLink>::const_iterator pit = truthTrajectory->begin();
167 std::vector<HepMcParticleLink>::const_iterator pit_end = truthTrajectory->end();
168 for (; pit != pit_end; ++pit) {
171 if (msgLvl(MSG::VERBOSE) && code != barcode) {
172 auto particle = (*pit).cptr();
173 ATH_MSG_VERBOSE(
" secondary barcode: " << code <<
"particle "<< particle);
174 if (particle->production_vertex())
175 ATH_MSG_VERBOSE(
" vertex: r " <<particle->production_vertex()->position().perp() <<
" z "
176 << particle->production_vertex()->position().z());
178 if (barcode_map.count(code))
ATH_MSG_VERBOSE(
" pre-existing barcode " << code);
182 barcode_map[code] = barcode;
190 barcode_map[barcode] = barcode;
193 if (truth_tree.count(barcode)) {
194 ATH_MSG_WARNING(
" found muon barcode twice in truth record: " << barcode);
198 TruthTreeEntry& entry = truth_tree[barcode];
199 entry.truthTrack = &(*tr_it);
201 entry.truthTrajectory = std::move(truthTrajectory);
209 unsigned int ngood(0);
210 std::vector<int> badBarcodes;
212 TruthTreeIt it = truth_tree.begin();
213 for (; it != truth_tree.end(); ++it) {
215 unsigned int nhits = it->second.mdtHits.size() + it->second.rpcHits.size() + it->second.tgcHits.size() +
216 it->second.cscHits.size() + it->second.stgcHits.size() + it->second.mmHits.size();
217 if (!it->second.truthTrack) erase =
true;
222 badBarcodes.push_back(it->first);
229 std::vector<int>::iterator badIt = badBarcodes.begin();
230 std::vector<int>::iterator badIt_end = badBarcodes.end();
231 for (; badIt != badIt_end; ++badIt) truth_tree.erase(*badIt);
233 if (ngood != truth_tree.size()) {
234 ATH_MSG_WARNING(
" Problem cleaning map: size " << truth_tree.size() <<
" accepted entries " << ngood);
238 ATH_MSG_INFO(
" summarizing truth tree: number of particles " << truth_tree.size());
239 TruthTreeIt it = truth_tree.begin();
240 TruthTreeIt it_end = truth_tree.end();
241 for (; it != it_end; ++it) {
242 if (!it->second.truthTrack)
247 if (!it->second.mdtHits.empty())
ATH_MSG_INFO(
" mdt " << it->second.mdtHits.size());
248 if (!it->second.rpcHits.empty())
ATH_MSG_INFO(
" rpc " << it->second.rpcHits.size());
249 if (!it->second.tgcHits.empty())
ATH_MSG_INFO(
" tgc " << it->second.tgcHits.size());
250 if (!it->second.cscHits.empty())
ATH_MSG_INFO(
" csc " << it->second.cscHits.size());
251 if (!it->second.stgcHits.empty())
ATH_MSG_INFO(
" stgc " << it->second.stgcHits.size());
252 if (!it->second.mmHits.empty())
ATH_MSG_INFO(
" mm " << it->second.mmHits.size());
253 if (it->second.mdtHits.empty() && it->second.rpcHits.empty() && it->second.tgcHits.empty() && it->second.cscHits.empty() &&
254 it->second.stgcHits.empty() && it->second.mmHits.empty())
265 MuonSimDataCollection::const_iterator it = simDataCol->begin();
266 MuonSimDataCollection::const_iterator it_end = simDataCol->end();
267 for (; it != it_end; ++it) {
271 std::vector<MuonSimData::Deposit>::const_iterator dit = it->second.getdeposits().begin();
272 std::vector<MuonSimData::Deposit>::const_iterator dit_end = it->second.getdeposits().end();
273 for (; dit != dit_end; ++dit) {
275 std::map<int, int>::const_iterator bit = barcode_map.find(barcodeIn);
276 if (bit == barcode_map.end()) {
278 <<
" " <<
m_idHelperSvc->toString(
id) <<
" barcode " << barcodeIn);
282 int barcode = bit->second;
284 TruthTreeIt eit = truth_tree.find(barcode);
285 if (eit == truth_tree.end()) {
287 <<
" " <<
m_idHelperSvc->toString(
id) <<
" barcode " << barcode);
292 eit->second.mdtHits.insert(*it);
299 eit->second.rpcHits.insert(*it);
301 eit->second.tgcHits.insert(*it);
303 eit->second.stgcHits.insert(*it);
305 eit->second.mmHits.insert(*it);
307 if (msgLvl(MSG::VERBOSE)) {
309 if (barcode != barcodeIn)
ATH_MSG_VERBOSE(
" hit barcode " << barcodeIn);
318 CscSimDataCollection::const_iterator it = simDataCol->begin();
319 CscSimDataCollection::const_iterator it_end = simDataCol->end();
320 for (; it != it_end; ++it) {
324 std::vector<CscSimData::Deposit>::const_iterator dit = it->second.getdeposits().begin();
325 std::vector<CscSimData::Deposit>::const_iterator dit_end = it->second.getdeposits().end();
326 for (; dit != dit_end; ++dit) {
328 std::map<int, int>::const_iterator bit = barcode_map.find(barcodeIn);
329 if (bit == barcode_map.end()) {
331 <<
" " <<
m_idHelperSvc->toString(
id) <<
" barcode " << barcodeIn);
335 int barcode = bit->second;
337 TruthTreeIt eit = truth_tree.find(barcode);
338 if (eit == truth_tree.end()) {
340 <<
" " <<
m_idHelperSvc->toString(
id) <<
" barcode " << barcode);
344 if (msgLvl(MSG::VERBOSE)) {
346 if (barcode != barcodeIn)
ATH_MSG_VERBOSE(
" hit barcode " << barcodeIn);
348 eit->second.cscHits.insert(*it);
358 if (track.measurementsOnTrack())
return getTruth(truth_tree, track.measurementsOnTrack()->stdcont(), restrictedTruth);
363 bool restrictedTruth)
const {
364 std::set<Identifier> ids;
365 std::vector<const Trk::MeasurementBase*> measurements;
366 std::vector<const MuonSegment*>::const_iterator sit = segments.begin();
367 std::vector<const MuonSegment*>::const_iterator sit_end = segments.end();
368 for (; sit != sit_end; ++sit) {
369 std::vector<const Trk::MeasurementBase*>::const_iterator mit = (*sit)->containedMeasurements().begin();
370 std::vector<const Trk::MeasurementBase*>::const_iterator mit_end = (*sit)->containedMeasurements().end();
371 for (; mit != mit_end; ++mit) {
380 if (!
id.is_valid() || !
m_idHelperSvc->mdtIdHelper().is_muon(
id))
continue;
381 if (ids.count(
id))
continue;
382 measurements.push_back(meas);
386 return getTruth(truth_tree, measurements, restrictedTruth);
390 bool restrictedTruth)
const {
395 unsigned int nmatchedHitsBest = 0;
397 TruthTreeConstIt tit = truth_tree.begin();
398 TruthTreeConstIt tit_end = truth_tree.end();
399 for (; tit != tit_end; ++tit) {
400 unsigned int nhits = tit->second.mdtHits.size() + tit->second.cscHits.size() + tit->second.rpcHits.size() +
401 tit->second.tgcHits.size() + tit->second.stgcHits.size() + tit->second.mmHits.size();
402 if (nhits == 0)
continue;
406 ATH_MSG_DEBUG(
" performed truth match for particle with barcode: " << tit->first <<
" overlap " << nmatchedHits <<
" fraction "
407 << (
double)nmatchedHits / (
double)nhits);
408 if (nmatchedHits > 0 && nmatchedHits > nmatchedHitsBest) {
409 bestMatch = trackTruth;
410 nmatchedHitsBest = nmatchedHits;
418 const TruthTreeEntry& truthEntry,
bool restrictedTruth)
const {
420 trackTruth.
truthTrack = truthEntry.truthTrack;
423 std::vector<const Trk::MeasurementBase*>::const_iterator mit = measurements.begin();
424 std::vector<const Trk::MeasurementBase*>::const_iterator mit_end = measurements.end();
425 for (; mit != mit_end; ++mit) {
428 if (!meas) {
continue; }
437 if (!
id.is_valid() || !
m_idHelperSvc->mdtIdHelper().is_muon(
id))
continue;
468 MuonSimDataCollection::const_iterator it = simCol.begin();
469 MuonSimDataCollection::const_iterator it_end = simCol.end();
470 for (; it != it_end; ++it) {
475 int isOnTrack = ids.count(
id);
476 if (isOnTrack)
continue;
480 bool chamberHasHits = chids.count(chid);
481 if (restrictedTruth && !chamberHasHits)
continue;
484 std::vector<MuonSimData::Deposit>::const_iterator dit = it->second.getdeposits().begin();
485 std::vector<MuonSimData::Deposit>::const_iterator dit_end = it->second.getdeposits().end();
486 for (; dit != dit_end; ++dit) {
497 CscSimDataCollection::const_iterator it = simCol.begin();
498 CscSimDataCollection::const_iterator it_end = simCol.end();
499 for (; it != it_end; ++it) {
502 int isOnTrack = ids.count(
id);
503 if (isOnTrack)
continue;
507 bool chamberHasHits = chids.count(chid);
508 if (restrictedTruth && !chamberHasHits)
continue;
511 std::vector<CscSimData::Deposit>::const_iterator dit = it->second.getdeposits().begin();
512 std::vector<CscSimData::Deposit>::const_iterator dit_end = it->second.getdeposits().end();
513 for (; dit != dit_end; ++dit) {
532 MuonSimDataCollection::const_iterator it = simCol.find(
id);
533 if (it == simCol.end()) {
539 std::vector<MuonSimData::Deposit>::const_iterator dit = it->second.getdeposits().begin();
540 std::vector<MuonSimData::Deposit>::const_iterator dit_end = it->second.getdeposits().end();
541 for (; dit != dit_end; ++dit) {
542 double radius = dit->second.firstEntry();
546 if (checkSign >= 0) {
561 MuonSimDataCollection::const_iterator it = simCol.end();
563 bool goodCluster =
false;
568 if (!cluster)
continue;
570 it = simCol.find(cluster->
identify());
571 if (it != simCol.end()) {
583 const std::vector<Identifier> &rdoList = prd->
rdoList();
584 std::vector<Identifier>::const_iterator rit = rdoList.begin();
585 std::vector<Identifier>::const_iterator rit_end = rdoList.end();
586 for (; rit != rit_end; ++rit) {
587 it = simCol.find(*rit);
588 if (it != simCol.end()) {
594 it = simCol.find(
id);
595 if (it != simCol.end()) goodCluster =
true;
599 if (!goodCluster || it == simCol.end()) {
604 std::vector<MuonSimData::Deposit>::const_iterator dit = it->second.getdeposits().begin();
605 std::vector<MuonSimData::Deposit>::const_iterator dit_end = it->second.getdeposits().end();
606 for (; dit != dit_end; ++dit) {
617 CscSimDataCollection::const_iterator it = simCol.find(
id);
618 if (it == simCol.end()) {
624 std::vector<CscSimData::Deposit>::const_iterator dit = it->second.getdeposits().begin();
625 std::vector<CscSimData::Deposit>::const_iterator dit_end = it->second.getdeposits().end();
626 for (; dit != dit_end; ++dit) {
634 int pdgFinal = ((traj.empty()) ? -999 : traj.front().cptr()->pdg_id());
635 bool foundBC =
false;
636 for (
const auto& pit : traj) {
641 auto particle = pit.scptr();
642 if (particle->pdg_id() != pdgFinal) {
651 bool foundBC =
false;
652 for (
const auto& pit : traj) {
656 auto particle = pit.scptr();
666 const int barcodeIn)
const {
667 std::pair<HepMC::ConstGenParticlePtr, unsigned int> thePair(
nullptr, 0);
668 unsigned int scat = 0;
670 bool foundBC =
false;
674 for (
auto pit = traj.begin(); pit != traj.end(); ++pit) {
676 auto particle = (*pit).scptr();
680 pdgFinal = particle->pdg_id();
682 if (particle->pdg_id() == pdgFinal) {
683 const auto& pit_p = *pit;
684 if ((theFirst != pit_p.scptr()) && (particle->momentum().t() != ePrev))
689 theFirst = (*pit).scptr();
693 ATH_MSG_DEBUG(
"getFirst() : pt = " << particle->momentum().perp() <<
" scat = " << scat);
694 ePrev = particle->momentum().t();
698 if (theFirst && theFirst->pdg_id() != pdgFinal)
ATH_MSG_ERROR(
"Wrong pdgId association in getFirst()");
699 ATH_MSG_DEBUG(
"Number of scatters = " << scat <<
" pdgId = " << pdgFinal);
701 thePair.first = theFirst;
702 thePair.second = scat;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
ATLAS-specific HepMC functions.
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
AtlasHitsVector< TrackRecord > TrackRecordCollection
AtlasHitsVector< TrackRecord >::const_iterator TrackRecordConstIterator
const_iterator begin() const
const_iterator end() const
DataModel_detail::const_iterator< DataVector > const_iterator
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
const T * front() const
Access the first element in the collection as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
Class for competing MuonClusters, it extends the Trk::CompetingRIOsOnTrack base class.
unsigned int numberOfContainedROTs() const
Number of RIO_OnTracks to be contained by this CompetingRIOsOnTrack.
const MuonClusterOnTrack & rioOnTrack(unsigned int) const
returns the RIO_OnTrack (also known as ROT) objects depending on the integer
This class represents the corrected MDT measurements, where the corrections include the effects of wi...
double driftRadius() const
Returns the value of the drift radius.
Base class for Muon cluster RIO_OnTracks.
This is the common class for 3D segments used in the muon spectrometer.
std::set< Identifier > wrongHits
std::set< Identifier > matchedHits
std::set< Identifier > missedChambers
std::set< Identifier > wrongChambers
std::set< Identifier > missedHits
std::set< Identifier > matchedChambers
const TrackRecord * truthTrack
std::shared_ptr< const TruthTrajectory > truthTrajectory
MuonTechnologyTruth stgcs
unsigned int numberOfMatchedHits() const
This class is the pure abstract base class for all fittable tracking measurements.
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
Class to handle pseudo-measurements in fitters and on track objects.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
Identifier identify() const
return the identifier -extends MeasurementBase
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
A TruthTrajectory is a chain of charged MC particles connected through the mother-daughter relationsh...
constexpr int UNDEFINED_ID
HepMC3::ConstGenParticlePtr ConstGenParticlePtr
HepMC3::GenEvent GenEvent
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.