70 std::vector<const Trk::MeasurementBase*>
meas;
75 template <
class Map>
void printMap(
const Map& m) {
76 std::cout <<
"printMap(): [";
77 for (
typename Map::const_iterator i = m.begin(); i != m.end(); ++i) { std::cout <<
"(" << i->first <<
"," << i->second <<
"), "; }
78 std::cout <<
"]" << std::endl;
85 SubDetPRDs& operator+=(SubDetPRDs&
a,
const SubDetPRDs& b) {
87 const std::set<Identifier>& bset =
b.subDetHits[
i];
88 for (std::set<Identifier>::const_iterator pb = bset.begin(); pb != bset.end(); ++pb) {
a.subDetHits[
i].insert(*pb); }
102 class Sprout :
public std::list<HepMC::ConstGenParticlePtr> {
113 const IInterface* parent) :
115 declareInterface<IDetailedMuonPatternTruthBuilder>(
this);
124 return StatusCode::SUCCESS;
130 const std::vector<const PRD_MultiTruthCollection*>& prdTruth) {
131 ATH_MSG_VERBOSE(
"DetailedMuonPatternTruthBuilder::buildDetailedMuonPatternTruth() ");
133 if (!output) {
return; }
141 for (std::vector<const PRD_MultiTruthCollection*>::const_iterator i = prdTruth.begin(); i != prdTruth.end(); ++i) {
143 if (!(*i)->empty()) {
147 orderedPRD_Truth[subdet] = *i;
161 for (
unsigned itrack = 0; itrack <
patterns.size(); itrack++) {
163 addTrack(output, ptrack, orderedPRD_Truth, inverseTruth);
169 "Dumping output collection.\n"
170 " Entries with TruthTrajectories of more then one particle shown at the DEBUG level.\n"
171 " Use VERBOSE level for complete dump.");
173 for (DetailedMuonPatternTruthCollection::const_iterator i = output->begin(); i != output->end(); ++i) {
174 bool interesting = (i->second.trajectory().size() > 1);
182 msg(MSG::VERBOSE) <<
"Particles on the trajectory:\n";
183 for (
unsigned k = 0; k < t.size(); ++k) {
msg(MSG::VERBOSE) << t[k] <<
"\n"; }
193 const std::vector<const PRD_MultiTruthCollection*>& prdTruth) {
194 ATH_MSG_VERBOSE(
"DetailedMuonPatternTruthBuilder::buildDetailedTrackTruth() ");
196 if (!output) {
return; }
204 for (std::vector<const PRD_MultiTruthCollection*>::const_iterator i = prdTruth.begin(); i != prdTruth.end(); ++i) {
206 if (!(*i)->empty()) {
210 orderedPRD_Truth[subdet] = *i;
228 "Dumping output collection.\n"
229 " Entries with TruthTrajectories of more then one particle shown at the DEBUG level.\n"
230 " Use VERBOSE level for complete dump.");
272 const std::vector<const PRD_MultiTruthCollection*>& orderedPRD_Truth,
275 std::map<HepMcParticleLink, SubDetPRDs> pairStat;
278 const std::vector<Muon::MuonPatternChamberIntersect>& MPCIV = (*MuPatternCombo)->chamberData();
279 for (
unsigned int i_MPCI = 0; i_MPCI < MPCIV.size(); i_MPCI++) {
280 if (MPCIV.empty())
continue;
283 std::vector<const Trk::PrepRawData*> PRDV = MPCIV.at(i_MPCI).prepRawDataVec();
286 for (
unsigned int j_PRD = 0; j_PRD < PRDV.size(); j_PRD++) {
287 if (PRDV.empty())
continue;
294 if (orderedPRD_Truth[subdet]) {
297 typedef PRD_MultiTruthCollection::const_iterator iprdt;
298 std::pair<iprdt, iprdt> range = orderedPRD_Truth[subdet]->equal_range(
id);
302 for (iprdt i = range.first; i != range.second; ++i) {
303 if (!i->second.isValid()) {
304 ATH_MSG_WARNING(
"Unexpected invalid HepMcParticleLink in PRD_MultiTruthCollection");
306 pairStat[i->second].subDetHits[subdet].insert(
id);
308 ATH_MSG_VERBOSE(
"PRD-ID:" <<
id <<
" subdet:" << subdet <<
" number:" << n
309 <<
" particle link:" << i->second);
313 ATH_MSG_VERBOSE(
"--> no link, noise ? PRD-ID:" <<
id <<
" subdet:" << subdet);
315 unsigned int ID(0), EV(0);
323 if (
msgLvl(MSG::VERBOSE)) {
324 msg(MSG::VERBOSE) <<
"PRD truth particles = ";
325 for (std::map<HepMcParticleLink, SubDetPRDs>::const_iterator i = pairStat.begin(); i != pairStat.end(); ++i) {
326 msg(MSG::VERBOSE) << i->first <<
",";
334 std::set<HepMcParticleLink> seeds;
335 for (std::map<HepMcParticleLink, SubDetPRDs>::const_iterator i = pairStat.begin(); i != pairStat.end(); ++i) {
336 if (i->first.isValid()) {
337 seeds.insert(i->first);
342 traj.push_back(i->first);
351 output->insert(std::make_pair(MuPatternCombo,
DetailedTrackTruth(traj, noiseStat, trackStat, noiseStat)));
356 typedef std::map<HepMcParticleLink, Sprout> SproutMap;
359 while (!seeds.empty()) {
362 Sprout current_sprout;
363 std::queue<HepMC::ConstGenParticlePtr> tmp;
368 const HepMC::GenParticle* current = link.
cptr();
375 seeds.erase(curlink);
378 SproutMap::iterator p_old = sprouts.find(curlink);
379 if (p_old != sprouts.end()) {
381 current_sprout.splice(current_sprout.end(), p_old->second);
382 current_sprout.stat += p_old->second.stat;
384 sprouts.erase(p_old);
392 current_sprout.push_back(current);
394 std::map<HepMcParticleLink, SubDetPRDs>::iterator p_newstat = pairStat.find(curlink);
395 if (p_newstat != pairStat.end()) { current_sprout.stat += p_newstat->second; }
400 sprouts.insert(std::make_pair(link, current_sprout));
414 for (SproutMap::iterator s = sprouts.begin(); s != sprouts.end(); ++s) {
420 while ((current =
m_truthTrackBuilder->getDaughter(current))) { s->second.push_front(current); }
426 for (Sprout::const_iterator ppart = s->second.begin(); ppart != s->second.end(); ++ppart) {
431 std::set<Muon::MuonStationIndex::ChIndex> tempSet;
436 std::make_pair(MuPatternCombo,
DetailedTrackTruth(traj, makeSubDetHitStatistics(s->second.stat), trackStat, truthStat)));
439 ATH_MSG_VERBOSE(
"addTrack(): #sprouts = " << sprouts.size() <<
", output->size() = " << output->size());
444 std::set<Muon::MuonStationIndex::ChIndex> chIndices) {
449 for (TruthTrajectory::const_iterator p = traj.begin(); p != traj.end(); ++p) {
450 typedef PRD_InverseTruth::const_iterator iter;
451 std::pair<iter, iter> range = inverseTruth.equal_range(*p);
452 for (iter i = range.first; i != range.second; ++i) {
453 if (chIndices.find(
m_idHelperSvc->chamberIndex(i->second)) != chIndices.end()) {
456 prds.subDetHits[subdet].insert(i->second);
461 return makeSubDetHitStatistics(prds);
466 std::list<HepMC::ConstGenParticlePtr> genPartList,
int truthPos,
467 std::set<Muon::MuonStationIndex::ChIndex> chIndices) {
468 double minPos = 2e8, maxPos = 0;
471 if (genPartList.empty()) {
472 ATH_MSG_WARNING(
"No GenParticles associated to this PRD_TruthTrajectory. Exiting segment creation.");
477 if (!mdtSimDataMap) {
489 if (!stgcSimDataMap) {
496 std::map<Muon::MuonStationIndex::StIndex, DetectorLayer> hitsPerLayer;
497 std::map<const Trk::TrkDetElementBase*, std::pair<std::list<const Trk::PrepRawData*>, std::list<const Trk::PrepRawData*> > >
512 if (chIndices.find(
m_idHelperSvc->chamberIndex(
id)) == chIndices.end()) {
513 ATH_MSG_DEBUG(
"Muon station doesn't match segment. Continuing");
521 stIndex = Muon::MuonStationIndex::StIndex::EI;
526 stIndex = Muon::MuonStationIndex::StIndex::EI;
543 for (
auto it = genPartList.begin(); it != genPartList.end() && !deposit; ++it) {
544 deposit =
getDeposit(*mdtSimDataMap, *it,
id);
551 Amg::Vector2D lp(deposit->second.firstEntry(), deposit->second.secondEntry());
554 double val = isEndcap ? fabs(gpos.z()) : gpos.perp();
557 if (val < detLayer.
minPos) {
564 }
else if (val > detLayer.
maxPos) {
570 if (maxPos < -1e8 && minPos < 1e8) {
576 }
else if (val > maxPos) {
590 << deposit->second.firstEntry() <<
" pull " << pull);
592 detLayer.
meas.push_back(mdt);
600 for (
auto it = genPartList.begin(); it != genPartList.end() && !deposit; ++it) {
608 Amg::Vector2D lp(deposit->second.firstEntry(), deposit->second.secondEntry());
613 double val = fabs(gpos.z());
615 if (val < detLayer.
minPos) {
622 }
else if (val > detLayer.
maxPos) {
628 if (maxPos < -1e8 && detLayer.
minPos < 1e8) {
634 }
else if (val > maxPos) {
647 <<
" pull " << pull);
648 detLayer.
meas.push_back(rot);
660 for (
auto it = genPartList.begin(); it != genPartList.end() && !deposit; ++it) {
661 deposit =
getDeposit(*stgcSimDataMap, *it,
id);
668 Amg::Vector2D lp(deposit->second.firstEntry(), deposit->second.secondEntry());
673 double val = fabs(gpos.z());
675 if (val < detLayer.
minPos) {
682 }
else if (val > detLayer.
maxPos) {
688 if (maxPos < -1e8 && minPos < 1e8) {
694 }
else if (val > maxPos) {
707 <<
" pull " << pull);
708 detLayer.
meas.push_back(rot);
715 if (minPos == 2e8 || maxPos == 0) {
716 ATH_MSG_WARNING(
"Min and max positions not found. Filling with meaningless position");
721 return (first3D + last3D) / 2;
724 return (last3D - first3D);
731 const std::vector<const PRD_MultiTruthCollection*>& orderedPRD_Truth,
734 std::map<HepMcParticleLink, SubDetPRDs> pairStat;
737 const std::vector<Muon::MuonPatternChamberIntersect>& MPCIV = pattern.chamberData();
738 for (
unsigned int i_MPCI = 0; i_MPCI < MPCIV.size(); i_MPCI++) {
739 if (MPCIV.empty())
continue;
742 std::vector<const Trk::PrepRawData*> PRDV = MPCIV.at(i_MPCI).prepRawDataVec();
745 for (
unsigned int j_PRD = 0; j_PRD < PRDV.size(); j_PRD++) {
746 if (PRDV.empty())
continue;
753 if (orderedPRD_Truth[subdet]) {
756 typedef PRD_MultiTruthCollection::const_iterator iprdt;
757 std::pair<iprdt, iprdt> range = orderedPRD_Truth[subdet]->equal_range(
id);
761 for (iprdt i = range.first; i != range.second; ++i) {
762 if (!i->second.isValid()) {
763 ATH_MSG_WARNING(
"Unexpected invalid HepMcParticleLink in PRD_MultiTruthCollection");
765 pairStat[i->second].subDetHits[subdet].insert(
id);
767 ATH_MSG_VERBOSE(
"PRD-ID:" <<
id <<
" subdet:" << subdet <<
" number:" << n
768 <<
" particle link:" << i->second);
772 ATH_MSG_VERBOSE(
"--> no link, noise ? PRD-ID:" <<
id <<
" subdet:" << subdet);
774 unsigned int ID(0), EV(0);
782 if (
msgLvl(MSG::VERBOSE)) {
783 msg(MSG::VERBOSE) <<
"PRD truth particles = ";
784 for (std::map<HepMcParticleLink, SubDetPRDs>::const_iterator i = pairStat.begin(); i != pairStat.end(); ++i) {
785 msg(MSG::VERBOSE) << i->first <<
",";
794 std::set<HepMcParticleLink> seeds;
795 for (std::map<HepMcParticleLink, SubDetPRDs>::const_iterator i = pairStat.begin(); i != pairStat.end(); ++i) {
796 if (i->first.isValid()) {
797 seeds.insert(i->first);
802 traj.push_back(i->first);
816 typedef std::map<HepMcParticleLink, Sprout> SproutMap;
819 while (!seeds.empty()) {
822 Sprout current_sprout;
823 std::queue<HepMC::ConstGenParticlePtr> tmp;
828 const HepMC::GenParticle* current = link.
cptr();
835 seeds.erase(curlink);
838 SproutMap::iterator p_old = sprouts.find(curlink);
839 if (p_old != sprouts.end()) {
841 current_sprout.splice(current_sprout.end(), p_old->second);
842 current_sprout.stat += p_old->second.stat;
844 sprouts.erase(p_old);
852 current_sprout.push_back(current);
854 std::map<HepMcParticleLink, SubDetPRDs>::iterator p_newstat = pairStat.find(curlink);
855 if (p_newstat != pairStat.end()) { current_sprout.stat += p_newstat->second; }
860 sprouts.insert(std::make_pair(link, current_sprout));
873 for (SproutMap::iterator s = sprouts.begin(); s != sprouts.end(); ++s) {
879 while ((current =
m_truthTrackBuilder->getDaughter(current))) { s->second.push_front(current); }
885 for (Sprout::const_iterator ppart = s->second.begin(); ppart != s->second.end(); ++ppart) {
890 std::set<Muon::MuonStationIndex::ChIndex> tempSet;
894 output->push_back(
DetailedTrackTruth(traj, makeSubDetHitStatistics(s->second.stat), trackStat, truthStat));
897 ATH_MSG_VERBOSE(
"addTrack(): #sprouts = " << sprouts.size() <<
", output->size() = " << output->size());
902 const std::vector<const PRD_MultiTruthCollection*>& prdTruth) {
903 ATH_MSG_VERBOSE(
"DetailedMuonPatternTruthBuilder::buildDetailedTrackTruthFromSegments() ");
905 if (!output) {
return; }
913 for (std::vector<const PRD_MultiTruthCollection*>::const_iterator i = prdTruth.begin(); i != prdTruth.end(); ++i) {
915 if (!(*i)->empty()) {
919 orderedPRD_Truth[subdet] = *i;
937 "Dumping output collection.\n"
938 " Entries with TruthTrajectories of more then one particle shown at the DEBUG level.\n"
939 " Use VERBOSE level for complete dump.");
945 const std::vector<const PRD_MultiTruthCollection*>& orderedPRD_Truth,
const PRD_InverseTruth& inverseTruth) {
947 std::map<HepMcParticleLink, SubDetPRDs> pairStat;
949 std::set<Muon::MuonStationIndex::ChIndex> chIndices;
965 if (orderedPRD_Truth[subdet]) {
968 typedef PRD_MultiTruthCollection::const_iterator iprdt;
969 std::pair<iprdt, iprdt> range = orderedPRD_Truth[subdet]->equal_range(
id);
973 for (iprdt i = range.first; i != range.second; ++i) {
974 if (!i->second.isValid()) {
975 ATH_MSG_WARNING(
"Unexpected invalid HepMcParticleLink in PRD_MultiTruthCollection");
977 pairStat[i->second].subDetHits[subdet].insert(
id);
979 ATH_MSG_VERBOSE(
"PRD-ID:" <<
id <<
" subdet:" << subdet <<
" number:" << n <<
" particle link:" << i->second);
983 ATH_MSG_VERBOSE(
"--> no link, noise ? PRD-ID:" <<
id <<
" subdet:" << subdet);
985 unsigned int ID(0), EV(0);
992 if (
msgLvl(MSG::VERBOSE)) {
993 msg(MSG::VERBOSE) <<
"PRD truth particles = ";
994 for (std::map<HepMcParticleLink, SubDetPRDs>::const_iterator i = pairStat.begin(); i != pairStat.end(); ++i) {
995 msg(MSG::VERBOSE) << i->first <<
",";
1004 std::set<HepMcParticleLink> seeds;
1005 for (std::map<HepMcParticleLink, SubDetPRDs>::const_iterator i = pairStat.begin(); i != pairStat.end(); ++i) {
1006 if (i->first.isValid()) {
1007 seeds.insert(i->first);
1012 traj.push_back(i->first);
1027 typedef std::map<HepMcParticleLink, Sprout> SproutMap;
1030 while (!seeds.empty()) {
1033 Sprout current_sprout;
1034 std::queue<HepMC::ConstGenParticlePtr> tmp;
1039 const HepMC::GenParticle* current = link.
cptr();
1046 seeds.erase(curlink);
1049 SproutMap::iterator p_old = sprouts.find(curlink);
1050 if (p_old != sprouts.end()) {
1052 current_sprout.splice(current_sprout.end(), p_old->second);
1053 current_sprout.stat += p_old->second.stat;
1055 sprouts.erase(p_old);
1063 current_sprout.push_back(current);
1065 std::map<HepMcParticleLink, SubDetPRDs>::iterator p_newstat = pairStat.find(curlink);
1066 if (p_newstat != pairStat.end()) { current_sprout.stat += p_newstat->second; }
1071 sprouts.insert(std::make_pair(link, current_sprout));
1084 for (SproutMap::iterator s = sprouts.begin(); s != sprouts.end(); ++s) {
1090 while ((current =
m_truthTrackBuilder->getDaughter(current))) { s->second.push_front(current); }
1096 for (Sprout::const_iterator ppart = s->second.begin(); ppart != s->second.end(); ++ppart) {
1106 output->push_back(
DetailedSegmentTruth(traj, makeSubDetHitStatistics(s->second.stat), trackStat, truthStat, pos, dir));
1109 ATH_MSG_VERBOSE(
"addTrack(): #sprouts = " << sprouts.size() <<
", output->size() = " << output->size());
1115 MuonSimDataCollection::const_iterator it = simCol.find(
id);
1116 if (it == simCol.end()) {
1123 std::vector<MuonSimData::Deposit>::const_iterator dit =
simData.getdeposits().begin();
1124 std::vector<MuonSimData::Deposit>::const_iterator dit_end =
simData.getdeposits().end();
1125 for (; dit != dit_end; ++dit) {
1129 const HepMC::GenParticle* gp = dit->first;
1131 if (gp == genPart) {
1145 if (!
evtStore()->retrieve(truthCol, colName).isSuccess()) {
1146 ATH_MSG_VERBOSE(
"Could NOT find the MuonSimDataMap map key = " << colName);
1148 ATH_MSG_VERBOSE(
"Retrieved MuonSimDataCollection for key = " << colName);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
An STL vector of pointers that by default owns its pointed-to elements.
std::pair< std::vector< unsigned int >, bool > res
DataVector< Muon::MuonPatternCombination > MuonPatternCombinationCollection
This typedef represents a collection of MuonPatternCombination objects.
ServiceHandle< StoreGateSvc > & evtStore()
bool msgLvl(const MSG::Level lvl) const
ElementLink implementation for ROOT usage.
a link optimized in size for a GenParticle in a McEventCollection
HepMC::ConstGenParticlePtr cptr() const
Dereference.
HepMC::ConstGenParticlePtr scptr() const
Dereference/smart pointer.
index_type eventIndex() const
Return the event number of the referenced GenEvent.
std::pair< HepMcParticleLink, MuonMCData > Deposit
Class to represent MM measurements.
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.
Class to represent measurements from the Monitored Drift Tubes.
Base class for Muon cluster RIO_OnTracks.
The MuonPatternCombination class provides the means to store the output of the initial global pattern...
This is the common class for 3D segments used in the muon spectrometer.
const Trk::RIO_OnTrack * rioOnTrack(unsigned int) const
returns the RIO_OnTrack (also known as ROT) objects depending on the integer
unsigned int numberOfContainedROTs() const
number of RIO_OnTracks
Class to represent sTgc measurements.
virtual StatusCode initialize()
virtual void buildDetailedMuonPatternTruth(DetailedMuonPatternTruthCollection *output, const MuonPatternCombinationCollection &tracks, const std::vector< const PRD_MultiTruthCollection * > &prdTruth)
See description for IDetailedMuonPatternTruthBuilder::buildDetailedTrackTruth()
InverseMultiMap< PRD_MultiTruthCollection > PRD_InverseTruth
const MuonSimDataCollection * retrieveTruthCollection(const std::string &colName)
SubDetHitStatistics::SubDetType findSubDetType(Identifier id)
void addDetailedTrackTruth(std::vector< DetailedTrackTruth > *output, const Muon::MuonPatternCombination &pattern, const std::vector< const PRD_MultiTruthCollection * > &orderedPRD_Truth, const PRD_InverseTruth &inverseTruth)
Amg::Vector3D getPRDTruthPosition(const Muon::MuonSegment &segment, std::list< HepMC::ConstGenParticlePtr > genPartList, int truthPos, std::set< Muon::MuonStationIndex::ChIndex > chIndices)
void addTrack(DetailedMuonPatternTruthCollection *output, const ElementLink< DataVector< Muon::MuonPatternCombination > > &track, const std::vector< const PRD_MultiTruthCollection * > &orderedPRD_Truth, const PRD_InverseTruth &inverseTruth)
void buildDetailedTrackTruthFromSegments(std::vector< DetailedSegmentTruth > *output, const Muon::MuonSegment &segment, const std::vector< const PRD_MultiTruthCollection * > &prdTruth)
ToolHandle< Muon::IMuonClusterOnTrackCreator > m_muonClusterCreator
SubDetHitStatistics countPRDsOnTruth(const TruthTrajectory &traj, const PRD_InverseTruth &inverseTruth, std::set< Muon::MuonStationIndex::ChIndex > chIndices)
ToolHandle< Trk::ITruthTrajectoryBuilder > m_truthTrackBuilder
void addDetailedTrackTruthFromSegment(std::vector< DetailedSegmentTruth > *output, const Muon::MuonSegment &segment, const std::vector< const PRD_MultiTruthCollection * > &orderedPRD_Truth, const PRD_InverseTruth &inverseTruth)
DetailedMuonPatternTruthBuilder(const std::string &type, const std::string &name, const IInterface *parent)
virtual void buildDetailedTrackTruth(std::vector< DetailedTrackTruth > *output, const Muon::MuonPatternCombination &pattern, const std::vector< const PRD_MultiTruthCollection * > &prdTruth)
ToolHandle< Muon::IMdtDriftCircleOnTrackCreator > m_mdtCreator
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
const MuonSimData::Deposit * getDeposit(const MuonSimDataCollection &simCol, const HepMC::ConstGenParticlePtr &genPart, const Identifier &id)
double get(ParamDefs par) const
Retrieve specified parameter (const version).
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
virtual const TrkDetElementBase * detectorElement() const =0
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
Identifier identify() const
return the identifier
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.
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const =0
Specified by each surface type: LocalToGlobal method without dynamic memory allocation.
virtual const Surface & surface() const =0
Return surface associated with this detector element.
A TruthTrajectory is a chain of charged MC particles connected through the mother-daughter relationsh...
bool contains(const std::string &s, const std::string ®x)
does a string contain the substring
std::vector< std::string > patterns
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
const GenParticle * ConstGenParticlePtr
StIndex
enum to classify the different station layers in the muon spectrometer
Ensure that the ATLAS eigen extensions are properly loaded.
DriftCircleSide
Enumerates the 'side' of the wire on which the tracks passed (i.e.
@ RIGHT
the drift radius is positive (see Trk::AtaStraightLine)
@ LEFT
the drift radius is negative (see Trk::AtaStraightLine)
void addToInverseMultiMap(InverseMultiMap< OrigMap, CmpT > *result, const OrigMap &rec2truth)
std::vector< const Trk::MeasurementBase * > meas
Muon::MuonStationIndex::StIndex stIndex