39 return StatusCode::SUCCESS;
48 const MuonTrackTruthTool::MatchResult& r2)
const {
53 const MuonTrackTruthTool::SegmentMatchResult& r2)
const {
54 return operator()(r1.second, r2.second);
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;
113 MuonTrackTruthTool::TruthTree truth_tree;
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());
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;
154 truthTrajectory = std::make_unique<TruthTrajectory>();
156 if (!truthTrajectory->empty()) {
160 if (msgLvl(MSG::VERBOSE)) {
161 auto particle = truthTrajectory->front().cptr();
162 ATH_MSG_VERBOSE(
" found GenParticle: size " << truthTrajectory->size() <<
" fs barcode " << barcode <<
"particle "<< particle);
163 if (particle->production_vertex()) {
164 ATH_MSG_VERBOSE(
" vertex: r " << particle->production_vertex()->position().perp() <<
" z "
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) {
175 if (msgLvl(MSG::VERBOSE) && code != barcode) {
176 auto particle = (*pit).cptr();
177 ATH_MSG_VERBOSE(
" secondary barcode: " << code <<
"particle "<< particle);
178 if (particle->production_vertex())
179 ATH_MSG_VERBOSE(
" vertex: r " <<particle->production_vertex()->position().perp() <<
" z "
180 << particle->production_vertex()->position().z());
182 if (barcode_map.count(code))
ATH_MSG_VERBOSE(
" pre-existing barcode " << code);
186 barcode_map[code] = barcode;
194 barcode_map[barcode] = barcode;
197 if (truth_tree.count(barcode)) {
198 ATH_MSG_WARNING(
" found muon barcode twice in truth record: " << barcode);
202 TruthTreeEntry& entry = truth_tree[barcode];
203 entry.truthTrack = &(*tr_it);
205 entry.truthTrajectory = std::move(truthTrajectory);
213 unsigned int ngood(0);
214 std::vector<int> badBarcodes;
216 TruthTreeIt it = truth_tree.begin();
217 for (; it != truth_tree.end(); ++it) {
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;
226 badBarcodes.push_back(it->first);
233 std::vector<int>::iterator badIt = badBarcodes.begin();
234 std::vector<int>::iterator badIt_end = badBarcodes.end();
235 for (; badIt != badIt_end; ++badIt) truth_tree.erase(*badIt);
237 if (ngood != truth_tree.size()) {
238 ATH_MSG_WARNING(
" Problem cleaning map: size " << truth_tree.size() <<
" accepted entries " << ngood);
242 ATH_MSG_INFO(
" summarizing truth tree: number of particles " << truth_tree.size());
243 TruthTreeIt it = truth_tree.begin();
244 TruthTreeIt it_end = truth_tree.end();
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);
286 int barcode = bit->second;
288 TruthTreeIt eit = truth_tree.find(barcode);
289 if (eit == truth_tree.end()) {
291 <<
" " <<
m_idHelperSvc->toString(
id) <<
" barcode " << barcode);
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);
311 if (msgLvl(MSG::VERBOSE)) {
313 if (barcode != barcodeIn)
ATH_MSG_VERBOSE(
" hit barcode " << barcodeIn);
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);
339 int barcode = bit->second;
341 TruthTreeIt eit = truth_tree.find(barcode);
342 if (eit == truth_tree.end()) {
344 <<
" " <<
m_idHelperSvc->toString(
id) <<
" barcode " << barcode);
348 if (msgLvl(MSG::VERBOSE)) {
350 if (barcode != barcodeIn)
ATH_MSG_VERBOSE(
" hit 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);
390 return getTruth(truth_tree, measurements, restrictedTruth);
394 bool restrictedTruth)
const {
399 unsigned int nmatchedHitsBest = 0;
401 TruthTreeConstIt tit = truth_tree.begin();
402 TruthTreeConstIt tit_end = truth_tree.end();
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) {
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) {
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) {
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;
#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
const GenParticle * ConstGenParticlePtr
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.