CMS 3D CMS Logo

TrackAssociatorByHitsImpl.cc
Go to the documentation of this file.
1 //
2 //
4 
6 
10 
11 //reco track
15 //TrackingParticle
20 //##---new stuff
27 
28 using namespace reco;
29 using namespace std;
30 
31 /* Constructor */
32 
34  std::unique_ptr<TrackerHitAssociator> iAssociate,
35  TrackerTopology const* iTopo,
36  SimHitTPAssociationList const* iSimHitsTPAssoc,
37  SimToRecoDenomType iSimToRecoDenominator,
38  double iQuality_SimToReco,
39  double iPurity_SimToReco,
40  double iCut_RecoToSim,
41  bool iUsePixels,
42  bool iUseGrouped,
43  bool iUseSplitting,
44  bool iThreeHitTracksAreSpecial,
45  bool iAbsoluteNumberOfHits) :
46  productGetter_(&productGetter),
47  associate(std::move(iAssociate)),
48  tTopo(iTopo),
49  simHitsTPAssoc(iSimHitsTPAssoc),
50  SimToRecoDenominator(iSimToRecoDenominator),
51  quality_SimToReco(iQuality_SimToReco),
52  purity_SimToReco(iPurity_SimToReco),
53  cut_RecoToSim(iCut_RecoToSim),
54  UsePixels(iUsePixels),
55  UseGrouped(iUseGrouped),
56  UseSplitting(iUseSplitting),
57  ThreeHitTracksAreSpecial(iThreeHitTracksAreSpecial),
58  AbsoluteNumberOfHits(iAbsoluteNumberOfHits) {}
59 
60 /*
61 TrackAssociatorByHitsImpl::TrackAssociatorByHitsImpl (const edm::ParameterSet& conf) :
62  conf_(conf),
63  AbsoluteNumberOfHits(conf_.getParameter<bool>("AbsoluteNumberOfHits")),
64  SimToRecoDenominator(denomnone),
65  quality_SimToReco(conf_.getParameter<double>("Quality_SimToReco")),
66  purity_SimToReco(conf_.getParameter<double>("Purity_SimToReco")),
67  cut_RecoToSim(conf_.getParameter<double>("Cut_RecoToSim")),
68  UsePixels(conf_.getParameter<bool>("UsePixels")),
69  UseGrouped(conf_.getParameter<bool>("UseGrouped")),
70  UseSplitting(conf_.getParameter<bool>("UseSplitting")),
71  ThreeHitTracksAreSpecial(conf_.getParameter<bool>("ThreeHitTracksAreSpecial")),
72  _simHitTpMapTag(conf_.getParameter<edm::InputTag>("simHitTpMapTag"))
73 {
74  std::string tmp = conf_.getParameter<string>("SimToRecoDenominator");
75  if (tmp=="sim") {
76  SimToRecoDenominator = denomsim;
77  } else if (tmp == "reco") {
78  SimToRecoDenominator = denomreco;
79  }
80 
81  if (SimToRecoDenominator == denomnone) {
82  throw cms::Exception("TrackAssociatorByHitsImpl") << "SimToRecoDenominator not specified as sim or reco";
83  }
84 
85 }
86 */
87 
88 //
89 //---member functions
90 //
91 
94  const edm::RefVector<TrackingParticleCollection>& TPCollectionH) const {
95 
96  //edm::LogVerbatim("TrackAssociator") << "Starting TrackAssociatorByHitsImpl::associateRecoToSim - #tracks="<<tC.size()<<" #TPs="<<TPCollectionH.size();
97  int nshared = 0;
98  float quality=0;//fraction or absolute number of shared hits
99  std::vector< SimHitIdpr> SimTrackIds;
100  std::vector< SimHitIdpr> matchedIds;
101  RecoToSimCollection outputCollection(productGetter_);
102 
103  //dereference the edm::Refs only once
104  std::vector<TrackingParticle const*> tPC;
105  tPC.reserve(tPC.size());
106  for(auto const& ref: TPCollectionH) {
107  tPC.push_back(&(*ref));
108  }
109 
110  //get the ID of the recotrack by hits
111  int tindex=0;
113  matchedIds.clear();
114  int ri=0;//valid rechits
115  //LogTrace("TrackAssociator") << "\nNEW TRACK - track number " << tindex <<" with pt =" << (*track)->pt() << " # valid=" << (*track)->found();
116  getMatchedIds<trackingRecHit_iterator>(matchedIds, SimTrackIds, ri, (*track)->recHitsBegin(), (*track)->recHitsEnd(), associate.get());
117 
118  //LogTrace("TrackAssociator") << "MATCHED IDS LIST BEGIN" ;
119  //for(size_t j=0; j<matchedIds.size(); j++){
120  // LogTrace("TrackAssociator") << "matchedIds[j].first=" << matchedIds[j].first;
121  //}
122  //LogTrace("TrackAssociator") << "MATCHED IDS LIST END" ;
123  //LogTrace("TrackAssociator") << "#matched ids=" << matchedIds.size() << " #tps=" << tPC.size();
124 
125  //save id for the track
126  std::vector<SimHitIdpr> idcachev;
127  if(!matchedIds.empty()){
128 
129  int tpindex =0;
130  for (auto t = tPC.begin(); t != tPC.end(); ++t, ++tpindex) {
131  //int nsimhit = (*t)->trackPSimHit(DetId::Tracker).size();
132  //LogTrace("TrackAssociator") << "TP number " << tpindex << " pdgId=" << (*t)->pdgId() << " with number of PSimHits: " << nsimhit;
133  idcachev.clear();
134  nshared = getShared(matchedIds, idcachev, **t);
135 
136  //if electron subtract double counting
137  if (abs((*t)->pdgId())==11&&((*t)->g4Track_end()-(*t)->g4Track_begin())>1){
138  nshared-=getDoubleCount<trackingRecHit_iterator>((*track)->recHitsBegin(), (*track)->recHitsEnd(), associate.get(), **t);
139  }
140 
141  if (AbsoluteNumberOfHits) quality = static_cast<double>(nshared);
142  else if(ri!=0) quality = (static_cast<double>(nshared)/static_cast<double>(ri));
143  else quality = 0;
144  //cut on the fraction
145  //float purity = 1.0*nshared/ri;
146  if(quality > cut_RecoToSim && !(ThreeHitTracksAreSpecial && ri==3 && nshared<3)){
147  //if a track has just 3 hits we require that all 3 hits are shared
148  outputCollection.insert(tC[tindex],
149  std::make_pair(TPCollectionH[tpindex],
150  quality));
151 // LogTrace("TrackAssociator") << "reco::Track number " << tindex << " with #hits=" << ri <<" pt=" << (*track)->pt()
152 // << " associated to TP (pdgId, nb segments, p) = "
153 // << (*t).pdgId() << " " << (*t).g4Tracks().size()
154 // << " " << (*t).momentum() << " #hits=" << nsimhit
155 // << " TP index=" << tpindex<< " with quality =" << quality;
156  } else {
157 // LogTrace("TrackAssociator") <<"reco::Track number " << tindex << " with #hits=" << ri
158 // << " NOT associated with quality =" << quality;
159  }
160  }//TP loop
161  }
162  }
163  //LogTrace("TrackAssociator") << "% of Assoc Tracks=" << ((double)outputCollection.size())/((double)tC.size());
164  outputCollection.post_insert();
165  return outputCollection;
166 }
167 
168 
171  const edm::RefVector<TrackingParticleCollection>& TPCollectionH) const {
172 
173  //edm::ESHandle<TrackerTopology> tTopoHand;
174  //setup->get<IdealGeometryRecord>().get(tTopoHand);
175 
176 // edm::LogVerbatim("TrackAssociator") << "Starting TrackAssociatorByHitsImpl::associateSimToReco - #tracks="<<tC.size()<<" #TPs="<<TPCollectionH.size();
177  float quality=0;//fraction or absolute number of shared hits
178  int nshared = 0;
179  std::vector< SimHitIdpr> SimTrackIds;
180  std::vector< SimHitIdpr> matchedIds;
181  SimToRecoCollection outputCollection(productGetter_);
182 
183  //dereferene the edm::Refs only once
184  std::vector<TrackingParticle const*> tPC;
185  tPC.reserve(tPC.size());
186  for(auto const& ref: TPCollectionH) {
187  tPC.push_back(&(*ref));
188  }
189 
190  //for (TrackingParticleCollection::const_iterator t = tPC.begin(); t != tPC.end(); ++t) {
191  // LogTrace("TrackAssociator") << "NEW TP DUMP";
192  // for (TrackingParticle::g4t_iterator g4T = t -> g4Track_begin();g4T != t -> g4Track_end(); ++g4T) {
193  // LogTrace("TrackAssociator") << "(*g4T).trackId()=" <<(*g4T).trackId() ;
194  // }
195  //}
196 
197  //cdj edm::Handle<SimHitTPAssociationProducer::SimHitTPAssociationList> simHitsTPAssoc;
198  //warning: make sure the TP collection used in the map is the same used in the associator!
199  //e->getByLabel(_simHitTpMapTag,simHitsTPAssoc);
200 
201  //get the ID of the recotrack by hits
202  int tindex=0;
204  //LogTrace("TrackAssociator") << "\nNEW TRACK - hits of track number " << tindex <<" with pt =" << (*track)->pt() << " # valid=" << (*track)->found();
205  int ri=0;//valid rechits
206  getMatchedIds<trackingRecHit_iterator>(matchedIds, SimTrackIds, ri, (*track)->recHitsBegin(), (*track)->recHitsEnd(), associate.get());
207 
208  //save id for the track
209  std::vector<SimHitIdpr> idcachev;
210  if(!matchedIds.empty()){
211 
212  int tpindex =0;
213  for (auto t = tPC.begin(); t != tPC.end(); ++t, ++tpindex) {
214  idcachev.clear();
215  float totsimhit = 0;
216 
217  //int nsimhit = trackerPSimHit.size();
218  std::vector<PSimHit> tphits;
219  //LogTrace("TrackAssociator") << "TP number " << tpindex << " pdgId=" << (*t)->pdgId() << " with number of PSimHits: " << nsimhit;
220 
221  nshared = getShared(matchedIds, idcachev, **t);
222 
223  //for(std::vector<PSimHit>::const_iterator TPhit = (*t)->trackerPSimHit_begin(); TPhit != (*t)->trackerPSimHit_end(); TPhit++){
224  // unsigned int detid = TPhit->detUnitId();
225  // DetId detId = DetId(TPhit->detUnitId());
226  // LogTrace("TrackAssociator") << " hit trackId= " << TPhit->trackId() << " det ID = " << detid
227  // << " SUBDET = " << detId.subdetId() << " layer = " << LayerFromDetid(detId);
228  //}
229 
230  if (nshared!=0) {//do not waste time recounting when it is not needed!!!!
231 
232  //count the TP simhit
233  //LogTrace("TrackAssociator") << "recounting of tp hits";
234 
235  std::pair<TrackingParticleRef, TrackPSimHitRef>
236  clusterTPpairWithDummyTP(TPCollectionH[tpindex],TrackPSimHitRef());//SimHit is dummy: for simHitTPAssociationListGreater
237  // sorting only the cluster is needed
238  auto range = std::equal_range(simHitsTPAssoc->begin(), simHitsTPAssoc->end(),
240  for(auto ip = range.first; ip != range.second; ++ip) {
241  TrackPSimHitRef TPhit = ip->second;
242  DetId dId = DetId(TPhit->detUnitId());
243 
244  unsigned int subdetId = static_cast<unsigned int>(dId.subdetId());
246  continue;
247 
248  //unsigned int dRawId = dId.rawId();
249  SiStripDetId* stripDetId = nullptr;
250  if (subdetId==SiStripDetId::TIB||subdetId==SiStripDetId::TOB||
251  subdetId==SiStripDetId::TID||subdetId==SiStripDetId::TEC)
252  stripDetId= new SiStripDetId(dId);
253  //LogTrace("TrackAssociator") << "consider hit SUBDET = " << subdetId
254  // << " layer = " << LayerFromDetid(dId)
255  // << " id = " << dId.rawId();
256  bool newhit = true;
257  for(std::vector<PSimHit>::const_iterator TPhitOK = tphits.begin(); TPhitOK != tphits.end(); TPhitOK++){
258  DetId dIdOK = DetId(TPhitOK->detUnitId());
259  //unsigned int dRawIdOK = dIdOK.rawId();
260  //LogTrace("TrackAssociator") << "\t\tcompare with SUBDET = " << dIdOK.subdetId()
261  // << " layer = " << LayerFromDetid(dIdOK)
262  // << " id = " << dIdOK.rawId();
263  //no grouped, no splitting
264  if (!UseGrouped && !UseSplitting)
265  if (tTopo->layer(dId)==tTopo->layer(dIdOK) &&
266  dId.subdetId()==dIdOK.subdetId()) newhit = false;
267  //no grouped, splitting
268  if (!UseGrouped && UseSplitting)
269  if (tTopo->layer(dId)==tTopo->layer(dIdOK) &&
270  dId.subdetId()==dIdOK.subdetId() &&
271  (stripDetId==nullptr || stripDetId->partnerDetId()!=dIdOK.rawId()))
272  newhit = false;
273  //grouped, no splitting
274  if (UseGrouped && !UseSplitting)
275  if (tTopo->layer(dId)==tTopo->layer(dIdOK) &&
276  dId.subdetId()==dIdOK.subdetId() &&
277  stripDetId!=nullptr && stripDetId->partnerDetId()==dIdOK.rawId())
278  newhit = false;
279  //grouped, splitting
280  if (UseGrouped && UseSplitting)
281  newhit = true;
282  }
283  if (newhit) {
284  //LogTrace("TrackAssociator") << "\t\tok";
285  tphits.push_back(*TPhit);
286  }
287  //else LogTrace("TrackAssociator") << "\t\tno";
288  delete stripDetId;
289  }
290  totsimhit = tphits.size();
291  }
292 
293  if (AbsoluteNumberOfHits) quality = static_cast<double>(nshared);
294  else if(SimToRecoDenominator == denomsim && totsimhit!=0) quality = ((double) nshared)/((double)totsimhit);
295  else if(SimToRecoDenominator == denomreco && ri!=0) quality = ((double) nshared)/((double)ri);
296  else quality = 0;
297  //LogTrace("TrackAssociator") << "Final count: nhit(TP) = " << nsimhit << " re-counted = " << totsimhit
298  //<< " nshared = " << nshared << " nrechit = " << ri;
299 
300  float purity = 1.0*nshared/ri;
301  if (quality>quality_SimToReco && !(ThreeHitTracksAreSpecial && totsimhit==3 && nshared<3) && (AbsoluteNumberOfHits||(purity>purity_SimToReco))) {
302  //if a track has just 3 hits we require that all 3 hits are shared
303  outputCollection.insert(TPCollectionH[tpindex],
304  std::make_pair(tC[tindex],quality));
305 // LogTrace("TrackAssociator") << "TrackingParticle number " << tpindex << " with #hits=" << nsimhit
306 // << " re-counted = " << totsimhit << " nshared = " << nshared
307 // << " associated to track number " << tindex << " with pt=" << (*track)->pt()
308 // << " with hit quality =" << quality ;
309  } else {
310 // LogTrace("TrackAssociator") << "TrackingParticle number " << tpindex << " with #hits=" << nsimhit
311 // << " re-counted = " << totsimhit << " nshared = " << nshared
312 // << " NOT associated with quality =" << quality;
313  }
314  }
315  }
316  }
317  //LogTrace("TrackAssociator") << "% of Assoc TPs=" << ((double)outputCollection.size())/((double)TPCollectionH.size());
318  outputCollection.post_insert();
319  return outputCollection;
320 }
321 
322 
325  const edm::Handle<TrackingParticleCollection>& TPCollectionH) const {
326  edm::LogVerbatim("TrackAssociator") << "Starting TrackAssociatorByHitsImpl::associateRecoToSim - #seeds="
327  <<seedCollectionH->size()<<" #TPs="<<TPCollectionH->size();
328  int nshared = 0;
329  float quality=0;//fraction or absolute number of shared hits
330  std::vector< SimHitIdpr> SimTrackIds;
331  std::vector< SimHitIdpr> matchedIds;
332  RecoToSimCollectionSeed outputCollection(productGetter_);
333 
334  const TrackingParticleCollection& tPC = *(TPCollectionH.product());
335 
336  const edm::View<TrajectorySeed> sC = *(seedCollectionH.product());
337 
338  //get the ID of the recotrack by hits
339  int tindex=0;
340  for (edm::View<TrajectorySeed>::const_iterator seed=sC.begin(); seed!=sC.end(); seed++, tindex++) {
341  matchedIds.clear();
342  int ri=0;//valid rechits
343  int nsimhit = seed->recHits().second-seed->recHits().first;
344  LogTrace("TrackAssociator") << "\nNEW SEED - seed number " << tindex << " # valid=" << nsimhit;
345  getMatchedIds<edm::OwnVector<TrackingRecHit>::const_iterator>(matchedIds, SimTrackIds, ri, seed->recHits().first, seed->recHits().second, associate.get() );
346 
347  //save id for the track
348  std::vector<SimHitIdpr> idcachev;
349  if(!matchedIds.empty()){
350 
351  int tpindex =0;
352  for (TrackingParticleCollection::const_iterator t = tPC.begin(); t != tPC.end(); ++t, ++tpindex) {
353  LogTrace("TrackAssociator") << "TP number " << tpindex << " pdgId=" << t->pdgId() << " with number of PSimHits: " << nsimhit;
354  idcachev.clear();
355  nshared = getShared(matchedIds, idcachev, *t);
356 
357  //if electron subtract double counting
358  if (abs(t->pdgId())==11&&(t->g4Track_end()-t->g4Track_begin())>1){
359  nshared-=getDoubleCount<edm::OwnVector<TrackingRecHit>::const_iterator>(seed->recHits().first, seed->recHits().second, associate.get(), *t);
360  }
361 
362  if (AbsoluteNumberOfHits) quality = static_cast<double>(nshared);
363  else if(ri!=0) quality = (static_cast<double>(nshared)/static_cast<double>(ri));
364  else quality = 0;
365  //cut on the fraction
366  if(quality > cut_RecoToSim && !(ThreeHitTracksAreSpecial && ri==3 && nshared<3) ){
367  //if a track has just 3 hits we require that all 3 hits are shared
368  outputCollection.insert(edm::RefToBase<TrajectorySeed>(seedCollectionH,tindex),
369  std::make_pair(edm::Ref<TrackingParticleCollection>(TPCollectionH, tpindex),quality));
370  LogTrace("TrackAssociator") << "Seed number " << tindex << " with #hits=" << ri
371  << "associated to TP (pdgId, nb segments, p) = "
372  << (*t).pdgId() << " " << (*t).g4Tracks().size()
373  << " " << (*t).momentum() <<" number " << tpindex << " with quality =" << quality;
374  } else {
375  LogTrace("TrackAssociator") <<"Seed number " << tindex << " with #hits=" << ri << " NOT associated with quality =" << quality;
376  }
377  }//TP loop
378  }
379  }
380  LogTrace("TrackAssociator") << "% of Assoc Seeds=" << ((double)outputCollection.size())/((double)seedCollectionH->size());
381 
382  outputCollection.post_insert();
383  return outputCollection;
384 }
385 
386 
389  const edm::Handle<TrackingParticleCollection>& TPCollectionH) const {
390 
391  edm::LogVerbatim("TrackAssociator") << "Starting TrackAssociatorByHitsImpl::associateSimToReco - #seeds="
392  <<seedCollectionH->size()<<" #TPs="<<TPCollectionH->size();
393  float quality=0;//fraction or absolute number of shared hits
394  int nshared = 0;
395  std::vector< SimHitIdpr> SimTrackIds;
396  std::vector< SimHitIdpr> matchedIds;
397  SimToRecoCollectionSeed outputCollection(productGetter_);
398 
399  const TrackingParticleCollection& tPC =*TPCollectionH.product();
400 
401  const edm::View<TrajectorySeed> sC = *(seedCollectionH.product());
402 
403  //get the ID of the recotrack by hits
404  int tindex=0;
405  for (edm::View<TrajectorySeed>::const_iterator seed=sC.begin(); seed!=sC.end(); seed++, tindex++) {
406  int ri=0;//valid rechits
407  LogTrace("TrackAssociator") << "\nNEW SEED - seed number " << tindex << " # valid=" << seed->recHits().second-seed->recHits().first;
408  getMatchedIds<edm::OwnVector<TrackingRecHit>::const_iterator>(matchedIds, SimTrackIds, ri, seed->recHits().first, seed->recHits().second, associate.get() );
409 
410  //save id for the track
411  std::vector<SimHitIdpr> idcachev;
412  if(!matchedIds.empty()){
413  int tpindex =0;
414  for (TrackingParticleCollection::const_iterator t = tPC.begin(); t != tPC.end(); ++t, ++tpindex) {
415  idcachev.clear();
416  int nsimhit = t->numberOfTrackerHits();
417  LogTrace("TrackAssociator") << "TP number " << tpindex << " pdgId=" << t->pdgId() << " with number of PSimHits: " << nsimhit;
418  nshared = getShared(matchedIds, idcachev, *t);
419 
420  if (AbsoluteNumberOfHits) quality = static_cast<double>(nshared);
421  else if(ri!=0) quality = ((double) nshared)/((double)ri);
422  else quality = 0;
423  //LogTrace("TrackAssociator") << "Final count: nhit(TP) = " << nsimhit
424  //<< " nshared = " << nshared
425  //<< " nrechit = " << ri;
426  if(quality > quality_SimToReco && !(ThreeHitTracksAreSpecial && ri==3 && nshared<3) ){
427  outputCollection.insert(edm::Ref<TrackingParticleCollection>(TPCollectionH, tpindex),
428  std::make_pair(edm::RefToBase<TrajectorySeed>(seedCollectionH,tindex), quality));
429  LogTrace("TrackAssociator") << "TrackingParticle number " << tpindex << " with #hits=" << nsimhit
430  << " associated to seed number " << tindex << " with #hits=" << ri
431  << " with hit quality =" << quality ;
432  }
433  else {
434  LogTrace("TrackAssociator") << "TrackingParticle number " << tpindex << " with #hits=" << nsimhit << " NOT associated with quality =" << quality;
435  }
436  }
437  }
438  }
439  LogTrace("TrackAssociator") << "% of Assoc TPs=" << ((double)outputCollection.size())/((double)TPCollectionH->size());
440  outputCollection.post_insert();
441  return outputCollection;
442 }
443 
444 template<typename iter>
445 void TrackAssociatorByHitsImpl::getMatchedIds(std::vector<SimHitIdpr>& matchedIds,
446  std::vector<SimHitIdpr>& SimTrackIds,
447  int& ri,
448  iter begin,
449  iter end,
451  matchedIds.clear();
452  ri=0;//valid rechits
453  for (iter it = begin; it != end; it++){
454  const TrackingRecHit *hit=getHitPtr(it);
455  if (hit->isValid()){
456  ri++;
457  uint32_t t_detID= hit->geographicalId().rawId();
458  SimTrackIds.clear();
459  associate->associateHitId(*hit, SimTrackIds);
460  //save all the id of matched simtracks
461  if(!SimTrackIds.empty()){
462  for(size_t j=0; j<SimTrackIds.size(); j++){
463  LogTrace("TrackAssociator") << " hit # " << ri << " valid=" << hit->isValid()
464  << " det id = " << t_detID << " SimId " << SimTrackIds[j].first
465  << " evt=" << SimTrackIds[j].second.event()
466  << " bc=" << SimTrackIds[j].second.bunchCrossing();
467  matchedIds.push_back(SimTrackIds[j]);
468  }
469  }
471  //****to be used when the crossing frame is in the event and with flag TrackAssociatorByHitsImplESProducer.associateRecoTracks = false
472  //std::vector<PSimHit> tmpSimHits = associate->associateHit(*getHitPtr(it));
474  //for(size_t j=0; j<tmpSimHits.size(); j++) {
475  // LogTrace("TrackAssociator") << " hit # " << ri << " valid=" << getHitPtr(it)->isValid()
476  // << " det id = " << t_detID << " SimId " << SimTrackIds[j].first
477  // << " evt=" << SimTrackIds[j].second.event()
478  // << " bc=" << SimTrackIds[j].second.bunchCrossing()
479  // << " process=" << tmpSimHits[j].processType()
480  // << " eloss=" << tmpSimHits[j].energyLoss()
481  // << " part type=" << tmpSimHits[j].particleType()
482  // << " pabs=" << tmpSimHits[j].pabs()
483  // << " trId=" << tmpSimHits[j].trackId();
484  //}
486  }else{
487  LogTrace("TrackAssociator") <<"\t\t Invalid Hit On "<<hit->geographicalId().rawId();
488  }
489  }//trackingRecHit loop
490 }
491 
492 
493 int TrackAssociatorByHitsImpl::getShared(std::vector<SimHitIdpr>& matchedIds,
494  std::vector<SimHitIdpr>& idcachev,
495  TrackingParticle const& t) const {
496  int nshared = 0;
497  if (t.numberOfHits()==0) return nshared;//should use trackerPSimHit but is not const
498 
499  for(size_t j=0; j<matchedIds.size(); j++){
500  //LogTrace("TrackAssociator") << "now matchedId=" << matchedIds[j].first;
501  if(find(idcachev.begin(), idcachev.end(),matchedIds[j]) == idcachev.end() ){
502  //only the first time we see this ID
503  idcachev.push_back(matchedIds[j]);
504 
505  for (TrackingParticle::g4t_iterator g4T = t . g4Track_begin(); g4T != t . g4Track_end(); ++g4T) {
506 // LogTrace("TrackAssociator") << " TP (ID, Ev, BC) = " << (*g4T).trackId()
507 // << ", " << t.eventId().event() << ", "<< t.eventId().bunchCrossing()
508 // << " Match(ID, Ev, BC) = " << matchedIds[j].first
509 // << ", " << matchedIds[j].second.event() << ", "
510 // << matchedIds[j].second.bunchCrossing() ;
511  //<< "\t G4 Track Momentum " << (*g4T).momentum()
512  //<< " \t reco Track Momentum " << track->momentum();
513  if((*g4T).trackId() == matchedIds[j].first && t.eventId() == matchedIds[j].second){
514  int countedhits = std::count(matchedIds.begin(), matchedIds.end(), matchedIds[j]);
515  nshared += countedhits;
516 
517 // LogTrace("TrackAssociator") << "hits shared by this segment : " << countedhits;
518 // LogTrace("TrackAssociator") << "hits shared so far : " << nshared;
519  }
520  }//g4Tracks loop
521  }
522  }
523  return nshared;
524 }
525 
526 
527 template<typename iter>
529  iter end,
531  TrackingParticle const& t) const {
532  int doublecount = 0 ;
533  std::vector<SimHitIdpr> SimTrackIdsDC;
534  // cout<<begin-end<<endl;
535  for (iter it = begin; it != end; it++){
536  int idcount = 0;
537  SimTrackIdsDC.clear();
538  associate->associateHitId(*getHitPtr(it), SimTrackIdsDC);
539  // cout<<SimTrackIdsDC.size()<<endl;
540  if(SimTrackIdsDC.size()>1){
541  // cout<<(t.g4Track_end()-t.g4Track_begin())<<endl;
542  for (TrackingParticle::g4t_iterator g4T = t . g4Track_begin(); g4T != t . g4Track_end(); ++g4T) {
543  if(find(SimTrackIdsDC.begin(), SimTrackIdsDC.end(),SimHitIdpr((*g4T).trackId(), SimTrackIdsDC.begin()->second)) != SimTrackIdsDC.end() ){
544  idcount++;
545  }
546  }
547  }
548  if (idcount>1) doublecount+=(idcount-1);
549  }
550  return doublecount;
551 }
std::vector< TrackingParticle > TrackingParticleCollection
static bool simHitTPAssociationListGreater(SimHitTPPair i, SimHitTPPair j)
reco::SimToRecoCollection associateSimToReco(const edm::RefToBaseVector< reco::Track > &, const edm::RefVector< TrackingParticleCollection > &) const override
Association Sim To Reco with Collections.
const_iterator end() const
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:47
edm::EDProductGetter const * productGetter_
std::unique_ptr< TrackerHitAssociator > associate
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
EDProductGetter const * productGetter(std::atomic< void const * > const &iCache)
SimHitTPAssociationList const * simHitsTPAssoc
int getShared(std::vector< SimHitIdpr > &, std::vector< SimHitIdpr > &, TrackingParticle const &) const
void getMatchedIds(std::vector< SimHitIdpr > &, std::vector< SimHitIdpr > &, int &, iter, iter, TrackerHitAssociator *) const
const_iterator begin() const
int getDoubleCount(iter, iter, TrackerHitAssociator *, TrackingParticle const &) const
void post_insert()
post insert action
uint32_t partnerDetId() const
Definition: SiStripDetId.h:164
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:41
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
#define end
Definition: vmac.h:39
#define LogTrace(id)
std::vector< SimHitTPPair > SimHitTPAssociationList
std::vector< SimTrack >::const_iterator g4t_iterator
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:17
Definition: DetId.h:18
const TrackingRecHit * getHitPtr(edm::OwnVector< TrackingRecHit >::const_iterator iter) const
std::pair< uint32_t, EncodedEventId > SimHitIdpr
size_type size() const
map size
T const * product() const
Definition: Handle.h:81
void insert(const key_type &k, const data_type &v)
insert an association
bool isValid() const
int numberOfHits() const
Gives the total number of hits, including muon hits. Hits on overlaps in the same layer count separat...
const_iterator begin() const
unsigned int layer(const DetId &id) const
EncodedEventId eventId() const
Signal source, crossing number.
std::vector< SimHitIdpr > associateHitId(const TrackingRecHit &thit) const
fixed size matrix
#define begin
Definition: vmac.h:32
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
TrackAssociatorByHitsImpl(edm::EDProductGetter const &productGetter, std::unique_ptr< TrackerHitAssociator > iAssociate, TrackerTopology const *iTopo, SimHitTPAssociationList const *iSimHitsTPAssoc, SimToRecoDenomType iSimToRecoDenominator, double iQuality_SimToReco, double iPurity_SimToReco, double iCut_RecoToSim, bool iUsePixels, bool iUseGrouped, bool iUseSplitting, bool ThreeHitTracksAreSpecial, bool AbsoluteNumberOfHits)
edm::Ref< edm::PSimHitContainer > TrackPSimHitRef
reco::RecoToSimCollection associateRecoToSim(const edm::RefToBaseVector< reco::Track > &, const edm::RefVector< TrackingParticleCollection > &) const override
Association Reco To Sim with Collections.
Monte Carlo truth information used for tracking validation.
const_iterator end() const
DetId geographicalId() const
def move(src, dest)
Definition: eostools.py:510