CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripMonitorTrack.cc
Go to the documentation of this file.
2 
6 
19 
21 
23 #include "TMath.h"
24 
26  conf_(conf),
27  tracksCollection_in_EventTree(true),
28  firstEvent(-1),
29  genTriggerEventFlag_(new GenericTriggerEventFlag(conf, consumesCollector(), *this))
30 {
31  Cluster_src_ = conf.getParameter<edm::InputTag>("Cluster_src");
32  Mod_On_ = conf.getParameter<bool>("Mod_On");
33  Trend_On_ = conf.getParameter<bool>("Trend_On");
34  TkHistoMap_On_ = conf.getParameter<bool>("TkHistoMap_On");
35  clchCMoriginTkHmap_On_ = conf.getParameter<bool>("clchCMoriginTkHmap_On");
36 
37  TrackProducer_ = conf_.getParameter<std::string>("TrackProducer");
38  TrackLabel_ = conf_.getParameter<std::string>("TrackLabel");
39 
40  topFolderName_ = conf_.getParameter<std::string>("TopFolderName");
41 
42  clusterToken_ = consumes<edmNew::DetSetVector<SiStripCluster> >(Cluster_src_);
43  trackToken_ = consumes<reco::TrackCollection>(edm::InputTag(TrackProducer_,TrackLabel_) );
44  trackTrajToken_ = consumes<TrajTrackAssociationCollection>(edm::InputTag(TrackProducer_,TrackLabel_) );
45 
46  // cluster quality conditions
47  edm::ParameterSet cluster_condition = conf_.getParameter<edm::ParameterSet>("ClusterConditions");
48  applyClusterQuality_ = cluster_condition.getParameter<bool>("On");
49  sToNLowerLimit_ = cluster_condition.getParameter<double>("minStoN");
50  sToNUpperLimit_ = cluster_condition.getParameter<double>("maxStoN");
51  widthLowerLimit_ = cluster_condition.getParameter<double>("minWidth");
52  widthUpperLimit_ = cluster_condition.getParameter<double>("maxWidth");
53 
54 
55  // Create DCS Status
56  bool checkDCS = conf_.getParameter<bool>("UseDCSFiltering");
57  if (checkDCS) dcsStatus_ = new SiStripDCSStatus(consumesCollector());
58  else dcsStatus_ = 0;
59 }
60 
61 //------------------------------------------------------------------------
63  if (dcsStatus_) delete dcsStatus_;
65 }
66 
67 //------------------------------------------------------------------------
69 {
70  //get geom
72  LogDebug("SiStripMonitorTrack") << "[SiStripMonitorTrack::beginRun] There are "<<tkgeom_->detUnits().size() <<" detectors instantiated in the geometry" << std::endl;
74 
75 
76  // Initialize the GenericTriggerEventFlag
78 }
79 
80 //------------------------------------------------------------------------
82 {
83  //Retrieve tracker topology from geometry
85  es.get<TrackerTopologyRcd>().get(tTopoHandle);
86  const TrackerTopology* const tTopo = tTopoHandle.product();
87  book(ibooker , tTopo);
88 }
89 
90 // ------------ method called to produce the data ------------
92 {
93  // Filter out events if DCS checking is requested
94  if (dcsStatus_ && !dcsStatus_->getStatus(e,es)) return;
95 
96  // Filter out events if Trigger Filtering is requested
97  if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( e, es) ) return;
98 
99  //initialization of global quantities
100  LogDebug("SiStripMonitorTrack") << "[SiStripMonitorTrack::analyse] " << "Run " << e.id().run() << " Event " << e.id().event() << std::endl;
101  eventNb = e.id().event();
102  vPSiStripCluster.clear();
103 
104  iLumisection = e.orbitNumber()/262144.0;
105 
106  // initialise # of clusters
107  for (std::map<std::string, SubDetMEs>::iterator iSubDet = SubDetMEsMap.begin();
108  iSubDet != SubDetMEsMap.end(); iSubDet++) {
109  iSubDet->second.totNClustersOnTrack = 0;
110  iSubDet->second.totNClustersOffTrack = 0;
111  }
112 
113  //Perform track study
114  trackStudy(e, es);
115 
116  //Perform Cluster Study (irrespectively to tracks)
117 
118  AllClusters(e, es); //analyzes the off Track Clusters
119 
120  //Summary Counts of clusters
121  std::map<std::string, MonitorElement*>::iterator iME;
122  std::map<std::string, LayerMEs>::iterator iLayerME;
123 
124  for (std::map<std::string, SubDetMEs>::iterator iSubDet = SubDetMEsMap.begin();
125  iSubDet != SubDetMEsMap.end(); iSubDet++) {
126  SubDetMEs subdet_mes = iSubDet->second;
127  if (subdet_mes.totNClustersOnTrack > 0) {
128  fillME(subdet_mes.nClustersOnTrack, subdet_mes.totNClustersOnTrack);
129  }
130  fillME(subdet_mes.nClustersOffTrack, subdet_mes.totNClustersOffTrack);
131  if (Trend_On_) {
134  }
135  }
136 }
137 
138 //------------------------------------------------------------------------
140 {
141 
142  SiStripFolderOrganizer folder_organizer;
143  folder_organizer.setSiStripFolderName(topFolderName_);
144  //******** TkHistoMaps
145  if (TkHistoMap_On_) {
146  tkhisto_StoNCorrOnTrack = new TkHistoMap(ibooker , topFolderName_ ,"TkHMap_StoNCorrOnTrack", 0.0,true);
147  tkhisto_NumOnTrack = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberOfOnTrackCluster", 0.0,true);
148  tkhisto_NumOffTrack = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberOfOfffTrackCluster",0.0,true);
149  tkhisto_ClChPerCMfromTrack = new TkHistoMap(ibooker , topFolderName_, "TkHMap_ChargePerCMfromTrack",0.0,true);
150  tkhisto_NumMissingHits = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberMissingHits",0.0,true);
151  tkhisto_NumberInactiveHits = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberInactiveHits",0.0,true);
152  tkhisto_NumberValidHits = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberValidHits",0.0,true);
153  }
155  tkhisto_ClChPerCMfromOrigin = new TkHistoMap(ibooker , topFolderName_, "TkHMap_ChargePerCMfromOrigin",0.0,true);
156  //******** TkHistoMaps
157 
158  std::vector<uint32_t> vdetId_;
159  SiStripDetCabling_->addActiveDetectorsRawIds(vdetId_);
160  //Histos for each detector, layer and module
161  for (std::vector<uint32_t>::const_iterator detid_iter=vdetId_.begin();detid_iter!=vdetId_.end();detid_iter++){ //loop on all the active detid
162  uint32_t detid = *detid_iter;
163 
164  if (detid < 1){
165  edm::LogError("SiStripMonitorTrack")<< "[" <<__PRETTY_FUNCTION__ << "] invalid detid " << detid<< std::endl;
166  continue;
167  }
168 
169 
171 
172  // book Layer and RING plots
173  std::pair<std::string,int32_t> det_layer_pair = folder_organizer.GetSubDetAndLayer(detid,tTopo,false);
174  /*
175  std::string thickness;
176  std::pair<std::string,int32_t> det_layer_pair_test = folder_organizer.GetSubDetAndLayerThickness(detid,tTopo,thickness);
177  std::cout << "[SiStripMonitorTrack::book] det_layer_pair " << det_layer_pair.first << " " << det_layer_pair.second << " " << thickness << std::endl;
178  */
179 
180  SiStripHistoId hidmanager;
181  std::string layer_id = hidmanager.getSubdetid(detid, tTopo, false);
182 
183  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(layer_id);
184  if(iLayerME==LayerMEsMap.end()){
185  folder_organizer.setLayerFolder(detid, tTopo, det_layer_pair.second, false);
186  bookLayerMEs(ibooker , detid, layer_id);
187  }
188 
189  std::string subdet = det_layer_pair.first;
190  if ( subdet.find("TEC") != std::string::npos || subdet.find("TID") != std::string::npos ) {
191  std::pair<std::string,int32_t> det_ring_pair = folder_organizer.GetSubDetAndLayer(detid,tTopo,true);
192  std::string ring_id = hidmanager.getSubdetid(detid, tTopo, true);
193  std::map<std::string, RingMEs>::iterator iRingME = RingMEsMap.find(ring_id);
194  if(iRingME==RingMEsMap.end()){
195  folder_organizer.setLayerFolder(detid, tTopo, det_ring_pair.second, true);
196  bookRingMEs(ibooker , detid, ring_id);
197  }
198  }
199 
200  // book sub-detector plots
201  std::pair<std::string,std::string> sdet_pair = folder_organizer.getSubDetFolderAndTag(detid, tTopo);
202  if (SubDetMEsMap.find(sdet_pair.second) == SubDetMEsMap.end()){
203  ibooker.setCurrentFolder(sdet_pair.first);
204  bookSubDetMEs(ibooker , sdet_pair.second);
205  }
206  // book module plots
207  if(Mod_On_) {
208  folder_organizer.setDetectorFolder(detid,tTopo);
209  bookModMEs(ibooker , *detid_iter);
210  }
211  }//end loop on detectors detid
212 }
213 
214 //--------------------------------------------------------------------------------
215 void SiStripMonitorTrack::bookModMEs(DQMStore::IBooker & ibooker , const uint32_t id)//Histograms at MODULE level
216 {
217  std::string name = "det";
218  SiStripHistoId hidmanager;
219  std::string hid = hidmanager.createHistoId("",name,id);
220  std::map<std::string, ModMEs>::iterator iModME = ModMEsMap.find(hid);
221  if(iModME==ModMEsMap.end()){
222  ModMEs theModMEs;
223  theModMEs.ClusterStoNCorr = 0;
224  theModMEs.ClusterCharge = 0;
225  theModMEs.ClusterChargeCorr = 0;
226  theModMEs.ClusterWidth = 0;
227  theModMEs.ClusterPos = 0;
228  theModMEs.ClusterPGV = 0;
229  theModMEs.ClusterChargePerCMfromTrack = 0;
230  theModMEs.ClusterChargePerCMfromOrigin = 0;
231 
232  // Cluster Width
233  theModMEs.ClusterWidth=bookME1D(ibooker , "TH1ClusterWidth", hidmanager.createHistoId("ClusterWidth_OnTrack",name,id).c_str());
234  ibooker.tag(theModMEs.ClusterWidth,id);
235  // Cluster Charge
236  theModMEs.ClusterCharge=bookME1D(ibooker , "TH1ClusterCharge", hidmanager.createHistoId("ClusterCharge_OnTrack",name,id).c_str());
237  ibooker.tag(theModMEs.ClusterCharge,id);
238  // Cluster Charge Corrected
239  theModMEs.ClusterChargeCorr=bookME1D(ibooker , "TH1ClusterChargeCorr", hidmanager.createHistoId("ClusterChargeCorr_OnTrack",name,id).c_str());
240  ibooker.tag(theModMEs.ClusterChargeCorr,id);
241  // Cluster StoN Corrected
242  theModMEs.ClusterStoNCorr=bookME1D(ibooker , "TH1ClusterStoNCorrMod", hidmanager.createHistoId("ClusterStoNCorr_OnTrack",name,id).c_str());
243  ibooker.tag(theModMEs.ClusterStoNCorr,id);
244  // Cluster Position
245  short total_nr_strips = SiStripDetCabling_->nApvPairs(id) * 2 * 128;
246  theModMEs.ClusterPos=ibooker.book1D(hidmanager.createHistoId("ClusterPosition_OnTrack",name,id).c_str(),hidmanager.createHistoId("ClusterPosition_OnTrack",name,id).c_str(),total_nr_strips,0.5,total_nr_strips+0.5);
247  ibooker.tag(theModMEs.ClusterPos,id);
248  // Cluster PGV
249  theModMEs.ClusterPGV=bookMEProfile(ibooker , "TProfileClusterPGV", hidmanager.createHistoId("PGV_OnTrack",name,id).c_str());
250  ibooker.tag(theModMEs.ClusterPGV,id);
251  // Cluster Charge per cm
252  theModMEs.ClusterChargePerCMfromTrack = bookME1D(ibooker , "TH1ClusterChargePerCM", hidmanager.createHistoId("ClusterChargePerCMfromTrack",name,id).c_str());
253  ibooker.tag(theModMEs.ClusterChargePerCMfromTrack,id);
254 
255  theModMEs.ClusterChargePerCMfromOrigin = bookME1D(ibooker , "TH1ClusterChargePerCM", hidmanager.createHistoId("ClusterChargePerCMfromOrigin",name,id).c_str());
256  ibooker.tag(theModMEs.ClusterChargePerCMfromOrigin,id);
257 
258  ModMEsMap[hid]=theModMEs;
259  }
260 }
261 
263 
264  MonitorElement* me = NULL;
265  bool view = false;
266  view = (conf_.getParameter<edm::ParameterSet>(histoParameters.c_str())).getParameter<bool>(viewParameter.c_str());
267  if ( id.find("TEC") == std::string::npos && id.find("TID") == std::string::npos ) {
268  me = bookME1D(ibooker , histoParameters.c_str(), histoName.c_str());
269  } else {
270  if (view) {
271  // histoName = histoName + "__" + thickness;
272  me = bookME1D(ibooker , histoParameters.c_str(), histoName.c_str());
273  }
274  }
275  return me;
276 }
277 
278 //
279 // -- Book Layer Level Histograms and Trend plots
280 //
281 //------------------------------------------------------------------------
282 void SiStripMonitorTrack::bookLayerMEs(DQMStore::IBooker & ibooker , const uint32_t mod_id, std::string& layer_id)
283 {
284  std::string name = "layer";
285  std::string view = "layerView";
286  std::string hname;
287  std::string hpar;
288  SiStripHistoId hidmanager;
289 
290  LayerMEs theLayerMEs;
291  theLayerMEs.ClusterStoNCorrOnTrack = 0;
292  theLayerMEs.ClusterChargeCorrOnTrack = 0;
293  theLayerMEs.ClusterChargeOnTrack = 0;
294  theLayerMEs.ClusterChargeOffTrack = 0;
295  theLayerMEs.ClusterNoiseOnTrack = 0;
296  theLayerMEs.ClusterNoiseOffTrack = 0;
297  theLayerMEs.ClusterWidthOnTrack = 0;
298  theLayerMEs.ClusterWidthOffTrack = 0;
299  theLayerMEs.ClusterPosOnTrack = 0;
300  theLayerMEs.ClusterPosOffTrack = 0;
301  theLayerMEs.ClusterChargePerCMfromTrack = 0;
302  theLayerMEs.ClusterChargePerCMfromOriginOnTrack = 0;
303  theLayerMEs.ClusterChargePerCMfromOriginOffTrack = 0;
304 
305  // Signal/Noise (w/ cluster charge corrected)
306  hname = hidmanager.createHistoLayer("Summary_ClusterStoNCorr",name,layer_id,"OnTrack");
307  hpar = "TH1ClusterStoNCorr";
308  theLayerMEs.ClusterStoNCorrOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
309 
310  // Cluster Charge Corrected
311  hname = hidmanager.createHistoLayer("Summary_ClusterChargeCorr",name,layer_id,"OnTrack");
312  hpar = "TH1ClusterChargeCorr";
313  theLayerMEs.ClusterChargeCorrOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
314 
315  // Cluster Charge (On and Off Track)
316  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,layer_id,"OnTrack");
317  hpar = "TH1ClusterCharge";
318  theLayerMEs.ClusterChargeOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
319 
320  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,layer_id,"OffTrack");
321  hpar = "TH1ClusterCharge";
322  theLayerMEs.ClusterChargeOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
323 
324  // Cluster Noise (On and Off Track)
325  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,layer_id,"OnTrack");
326  hpar = "TH1ClusterNoise";
327  theLayerMEs.ClusterNoiseOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
328 
329  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,layer_id,"OffTrack");
330  hpar = "TH1ClusterNoise";
331  theLayerMEs.ClusterNoiseOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
332 
333  // Cluster Width (On and Off Track)
334  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,layer_id,"OnTrack");
335  hpar = "TH1ClusterWidth";
336  theLayerMEs.ClusterWidthOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
337 
338  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,layer_id,"OffTrack");
339  hpar = "TH1ClusterWidth";
340  theLayerMEs.ClusterWidthOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
341 
342  //Cluster Position
343  short total_nr_strips = SiStripDetCabling_->nApvPairs(mod_id) * 2 * 128;
344  if (layer_id.find("TEC") != std::string::npos) total_nr_strips = 3 * 2 * 128;
345 
346  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,layer_id,"OnTrack");
347  theLayerMEs.ClusterPosOnTrack = ibooker.book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
348 
349  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,layer_id,"OffTrack");
350  theLayerMEs.ClusterPosOffTrack = ibooker.book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
351 
352  // dQ/dx
353  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromTrack",name,layer_id,"");
354  hpar = "TH1ClusterChargePerCM";
355  theLayerMEs.ClusterChargePerCMfromTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
356 
357  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,layer_id,"OnTrack");
358  hpar = "TH1ClusterChargePerCM";
359  theLayerMEs.ClusterChargePerCMfromOriginOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
360 
361  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,layer_id,"OffTrack");
362  hpar = "TH1ClusterChargePerCM";
363  theLayerMEs.ClusterChargePerCMfromOriginOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
364 
365  //bookeeping
366  LayerMEsMap[layer_id]=theLayerMEs;
367 
368 }
369 
371 {
372 
373  std::string name = "ring";
374  std::string view = "ringView";
375  std::string hname;
376  std::string hpar;
377  SiStripHistoId hidmanager;
378 
379  RingMEs theRingMEs;
380  theRingMEs.ClusterStoNCorrOnTrack = 0;
381  theRingMEs.ClusterChargeCorrOnTrack = 0;
382  theRingMEs.ClusterChargeOnTrack = 0;
383  theRingMEs.ClusterChargeOffTrack = 0;
384  theRingMEs.ClusterNoiseOnTrack = 0;
385  theRingMEs.ClusterNoiseOffTrack = 0;
386  theRingMEs.ClusterWidthOnTrack = 0;
387  theRingMEs.ClusterWidthOffTrack = 0;
388  theRingMEs.ClusterChargePerCMfromTrack = 0;
391 
392  hname = hidmanager.createHistoLayer("Summary_ClusterStoNCorr",name,ring_id,"OnTrack");
393  hpar = "TH1ClusterStoNCorr";
394  theRingMEs.ClusterStoNCorrOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
395 
396  // Cluster Charge Corrected
397  hname = hidmanager.createHistoLayer("Summary_ClusterChargeCorr",name,ring_id,"OnTrack");
398  hpar = "TH1ClusterChargeCorr";
399  theRingMEs.ClusterChargeCorrOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
400 
401  // Cluster Charge (On and Off Track)
402  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,ring_id,"OnTrack");
403  hpar = "TH1ClusterCharge";
404  theRingMEs.ClusterChargeOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
405 
406  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,ring_id,"OffTrack");
407  hpar = "TH1ClusterCharge";
408  theRingMEs.ClusterChargeOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
409 
410  // Cluster Noise (On and Off Track)
411  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,ring_id,"OnTrack");
412  hpar = "TH1ClusterNoise";
413  theRingMEs.ClusterNoiseOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
414 
415  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,ring_id,"OffTrack");
416  hpar = "TH1ClusterNoise";
417  theRingMEs.ClusterNoiseOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
418 
419  // Cluster Width (On and Off Track)
420  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,ring_id,"OnTrack");
421  hpar = "TH1ClusterWidth";
422  theRingMEs.ClusterWidthOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
423 
424  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,ring_id,"OffTrack");
425  hpar = "TH1ClusterWidth";
426  theRingMEs.ClusterWidthOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
427 
428  // dQ/dx
429  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromTrack",name,ring_id,"");
430  hpar = "TH1ClusterChargePerCM";
431  theRingMEs.ClusterChargePerCMfromTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
432 
433  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,ring_id,"OnTrack");
434  hpar = "TH1ClusterChargePerCM";
435  theRingMEs.ClusterChargePerCMfromOriginOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
436 
437  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,ring_id,"OffTrack");
438  hpar = "TH1ClusterChargePerCM";
439  theRingMEs.ClusterChargePerCMfromOriginOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
440 
441  //bookeeping
442  RingMEsMap[ring_id]=theRingMEs;
443 
444 }
445 //------------------------------------------------------------------------
446 //
447 // -- Book Histograms at Sub-Detector Level
448 //
450 
452  subdet_tag = "__" + name;
453  std::string completeName;
454  std::string axisName;
455 
456  SubDetMEs theSubDetMEs;
457  theSubDetMEs.totNClustersOnTrack = 0;
458  theSubDetMEs.totNClustersOffTrack = 0;
459  theSubDetMEs.nClustersOnTrack = 0;
460  theSubDetMEs.nClustersTrendOnTrack = 0;
461  theSubDetMEs.nClustersOffTrack = 0;
462  theSubDetMEs.nClustersTrendOffTrack = 0;
463  theSubDetMEs.ClusterStoNCorrOnTrack = 0;
464  theSubDetMEs.ClusterChargeOnTrack = 0;
465  theSubDetMEs.ClusterChargeOffTrack = 0;
466  theSubDetMEs.ClusterStoNOffTrack = 0;
467  theSubDetMEs.ClusterChargePerCMfromTrack = 0;
468  theSubDetMEs.ClusterChargePerCMfromOriginOnTrack = 0;
469  theSubDetMEs.ClusterChargePerCMfromOriginOffTrack = 0;
470 
471  // TotalNumber of Cluster OnTrack
472  completeName = "Summary_TotalNumberOfClusters_OnTrack" + subdet_tag;
473  axisName = "Number of on-track clusters in " + name;
474  theSubDetMEs.nClustersOnTrack = bookME1D(ibooker , "TH1nClustersOn", completeName.c_str());
475  theSubDetMEs.nClustersOnTrack->setAxisTitle(axisName.c_str());
476  theSubDetMEs.nClustersOnTrack->getTH1()->StatOverflows(kTRUE);
477 
478  // TotalNumber of Cluster OffTrack
479  completeName = "Summary_TotalNumberOfClusters_OffTrack" + subdet_tag;
480  axisName = "Number of off-track clusters in " + name;
481  theSubDetMEs.nClustersOffTrack = bookME1D(ibooker , "TH1nClustersOff", completeName.c_str());
482  theSubDetMEs.nClustersOffTrack->setAxisTitle(axisName.c_str());
483  theSubDetMEs.nClustersOffTrack->getTH1()->StatOverflows(kTRUE);
484 
485  // Cluster StoN On Track
486  completeName = "Summary_ClusterStoNCorr_OnTrack" + subdet_tag;
487  theSubDetMEs.ClusterStoNCorrOnTrack = bookME1D(ibooker , "TH1ClusterStoNCorr", completeName.c_str());
488 
489  // Cluster Charge On Track
490  completeName = "Summary_ClusterCharge_OnTrack" + subdet_tag;
491  theSubDetMEs.ClusterChargeOnTrack=bookME1D(ibooker , "TH1ClusterCharge", completeName.c_str());
492 
493  // Cluster Charge Off Track
494  completeName = "Summary_ClusterCharge_OffTrack" + subdet_tag;
495  theSubDetMEs.ClusterChargeOffTrack=bookME1D(ibooker , "TH1ClusterCharge", completeName.c_str());
496 
497  // Cluster Charge StoN Off Track
498  completeName = "Summary_ClusterStoN_OffTrack" + subdet_tag;
499  theSubDetMEs.ClusterStoNOffTrack = bookME1D(ibooker , "TH1ClusterStoN", completeName.c_str());
500 
501  // cluster charge per cm on track
502  completeName = "Summary_ClusterChargePerCMfromTrack" + subdet_tag;
503  theSubDetMEs.ClusterChargePerCMfromTrack=bookME1D(ibooker , "TH1ClusterChargePerCM", completeName.c_str());
504 
505  // cluster charge per cm on track
506  completeName = "Summary_ClusterChargePerCMfromOrigin_OnTrack" + subdet_tag;
507  theSubDetMEs.ClusterChargePerCMfromOriginOnTrack=bookME1D(ibooker , "TH1ClusterChargePerCM", completeName.c_str());
508 
509  // cluster charge per cm off track
510  completeName = "Summary_ClusterChargePerCMfromOrigin_OffTrack" + subdet_tag;
511  theSubDetMEs.ClusterChargePerCMfromOriginOffTrack=bookME1D(ibooker , "TH1ClusterChargePerCM", completeName.c_str());
512 
513  if(Trend_On_){
514  // TotalNumber of Cluster
515  completeName = "Trend_TotalNumberOfClusters_OnTrack" + subdet_tag;
516  theSubDetMEs.nClustersTrendOnTrack = bookMETrend(ibooker , completeName.c_str());
517  completeName = "Trend_TotalNumberOfClusters_OffTrack" + subdet_tag;
518  theSubDetMEs.nClustersTrendOffTrack = bookMETrend(ibooker , completeName.c_str());
519  }
520 
521  //bookeeping
522  SubDetMEsMap[name]=theSubDetMEs;
523 
524 }
525 //--------------------------------------------------------------------------------
526 
527 MonitorElement* SiStripMonitorTrack::bookME1D(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
528 {
529  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
530  return ibooker.book1D(HistoName,HistoName,
531  Parameters.getParameter<int32_t>("Nbinx"),
532  Parameters.getParameter<double>("xmin"),
533  Parameters.getParameter<double>("xmax")
534  );
535 }
536 
537 //--------------------------------------------------------------------------------
538 MonitorElement* SiStripMonitorTrack::bookME2D(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
539 {
540  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
541  return ibooker.book2D(HistoName,HistoName,
542  Parameters.getParameter<int32_t>("Nbinx"),
543  Parameters.getParameter<double>("xmin"),
544  Parameters.getParameter<double>("xmax"),
545  Parameters.getParameter<int32_t>("Nbiny"),
546  Parameters.getParameter<double>("ymin"),
547  Parameters.getParameter<double>("ymax")
548  );
549 }
550 
551 //--------------------------------------------------------------------------------
552 MonitorElement* SiStripMonitorTrack::bookME3D(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
553 {
554  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
555  return ibooker.book3D(HistoName,HistoName,
556  Parameters.getParameter<int32_t>("Nbinx"),
557  Parameters.getParameter<double>("xmin"),
558  Parameters.getParameter<double>("xmax"),
559  Parameters.getParameter<int32_t>("Nbiny"),
560  Parameters.getParameter<double>("ymin"),
561  Parameters.getParameter<double>("ymax"),
562  Parameters.getParameter<int32_t>("Nbinz"),
563  Parameters.getParameter<double>("zmin"),
564  Parameters.getParameter<double>("zmax")
565  );
566 }
567 
568 //--------------------------------------------------------------------------------
569 MonitorElement* SiStripMonitorTrack::bookMEProfile(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
570 {
571  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
572  return ibooker.bookProfile(HistoName,HistoName,
573  Parameters.getParameter<int32_t>("Nbinx"),
574  Parameters.getParameter<double>("xmin"),
575  Parameters.getParameter<double>("xmax"),
576  Parameters.getParameter<int32_t>("Nbiny"),
577  Parameters.getParameter<double>("ymin"),
578  Parameters.getParameter<double>("ymax"),
579  "" );
580 }
581 
582 //--------------------------------------------------------------------------------
584 {
585  edm::ParameterSet ParametersTrend = conf_.getParameter<edm::ParameterSet>("Trending");
586  MonitorElement* me = ibooker.bookProfile(HistoName,HistoName,
587  ParametersTrend.getParameter<int32_t>("Nbins"),
588  ParametersTrend.getParameter<double>("xmin"),
589  ParametersTrend.getParameter<double>("xmax"),
590  0 , 0 , "" );
591  if (me->kind() == MonitorElement::DQM_KIND_TPROFILE) me->getTH1()->SetCanExtend(TH1::kAllAxes);
592 
593  if(!me) return me;
594  me->setAxisTitle("Lumisection",1);
595  return me;
596 }
597 
598 //------------------------------------------------------------------------------------------
599 void SiStripMonitorTrack::trajectoryStudy(const edm::Ref<std::vector<Trajectory> > traj, const edm::EventSetup& es) {
600 
601 
602  const std::vector<TrajectoryMeasurement> & measurements = traj->measurements();
603  std::vector<TrajectoryMeasurement>::const_iterator traj_mes_iterator;
604  for(std::vector<TrajectoryMeasurement>::const_iterator traj_mes_iterator= measurements.begin(), traj_mes_end=measurements.end();
605  traj_mes_iterator!=traj_mes_end;traj_mes_iterator++){//loop on measurements
606  //trajectory local direction and position on detector
607  LocalVector statedirection;
608 
609  TrajectoryStateOnSurface updatedtsos=traj_mes_iterator->updatedState();
610  ConstRecHitPointer ttrh=traj_mes_iterator->recHit();
611 
612  if (TkHistoMap_On_ && (numTracks > 0)) {
613  uint32_t thedetid=ttrh->rawId();
614  if ( thedetid > 369120277-1 ) {
615  if ( (ttrh->getType()==1) )
616  tkhisto_NumMissingHits->add(thedetid,static_cast<float>(1./numTracks));
617  if ( (ttrh->getType()==2) )
618  tkhisto_NumberInactiveHits->add(thedetid,static_cast<float>(1./numTracks));
619  if ( (ttrh->getType()==0) )
620  tkhisto_NumberValidHits->add(thedetid,static_cast<float>(1./numTracks));
621  }
622  }
623 
624  if (!ttrh->isValid()) continue;
625 
626  const ProjectedSiStripRecHit2D* projhit = dynamic_cast<const ProjectedSiStripRecHit2D*>( ttrh->hit() );
627  const SiStripMatchedRecHit2D* matchedhit = dynamic_cast<const SiStripMatchedRecHit2D*>( ttrh->hit() );
628  const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*>( ttrh->hit() );
629  const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*>( ttrh->hit() );
630 
631  // RecHitType type=Single;
632 
633  if(matchedhit){
634  LogTrace("SiStripMonitorTrack")<<"\nMatched recHit found"<< std::endl;
635  // type=Matched;
636 
637  GluedGeomDet * gdet=(GluedGeomDet *)tkgeom_->idToDet(matchedhit->geographicalId());
638  GlobalVector gtrkdirup=gdet->toGlobal(updatedtsos.localMomentum());
639  //mono side
640  const GeomDetUnit * monodet=gdet->monoDet();
641  statedirection=monodet->toLocal(gtrkdirup);
642  SiStripRecHit2D m = matchedhit->monoHit();
643  // if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&m,statedirection,trackref,es);
644  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&m,statedirection,es);
645  //stereo side
646  const GeomDetUnit * stereodet=gdet->stereoDet();
647  statedirection=stereodet->toLocal(gtrkdirup);
648  SiStripRecHit2D s = matchedhit->stereoHit();
649  // if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&s,statedirection,trackref,es);
650  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&s,statedirection,es);
651  }
652  else if(projhit){
653  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found"<< std::endl;
654  // type=Projected;
655  GluedGeomDet * gdet=(GluedGeomDet *)tkgeom_->idToDet(projhit->geographicalId());
656 
657  GlobalVector gtrkdirup=gdet->toGlobal(updatedtsos.localMomentum());
658  const SiStripRecHit2D originalhit=projhit->originalHit();
659  const GeomDetUnit * det;
660  if(!StripSubdetector(originalhit.geographicalId().rawId()).stereo()){
661  //mono side
662  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found MONO"<< std::endl;
663  det=gdet->monoDet();
664  statedirection=det->toLocal(gtrkdirup);
665  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,es);
666  }
667  else{
668  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found STEREO"<< std::endl;
669  //stereo side
670  det=gdet->stereoDet();
671  statedirection=det->toLocal(gtrkdirup);
672  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,es);
673  }
674  }else if (hit2D){
675  statedirection=updatedtsos.localMomentum();
676  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(hit2D,statedirection,es);
677  } else if (hit1D) {
678  statedirection=updatedtsos.localMomentum();
679  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit1D>(hit1D,statedirection,es);
680  } else {
681  LogDebug ("SiStripMonitorTrack")
682  << " LocalMomentum: "<<statedirection
683  << "\nLocal x-z plane angle: "<<atan2(statedirection.x(),statedirection.z());
684  }
685 
686  }
687 
688 }
689 //------------------------------------------------------------------------
691  const ProjectedSiStripRecHit2D* projhit,
692  const SiStripMatchedRecHit2D* matchedhit,
693  const SiStripRecHit2D* hit2D,
694  const SiStripRecHit1D* hit1D,
695  LocalVector localMomentum
696  ) {
697  LocalVector statedirection;
698  if(matchedhit){ // type=Matched;
699  LogTrace("SiStripMonitorTrack")<<"\nMatched recHit found"<< std::endl;
700 
701  GluedGeomDet * gdet=(GluedGeomDet *)tkgeom_->idToDet(matchedhit->geographicalId());
702 
703  GlobalVector gtrkdirup=gdet->toGlobal(localMomentum);
704 
705  //mono side
706  const GeomDetUnit * monodet=gdet->monoDet();
707  statedirection=monodet->toLocal(gtrkdirup);
708  SiStripRecHit2D m = matchedhit->monoHit();
709  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&m,statedirection,es);
710 
711  //stereo side
712  const GeomDetUnit * stereodet=gdet->stereoDet();
713  statedirection=stereodet->toLocal(gtrkdirup);
714  SiStripRecHit2D s = matchedhit->stereoHit();
715  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&s,statedirection,es);
716  }
717  else if(projhit){ // type=Projected;
718  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found"<< std::endl;
719 
720  GluedGeomDet * gdet=(GluedGeomDet *)tkgeom_->idToDet(projhit->geographicalId());
721 
722  GlobalVector gtrkdirup=gdet->toGlobal(localMomentum);
723  const SiStripRecHit2D originalhit=projhit->originalHit();
724 
725  const GeomDetUnit * det;
726  if(!StripSubdetector(originalhit.geographicalId().rawId()).stereo()){
727  //mono side
728  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found MONO"<< std::endl;
729  det=gdet->monoDet();
730  statedirection=det->toLocal(gtrkdirup);
731  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,es);
732  }
733  else{
734  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found STEREO"<< std::endl;
735  //stereo side
736  det=gdet->stereoDet();
737  statedirection=det->toLocal(gtrkdirup);
738  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,es);
739  }
740  } else if (hit2D){ // type=2D
741  statedirection=localMomentum;
742  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(hit2D,statedirection,es);
743  } else if (hit1D) { // type=1D
744  statedirection=localMomentum;
745  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit1D>(hit1D,statedirection,es);
746  } else {
747  LogDebug ("SiStripMonitorTrack")
748  << " LocalMomentum: "<<statedirection
749  << "\nLocal x-z plane angle: "<<atan2(statedirection.x(),statedirection.z());
750  }
751 
752 }
753 //------------------------------------------------------------------------
755 
756 using namespace std;
757 using namespace edm;
758 using namespace reco;
759 
760  // trajectory input
761  edm::Handle<TrajTrackAssociationCollection> TItkAssociatorCollection;
762  ev.getByToken(trackTrajToken_, TItkAssociatorCollection);
763  if( TItkAssociatorCollection.isValid()){
764  trackStudyFromTrajectory(TItkAssociatorCollection,es);
765  } else {
766  edm::LogError("SiStripMonitorTrack")<<"Association not found ... try w/ track collection"<<std::endl;
767 
768  // edm::Handle<std::vector<Trajectory> > trajectories;
769  // ev.getByToken(trajectoryToken_, trajectories);
770 
771  // track input
772  edm::Handle<reco::TrackCollection > trackCollectionHandle;
773  ev.getByToken(trackToken_, trackCollectionHandle);//takes the track collection
774  if (!trackCollectionHandle.isValid()){
775  edm::LogError("SiStripMonitorTrack")<<"also Track Collection is not valid !! " << TrackLabel_<<std::endl;
776  return;
777  } else {
778  trackStudyFromTrack(trackCollectionHandle,es);
779  }
780  }
781 
782 }
783 //------------------------------------------------------------------------
785 
786  // edm::ESHandle<TransientTrackBuilder> builder;
787  // es.get<TransientTrackRecord>().get("TransientTrackBuilder",builder);
788  // const TransientTrackBuilder* transientTrackBuilder = builder.product();
789  numTracks = trackCollectionHandle->size();
790  reco::TrackCollection trackCollection = *trackCollectionHandle;
791  for (reco::TrackCollection::const_iterator track = trackCollection.begin(), etrack = trackCollection.end();
792  track!=etrack; ++track) {
793 
794  // const reco::TransientTrack transientTrack = transientTrackBuilder->build(track);
795 
796 
797  for (trackingRecHit_iterator hit = track->recHitsBegin(), ehit = track->recHitsEnd();
798  hit!=ehit; ++hit) {
799 
800  if (TkHistoMap_On_ && (numTracks > 0)) {
801  uint32_t thedetid=(*hit)->rawId();
802  if ( thedetid > 369120277-1 ) {
803  if ( ((*hit)->getType()==1) )
804  tkhisto_NumMissingHits->add(thedetid,static_cast<float>(1./numTracks));
805  if ( ((*hit)->getType()==2) )
806  tkhisto_NumberInactiveHits->add(thedetid,static_cast<float>(1./numTracks));
807  if ( ((*hit)->getType()==0) )
808  tkhisto_NumberValidHits->add(thedetid,static_cast<float>(1./numTracks));
809  }
810  }
811 
812  if (!(*hit)->isValid()) continue;
813  DetId detID = (*hit)->geographicalId();
814  if (detID.det() != DetId::Tracker) continue;
815  const TrackingRecHit* theHit = (*hit);
816  const ProjectedSiStripRecHit2D* projhit = dynamic_cast<const ProjectedSiStripRecHit2D*>( (theHit) );
817  const SiStripMatchedRecHit2D* matchedhit = dynamic_cast<const SiStripMatchedRecHit2D*> ( (theHit) );
818  const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*> ( (theHit) );
819  const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*> ( (theHit) );
820 
821  // GlobalPoint globalPoint = hit->globalPosition();
822  // reco::TrajectoryStateOnSurface stateOnSurface = transientTrack->stateOnSurface(globalPoint);
823 
824  LocalVector localMomentum;
825  hitStudy(es,projhit,matchedhit,hit2D,hit1D,localMomentum);
826  }
827 
828 
829 
830  // hit pattern of the track
831  const reco::HitPattern & hitsPattern = track->hitPattern();
832  // loop over the hits of the track
833  // for (int i=0; i<hitsPattern.numberOfHits(); i++) {
834  for (int i=0; i<hitsPattern.numberOfHits(reco::HitPattern::TRACK_HITS); i++) {
835  uint32_t hit = hitsPattern.getHitPattern(reco::HitPattern::TRACK_HITS,i);
836 
837  // if the hit is valid and in pixel barrel, print out the layer
838  if (hitsPattern.validHitFilter(hit) && hitsPattern.pixelBarrelHitFilter(hit))
839 
840  if (!hitsPattern.validHitFilter(hit)) continue;
841 // if (hitsPattern.pixelHitFilter(hit)) std::cout << "pixel" << std::endl; // pixel
842 // if (hitsPattern.pixelBarrelHitFilter(hit)) std::cout << "pixel barrel" << std::endl; // pixel barrel
843 // if (hitsPattern.pixelEndcapHitFilter(hit)) std::cout << "pixel endcap" << std::endl; // pixel endcap
844 // if (hitsPattern.stripHitFilter(hit)) std::cout << "strip" << std::endl; // strip
845 // if (hitsPattern.stripTIBHitFilter(hit)) std::cout << "TIB" << std::endl; // strip TIB
846 // if (hitsPattern.stripTIDHitFilter(hit)) std::cout << "TID" << std::endl; // strip TID
847 // if (hitsPattern.stripTOBHitFilter(hit)) std::cout << "TOB" << std::endl; // strip TOB
848 // if (hitsPattern.stripTECHitFilter(hit)) std::cout << "TEC" << std::endl; // strip TEC
849 // if (hitsPattern.muonDTHitFilter(hit)) std::cout << "DT" << std::endl; // muon DT
850 // if (hitsPattern.muonCSCHitFilter(hit)) std::cout << "CSC" << std::endl; // muon CSC
851 // if (hitsPattern.muonRPCHitFilter(hit)) std::cout << "RPC" << std::endl; // muon RPC
852 //
853 // // expert level: printout the hit in 10-bit binary format
854 // std::cout << "hit in 10-bit binary format = ";
855 // for (int j=9; j>=0; j--) {
856 // int bit = (hit >> j) & 0x1;
857 // std::cout << bit;
858 // }
859 // std::cout << std::endl;
860  }
861  }
862 }
863 //------------------------------------------------------------------------
865  //Perform track study
866  numTracks = TItkAssociatorCollection->size();
867  int i=0;
868  for(TrajTrackAssociationCollection::const_iterator it = TItkAssociatorCollection->begin();it != TItkAssociatorCollection->end(); ++it){
869  const edm::Ref<std::vector<Trajectory> > traj_iterator = it->key;
870 
871  // Trajectory Map, extract Trajectory for this track
872  reco::TrackRef trackref = it->val;
873  LogDebug("SiStripMonitorTrack")
874  << "Track number "<< i+1 << std::endl;
875  // << "\n\tmomentum: " << trackref->momentum()
876  // << "\n\tPT: " << trackref->pt()
877  // << "\n\tvertex: " << trackref->vertex()
878  // << "\n\timpact parameter: " << trackref->d0()
879  // << "\n\tcharge: " << trackref->charge()
880  // << "\n\tnormalizedChi2: " << trackref->normalizedChi2()
881  // <<"\n\tFrom EXTRA : "
882  // <<"\n\t\touter PT "<< trackref->outerPt()<<std::endl;
883  i++;
884 
885  // trajectoryStudy(traj_iterator,trackref,es);
886  trajectoryStudy(traj_iterator,es);
887 
888  }
889 }
890 //------------------------------------------------------------------------
891 template <class T> void SiStripMonitorTrack::RecHitInfo(const T* tkrecHit, LocalVector LV, const edm::EventSetup& es){
892 
893  if(!tkrecHit->isValid()){
894  LogTrace("SiStripMonitorTrack") <<"\t\t Invalid Hit " << std::endl;
895  return;
896  }
897 
898  const uint32_t& detid = tkrecHit->geographicalId().rawId();
899 
900  LogTrace("SiStripMonitorTrack")
901  <<"\n\t\tRecHit on det "<<tkrecHit->geographicalId().rawId()
902  <<"\n\t\tRecHit in LP "<<tkrecHit->localPosition()
903  <<"\n\t\tRecHit in GP "<<tkgeom_->idToDet(tkrecHit->geographicalId())->surface().toGlobal(tkrecHit->localPosition())
904  <<"\n\t\tRecHit trackLocal vector "<<LV.x() << " " << LV.y() << " " << LV.z() <<std::endl;
905 
906 
907  //Retrieve tracker topology from geometry
908  edm::ESHandle<TrackerTopology> tTopoHandle;
909  es.get<TrackerTopologyRcd>().get(tTopoHandle);
910  const TrackerTopology* const tTopo = tTopoHandle.product();
911 
912  //Get SiStripCluster from SiStripRecHit
913  if ( tkrecHit != NULL ){
914  const SiStripCluster* SiStripCluster_ = &*(tkrecHit->cluster());
915  SiStripClusterInfo SiStripClusterInfo_(*SiStripCluster_,es,detid);
916 
917  const Det2MEs MEs = findMEs(tTopo, detid);
918  if (clusterInfos(&SiStripClusterInfo_,detid, OnTrack, LV, MEs))
919  {
920  vPSiStripCluster.insert(SiStripCluster_);
921  }
922  }
923  else
924  {
925  edm::LogError("SiStripMonitorTrack") << "NULL hit" << std::endl;
926  }
927  }
928 
929 //------------------------------------------------------------------------
931 {
932 
933  //Retrieve tracker topology from geometry
934  edm::ESHandle<TrackerTopology> tTopoHandle;
935  es.get<TrackerTopologyRcd>().get(tTopoHandle);
936  const TrackerTopology* const tTopo = tTopoHandle.product();
937 
939  ev.getByToken( clusterToken_, siStripClusterHandle);
940  if (!siStripClusterHandle.isValid()){
941  edm::LogError("SiStripMonitorTrack")<< "ClusterCollection is not valid!!" << std::endl;
942  return;
943  }
944  else
945  {
946  //Loop on Dets
947  for (edmNew::DetSetVector<SiStripCluster>::const_iterator DSViter=siStripClusterHandle->begin();
948  DSViter!=siStripClusterHandle->end();
949  DSViter++)
950  {
951  uint32_t detid=DSViter->id();
952  const Det2MEs MEs = findMEs(tTopo, detid);
953 
954  LogDebug("SiStripMonitorTrack") << "on detid "<< detid << " N Cluster= " << DSViter->size();
955 
956  //Loop on Clusters
958  ClusIter!=DSViter->end();
959  ClusIter++)
960  {
961  if (vPSiStripCluster.find(&*ClusIter) == vPSiStripCluster.end())
962  {
963  SiStripClusterInfo SiStripClusterInfo_(*ClusIter,es,detid);
964  clusterInfos(&SiStripClusterInfo_,detid,OffTrack,LV,MEs);
965  }
966  }
967  }
968  }
969 }
970 
971 //------------------------------------------------------------------------
973  SiStripHistoId hidmanager1;
974 
975  std::string layer_id = hidmanager1.getSubdetid(detid, tTopo, false);
976  std::string ring_id = hidmanager1.getSubdetid(detid, tTopo, true);
977  std::string sdet_tag = folderOrganizer_.getSubDetFolderAndTag(detid, tTopo).second;
978 
979  Det2MEs me;
980  me.iLayer = nullptr;
981  me.iRing = nullptr;
982  me.iSubdet = nullptr;
983 
984  std::map<std::string, LayerMEs>::iterator iLayer = LayerMEsMap.find(layer_id);
985  if (iLayer != LayerMEsMap.end()) {
986  me.iLayer = &(iLayer->second);
987  }
988 
989  std::map<std::string, RingMEs>::iterator iRing = RingMEsMap.find(ring_id);
990  if (iRing != RingMEsMap.end()) {
991  me.iRing = &(iRing->second);
992  }
993 
994  std::map<std::string, SubDetMEs>::iterator iSubdet = SubDetMEsMap.find(sdet_tag);
995  if (iSubdet != SubDetMEsMap.end()) {
996  me.iSubdet = &(iSubdet->second);
997  }
998 
999  return me;
1000 }
1001 
1002 //------------------------------------------------------------------------
1003 bool SiStripMonitorTrack::clusterInfos(SiStripClusterInfo* cluster, const uint32_t detid, enum ClusterFlags flag, const LocalVector LV, const Det2MEs& MEs)
1004 {
1005 
1006  if (cluster==NULL) return false;
1007  // if one imposes a cut on the clusters, apply it
1008  if( (applyClusterQuality_) &&
1009  (cluster->signalOverNoise() < sToNLowerLimit_ ||
1010  cluster->signalOverNoise() > sToNUpperLimit_ ||
1011  cluster->width() < widthLowerLimit_ ||
1012  cluster->width() > widthUpperLimit_) ) return false;
1013  // start of the analysis
1014 
1015  if (MEs.iSubdet != nullptr) {
1016  if (flag == OnTrack) MEs.iSubdet->totNClustersOnTrack++;
1017  else if (flag == OffTrack) MEs.iSubdet->totNClustersOffTrack++;
1018  }
1019 
1020  float cosRZ = -2;
1021  LogDebug("SiStripMonitorTrack")<< "\n\tLV " << LV.x() << " " << LV.y() << " " << LV.z() << " " << LV.mag() << std::endl;
1022  if (LV.mag()!=0){
1023  cosRZ= fabs(LV.z())/LV.mag();
1024  LogDebug("SiStripMonitorTrack")<< "\n\t cosRZ " << cosRZ << std::endl;
1025  }
1026  std::string name;
1027 
1028  // Filling SubDet/Layer Plots (on Track + off Track)
1029  fillMEs(cluster,detid,cosRZ,flag,LV,MEs);
1030 
1031  //******** TkHistoMaps
1032  if (TkHistoMap_On_) {
1033  uint32_t adet=cluster->detId();
1034  float noise = cluster->noiseRescaledByGain();
1035  if(flag==OnTrack){
1036  tkhisto_NumOnTrack->add(adet,1.);
1037  if(noise > 0.0) tkhisto_StoNCorrOnTrack->fill(adet,cluster->signalOverNoise()*cosRZ);
1038  if(noise == 0.0)
1039  LogDebug("SiStripMonitorTrack") << "Module " << detid << " in Event " << eventNb << " noise " << noise << std::endl;
1040  }
1041  else if(flag==OffTrack){
1042  tkhisto_NumOffTrack->add(adet,1.);
1043  if(cluster->charge() > 250){
1044  LogDebug("SiStripMonitorTrack") << "Module firing " << detid << " in Event " << eventNb << std::endl;
1045  }
1046  }
1047  }
1048 
1049  // Module plots filled only for onTrack Clusters
1050  if(Mod_On_){
1051  if(flag==OnTrack){
1052  SiStripHistoId hidmanager2;
1053  name =hidmanager2.createHistoId("","det",detid);
1054  fillModMEs(cluster,name,cosRZ,detid,LV);
1055  }
1056  }
1057  return true;
1058 }
1060 //--------------------------------------------------------------------------------
1062 {
1063  std::map<std::string, ModMEs>::iterator iModME = ModMEsMap.find(name);
1064  if(iModME!=ModMEsMap.end()){
1065 
1066  float StoN = cluster->signalOverNoise();
1067  uint16_t charge = cluster->charge();
1068  uint16_t width = cluster->width();
1069  float position = cluster->baryStrip();
1070 
1071  // new dE/dx (chargePerCM)
1072  // https://indico.cern.ch/event/342236/session/5/contribution/10/material/slides/0.pdf
1073  float dQdx_fromTrack = siStripClusterTools::chargePerCM(detid, *cluster, LV);
1074  // from straigth line origin-sensor centre
1075  const StripGeomDetUnit* DetUnit = (const StripGeomDetUnit*) tkgeom_->idToDetUnit(DetId(detid));
1076  LocalPoint locVtx = DetUnit->toLocal(GlobalPoint(0.0, 0.0, 0.0));
1077  LocalVector locDir(locVtx.x(), locVtx.y(), locVtx.z());
1078  float dQdx_fromOrigin = siStripClusterTools::chargePerCM(detid, *cluster, locDir);
1079 
1080  float noise = cluster->noiseRescaledByGain();
1081  if(noise > 0.0) fillME(iModME->second.ClusterStoNCorr ,StoN*cos);
1082  if(noise == 0.0) LogDebug("SiStripMonitorTrack") << "Module " << name << " in Event " << eventNb << " noise " << noise << std::endl;
1083  fillME(iModME->second.ClusterCharge,charge);
1084 
1085  fillME(iModME->second.ClusterChargeCorr,charge*cos);
1086 
1087  fillME(iModME->second.ClusterWidth ,width);
1088  fillME(iModME->second.ClusterPos ,position);
1089 
1090  fillME(iModME->second.ClusterChargePerCMfromTrack, dQdx_fromTrack);
1091  fillME(iModME->second.ClusterChargePerCMfromOrigin, dQdx_fromOrigin);
1092 
1093  //fill the PGV histo
1094  float PGVmax = cluster->maxCharge();
1095  int PGVposCounter = cluster->maxIndex();
1096  for (int i= int(conf_.getParameter<edm::ParameterSet>("TProfileClusterPGV").getParameter<double>("xmin"));i<PGVposCounter;++i)
1097  fillME(iModME->second.ClusterPGV, i,0.);
1098  for (auto it=cluster->stripCharges().begin();it<cluster->stripCharges().end();++it) {
1099  fillME(iModME->second.ClusterPGV, PGVposCounter++,(*it)/PGVmax);
1100  }
1101  for (int i= PGVposCounter;i<int(conf_.getParameter<edm::ParameterSet>("TProfileClusterPGV").getParameter<double>("xmax"));++i)
1102  fillME(iModME->second.ClusterPGV, i,0.);
1103  //end fill the PGV histo
1104  }
1105 }
1106 
1107 
1108 //------------------------------------------------------------------------
1109 void SiStripMonitorTrack::fillMEs(SiStripClusterInfo* cluster, const uint32_t detid, float cos, enum ClusterFlags flag, const LocalVector LV, const Det2MEs& MEs)
1110 {
1111  float StoN = cluster->signalOverNoise();
1112  float noise = cluster->noiseRescaledByGain();
1113  uint16_t charge = cluster->charge();
1114  uint16_t width = cluster->width();
1115  float position = cluster->baryStrip();
1116 
1117  // new dE/dx (chargePerCM)
1118  // https://indico.cern.ch/event/342236/session/5/contribution/10/material/slides/0.pdf
1119  float dQdx_fromTrack = siStripClusterTools::chargePerCM(detid, *cluster, LV);
1120  // from straigth line origin-sensor centre
1121  const StripGeomDetUnit* DetUnit = (const StripGeomDetUnit*) tkgeom_->idToDetUnit(DetId(detid));
1122  LocalPoint locVtx = DetUnit->toLocal(GlobalPoint(0.0, 0.0, 0.0));
1123  LocalVector locDir(locVtx.x(), locVtx.y(), locVtx.z());
1124  float dQdx_fromOrigin = siStripClusterTools::chargePerCM(detid, *cluster, locDir);
1125 
1126  if (TkHistoMap_On_ && (flag == OnTrack)) {
1127  uint32_t adet=cluster->detId();
1128  tkhisto_ClChPerCMfromTrack->fill(adet,dQdx_fromTrack);
1129  }
1130  if (clchCMoriginTkHmap_On_ && (flag == OffTrack)){
1131  uint32_t adet=cluster->detId();
1132  tkhisto_ClChPerCMfromOrigin->fill(adet,dQdx_fromOrigin);
1133  }
1134 
1135  // layerMEs
1136  if (MEs.iLayer != nullptr) {
1137  if(flag==OnTrack){
1138  if(noise > 0.0) fillME(MEs.iLayer->ClusterStoNCorrOnTrack, StoN*cos);
1139  if(noise == 0.0) LogDebug("SiStripMonitorTrack") << "Module " << detid << " in Event " << eventNb << " noise " << cluster->noiseRescaledByGain() << std::endl;
1140  fillME(MEs.iLayer->ClusterChargeCorrOnTrack, charge*cos);
1141  fillME(MEs.iLayer->ClusterChargeOnTrack, charge);
1142  fillME(MEs.iLayer->ClusterNoiseOnTrack, noise);
1143  fillME(MEs.iLayer->ClusterWidthOnTrack, width);
1144  fillME(MEs.iLayer->ClusterPosOnTrack, position);
1145  fillME(MEs.iLayer->ClusterChargePerCMfromTrack, dQdx_fromTrack);
1146  fillME(MEs.iLayer->ClusterChargePerCMfromOriginOnTrack, dQdx_fromOrigin);
1147  } else {
1148  fillME(MEs.iLayer->ClusterChargeOffTrack, charge);
1149  fillME(MEs.iLayer->ClusterNoiseOffTrack, noise);
1150  fillME(MEs.iLayer->ClusterWidthOffTrack, width);
1151  fillME(MEs.iLayer->ClusterPosOffTrack, position);
1152  fillME(MEs.iLayer->ClusterChargePerCMfromOriginOffTrack, dQdx_fromOrigin);
1153  }
1154  }
1155 
1156  // ringMEs
1157  if (MEs.iRing != nullptr) {
1158  if(flag==OnTrack){
1159  if(noise > 0.0) fillME(MEs.iRing->ClusterStoNCorrOnTrack, StoN*cos);
1160  if(noise == 0.0) LogDebug("SiStripMonitorTrack") << "Module " << detid << " in Event " << eventNb << " noise " << cluster->noiseRescaledByGain() << std::endl;
1161  fillME(MEs.iRing->ClusterChargeCorrOnTrack, charge*cos);
1162  fillME(MEs.iRing->ClusterChargeOnTrack, charge);
1163  fillME(MEs.iRing->ClusterNoiseOnTrack, noise);
1164  fillME(MEs.iRing->ClusterWidthOnTrack, width);
1165  fillME(MEs.iRing->ClusterChargePerCMfromTrack, dQdx_fromTrack);
1166  fillME(MEs.iRing->ClusterChargePerCMfromOriginOnTrack, dQdx_fromOrigin);
1167  } else {
1168  fillME(MEs.iRing->ClusterChargeOffTrack, charge);
1169  fillME(MEs.iRing->ClusterNoiseOffTrack, noise);
1170  fillME(MEs.iRing->ClusterWidthOffTrack, width);
1171  fillME(MEs.iRing->ClusterChargePerCMfromOriginOffTrack, dQdx_fromOrigin);
1172  }
1173  }
1174  // subdetMEs
1175  if(MEs.iSubdet != nullptr){
1176  if(flag==OnTrack){
1177  fillME(MEs.iSubdet->ClusterChargeOnTrack,charge);
1178  if(noise > 0.0) fillME(MEs.iSubdet->ClusterStoNCorrOnTrack,StoN*cos);
1179  fillME(MEs.iSubdet->ClusterChargePerCMfromTrack,dQdx_fromTrack);
1180  fillME(MEs.iSubdet->ClusterChargePerCMfromOriginOnTrack,dQdx_fromOrigin);
1181  } else {
1182  fillME(MEs.iSubdet->ClusterChargeOffTrack,charge);
1183  if(noise > 0.0) fillME(MEs.iSubdet->ClusterStoNOffTrack,StoN);
1184  fillME(MEs.iSubdet->ClusterChargePerCMfromOriginOffTrack,dQdx_fromOrigin);
1185  }
1186  }
1187 }
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:39
uint8_t maxCharge() const
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
Det2MEs findMEs(const TrackerTopology *tTopo, const uint32_t detid)
int i
Definition: DBlmapReader.cc:9
MonitorElement * ClusterChargePerCMfromTrack
void fillMEs(SiStripClusterInfo *, const uint32_t detid, float, enum ClusterFlags, const LocalVector LV, const Det2MEs &MEs)
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
TkHistoMap * tkhisto_NumOffTrack
SiStripMonitorTrack(const edm::ParameterSet &)
void setSiStripFolderName(std::string name)
virtual void analyze(const edm::Event &, const edm::EventSetup &)
void trackStudy(const edm::Event &ev, const edm::EventSetup &es)
void trackStudyFromTrack(edm::Handle< reco::TrackCollection > trackCollectionHandle, const edm::EventSetup &es)
edm::EDGetTokenT< reco::TrackCollection > trackToken_
void trackStudyFromTrajectory(edm::Handle< TrajTrackAssociationCollection > TItkAssociatorCollection, const edm::EventSetup &es)
const GeomDetUnit * monoDet() const
Definition: GluedGeomDet.h:20
void fillME(MonitorElement *ME, float value1)
std::pair< const std::string, const char * > getSubDetFolderAndTag(const uint32_t &detid, const TrackerTopology *tTopo)
SiStripDCSStatus * dcsStatus_
MonitorElement * bookProfile(Args &&...args)
Definition: DQMStore.h:157
void hitStudy(const edm::EventSetup &es, const ProjectedSiStripRecHit2D *projhit, const SiStripMatchedRecHit2D *matchedhit, const SiStripRecHit2D *hit2D, const SiStripRecHit1D *hit1D, LocalVector localMomentum)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
float noiseRescaledByGain() const
void book(DQMStore::IBooker &, const TrackerTopology *tTopo)
void AllClusters(const edm::Event &ev, const edm::EventSetup &es)
std::map< std::string, RingMEs > RingMEsMap
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:52
float chargePerCM(DetId detid, Iter a, Iter b)
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
float baryStrip() const
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:13
edm::ParameterSet conf_
T y() const
Definition: PV3DBase.h:63
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:67
std::pair< std::string, int32_t > GetSubDetAndLayer(const uint32_t &detid, const TrackerTopology *tTopo, bool ring_flag=0)
MonitorElement * bookME1D(DQMStore::IBooker &, const char *, const char *)
#define NULL
Definition: scimark2.h:8
MonitorElement * ClusterChargePerCMfromTrack
bool ev
MonitorElement * ClusterChargeCorrOnTrack
Provides a code based selection for trigger and DCS information in order to have no failing filters i...
data_type const * const_iterator
Definition: DetSetNew.h:30
key_type key() const
Accessor for product key.
Definition: Ref.h:264
edm::ESHandle< SiStripDetCabling > SiStripDetCabling_
void bookLayerMEs(DQMStore::IBooker &, const uint32_t, std::string &)
uint16_t maxIndex() const
void trajectoryStudy(const edm::Ref< std::vector< Trajectory > > traj, const edm::EventSetup &es)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
static bool pixelBarrelHitFilter(uint16_t pattern)
Definition: HitPattern.h:516
MonitorElement * ClusterChargePerCMfromOriginOffTrack
auto stripCharges() const -> decltype(cluster() ->amplitudes())
void setDetectorFolder(uint32_t rawdetid, const TrackerTopology *tTopo)
static bool validHitFilter(uint16_t pattern)
Definition: HitPattern.h:698
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
LocalVector localMomentum() const
edm::ESHandle< TrackerGeometry > tkgeom_
bool getStatus(edm::Event const &e, edm::EventSetup const &eSetup)
edmNew::DetSet< SiStripCluster >::const_iterator ClusIter
math::XYZTLorentzVectorD LV
float signalOverNoise() const
T mag() const
Definition: PV3DBase.h:67
vector< ParameterSet > Parameters
edm::EventNumber_t eventNb
uint16_t hitPattern[ARRAY_LENGTH]
Definition: HitPattern.h:418
TrackingRecHit::ConstRecHitPointer ConstRecHitPointer
uint16_t charge() const
std::unordered_set< const SiStripCluster * > vPSiStripCluster
std::map< std::string, SubDetMEs > SubDetMEsMap
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
void fill(uint32_t &detid, float value)
Definition: TkHistoMap.cc:180
bool accept(const edm::Event &event, const edm::EventSetup &setup)
To be called from analyze/filter() methods.
const std::string subdet_tag("SubDet")
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
MonitorElement * bookME2D(DQMStore::IBooker &, const char *, const char *)
uint16_t width() const
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
void tag(MonitorElement *, unsigned int)
Definition: DQMStore.cc:286
TH1 * getTH1(void) const
void bookSubDetMEs(DQMStore::IBooker &, std::string &name)
MonitorElement * bookME3D(DQMStore::IBooker &, const char *, const char *)
int orbitNumber() const
Definition: EventBase.h:67
MonitorElement * ClusterChargePerCMfromOrigin
MonitorElement * ClusterChargePerCMfromOriginOffTrack
SiStripFolderOrganizer folderOrganizer_
std::string getSubdetid(uint32_t id, const TrackerTopology *tTopo, bool flag_ring)
MonitorElement * ClusterChargePerCMfromTrack
bool isValid() const
Definition: HandleBase.h:75
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
#define LogTrace(id)
tuple conf
Definition: dbtoconf.py:185
SiStripRecHit2D originalHit() const
Definition: DetId.h:18
edm::EDGetTokenT< TrajTrackAssociationCollection > trackTrajToken_
void bookModMEs(DQMStore::IBooker &, const uint32_t)
TkHistoMap * tkhisto_NumberInactiveHits
void setLayerFolder(uint32_t rawdetid, const TrackerTopology *tTopo, int32_t layer=0, bool ring_flag=0)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:274
TkHistoMap * tkhisto_ClChPerCMfromOrigin
SiStripRecHit2D stereoHit() const
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
std::string createHistoId(std::string description, std::string id_type, uint32_t component_id)
MonitorElement * ClusterChargePerCMfromTrack
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:86
void dqmBeginRun(const edm::Run &run, const edm::EventSetup &es)
std::map< std::string, ModMEs > ModMEsMap
MonitorElement * bookMETrend(DQMStore::IBooker &, const char *)
TkHistoMap * tkhisto_ClChPerCMfromTrack
std::string HistoName
TkHistoMap * tkhisto_NumOnTrack
SiStripRecHit2D monoHit() const
uint32_t detId() const
GenericTriggerEventFlag * genTriggerEventFlag_
void RecHitInfo(const T *tkrecHit, LocalVector LV, const edm::EventSetup &)
MonitorElement * ClusterChargePerCMfromOriginOnTrack
edm::EventID id() const
Definition: EventBase.h:60
MonitorElement * handleBookMEs(DQMStore::IBooker &, std::string &, std::string &, std::string &, std::string &)
static int position[264][3]
Definition: ReadPGInfo.cc:509
MonitorElement * bookMEProfile(DQMStore::IBooker &, const char *, const char *)
TkHistoMap * tkhisto_StoNCorrOnTrack
DetId geographicalId() const
void initRun(const edm::Run &run, const edm::EventSetup &setup)
To be called from beginRun() methods.
MonitorElement * ClusterChargePerCMfromOriginOnTrack
bool clusterInfos(SiStripClusterInfo *cluster, const uint32_t detid, enum ClusterFlags flags, LocalVector LV, const Det2MEs &MEs)
std::string createHistoLayer(std::string description, std::string id_type, std::string path, std::string flag)
uint16_t getHitPattern(HitCategory category, int position) const
Definition: HitPattern.h:456
void fillModMEs(SiStripClusterInfo *cluster, std::string name, float cos, const uint32_t detid, const LocalVector LV)
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
MonitorElement * book3D(Args &&...args)
Definition: DQMStore.h:151
long double T
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)
void bookRingMEs(DQMStore::IBooker &, const uint32_t, std::string &)
MonitorElement * ClusterChargePerCMfromOriginOnTrack
TkHistoMap * tkhisto_NumMissingHits
void add(uint32_t &detid, float value)
Definition: TkHistoMap.cc:213
TkHistoMap * tkhisto_NumberValidHits
const GeomDetUnit * stereoDet() const
Definition: GluedGeomDet.h:21
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
Definition: Run.h:41
int numberOfHits(HitCategory category) const
Definition: HitPattern.h:718
edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > clusterToken_
std::map< std::string, LayerMEs > LayerMEsMap
MonitorElement * ClusterChargePerCMfromOriginOffTrack