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 
5 
21 
23 
25 #include "TMath.h"
26 
28  dbe(edm::Service<DQMStore>().operator->()),
29  conf_(conf),
30  tracksCollection_in_EventTree(true),
31  firstEvent(-1),
32  genTriggerEventFlag_(new GenericTriggerEventFlag(conf))
33 {
34  Cluster_src_ = conf.getParameter<edm::InputTag>("Cluster_src");
35  Mod_On_ = conf.getParameter<bool>("Mod_On");
36  Trend_On_ = conf.getParameter<bool>("Trend_On");
37  flag_ring = conf.getParameter<bool>("RingFlag_On");
38  TkHistoMap_On_ = conf.getParameter<bool>("TkHistoMap_On");
39 
40  TrackProducer_ = conf_.getParameter<std::string>("TrackProducer");
41  TrackLabel_ = conf_.getParameter<std::string>("TrackLabel");
42 
43  // cluster quality conditions
44  edm::ParameterSet cluster_condition = conf_.getParameter<edm::ParameterSet>("ClusterConditions");
45  applyClusterQuality_ = cluster_condition.getParameter<bool>("On");
46  sToNLowerLimit_ = cluster_condition.getParameter<double>("minStoN");
47  sToNUpperLimit_ = cluster_condition.getParameter<double>("maxStoN");
48  widthLowerLimit_ = cluster_condition.getParameter<double>("minWidth");
49  widthUpperLimit_ = cluster_condition.getParameter<double>("maxWidth");
50 
51 
52  // Create DCS Status
53  bool checkDCS = conf_.getParameter<bool>("UseDCSFiltering");
54  if (checkDCS) dcsStatus_ = new SiStripDCSStatus();
55  else dcsStatus_ = 0;
56 }
57 
58 //------------------------------------------------------------------------
60  if (dcsStatus_) delete dcsStatus_;
62 }
63 
64 //------------------------------------------------------------------------
66 {
67  //get geom
69  LogDebug("SiStripMonitorTrack") << "[SiStripMonitorTrack::beginRun] There are "<<tkgeom->detUnits().size() <<" detectors instantiated in the geometry" << std::endl;
71 
72  book();
73 
74  // Initialize the GenericTriggerEventFlag
76 }
77 
78 //------------------------------------------------------------------------
80 {
81  if(conf_.getParameter<bool>("OutputMEsInRootFile")){
83  dbe->save(conf_.getParameter<std::string>("OutputFileName"));
84  }
85 }
86 
87 // ------------ method called to produce the data ------------
89 {
90  // Filter out events if DCS checking is requested
91  if (dcsStatus_ && !dcsStatus_->getStatus(e,es)) return;
92 
93  // Filter out events if Trigger Filtering is requested
94  if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( e, es) ) return;
95 
96  //initialization of global quantities
97  LogDebug("SiStripMonitorTrack") << "[SiStripMonitorTrack::analyse] " << "Run " << e.id().run() << " Event " << e.id().event() << std::endl;
98  runNb = e.id().run();
99  eventNb = e.id().event();
100  vPSiStripCluster.clear();
101 
102  iOrbitSec = e.orbitNumber()/11223.0;
103 
104  // initialise # of clusters
105  for (std::map<std::string, SubDetMEs>::iterator iSubDet = SubDetMEsMap.begin();
106  iSubDet != SubDetMEsMap.end(); iSubDet++) {
107  iSubDet->second.totNClustersOnTrack = 0;
108  iSubDet->second.totNClustersOffTrack = 0;
109  }
110 
111  //Perform track study
112  trackStudy(e, es);
113 
114  //Perform Cluster Study (irrespectively to tracks)
115 
116  AllClusters(e, es); //analyzes the off Track Clusters
117 
118  //Summary Counts of clusters
119  std::map<std::string, MonitorElement*>::iterator iME;
120  std::map<std::string, LayerMEs>::iterator iLayerME;
121 
122  for (std::map<std::string, SubDetMEs>::iterator iSubDet = SubDetMEsMap.begin();
123  iSubDet != SubDetMEsMap.end(); iSubDet++) {
124  SubDetMEs subdet_mes = iSubDet->second;
125  if (subdet_mes.totNClustersOnTrack > 0) {
126  fillME(subdet_mes.nClustersOnTrack, subdet_mes.totNClustersOnTrack);
127  }
128  fillME(subdet_mes.nClustersOffTrack, subdet_mes.totNClustersOffTrack);
129  if (Trend_On_) {
132  }
133  }
134 }
135 
136 //------------------------------------------------------------------------
138 {
139 
140  SiStripFolderOrganizer folder_organizer;
141  //******** TkHistoMaps
142  if (TkHistoMap_On_) {
143  tkhisto_StoNCorrOnTrack = new TkHistoMap("SiStrip/TkHisto" ,"TkHMap_StoNCorrOnTrack",0.0,1);
144  tkhisto_NumOnTrack = new TkHistoMap("SiStrip/TkHisto", "TkHMap_NumberOfOnTrackCluster",0.0,1);
145  tkhisto_NumOffTrack = new TkHistoMap("SiStrip/TkHisto", "TkHMap_NumberOfOfffTrackCluster",0.0,1);
146  }
147  //******** TkHistoMaps
148 
149  std::vector<uint32_t> vdetId_;
150  SiStripDetCabling_->addActiveDetectorsRawIds(vdetId_);
151  //Histos for each detector, layer and module
152  for (std::vector<uint32_t>::const_iterator detid_iter=vdetId_.begin();detid_iter!=vdetId_.end();detid_iter++){ //loop on all the active detid
153  uint32_t detid = *detid_iter;
154 
155  if (detid < 1){
156  edm::LogError("SiStripMonitorTrack")<< "[" <<__PRETTY_FUNCTION__ << "] invalid detid " << detid<< std::endl;
157  continue;
158  }
159 
160 
161  std::string name;
162 
163  // book Layer and RING plots
164  std::pair<std::string,int32_t> det_layer_pair = folder_organizer.GetSubDetAndLayer(detid,flag_ring);
165 
166  SiStripHistoId hidmanager;
167  std::string layer_id = hidmanager.getSubdetid(detid, flag_ring);
168  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(layer_id);
169  if(iLayerME==LayerMEsMap.end()){
170  folder_organizer.setLayerFolder(detid, det_layer_pair.second, flag_ring);
171  bookLayerMEs(detid, layer_id);
172  }
173  // book sub-detector plots
174  std::pair<std::string,std::string> sdet_pair = folder_organizer.getSubDetFolderAndTag(detid);
175  if (SubDetMEsMap.find(sdet_pair.second) == SubDetMEsMap.end()){
176  dbe->setCurrentFolder(sdet_pair.first);
177  bookSubDetMEs(sdet_pair.second);
178  }
179  // book module plots
180  if(Mod_On_) {
181  folder_organizer.setDetectorFolder(detid);
182  bookModMEs(*detid_iter);
183  }
184  }//end loop on detectors detid
185 }
186 
187 //--------------------------------------------------------------------------------
188 void SiStripMonitorTrack::bookModMEs(const uint32_t & id)//Histograms at MODULE level
189 {
190  std::string name = "det";
191  SiStripHistoId hidmanager;
192  std::string hid = hidmanager.createHistoId("",name,id);
193  std::map<std::string, ModMEs>::iterator iModME = ModMEsMap.find(hid);
194  if(iModME==ModMEsMap.end()){
195  ModMEs theModMEs;
196  theModMEs.ClusterStoNCorr = 0;
197  theModMEs.ClusterCharge = 0;
198  theModMEs.ClusterChargeCorr = 0;
199  theModMEs.ClusterWidth = 0;
200  theModMEs.ClusterPos = 0;
201  theModMEs.ClusterPGV = 0;
202 
203  // Cluster Width
204  theModMEs.ClusterWidth=bookME1D("TH1ClusterWidth", hidmanager.createHistoId("ClusterWidth_OnTrack",name,id).c_str());
205  dbe->tag(theModMEs.ClusterWidth,id);
206  // Cluster Charge
207  theModMEs.ClusterCharge=bookME1D("TH1ClusterCharge", hidmanager.createHistoId("ClusterCharge_OnTrack",name,id).c_str());
208  dbe->tag(theModMEs.ClusterCharge,id);
209  // Cluster Charge Corrected
210  theModMEs.ClusterChargeCorr=bookME1D("TH1ClusterChargeCorr", hidmanager.createHistoId("ClusterChargeCorr_OnTrack",name,id).c_str());
211  dbe->tag(theModMEs.ClusterChargeCorr,id);
212  // Cluster StoN Corrected
213  theModMEs.ClusterStoNCorr=bookME1D("TH1ClusterStoNCorrMod", hidmanager.createHistoId("ClusterStoNCorr_OnTrack",name,id).c_str());
214  dbe->tag(theModMEs.ClusterStoNCorr,id);
215  // Cluster Position
216  short total_nr_strips = SiStripDetCabling_->nApvPairs(id) * 2 * 128;
217  theModMEs.ClusterPos=dbe->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);
218  dbe->tag(theModMEs.ClusterPos,id);
219  // Cluster PGV
220  theModMEs.ClusterPGV=bookMEProfile("TProfileClusterPGV", hidmanager.createHistoId("PGV_OnTrack",name,id).c_str());
221  dbe->tag(theModMEs.ClusterPGV,id);
222 
223  ModMEsMap[hid]=theModMEs;
224  }
225 }
226 //
227 // -- Book Layer Level Histograms and Trend plots
228 //
229 void SiStripMonitorTrack::bookLayerMEs(const uint32_t& mod_id, std::string& layer_id)
230 {
231  std::string name = "layer";
232  std::string hname;
233  SiStripHistoId hidmanager;
234 
235  LayerMEs theLayerMEs;
236  theLayerMEs.ClusterStoNCorrOnTrack = 0;
237  theLayerMEs.ClusterChargeCorrOnTrack = 0;
238  theLayerMEs.ClusterChargeOnTrack = 0;
239  theLayerMEs.ClusterChargeOffTrack = 0;
240  theLayerMEs.ClusterNoiseOnTrack = 0;
241  theLayerMEs.ClusterNoiseOffTrack = 0;
242  theLayerMEs.ClusterWidthOnTrack = 0;
243  theLayerMEs.ClusterWidthOffTrack = 0;
244  theLayerMEs.ClusterPosOnTrack = 0;
245  theLayerMEs.ClusterPosOffTrack = 0;
246 
247  // Cluster StoN Corrected
248  hname = hidmanager.createHistoLayer("Summary_ClusterStoNCorr",name,layer_id,"OnTrack");
249  theLayerMEs.ClusterStoNCorrOnTrack = bookME1D("TH1ClusterStoNCorr", hname.c_str());
250 
251  // Cluster Charge Corrected
252  hname = hidmanager.createHistoLayer("Summary_ClusterChargeCorr",name,layer_id,"OnTrack");
253  theLayerMEs.ClusterChargeCorrOnTrack = bookME1D("TH1ClusterChargeCorr", hname.c_str());
254 
255  // Cluster Charge (On and Off Track)
256  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,layer_id,"OnTrack");
257  theLayerMEs.ClusterChargeOnTrack = bookME1D("TH1ClusterCharge", hname.c_str());
258 
259  hname = hidmanager.createHistoLayer("Summary_ClusterCharge",name,layer_id,"OffTrack");
260  theLayerMEs.ClusterChargeOffTrack = bookME1D("TH1ClusterCharge", hname.c_str());
261 
262  // Cluster Noise (On and Off Track)
263  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,layer_id,"OnTrack");
264  theLayerMEs.ClusterNoiseOnTrack = bookME1D("TH1ClusterNoise", hname.c_str());
265 
266  hname = hidmanager.createHistoLayer("Summary_ClusterNoise",name,layer_id,"OffTrack");
267  theLayerMEs.ClusterNoiseOffTrack = bookME1D("TH1ClusterNoise", hname.c_str());
268 
269  // Cluster Width (On and Off Track)
270  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,layer_id,"OnTrack");
271  theLayerMEs.ClusterWidthOnTrack = bookME1D("TH1ClusterWidth", hname.c_str());
272 
273  hname = hidmanager.createHistoLayer("Summary_ClusterWidth",name,layer_id,"OffTrack");
274  theLayerMEs.ClusterWidthOffTrack = bookME1D("TH1ClusterWidth", hname.c_str());
275 
276  //Cluster Position
277  short total_nr_strips = SiStripDetCabling_->nApvPairs(mod_id) * 2 * 128;
278  if (layer_id.find("TEC") != std::string::npos && !flag_ring) total_nr_strips = 3 * 2 * 128;
279 
280  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,layer_id,"OnTrack");
281  theLayerMEs.ClusterPosOnTrack = dbe->book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
282 
283  hname = hidmanager.createHistoLayer("Summary_ClusterPosition",name,layer_id,"OffTrack");
284  theLayerMEs.ClusterPosOffTrack = dbe->book1D(hname, hname, total_nr_strips, 0.5,total_nr_strips+0.5);
285 
286  //bookeeping
287  LayerMEsMap[layer_id]=theLayerMEs;
288 }
289 //
290 // -- Book Histograms at Sub-Detector Level
291 //
293 
294  std::string subdet_tag;
295  subdet_tag = "__" + name;
296  std::string completeName;
297 
298  SubDetMEs theSubDetMEs;
299  theSubDetMEs.totNClustersOnTrack = 0;
300  theSubDetMEs.totNClustersOffTrack = 0;
301  theSubDetMEs.nClustersOnTrack = 0;
302  theSubDetMEs.nClustersTrendOnTrack = 0;
303  theSubDetMEs.nClustersOffTrack = 0;
304  theSubDetMEs.nClustersTrendOffTrack = 0;
305  theSubDetMEs.ClusterStoNCorrOnTrack = 0;
306  theSubDetMEs.ClusterChargeOffTrack = 0;
307  theSubDetMEs.ClusterStoNOffTrack = 0;
308 
309  // TotalNumber of Cluster OnTrack
310  completeName = "Summary_TotalNumberOfClusters_OnTrack" + subdet_tag;
311  theSubDetMEs.nClustersOnTrack = bookME1D("TH1nClustersOn", completeName.c_str());
312  theSubDetMEs.nClustersOnTrack->getTH1()->StatOverflows(kTRUE);
313 
314  // TotalNumber of Cluster OffTrack
315  completeName = "Summary_TotalNumberOfClusters_OffTrack" + subdet_tag;
316  theSubDetMEs.nClustersOffTrack = bookME1D("TH1nClustersOff", completeName.c_str());
317  theSubDetMEs.nClustersOffTrack->getTH1()->StatOverflows(kTRUE);
318 
319  // Cluster StoN On Track
320  completeName = "Summary_ClusterStoNCorr_OnTrack" + subdet_tag;
321  theSubDetMEs.ClusterStoNCorrOnTrack = bookME1D("TH1ClusterStoNCorr", completeName.c_str());
322 
323  // Cluster Charge Off Track
324  completeName = "Summary_ClusterCharge_OffTrack" + subdet_tag;
325  theSubDetMEs.ClusterChargeOffTrack=bookME1D("TH1ClusterCharge", completeName.c_str());
326 
327  // Cluster Charge StoN Off Track
328  completeName = "Summary_ClusterStoN_OffTrack" + subdet_tag;
329  theSubDetMEs.ClusterStoNOffTrack = bookME1D("TH1ClusterStoN", completeName.c_str());
330 
331  if(Trend_On_){
332  // TotalNumber of Cluster
333  completeName = "Trend_TotalNumberOfClusters_OnTrack" + subdet_tag;
334  theSubDetMEs.nClustersTrendOnTrack = bookMETrend("TH1nClustersOn", completeName.c_str());
335  completeName = "Trend_TotalNumberOfClusters_OffTrack" + subdet_tag;
336  theSubDetMEs.nClustersTrendOffTrack = bookMETrend("TH1nClustersOff", completeName.c_str());
337  }
338  //bookeeping
339  SubDetMEsMap[name]=theSubDetMEs;
340 }
341 //--------------------------------------------------------------------------------
342 
343 MonitorElement* SiStripMonitorTrack::bookME1D(const char* ParameterSetLabel, const char* HistoName)
344 {
345  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
346  return dbe->book1D(HistoName,HistoName,
347  Parameters.getParameter<int32_t>("Nbinx"),
348  Parameters.getParameter<double>("xmin"),
349  Parameters.getParameter<double>("xmax")
350  );
351 }
352 
353 //--------------------------------------------------------------------------------
354 MonitorElement* SiStripMonitorTrack::bookME2D(const char* ParameterSetLabel, const char* HistoName)
355 {
356  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
357  return dbe->book2D(HistoName,HistoName,
358  Parameters.getParameter<int32_t>("Nbinx"),
359  Parameters.getParameter<double>("xmin"),
360  Parameters.getParameter<double>("xmax"),
361  Parameters.getParameter<int32_t>("Nbiny"),
362  Parameters.getParameter<double>("ymin"),
363  Parameters.getParameter<double>("ymax")
364  );
365 }
366 
367 //--------------------------------------------------------------------------------
368 MonitorElement* SiStripMonitorTrack::bookME3D(const char* ParameterSetLabel, const char* HistoName)
369 {
370  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
371  return dbe->book3D(HistoName,HistoName,
372  Parameters.getParameter<int32_t>("Nbinx"),
373  Parameters.getParameter<double>("xmin"),
374  Parameters.getParameter<double>("xmax"),
375  Parameters.getParameter<int32_t>("Nbiny"),
376  Parameters.getParameter<double>("ymin"),
377  Parameters.getParameter<double>("ymax"),
378  Parameters.getParameter<int32_t>("Nbinz"),
379  Parameters.getParameter<double>("zmin"),
380  Parameters.getParameter<double>("zmax")
381  );
382 }
383 
384 //--------------------------------------------------------------------------------
385 MonitorElement* SiStripMonitorTrack::bookMEProfile(const char* ParameterSetLabel, const char* HistoName)
386 {
387  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
388  return dbe->bookProfile(HistoName,HistoName,
389  Parameters.getParameter<int32_t>("Nbinx"),
390  Parameters.getParameter<double>("xmin"),
391  Parameters.getParameter<double>("xmax"),
392  Parameters.getParameter<int32_t>("Nbiny"),
393  Parameters.getParameter<double>("ymin"),
394  Parameters.getParameter<double>("ymax"),
395  "" );
396 }
397 
398 //--------------------------------------------------------------------------------
399 MonitorElement* SiStripMonitorTrack::bookMETrend(const char* ParameterSetLabel, const char* HistoName)
400 {
401  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
402  edm::ParameterSet ParametersTrend = conf_.getParameter<edm::ParameterSet>("Trending");
403  MonitorElement* me = dbe->bookProfile(HistoName,HistoName,
404  ParametersTrend.getParameter<int32_t>("Nbins"),
405  0,
406  ParametersTrend.getParameter<int32_t>("Nbins"),
407  100, //that parameter should not be there !?
408  Parameters.getParameter<double>("xmin"),
409  Parameters.getParameter<double>("xmax"),
410  "" );
411  if (me->kind() == MonitorElement::DQM_KIND_TPROFILE) me->getTH1()->SetBit(TH1::kCanRebin);
412 
413  if(!me) return me;
414  me->setAxisTitle("Event Time in Seconds",1);
415  return me;
416 }
417 
418 //------------------------------------------------------------------------------------------
420 
421  // track input
422 
423  edm::Handle<reco::TrackCollection > trackCollectionHandle;
424  ev.getByLabel(TrackProducer_, TrackLabel_, trackCollectionHandle);//takes the track collection
425  if (!trackCollectionHandle.isValid()){
426  edm::LogError("SiStripMonitorTrack")<<" Track Collection is not valid !! " << TrackLabel_<<std::endl;
427  return;
428  }
429 
430  // trajectory input
431  edm::Handle<TrajTrackAssociationCollection> TItkAssociatorCollection;
432  ev.getByLabel(TrackProducer_, TrackLabel_, TItkAssociatorCollection);
433  if( !TItkAssociatorCollection.isValid()){
434  edm::LogError("SiStripMonitorTrack")<<"Association not found "<<std::endl;
435  return;
436  }
437 
438  //Perform track study
439  int i=0;
440  for(TrajTrackAssociationCollection::const_iterator it = TItkAssociatorCollection->begin();it != TItkAssociatorCollection->end(); ++it){
441  const edm::Ref<std::vector<Trajectory> > traj_iterator = it->key;
442  // Trajectory Map, extract Trajectory for this track
443  reco::TrackRef trackref = it->val;
444  LogDebug("SiStripMonitorTrack")
445  << "Track number "<< i+1
446  << "\n\tmomentum: " << trackref->momentum()
447  << "\n\tPT: " << trackref->pt()
448  << "\n\tvertex: " << trackref->vertex()
449  << "\n\timpact parameter: " << trackref->d0()
450  << "\n\tcharge: " << trackref->charge()
451  << "\n\tnormalizedChi2: " << trackref->normalizedChi2()
452  <<"\n\tFrom EXTRA : "
453  <<"\n\t\touter PT "<< trackref->outerPt()<<std::endl;
454  i++;
455 
456  const std::vector<TrajectoryMeasurement> & measurements = traj_iterator->measurements();
457  std::vector<TrajectoryMeasurement>::const_iterator traj_mes_iterator;
458  int nhit=0;
459  for(std::vector<TrajectoryMeasurement>::const_iterator traj_mes_iterator= measurements.begin();traj_mes_iterator!=measurements.end();traj_mes_iterator++){//loop on measurements
460  //trajectory local direction and position on detector
461  LocalPoint stateposition;
462  LocalVector statedirection;
463 
464  TrajectoryStateOnSurface updatedtsos=traj_mes_iterator->updatedState();
465  ConstRecHitPointer ttrh=traj_mes_iterator->recHit();
466  if (!ttrh->isValid()) {continue;}
467 
468  nhit++;
469 
470  const ProjectedSiStripRecHit2D* phit = dynamic_cast<const ProjectedSiStripRecHit2D*>( ttrh->hit() );
471  const SiStripMatchedRecHit2D* matchedhit = dynamic_cast<const SiStripMatchedRecHit2D*>( ttrh->hit() );
472  const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*>( ttrh->hit() );
473  const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*>( ttrh->hit() );
474 
476 
477  if(matchedhit){
478  LogTrace("SiStripMonitorTrack")<<"\nMatched recHit found"<< std::endl;
479  type=Matched;
480 
481  GluedGeomDet * gdet=(GluedGeomDet *)tkgeom->idToDet(matchedhit->geographicalId());
482  GlobalVector gtrkdirup=gdet->toGlobal(updatedtsos.localMomentum());
483  //mono side
484  const GeomDetUnit * monodet=gdet->monoDet();
485  statedirection=monodet->toLocal(gtrkdirup);
486  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(matchedhit->monoHit(),statedirection,trackref,es);
487  //stereo side
488  const GeomDetUnit * stereodet=gdet->stereoDet();
489  statedirection=stereodet->toLocal(gtrkdirup);
490  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(matchedhit->stereoHit(),statedirection,trackref,es);
491  }
492  else if(phit){
493  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found"<< std::endl;
494  type=Projected;
495  GluedGeomDet * gdet=(GluedGeomDet *)tkgeom->idToDet(phit->geographicalId());
496 
497  GlobalVector gtrkdirup=gdet->toGlobal(updatedtsos.localMomentum());
498  const SiStripRecHit2D& originalhit=phit->originalHit();
499  const GeomDetUnit * det;
500  if(!StripSubdetector(originalhit.geographicalId().rawId()).stereo()){
501  //mono side
502  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found MONO"<< std::endl;
503  det=gdet->monoDet();
504  statedirection=det->toLocal(gtrkdirup);
505  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&(phit->originalHit()),statedirection,trackref,es);
506  }
507  else{
508  LogTrace("SiStripMonitorTrack")<<"\nProjected recHit found STEREO"<< std::endl;
509  //stereo side
510  det=gdet->stereoDet();
511  statedirection=det->toLocal(gtrkdirup);
512  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(&(phit->originalHit()),statedirection,trackref,es);
513  }
514  }else if (hit2D){
515  statedirection=updatedtsos.localMomentum();
516  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit2D>(hit2D,statedirection,trackref,es);
517  } else if (hit1D) {
518  statedirection=updatedtsos.localMomentum();
519  if(statedirection.mag() != 0) RecHitInfo<SiStripRecHit1D>(hit1D,statedirection,trackref,es);
520  } else {
521  LogDebug ("SiStrioMonitorTrack")
522  << " LocalMomentum: "<<statedirection
523  << "\nLocal x-z plane angle: "<<atan2(statedirection.x(),statedirection.z());
524  }
525  }
526  }
527 }
528 
529 template <class T> void SiStripMonitorTrack::RecHitInfo(const T* tkrecHit, LocalVector LV,reco::TrackRef track_ref, const edm::EventSetup& es){
530 
531  if(!tkrecHit->isValid()){
532  LogTrace("SiStripMonitorTrack") <<"\t\t Invalid Hit " << std::endl;
533  return;
534  }
535 
536  const uint32_t& detid = tkrecHit->geographicalId().rawId();
538  LogTrace("SiStripMonitorTrack") << "Modules Excluded" << std::endl;
539  return;
540  }
541 
542  LogTrace("SiStripMonitorTrack")
543  <<"\n\t\tRecHit on det "<<tkrecHit->geographicalId().rawId()
544  <<"\n\t\tRecHit in LP "<<tkrecHit->localPosition()
545  <<"\n\t\tRecHit in GP "<<tkgeom->idToDet(tkrecHit->geographicalId())->surface().toGlobal(tkrecHit->localPosition())
546  <<"\n\t\tRecHit trackLocal vector "<<LV.x() << " " << LV.y() << " " << LV.z() <<std::endl;
547 
548  //Get SiStripCluster from SiStripRecHit
549  if ( tkrecHit != NULL ){
550  const SiStripCluster* SiStripCluster_ = &*(tkrecHit->cluster());
551  SiStripClusterInfo SiStripClusterInfo_(*SiStripCluster_,es);
552 
553  if ( clusterInfos(&SiStripClusterInfo_,detid,"OnTrack", LV ) ) {
554  vPSiStripCluster.push_back(SiStripCluster_);
555  }
556  }else{
557  edm::LogError("SiStripMonitorTrack") << "NULL hit" << std::endl;
558  }
559  }
560 
561 //------------------------------------------------------------------------
562 
564 {
566  ev.getByLabel( Cluster_src_, siStripClusterHandle);
567  if (!siStripClusterHandle.isValid()){
568  edm::LogError("SiStripMonitorTrack")<< "ClusterCollection is not valid!!" << std::endl;
569  return;
570  }
571  //Loop on Dets
572  for ( edmNew::DetSetVector<SiStripCluster>::const_iterator DSViter=siStripClusterHandle->begin(); DSViter!=siStripClusterHandle->end();DSViter++){
573  uint32_t detid=DSViter->id();
574  if (find(ModulesToBeExcluded_.begin(),ModulesToBeExcluded_.end(),detid)!=ModulesToBeExcluded_.end()) continue;
575  //Loop on Clusters
576  LogDebug("SiStripMonitorTrack") << "on detid "<< detid << " N Cluster= " << DSViter->size();
577  edmNew::DetSet<SiStripCluster>::const_iterator ClusIter = DSViter->begin();
578  for(; ClusIter!=DSViter->end(); ClusIter++) {
579  if (std::find(vPSiStripCluster.begin(),vPSiStripCluster.end(),&*ClusIter) == vPSiStripCluster.end()){
580  SiStripClusterInfo SiStripClusterInfo_(*ClusIter,es);
581  clusterInfos(&SiStripClusterInfo_,detid,"OffTrack",LV);
582  }
583  }
584  }
585 }
586 
587 //------------------------------------------------------------------------
588 bool SiStripMonitorTrack::clusterInfos(SiStripClusterInfo* cluster, const uint32_t& detid,std::string flag, const LocalVector LV)
589 {
590  SiStripFolderOrganizer folder_organizer;
591  if (cluster==0) return false;
592  // if one imposes a cut on the clusters, apply it
593  if( (applyClusterQuality_) &&
594  (cluster->signalOverNoise() < sToNLowerLimit_ ||
595  cluster->signalOverNoise() > sToNUpperLimit_ ||
596  cluster->width() < widthLowerLimit_ ||
597  cluster->width() > widthUpperLimit_) ) return false;
598  // start of the analysis
599 
600  std::pair<std::string,std::string> sdet_pair = folder_organizer.getSubDetFolderAndTag(detid);
601  std::map<std::string, SubDetMEs>::iterator iSubdet = SubDetMEsMap.find(sdet_pair.second);
602  if(iSubdet != SubDetMEsMap.end()){
603  if (flag=="OnTrack") iSubdet->second.totNClustersOnTrack++;
604  else if (flag=="OffTrack") iSubdet->second.totNClustersOffTrack++;
605  }
606 
607  float cosRZ = -2;
608  LogDebug("SiStripMonitorTrack")<< "\n\tLV " << LV.x() << " " << LV.y() << " " << LV.z() << " " << LV.mag() << std::endl;
609  if (LV.mag()!=0){
610  cosRZ= fabs(LV.z())/LV.mag();
611  LogDebug("SiStripMonitorTrack")<< "\n\t cosRZ " << cosRZ << std::endl;
612  }
613  std::string name;
614 
615  // Filling SubDet/Layer Plots (on Track + off Track)
616  fillMEs(cluster,detid,cosRZ,flag);
617 
618 
619  //******** TkHistoMaps
620  if (TkHistoMap_On_) {
621  uint32_t adet=cluster->detId();
622  if(flag=="OnTrack"){
623  tkhisto_NumOnTrack->add(adet,1.);
624  tkhisto_StoNCorrOnTrack->fill(adet,cluster->signalOverNoise()*cosRZ);
625  }
626  else if(flag=="OffTrack"){
627  tkhisto_NumOffTrack->add(adet,1.);
628  if(cluster->charge() > 250){
629  LogDebug("SiStripMonitorTrack") << "Module firing " << detid << " in Event " << eventNb << std::endl;
630  }
631  }
632  }
633 
634  // Module plots filled only for onTrack Clusters
635  if(Mod_On_){
636  if(flag=="OnTrack"){
637  SiStripHistoId hidmanager2;
638  name =hidmanager2.createHistoId("","det",detid);
639  fillModMEs(cluster,name,cosRZ);
640  }
641  }
642  return true;
643 }
644 
645 //--------------------------------------------------------------------------------
647 {
648  std::map<std::string, ModMEs>::iterator iModME = ModMEsMap.find(name);
649  if(iModME!=ModMEsMap.end()){
650 
651  float StoN = cluster->signalOverNoise();
652  uint16_t charge = cluster->charge();
653  uint16_t width = cluster->width();
654  float position = cluster->baryStrip();
655 
656  fillME(iModME->second.ClusterStoNCorr ,StoN*cos);
657  fillME(iModME->second.ClusterCharge,charge);
658 
659  fillME(iModME->second.ClusterChargeCorr,charge*cos);
660 
661  fillME(iModME->second.ClusterWidth ,width);
662  fillME(iModME->second.ClusterPos ,position);
663 
664  //fill the PGV histo
665  float PGVmax = cluster->maxCharge();
666  int PGVposCounter = cluster->maxIndex();
667  for (int i= int(conf_.getParameter<edm::ParameterSet>("TProfileClusterPGV").getParameter<double>("xmin"));i<PGVposCounter;++i)
668  fillME(iModME->second.ClusterPGV, i,0.);
669  for (std::vector<uint8_t>::const_iterator it=cluster->stripCharges().begin();it<cluster->stripCharges().end();++it) {
670  fillME(iModME->second.ClusterPGV, PGVposCounter++,(*it)/PGVmax);
671  }
672  for (int i= PGVposCounter;i<int(conf_.getParameter<edm::ParameterSet>("TProfileClusterPGV").getParameter<double>("xmax"));++i)
673  fillME(iModME->second.ClusterPGV, i,0.);
674  //end fill the PGV histo
675  }
676 }
677 
678 //------------------------------------------------------------------------
679 void SiStripMonitorTrack::fillMEs(SiStripClusterInfo* cluster,uint32_t detid,float cos, std::string flag)
680 {
681  SiStripFolderOrganizer folder_organizer;
682  std::pair<std::string,int32_t> SubDetAndLayer = folder_organizer.GetSubDetAndLayer(detid,flag_ring);
683  SiStripHistoId hidmanager1;
684  std::string layer_id = hidmanager1.getSubdetid(detid,flag_ring);
685 
686  std::pair<std::string,std::string> sdet_pair = folder_organizer.getSubDetFolderAndTag(detid);
687  float StoN = cluster->signalOverNoise();
688  float noise = cluster->noiseRescaledByGain();
689  uint16_t charge = cluster->charge();
690  uint16_t width = cluster->width();
691  float position = cluster->baryStrip();
692 
693  std::map<std::string, LayerMEs>::iterator iLayer = LayerMEsMap.find(layer_id);
694  if (iLayer != LayerMEsMap.end()) {
695  if(flag=="OnTrack"){
696  fillME(iLayer->second.ClusterStoNCorrOnTrack, StoN*cos);
697  fillME(iLayer->second.ClusterChargeCorrOnTrack, charge*cos);
698  fillME(iLayer->second.ClusterChargeOnTrack, charge);
699  fillME(iLayer->second.ClusterNoiseOnTrack, noise);
700  fillME(iLayer->second.ClusterWidthOnTrack, width);
701  fillME(iLayer->second.ClusterPosOnTrack, position);
702  } else {
703  fillME(iLayer->second.ClusterChargeOffTrack, charge);
704  fillME(iLayer->second.ClusterNoiseOffTrack, noise);
705  fillME(iLayer->second.ClusterWidthOffTrack, width);
706  fillME(iLayer->second.ClusterPosOffTrack, position);
707  }
708  }
709  std::map<std::string, SubDetMEs>::iterator iSubdet = SubDetMEsMap.find(sdet_pair.second);
710  if(iSubdet != SubDetMEsMap.end() ){
711  if(flag=="OnTrack"){
712  fillME(iSubdet->second.ClusterStoNCorrOnTrack,StoN*cos);
713  } else {
714  fillME(iSubdet->second.ClusterChargeOffTrack,charge);
715  fillME(iSubdet->second.ClusterStoNOffTrack,StoN);
716  }
717  }
718 }
719 //
720 // -- Get Subdetector Tag from the Folder name
721 //
722 void SiStripMonitorTrack::getSubDetTag(std::string& folder_name, std::string& tag){
723 
724  tag = folder_name.substr(folder_name.find("MechanicalView")+15);
725  if (tag.find("side_") != std::string::npos) {
726  tag.replace(tag.find_last_of("/"),1,"_");
727  }
728 }
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:42
uint8_t maxCharge() const
type
Definition: HCALResponse.h:22
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:44
int i
Definition: DBlmapReader.cc:9
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
TkHistoMap * tkhisto_NumOffTrack
long int flag
Definition: mlp_lapack.h:47
SiStripMonitorTrack(const edm::ParameterSet &)
virtual void analyze(const edm::Event &, const edm::EventSetup &)
void trackStudy(const edm::Event &ev, const edm::EventSetup &es)
const GeomDetUnit * monoDet() const
Definition: GluedGeomDet.h:20
void fillME(MonitorElement *ME, float value1)
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
Definition: DQMStore.cc:519
SiStripDCSStatus * dcsStatus_
MonitorElement * book3D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, int nchZ, double lowZ, double highZ)
Book 3D histogram.
Definition: DQMStore.cc:781
float noiseRescaledByGain() const
void AllClusters(const edm::Event &ev, const edm::EventSetup &es)
const SiStripRecHit2D * stereoHit() const
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
void save(const std::string &filename, const std::string &path="", const std::string &pattern="", const std::string &rewrite="", SaveReferenceTag ref=SaveWithReference, int minStatus=dqm::qstatus::STATUS_OK, const std::string &fileupdate="RECREATE")
Definition: DQMStore.cc:1883
bool clusterInfos(SiStripClusterInfo *cluster, const uint32_t &detid, std::string flag, LocalVector LV)
void bookLayerMEs(const uint32_t &, std::string &)
float baryStrip() const
edm::ParameterSet conf_
T y() const
Definition: PV3DBase.h:57
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:64
#define NULL
Definition: scimark2.h:8
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:25
edm::ESHandle< SiStripDetCabling > SiStripDetCabling_
uint16_t maxIndex() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
void fillMEs(SiStripClusterInfo *, uint32_t detid, float, std::string)
void bookSubDetMEs(std::string &name)
double charge(const std::vector< uint8_t > &Ampls)
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
math::XYZTLorentzVectorD LV
void tag(MonitorElement *me, unsigned int myTag)
Definition: DQMStore.cc:1156
uint32_t rawId() const
get the raw id
Definition: DetId.h:45
LocalVector localMomentum() const
bool getStatus(edm::Event const &e, edm::EventSetup const &eSetup)
float signalOverNoise() const
std::string getSubdetid(uint32_t id, bool flag_ring)
T mag() const
Definition: PV3DBase.h:61
std::pair< std::string, std::string > getSubDetFolderAndTag(const uint32_t &detid)
uint16_t charge() const
std::map< std::string, SubDetMEs > SubDetMEsMap
void fillModMEs(SiStripClusterInfo *, std::string, float)
void fill(uint32_t &detid, float value)
Definition: TkHistoMap.cc:130
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:58
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
uint16_t width() const
TH1 * getTH1(void) const
std::vector< const SiStripCluster * > vPSiStripCluster
MonitorElement * bookProfile(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, const char *option="s")
Definition: DQMStore.cc:833
edm::ESHandle< TrackerGeometry > tkgeom
int orbitNumber() const
Definition: EventBase.h:63
void setDetectorFolder(uint32_t rawdetid=0)
bool isValid() const
Definition: HandleBase.h:76
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:359
#define LogTrace(id)
tuple conf
Definition: dbtoconf.py:185
MonitorElement * bookMETrend(const char *, const char *)
void getSubDetTag(std::string &folder_name, std::string &tag)
std::string createHistoId(std::string description, std::string id_type, uint32_t component_id)
const T & get() const
Definition: EventSetup.h:55
key_type key() const
Accessor for product key.
Definition: Ref.h:264
std::map< std::string, ModMEs > ModMEsMap
std::string HistoName
TkHistoMap * tkhisto_NumOnTrack
uint32_t detId() const
GenericTriggerEventFlag * genTriggerEventFlag_
const std::vector< uint8_t > & stripCharges() const
edm::EventID id() const
Definition: EventBase.h:56
iterator end()
Definition: DetSetNew.h:59
virtual void beginRun(const edm::Run &run, const edm::EventSetup &c)
MonitorElement * bookME2D(const char *, const char *)
std::pair< std::string, int32_t > GetSubDetAndLayer(const uint32_t &detid, bool ring_flag=0)
MonitorElement * bookMEProfile(const char *, const char *)
MonitorElement * bookME3D(const char *, const char *)
TkHistoMap * tkhisto_StoNCorrOnTrack
DetId geographicalId() const
std::vector< uint32_t > ModulesToBeExcluded_
virtual void endJob(void)
void showDirStructure(void) const
Definition: DQMStore.cc:2539
void initRun(const edm::Run &run, const edm::EventSetup &setup)
To be called from beginedm::Run() methods.
void bookModMEs(const uint32_t &)
std::string createHistoLayer(std::string description, std::string id_type, std::string path, std::string flag)
MonitorElement * book2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D histogram.
Definition: DQMStore.cc:647
const SiStripRecHit2D * monoHit() const
MonitorElement * bookME1D(const char *, const char *)
void setLayerFolder(uint32_t rawdetid=0, int32_t layer=0, bool ring_flag=0)
T x() const
Definition: PV3DBase.h:56
void add(uint32_t &detid, float value)
Definition: TkHistoMap.cc:163
const SiStripRecHit2D & originalHit() const
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:237
const GeomDetUnit * stereoDet() const
Definition: GluedGeomDet.h:21
std::vector< edm::ParameterSet > Parameters
Definition: HLTMuonBPAG.cc:49
Definition: Run.h:31
std::map< std::string, LayerMEs > LayerMEsMap
void RecHitInfo(const T *tkrecHit, LocalVector LV, reco::TrackRef track_ref, const edm::EventSetup &)