CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HitExtractorSTRP.cc
Go to the documentation of this file.
1 #include "HitExtractorSTRP.h"
4 
7 
12 
14 
19 
22 
23 using namespace ctfseeding;
24 using namespace std;
25 using namespace edm;
26 
28  SeedingLayer::Side & side, int idLayer)
29  : theLayer(detLayer), theSide(side), theIdLayer(idLayer),
30  hasMatchedHits(false), hasRPhiHits(false), hasStereoHits(false),
31  hasRingSelector(false), theMinRing(1), theMaxRing(0), hasSimpleRphiHitsCleaner(true), minAbsZ(0)
32 { }
33 
34 void HitExtractorSTRP::useRingSelector(int minRing, int maxRing)
35 {
36  hasRingSelector=true;
37  theMinRing=minRing;
38  theMaxRing=maxRing;
39 }
40 
42 {
43  if (!hasRingSelector) return true;
44  else if ( ring >= theMinRing && ring <= theMaxRing) return true;
45  else return false;
46 }
47 
50  // if (!hit->isValid()) return false;
51 
52  return stripClusterMask->mask(clus.key());
53 }
54 
55 
57  const SiStripRecHit2D * hit,
59 
60  if (failProjection) {replaceMe=0; return;}
63  replaceMe=proj.project( *sHit, *ptr->det());
64  if (!replaceMe) LogDebug("HitExtractorSTRP")<<"projection failed.";
65 }
66 
70  const SiStripMatchedRecHit2D * hit = (SiStripMatchedRecHit2D *) ptr->hit();
71 
72  bool rejectSt = skipThis(hit->stereoClusterRef(), stripClusterMask);
73  bool rejectMono = skipThis(hit->monoClusterRef(), stripClusterMask);
74 
75  if (rejectSt&&rejectMono){
76  //only skip if both hits are done
77  return true;
78  }
79  else{
80  //FIX use clusters directly
81  auto const & s= hit->stereoHit();
82  auto const & m= hit->monoHit();
83  if (rejectSt) project(ptr,&s,replaceMe);
84  else if (rejectMono) project(ptr,&m,replaceMe);
85  if (!replaceMe) return true; //means that the projection failed, and needs to be skipped
86  if (rejectSt)
87  LogDebug("HitExtractorSTRP")<<"a matched hit is partially masked, and the mono hit got projected onto: "<<replaceMe->hit()->geographicalId().rawId()<<" key: "<<hit->monoClusterRef().key();
88  else if (rejectMono)
89  LogDebug("HitExtractorSTRP")<<"a matched hit is partially masked, and the stereo hit got projected onto: "<<replaceMe->hit()->geographicalId().rawId()<<" key: "<<hit->stereoClusterRef().key();
90  return false; //means the projection succeeded or nothing to be masked, no need to skip and replaceMe is going to be used anyways.
91  }
92  return false;
93 }
94 
95 
97  bool matched,
98  unsigned int cleanFrom)const{
99  LogDebug("HitExtractorPIX")<<"getting: "<<hits.size()<<" in input.";
101  ev.getByLabel(theSkipClusters,stripClusterMask);
102  HitExtractor::Hits newHits;
103  unsigned int skipped=0;
104  unsigned int projected=0;
105  newHits.reserve(hits.size());
107  for (unsigned int iH=0;iH<hits.size();++iH){
108  if (!hits[iH]->isValid()) continue;
109  replaceMe=hits[iH];
110  if (iH<cleanFrom) {
111  newHits.push_back(replaceMe);
112  continue;
113  }
114  if (matched && skipThis(hits[iH],stripClusterMask,replaceMe)){
115  LogDebug("HitExtractorSTRP")<<"skipping a matched hit on :"<<hits[iH]->hit()->geographicalId().rawId();
116  skipped++;
117  continue;
118  }
119  if (!matched && skipThis( ((TrackerSingleRecHit const *)(hits[iH]->hit()))->omniClusterRef(),stripClusterMask)){
120  LogDebug("HitExtractorSTRP")<<"skipping a hit on :"<<hits[iH]->hit()->geographicalId().rawId()<<" key: ";
121  skipped++;
122  continue;
123  }
124  if (replaceMe!=hits[iH]) projected++;
125  newHits.push_back(replaceMe);
126  }
127  LogDebug("HitExtractorPIX")<<"skipped :"<<skipped<<" strip rechits because of clusters and projected: "<<projected;
128  hits.swap(newHits);
129 }
130 
132 {
134  TrackerLayerIdAccessor accessor;
135  theSLayer=&sl;
136  unsigned int cleanFrom=0;
137  //
138  // TIB
139  //
141  if (hasMatchedHits) {
143  ev.getByLabel( theMatchedHits, matchedHits);
144  if (skipClusters) cleanFrom=result.size();
145  range2SeedingHits( *matchedHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
146  if (skipClusters) cleanedOfClusters(ev,result,true,cleanFrom);
147  }
148  if (hasRPhiHits) {
150  ev.getByLabel( theRPhiHits, rphiHits);
151  if (hasMatchedHits){
152  if (!hasSimpleRphiHitsCleaner){ // this is a brutal "cleaning". Add something smarter in the future
153  if (skipClusters) cleanFrom=result.size();
154  range2SeedingHits( *rphiHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
155  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
156  }
157  } else {
158  if (skipClusters) cleanFrom=result.size();
159  range2SeedingHits( *rphiHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
160  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
161  }
162  }
163  if (hasStereoHits) {
165  ev.getByLabel( theStereoHits, stereoHits);
166  if (skipClusters) cleanFrom=result.size();
167  range2SeedingHits( *stereoHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
168  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
169  }
170  }
171 
172  //
173  // TID
174  //
176  if (hasMatchedHits) {
178  ev.getByLabel( theMatchedHits, matchedHits);
179  if (skipClusters) cleanFrom=result.size();
180  std::pair<DetId,DetIdTIDSameDiskComparator> getter = accessor.stripTIDDisk(theSide,theIdLayer);
181  SiStripMatchedRecHit2DCollection::Range range = matchedHits->equal_range(getter.first, getter.second);
182  for (SiStripMatchedRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
183  int ring = TIDDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
184  for (SiStripMatchedRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
185  result.push_back( sl.hitBuilder()->build(hit) );
186  }
187  }
188  if (skipClusters) cleanedOfClusters(ev,result,true,cleanFrom);
189  }
190  if (hasRPhiHits) {
192  ev.getByLabel( theRPhiHits, rphiHits);
193  if (skipClusters) cleanFrom=result.size();
194  std::pair<DetId,DetIdTIDSameDiskComparator> getter = accessor.stripTIDDisk(theSide,theIdLayer);
195  SiStripRecHit2DCollection::Range range = rphiHits->equal_range(getter.first, getter.second);
196  for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
197  int ring = TIDDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
198  if ((SiStripDetId(it->detId()).partnerDetId() != 0) && hasSimpleRphiHitsCleaner) continue; // this is a brutal "cleaning". Add something smarter in the future
199  for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
200  result.push_back( sl.hitBuilder()->build(hit) );
201  }
202  }
203  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
204  }
205  if (hasStereoHits) {
207  ev.getByLabel( theStereoHits, stereoHits);
208  if (skipClusters) cleanFrom=result.size();
209  std::pair<DetId,DetIdTIDSameDiskComparator> getter = accessor.stripTIDDisk(theSide,theIdLayer);
210  SiStripRecHit2DCollection::Range range = stereoHits->equal_range(getter.first, getter.second);
211  for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
212  int ring = TIDDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
213  for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
214  result.push_back( sl.hitBuilder()->build(hit) );
215  }
216  }
217  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
218  }
219  }
220  //
221  // TOB
222  //
224  if (hasMatchedHits) {
226  ev.getByLabel( theMatchedHits, matchedHits);
227  if (skipClusters) cleanFrom=result.size();
228  if (minAbsZ>0.) {
229  std::pair<DetId,DetIdTOBSameLayerComparator> getter = accessor.stripTOBLayer(theIdLayer);
230  SiStripMatchedRecHit2DCollection::Range range = matchedHits->equal_range(getter.first, getter.second);
231  for (SiStripMatchedRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
232  for (SiStripMatchedRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
234  if (fabs(ttrh->globalPosition().z())>=minAbsZ) result.push_back( ttrh );
235  }
236  }
237  } else {
238  range2SeedingHits( *matchedHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
239  }
240  if (skipClusters) cleanedOfClusters(ev,result,true,cleanFrom);
241  }
242  if (hasRPhiHits) {
244  ev.getByLabel( theRPhiHits, rphiHits);
245  if (hasMatchedHits){
246  if (!hasSimpleRphiHitsCleaner){ // this is a brutal "cleaning". Add something smarter in the future
247  if (skipClusters) cleanFrom=result.size();
248  range2SeedingHits( *rphiHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
249  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
250  }
251  } else {
252  if (skipClusters) cleanFrom=result.size();
253  range2SeedingHits( *rphiHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
254  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
255  }
256  }
257  if (hasStereoHits) {
259  ev.getByLabel( theStereoHits, stereoHits);
260  if (skipClusters) cleanFrom=result.size();
261  range2SeedingHits( *stereoHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
262  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
263  }
264  }
265 
266  //
267  // TEC
268  //
270  if (hasMatchedHits) {
272  ev.getByLabel( theMatchedHits, matchedHits);
273  if (skipClusters) cleanFrom=result.size();
274  std::pair<DetId,DetIdTECSameDiskComparator> getter = accessor.stripTECDisk(theSide,theIdLayer);
275  SiStripMatchedRecHit2DCollection::Range range = matchedHits->equal_range(getter.first, getter.second);
276  for (SiStripMatchedRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
277  int ring = TECDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
278  for (SiStripMatchedRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
279  result.push_back( sl.hitBuilder()->build(hit) );
280  }
281  }
282  if (skipClusters) cleanedOfClusters(ev,result,true,cleanFrom);
283  }
284  if (hasRPhiHits) {
286  ev.getByLabel( theRPhiHits, rphiHits);
287  if (skipClusters) cleanFrom=result.size();
288  std::pair<DetId,DetIdTECSameDiskComparator> getter = accessor.stripTECDisk(theSide,theIdLayer);
289  SiStripRecHit2DCollection::Range range = rphiHits->equal_range(getter.first, getter.second);
290  for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
291  int ring = TECDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
292  if ((SiStripDetId(it->detId()).partnerDetId() != 0) && hasSimpleRphiHitsCleaner) continue; // this is a brutal "cleaning". Add something smarter in the future
293  for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
294  result.push_back( sl.hitBuilder()->build(hit) );
295  }
296  }
297  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
298 
299  }
300  if (hasStereoHits) {
302  ev.getByLabel( theStereoHits, stereoHits);
303  if (skipClusters) cleanFrom=result.size();
304  std::pair<DetId,DetIdTECSameDiskComparator> getter = accessor.stripTECDisk(theSide,theIdLayer);
305  SiStripRecHit2DCollection::Range range = stereoHits->equal_range(getter.first, getter.second);
306  for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
307  int ring = TECDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
308  for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
309  result.push_back( sl.hitBuilder()->build(hit) );
310  }
311  }
312  if (skipClusters) cleanedOfClusters(ev,result,false,cleanFrom);
313  }
314  }
315  LogDebug("HitExtractorSTRP")<<" giving: "<<result.size()<<" out";
316  return result;
317 }
318 
319 
#define LogDebug(id)
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
HitExtractorSTRP(const DetLayer *detLayer, SeedingLayer::Side &side, int idLayer)
std::pair< DetId, DetIdTIDSameDiskComparator > stripTIDDisk(int side, int disk)
bool ringRange(int ring) const
std::pair< DetId, DetIdTIBSameLayerComparator > stripTIBLayer(int layer)
virtual SubDetector subDetector() const =0
The type of detector (PixelBarrel, PixelEndcap, TIB, TOB, TID, TEC, CSC, DT, RPCBarrel, RPCEndcap)
std::pair< const_iterator, const_iterator > Range
void range2SeedingHits(DSTV const &dstv, HitExtractor::Hits &v, std::pair< A, B > const &sel, const SeedingLayer &sl, const edm::EventSetup &es)
Definition: HitExtractor.h:45
RecHitPointer project(const TransientTrackingRecHit &hit, const GeomDet &det, const TrajectoryStateOnSurface &ts) const
std::pair< DetId, DetIdTOBSameLayerComparator > stripTOBLayer(int layer)
virtual HitExtractor::Hits hits(const SeedingLayer &sl, const edm::Event &, const edm::EventSetup &) const
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
tuple result
Definition: query.py:137
std::pair< DetId, DetIdTECSameDiskComparator > stripTECDisk(int side, int disk)
#define end
Definition: vmac.h:37
const SeedingLayer * theSLayer
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:390
void useRingSelector(int minRing, int maxRing)
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:17
const TransientTrackingRecHitBuilder * hitBuilder() const
Definition: SeedingLayer.cc:94
void cleanedOfClusters(const edm::Event &ev, HitExtractor::Hits &hits, bool matched, unsigned int cleanFrom=0) const
void project(TransientTrackingRecHit::ConstRecHitPointer &ptr, const SiStripRecHit2D *hit, TransientTrackingRecHit::ConstRecHitPointer &replaceMe) const
bool skipThis(TransientTrackingRecHit::ConstRecHitPointer &ptr, edm::Handle< edm::ContainerMask< edmNew::DetSetVector< SiStripCluster > > > &stripClusterMask, TransientTrackingRecHit::ConstRecHitPointer &replaceMe) const
edm::InputTag theSkipClusters
Definition: HitExtractor.h:28
volatile std::atomic< bool > shutdown_flag false
unsigned int key() const
std::vector< TransientTrackingRecHit::ConstRecHitPointer > Hits
Definition: HitExtractor.h:16