CMS 3D CMS Logo

SiStripMonitorTrack.cc
Go to the documentation of this file.
2 
6 
20 
23 
25 #include "TMath.h"
26 
28  conf_(conf),
29  tracksCollection_in_EventTree(true),
30  firstEvent(-1),
31  genTriggerEventFlag_(new GenericTriggerEventFlag(conf.getParameter<edm::ParameterSet>("genericTriggerEventPSet"), consumesCollector(), *this))
32 {
33  Cluster_src_ = conf.getParameter<edm::InputTag>("Cluster_src");
34  Mod_On_ = conf.getParameter<bool>("Mod_On");
35  Trend_On_ = conf.getParameter<bool>("Trend_On");
36  TkHistoMap_On_ = conf.getParameter<bool>("TkHistoMap_On");
37  clchCMoriginTkHmap_On_ = conf.getParameter<bool>("clchCMoriginTkHmap_On");
38 
39  TrackProducer_ = conf_.getParameter<std::string>("TrackProducer");
40  TrackLabel_ = conf_.getParameter<std::string>("TrackLabel");
41 
42  topFolderName_ = conf_.getParameter<std::string>("TopFolderName");
43 
44  digiToken_ = consumes<edm::DetSetVector<SiStripDigi>> ( conf.getParameter<edm::InputTag>("ADCDigi_src") );
45  clusterToken_ = consumes<edmNew::DetSetVector<SiStripCluster> >(Cluster_src_);
46  trackToken_ = consumes<reco::TrackCollection>(edm::InputTag(TrackProducer_,TrackLabel_) );
47 
48  // cluster quality conditions
49  edm::ParameterSet cluster_condition = conf_.getParameter<edm::ParameterSet>("ClusterConditions");
50  applyClusterQuality_ = cluster_condition.getParameter<bool>("On");
51  sToNLowerLimit_ = cluster_condition.getParameter<double>("minStoN");
52  sToNUpperLimit_ = cluster_condition.getParameter<double>("maxStoN");
53  widthLowerLimit_ = cluster_condition.getParameter<double>("minWidth");
54  widthUpperLimit_ = cluster_condition.getParameter<double>("maxWidth");
55 
56 
57  // Create DCS Status
58  bool checkDCS = conf_.getParameter<bool>("UseDCSFiltering");
59  if (checkDCS) dcsStatus_ = new SiStripDCSStatus(consumesCollector());
60  else dcsStatus_ = 0;
61 }
62 
63 //------------------------------------------------------------------------
65  if (dcsStatus_) delete dcsStatus_;
67 }
68 
69 //------------------------------------------------------------------------
71 {
72  //get geom
74  LogDebug("SiStripMonitorTrack") << "[SiStripMonitorTrack::beginRun] There are "<<tkgeom_->detUnits().size() <<" detectors instantiated in the geometry" << std::endl;
76 
77 
78  // Initialize the GenericTriggerEventFlag
80 }
81 
82 //------------------------------------------------------------------------
84 {
85  //Retrieve tracker topology from geometry
87  es.get<TrackerTopologyRcd>().get(tTopoHandle);
88  const TrackerTopology* const tTopo = tTopoHandle.product();
89  book(ibooker , tTopo);
90 }
91 
92 // ------------ method called to produce the data ------------
94 {
95  // Filter out events if DCS checking is requested
96  if (dcsStatus_ && !dcsStatus_->getStatus(e,es)) return;
97 
98  // Filter out events if Trigger Filtering is requested
99  if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( e, es) ) return;
100 
101  //initialization of global quantities
102  LogDebug("SiStripMonitorTrack") << "[SiStripMonitorTrack::analyse] " << "Run " << e.id().run() << " Event " << e.id().event() << std::endl;
103  eventNb = e.id().event();
104  vPSiStripCluster.clear();
105 
106  iLumisection = e.orbitNumber()/262144.0;
107 
108  // initialise # of clusters
109  for (std::map<std::string, SubDetMEs>::iterator iSubDet = SubDetMEsMap.begin();
110  iSubDet != SubDetMEsMap.end(); iSubDet++) {
111  iSubDet->second.totNClustersOnTrack = 0;
112  iSubDet->second.totNClustersOffTrack = 0;
113  }
114 
115  //Perform track study
116  trackStudy(e, es);
117 
118  //Perform Cluster Study (irrespectively to tracks)
119 
120  AllClusters(e, es); //analyzes the off Track Clusters
121 
122  //Summary Counts of clusters
123  std::map<std::string, MonitorElement*>::iterator iME;
124  std::map<std::string, LayerMEs>::iterator iLayerME;
125 
126  fillControlViewHistos(e,es);
127 
128  if (Trend_On_) {
129  // for (std::map<std::string, SubDetMEs>::iterator iSubDet = SubDetMEsMap.begin(), iterEnd=SubDetMEsMaps.end();
130  // iSubDet != iterEnd; ++iSubDet) {
131  for (auto const &iSubDet : SubDetMEsMap) {
132  SubDetMEs subdet_mes = iSubDet.second;
133  if (subdet_mes.totNClustersOnTrack > 0) {
134  fillME(subdet_mes.nClustersOnTrack, subdet_mes.totNClustersOnTrack);
135  }
136  fillME(subdet_mes.nClustersOffTrack, subdet_mes.totNClustersOffTrack);
139  }
140  } else {
141  for (auto const &iSubDet : SubDetMEsMap) {
142  SubDetMEs subdet_mes = iSubDet.second;
143  if (subdet_mes.totNClustersOnTrack > 0) {
144  fillME(subdet_mes.nClustersOnTrack, subdet_mes.totNClustersOnTrack);
145  }
146  fillME(subdet_mes.nClustersOffTrack, subdet_mes.totNClustersOffTrack);
147  }
148  }
149 }
150 
151 //------------------------------------------------------------------------
153 {
154 
155  SiStripFolderOrganizer folder_organizer;
156  folder_organizer.setSiStripFolderName(topFolderName_);
157  //******** TkHistoMaps
158  if (TkHistoMap_On_) {
159  tkhisto_StoNCorrOnTrack = new TkHistoMap(ibooker , topFolderName_ ,"TkHMap_StoNCorrOnTrack", 0.0,true);
160  tkhisto_NumOnTrack = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberOfOnTrackCluster", 0.0,true);
161  tkhisto_NumOffTrack = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberOfOfffTrackCluster",0.0,true);
162  tkhisto_ClChPerCMfromTrack = new TkHistoMap(ibooker , topFolderName_, "TkHMap_ChargePerCMfromTrack",0.0,true);
163  tkhisto_NumMissingHits = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberMissingHits",0.0,true);
164  tkhisto_NumberInactiveHits = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberInactiveHits",0.0,true);
165  tkhisto_NumberValidHits = new TkHistoMap(ibooker , topFolderName_, "TkHMap_NumberValidHits",0.0,true);
166  }
168  tkhisto_ClChPerCMfromOrigin = new TkHistoMap(ibooker , topFolderName_, "TkHMap_ChargePerCMfromOrigin",0.0,true);
169  //******** TkHistoMaps
170 
171  std::vector<uint32_t> vdetId_;
173  const char* tec = "TEC";
174  const char* tid = "TID";
175  //Histos for each detector, layer and module
176  SiStripHistoId hidmanager;
177 
178  if(Mod_On_) {
179  for (std::vector<uint32_t>::const_iterator detid_iter=vdetId_.begin(),detid_end=vdetId_.end();detid_iter!=detid_end;++detid_iter){ //loop on all the active detid
180  uint32_t detid = *detid_iter;
181 
182  if (detid < 1){
183  edm::LogError("SiStripMonitorTrack")<< "[" <<__PRETTY_FUNCTION__ << "] invalid detid " << detid<< std::endl;
184  continue;
185  }
186 
187 
188  //std::string name;
189 
190  // book Layer and RING plots
191  std::pair<std::string,int32_t> det_layer_pair = folder_organizer.GetSubDetAndLayer(detid,tTopo,false);
192  /*
193  std::string thickness;
194  std::pair<std::string,int32_t> det_layer_pair_test = folder_organizer.GetSubDetAndLayerThickness(detid,tTopo,thickness);
195  std::cout << "[SiStripMonitorTrack::book] det_layer_pair " << det_layer_pair.first << " " << det_layer_pair.second << " " << thickness << std::endl;
196  */
197 
198  std::string layer_id = hidmanager.getSubdetid(detid, tTopo, false);
199 
200  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(layer_id);
201  if(iLayerME==LayerMEsMap.end()){
202  folder_organizer.setLayerFolder(detid, tTopo, det_layer_pair.second, false);
203  bookLayerMEs(ibooker , detid, layer_id);
204  }
205 
206  const char* subdet = det_layer_pair.first.c_str();
207  if ( std::strstr(subdet, tec) != NULL || std::strstr(subdet, tid) != NULL ) {
208  std::string ring_id = hidmanager.getSubdetid(detid, tTopo, true);
209  std::map<std::string, RingMEs>::iterator iRingME = RingMEsMap.find(ring_id);
210  if(iRingME==RingMEsMap.end()){
211  std::pair<std::string,int32_t> det_ring_pair = folder_organizer.GetSubDetAndLayer(detid,tTopo,true);
212  folder_organizer.setLayerFolder(detid, tTopo, det_ring_pair.second, true);
213  bookRingMEs(ibooker , detid, ring_id);
214  }
215  }
216 
217  // book sub-detector plots
218  std::pair<std::string,std::string> sdet_pair = folder_organizer.getSubDetFolderAndTag(detid, tTopo);
219  if (SubDetMEsMap.find(sdet_pair.second) == SubDetMEsMap.end()){
220  ibooker.setCurrentFolder(sdet_pair.first);
221  bookSubDetMEs(ibooker , sdet_pair.second);
222  }
223  // book module plots
224  folder_organizer.setDetectorFolder(detid,tTopo);
225  bookModMEs(ibooker , *detid_iter);
226  }//end loop on detectors detid
227  } else {
228  for (std::vector<uint32_t>::const_iterator detid_iter=vdetId_.begin(),detid_end=vdetId_.end();detid_iter!=detid_end;++detid_iter){ //loop on all the active detid
229  uint32_t detid = *detid_iter;
230 
231  if (detid < 1){
232  edm::LogError("SiStripMonitorTrack")<< "[" <<__PRETTY_FUNCTION__ << "] invalid detid " << detid<< std::endl;
233  continue;
234  }
235 
236 
237  //std::string name;
238 
239  // book Layer and RING plots
240  std::pair<std::string,int32_t> det_layer_pair = folder_organizer.GetSubDetAndLayer(detid,tTopo,false);
241  /*
242  std::string thickness;
243  std::pair<std::string,int32_t> det_layer_pair_test = folder_organizer.GetSubDetAndLayerThickness(detid,tTopo,thickness);
244  std::cout << "[SiStripMonitorTrack::book] det_layer_pair " << det_layer_pair.first << " " << det_layer_pair.second << " " << thickness << std::endl;
245  */
246 
247  std::string layer_id = hidmanager.getSubdetid(detid, tTopo, false);
248 
249  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(layer_id);
250  if(iLayerME==LayerMEsMap.end()){
251  folder_organizer.setLayerFolder(detid, tTopo, det_layer_pair.second, false);
252  bookLayerMEs(ibooker , detid, layer_id);
253  }
254 
255  const char* subdet = det_layer_pair.first.c_str();
256  if ( std::strstr(subdet, tec) != NULL || std::strstr(subdet, tid) != NULL ) {
257  std::string ring_id = hidmanager.getSubdetid(detid, tTopo, true);
258  std::map<std::string, RingMEs>::iterator iRingME = RingMEsMap.find(ring_id);
259  if(iRingME==RingMEsMap.end()){
260  std::pair<std::string,int32_t> det_ring_pair = folder_organizer.GetSubDetAndLayer(detid,tTopo,true);
261  folder_organizer.setLayerFolder(detid, tTopo, det_ring_pair.second, true);
262  bookRingMEs(ibooker , detid, ring_id);
263  }
264  }
265 
266  // book sub-detector plots
267  std::pair<std::string,std::string> sdet_pair = folder_organizer.getSubDetFolderAndTag(detid, tTopo);
268  if (SubDetMEsMap.find(sdet_pair.second) == SubDetMEsMap.end()){
269  ibooker.setCurrentFolder(sdet_pair.first);
270  bookSubDetMEs(ibooker , sdet_pair.second);
271  }
272  }//end loop on detectors detid
273  }
274 
275 
276  //book control view plots
277  ibooker.setCurrentFolder(topFolderName_+"/ControlView/");
278 
280  ibooker.book1D("ClusterStoNCorr_OnTrack_TIBTID","TIB/TID [FECCrate=1] (OnTrack)",100,0.,100.);
282 
284  ibooker.book1D("ClusterStoNCorr_OnTrack_TOB","TOB [FECCrate=4] (OnTrack)",100,0.,100.);
286 
288  ibooker.book1D("ClusterStoNCorr_OnTrack_TECM","TECM [FECCrate=3] (OnTrack)",100,0.,100.);
290 
292  ibooker.book1D("ClusterStoNCorr_OnTrack_TECP","TECP [FECCrate=2] (OnTrack)",100,0.,100.);
294 
295 
297  ibooker.book2D("ClusterStoNCorr_OnTrack_FECCratevsFECSlot"," S/N (On track)",22,0.5,22.5,4,0.5,4.5);
299  ClusterStoNCorr_OnTrack_FECCratevsFECSlot->setAxisTitle("FEC Crate (TTC partition)",2);
304 
306  ibooker.book2D("ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TIBTID","TIB/TID [FECCrate=1] (OnTrack)",10,-0.5,9.5,22,0.5,22.5)\
307  ;
310 
312  ibooker.book2D("ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TOB","TOB [FECCrate=4] (OnTrack)",10,-0.5,9.5,22,0.5,22.5);
315 
317  ibooker.book2D("ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TECM","TEC- [FECCrate=3] (OnTrack)",10,-0.5,9.5,22,0.5,22.5);
320 
322  ibooker.book2D("ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TECP","TEC- [FECCrate=2] (OnTrack)",10,-0.5,9.5,22,0.5,22.5);
325 
326 }
327 
328 //--------------------------------------------------------------------------------
329 void SiStripMonitorTrack::bookModMEs(DQMStore::IBooker & ibooker , const uint32_t id)//Histograms at MODULE level
330 {
331  std::string name = "det";
332  SiStripHistoId hidmanager;
333  std::string hid = hidmanager.createHistoId("",name,id);
334  std::map<std::string, ModMEs>::iterator iModME = ModMEsMap.find(hid);
335  if(iModME==ModMEsMap.end()){
336  ModMEs theModMEs;
337 
338  // Cluster Width
339  theModMEs.ClusterWidth=bookME1D(ibooker , "TH1ClusterWidth", hidmanager.createHistoId("ClusterWidth_OnTrack",name,id).c_str());
340  ibooker.tag(theModMEs.ClusterWidth,id);
341  // Cluster Gain
342  theModMEs.ClusterGain=bookME1D(ibooker , "TH1ClusterGain", hidmanager.createHistoId("ClusterGain",name,id).c_str());
343  ibooker.tag(theModMEs.ClusterGain,id);
344  // Cluster Charge
345  theModMEs.ClusterCharge=bookME1D(ibooker , "TH1ClusterCharge", hidmanager.createHistoId("ClusterCharge_OnTrack",name,id).c_str());
346  ibooker.tag(theModMEs.ClusterCharge,id);
347 
348  // Cluster Charge Raw (no gain )
349  theModMEs.ClusterChargeRaw=bookME1D(ibooker , "TH1ClusterChargeRaw", hidmanager.createHistoId("ClusterChargeRaw_OnTrack",name,id).c_str());
350  ibooker.tag(theModMEs.ClusterChargeRaw,id);
351 
352  // Cluster Charge Corrected
353  theModMEs.ClusterChargeCorr=bookME1D(ibooker , "TH1ClusterChargeCorr", hidmanager.createHistoId("ClusterChargeCorr_OnTrack",name,id).c_str());
354  ibooker.tag(theModMEs.ClusterChargeCorr,id);
355  // Cluster StoN Corrected
356  theModMEs.ClusterStoNCorr=bookME1D(ibooker , "TH1ClusterStoNCorrMod", hidmanager.createHistoId("ClusterStoNCorr_OnTrack",name,id).c_str());
357  ibooker.tag(theModMEs.ClusterStoNCorr,id);
358  // Cluster Position
359  short total_nr_strips = SiStripDetCabling_->nApvPairs(id) * 2 * 128;
360  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);
361  ibooker.tag(theModMEs.ClusterPos,id);
362  // Cluster PGV
363  theModMEs.ClusterPGV=bookMEProfile(ibooker , "TProfileClusterPGV", hidmanager.createHistoId("PGV_OnTrack",name,id).c_str());
364  ibooker.tag(theModMEs.ClusterPGV,id);
365  // Cluster Charge per cm
366  theModMEs.ClusterChargePerCMfromTrack = bookME1D(ibooker , "TH1ClusterChargePerCM", hidmanager.createHistoId("ClusterChargePerCMfromTrack",name,id).c_str());
367  ibooker.tag(theModMEs.ClusterChargePerCMfromTrack,id);
368 
369  theModMEs.ClusterChargePerCMfromOrigin = bookME1D(ibooker , "TH1ClusterChargePerCM", hidmanager.createHistoId("ClusterChargePerCMfromOrigin",name,id).c_str());
370  ibooker.tag(theModMEs.ClusterChargePerCMfromOrigin,id);
371 
372  ModMEsMap[hid]=theModMEs;
373  }
374 }
375 
377 
378  MonitorElement* me = NULL;
379  bool view = false;
380  view = (conf_.getParameter<edm::ParameterSet>(histoParameters.c_str())).getParameter<bool>(viewParameter.c_str());
381  if ( id.find("TEC") == std::string::npos && id.find("TID") == std::string::npos ) {
382  me = bookME1D(ibooker , histoParameters.c_str(), histoName.c_str());
383  } else {
384  if (view) {
385  // histoName = histoName + "__" + thickness;
386  me = bookME1D(ibooker , histoParameters.c_str(), histoName.c_str());
387  }
388  }
389  return me;
390 }
391 
392 //
393 // -- Book Layer Level Histograms and Trend plots
394 //
395 //------------------------------------------------------------------------
396 void SiStripMonitorTrack::bookLayerMEs(DQMStore::IBooker & ibooker , const uint32_t mod_id, std::string& layer_id)
397 {
398  std::string name = "layer";
399  std::string view = "layerView";
400  std::string hname;
401  std::string hpar;
402  SiStripHistoId hidmanager;
403 
404  LayerMEs theLayerMEs;
405 
406  // Signal/Noise (w/ cluster harge corrected)
407  hname = hidmanager.createHistoLayer("Summary_ClusterStoNCorr",name,layer_id,"OnTrack");
408  hpar = "TH1ClusterStoNCorr";
409  theLayerMEs.ClusterStoNCorrOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
410 
411  // Cluster Gain
412  hname = hidmanager.createHistoLayer("Summary_ClusterGain",name,layer_id,"");
413  hpar = "TH1ClusterGain";
414  theLayerMEs.ClusterGain = handleBookMEs(ibooker,view,layer_id,hpar,hname);
415 
416  // Cluster Charge Corrected
417  hname = hidmanager.createHistoLayer("Summary_ClusterChargeCorr",name,layer_id,"OnTrack");
418  hpar = "TH1ClusterChargeCorr";
419  theLayerMEs.ClusterChargeCorrOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
420 
421  // Cluster Charge (On and Off Track)
422  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,layer_id,"OnTrack");
423  hpar = "TH1ClusterCharge";
424  theLayerMEs.ClusterChargeOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
425 
426  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,layer_id,"OffTrack");
427  hpar = "TH1ClusterCharge";
428  theLayerMEs.ClusterChargeOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
429 
430  // Cluster Charge Raw (On and Off Track)
431  hname = hidmanager.createHistoLayer("Summary_ClusterChargeRaw",name,layer_id,"OnTrack");
432  hpar = "TH1ClusterChargeRaw";
433  theLayerMEs.ClusterChargeRawOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
434 
435  hname = hidmanager.createHistoLayer("Summary_ClusterChargeRaw",name,layer_id,"OffTrack");
436  hpar = "TH1ClusterChargeRaw";
437  theLayerMEs.ClusterChargeRawOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
438 
439  // Cluster Noise (On and Off Track)
440  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,layer_id,"OnTrack");
441  hpar = "TH1ClusterNoise";
442  theLayerMEs.ClusterNoiseOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
443 
444  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,layer_id,"OffTrack");
445  hpar = "TH1ClusterNoise";
446  theLayerMEs.ClusterNoiseOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
447 
448  // Cluster Width (On and Off Track)
449  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,layer_id,"OnTrack");
450  hpar = "TH1ClusterWidth";
451  theLayerMEs.ClusterWidthOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
452 
453  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,layer_id,"OffTrack");
454  hpar = "TH1ClusterWidth";
455  theLayerMEs.ClusterWidthOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
456 
457  //Cluster Position
458  short total_nr_strips = SiStripDetCabling_->nApvPairs(mod_id) * 2 * 128;
459  if (layer_id.find("TEC") != std::string::npos) total_nr_strips = 3 * 2 * 128;
460 
461  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,layer_id,"OnTrack");
462  hpar = "TH1ClusterPos";
463  if ( layer_id.find("TIB") != std::string::npos || layer_id.find("TOB") != std::string::npos || (conf_.getParameter<edm::ParameterSet>(hpar.c_str())).getParameter<bool>(view.c_str()) ) theLayerMEs.ClusterPosOnTrack = ibooker.book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
464 
465  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,layer_id,"OffTrack");
466  hpar = "TH1ClusterPos";
467  if ( layer_id.find("TIB") != std::string::npos || layer_id.find("TOB") != std::string::npos || (conf_.getParameter<edm::ParameterSet>(hpar.c_str())).getParameter<bool>(view.c_str()) ) theLayerMEs.ClusterPosOffTrack = ibooker.book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
468 
469  // dQ/dx
470  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromTrack",name,layer_id,"");
471  hpar = "TH1ClusterChargePerCM";
472  theLayerMEs.ClusterChargePerCMfromTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
473 
474  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,layer_id,"OnTrack");
475  hpar = "TH1ClusterChargePerCM";
476  theLayerMEs.ClusterChargePerCMfromOriginOnTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
477 
478  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,layer_id,"OffTrack");
479  hpar = "TH1ClusterChargePerCM";
480  theLayerMEs.ClusterChargePerCMfromOriginOffTrack = handleBookMEs(ibooker,view,layer_id,hpar,hname);
481 
482  //bookeeping
483  LayerMEsMap[layer_id]=theLayerMEs;
484 
485 }
486 
488 {
489 
490  std::string name = "ring";
491  std::string view = "ringView";
492  std::string hname;
493  std::string hpar;
494  SiStripHistoId hidmanager;
495 
496  RingMEs theRingMEs;
497 
498  hname = hidmanager.createHistoLayer("Summary_ClusterStoNCorr",name,ring_id,"OnTrack");
499  hpar = "TH1ClusterStoNCorr";
500  theRingMEs.ClusterStoNCorrOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
501 
502  // Cluster Gain
503  hname = hidmanager.createHistoLayer("Summary_ClusterGain",name,ring_id,"");
504  hpar = "TH1ClusterGain";
505  theRingMEs.ClusterGain = handleBookMEs(ibooker,view,ring_id,hpar,hname);
506 
507  // Cluster Charge Corrected
508  hname = hidmanager.createHistoLayer("Summary_ClusterChargeCorr",name,ring_id,"OnTrack");
509  hpar = "TH1ClusterChargeCorr";
510  theRingMEs.ClusterChargeCorrOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
511 
512  // Cluster Charge (On and Off Track)
513  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,ring_id,"OnTrack");
514  hpar = "TH1ClusterCharge";
515  theRingMEs.ClusterChargeOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
516 
517  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,ring_id,"OffTrack");
518  hpar = "TH1ClusterCharge";
519  theRingMEs.ClusterChargeOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
520 
521  // Cluster Charge Raw (no-gain), On and off track
522  hname = hidmanager.createHistoLayer("Summary_ClusterChargeRaw",name,ring_id,"OnTrack");
523  hpar = "TH1ClusterChargeRaw";
524  theRingMEs.ClusterChargeRawOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
525 
526  hname = hidmanager.createHistoLayer("Summary_ClusterChargeRaw",name,ring_id,"OffTrack");
527  hpar = "TH1ClusterChargeRaw";
528  theRingMEs.ClusterChargeRawOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
529 
530  // Cluster Noise (On and Off Track)
531  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,ring_id,"OnTrack");
532  hpar = "TH1ClusterNoise";
533  theRingMEs.ClusterNoiseOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
534 
535  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,ring_id,"OffTrack");
536  hpar = "TH1ClusterNoise";
537  theRingMEs.ClusterNoiseOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
538 
539  // Cluster Width (On and Off Track)
540  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,ring_id,"OnTrack");
541  hpar = "TH1ClusterWidth";
542  theRingMEs.ClusterWidthOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
543 
544  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,ring_id,"OffTrack");
545  hpar = "TH1ClusterWidth";
546  theRingMEs.ClusterWidthOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
547 
548  //Cluster Position
549  short total_nr_strips = SiStripDetCabling_->nApvPairs(mod_id) * 2 * 128;
550  if (ring_id.find("TEC") != std::string::npos) total_nr_strips = 3 * 2 * 128;
551 
552  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,ring_id,"OnTrack");
553  hpar = "TH1ClusterPos";
554  if ( (conf_.getParameter<edm::ParameterSet>(hpar.c_str())).getParameter<bool>(view.c_str()) ) theRingMEs.ClusterPosOnTrack = ibooker.book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
555 
556  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,ring_id,"OffTrack");
557  hpar = "TH1ClusterPos";
558  if ( (conf_.getParameter<edm::ParameterSet>(hpar.c_str())).getParameter<bool>(view.c_str()) ) theRingMEs.ClusterPosOffTrack = ibooker.book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
559 
560  // dQ/dx
561  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromTrack",name,ring_id,"");
562  hpar = "TH1ClusterChargePerCM";
563  theRingMEs.ClusterChargePerCMfromTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
564 
565  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,ring_id,"OnTrack");
566  hpar = "TH1ClusterChargePerCM";
567  theRingMEs.ClusterChargePerCMfromOriginOnTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
568 
569  hname = hidmanager.createHistoLayer("Summary_ClusterChargePerCMfromOrigin",name,ring_id,"OffTrack");
570  hpar = "TH1ClusterChargePerCM";
571  theRingMEs.ClusterChargePerCMfromOriginOffTrack = handleBookMEs(ibooker,view,ring_id,hpar,hname);
572 
573  //bookeeping
574  RingMEsMap[ring_id]=theRingMEs;
575 
576 }
577 //------------------------------------------------------------------------
578 //
579 // -- Book Histograms at Sub-Detector Level
580 //
582 
584  subdet_tag = "__" + name;
585  std::string completeName;
586  std::string axisName;
587 
588  SubDetMEs theSubDetMEs;
589 
590  // TotalNumber of Cluster OnTrack
591  completeName = "Summary_TotalNumberOfClusters_OnTrack" + subdet_tag;
592  axisName = "Number of on-track clusters in " + name;
593  theSubDetMEs.nClustersOnTrack = bookME1D(ibooker , "TH1nClustersOn", completeName.c_str());
594  theSubDetMEs.nClustersOnTrack->setAxisTitle(axisName.c_str());
595  theSubDetMEs.nClustersOnTrack->getTH1()->StatOverflows(kTRUE);
596 
597  // TotalNumber of Cluster OffTrack
598  completeName = "Summary_TotalNumberOfClusters_OffTrack" + subdet_tag;
599  axisName = "Number of off-track clusters in " + name;
600  theSubDetMEs.nClustersOffTrack = bookME1D(ibooker , "TH1nClustersOff", completeName.c_str());
601  theSubDetMEs.nClustersOffTrack->setAxisTitle(axisName.c_str());
602  theSubDetMEs.nClustersOffTrack->getTH1()->StatOverflows(kTRUE);
603 
604  // Cluster Gain
605  completeName = "Summary_ClusterGain" + subdet_tag;
606  theSubDetMEs.ClusterGain=bookME1D(ibooker , "TH1ClusterGain", completeName.c_str());
607 
608  // Cluster StoN On Track
609  completeName = "Summary_ClusterStoNCorr_OnTrack" + subdet_tag;
610  theSubDetMEs.ClusterStoNCorrOnTrack = bookME1D(ibooker , "TH1ClusterStoNCorr", completeName.c_str());
611 
612  completeName = "Summary_ClusterStoNCorrThin_OnTrack" + subdet_tag;
613  if ( subdet_tag.find("TEC") != std::string::npos ) theSubDetMEs.ClusterStoNCorrThinOnTrack = bookME1D(ibooker , "TH1ClusterStoNCorr", completeName.c_str());
614 
615  completeName = "Summary_ClusterStoNCorrThick_OnTrack" + subdet_tag;
616  if ( subdet_tag.find("TEC") != std::string::npos ) theSubDetMEs.ClusterStoNCorrThickOnTrack = bookME1D(ibooker , "TH1ClusterStoNCorr", completeName.c_str());
617 
618  // Cluster Charge Corrected
619  completeName = "Summary_ClusterChargeCorr_OnTrack" + subdet_tag;
620  theSubDetMEs.ClusterChargeCorrOnTrack = bookME1D(ibooker , "TH1ClusterChargeCorr", completeName.c_str());
621 
622  completeName = "Summary_ClusterChargeCorrThin_OnTrack" + subdet_tag;
623  if ( subdet_tag.find("TEC") != std::string::npos ) theSubDetMEs.ClusterChargeCorrThinOnTrack = bookME1D(ibooker , "TH1ClusterChargeCorr", completeName.c_str());
624 
625  completeName = "Summary_ClusterChargeCorrThick_OnTrack" + subdet_tag;
626  if ( subdet_tag.find("TEC") != std::string::npos ) theSubDetMEs.ClusterChargeCorrThickOnTrack = bookME1D(ibooker , "TH1ClusterChargeCorr", completeName.c_str());
627 
628  // Cluster Charge On Track
629  completeName = "Summary_ClusterCharge_OnTrack" + subdet_tag;
630  theSubDetMEs.ClusterChargeOnTrack=bookME1D(ibooker , "TH1ClusterCharge", completeName.c_str());
631 
632  // Cluster Charge On Track, Raw (no-gain)
633  completeName = "Summary_ClusterChargeRaw_OnTrack" + subdet_tag;
634  theSubDetMEs.ClusterChargeRawOnTrack=bookME1D(ibooker , "TH1ClusterChargeRaw", completeName.c_str());
635 
636  // Cluster Charge Off Track
637  completeName = "Summary_ClusterCharge_OffTrack" + subdet_tag;
638  theSubDetMEs.ClusterChargeOffTrack=bookME1D(ibooker , "TH1ClusterCharge", completeName.c_str());
639 
640  // Cluster Charge Off Track, Raw (no-gain)
641  completeName = "Summary_ClusterChargeRaw_OffTrack" + subdet_tag;
642  theSubDetMEs.ClusterChargeRawOffTrack=bookME1D(ibooker , "TH1ClusterChargeRaw", completeName.c_str());
643 
644  // Cluster Charge StoN Off Track
645  completeName = "Summary_ClusterStoN_OffTrack" + subdet_tag;
646  theSubDetMEs.ClusterStoNOffTrack = bookME1D(ibooker , "TH1ClusterStoN", completeName.c_str());
647 
648  // cluster charge per cm on track
649  completeName = "Summary_ClusterChargePerCMfromTrack" + subdet_tag;
650  theSubDetMEs.ClusterChargePerCMfromTrack=bookME1D(ibooker , "TH1ClusterChargePerCM", completeName.c_str());
651 
652  // cluster charge per cm on track
653  completeName = "Summary_ClusterChargePerCMfromOrigin_OnTrack" + subdet_tag;
654  theSubDetMEs.ClusterChargePerCMfromOriginOnTrack=bookME1D(ibooker , "TH1ClusterChargePerCM", completeName.c_str());
655 
656  // cluster charge per cm off track
657  completeName = "Summary_ClusterChargePerCMfromOrigin_OffTrack" + subdet_tag;
658  theSubDetMEs.ClusterChargePerCMfromOriginOffTrack=bookME1D(ibooker , "TH1ClusterChargePerCM", completeName.c_str());
659 
660  if(Trend_On_){
661  // TotalNumber of Cluster
662  completeName = "Trend_TotalNumberOfClusters_OnTrack" + subdet_tag;
663  theSubDetMEs.nClustersTrendOnTrack = bookMETrend(ibooker , completeName.c_str());
664  completeName = "Trend_TotalNumberOfClusters_OffTrack" + subdet_tag;
665  theSubDetMEs.nClustersTrendOffTrack = bookMETrend(ibooker , completeName.c_str());
666  }
667 
668  //bookeeping
669  SubDetMEsMap[name]=theSubDetMEs;
670 
671 }
672 //--------------------------------------------------------------------------------
673 
674 inline MonitorElement* SiStripMonitorTrack::bookME1D(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
675 {
676  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
677  return ibooker.book1D(HistoName,HistoName,
678  Parameters.getParameter<int32_t>("Nbinx"),
679  Parameters.getParameter<double>("xmin"),
680  Parameters.getParameter<double>("xmax")
681  );
682 }
683 
684 //--------------------------------------------------------------------------------
685 inline MonitorElement* SiStripMonitorTrack::bookME2D(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
686 {
687  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
688  return ibooker.book2D(HistoName,HistoName,
689  Parameters.getParameter<int32_t>("Nbinx"),
690  Parameters.getParameter<double>("xmin"),
691  Parameters.getParameter<double>("xmax"),
692  Parameters.getParameter<int32_t>("Nbiny"),
693  Parameters.getParameter<double>("ymin"),
694  Parameters.getParameter<double>("ymax")
695  );
696 }
697 
698 //--------------------------------------------------------------------------------
699 inline MonitorElement* SiStripMonitorTrack::bookME3D(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
700 {
701  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
702  return ibooker.book3D(HistoName,HistoName,
703  Parameters.getParameter<int32_t>("Nbinx"),
704  Parameters.getParameter<double>("xmin"),
705  Parameters.getParameter<double>("xmax"),
706  Parameters.getParameter<int32_t>("Nbiny"),
707  Parameters.getParameter<double>("ymin"),
708  Parameters.getParameter<double>("ymax"),
709  Parameters.getParameter<int32_t>("Nbinz"),
710  Parameters.getParameter<double>("zmin"),
711  Parameters.getParameter<double>("zmax")
712  );
713 }
714 
715 //--------------------------------------------------------------------------------
716 inline MonitorElement* SiStripMonitorTrack::bookMEProfile(DQMStore::IBooker & ibooker , const char* ParameterSetLabel, const char* HistoName)
717 {
718  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
719  return ibooker.bookProfile(HistoName,HistoName,
720  Parameters.getParameter<int32_t>("Nbinx"),
721  Parameters.getParameter<double>("xmin"),
722  Parameters.getParameter<double>("xmax"),
723  Parameters.getParameter<int32_t>("Nbiny"),
724  Parameters.getParameter<double>("ymin"),
725  Parameters.getParameter<double>("ymax"),
726  "" );
727 }
728 
729 //--------------------------------------------------------------------------------
731 {
732  edm::ParameterSet ParametersTrend = conf_.getParameter<edm::ParameterSet>("Trending");
733  MonitorElement* me = ibooker.bookProfile(HistoName,HistoName,
734  ParametersTrend.getParameter<int32_t>("Nbins"),
735  ParametersTrend.getParameter<double>("xmin"),
736  ParametersTrend.getParameter<double>("xmax"),
737  0 , 0 , "" );
738  if (me->kind() == MonitorElement::DQM_KIND_TPROFILE) me->getTH1()->SetCanExtend(TH1::kAllAxes);
739 
740  if(!me) return me;
741  me->setAxisTitle("Lumisection",1);
742  return me;
743 }
744 
745 //------------------------------------------------------------------------------------------
747  const reco::Track & track,
748  const edm::DetSetVector<SiStripDigi>& digilist,
749  const edm::Event& ev,
750  const edm::EventSetup& es,
751  bool track_ok
752 ) {
753 
754  auto const & trajParams = track.extra()->trajParams();
755  assert(trajParams.size()==track.recHitsSize());
756  auto hb = track.recHitsBegin();
757  for(unsigned int h=0;h<track.recHitsSize();h++){
758  auto ttrh = *(hb+h);
759 
760 
761  if (TkHistoMap_On_ ) {
762  uint32_t thedetid=ttrh->rawId();
763  if ( SiStripDetId(thedetid).subDetector() >=3 && SiStripDetId(thedetid).subDetector() <=6) { //TIB/TID + TOB + TEC only
764  if ( (ttrh->getType()==1) )
765  tkhisto_NumMissingHits->add(thedetid,1.);
766  if ( (ttrh->getType()==2) )
767  tkhisto_NumberInactiveHits->add(thedetid,1.);
768  if ( (ttrh->getType()==0) )
769  tkhisto_NumberValidHits->add(thedetid,1.);
770  }
771  }
772 
773  if (!ttrh->isValid()) continue;
774 
775  //trajectory local direction and position on detector
776  auto statedirection = trajParams[h].momentum();
777 
778 
779  const ProjectedSiStripRecHit2D* projhit = dynamic_cast<const ProjectedSiStripRecHit2D*>( ttrh->hit() );
780  const SiStripMatchedRecHit2D* matchedhit = dynamic_cast<const SiStripMatchedRecHit2D*>( ttrh->hit() );
781  const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*>( ttrh->hit() );
782  const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*>( ttrh->hit() );
783 
784  // RecHitType type=Single;
785 
786  if(matchedhit){
787  LogTrace("SiStripMonitorTrack")<<"\nMatched recHit found"<< std::endl;
788  // type=Matched;
789 
790  const GluedGeomDet * gdet=static_cast<const GluedGeomDet *>(tkgeom_->idToDet(matchedhit->geographicalId()));
791  GlobalVector gtrkdirup=gdet->toGlobal(statedirection);
792  //mono side
793  const GeomDetUnit * monodet=gdet->monoDet();
794  statedirection=monodet->toLocal(gtrkdirup);
795  SiStripRecHit2D m = matchedhit->monoHit();
796  // if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&m,statedirection,trackref,es);
797  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&m,statedirection,digilist,ev,es,track_ok);
798  //stereo side
799  const GeomDetUnit * stereodet=gdet->stereoDet();
800  statedirection=stereodet->toLocal(gtrkdirup);
801  SiStripRecHit2D s = matchedhit->stereoHit();
802  // if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&s,statedirection,trackref,es);
803  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&s,statedirection,digilist,ev,es,track_ok);
804  }
805  else if(projhit){
806  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found"<< std::endl;
807  // type=Projected;
808  const GluedGeomDet * gdet=static_cast<const GluedGeomDet *>(tkgeom_->idToDet(projhit->geographicalId()));
809 
810  GlobalVector gtrkdirup=gdet->toGlobal(statedirection);
811  const SiStripRecHit2D originalhit=projhit->originalHit();
812  const GeomDetUnit * det;
813  if(!StripSubdetector(originalhit.geographicalId().rawId()).stereo()){
814  //mono side
815  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found MONO"<< std::endl;
816  det=gdet->monoDet();
817  statedirection=det->toLocal(gtrkdirup);
818  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,digilist,ev,es,track_ok);
819  }
820  else{
821  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found STEREO"<< std::endl;
822  //stereo side
823  det=gdet->stereoDet();
824  statedirection=det->toLocal(gtrkdirup);
825  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,digilist,ev,es,track_ok);
826  }
827  }else if (hit2D){
828  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(hit2D,statedirection,digilist,ev,es,track_ok);
829  } else if (hit1D) {
830  if(statedirection.mag()) RecHitInfo<SiStripRecHit1D>(hit1D,statedirection,digilist,ev,es,track_ok);
831  } else {
832  LogDebug ("SiStripMonitorTrack")
833  << " LocalMomentum: "<<statedirection
834  << "\nLocal x-z plane angle: "<<atan2(statedirection.x(),statedirection.z());
835  }
836 
837  }
838 
839 }
840 //------------------------------------------------------------------------
842  const edm::Event& ev,
843  const edm::EventSetup& es,
844  const edm::DetSetVector<SiStripDigi>& digilist,
845  const ProjectedSiStripRecHit2D* projhit,
846  const SiStripMatchedRecHit2D* matchedhit,
847  const SiStripRecHit2D* hit2D,
848  const SiStripRecHit1D* hit1D,
849  LocalVector localMomentum,
850  const bool track_ok
851 ) {
852  LocalVector statedirection;
853  if(matchedhit){ // type=Matched;
854  LogTrace("SiStripMonitorTrack")<<"\nMatched recHit found"<< std::endl;
855 
856  const GluedGeomDet * gdet=static_cast<const GluedGeomDet *>(tkgeom_->idToDet(matchedhit->geographicalId()));
857 
858  GlobalVector gtrkdirup=gdet->toGlobal(localMomentum);
859 
860  //mono side
861  const GeomDetUnit * monodet=gdet->monoDet();
862  statedirection=monodet->toLocal(gtrkdirup);
863  SiStripRecHit2D m = matchedhit->monoHit();
864  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&m,statedirection,digilist,ev,es,track_ok);
865 
866  //stereo side
867  const GeomDetUnit * stereodet=gdet->stereoDet();
868  statedirection=stereodet->toLocal(gtrkdirup);
869  SiStripRecHit2D s = matchedhit->stereoHit();
870  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&s,statedirection,digilist,ev,es,track_ok);
871  }
872  else if(projhit){ // type=Projected;
873  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found"<< std::endl;
874 
875  const GluedGeomDet * gdet=static_cast<const GluedGeomDet *>(tkgeom_->idToDet(projhit->geographicalId()));
876 
877  GlobalVector gtrkdirup=gdet->toGlobal(localMomentum);
878  const SiStripRecHit2D originalhit=projhit->originalHit();
879 
880  const GeomDetUnit * det;
881  if(!StripSubdetector(originalhit.geographicalId().rawId()).stereo()){
882  //mono side
883  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found MONO"<< std::endl;
884  det=gdet->monoDet();
885  statedirection=det->toLocal(gtrkdirup);
886  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,digilist,ev,es,track_ok);
887  }
888  else{
889  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found STEREO"<< std::endl;
890  //stereo side
891  det=gdet->stereoDet();
892  statedirection=det->toLocal(gtrkdirup);
893  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(&(originalhit),statedirection,digilist,ev,es,track_ok);
894  }
895  } else if (hit2D){ // type=2D
896  statedirection=localMomentum;
897  if(statedirection.mag()) RecHitInfo<SiStripRecHit2D>(hit2D,statedirection,digilist,ev,es,track_ok);
898  } else if (hit1D) { // type=1D
899  statedirection=localMomentum;
900  if(statedirection.mag()) RecHitInfo<SiStripRecHit1D>(hit1D,statedirection,digilist,ev,es,track_ok);
901  } else {
902  LogDebug ("SiStripMonitorTrack")
903  << " LocalMomentum: "<<statedirection
904  << "\nLocal x-z plane angle: "<<atan2(statedirection.x(),statedirection.z());
905  }
906 
907 }
908 //------------------------------------------------------------------------
910 
911 using namespace std;
912 using namespace edm;
913 using namespace reco;
914 
915 
916  // edm::Handle<std::vector<Trajectory> > trajectories;
917  // ev.getByToken(trajectoryToken_, trajectories);
918 
919  // track input
920  edm::Handle<reco::TrackCollection > trackCollectionHandle;
921  ev.getByToken(trackToken_, trackCollectionHandle);//takes the track collection
922 
923  // digis list
925  ev.getByToken( digiToken_, digihandle );
927  auto& digilist = digihandle.isValid()? *(digihandle.product()) : dummy;
928 
929  if (trackCollectionHandle.isValid()){
930  trackStudyFromTrajectory(trackCollectionHandle,digilist,ev, es);
931  } else {
932  edm::LogError("SiStripMonitorTrack")<<"also Track Collection is not valid !! " << TrackLabel_<<std::endl;
933  return;
934  }
935 }
936 
937 //------------------------------------------------------------------------
938 // Should return true if the track is good, false if it should be discarded.
940  if (track.pt() < 0.8) return false;
941  if (track.p() < 2.0) return false;
942  if (track.hitPattern().numberOfValidTrackerHits() <= 6) return false;
943  if (track.normalizedChi2() > 10.0) return false;
944  return true;
945 }
946 //------------------------------------------------------------------------
948  edm::Handle<reco::TrackCollection > trackCollectionHandle,
949  const edm::DetSetVector<SiStripDigi>& digilist,
950  const edm::Event& ev,
951  const edm::EventSetup& es
952 ) {
953 
954  // edm::ESHandle<TransientTrackBuilder> builder;
955  // es.get<TransientTrackRecord>().get("TransientTrackBuilder",builder);
956  // const TransientTrackBuilder* transientTrackBuilder = builder.product();
957 
958  //numTracks = trackCollectionHandle->size();
959  reco::TrackCollection trackCollection = *trackCollectionHandle;
960  for (reco::TrackCollection::const_iterator track = trackCollection.begin(), etrack = trackCollection.end();
961  track!=etrack; ++track) {
962 
963  bool track_ok = trackFilter(*track);
964  // const reco::TransientTrack transientTrack = transientTrackBuilder->build(track);
965 
966  for (trackingRecHit_iterator hit = track->recHitsBegin(), ehit = track->recHitsEnd();
967  hit!=ehit; ++hit) {
968 
969  if (TkHistoMap_On_ ) {
970  uint32_t thedetid=(*hit)->rawId();
971  if ( SiStripDetId(thedetid).subDetector() >=3 && SiStripDetId(thedetid).subDetector() <=6) { //TIB/TID + TOB + TEC only
972  if ( ((*hit)->getType()==1) )
973  tkhisto_NumMissingHits->add(thedetid,1.);
974  if ( ((*hit)->getType()==2) )
975  tkhisto_NumberInactiveHits->add(thedetid,1.);
976  if ( ((*hit)->getType()==0) )
977  tkhisto_NumberValidHits->add(thedetid,1.);
978  }
979  }
980 
981  if (!(*hit)->isValid()) continue;
982  DetId detID = (*hit)->geographicalId();
983  if (detID.det() != DetId::Tracker) continue;
984  const TrackingRecHit* theHit = (*hit);
985  const ProjectedSiStripRecHit2D* projhit = dynamic_cast<const ProjectedSiStripRecHit2D*>( (theHit) );
986  const SiStripMatchedRecHit2D* matchedhit = dynamic_cast<const SiStripMatchedRecHit2D*> ( (theHit) );
987  const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*> ( (theHit) );
988  const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*> ( (theHit) );
989 
990  // GlobalPoint globalPoint = hit->globalPosition();
991  // reco::TrajectoryStateOnSurface stateOnSurface = transientTrack->stateOnSurface(globalPoint);
992 
993  LocalVector localMomentum;
994  hitStudy(ev,es,digilist,projhit,matchedhit,hit2D,hit1D,localMomentum,track_ok);
995  }
996 
997  // hit pattern of the track
998  // const reco::HitPattern & hitsPattern = track->hitPattern();
999  // loop over the hits of the track
1000  // for (int i=0; i<hitsPattern.numberOfHits(); i++) {
1001  // for (int i=0; i<hitsPattern.numberOfHits(reco::HitPattern::TRACK_HITS); i++) {
1002  // uint32_t hit = hitsPattern.getHitPattern(reco::HitPattern::TRACK_HITS,i);
1003 
1004  // if the hit is valid and in pixel barrel, print out the layer
1005  // if (hitsPattern.validHitFilter(hit) && hitsPattern.pixelBarrelHitFilter(hit))
1006 
1007  // if (!hitsPattern.validHitFilter(hit)) continue;
1008 // if (hitsPattern.pixelHitFilter(hit)) std::cout << "pixel" << std::endl; // pixel
1009 // if (hitsPattern.pixelBarrelHitFilter(hit)) std::cout << "pixel barrel" << std::endl; // pixel barrel
1010 // if (hitsPattern.pixelEndcapHitFilter(hit)) std::cout << "pixel endcap" << std::endl; // pixel endcap
1011 // if (hitsPattern.stripHitFilter(hit)) std::cout << "strip" << std::endl; // strip
1012 // if (hitsPattern.stripTIBHitFilter(hit)) std::cout << "TIB" << std::endl; // strip TIB
1013 // if (hitsPattern.stripTIDHitFilter(hit)) std::cout << "TID" << std::endl; // strip TID
1014 // if (hitsPattern.stripTOBHitFilter(hit)) std::cout << "TOB" << std::endl; // strip TOB
1015 // if (hitsPattern.stripTECHitFilter(hit)) std::cout << "TEC" << std::endl; // strip TEC
1016 // if (hitsPattern.muonDTHitFilter(hit)) std::cout << "DT" << std::endl; // muon DT
1017 // if (hitsPattern.muonCSCHitFilter(hit)) std::cout << "CSC" << std::endl; // muon CSC
1018 // if (hitsPattern.muonRPCHitFilter(hit)) std::cout << "RPC" << std::endl; // muon RPC
1019 //
1020 // // expert level: printout the hit in 10-bit binary format
1021 // std::cout << "hit in 10-bit binary format = ";
1022 // for (int j=9; j>=0; j--) {
1023 // int bit = (hit >> j) & 0x1;
1024 // std::cout << bit;
1025 // }
1026 // std::cout << std::endl;
1027  // }
1028  }
1029 }
1030 //------------------------------------------------------------------------
1032  edm::Handle<reco::TrackCollection > trackCollectionHandle,
1033  const edm::DetSetVector<SiStripDigi>& digilist,
1034  const edm::Event& ev,
1035  const edm::EventSetup& es
1036 ) {
1037  //Perform track study
1038  int i=0;
1039  reco::TrackCollection trackCollection = *trackCollectionHandle;
1040  numTracks = trackCollection.size();
1041  for (reco::TrackCollection::const_iterator track = trackCollection.begin(), etrack = trackCollection.end();
1042  track!=etrack; ++track) {
1043 
1044  LogDebug("SiStripMonitorTrack")
1045  << "Track number "<< ++i << std::endl;
1046  // << "\n\tmomentum: " << trackref->momentum()
1047  // << "\n\tPT: " << trackref->pt()
1048  // << "\n\tvertex: " << trackref->vertex()
1049  // << "\n\timpact parameter: " << trackref->d0()
1050  // << "\n\tcharge: " << trackref->charge()
1051  // << "\n\tnormalizedChi2: " << trackref->normalizedChi2()
1052  // <<"\n\tFrom EXTRA : "
1053  // <<"\n\t\touter PT "<< trackref->outerPt()<<std::endl;
1054 
1055  // trajectoryStudy(traj_iterator,trackref,es);
1056  bool track_ok = trackFilter(*track);
1057  trajectoryStudy(*track,digilist,ev,es,track_ok);
1058 
1059  }
1060 }
1061 //------------------------------------------------------------------------
1062 template <class T> void SiStripMonitorTrack::RecHitInfo(
1063  const T* tkrecHit,
1064  LocalVector LV,
1065  const edm::DetSetVector<SiStripDigi>& digilist,
1066  const edm::Event& ev,
1067  const edm::EventSetup& es,
1068  bool track_ok)
1069  {
1070 
1071  if(!tkrecHit->isValid()){
1072  LogTrace("SiStripMonitorTrack") <<"\t\t Invalid Hit " << std::endl;
1073  return;
1074  }
1075 
1076  const uint32_t& detid = tkrecHit->geographicalId().rawId();
1077 
1078  LogTrace("SiStripMonitorTrack")
1079  <<"\n\t\tRecHit on det "<<detid
1080  <<"\n\t\tRecHit in LP "<<tkrecHit->localPosition()
1081  <<"\n\t\tRecHit in GP "<<tkgeom_->idToDet(tkrecHit->geographicalId())->surface().toGlobal(tkrecHit->localPosition())
1082  <<"\n\t\tRecHit trackLocal vector "<<LV.x() << " " << LV.y() << " " << LV.z() <<std::endl;
1083 
1084  // FIXME: MOVE ALL THE EV AND ES ACCESS OUTSIDE THE LOOP!!!!
1085 
1086  //Retrieve tracker topology from geometry
1087  edm::ESHandle<TrackerTopology> tTopoHandle;
1088  es.get<TrackerTopologyRcd>().get(tTopoHandle);
1089  const TrackerTopology* const tTopo = tTopoHandle.product();
1090 
1091  // Getting SiStrip Gain settings
1092  edm::ESHandle<SiStripGain> gainHandle;
1093  es.get<SiStripGainRcd>().get( gainHandle );
1094  const SiStripGain* const stripGain = gainHandle.product();
1095 
1096  edm::ESHandle<SiStripQuality> qualityHandle;
1097  es.get<SiStripQualityRcd>().get("",qualityHandle);
1098  const SiStripQuality* stripQuality = qualityHandle.product();
1099 
1100  //Get SiStripCluster from SiStripRecHit
1101  if ( tkrecHit != NULL ){
1102  const SiStripCluster* SiStripCluster_ = &*(tkrecHit->cluster());
1103  SiStripClusterInfo SiStripClusterInfo_(*SiStripCluster_,es,detid);
1104 
1105  const Det2MEs MEs = findMEs(tTopo, detid);
1106  // if (clusterInfos(&SiStripClusterInfo_,detid, OnTrack, track_ok, LV, MEs, tTopo,stripGain,stripQuality,*digihandle))
1107  if (clusterInfos(&SiStripClusterInfo_,detid, OnTrack, track_ok, LV, MEs, tTopo,stripGain,stripQuality,digilist))
1108  {
1109  vPSiStripCluster.insert(SiStripCluster_);
1110  }
1111  }
1112  else
1113  {
1114  edm::LogError("SiStripMonitorTrack") << "NULL hit" << std::endl;
1115  }
1116  }
1117 
1118 //------------------------------------------------------------------------
1120 {
1121 
1122  //Retrieve tracker topology from geometry
1123  edm::ESHandle<TrackerTopology> tTopoHandle;
1124  es.get<TrackerTopologyRcd>().get(tTopoHandle);
1125  const TrackerTopology* const tTopo = tTopoHandle.product();
1126 
1127  edm::ESHandle<SiStripGain> gainHandle;
1128  es.get<SiStripGainRcd>().get( gainHandle );
1129  const SiStripGain* stripGain = gainHandle.product();
1130 
1131  edm::ESHandle<SiStripQuality> qualityHandle;
1132  es.get<SiStripQualityRcd>().get("",qualityHandle);
1133  const SiStripQuality* stripQuality = qualityHandle.product();
1134 
1136  ev.getByToken( digiToken_, digihandle );
1138  auto& digilist = digihandle.isValid()? *(digihandle.product()) : dummy;
1139 
1141  ev.getByToken( clusterToken_, siStripClusterHandle);
1142  if (siStripClusterHandle.isValid()){
1143  //Loop on Dets
1144  for (edmNew::DetSetVector<SiStripCluster>::const_iterator DSViter=siStripClusterHandle->begin(), DSVEnd=siStripClusterHandle->end();
1145  DSViter!=DSVEnd; ++DSViter) {
1146 
1147  uint32_t detid=DSViter->id();
1148  const Det2MEs MEs = findMEs(tTopo, detid);
1149 
1150  LogDebug("SiStripMonitorTrack") << "on detid "<< detid << " N Cluster= " << DSViter->size();
1151 
1152  //Loop on Clusters
1153  for(edmNew::DetSet<SiStripCluster>::const_iterator ClusIter = DSViter->begin(), ClusEnd = DSViter->end();
1154  ClusIter!=ClusEnd; ++ClusIter) {
1155 
1156  if (vPSiStripCluster.find(&*ClusIter) == vPSiStripCluster.end()) {
1157  SiStripClusterInfo SiStripClusterInfo_(*ClusIter,es,detid);
1158  // clusterInfos(&SiStripClusterInfo_,detid,OffTrack, /*track_ok*/ false,LV,MEs, tTopo,stripGain,stripQuality,*digihandle);
1159  clusterInfos(&SiStripClusterInfo_,detid,OffTrack, /*track_ok*/ false,LV,MEs, tTopo,stripGain,stripQuality,digilist);
1160  }
1161  }
1162  }
1163  } else {
1164  edm::LogError("SiStripMonitorTrack")<< "ClusterCollection is not valid!!" << std::endl;
1165  return;
1166  }
1167 }
1168 
1169 //------------------------------------------------------------------------
1171  SiStripHistoId hidmanager1;
1172 
1173  std::string layer_id = hidmanager1.getSubdetid(detid, tTopo, false);
1174  std::string ring_id = hidmanager1.getSubdetid(detid, tTopo, true);
1175  std::string sdet_tag = folderOrganizer_.getSubDetFolderAndTag(detid, tTopo).second;
1176 
1177  Det2MEs me;
1178  me.iLayer = nullptr;
1179  me.iRing = nullptr;
1180  me.iSubdet = nullptr;
1181 
1182  std::map<std::string, LayerMEs>::iterator iLayer = LayerMEsMap.find(layer_id);
1183  if (iLayer != LayerMEsMap.end()) {
1184  me.iLayer = &(iLayer->second);
1185  }
1186 
1187  std::map<std::string, RingMEs>::iterator iRing = RingMEsMap.find(ring_id);
1188  if (iRing != RingMEsMap.end()) {
1189  me.iRing = &(iRing->second);
1190  }
1191 
1192  std::map<std::string, SubDetMEs>::iterator iSubdet = SubDetMEsMap.find(sdet_tag);
1193  if (iSubdet != SubDetMEsMap.end()) {
1194  me.iSubdet = &(iSubdet->second);
1195  }
1196 
1197  return me;
1198 }
1199 
1200 
1202 
1204  ev.getByToken(trackToken_, tracks);//takes the track collection
1205 
1206  //check that tracks are valid
1207  if( !tracks.isValid() ) return false;
1208 
1209  // loop over the tracks
1210  for ( const auto & track : *tracks) {
1211 
1212  // loop over the rechits of this track
1213  for (trackingRecHit_iterator hit = track.recHitsBegin(), ehit = track.recHitsEnd();
1214  hit!=ehit; ++hit) {
1215 
1216  uint32_t thedetid = (*hit)->rawId();
1217  if ( !(DetId(thedetid).subdetId() >=3 && DetId(thedetid).subdetId() <=6) ) { continue; }
1218 
1219  if (!(*hit)->isValid()) continue;
1220 
1221  const TrackingRecHit* theHit = (*hit);
1222  if ( theHit == NULL ) { continue; }
1223 
1224  edm::ESHandle<TrackerTopology> tTopoHandle;
1225  es.get<TrackerTopologyRcd>().get(tTopoHandle);
1226  const TrackerTopology* const tTopo = tTopoHandle.product();
1227 
1228  const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*>( theHit );
1229  const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*>( theHit );
1230 
1231  float sovn = -1.;
1232  if (hit1D && !hit2D) {
1233  const SiStripCluster* SiStripCluster_ = &*(hit1D->cluster());
1234  SiStripClusterInfo SiStripClusterInfo_(*SiStripCluster_,es,thedetid);
1235  sovn = SiStripClusterInfo_.signalOverNoise();
1236  }
1237 
1238  else if (!hit1D && hit2D) {
1239  const SiStripCluster* SiStripCluster_ = &*(hit2D->cluster());
1240  SiStripClusterInfo SiStripClusterInfo_(*SiStripCluster_,es,thedetid);
1241  sovn = SiStripClusterInfo_.signalOverNoise();
1242  }
1243 
1244 
1245  std::vector<const FedChannelConnection *> getFedChanConnections;
1246  getFedChanConnections = SiStripDetCabling_->getConnections(thedetid);
1247 
1248  // SiStripFolderOrganizer folder_organizer;
1249  // std::string sistripsubdet = folder_organizer.getSubDetFolderAndTag(thedetid, tTopo).second;
1250 
1251  // loop over the fed chan connections
1252  for ( const auto & getFedChanConnection : getFedChanConnections ) {
1253 
1254  if (getFedChanConnection==0) { continue; }
1255 
1256  int binfeccrate = getFedChanConnection->fecCrate();
1257  int binfecslot = getFedChanConnection->fecSlot();
1258  int binfecring = getFedChanConnection->fecRing();
1259  //int binccuchan = getFedChanConnections[i0]->ccuChan(); //will be used in a new PR
1260  //int binccuadd = getFedChanConnections[i0]->ccuAddr(); //will be used in a new PR
1261 
1262  return2DME(ClusterStoNCorr_OnTrack_FECCratevsFECSlot,binfecslot,binfeccrate,sovn);
1263 
1264  // TIB/TID
1265  // if ((sistripsubdet.find("TIB")) || (sistripsubdet.find("TID"))) {
1266  if ((DetId(thedetid).subdetId()==SiStripDetId::TIB) || ((DetId(thedetid).subdetId()==SiStripDetId::TID)) ) {
1268  return2DME(ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TIBTID,binfecring,binfecslot,sovn);
1269  }
1270 
1271  // TOB
1272  if ( DetId(thedetid).subdetId()==SiStripDetId::TOB ) {
1274  return2DME(ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TOB,binfecring,binfecslot,sovn);
1275  }
1276 
1277  // TECM
1278  if ( (DetId(thedetid).subdetId()==SiStripDetId::TEC) && (tTopo->tecSide(thedetid)==1) ) {
1280  return2DME(ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TECM,binfecring,binfecslot,sovn);
1281  }
1282 
1283  // TECP
1284  if ( (DetId(thedetid).subdetId()==SiStripDetId::TEC) && (tTopo->tecSide(thedetid)==2) ) {
1286  return2DME(ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TECP,binfecring,binfecslot,sovn);
1287  }
1288 
1289  } // end of looping over the fed chan connections
1290  } // end of looping over the rechits of the track
1291  } // end of looping over the tracks
1292 
1293  return true;
1294 }
1295 
1296 
1297 void SiStripMonitorTrack::return2DME(MonitorElement* input, int binx, int biny, double value) {
1298 
1299  if (input->getBinContent(binx,biny)==0.) { input->setBinContent(binx,biny,value); }
1300  else { input->setBinContent(binx,biny,((input->getBinContent(binx,biny)+value)/2.)); }
1301 
1302 }
1303 
1304 
1305 //------------------------------------------------------------------------
1308  SiStripClusterInfo* cluster,
1309  const uint32_t detid,
1310  enum ClusterFlags flag,
1311  bool track_ok,
1312  const LocalVector LV,
1313  const Det2MEs& MEs ,
1314  const TrackerTopology* tTopo,
1315  const SiStripGain* stripGain,
1316  const SiStripQuality* stripQuality,
1317  const edm::DetSetVector<SiStripDigi>& digilist
1318 )
1319 {
1320 
1321  if (cluster==NULL) return false;
1322  // if one imposes a cut on the clusters, apply it
1323  if( (applyClusterQuality_) &&
1324  (cluster->signalOverNoise() < sToNLowerLimit_ ||
1325  cluster->signalOverNoise() > sToNUpperLimit_ ||
1326  cluster->width() < widthLowerLimit_ ||
1327  cluster->width() > widthUpperLimit_) ) return false;
1328  // start of the analysis
1329 
1330  float cosRZ = -2;
1331  LogDebug("SiStripMonitorTrack")<< "\n\tLV " << LV.x() << " " << LV.y() << " " << LV.z() << " " << LV.mag() << std::endl;
1332  if (LV.mag()){
1333  cosRZ= fabs(LV.z())/LV.mag();
1334  LogDebug("SiStripMonitorTrack")<< "\n\t cosRZ " << cosRZ << std::endl;
1335  }
1336 
1337  // Filling SubDet/Layer Plots (on Track + off Track)
1338  float StoN = cluster->signalOverNoise();
1339  float noise = cluster->noiseRescaledByGain();
1340  uint16_t charge = cluster->charge();
1341  uint16_t width = cluster->width();
1342  float position = cluster->baryStrip();
1343 
1344  // Getting raw charge with strip gain.
1345  double chargeraw = 0;
1346  double clustergain = 0 ;
1347  auto digi_it = digilist.find(detid); //(digilist.isValid() ? digilist.find(detid) : digilist.end());
1348  // SiStripClusterInfo.stripCharges() <==> SiStripCluster.amplitudes()
1349  for( size_t chidx = 0 ; chidx < cluster->stripCharges().size() ; ++chidx ){
1350  if( cluster->stripCharges().at(chidx) <= 0 ){ continue ; } // nonzero amplitude
1351  if( stripQuality->IsStripBad(stripQuality->getRange(detid), cluster->firstStrip()+chidx)) { continue ; }
1352  clustergain += stripGain->getStripGain(cluster->firstStrip()+chidx, stripGain->getRange(detid));
1353  // Getting raw adc charge from digi collections
1354  if( digi_it == digilist.end() ){
1355  continue;
1356  } // skipping if not found
1357  for( const auto& digiobj : *digi_it ){
1358  if( digiobj.strip() == cluster->firstStrip() + chidx ){
1359  chargeraw += digiobj.adc();
1360  }
1361  }
1362  }
1363  clustergain /= double(cluster->stripCharges().size()) ; // calculating average gain inside cluster
1364 
1365 
1366  // new dE/dx (chargePerCM)
1367  // https://indico.cern.ch/event/342236/session/5/contribution/10/material/slides/0.pdf
1368  float dQdx_fromTrack = siStripClusterTools::chargePerCM(detid, *cluster, LV);
1369  // from straigth line origin-sensor centre
1370  const StripGeomDetUnit* DetUnit = static_cast<const StripGeomDetUnit*>(tkgeom_->idToDetUnit(DetId(detid)));
1371  LocalPoint locVtx = DetUnit->toLocal(GlobalPoint(0.0, 0.0, 0.0));
1372  LocalVector locDir(locVtx.x(), locVtx.y(), locVtx.z());
1373  float dQdx_fromOrigin = siStripClusterTools::chargePerCM(detid, *cluster, locDir);
1374 
1375  if (TkHistoMap_On_ && (flag == OnTrack)) {
1376  uint32_t adet=cluster->detId();
1377  if(track_ok) tkhisto_ClChPerCMfromTrack->fill(adet,dQdx_fromTrack);
1378  }
1379  if (clchCMoriginTkHmap_On_ && (flag == OffTrack)){
1380  uint32_t adet=cluster->detId();
1381  if(track_ok) tkhisto_ClChPerCMfromOrigin->fill(adet,dQdx_fromOrigin);
1382  }
1383 
1384  if(flag==OnTrack){
1385  if (MEs.iSubdet != nullptr) MEs.iSubdet->totNClustersOnTrack++;
1386  // layerMEs
1387  if (MEs.iLayer != nullptr) {
1388  if(noise > 0.0) fillME(MEs.iLayer->ClusterStoNCorrOnTrack, StoN*cosRZ);
1389  if(noise == 0.0) LogDebug("SiStripMonitorTrack") << "Module " << detid << " in Event " << eventNb << " noise " << cluster->noiseRescaledByGain() << std::endl;
1390  fillME(MEs.iLayer->ClusterGain, clustergain);
1391  fillME(MEs.iLayer->ClusterChargeCorrOnTrack, charge*cosRZ);
1392  fillME(MEs.iLayer->ClusterChargeOnTrack, charge);
1393  fillME(MEs.iLayer->ClusterChargeRawOnTrack, chargeraw);
1394  fillME(MEs.iLayer->ClusterNoiseOnTrack, noise);
1395  fillME(MEs.iLayer->ClusterWidthOnTrack, width);
1396  fillME(MEs.iLayer->ClusterPosOnTrack, position);
1397  if(track_ok) fillME(MEs.iLayer->ClusterChargePerCMfromTrack, dQdx_fromTrack);
1398  if(track_ok) fillME(MEs.iLayer->ClusterChargePerCMfromOriginOnTrack, dQdx_fromOrigin);
1399  }
1400  // ringMEs
1401  if (MEs.iRing != nullptr) {
1402  if(noise > 0.0) fillME(MEs.iRing->ClusterStoNCorrOnTrack, StoN*cosRZ);
1403  if(noise == 0.0) LogDebug("SiStripMonitorTrack") << "Module " << detid << " in Event " << eventNb << " noise " << cluster->noiseRescaledByGain() << std::endl;
1404  fillME(MEs.iRing->ClusterGain, clustergain);
1405  fillME(MEs.iRing->ClusterChargeCorrOnTrack, charge*cosRZ);
1406  fillME(MEs.iRing->ClusterChargeOnTrack, charge);
1407  fillME(MEs.iRing->ClusterChargeRawOnTrack, chargeraw);
1408  fillME(MEs.iRing->ClusterNoiseOnTrack, noise);
1409  fillME(MEs.iRing->ClusterWidthOnTrack, width);
1410  fillME(MEs.iRing->ClusterPosOnTrack, position);
1411  if(track_ok) fillME(MEs.iRing->ClusterChargePerCMfromTrack, dQdx_fromTrack);
1412  if(track_ok) fillME(MEs.iRing->ClusterChargePerCMfromOriginOnTrack, dQdx_fromOrigin);
1413  }
1414  // subdetMEs
1415  if(MEs.iSubdet != nullptr){
1416  fillME(MEs.iSubdet->ClusterGain, clustergain);
1417  fillME(MEs.iSubdet->ClusterChargeOnTrack,charge);
1418  fillME(MEs.iSubdet->ClusterChargeRawOnTrack,chargeraw);
1419  if(noise > 0.0) fillME(MEs.iSubdet->ClusterStoNCorrOnTrack,StoN*cosRZ);
1420  fillME(MEs.iSubdet->ClusterChargeCorrOnTrack, charge*cosRZ);
1421  if(track_ok) fillME(MEs.iSubdet->ClusterChargePerCMfromTrack,dQdx_fromTrack);
1422  if(track_ok) fillME(MEs.iSubdet->ClusterChargePerCMfromOriginOnTrack,dQdx_fromOrigin);
1423  if( tTopo->moduleGeometry(detid) == SiStripDetId::ModuleGeometry::W5 || tTopo->moduleGeometry(detid) == SiStripDetId::ModuleGeometry::W6 || tTopo->moduleGeometry(detid) == SiStripDetId::ModuleGeometry::W7) {
1424  if(noise > 0.0) fillME(MEs.iSubdet->ClusterStoNCorrThickOnTrack, StoN*cosRZ);
1425  fillME(MEs.iSubdet->ClusterChargeCorrThickOnTrack, charge*cosRZ);
1426  } else {
1427  if(noise > 0.0) fillME(MEs.iSubdet->ClusterStoNCorrThinOnTrack, StoN*cosRZ);
1428  fillME(MEs.iSubdet->ClusterChargeCorrThinOnTrack, charge*cosRZ);
1429  }
1430  }
1431  //******** TkHistoMaps
1432  if (TkHistoMap_On_) {
1433  uint32_t adet=cluster->detId();
1434  tkhisto_NumOnTrack->add(adet,1.);
1435  if(noise > 0.0) tkhisto_StoNCorrOnTrack->fill(adet,cluster->signalOverNoise()*cosRZ);
1436  if(noise == 0.0)
1437  LogDebug("SiStripMonitorTrack") << "Module " << detid << " in Event " << eventNb << " noise " << noise << std::endl;
1438  }
1439  // Module plots filled only for onTrack Clusters
1440  if(Mod_On_){
1441  SiStripHistoId hidmanager2;
1442  std::string name = hidmanager2.createHistoId("","det",detid);
1443  //fillModMEs
1444  std::map<std::string, ModMEs>::iterator iModME = ModMEsMap.find(name);
1445  if(iModME!=ModMEsMap.end()){
1446  if(noise > 0.0) fillME(iModME->second.ClusterStoNCorr ,StoN*cosRZ);
1447  if(noise == 0.0) LogDebug("SiStripMonitorTrack") << "Module " << name << " in Event " << eventNb << " noise " << noise << std::endl;
1448  fillME(iModME->second.ClusterGain, clustergain);
1449  fillME(iModME->second.ClusterCharge,charge);
1450  fillME(iModME->second.ClusterChargeRaw,chargeraw);
1451 
1452  fillME(iModME->second.ClusterChargeCorr,charge*cosRZ);
1453 
1454  fillME(iModME->second.ClusterWidth ,width);
1455  fillME(iModME->second.ClusterPos ,position);
1456 
1457  if(track_ok) fillME(iModME->second.ClusterChargePerCMfromTrack, dQdx_fromTrack);
1458  if(track_ok) fillME(iModME->second.ClusterChargePerCMfromOrigin, dQdx_fromOrigin);
1459 
1460  //fill the PGV histo
1461  float PGVmax = cluster->maxCharge();
1462  int PGVposCounter = cluster->maxIndex();
1463  for (int i= int(conf_.getParameter<edm::ParameterSet>("TProfileClusterPGV").getParameter<double>("xmin"));i<PGVposCounter;++i)
1464  fillME(iModME->second.ClusterPGV, i,0.);
1465  for (auto it=cluster->stripCharges().begin();it<cluster->stripCharges().end();++it) {
1466  fillME(iModME->second.ClusterPGV, PGVposCounter++,(*it)/PGVmax);
1467  }
1468  for (int i= PGVposCounter;i<int(conf_.getParameter<edm::ParameterSet>("TProfileClusterPGV").getParameter<double>("xmax"));++i)
1469  fillME(iModME->second.ClusterPGV, i,0.);
1470  //end fill the PGV histo
1471  }
1472  }
1473  } else {
1474  if (flag == OffTrack) {
1475  if (MEs.iSubdet != nullptr) MEs.iSubdet->totNClustersOffTrack++;
1476  //******** TkHistoMaps
1477  if (TkHistoMap_On_) {
1478  uint32_t adet=cluster->detId();
1479  tkhisto_NumOffTrack->add(adet,1.);
1480  if(charge > 250){
1481  LogDebug("SiStripMonitorTrack") << "Module firing " << detid << " in Event " << eventNb << std::endl;
1482  }
1483  }
1484  }
1485  // layerMEs
1486  if (MEs.iLayer != nullptr) {
1487  fillME(MEs.iLayer->ClusterGain, clustergain);
1488  fillME(MEs.iLayer->ClusterChargeOffTrack, charge);
1489  fillME(MEs.iLayer->ClusterChargeRawOffTrack, chargeraw);
1490  fillME(MEs.iLayer->ClusterNoiseOffTrack, noise);
1491  fillME(MEs.iLayer->ClusterWidthOffTrack, width);
1492  fillME(MEs.iLayer->ClusterPosOffTrack, position);
1493  fillME(MEs.iLayer->ClusterChargePerCMfromOriginOffTrack, dQdx_fromOrigin);
1494  }
1495  // ringMEs
1496  if (MEs.iRing != nullptr) {
1497  fillME(MEs.iRing->ClusterGain, clustergain);
1498  fillME(MEs.iRing->ClusterChargeOffTrack, charge);
1499  fillME(MEs.iRing->ClusterChargeRawOffTrack, chargeraw);
1500  fillME(MEs.iRing->ClusterNoiseOffTrack, noise);
1501  fillME(MEs.iRing->ClusterWidthOffTrack, width);
1502  fillME(MEs.iRing->ClusterPosOffTrack, position);
1503  fillME(MEs.iRing->ClusterChargePerCMfromOriginOffTrack, dQdx_fromOrigin);
1504  }
1505  // subdetMEs
1506  if(MEs.iSubdet != nullptr){
1507  fillME(MEs.iSubdet->ClusterGain, clustergain);
1508  fillME(MEs.iSubdet->ClusterChargeOffTrack,charge);
1509  fillME(MEs.iSubdet->ClusterChargeRawOffTrack,chargeraw);
1510  if(noise > 0.0) fillME(MEs.iSubdet->ClusterStoNOffTrack,StoN);
1511  fillME(MEs.iSubdet->ClusterChargePerCMfromOriginOffTrack,dQdx_fromOrigin);
1512  }
1513  }
1514  return true;
1515 }
1516 //--------------------------------------------------------------------------------
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:39
ClusterRef cluster() const
MonitorElement * ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TIBTID
uint8_t maxCharge() const
double p() const
momentum vector magnitude
Definition: TrackBase.h:615
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
Det2MEs findMEs(const TrackerTopology *tTopo, const uint32_t detid)
MonitorElement * ClusterStoNCorr_OnTrack_TECP
void return2DME(MonitorElement *input, int binx, int biny, double value)
MonitorElement * ClusterChargePerCMfromTrack
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
TkHistoMap * tkhisto_NumOffTrack
void setBinContent(int binx, double content)
set content of bin (1-D)
uint16_t firstStrip() const
void addActiveDetectorsRawIds(std::vector< uint32_t > &) const
SiStripMonitorTrack(const edm::ParameterSet &)
iterator find(det_id_type id)
Definition: DetSetVector.h:290
void setSiStripFolderName(std::string name)
void trackStudy(const edm::Event &ev, const edm::EventSetup &es)
edm::EDGetTokenT< reco::TrackCollection > trackToken_
const GeomDetUnit * monoDet() const
Definition: GluedGeomDet.h:20
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
void fillME(MonitorElement *ME, float value1)
const TrackExtraRef & extra() const
reference to "extra" object
Definition: Track.h:189
std::pair< const std::string, const char * > getSubDetFolderAndTag(const uint32_t &detid, const TrackerTopology *tTopo)
SiStripDCSStatus * dcsStatus_
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
Definition: TrackBase.h:561
MonitorElement * bookProfile(Args &&...args)
Definition: DQMStore.h:157
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:460
float noiseRescaledByGain() const
void book(DQMStore::IBooker &, const TrackerTopology *tTopo)
void AllClusters(const edm::Event &ev, const edm::EventSetup &es)
math::XYZTLorentzVectorD LV
size_t recHitsSize() const
Get number of RecHits. (Warning, this includes invalid hits, which are not physical hits)...
Definition: Track.h:119
bool IsStripBad(const uint32_t &detid, const short &strip) const
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:54
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:14
edm::ParameterSet conf_
T y() const
Definition: PV3DBase.h:63
void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:69
MonitorElement * bookME1D(DQMStore::IBooker &, const char *, const char *)
#define NULL
Definition: scimark2.h:8
MonitorElement * ClusterChargePerCMfromTrack
void setLayerFolder(uint32_t rawdetid, const TrackerTopology *tTopo, int32_t layer=0, bool ring_flag=false)
bool ev
SiStripDetId::ModuleGeometry moduleGeometry(const DetId &id) const
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
bool trackFilter(const reco::Track &track)
edm::ESHandle< SiStripDetCabling > SiStripDetCabling_
void bookLayerMEs(DQMStore::IBooker &, const uint32_t, std::string &)
uint16_t maxIndex() const
auto stripCharges() const -> decltype(cluster() ->amplitudes())
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
MonitorElement * ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TECM
MonitorElement * ClusterChargePerCMfromOriginOffTrack
static std::string const input
Definition: EdmProvDump.cc:44
bool clusterInfos(SiStripClusterInfo *cluster, const uint32_t detid, enum ClusterFlags flags, bool track_ok, LocalVector LV, const Det2MEs &MEs, const TrackerTopology *tTopo, const SiStripGain *stripGain, const SiStripQuality *stripQuality, const edm::DetSetVector< SiStripDigi > &digilist)
void Fill(long long x)
MonitorElement * ClusterChargeCorrThinOnTrack
void setDetectorFolder(uint32_t rawdetid, const TrackerTopology *tTopo)
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
edm::ESHandle< TrackerGeometry > tkgeom_
const std::vector< const FedChannelConnection * > & getConnections(uint32_t det_id) const
bool getStatus(edm::Event const &e, edm::EventSetup const &eSetup)
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
edmNew::DetSet< SiStripCluster >::const_iterator ClusIter
float signalOverNoise() const
T mag() const
Definition: PV3DBase.h:67
MonitorElement * ClusterChargeRawOnTrack
vector< ParameterSet > Parameters
MonitorElement * ClusterStoNCorr_OnTrack_TOB
edm::EventNumber_t eventNb
TkHistoMap * tkhisto_NumMissingHits
uint16_t charge() const
std::unordered_set< const SiStripCluster * > vPSiStripCluster
std::map< std::string, SubDetMEs > SubDetMEsMap
static float getStripGain(const uint16_t &strip, const SiStripApvGain::Range &range)
Definition: SiStripGain.h:68
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.
double pt() const
track transverse momentum
Definition: TrackBase.h:621
const std::string subdet_tag("SubDet")
T z() const
Definition: PV3DBase.h:64
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:289
TH1 * getTH1(void) const
void bookSubDetMEs(DQMStore::IBooker &, std::string &name)
MonitorElement * bookME3D(DQMStore::IBooker &, const char *, const char *)
ClusterRef cluster() const
void dqmBeginRun(const edm::Run &run, const edm::EventSetup &es) override
Definition: value.py:1
int orbitNumber() const
Definition: EventBase.h:67
MonitorElement * ClusterChargePerCMfromOrigin
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:104
MonitorElement * ClusterChargePerCMfromOriginOffTrack
SiStripFolderOrganizer folderOrganizer_
std::string getSubdetid(uint32_t id, const TrackerTopology *tTopo, bool flag_ring)
MonitorElement * ClusterChargePerCMfromTrack
bool isValid() const
Definition: HandleBase.h:74
edm::EDGetTokenT< edm::DetSetVector< SiStripDigi > > digiToken_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:361
#define LogTrace(id)
MonitorElement * ClusterChargeCorrThickOnTrack
SiStripRecHit2D originalHit() const
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:17
void trackStudyFromTrajectory(edm::Handle< reco::TrackCollection > trackCollectionHandle, const edm::DetSetVector< SiStripDigi > &digilist, const edm::Event &ev, const edm::EventSetup &es)
Definition: DetId.h:18
void bookModMEs(DQMStore::IBooker &, const uint32_t)
TkHistoMap * tkhisto_NumberInactiveHits
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
TkHistoMap * tkhisto_ClChPerCMfromOrigin
SiStripRecHit2D stereoHit() const
MonitorElement * ClusterStoNCorr_OnTrack_FECCratevsFECSlot
T const * product() const
Definition: Handle.h:81
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
MonitorElement * ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TECP
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:446
std::string createHistoId(std::string description, std::string id_type, uint32_t component_id)
MonitorElement * ClusterChargePerCMfromTrack
const T & get() const
Definition: EventSetup.h:55
void hitStudy(const edm::Event &ev, const edm::EventSetup &es, const edm::DetSetVector< SiStripDigi > &digilist, const ProjectedSiStripRecHit2D *projhit, const SiStripMatchedRecHit2D *matchedhit, const SiStripRecHit2D *hit2D, const SiStripRecHit1D *hit1D, LocalVector localMomentum, const bool track_ok)
void RecHitInfo(const T *tkrecHit, LocalVector LV, const edm::DetSetVector< SiStripDigi > &digilist, const edm::Event &ev, const edm::EventSetup &es, bool ok)
std::map< std::string, ModMEs > ModMEsMap
MonitorElement * bookMETrend(DQMStore::IBooker &, const char *)
void trackStudyFromTrack(edm::Handle< reco::TrackCollection > trackCollectionHandle, const edm::DetSetVector< SiStripDigi > &digilist, const edm::Event &ev, const edm::EventSetup &es)
TkHistoMap * tkhisto_ClChPerCMfromTrack
std::string HistoName
std::pair< std::string, int32_t > GetSubDetAndLayer(const uint32_t &detid, const TrackerTopology *tTopo, bool ring_flag=false)
MonitorElement * ClusterStoNCorr_OnTrack_FECSlotVsFECRing_TOB
int numberOfValidTrackerHits() const
Definition: HitPattern.h:828
TkHistoMap * tkhisto_NumOnTrack
MonitorElement * ClusterStoNCorr_OnTrack_TIBTID
SiStripRecHit2D monoHit() const
uint32_t detId() const
GenericTriggerEventFlag * genTriggerEventFlag_
const uint16_t nApvPairs(uint32_t det_id) const
MonitorElement * ClusterChargePerCMfromOriginOnTrack
double getBinContent(int binx) const
get content of bin (1-D)
edm::EventID id() const
Definition: EventBase.h:60
fixed size matrix
const Range getRange(const uint32_t detID) const
HLT enums.
MonitorElement * handleBookMEs(DQMStore::IBooker &, std::string &, std::string &, std::string &, std::string &)
static int position[264][3]
Definition: ReadPGInfo.cc:509
const TrackerGeomDet * idToDet(DetId) const override
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
std::string createHistoLayer(std::string description, std::string id_type, std::string path, std::string flag)
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 &)
T const * product() const
Definition: ESHandle.h:86
MonitorElement * ClusterStoNCorrThickOnTrack
MonitorElement * ClusterChargePerCMfromOriginOnTrack
void add(uint32_t &detid, float value)
Definition: TkHistoMap.cc:213
TkHistoMap * tkhisto_NumberValidHits
const DetUnitContainer & detUnits() const override
Returm a vector of all GeomDetUnit.
virtual void analyze(const edm::Event &, const edm::EventSetup &) override
void trajectoryStudy(const reco::Track &track, const edm::DetSetVector< SiStripDigi > &digilist, const edm::Event &ev, const edm::EventSetup &es, bool track_ok)
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:42
bool fillControlViewHistos(const edm::Event &ev, const edm::EventSetup &es)
unsigned int tecSide(const DetId &id) const
MonitorElement * ClusterStoNCorr_OnTrack_TECM
MonitorElement * ClusterChargeRawOffTrack
const SiStripApvGain::Range getRange(uint32_t detID) const
Definition: SiStripGain.h:66
edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > clusterToken_
std::map< std::string, LayerMEs > LayerMEsMap
MonitorElement * ClusterChargePerCMfromOriginOffTrack