CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonToSimAssociatorByHits.cc
Go to the documentation of this file.
14 #include <sstream>
15 
16 using namespace reco;
17 using namespace std;
18 
20  helper_(conf),
21  conf_(conf),
22  trackerHitAssociatorConfig_(conf,std::move(iC))
23 {
24  TrackerMuonHitExtractor hitExtractor(conf_,std::move(iC));
25 
26  //hack for consumes
27  RPCHitAssociator rpctruth(conf,std::move(iC));
28  GEMHitAssociator gemtruth(conf,std::move(iC));
29  DTHitAssociator dttruth(conf,std::move(iC));
30  CSCHitAssociator muonTruth(conf,std::move(iC));
31 }
32 
33 
35 {
36 }
37 
38 
39 
43  const edm::Event * event, const edm::EventSetup * setup) const {
44 
46  for (unsigned int j=0; j<tPCH->size();j++)
48 
49  edm::RefToBaseVector<reco::Muon> muonBaseRefVector;
50  for (size_t i = 0; i < tCH->size(); ++i)
51  muonBaseRefVector.push_back(tCH->refAt(i));
52 
53  associateMuons(recToSim, simToRec, muonBaseRefVector,type,tpc,event,setup);
54 }
55 
59  const edm::Event * event, const edm::EventSetup * setup) const {
60 
63  edm::OwnVector<TrackingRecHit> allTMRecHits; // this I will fill in only for tracker muon hits from segments
64  switch (trackType) {
65  case InnerTk:
66  for (edm::RefToBaseVector<reco::Muon>::const_iterator it = muons.begin(), ed = muons.end(); it != ed; ++it) {
68  if (mur->track().isNonnull()) {
69  muonHitRefs.push_back(std::make_pair(mur->track()->recHitsBegin(), mur->track()->recHitsEnd()));
70  } else {
71  muonHitRefs.push_back(std::make_pair(allTMRecHits.data().end(), allTMRecHits.data().end()));
72  }
73  }
74  break;
75  case OuterTk:
76  for (edm::RefToBaseVector<reco::Muon>::const_iterator it = muons.begin(), ed = muons.end(); it != ed; ++it) {
78  if (mur->outerTrack().isNonnull()) {
79  muonHitRefs.push_back(std::make_pair(mur->outerTrack()->recHitsBegin(), mur->outerTrack()->recHitsEnd()));
80  } else {
81  muonHitRefs.push_back(std::make_pair(allTMRecHits.data().end(), allTMRecHits.data().end()));
82  }
83  }
84  break;
85  case GlobalTk:
86  for (edm::RefToBaseVector<reco::Muon>::const_iterator it = muons.begin(), ed = muons.end(); it != ed; ++it) {
88  if (mur->globalTrack().isNonnull()) {
89  muonHitRefs.push_back(std::make_pair(mur->globalTrack()->recHitsBegin(), mur->globalTrack()->recHitsEnd()));
90  } else {
91  muonHitRefs.push_back(std::make_pair(allTMRecHits.data().end(), allTMRecHits.data().end()));
92  }
93  }
94  break;
95  case Segments: {
96  TrackerMuonHitExtractor hitExtractor(conf_);
97  hitExtractor.init(*event, *setup);
98  // puts hits in the vector, and record indices
99  std::vector<std::pair<size_t, size_t> > muonHitIndices;
100  for (edm::RefToBaseVector<reco::Muon>::const_iterator it = muons.begin(), ed = muons.end(); it != ed; ++it) {
101  edm::RefToBase<reco::Muon> mur = *it;
102  std::pair<size_t, size_t> indices(allTMRecHits.size(), allTMRecHits.size());
103  if (mur->isTrackerMuon()) {
104  std::vector<const TrackingRecHit *> hits = hitExtractor.getMuonHits(*mur);
105  for (std::vector<const TrackingRecHit *>::const_iterator ith = hits.begin(), edh = hits.end(); ith != edh; ++ith) {
106  allTMRecHits.push_back(**ith);
107  }
108  indices.second += hits.size();
109  }
110  muonHitIndices.push_back(indices);
111  }
112  // convert indices into pairs of iterators to references
113  typedef std::pair<size_t, size_t> index_pair;
114  trackingRecHit_iterator hitRefBegin = allTMRecHits.data().begin();
115  for (std::vector<std::pair<size_t, size_t> >::const_iterator idxs = muonHitIndices.begin(), idxend = muonHitIndices.end(); idxs != idxend; ++idxs) {
116  muonHitRefs.push_back(std::make_pair(hitRefBegin+idxs->first,
117  hitRefBegin+idxs->second));
118  }
119 
120  }
121  break;
122  }
123 
125  //Retrieve tracker topology from geometry
127  setup->get<TrackerTopologyRcd>().get(tTopoHand);
128  const TrackerTopology *tTopo=tTopoHand.product();
129 
130 
131  // Tracker hit association
133  // CSC hit association
134  CSCHitAssociator csctruth(*event,*setup,conf_);
135  // DT hit association
136  bool printRtS = true;
137  DTHitAssociator dttruth(*event,*setup,conf_,printRtS);
138  // RPC hit association
139  RPCHitAssociator rpctruth(*event,*setup,conf_);
140  // GEM hit association
141  GEMHitAssociator gemtruth(*event,*setup,conf_);
142 
143  MuonAssociatorByHitsHelper::Resources resources = {tTopo, &trackertruth, &csctruth, &dttruth, &rpctruth, &gemtruth};
144 
145  auto recSimColl = helper_.associateRecoToSimIndices(muonHitRefs,tPC,resources);
146  for (auto it = recSimColl.begin(), ed = recSimColl.end(); it != ed; ++it) {
147  edm::RefToBase<reco::Muon> rec = muons[it->first];
148  std::vector<std::pair<TrackingParticleRef, double> > & tpAss = recToSim[rec];
149  for ( auto const & a : it->second) {
150  tpAss.push_back(std::make_pair(tPC[a.idx], a.quality));
151  }
152  }
153  auto simRecColl = helper_.associateSimToRecoIndices(muonHitRefs,tPC,resources);
154  for (auto it = simRecColl.begin(), ed = simRecColl.end(); it != ed; ++it) {
155  TrackingParticleRef sim = tPC[it->first];
156  std::vector<std::pair<edm::RefToBase<reco::Muon>, double> > & recAss = simToRec[sim];
157  for ( auto const & a: it->second ) {
158  recAss.push_back(std::make_pair(muons[a.idx], a.quality));
159  }
160  }
161 
162 }
type
Definition: HCALResponse.h:21
std::map< edm::RefToBase< reco::Muon >, std::vector< std::pair< TrackingParticleRef, double > >, RefToBaseSort > MuonToSimCollection
int i
Definition: DBlmapReader.cc:9
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:252
ProductID id() const
Definition: HandleBase.cc:15
std::vector< const TrackingRecHit * > getMuonHits(const reco::Muon &mu) const
bool isTrackerMuon() const
Definition: Muon.h:223
size_type size() const
Definition: OwnVector.h:264
const_iterator end() const
virtual TrackRef track() const
reference to a Track
Definition: Muon.h:49
tuple resources
Definition: mps_fire.py:58
Definition: sim.h:19
IndexAssociation associateSimToRecoIndices(const TrackHitsCollection &, const edm::RefVector< TrackingParticleCollection > &, Resources const &) const
void push_back(D *&d)
Definition: OwnVector.h:290
std::vector< std::pair< trackingRecHit_iterator, trackingRecHit_iterator > > TrackHitsCollection
def move
Definition: eostools.py:510
int j
Definition: DBlmapReader.cc:9
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
Definition: Muon.h:51
void init(const edm::Event &, const edm::EventSetup &)
std::map< TrackingParticleRef, std::vector< std::pair< edm::RefToBase< reco::Muon >, double > > > SimToMuonCollection
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
void associateMuons(MuonToSimCollection &recoToSim, SimToMuonCollection &simToReco, const edm::RefToBaseVector< reco::Muon > &, MuonTrackType, const edm::RefVector< TrackingParticleCollection > &, const edm::Event *event=0, const edm::EventSetup *setup=0) const override
const_iterator begin() const
IndexAssociation associateRecoToSimIndices(const TrackHitsCollection &, const edm::RefVector< TrackingParticleCollection > &, Resources const &) const
base const & data() const
Definition: OwnVector.h:446
tuple muons
Definition: patZpeak.py:38
double a
Definition: hdecay.h:121
MuonAssociatorByHitsHelper helper_
void push_back(const RefToBase< T > &)
void push_back(value_type const &ref)
Add a Ref&lt;C, T&gt; to the RefVector.
Definition: RefVector.h:62
TrackerHitAssociator::Config trackerHitAssociatorConfig_
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
MuonToSimAssociatorByHits(const edm::ParameterSet &conf, edm::ConsumesCollector &&iC)
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54