CMS 3D CMS Logo

SiPixelHitEfficiencySource.cc
Go to the documentation of this file.
1 // Package: SiPixelMonitorTrack
2 // Class: SiPixelHitEfficiencySource
3 //
4 // class SiPixelHitEfficiencyModule SiPixelHitEfficiencyModule.cc
5 // DQM/SiPixelMonitorTrack/src/SiPixelHitEfficiencyModule.cc
6 //
7 // Description: SiPixel hit efficiency data quality monitoring modules
8 // Implementation: prototype -> improved -> never final - end of the 1st step
9 //
10 // Original Authors: Romain Rougny & Luca Mucibello
11 // Created: Mar Nov 10 13:29:00 CET 2009
12 
13 
14 #include <iostream>
15 #include <map>
16 #include <cmath>
17 #include <string>
18 #include <vector>
19 #include <utility>
20 
23 
26 
35 
39 
41 
44 //#include "RecoLocalTracker/SiPixelRecHits/plugins/PixelCPEGenericESProducer.h"
45 
56 
60 
68 
69 using namespace std;
70 using namespace edm;
71 
72 
74  pSet_(pSet),
75  modOn( pSet.getUntrackedParameter<bool>("modOn",true) ),
76  ladOn( pSet.getUntrackedParameter<bool>("ladOn",false) ),
77  layOn( pSet.getUntrackedParameter<bool>("layOn",false) ),
78  phiOn( pSet.getUntrackedParameter<bool>("phiOn",false) ),
79  ringOn( pSet.getUntrackedParameter<bool>("ringOn",false) ),
80  bladeOn( pSet.getUntrackedParameter<bool>("bladeOn",false) ),
81  diskOn( pSet.getUntrackedParameter<bool>("diskOn",false) ),
82  isUpgrade( pSet.getUntrackedParameter<bool>("isUpgrade",false) )
83  //updateEfficiencies( pSet.getUntrackedParameter<bool>("updateEfficiencies",false) )
84 {
85  pSet_ = pSet;
86  debug_ = pSet_.getUntrackedParameter<bool>("debug", false);
87  applyEdgeCut_ = pSet_.getUntrackedParameter<bool>("applyEdgeCut");
88  nSigma_EdgeCut_ = pSet_.getUntrackedParameter<double>("nSigma_EdgeCut");
89  vtxsrc_= pSet_.getUntrackedParameter<std::string>("vtxsrc","offlinePrimaryVertices");
90  vertexCollectionToken_ = consumes<reco::VertexCollection>(vtxsrc_);
91  tracksrc_ = consumes<TrajTrackAssociationCollection>(pSet_.getParameter<edm::InputTag>("trajectoryInput"));
92  clusterCollectionToken_ = consumes<edmNew::DetSetVector<SiPixelCluster> >(std::string("siPixelClusters"));
93 
94  measurementTrackerEventToken_ = consumes<MeasurementTrackerEvent>(std::string("MeasurementTrackerEvent"));
95 
96  firstRun = true;
97 
98  LogInfo("PixelDQM") << "SiPixelHitEfficiencySource constructor" << endl;
99  LogInfo ("PixelDQM") << "Mod/Lad/Lay/Phi " << modOn << "/" << ladOn << "/"
100  << layOn << "/" << phiOn << std::endl;
101  LogInfo ("PixelDQM") << "Blade/Disk/Ring" << bladeOn << "/" << diskOn << "/"
102  << ringOn << std::endl;
103 }
104 
105 
107  LogInfo("PixelDQM") << "SiPixelHitEfficiencySource destructor" << endl;
108 
109  std::map<uint32_t,SiPixelHitEfficiencyModule*>::iterator struct_iter;
110  for (struct_iter = theSiPixelStructure.begin() ; struct_iter != theSiPixelStructure.end() ; struct_iter++){
111  delete struct_iter->second;
112  struct_iter->second = nullptr;
113  }
114 }
115 
116 void SiPixelHitEfficiencySource::fillClusterProbability(int layer, int disk, bool plus, double probability){
117 
118  //barrel
119  if (layer!=0){
120  if (layer==1){
121  if (plus) meClusterProbabilityL1_Plus_->Fill(probability);
122  else meClusterProbabilityL1_Minus_->Fill(probability);
123  }
124 
125  else if (layer==2){
126  if (plus) meClusterProbabilityL2_Plus_->Fill(probability);
127  else meClusterProbabilityL2_Minus_->Fill(probability);
128  }
129 
130  else if (layer==3){
131  if (plus) meClusterProbabilityL3_Plus_->Fill(probability);
132  else meClusterProbabilityL3_Minus_->Fill(probability);
133  }
134  }
135  //Endcap
136  if (disk!=0){
137  if (disk==1){
138  if (plus) meClusterProbabilityD1_Plus_->Fill(probability);
139  else meClusterProbabilityD1_Minus_->Fill(probability);
140  }
141  if (disk==2){
142  if (plus) meClusterProbabilityD2_Plus_->Fill(probability);
143  else meClusterProbabilityD2_Minus_->Fill(probability);
144  }
145  }
146 }
147 
148 
149 
150 
151 
153  LogInfo("PixelDQM") << "SiPixelHitEfficiencySource beginRun()" << endl;
154 
155  if(firstRun){
156  // retrieve TrackerGeometry for pixel dets
157 
158  nvalid=0;
159  nmissing=0;
160 
161  firstRun = false;
162  }
163 
165  iSetup.get<TrackerDigiGeometryRecord>().get(TG);
166  if (debug_) LogVerbatim("PixelDQM") << "TrackerGeometry "<< &(*TG) <<" size is "<< TG->dets().size() << endl;
167 
168  // build theSiPixelStructure with the pixel barrel and endcap dets from TrackerGeometry
169  for (TrackerGeometry::DetContainer::const_iterator pxb = TG->detsPXB().begin();
170  pxb!=TG->detsPXB().end(); pxb++) {
171  if (dynamic_cast<PixelGeomDetUnit const *>((*pxb))!=nullptr) {
172  SiPixelHitEfficiencyModule* module = new SiPixelHitEfficiencyModule((*pxb)->geographicalId().rawId());
173  theSiPixelStructure.insert(pair<uint32_t, SiPixelHitEfficiencyModule*>((*pxb)->geographicalId().rawId(), module));
174  }
175  }
176  for (TrackerGeometry::DetContainer::const_iterator pxf = TG->detsPXF().begin();
177  pxf!=TG->detsPXF().end(); pxf++) {
178  if (dynamic_cast<PixelGeomDetUnit const *>((*pxf))!=nullptr) {
179  SiPixelHitEfficiencyModule* module = new SiPixelHitEfficiencyModule((*pxf)->geographicalId().rawId());
180  theSiPixelStructure.insert(pair<uint32_t, SiPixelHitEfficiencyModule*>((*pxf)->geographicalId().rawId(), module));
181  }
182  }
183  LogInfo("PixelDQM") << "SiPixelStructure size is " << theSiPixelStructure.size() << endl;
184 
185 }
186 
188 
189  // book residual histograms in theSiPixelFolder - one (x,y) pair of histograms per det
190  SiPixelFolderOrganizer theSiPixelFolder(false);
191  for (std::map<uint32_t, SiPixelHitEfficiencyModule*>::iterator pxd = theSiPixelStructure.begin();
192  pxd!=theSiPixelStructure.end(); pxd++) {
193 
194  if(modOn){
195  if (theSiPixelFolder.setModuleFolder(iBooker,(*pxd).first,0,isUpgrade)) (*pxd).second->book(pSet_,iSetup,iBooker,0,isUpgrade);
196  else throw cms::Exception("LogicError") << "SiPixelHitEfficiencySource Folder Creation Failed! ";
197  }
198  if(ladOn){
199  if (theSiPixelFolder.setModuleFolder(iBooker,(*pxd).first,1,isUpgrade)) (*pxd).second->book(pSet_,iSetup,iBooker,1,isUpgrade);
200  else throw cms::Exception("LogicError") << "SiPixelHitEfficiencySource ladder Folder Creation Failed! ";
201  }
202  if(layOn){
203  if (theSiPixelFolder.setModuleFolder(iBooker,(*pxd).first,2,isUpgrade)) (*pxd).second->book(pSet_,iSetup,iBooker,2,isUpgrade);
204  else throw cms::Exception("LogicError") << "SiPixelHitEfficiencySource layer Folder Creation Failed! ";
205  }
206  if(phiOn){
207  if (theSiPixelFolder.setModuleFolder(iBooker,(*pxd).first,3,isUpgrade)) (*pxd).second->book(pSet_,iSetup,iBooker,3,isUpgrade);
208  else throw cms::Exception("LogicError") << "SiPixelHitEfficiencySource phi Folder Creation Failed! ";
209  }
210  if(bladeOn){
211  if (theSiPixelFolder.setModuleFolder(iBooker,(*pxd).first,4,isUpgrade)) (*pxd).second->book(pSet_,iSetup,iBooker,4,isUpgrade);
212  else throw cms::Exception("LogicError") << "SiPixelHitEfficiencySource Blade Folder Creation Failed! ";
213  }
214  if(diskOn){
215  if (theSiPixelFolder.setModuleFolder(iBooker,(*pxd).first,5,isUpgrade)) (*pxd).second->book(pSet_,iSetup,iBooker,5,isUpgrade);
216  else throw cms::Exception("LogicError") << "SiPixelHitEfficiencySource Disk Folder Creation Failed! ";
217  }
218  if(ringOn){
219  if (theSiPixelFolder.setModuleFolder(iBooker,(*pxd).first,6,isUpgrade)) (*pxd).second->book(pSet_,iSetup,iBooker,6,isUpgrade);
220  else throw cms::Exception("LogicError") << "SiPixelHitEfficiencySource Ring Folder Creation Failed! ";
221  }
222  }
223 
224  //book cluster probability histos for Barrel and Endcap
225  iBooker.setCurrentFolder("Pixel/Barrel");
226 
227  meClusterProbabilityL1_Plus_ = iBooker.book1D("ClusterProbabilityXY_Layer1_Plus","ClusterProbabilityXY_Layer1_Plus",500,-14,0.1);
228  meClusterProbabilityL1_Plus_->setAxisTitle("Log(ClusterProbability)",1);
229 
230  meClusterProbabilityL1_Minus_ = iBooker.book1D("ClusterProbabilityXY_Layer1_Minus","ClusterProbabilityXY_Layer1_Minus",500,-14,0.1);
231  meClusterProbabilityL1_Minus_->setAxisTitle("Log(ClusterProbability)",1);
232 
233  meClusterProbabilityL2_Plus_ = iBooker.book1D("ClusterProbabilityXY_Layer2_Plus","ClusterProbabilityXY_Layer2_Plus",500,-14,0.1);
234  meClusterProbabilityL2_Plus_ ->setAxisTitle("Log(ClusterProbability)",1);
235 
236  meClusterProbabilityL2_Minus_ = iBooker.book1D("ClusterProbabilityXY_Layer2_Minus","ClusterProbabilityXY_Layer2_Minus",500,-14,0.1);
237  meClusterProbabilityL2_Minus_ ->setAxisTitle("Log(ClusterProbability)",1);
238 
239  meClusterProbabilityL3_Plus_ = iBooker.book1D("ClusterProbabilityXY_Layer3_Plus","ClusterProbabilityXY_Layer3_Plus",500,-14,0.1);
240  meClusterProbabilityL3_Plus_->setAxisTitle("Log(ClusterProbability)",1);
241 
242  meClusterProbabilityL3_Minus_ = iBooker.book1D("ClusterProbabilityXY_Layer3_Minus","ClusterProbabilityXY_Layer3_Minus",500,-14,0.1);
243  meClusterProbabilityL3_Minus_->setAxisTitle("Log(ClusterProbability)",1);
244 
245  iBooker.setCurrentFolder("Pixel/Endcap");
246 
247  meClusterProbabilityD1_Plus_ = iBooker.book1D("ClusterProbabilityXY_Disk1_Plus","ClusterProbabilityXY_Disk1_Plus",500,-14,0.1);
248  meClusterProbabilityD1_Plus_ ->setAxisTitle("Log(ClusterProbability)",1);
249 
250  meClusterProbabilityD1_Minus_ = iBooker.book1D("ClusterProbabilityXY_Disk1_Minus","ClusterProbabilityXY_Disk1_Minus",500,-14,0.1);
251  meClusterProbabilityD1_Minus_->setAxisTitle("Log(ClusterProbability)",1);
252 
253  meClusterProbabilityD2_Plus_ = iBooker.book1D("ClusterProbabilityXY_Disk2_Plus","ClusterProbabilityXY_Disk2_Plus",500,-14,0.1);
254  meClusterProbabilityD2_Plus_ ->setAxisTitle("Log(ClusterProbability)",1);
255 
256  meClusterProbabilityD2_Minus_ = iBooker.book1D("ClusterProbabilityXY_Disk2_Minus","ClusterProbabilityXY_Disk2_Minus",500,-14,0.1);
257  meClusterProbabilityD2_Minus_->setAxisTitle("Log(ClusterProbability)",1);
258 
259 }
260 
262 
263  edm::ESHandle<TrackerTopology> tTopoHandle;
264  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
265  const TrackerTopology *pTT = tTopoHandle.product();
266 
267  edm::Handle<reco::VertexCollection> vertexCollectionHandle;
268  iEvent.getByToken( vertexCollectionToken_, vertexCollectionHandle );
269  if(!vertexCollectionHandle.isValid()) return;
270  nvtx_=0;
271  vtxntrk_=-9999;
272  vtxD0_=-9999.; vtxX_=-9999.; vtxY_=-9999.; vtxZ_=-9999.; vtxndof_=-9999.; vtxchi2_=-9999.;
273  const reco::VertexCollection & vertices = *vertexCollectionHandle.product();
274  reco::VertexCollection::const_iterator bestVtx=vertices.end();
275  for(reco::VertexCollection::const_iterator it=vertices.begin(); it!=vertices.end(); ++it){
276  if(!it->isValid()) continue;
277  if(vtxntrk_==-9999 ||
278  vtxntrk_<int(it->tracksSize()) ||
279  (vtxntrk_==int(it->tracksSize()) && fabs(vtxZ_)>fabs(it->z()))){
280  vtxntrk_=it->tracksSize();
281  vtxD0_=it->position().rho();
282  vtxX_=it->x();
283  vtxY_=it->y();
284  vtxZ_=it->z();
285  vtxndof_=it->ndof();
286  vtxchi2_=it->chi2();
287  bestVtx=it;
288  }
289  if(fabs(it->z())<=20. && fabs(it->position().rho())<=2. && it->ndof()>4) nvtx_++;
290  }
291  if(nvtx_<1) return;
292 
293  //get the map
295  iEvent.getByToken( tracksrc_, match );
296 
297  if(debug_){
299  labelsForToken(tracksrc_, labels);
300  std::cout << "Trajectories from " << labels.module << std::endl;
301  }
302 
303  if (!match.isValid()) return;
304 
305  const TrajTrackAssociationCollection ttac = *(match.product());
306 
307  if(debug_){
308  std::cout << "+++ NEW EVENT +++"<< std::endl;
309  std::cout << "Map entries \t : " << ttac.size() << std::endl;
310  }
311 
312  std::set<SiPixelCluster> clusterSet;
313  // TrajectoryStateCombiner tsoscomb;
314  //define variables for extrapolation
315  int extrapolateFrom_ = 2;
316  int extrapolateTo_ = 1;
317  float maxlxmatch_=0.2;
318  float maxlymatch_=0.2;
319  bool keepOriginalMissingHit_=true;
320  ESHandle<MeasurementTracker> measurementTrackerHandle;
321 
322  iSetup.get<CkfComponentsRecord>().get(measurementTrackerHandle);
323 
325  iSetup.get<TrackingComponentsRecord>().get("Chi2",est);
326  edm::Handle<MeasurementTrackerEvent> measurementTrackerEventHandle;
327  iEvent.getByToken(measurementTrackerEventToken_, measurementTrackerEventHandle);
329  iSetup.get<TrackingComponentsRecord>().get("PropagatorWithMaterial",prop);
330  Propagator* thePropagator = prop.product()->clone();
331  //determines direction of the propagator => inward
332  if (extrapolateFrom_>=extrapolateTo_) {
334  }
335  TrajectoryStateCombiner trajStateComb;
336  bool debug_ = false;
337 
338  //Loop over track collection
339  for(TrajTrackAssociationCollection::const_iterator it = ttac.begin();it != ttac.end(); ++it){
340  //define vector to save extrapolated tracks
341  std::vector<TrajectoryMeasurement> expTrajMeasurements;
342 
343  const edm::Ref<std::vector<Trajectory> > traj_iterator = it->key;
344  // Trajectory Map, extract Trajectory for this track
345  reco::TrackRef trackref = it->val;
346  //tracks++;
347 
348  bool isBpixtrack = false, isFpixtrack = false;
349  int nStripHits=0; int L1hits=0; int L2hits=0; int L3hits=0; int L4hits=0; int D1hits=0; int D2hits=0; int D3hits=0;
350  std::vector<TrajectoryMeasurement> tmeasColl =traj_iterator->measurements();
351  std::vector<TrajectoryMeasurement>::const_iterator tmeasIt;
352  //loop on measurements to find out what kind of hits there are
353  for(tmeasIt = tmeasColl.begin();tmeasIt!=tmeasColl.end();tmeasIt++){
354  //if(! tmeasIt->updatedState().isValid()) continue; NOT NECESSARY (I HOPE)
355  TransientTrackingRecHit::ConstRecHitPointer testhit = tmeasIt->recHit();
356  if(testhit->geographicalId().det() != DetId::Tracker) continue;
357  uint testSubDetID = (testhit->geographicalId().subdetId());
358  const DetId & hit_detId = testhit->geographicalId();
359  int hit_layer = 0;
360  int hit_ladder = 0;
361  int hit_mod = 0;
362  int hit_disk = 0;
363 
364  if(testSubDetID==PixelSubdetector::PixelBarrel){
365  isBpixtrack = true;
366  hit_layer = PixelBarrelName(hit_detId,pTT,isUpgrade).layerName();
367 
368  hit_ladder = PXBDetId(hit_detId).ladder();
369  hit_mod = PXBDetId(hit_detId).module();
370 
371  if(hit_layer==1) L1hits++;
372  if(hit_layer==2) L2hits++;
373  if(hit_layer==3) L3hits++;
374  if(hit_layer==4) L4hits++;
375  }
376  if(testSubDetID==PixelSubdetector::PixelEndcap){
377  isFpixtrack = true;
378  hit_disk = PixelEndcapName(hit_detId,pTT,isUpgrade).diskName();
379 
380  if(hit_disk==1) D1hits++;
381  if(hit_disk==2) D2hits++;
382  if(hit_disk==3) D3hits++;
383  }
384  if(testSubDetID==StripSubdetector::TIB) nStripHits++;
385  if(testSubDetID==StripSubdetector::TOB) nStripHits++;
386  if(testSubDetID==StripSubdetector::TID) nStripHits++;
387  if(testSubDetID==StripSubdetector::TEC) nStripHits++;
388  //check if last valid hit is in Layer 2 or Disk 1
389 
390  bool lastValidL2 = false;
391  if ((testSubDetID == PixelSubdetector::PixelBarrel && hit_layer == extrapolateFrom_)
392  || (testSubDetID == PixelSubdetector::PixelEndcap && hit_disk == 1)) {
393  if (testhit->isValid()) {
394  if (tmeasIt == tmeasColl.end()-1) {
395  lastValidL2=true;
396  } else {
397  tmeasIt++;
398  TransientTrackingRecHit::ConstRecHitPointer nextRecHit = tmeasIt->recHit();
399  uint nextSubDetID = (nextRecHit->geographicalId().subdetId());
400  int nextlayer = PixelBarrelName(nextRecHit->geographicalId()).layerName();
401  if (nextSubDetID == PixelSubdetector::PixelBarrel && nextlayer==extrapolateTo_ ) {
402  lastValidL2=true; //&& !nextRecHit->isValid()) lastValidL2=true;
403  }
404  tmeasIt--;
405  }
406  }
407  }//end check last valid layer
408  if (lastValidL2) {
409  std::vector< const BarrelDetLayer*> pxbLayers = measurementTrackerHandle->geometricSearchTracker()->pixelBarrelLayers();
410  const DetLayer* pxb1 = pxbLayers[extrapolateTo_-1];
411  const MeasurementEstimator* estimator = est.product();
412  const LayerMeasurements* theLayerMeasurements = new LayerMeasurements(*measurementTrackerHandle, *measurementTrackerEventHandle);
413  const TrajectoryStateOnSurface tsosPXB2 = tmeasIt->updatedState();
414  expTrajMeasurements = theLayerMeasurements->measurements(*pxb1, tsosPXB2, *thePropagator, *estimator);
415  delete theLayerMeasurements;
416  if ( !expTrajMeasurements.empty()) {
417  for(uint p=0; p<expTrajMeasurements.size();p++){
418  TrajectoryMeasurement pxb1TM(expTrajMeasurements[p]);
419  const auto& pxb1Hit = pxb1TM.recHit();
420  //remove hits with rawID == 0
421  if(pxb1Hit->geographicalId().rawId()==0){
422  expTrajMeasurements.erase(expTrajMeasurements.begin()+p);
423  continue;
424  }
425  }
426  }
427  //
428  }
429  //check if extrapolated hit to layer 1 one matches the original hit
430  TrajectoryStateOnSurface chkPredTrajState=trajStateComb(tmeasIt->forwardPredictedState(), tmeasIt->backwardPredictedState());
431  if (!chkPredTrajState.isValid()) continue;
432  float chkx=chkPredTrajState.globalPosition().x();
433  float chky=chkPredTrajState.globalPosition().y();
434  float chkz=chkPredTrajState.globalPosition().z();
435  LocalPoint chklp=chkPredTrajState.localPosition();
436  if (testSubDetID == PixelSubdetector::PixelBarrel && hit_layer == extrapolateTo_) {
437  // Here we will drop the extrapolated hits if there is a hit and use that hit
438  vector<int > imatches;
439  size_t imatch=0;
440  float glmatch=9999.;
441  for (size_t iexp=0; iexp<expTrajMeasurements.size(); iexp++) {
442  const DetId & exphit_detId = expTrajMeasurements[iexp].recHit()->geographicalId();
443  int exphit_ladder = PXBDetId(exphit_detId).ladder();
444  int exphit_mod = PXBDetId(exphit_detId).module();
445  int dladder = abs( exphit_ladder - hit_ladder );
446  if (dladder > 10) dladder = 20 - dladder;
447  int dmodule = abs( exphit_mod - hit_mod);
448  if (dladder != 0 || dmodule != 0) {
449  continue;
450  }
451 
452  TrajectoryStateOnSurface predTrajState=expTrajMeasurements[iexp].updatedState();
453  float x=predTrajState.globalPosition().x();
454  float y=predTrajState.globalPosition().y();
455  float z=predTrajState.globalPosition().z();
456  float dxyz=sqrt((chkx-x)*(chkx-x)+(chky-y)*(chky-y)+(chkz-z)*(chkz-z));
457 
458  if (dxyz<=glmatch) {
459  glmatch=dxyz;
460  imatch=iexp;
461  imatches.push_back(int(imatch));
462  }
463 
464  } // found the propagated traj best matching the hit in data
465 
466  float lxmatch = 9999.0;
467  float lymatch = 9999.0;
468  if(!expTrajMeasurements.empty()){
469  if (glmatch<9999.) { // if there is any propagated trajectory for this hit
470  const DetId & matchhit_detId = expTrajMeasurements[imatch].recHit()->geographicalId();
471 
472  int matchhit_ladder = PXBDetId(matchhit_detId).ladder();
473  int dladder = abs(matchhit_ladder-hit_ladder);
474  if (dladder > 10) dladder = 20 - dladder;
475  LocalPoint lp = expTrajMeasurements[imatch].updatedState().localPosition();
476  lxmatch=fabs(lp.x() - chklp.x());
477  lymatch=fabs(lp.y() - chklp.y());
478  }
479  if (lxmatch < maxlxmatch_ && lymatch < maxlymatch_) {
480 
481  if (testhit->getType()!=TrackingRecHit::missing || keepOriginalMissingHit_) {
482  expTrajMeasurements.erase(expTrajMeasurements.begin()+imatch);
483  }
484 
485  }
486 
487  } //expected trajectory measurment not empty
488  }
489  }//loop on trajectory measurments tmeasColl
490 
491  //if an extrapolated hit was found but not matched to an exisitng L1 hit then push the hit back into the collection
492  //now keep the first one that is left
493  if(!expTrajMeasurements.empty()){
494  for (size_t f=0; f<expTrajMeasurements.size(); f++) {
495  TrajectoryMeasurement AddHit=expTrajMeasurements[f];
496  if (AddHit.recHit()->getType()==TrackingRecHit::missing){
497  tmeasColl.push_back(AddHit);
498  isBpixtrack = true;
499 
500  }
501 
502  }
503  }
504 
505  if(isBpixtrack || isFpixtrack){
506  if(trackref->pt()<0.6 ||
507  nStripHits<8 ||
508  fabs(trackref->dxy(bestVtx->position()))>0.05 ||
509  fabs(trackref->dz(bestVtx->position()))>0.5) continue;
510 
511  if(debug_){
512  std::cout << "isBpixtrack : " << isBpixtrack << std::endl;
513  std::cout << "isFpixtrack : " << isFpixtrack << std::endl;
514  }
515  //std::cout<<"This tracks has so many hits: "<<tmeasColl.size()<<std::endl;
516  for(std::vector<TrajectoryMeasurement>::const_iterator tmeasIt = tmeasColl.begin(); tmeasIt!=tmeasColl.end(); tmeasIt++){
517  //if(! tmeasIt->updatedState().isValid()) continue;
518  TrajectoryStateOnSurface tsos = tmeasIt->updatedState();
519 
521  if(hit->geographicalId().det() != DetId::Tracker )
522  continue;
523  else {
524 
525  // //residual
526  const DetId & hit_detId = hit->geographicalId();
527  //uint IntRawDetID = (hit_detId.rawId());
528  uint IntSubDetID = (hit_detId.subdetId());
529 
530  if(IntSubDetID == 0 ){
531  if(debug_) std::cout << "NO IntSubDetID\n";
532  continue;
533  }
534  if(IntSubDetID!=PixelSubdetector::PixelBarrel && IntSubDetID!=PixelSubdetector::PixelEndcap)
535  continue;
536 
537  int disk=0; int layer=0; int panel=0; int module=0; bool isHalfModule=false;
538 
539  const SiPixelRecHit* pixhit = dynamic_cast<const SiPixelRecHit*>(hit->hit());
540 
541  if(IntSubDetID==PixelSubdetector::PixelBarrel){ // it's a BPIX hit
542  layer = PixelBarrelName(hit_detId,pTT,isUpgrade).layerName();
543  isHalfModule = PixelBarrelName(hit_detId,pTT,isUpgrade).isHalfModule();
544 
545  if (hit->isValid()){ //fill the cluster probability in barrel
546  bool plus=true;
547  if ((PixelBarrelName(hit_detId,pTT,isUpgrade).shell()== PixelBarrelName::Shell::mO) || (PixelBarrelName(hit_detId,pTT,isUpgrade).shell()==PixelBarrelName::Shell::mI)) plus=false;
548  double clusterProbability= pixhit->clusterProbability(0);
549  if (clusterProbability!=0) fillClusterProbability(layer,0,plus,log10(clusterProbability));
550  }
551 
552  }else if(IntSubDetID==PixelSubdetector::PixelEndcap){ // it's an FPIX hit
553  disk = PixelEndcapName(hit_detId,pTT,isUpgrade).diskName();
554  panel = PixelEndcapName(hit_detId,pTT,isUpgrade).pannelName();
555  module = PixelEndcapName(hit_detId,pTT,isUpgrade).plaquetteName();
556 
557  if (hit->isValid()){
558  bool plus=true;
559  if ((PixelEndcapName(hit_detId,pTT,isUpgrade).halfCylinder()== PixelEndcapName::HalfCylinder::mO) || (PixelEndcapName(hit_detId,pTT,isUpgrade).halfCylinder()==PixelEndcapName::HalfCylinder::mI)) plus=false;
560  double clusterProbability= pixhit->clusterProbability(0);
561  if (clusterProbability!=0) fillClusterProbability(0,disk,plus,log10(clusterProbability));
562  }
563  }
564 
565  if(layer==1){
566  if(fabs(trackref->dxy(bestVtx->position()))>0.01 ||
567  fabs(trackref->dz(bestVtx->position()))>0.1) continue;
568  if(!(L2hits>0&&L3hits>0) && !(L2hits>0&&D1hits>0) && !(D1hits>0&&D2hits>0)) continue;
569  }else if(layer==2){
570  if(fabs(trackref->dxy(bestVtx->position()))>0.02 ||
571  fabs(trackref->dz(bestVtx->position()))>0.1) continue;
572  if(!(L1hits>0&&L3hits>0) && !(L1hits>0&&D1hits>0)) continue;
573  }else if(layer==3){
574  if(fabs(trackref->dxy(bestVtx->position()))>0.02 ||
575  fabs(trackref->dz(bestVtx->position()))>0.1) continue;
576  if(!(L1hits>0&&L2hits>0)) continue;
577  }else if(layer==4){
578  if(fabs(trackref->dxy(bestVtx->position()))>0.02 ||
579  fabs(trackref->dz(bestVtx->position()))>0.1) continue;
580  }else if(disk==1){
581  if(fabs(trackref->dxy(bestVtx->position()))>0.05 ||
582  fabs(trackref->dz(bestVtx->position()))>0.5) continue;
583  if(!(L1hits>0&&D2hits>0) && !(L2hits>0&&D2hits>0)) continue;
584  }else if(disk==2){
585  if(fabs(trackref->dxy(bestVtx->position()))>0.05 ||
586  fabs(trackref->dz(bestVtx->position()))>0.5) continue;
587  if(!(L1hits>0&&D1hits>0)) continue;
588  }else if(disk==3){
589  if(fabs(trackref->dxy(bestVtx->position()))>0.05 ||
590  fabs(trackref->dz(bestVtx->position()))>0.5) continue;
591  }
592 
593  //check whether hit is valid or missing using track algo flag
594  bool isHitValid =hit->hit()->getType()==TrackingRecHit::valid;
595  bool isHitMissing =hit->hit()->getType()==TrackingRecHit::missing;
596 
597  if(debug_) std::cout << "the hit is persistent\n";
598 
599  std::map<uint32_t, SiPixelHitEfficiencyModule*>::iterator pxd = theSiPixelStructure.find((*hit).geographicalId().rawId());
600 
601  // calculate alpha and beta from cluster position
603  //LocalVector localDir = ltp.momentum()/ltp.momentum().mag();
604 
605  //*************** Edge cut ********************
606  double lx=tsos.localPosition().x();
607  double ly=tsos.localPosition().y();
608 
609  if(fabs(lx)>0.55 || fabs(ly)>3.0) continue;
610 
611  bool passedFiducial=true;
612 
613  // Module fiducials:
614  if(IntSubDetID==PixelSubdetector::PixelBarrel && fabs(ly)>=3.1) passedFiducial=false;
615  if(IntSubDetID==PixelSubdetector::PixelEndcap &&
616  !((panel==1 &&
617  ((module==1 && fabs(ly)<0.7) ||
618  ((module==2 && fabs(ly)<1.1) &&
619  !(disk==-1 && ly>0.8 && lx>0.2) &&
620  !(disk==1 && ly<-0.7 && lx>0.2) &&
621  !(disk==2 && ly<-0.8)) ||
622  ((module==3 && fabs(ly)<1.5) &&
623  !(disk==-2 && lx>0.1 && ly>1.0) &&
624  !(disk==2 && lx>0.1 && ly<-1.0)) ||
625  ((module==4 && fabs(ly)<1.9) &&
626  !(disk==-2 && ly>1.5) &&
627  !(disk==2 && ly<-1.5)))) ||
628  (panel==2 &&
629  ((module==1 && fabs(ly)<0.7) ||
630  (module==2 && fabs(ly)<1.2 &&
631  !(disk>0 && ly>1.1) &&
632  !(disk<0 && ly<-1.1)) ||
633  (module==3 && fabs(ly)<1.6 &&
634  !(disk>0 && ly>1.5) &&
635  !(disk<0 && ly<-1.5)))))) passedFiducial=false;
636  if(IntSubDetID==PixelSubdetector::PixelEndcap &&
637  ((panel==1 && (module==1 || (module>=3 && abs(disk)==1))) ||
638  (panel==2 && ((module==1 && abs(disk)==2) ||
639  (module==3 && abs(disk)==1))))) passedFiducial=false;
640  // ROC fiducials:
641  double ly_mod = fabs(ly);
642  if(IntSubDetID==PixelSubdetector::PixelEndcap && (panel+module)%2==1) ly_mod=ly_mod+0.405;
643  float d_rocedge = fabs(fmod(ly_mod,0.81)-0.405);
644  if(d_rocedge<=0.0625) passedFiducial=false;
645  if(!( (IntSubDetID==PixelSubdetector::PixelBarrel &&
646  ((!isHalfModule && fabs(lx)<0.6) ||
647  (isHalfModule && lx>-0.3 && lx<0.2))) ||
648  (IntSubDetID==PixelSubdetector::PixelEndcap &&
649  ((panel==1 &&
650  ((module==1 && fabs(lx)<0.2) ||
651  (module==2 &&
652  ((fabs(lx)<0.55 && abs(disk)==1) ||
653  (lx>-0.5 && lx<0.2 && disk==-2) ||
654  (lx>-0.5 && lx<0.0 && disk==2))) ||
655  (module==3 && lx>-0.6 && lx<0.5) ||
656  (module==4 && lx>-0.3 && lx<0.15))) ||
657  (panel==2 &&
658  ((module==1 && fabs(lx)<0.6) ||
659  (module==2 &&
660  ((fabs(lx)<0.55 && abs(disk)==1) ||
661  (lx>-0.6 && lx<0.5 && abs(disk)==2))) ||
662  (module==3 && fabs(lx)<0.5))))))) passedFiducial=false;
663  if(((IntSubDetID==PixelSubdetector::PixelBarrel && !isHalfModule) ||
664  (IntSubDetID==PixelSubdetector::PixelEndcap && !(panel==1 && (module==1 || module==4)))) &&
665  fabs(lx)<0.06) passedFiducial=false;
666 
667 
668  //*************** find closest clusters ********************
669  float dx_cl[2]; float dy_cl[2]; dx_cl[0]=dx_cl[1]=dy_cl[0]=dy_cl[1]=-9999.;
671  iSetup.get<TkPixelCPERecord>().get("PixelCPEGeneric", cpEstimator);
672  if(cpEstimator.isValid()){
673  const PixelClusterParameterEstimator &cpe(*cpEstimator);
675  iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
676  if(tracker.isValid()){
677  const TrackerGeometry *tkgeom=&(*tracker);
678  edm::Handle<edmNew::DetSetVector<SiPixelCluster> > clusterCollectionHandle;
679  iEvent.getByToken( clusterCollectionToken_, clusterCollectionHandle );
680  if(clusterCollectionHandle.isValid()){
681  const edmNew::DetSetVector<SiPixelCluster>& clusterCollection=*clusterCollectionHandle;
682  edmNew::DetSetVector<SiPixelCluster>::const_iterator itClusterSet=clusterCollection.begin();
683  float minD[2]; minD[0]=minD[1]=10000.;
684  for( ; itClusterSet!=clusterCollection.end(); itClusterSet++){
685  DetId detId(itClusterSet->id());
686  if(detId.rawId()!=hit->geographicalId().rawId()) continue;
687  //unsigned int sdId=detId.subdetId();
688  const PixelGeomDetUnit *pixdet=(const PixelGeomDetUnit*) tkgeom->idToDetUnit(detId);
689  edmNew::DetSet<SiPixelCluster>::const_iterator itCluster=itClusterSet->begin();
690  for( ; itCluster!=itClusterSet->end(); ++itCluster){
691  LocalPoint lp(itCluster->x(), itCluster->y(), 0.);
692  PixelClusterParameterEstimator::ReturnType params=cpe.getParameters(*itCluster,*pixdet);
693  lp=std::get<0>(params);
694  float D = sqrt((lp.x()-lx)*(lp.x()-lx)+(lp.y()-ly)*(lp.y()-ly));
695  if(D<minD[0]){
696  minD[1]=minD[0];
697  dx_cl[1]=dx_cl[0];
698  dy_cl[1]=dy_cl[0];
699  minD[0]=D;
700  dx_cl[0]=lp.x();
701  dy_cl[0]=lp.y();
702  }else if(D<minD[1]){
703  minD[1]=D;
704  dx_cl[1]=lp.x();
705  dy_cl[1]=lp.y();
706  }
707  } // loop on clusterSets
708  } // loop on clusterCollection
709  for(size_t i=0; i<2; i++){
710  if(minD[i]<9999.){
711  dx_cl[i]=fabs(dx_cl[i]-lx);
712  dy_cl[i]=fabs(dy_cl[i]-ly);
713  }
714  }
715  } // valid clusterCollectionHandle
716  } // valid tracker
717  } // valid cpEstimator
718  // distance of hit from closest cluster!
719  float d_cl[2]; d_cl[0]=d_cl[1]=-9999.;
720  if(dx_cl[0]!=-9999. && dy_cl[0]!=-9999.) d_cl[0]=sqrt(dx_cl[0]*dx_cl[0]+dy_cl[0]*dy_cl[0]);
721  if(dx_cl[1]!=-9999. && dy_cl[1]!=-9999.) d_cl[1]=sqrt(dx_cl[1]*dx_cl[1]+dy_cl[1]*dy_cl[1]);
722  if(isHitMissing && (d_cl[0]<0.05 || d_cl[1]<0.05)){ isHitMissing=false; isHitValid=true; }
723 
724  if(debug_){
725  std::cout << "Ready to add hit in histogram:\n";
726  //std::cout << "detid: "<<hit_detId<<std::endl;
727  std::cout << "isHitValid: "<<isHitValid<<std::endl;
728  std::cout << "isHitMissing: "<<isHitMissing<<std::endl;
729  //std::cout << "passedEdgeCut: "<<passedFiducial<<std::endl;
730  }
731 
732  if (nStripHits<11) continue; //Efficiency plots are filled with hits on tracks that have at least 11 Strip hits
733 
734  if(pxd!=theSiPixelStructure.end() && isHitValid && passedFiducial)
735  ++nvalid;
736  if(pxd!=theSiPixelStructure.end() && isHitMissing && passedFiducial)
737  ++nmissing;
738 
739  if (pxd!=theSiPixelStructure.end() && passedFiducial && (isHitValid || isHitMissing))
740  (*pxd).second->fill(pTT,ltp, isHitValid, modOn, ladOn, layOn, phiOn, bladeOn, diskOn, ringOn);
741 
742  //}//end if (persistent hit exists and is pixel hit)
743 
744  }//end of else
745 
746 
747  }//end for (all traj measurements of pixeltrack)
748  }//end if (is pixeltrack)
749  else
750  if(debug_) std::cout << "no pixeltrack:\n";
751 
752  }//end loop on map entries
753 }
754 
755 
756 DEFINE_FWK_MODULE(SiPixelHitEfficiencySource); // define this as a plug-in
int plaquetteName() const
plaquetteId (in pannel)
edm::EDGetTokenT< MeasurementTrackerEvent > measurementTrackerEventToken_
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< TrajectoryMeasurement > measurements(const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
virtual void setPropagationDirection(PropagationDirection dir)
Definition: Propagator.h:140
virtual ReturnType getParameters(const SiPixelCluster &cl, const GeomDetUnit &det) const =0
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
const_iterator end(bool update=false) const
virtual Propagator * clone() const =0
float clusterProbability(unsigned int flags=0) const
ConstRecHitPointer const & recHit() const
SiPixelHitEfficiencySource(const edm::ParameterSet &)
const LocalTrajectoryParameters & localParameters() const
const_iterator end() const
last iterator over the map (read only)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > clusterCollectionToken_
std::map< uint32_t, SiPixelHitEfficiencyModule * > theSiPixelStructure
T y() const
Definition: PV3DBase.h:63
GlobalPoint globalPosition() const
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
unsigned int ladder() const
ladder id
Definition: PXBDetId.h:39
data_type const * const_iterator
Definition: DetSetNew.h:30
key_type key() const
Accessor for product key.
Definition: Ref.h:265
virtual void fillClusterProbability(int, int, bool, double)
id_type id(size_t cell) const
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< reco::VertexCollection > vertexCollectionToken_
void Fill(long long x)
const DetContainer & dets() const override
Returm a vector of all GeomDet (including all GeomDetUnits)
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
int iEvent
Definition: GenABIO.cc:230
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:268
bool isHalfModule() const
full or half module
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
T sqrt(T t)
Definition: SSEVec.h:18
bool setModuleFolder(const uint32_t &rawdetid=0, int type=0, bool isUpgrade=false)
Set folder name for a module or plaquette.
edm::EDGetTokenT< TrajTrackAssociationCollection > tracksrc_
T z() const
Definition: PV3DBase.h:64
const DetContainer & detsPXB() const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:41
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:106
unsigned int module() const
det id
Definition: PXBDetId.h:43
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
bool isValid() const
Definition: HandleBase.h:74
char const * module
Definition: ProductLabels.h:5
Definition: DetId.h:18
void analyze(const edm::Event &, const edm::EventSetup &) override
DecomposeProduct< arg, typename Div::arg > D
Definition: Factorize.h:151
size_type size() const
map size
T const * product() const
Definition: Handle.h:81
int layerName() const
layer id
def uint(string)
Shell shell() const
HLT enums.
int pannelName() const
pannel id
T get() const
Definition: EventSetup.h:62
const DetContainer & detsPXF() const
int diskName() const
disk id
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
const_iterator begin() const
first iterator over the map (read only)
std::tuple< LocalPoint, LocalError, SiPixelRecHitQuality::QualWordType > ReturnType
bool isValid() const
Definition: ESHandle.h:47
HalfCylinder halfCylinder() const
T x() const
Definition: PV3DBase.h:62
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
T const * product() const
Definition: ESHandle.h:86
Definition: vlib.h:208
void dqmBeginRun(const edm::Run &r, edm::EventSetup const &iSetup) override
const_iterator begin(bool update=false) const
Definition: Run.h:44
Our base class.
Definition: SiPixelRecHit.h:23