CMS 3D CMS Logo

TrackingMonitor.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author Suchandra Dutta , Giorgia Mila
5  */
6 
13 
22 
26 
34 
37 
39 
40 #include <string>
41 
42 // TrackingMonitor
43 // ----------------------------------------------------------------------------------//
44 
46  : confID_ ( iConfig.id() )
47  , theTrackBuildingAnalyzer( new TrackBuildingAnalyzer(iConfig) )
48  , NumberOfTracks(nullptr)
49  , NumberOfMeanRecHitsPerTrack(nullptr)
50  , NumberOfMeanLayersPerTrack(nullptr)
51  // , NumberOfGoodTracks(NULL)
52  , FractionOfGoodTracks(nullptr)
53  , NumberOfTrackingRegions(nullptr)
54  , NumberOfSeeds(nullptr)
55  , NumberOfSeeds_lumiFlag(nullptr)
56  , NumberOfTrackCandidates(nullptr)
57  , FractionCandidatesOverSeeds(nullptr)
58  // , NumberOfGoodTrkVsClus(NULL)
59  , NumberEventsOfVsLS(nullptr)
60  , NumberOfTracksVsLS(nullptr)
61  // , NumberOfGoodTracksVsLS(NULL)
62  , GoodTracksFractionVsLS(nullptr)
63  // , GoodTracksNumberOfRecHitsPerTrackVsLS(NULL)
64  // ADD by Mia for PU monitoring
65  // vertex plots to be moved in ad hoc class
66  , NumberOfGoodPVtxVsLS(nullptr)
67  , NumberOfGoodPVtxWO0VsLS(nullptr)
68  , NumberEventsOfVsBX (nullptr)
69  , NumberOfTracksVsBX(nullptr)
70  , GoodTracksFractionVsBX(nullptr)
71  , NumberOfRecHitsPerTrackVsBX(nullptr)
72  , NumberOfGoodPVtxVsBX(nullptr)
73  , NumberOfGoodPVtxWO0VsBX(nullptr)
74  , NumberOfTracksVsBXlumi(nullptr)
75  , NumberOfTracksVsGoodPVtx(nullptr)
76  , NumberOfTracksVsPUPVtx(nullptr)
77  , NumberEventsOfVsGoodPVtx(nullptr)
78  , GoodTracksFractionVsGoodPVtx(nullptr)
79  , NumberOfRecHitsPerTrackVsGoodPVtx(nullptr)
80  , NumberOfPVtxVsGoodPVtx(nullptr)
81  , NumberOfPixelClustersVsGoodPVtx(nullptr)
82  , NumberOfStripClustersVsGoodPVtx(nullptr)
83  , NumberEventsOfVsLUMI(nullptr)
84  , NumberOfTracksVsLUMI(nullptr)
85  , GoodTracksFractionVsLUMI(nullptr)
86  , NumberOfRecHitsPerTrackVsLUMI(nullptr)
87  , NumberOfGoodPVtxVsLUMI(nullptr)
88  , NumberOfGoodPVtxWO0VsLUMI(nullptr)
89  , NumberOfPixelClustersVsLUMI(nullptr)
90  , NumberOfStripClustersVsLUMI(nullptr)
91  , NumberOfTracks_lumiFlag(nullptr)
92  // , NumberOfGoodTracks_lumiFlag(NULL)
93 
94  , builderName ( iConfig.getParameter<std::string>("TTRHBuilder"))
95  , doTrackerSpecific_ ( iConfig.getParameter<bool>("doTrackerSpecific") )
96  , doLumiAnalysis ( iConfig.getParameter<bool>("doLumiAnalysis"))
97  , doProfilesVsLS_ ( iConfig.getParameter<bool>("doProfilesVsLS"))
98  , doAllPlots ( iConfig.getParameter<bool>("doAllPlots"))
99  , doGeneralPropertiesPlots_( iConfig.getParameter<bool>("doGeneralPropertiesPlots"))
100  , doHitPropertiesPlots_ ( iConfig.getParameter<bool>("doHitPropertiesPlots"))
101  , doPUmonitoring_ ( iConfig.getParameter<bool>("doPUmonitoring") )
102  , genTriggerEventFlag_(new GenericTriggerEventFlag(iConfig.getParameter<edm::ParameterSet>("genericTriggerEventPSet"),consumesCollector(), *this))
103  , numSelection_ (iConfig.getParameter<std::string>("numCut"))
104  , denSelection_ (iConfig.getParameter<std::string>("denCut"))
105  , pvNDOF_ ( iConfig.getParameter<int> ("pvNDOF") )
106 {
107 
109  theTrackAnalyzer = new dqm::TrackAnalyzer( iConfig,c );
110 
111  // input tags for collections from the configuration
112  bsSrc_ = iConfig.getParameter<edm::InputTag>("beamSpot");
113  pvSrc_ = iConfig.getParameter<edm::InputTag>("primaryVertex");
114  bsSrcToken_ = consumes<reco::BeamSpot>(bsSrc_);
115  pvSrcToken_ = mayConsume<reco::VertexCollection>(pvSrc_);
116 
117  lumiscalersToken_ = consumes<LumiScalersCollection>(iConfig.getParameter<edm::InputTag>("scal") );
118 
119  edm::InputTag alltrackProducer = iConfig.getParameter<edm::InputTag>("allTrackProducer");
120  edm::InputTag trackProducer = iConfig.getParameter<edm::InputTag>("TrackProducer");
121  edm::InputTag tcProducer = iConfig.getParameter<edm::InputTag>("TCProducer");
122  edm::InputTag seedProducer = iConfig.getParameter<edm::InputTag>("SeedProducer");
123  allTrackToken_ = consumes<edm::View<reco::Track> >(alltrackProducer);
124  trackToken_ = consumes<edm::View<reco::Track> >(trackProducer);
125  trackCandidateToken_ = consumes<TrackCandidateCollection>(tcProducer);
126  seedToken_ = consumes<edm::View<TrajectorySeed> >(seedProducer);
127  seedStopInfoToken_ = consumes<std::vector<SeedStopInfo> >(tcProducer);
128 
129  doMVAPlots = iConfig.getParameter<bool>("doMVAPlots");
130  if(doMVAPlots) {
131  mvaQualityTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<std::string> >("MVAProducers"),
132  [&](const std::string& tag) {
133  return std::make_tuple(consumes<MVACollection>(edm::InputTag(tag, "MVAValues")),
134  consumes<QualityMaskCollection>(edm::InputTag(tag, "QualityMasks")));
135  });
136  mvaTrackToken_ = consumes<edm::View<reco::Track> >(iConfig.getParameter<edm::InputTag>("TrackProducerForMVA"));
137  }
138 
139  doRegionPlots = iConfig.getParameter<bool>("doRegionPlots");
140  doRegionCandidatePlots = iConfig.getParameter<bool>("doRegionCandidatePlots");
141  if(doRegionPlots) {
142  const auto& regionTag = iConfig.getParameter<edm::InputTag>("RegionProducer");
143  if(!regionTag.label().empty()) {
144  regionToken_ = consumes<edm::OwnVector<TrackingRegion> >(regionTag);
145  }
146  const auto& regionLayersTag = iConfig.getParameter<edm::InputTag>("RegionSeedingLayersProducer");
147  if(!regionLayersTag.label().empty()) {
149  throw cms::Exception("Configuration") << "Only one of 'RegionProducer' and 'RegionSeedingLayersProducer' can be non-empty, now both are.";
150  }
151  regionLayerSetsToken_ = consumes<TrackingRegionsSeedingLayerSets>(regionLayersTag);
152  }
153  else if(regionToken_.isUninitialized()) {
154  throw cms::Exception("Configuration") << "With doRegionPlots=True either 'RegionProducer' or 'RegionSeedingLayersProducer' must be non-empty, now both are empty.";
155  }
156 
157  if(doRegionCandidatePlots) {
158  regionCandidateToken_ = consumes<reco::CandidateView>(iConfig.getParameter<edm::InputTag>("RegionCandidates"));
159  }
160  }
161 
164  stripClustersToken_ = mayConsume<edmNew::DetSetVector<SiStripCluster> > (stripClusterInputTag_);
165  pixelClustersToken_ = mayConsume<edmNew::DetSetVector<SiPixelCluster> > (pixelClusterInputTag_);
166 
167  doFractionPlot_ = true;
168  if (alltrackProducer.label()==trackProducer.label()) doFractionPlot_ = false;
169 
170  Quality_ = iConfig.getParameter<std::string>("Quality");
171  AlgoName_ = iConfig.getParameter<std::string>("AlgoName");
172 
173  // get flag from the configuration
174  doPlotsVsBXlumi_ = iConfig.getParameter<bool>("doPlotsVsBXlumi");
175  if ( doPlotsVsBXlumi_ )
176  theLumiDetails_ = new GetLumi( iConfig.getParameter<edm::ParameterSet>("BXlumiSetup"), c );
177  doPlotsVsGoodPVtx_ = iConfig.getParameter<bool>("doPlotsVsGoodPVtx");
178  doPlotsVsLUMI_ = iConfig.getParameter<bool>("doPlotsVsLUMI");
179  doPlotsVsBX_ = iConfig.getParameter<bool>("doPlotsVsBX");
180 
181  if ( doPUmonitoring_ ) {
182 
183  std::vector<edm::InputTag> primaryVertexInputTags = iConfig.getParameter<std::vector<edm::InputTag> >("primaryVertexInputTags");
184  std::vector<edm::InputTag> selPrimaryVertexInputTags = iConfig.getParameter<std::vector<edm::InputTag> >("selPrimaryVertexInputTags");
185  std::vector<std::string> pvLabels = iConfig.getParameter<std::vector<std::string> > ("pvLabels");
186 
187  if (primaryVertexInputTags.size()==pvLabels.size() and primaryVertexInputTags.size()==selPrimaryVertexInputTags.size()) {
188  for (size_t i=0; i<primaryVertexInputTags.size(); i++) {
189  edm::InputTag iPVinputTag = primaryVertexInputTags[i];
190  edm::InputTag iSelPVinputTag = selPrimaryVertexInputTags[i];
191  std::string iPVlabel = pvLabels[i];
192 
193  theVertexMonitor.push_back(new VertexMonitor(iConfig,iPVinputTag,iSelPVinputTag,iPVlabel,c) );
194  }
195  }
196  }
197 
198 }
199 
200 
202 {
205  if ( doPUmonitoring_ )
206  for (size_t i=0; i<theVertexMonitor.size(); i++)
207  if (theVertexMonitor[i]) delete theVertexMonitor[i];
209 }
210 
211 
213 {
214 
215 
216 }
217 
219  edm::Run const & iRun,
220  edm::EventSetup const & iSetup)
221 {
222  // parameters from the configuration
223  auto const* conf = edm::pset::Registry::instance()->getMapped(confID_);
224  assert(conf != nullptr);
225  std::string Quality = conf->getParameter<std::string>("Quality");
226  std::string AlgoName = conf->getParameter<std::string>("AlgoName");
227  std::string MEFolderName = conf->getParameter<std::string>("FolderName");
228 
229  // test for the Quality veriable validity
230  if( Quality_ != "") {
231  if( Quality_ != "highPurity" && Quality_ != "tight" && Quality_ != "loose") {
232  edm::LogWarning("TrackingMonitor") << "Qualty Name is invalid, using no quality criterea by default";
233  Quality_ = "";
234  }
235  }
236 
237  // use the AlgoName and Quality Name
238  std::string CategoryName = Quality_ != "" ? AlgoName_ + "_" + Quality_ : AlgoName_;
239 
240  // get binning from the configuration
241  int TKNoBin = conf->getParameter<int>( "TkSizeBin");
242  double TKNoMin = conf->getParameter<double>("TkSizeMin");
243  double TKNoMax = conf->getParameter<double>("TkSizeMax");
244 
245  int TCNoBin = conf->getParameter<int>( "TCSizeBin");
246  double TCNoMin = conf->getParameter<double>("TCSizeMin");
247  double TCNoMax = conf->getParameter<double>("TCSizeMax");
248 
249  int TKNoSeedBin = conf->getParameter<int>( "TkSeedSizeBin");
250  double TKNoSeedMin = conf->getParameter<double>("TkSeedSizeMin");
251  double TKNoSeedMax = conf->getParameter<double>("TkSeedSizeMax");
252 
253  int MeanHitBin = conf->getParameter<int>( "MeanHitBin");
254  double MeanHitMin = conf->getParameter<double>("MeanHitMin");
255  double MeanHitMax = conf->getParameter<double>("MeanHitMax");
256 
257  int MeanLayBin = conf->getParameter<int>( "MeanLayBin");
258  double MeanLayMin = conf->getParameter<double>("MeanLayMin");
259  double MeanLayMax = conf->getParameter<double>("MeanLayMax");
260 
261  int LSBin = conf->getParameter<int>( "LSBin");
262  int LSMin = conf->getParameter<double>("LSMin");
263  int LSMax = conf->getParameter<double>("LSMax");
264 
265  std::string StateName = conf->getParameter<std::string>("MeasurementState");
266  if (
267  StateName != "OuterSurface" &&
268  StateName != "InnerSurface" &&
269  StateName != "ImpactPoint" &&
270  StateName != "default" &&
271  StateName != "All"
272  ) {
273  // print warning
274  edm::LogWarning("TrackingMonitor") << "State Name is invalid, using 'ImpactPoint' by default";
275  }
276 
277  ibooker.setCurrentFolder(MEFolderName);
278 
279  // book the General Property histograms
280  // ---------------------------------------------------------------------------------//
281 
283 
284  ibooker.setCurrentFolder(MEFolderName+"/GeneralProperties");
285 
286  histname = "NumberOfTracks_" + CategoryName;
287  // MODIFY by Mia in order to cope w/ high multiplicity
288  NumberOfTracks = ibooker.book1D(histname, histname, 3*TKNoBin, TKNoMin, (TKNoMax+0.5)*3.-0.5);
289  NumberOfTracks->setAxisTitle("Number of Tracks per Event", 1);
290  NumberOfTracks->setAxisTitle("Number of Events", 2);
291 
292  histname = "NumberOfMeanRecHitsPerTrack_" + CategoryName;
293  NumberOfMeanRecHitsPerTrack = ibooker.book1D(histname, histname, MeanHitBin, MeanHitMin, MeanHitMax);
294  NumberOfMeanRecHitsPerTrack->setAxisTitle("Mean number of valid RecHits per Track", 1);
296 
297  histname = "NumberOfMeanLayersPerTrack_" + CategoryName;
298  NumberOfMeanLayersPerTrack = ibooker.book1D(histname, histname, MeanLayBin, MeanLayMin, MeanLayMax);
299  NumberOfMeanLayersPerTrack->setAxisTitle("Mean number of Layers per Track", 1);
301 
302  if (doFractionPlot_) {
303  histname = "FractionOfGoodTracks_" + CategoryName;
304  FractionOfGoodTracks = ibooker.book1D(histname, histname, 101, -0.005, 1.005);
305  FractionOfGoodTracks->setAxisTitle("Fraction of Tracks (w.r.t. generalTracks)", 1);
306  FractionOfGoodTracks->setAxisTitle("Entries", 2);
307  }
308  }
309 
310  if ( doLumiAnalysis ) {
311  // add by Mia in order to deal with LS transitions
312  ibooker.setCurrentFolder(MEFolderName+"/LSanalysis");
313 
314  histname = "NumberOfTracks_lumiFlag_" + CategoryName;
315  NumberOfTracks_lumiFlag = ibooker.book1D(histname, histname, 3*TKNoBin, TKNoMin, (TKNoMax+0.5)*3.-0.5);
316  NumberOfTracks_lumiFlag->setAxisTitle("Number of Tracks per Event", 1);
317  NumberOfTracks_lumiFlag->setAxisTitle("Number of Events", 2);
318 
319  }
320 
321  // book profile plots vs LS :
322  //---------------------------
323 
324 
325  if ( doProfilesVsLS_ || doAllPlots) {
326 
327  ibooker.setCurrentFolder(MEFolderName+"/GeneralProperties");
328 
329  histname = "NumberOfTracksVsLS_"+ CategoryName;
330  NumberOfTracksVsLS = ibooker.bookProfile(histname,histname, LSBin,LSMin,LSMax, TKNoMin, TKNoMax*3.,"");
331  NumberOfTracksVsLS->getTH1()->SetCanExtend(TH1::kAllAxes);
332  NumberOfTracksVsLS->setAxisTitle("#Lumi section",1);
333  NumberOfTracksVsLS->setAxisTitle("Number of Tracks",2);
334 
335  histname = "NumberOfRecHitsPerTrackVsLS_" + CategoryName;
336  NumberOfRecHitsPerTrackVsLS = ibooker.bookProfile(histname,histname, LSBin,LSMin,LSMax,0.,200.,"");
337  NumberOfRecHitsPerTrackVsLS->getTH1()->SetCanExtend(TH1::kAllAxes);
338  NumberOfRecHitsPerTrackVsLS->setAxisTitle("#Lumi section",1);
339  NumberOfRecHitsPerTrackVsLS->setAxisTitle("Mean number of Valid RecHits per track",2);
340 
341  histname = "NumberEventsVsLS_" + CategoryName;
342  NumberEventsOfVsLS = ibooker.book1D(histname,histname, LSBin,LSMin,LSMax);
343  NumberEventsOfVsLS->getTH1()->SetCanExtend(TH1::kAllAxes);
344  NumberEventsOfVsLS->setAxisTitle("#Lumi section",1);
345  NumberEventsOfVsLS->setAxisTitle("Number of events",2);
346 
347  double GoodPVtxMin = conf->getParameter<double>("GoodPVtxMin");
348  double GoodPVtxMax = conf->getParameter<double>("GoodPVtxMax");
349 
350  histname = "NumberOfGoodPVtxVsLS_" + CategoryName;
351  NumberOfGoodPVtxVsLS = ibooker.bookProfile(histname,histname, LSBin,LSMin,LSMax,GoodPVtxMin,3.*GoodPVtxMax,"");
352  NumberOfGoodPVtxVsLS->getTH1()->SetCanExtend(TH1::kAllAxes);
353  NumberOfGoodPVtxVsLS->setAxisTitle("#Lumi section",1);
354  NumberOfGoodPVtxVsLS->setAxisTitle("Mean number of good PV",2);
355 
356  histname = "NumberOfGoodPVtxWO0VsLS_" + CategoryName;
357  NumberOfGoodPVtxWO0VsLS = ibooker.bookProfile(histname,histname, LSBin,LSMin,LSMax,GoodPVtxMin,3.*GoodPVtxMax,"");
358  NumberOfGoodPVtxWO0VsLS->setAxisTitle("#Lumi section",1);
359  NumberOfGoodPVtxWO0VsLS->setAxisTitle("Mean number of good PV",2);
360 
361  if (doFractionPlot_) {
362  histname = "GoodTracksFractionVsLS_"+ CategoryName;
363  GoodTracksFractionVsLS = ibooker.bookProfile(histname,histname, LSBin,LSMin,LSMax,0,1.1,"");
364  GoodTracksFractionVsLS->getTH1()->SetCanExtend(TH1::kAllAxes);
365  GoodTracksFractionVsLS->setAxisTitle("#Lumi section",1);
366  GoodTracksFractionVsLS->setAxisTitle("Fraction of Good Tracks",2);
367  }
368 
369  if ( doPlotsVsBX_ || doAllPlots ) {
370  ibooker.setCurrentFolder(MEFolderName+"/BXanalysis");
371  int BXBin = 3564; double BXMin = 0.5; double BXMax = 3564.5;
372 
373  histname = "NumberEventsVsBX_" + CategoryName;
374  NumberEventsOfVsBX = ibooker.book1D(histname,histname, BXBin,BXMin,BXMax);
376  NumberEventsOfVsBX->setAxisTitle("Number of events",2);
377 
378  histname = "NumberOfTracksVsBX_"+ CategoryName;
379  NumberOfTracksVsBX = ibooker.bookProfile(histname,histname, BXBin,BXMin,BXMax, TKNoMin, TKNoMax*3.,"");
381  NumberOfTracksVsBX->setAxisTitle("Number of Tracks",2);
382 
383  histname = "NumberOfRecHitsPerTrackVsBX_" + CategoryName;
384  NumberOfRecHitsPerTrackVsBX = ibooker.bookProfile(histname,histname, BXBin,BXMin,BXMax,0.,200.,"");
386  NumberOfRecHitsPerTrackVsBX->setAxisTitle("Mean number of Valid RecHits per track",2);
387 
388  histname = "NumberOfGoodPVtxVsBX_" + CategoryName;
389  NumberOfGoodPVtxVsBX = ibooker.bookProfile(histname,histname, BXBin,BXMin,BXMax,GoodPVtxMin,3.*GoodPVtxMax,"");
391  NumberOfGoodPVtxVsBX->setAxisTitle("Mean number of good PV",2);
392 
393  histname = "NumberOfGoodPVtxWO0VsBX_" + CategoryName;
394  NumberOfGoodPVtxWO0VsBX = ibooker.bookProfile(histname,histname, BXBin,BXMin,BXMax,GoodPVtxMin,3.*GoodPVtxMax,"");
396  NumberOfGoodPVtxWO0VsBX->setAxisTitle("Mean number of good PV",2);
397 
398  if (doFractionPlot_) {
399  histname = "GoodTracksFractionVsBX_"+ CategoryName;
400  GoodTracksFractionVsBX = ibooker.bookProfile(histname,histname, BXBin,BXMin,BXMax,0,1.1,"");
402  GoodTracksFractionVsBX->setAxisTitle("Fraction of Good Tracks",2);
403  }
404  }
405 
406  }
407 
408  // book PU monitoring plots :
409  //---------------------------
410 
411  if ( doPUmonitoring_ ) {
412 
413  for (size_t i=0; i<theVertexMonitor.size(); i++)
414  theVertexMonitor[i]->initHisto(ibooker);
415  }
416 
417  if ( doPlotsVsGoodPVtx_ ) {
418  ibooker.setCurrentFolder(MEFolderName+"/PUmonitoring");
419  // get binning from the configuration
420  int PVBin = conf->getParameter<int> ("PVBin");
421  float PVMin = conf->getParameter<double>("PVMin");
422  float PVMax = conf->getParameter<double>("PVMax");
423 
424  histname = "NumberOfTracksVsGoodPVtx";
425  NumberOfTracksVsGoodPVtx = ibooker.bookProfile(histname,histname,PVBin,PVMin,PVMax,TKNoMin, TKNoMax*5.,"");
426  NumberOfTracksVsGoodPVtx->setAxisTitle("Number of PV",1);
427  NumberOfTracksVsGoodPVtx->setAxisTitle("Mean number of Tracks per Event",2);
428 
429  histname = "NumberOfTracksVsPUPVtx";
430  NumberOfTracksVsPUPVtx = ibooker.bookProfile(histname,histname,PVBin,PVMin,PVMax,0., TKNoMax*5.,"");
431  NumberOfTracksVsPUPVtx->setAxisTitle("Number of PU",1);
432  NumberOfTracksVsPUPVtx->setAxisTitle("Mean number of Tracks per PUvtx",2);
433 
434  histname = "NumberEventsVsGoodPVtx";
435  NumberEventsOfVsGoodPVtx = ibooker.book1D(histname,histname,PVBin,PVMin,PVMax);
436  NumberEventsOfVsGoodPVtx->setAxisTitle("Number of good PV (PU)",1);
437  NumberEventsOfVsGoodPVtx->setAxisTitle("Number of events",2);
438 
439  if (doFractionPlot_) {
440  histname = "GoodTracksFractionVsGoodPVtx";
441  GoodTracksFractionVsGoodPVtx = ibooker.bookProfile(histname,histname,PVBin,PVMin,PVMax,0., 1.1,"");
442  GoodTracksFractionVsGoodPVtx->setAxisTitle("Number of good PV (PU)",1);
443  GoodTracksFractionVsGoodPVtx->setAxisTitle("Mean fraction of good tracks",2);
444  }
445 
446  histname = "NumberOfRecHitsPerTrackVsGoodPVtx";
447  NumberOfRecHitsPerTrackVsGoodPVtx = ibooker.bookProfile(histname,histname,PVBin,PVMin,PVMax,0., 200.,"");
448  NumberOfRecHitsPerTrackVsGoodPVtx->setAxisTitle("Number of good PV (PU)",1);
449  NumberOfRecHitsPerTrackVsGoodPVtx->setAxisTitle("Mean number of valid rechits per Tracks",2);
450 
451  histname = "NumberOfPVtxVsGoodPVtx";
452  NumberOfPVtxVsGoodPVtx = ibooker.bookProfile(histname,histname,PVBin,PVMin,PVMax,0., 3.*PVMax,"");
453  NumberOfPVtxVsGoodPVtx->setAxisTitle("Number of good PV (PU)",1);
454  NumberOfPVtxVsGoodPVtx->setAxisTitle("Mean number of vertices",2);
455 
456  double NClusPxMin = conf->getParameter<double>("NClusPxMin");
457  double NClusPxMax = conf->getParameter<double>("NClusPxMax");
458  histname = "NumberOfPixelClustersVsGoodPVtx";
459  NumberOfPixelClustersVsGoodPVtx = ibooker.bookProfile(histname,histname,PVBin,PVMin,PVMax,NClusPxMin,3.*NClusPxMax,"");
460  NumberOfPixelClustersVsGoodPVtx->setAxisTitle("Number of good PV (PU)",1);
461  NumberOfPixelClustersVsGoodPVtx->setAxisTitle("Mean number of pixel clusters",2);
462 
463  double NClusStrMin = conf->getParameter<double>("NClusStrMin");
464  double NClusStrMax = conf->getParameter<double>("NClusStrMax");
465  histname = "NumberOfStripClustersVsGoodPVtx";
466  NumberOfStripClustersVsGoodPVtx = ibooker.bookProfile(histname,histname,PVBin,PVMin,PVMax,NClusStrMin,3.*NClusStrMax,"");
467  NumberOfStripClustersVsGoodPVtx->setAxisTitle("Number of good PV (PU)",1);
468  NumberOfStripClustersVsGoodPVtx->setAxisTitle("Mean number of strip clusters",2);
469 
470  }
471 
472 
473  if ( doPlotsVsLUMI_ || doAllPlots ) {
474  ibooker.setCurrentFolder(MEFolderName+"/LUMIanalysis");
475  int LUMIBin = conf->getParameter<int>("LUMIBin");
476  float LUMIMin = conf->getParameter<double>("LUMIMin");
477  float LUMIMax = conf->getParameter<double>("LUMIMax");
478 
479  histname = "NumberEventsVsLUMI";
480  NumberEventsOfVsLUMI = ibooker.book1D(histname,histname,LUMIBin,LUMIMin,LUMIMax);
481  NumberEventsOfVsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
482  NumberEventsOfVsLUMI->setAxisTitle("Number of events",2);
483 
484  histname = "NumberOfTracksVsLUMI";
485  NumberOfTracksVsLUMI = ibooker.bookProfile(histname,histname,LUMIBin,LUMIMin,LUMIMax,0., 2000.,"");
486  NumberOfTracksVsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
487  NumberOfTracksVsLUMI->setAxisTitle("Mean number of vertices",2);
488 
489  if (doFractionPlot_) {
490  histname = "GoodTracksFractionVsLUMI";
491  GoodTracksFractionVsLUMI = ibooker.bookProfile(histname,histname,LUMIBin,LUMIMin,LUMIMax,0., 1.1,"");
492  GoodTracksFractionVsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
493  GoodTracksFractionVsLUMI->setAxisTitle("Mean number of vertices",2);
494  }
495 
496  histname = "NumberOfRecHitsPerTrackVsLUMI";
497  NumberOfRecHitsPerTrackVsLUMI = ibooker.bookProfile(histname,histname,LUMIBin,LUMIMin,LUMIMax,0., 200.,"");
498  NumberOfRecHitsPerTrackVsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
499  NumberOfRecHitsPerTrackVsLUMI->setAxisTitle("Mean number of vertices",2);
500 
501  double PVMin = conf->getParameter<double>("PVMin");
502  double PVMax = conf->getParameter<double>("PVMax");
503 
504  histname = "NumberOfGoodPVtxVsLUMI";
505  NumberOfGoodPVtxVsLUMI = ibooker.bookProfile(histname,histname,LUMIBin,LUMIMin,LUMIMax,PVMin,3.*PVMax,"");
506  NumberOfGoodPVtxVsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
507  NumberOfGoodPVtxVsLUMI->setAxisTitle("Mean number of vertices",2);
508 
509  histname = "NumberOfGoodPVtxWO0VsLUMI";
510  NumberOfGoodPVtxWO0VsLUMI = ibooker.bookProfile(histname,histname,LUMIBin,LUMIMin,LUMIMax,PVMin,3.*PVMax,"");
511  NumberOfGoodPVtxWO0VsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
512  NumberOfGoodPVtxWO0VsLUMI->setAxisTitle("Mean number of vertices",2);
513 
514  double NClusPxMin = conf->getParameter<double>("NClusPxMin");
515  double NClusPxMax = conf->getParameter<double>("NClusPxMax");
516  histname = "NumberOfPixelClustersVsGoodPVtx";
517  NumberOfPixelClustersVsLUMI = ibooker.bookProfile(histname,histname,LUMIBin,LUMIMin,LUMIMax,NClusPxMin,3.*NClusPxMax,"");
518  NumberOfPixelClustersVsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
519  NumberOfPixelClustersVsLUMI->setAxisTitle("Mean number of pixel clusters",2);
520 
521  double NClusStrMin = conf->getParameter<double>("NClusStrMin");
522  double NClusStrMax = conf->getParameter<double>("NClusStrMax");
523  histname = "NumberOfStripClustersVsLUMI";
524  NumberOfStripClustersVsLUMI = ibooker.bookProfile(histname,histname,LUMIBin,LUMIMin,LUMIMax,NClusStrMin,3.*NClusStrMax,"");
525  NumberOfStripClustersVsLUMI->setAxisTitle("scal lumi [10e30 Hz cm^{-2}]",1);
526  NumberOfStripClustersVsLUMI->setAxisTitle("Mean number of strip clusters",2);
527 
528  }
529 
530 
531  if ( doPlotsVsBXlumi_ ) {
532  ibooker.setCurrentFolder(MEFolderName+"/PUmonitoring");
533  // get binning from the configuration
534  edm::ParameterSet BXlumiParameters = conf->getParameter<edm::ParameterSet>("BXlumiSetup");
535  int BXlumiBin = BXlumiParameters.getParameter<int>("BXlumiBin");
536  double BXlumiMin = BXlumiParameters.getParameter<double>("BXlumiMin");
537  double BXlumiMax = BXlumiParameters.getParameter<double>("BXlumiMax");
538 
539  histname = "NumberOfTracksVsBXlumi_"+ CategoryName;
540  NumberOfTracksVsBXlumi = ibooker.bookProfile(histname,histname, BXlumiBin,BXlumiMin,BXlumiMax, TKNoMin, 3.*TKNoMax,"");
541  NumberOfTracksVsBXlumi->setAxisTitle("lumi BX [10^{30}Hzcm^{-2}]",1);
542  NumberOfTracksVsBXlumi->setAxisTitle("Mean number of Tracks",2);
543 
544  }
545 
546 
547  theTrackAnalyzer->initHisto(ibooker, iSetup, *conf);
548 
549  // book the Seed Property histograms
550  // ---------------------------------------------------------------------------------//
551 
552  ibooker.setCurrentFolder(MEFolderName+"/TrackBuilding");
553 
554  doAllSeedPlots = conf->getParameter<bool>("doSeedParameterHistos");
555  doSeedNumberPlot = conf->getParameter<bool>("doSeedNumberHisto");
556  doSeedLumiAnalysis_ = conf->getParameter<bool>("doSeedLumiAnalysis");
557  doSeedVsClusterPlot = conf->getParameter<bool>("doSeedVsClusterHisto");
558  // if (doAllPlots) doAllSeedPlots=true;
559 
560  runTrackBuildingAnalyzerForSeed=(doAllSeedPlots || conf->getParameter<bool>("doSeedPTHisto") ||conf->getParameter<bool>("doSeedETAHisto") || conf->getParameter<bool>("doSeedPHIHisto") || conf->getParameter<bool>("doSeedPHIVsETAHisto") || conf->getParameter<bool>("doSeedThetaHisto") || conf->getParameter<bool>("doSeedQHisto") || conf->getParameter<bool>("doSeedDxyHisto") || conf->getParameter<bool>("doSeedDzHisto") || conf->getParameter<bool>("doSeedNRecHitsHisto") || conf->getParameter<bool>("doSeedNVsPhiProf")|| conf->getParameter<bool>("doSeedNVsEtaProf"));
561 
562  edm::InputTag seedProducer = conf->getParameter<edm::InputTag>("SeedProducer");
563 
564  if (doAllSeedPlots || doSeedNumberPlot){
565  ibooker.setCurrentFolder(MEFolderName+"/TrackBuilding");
566  histname = "NumberOfSeeds_"+ seedProducer.label() + "_"+ CategoryName;
567  NumberOfSeeds = ibooker.book1D(histname, histname, TKNoSeedBin, TKNoSeedMin, TKNoSeedMax);
568  NumberOfSeeds->setAxisTitle("Number of Seeds per Event", 1);
569  NumberOfSeeds->setAxisTitle("Number of Events", 2);
570 
571  if ( doSeedLumiAnalysis_ ) {
572  ibooker.setCurrentFolder(MEFolderName+"/LSanalysis");
573  histname = "NumberOfSeeds_lumiFlag_"+ seedProducer.label() + "_"+ CategoryName;
574  NumberOfSeeds_lumiFlag = ibooker.book1D(histname, histname, TKNoSeedBin, TKNoSeedMin, TKNoSeedMax);
575  NumberOfSeeds_lumiFlag->setAxisTitle("Number of Seeds per Event", 1);
576  NumberOfSeeds_lumiFlag->setAxisTitle("Number of Events", 2);
577  }
578 
579  }
580 
581  if (doAllSeedPlots || doSeedVsClusterPlot){
582  ibooker.setCurrentFolder(MEFolderName+"/TrackBuilding");
583 
584  ClusterLabels= conf->getParameter<std::vector<std::string> >("ClusterLabels");
585 
586  std::vector<double> histoMin,histoMax;
587  std::vector<int> histoBin; //these vectors are for max min and nbins in histograms
588 
589  int NClusPxBin = conf->getParameter<int>( "NClusPxBin");
590  double NClusPxMin = conf->getParameter<double>("NClusPxMin");
591  double NClusPxMax = conf->getParameter<double>("NClusPxMax");
592 
593  int NClusStrBin = conf->getParameter<int>( "NClusStrBin");
594  double NClusStrMin = conf->getParameter<double>("NClusStrMin");
595  double NClusStrMax = conf->getParameter<double>("NClusStrMax");
596 
597  setMaxMinBin(histoMin,histoMax,histoBin,NClusStrMin,NClusStrMax,NClusStrBin,NClusPxMin,NClusPxMax,NClusPxBin);
598 
599  for (uint i=0; i<ClusterLabels.size(); i++){
600  histname = "SeedsVsClusters_" + seedProducer.label() + "_Vs_" + ClusterLabels[i] + "_" + CategoryName;
601  SeedsVsClusters.push_back(dynamic_cast<MonitorElement*>(ibooker.book2D(histname, histname, histoBin[i], histoMin[i], histoMax[i],
602  TKNoSeedBin, TKNoSeedMin, TKNoSeedMax)));
603  SeedsVsClusters[i]->setAxisTitle("Number of Clusters", 1);
604  SeedsVsClusters[i]->setAxisTitle("Number of Seeds", 2);
605  SeedsVsClusters[i]->getTH2F()->SetCanExtend(TH1::kAllAxes);
606  }
607  }
608 
609  if(doRegionPlots) {
610  ibooker.setCurrentFolder(MEFolderName+"/TrackBuilding");
611 
612  int regionBin = conf->getParameter<int>( "RegionSizeBin");
613  double regionMin = conf->getParameter<double>("RegionSizeMin");
614  double regionMax = conf->getParameter<double>("RegionSizeMax");
615 
616  histname = "TrackingRegionsNumberOf_"+ seedProducer.label() + "_"+ CategoryName;
617  NumberOfTrackingRegions = ibooker.book1D(histname, histname, regionBin, regionMin, regionMax);
618  NumberOfTrackingRegions->setAxisTitle("Number of TrackingRegions per Event", 1);
619  NumberOfTrackingRegions->setAxisTitle("Number of Events", 2);
620  }
621 
622  doTkCandPlots=conf->getParameter<bool>("doTrackCandHistos");
623  // if (doAllPlots) doTkCandPlots=true;
624 
625  if (doTkCandPlots){
626  ibooker.setCurrentFolder(MEFolderName+"/TrackBuilding");
627 
628  edm::InputTag tcProducer = conf->getParameter<edm::InputTag>("TCProducer");
629 
630  histname = "NumberOfTrackCandidates_"+ tcProducer.label() + "_"+ CategoryName;
631  NumberOfTrackCandidates = ibooker.book1D(histname, histname, TCNoBin, TCNoMin, TCNoMax);
632  NumberOfTrackCandidates->setAxisTitle("Number of Track Candidates per Event", 1);
633  NumberOfTrackCandidates->setAxisTitle("Number of Event", 2);
634 
635  histname = "FractionOfCandOverSeeds_"+ tcProducer.label() + "_"+ CategoryName;
636  FractionCandidatesOverSeeds = ibooker.book1D(histname, histname, 101, 0., 1.01);
637  FractionCandidatesOverSeeds->setAxisTitle("Number of Track Candidates / Number of Seeds per Event", 1);
638  FractionCandidatesOverSeeds->setAxisTitle("Number of Event", 2);
639 
640  }
641 
642  theTrackBuildingAnalyzer->initHisto(ibooker,*conf);
643 
644 
645  if (doLumiAnalysis) {
646  if ( NumberOfTracks_lumiFlag ) NumberOfTracks_lumiFlag -> setLumiFlag();
648  }
649 
650  if(doAllSeedPlots || doSeedNumberPlot){
651  if ( doSeedLumiAnalysis_ )
653  }
654 
656 
657  ClusterLabels= conf->getParameter<std::vector<std::string> >("ClusterLabels");
658 
659  std::vector<double> histoMin,histoMax;
660  std::vector<int> histoBin; //these vectors are for max min and nbins in histograms
661 
662  int NClusStrBin = conf->getParameter<int>( "NClusStrBin");
663  double NClusStrMin = conf->getParameter<double>("NClusStrMin");
664  double NClusStrMax = conf->getParameter<double>("NClusStrMax");
665 
666  int NClusPxBin = conf->getParameter<int>( "NClusPxBin");
667  double NClusPxMin = conf->getParameter<double>("NClusPxMin");
668  double NClusPxMax = conf->getParameter<double>("NClusPxMax");
669 
670  int NTrk2DBin = conf->getParameter<int>( "NTrk2DBin");
671  double NTrk2DMin = conf->getParameter<double>("NTrk2DMin");
672  double NTrk2DMax = conf->getParameter<double>("NTrk2DMax");
673 
674  setMaxMinBin(histoMin,histoMax,histoBin,
675  NClusStrMin,NClusStrMax,NClusStrBin,
676  NClusPxMin, NClusPxMax, NClusPxBin);
677 
678  ibooker.setCurrentFolder(MEFolderName+"/HitProperties");
679 
680  for (uint i=0; i<ClusterLabels.size(); i++){
681 
682  ibooker.setCurrentFolder(MEFolderName+"/HitProperties");
683  histname = "TracksVs" + ClusterLabels[i] + "Cluster_" + CategoryName;
684  NumberOfTrkVsClusters.push_back(dynamic_cast<MonitorElement*>(ibooker.book2D(histname, histname,
685  histoBin[i], histoMin[i], histoMax[i],
686  NTrk2DBin,NTrk2DMin,NTrk2DMax
687  )));
688  std::string title = "Number of " + ClusterLabels[i] + " Clusters";
689  if(ClusterLabels[i]=="Tot")
690  title = "# of Clusters in (Pixel+Strip) Detectors";
691  NumberOfTrkVsClusters[i]->setAxisTitle(title, 1);
692  NumberOfTrkVsClusters[i]->setAxisTitle("Number of Tracks", 2);
693  NumberOfTrkVsClusters[i]->getTH1()->SetCanExtend(TH1::kXaxis);
694  }
695  }
696 
697  // Initialize the GenericTriggerEventFlag
698  if ( genTriggerEventFlag_->on() ) genTriggerEventFlag_->initRun( iRun, iSetup );
699 
700 }
701 
702 /*
703 // -- BeginRun
704 //---------------------------------------------------------------------------------//
705 void TrackingMonitor::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
706 {
707 
708 }
709 */
710 
711 // - BeginLumi
712 // ---------------------------------------------------------------------------------//
714 
715  if (doLumiAnalysis) {
718  }
720  if ( doSeedLumiAnalysis_ )
722  }
723 }
724 
725 // -- Analyse
726 // ---------------------------------------------------------------------------------//
728 {
729 
730  // Filter out events if Trigger Filtering is requested
731  if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( iEvent, iSetup) ) return;
732 
733  float lumi = -1.;
735  iEvent.getByToken(lumiscalersToken_, lumiScalers);
736  if ( lumiScalers.isValid() && !lumiScalers->empty() ) {
737  LumiScalersCollection::const_iterator scalit = lumiScalers->begin();
738  lumi = scalit->instantLumi();
739  } else
740  lumi = -1.;
741 
742  if (doPlotsVsLUMI_ || doAllPlots)
743  NumberEventsOfVsLUMI->Fill(lumi);
744 
745  // Analyse the tracks
746  // if the collection is empty, do not fill anything
747  // ---------------------------------------------------------------------------------//
748 
749  size_t bx = iEvent.bunchCrossing();
750  if ( doPlotsVsBX_ || doAllPlots )
752 
753  // get the track collection
755  iEvent.getByToken(trackToken_, trackHandle);
756 
757  int numberOfTracks_den = 0;
758  edm::Handle<edm::View<reco::Track> > allTrackHandle;
759  iEvent.getByToken(allTrackToken_,allTrackHandle);
760  if (allTrackHandle.isValid()) {
761  for ( edm::View<reco::Track>::const_iterator track = allTrackHandle->begin();
762  track != allTrackHandle->end(); ++track ) {
763 
764  if ( denSelection_(*track) )
765  numberOfTracks_den++;
766  }
767  }
768 
770  iEvent.getByToken(pvSrcToken_, pvHandle );
771  reco::Vertex const * pv0 = nullptr;
772  if (pvHandle.isValid()) {
773  pv0 = &pvHandle->front();
774  //--- pv fake (the pv collection should have size==1 and the pv==beam spot)
775  if ( pv0->isFake() || pv0->tracksSize()==0
776  // definition of goodOfflinePrimaryVertex
777  || pv0->ndof() < pvNDOF_ || pv0->z() > 24.) pv0 = nullptr;
778  }
779 
780 
781  if (trackHandle.isValid()) {
782 
783  int numberOfTracks = trackHandle->size();
784  int numberOfTracks_num = 0;
785  int numberOfTracks_pv0 = 0;
786 
787  const edm::View<reco::Track>& trackCollection = *trackHandle;
788  // calculate the mean # rechits and layers
789  int totalRecHits = 0, totalLayers = 0;
790 
792  theTrackAnalyzer->setBX(iEvent);
793  theTrackAnalyzer->setLumi(iEvent,iSetup);
794  for ( edm::View<reco::Track>::const_iterator track = trackCollection.begin();
795  track != trackCollection.end(); ++track ) {
796 
797  if ( doPlotsVsBX_ || doAllPlots )
798  NumberOfRecHitsPerTrackVsBX->Fill(bx,track->numberOfValidHits());
799  if ( numSelection_(*track) ) {
800  numberOfTracks_num++;
801  if (pv0 && std::abs(track->dz(pv0->position()))<0.15) ++numberOfTracks_pv0;
802  }
803 
804  if ( doProfilesVsLS_ || doAllPlots)
805  NumberOfRecHitsPerTrackVsLS->Fill(static_cast<double>(iEvent.id().luminosityBlock()),track->numberOfValidHits());
806 
807  if (doPlotsVsLUMI_ || doAllPlots)
808  NumberOfRecHitsPerTrackVsLUMI->Fill(lumi,track->numberOfValidHits());
809 
810  totalRecHits += track->numberOfValidHits();
811  totalLayers += track->hitPattern().trackerLayersWithMeasurement();
812 
813  // do analysis per track
814  theTrackAnalyzer->analyze(iEvent, iSetup, *track);
815  }
816 
817  double frac = -1.;
818  // if (numberOfAllTracks > 0) frac = static_cast<double>(numberOfTracks)/static_cast<double>(numberOfAllTracks);
819  if (numberOfTracks_den > 0) frac = static_cast<double>(numberOfTracks_num)/static_cast<double>(numberOfTracks_den);
820 
822  NumberOfTracks -> Fill(numberOfTracks);
823  if ( doPlotsVsBX_ || doAllPlots )
824  NumberOfTracksVsBX -> Fill(bx,numberOfTracks);
825  if (doPlotsVsLUMI_ || doAllPlots)
826  NumberOfTracksVsLUMI -> Fill(lumi,numberOfTracks);
827  if (doFractionPlot_) {
828  FractionOfGoodTracks -> Fill(frac);
829 
830  if (doFractionPlot_) {
831  if ( doPlotsVsBX_ || doAllPlots )
832  GoodTracksFractionVsBX -> Fill(bx, frac);
833  if (doPlotsVsLUMI_ || doAllPlots)
834  GoodTracksFractionVsLUMI -> Fill(lumi,frac);
835  }
836  }
837  if( numberOfTracks > 0 ) {
838  double meanRecHits = static_cast<double>(totalRecHits) / static_cast<double>(numberOfTracks);
839  double meanLayers = static_cast<double>(totalLayers) / static_cast<double>(numberOfTracks);
840  NumberOfMeanRecHitsPerTrack -> Fill(meanRecHits);
841  NumberOfMeanLayersPerTrack -> Fill(meanLayers);
842  }
843  }
844 
845  if ( doProfilesVsLS_ || doAllPlots) {
846  float nLS = static_cast<double>(iEvent.id().luminosityBlock());
847  NumberEventsOfVsLS ->Fill(nLS);
848  NumberOfTracksVsLS ->Fill(nLS,numberOfTracks);
849  if (doFractionPlot_)
850  GoodTracksFractionVsLS->Fill(nLS,frac);
851  }
852 
853  if ( doLumiAnalysis ) {
854  NumberOfTracks_lumiFlag -> Fill(numberOfTracks);
855  }
856 
857 
858  // Analyse the Track Building variables
859  // if the collection is empty, do not fill anything
860  // ---------------------------------------------------------------------------------//
861 
862 
863  // fill the TrackCandidate info
864  if (doTkCandPlots) {
865  // magnetic field
867  iSetup.get<IdealMagneticFieldRecord>().get(theMF);
868 
869  // get the candidate collection
871  iEvent.getByToken( trackCandidateToken_, theTCHandle );
872  const TrackCandidateCollection& theTCCollection = *theTCHandle;
873 
874  if (theTCHandle.isValid()) {
875 
876  // get the beam spot
877  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
878  iEvent.getByToken(bsSrcToken_, recoBeamSpotHandle );
879  const reco::BeamSpot& bs = *recoBeamSpotHandle;
880 
881  NumberOfTrackCandidates->Fill(theTCCollection.size());
882 
883  // get the seed collection
885  iEvent.getByToken(seedToken_, seedHandle );
886  const edm::View<TrajectorySeed>& seedCollection = *seedHandle;
887  if (seedHandle.isValid() && !seedCollection.empty())
888  FractionCandidatesOverSeeds->Fill(double(theTCCollection.size())/double(seedCollection.size()));
889 
891  for( TrackCandidateCollection::const_iterator cand = theTCCollection.begin(); cand != theTCCollection.end(); ++cand) {
892 
893  theTrackBuildingAnalyzer->analyze(iEvent, iSetup, *cand, bs, theMF, theTTRHBuilder);
894  }
895  } else {
896  edm::LogWarning("TrackingMonitor") << "No Track Candidates in the event. Not filling associated histograms";
897  }
898 
899  if(doMVAPlots) {
900  // Get MVA and quality mask collections
901  std::vector<const MVACollection *> mvaCollections;
902  std::vector<const QualityMaskCollection *> qualityMaskCollections;
903 
905  iEvent.getByToken(mvaTrackToken_, htracks);
906 
909  for(const auto& tokenTpl: mvaQualityTokens_) {
910  iEvent.getByToken(std::get<0>(tokenTpl), hmva);
911  iEvent.getByToken(std::get<1>(tokenTpl), hqual);
912 
913  mvaCollections.push_back(hmva.product());
914  qualityMaskCollections.push_back(hqual.product());
915  }
916  theTrackBuildingAnalyzer->analyze(*htracks, mvaCollections, qualityMaskCollections);
917  }
918  }
919 
920  //plots for trajectory seeds
921 
923 
924  // get the seed collection
926  iEvent.getByToken(seedToken_, seedHandle );
927 
928  // fill the seed info
929  if (seedHandle.isValid()) {
930  const auto& seedCollection = *seedHandle;
931 
933  NumberOfSeeds->Fill(seedCollection.size());
934  if ( doSeedLumiAnalysis_ )
935  NumberOfSeeds_lumiFlag->Fill(seedCollection.size());
936  }
937 
939 
940  std::vector<int> NClus;
941  setNclus(iEvent,NClus);
942  for (uint i=0; i< ClusterLabels.size(); i++){
943  SeedsVsClusters[i]->Fill(NClus[i],seedCollection.size());
944  }
945  }
946 
949  iEvent.getByToken(seedStopInfoToken_, stopHandle);
950  const auto& seedStopInfo = *stopHandle;
951 
952  if(seedStopInfo.size() == seedCollection.size()) {
953  //here duplication of mag field and be informations is needed to allow seed and track cand histos to be independent
954  // magnetic field
956  iSetup.get<IdealMagneticFieldRecord>().get(theMF);
957 
958  // get the beam spot
959  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
960  iEvent.getByToken(bsSrcToken_, recoBeamSpotHandle);
961  const reco::BeamSpot& bs = *recoBeamSpotHandle;
962 
964  for(size_t i=0; i < seedCollection.size(); ++i) {
965  theTrackBuildingAnalyzer->analyze(iEvent, iSetup, seedCollection[i], seedStopInfo[i], bs, theMF, theTTRHBuilder);
966  }
967  }
968  else {
969  edm::LogWarning("TrackingMonitor") << "Seed collection size (" << seedCollection.size()
970  << ") differs from seed stop info collection size (" << seedStopInfo.size()
971  << "). This is a sign of inconsistency in the configuration. Not filling associated histograms.";
972  }
973  }
974 
975  } else {
976  edm::LogWarning("TrackingMonitor") << "No Trajectory seeds in the event. Not filling associated histograms";
977  }
978  }
979 
980 
981  // plots for tracking regions
982  if (doRegionPlots) {
985  iEvent.getByToken(regionToken_, hregions);
986  const auto& regions = *hregions;
987  NumberOfTrackingRegions->Fill(regions.size());
988 
990  }
993  iEvent.getByToken(regionLayerSetsToken_, hregions);
994  const auto& regions = *hregions;
995  NumberOfTrackingRegions->Fill(regions.regionsSize());
996 
998  }
999 
1000  if (doRegionCandidatePlots) {
1002  iEvent.getByToken(regionCandidateToken_, hcandidates);
1003  theTrackBuildingAnalyzer->analyze(*hcandidates);
1004  }
1005  }
1006 
1007  if (doTrackerSpecific_ || doAllPlots) {
1008 
1009  std::vector<int> NClus;
1010  setNclus(iEvent,NClus);
1011  for (uint i=0; i< ClusterLabels.size(); i++) {
1012  NumberOfTrkVsClusters[i]->Fill(NClus[i],numberOfTracks);
1013  }
1014  }
1015 
1016  if ( doPUmonitoring_ ) {
1017 
1018  // do vertex monitoring
1019  for (size_t i=0; i<theVertexMonitor.size(); i++)
1020  theVertexMonitor[i]->analyze(iEvent, iSetup);
1021  }
1022  if ( doPlotsVsGoodPVtx_ ) {
1023 
1024  size_t totalNumGoodPV = 0;
1025  if (pvHandle.isValid()) {
1026 
1027  for (reco::VertexCollection::const_iterator pv = pvHandle->begin();
1028  pv != pvHandle->end(); ++pv) {
1029 
1030  //--- pv fake (the pv collection should have size==1 and the pv==beam spot)
1031  if (pv->isFake() || pv->tracksSize()==0) continue;
1032 
1033  // definition of goodOfflinePrimaryVertex
1034  if (pv->ndof() < pvNDOF_ || pv->z() > 24.) continue;
1035  totalNumGoodPV++;
1036  }
1037 
1038  NumberEventsOfVsGoodPVtx -> Fill( float(totalNumGoodPV) );
1039  NumberOfTracksVsGoodPVtx -> Fill( float(totalNumGoodPV), numberOfTracks );
1040  if (totalNumGoodPV>1) NumberOfTracksVsPUPVtx-> Fill( totalNumGoodPV-1, double(numberOfTracks-numberOfTracks_pv0)/double(totalNumGoodPV-1) );
1041  NumberOfPVtxVsGoodPVtx -> Fill(float(totalNumGoodPV),pvHandle->size());
1042 
1043  for ( edm::View<reco::Track>::const_iterator track = trackCollection.begin();
1044  track != trackCollection.end(); ++track ) {
1045 
1046  NumberOfRecHitsPerTrackVsGoodPVtx -> Fill(float(totalNumGoodPV), track->numberOfValidHits());
1047  }
1048 
1049  if ( doProfilesVsLS_ || doAllPlots)
1050  NumberOfGoodPVtxVsLS->Fill(static_cast<double>(iEvent.id().luminosityBlock()),totalNumGoodPV);
1051  if ( doPlotsVsBX_ || doAllPlots )
1052  NumberOfGoodPVtxVsBX->Fill(bx, float(totalNumGoodPV));
1053 
1054  if (doFractionPlot_)
1055  GoodTracksFractionVsGoodPVtx->Fill(float(totalNumGoodPV),frac);
1056 
1057  if ( doPlotsVsLUMI_ || doAllPlots )
1058  NumberOfGoodPVtxVsLUMI->Fill(lumi,float(totalNumGoodPV));
1059  }
1060 
1061  std::vector<int> NClus;
1062  setNclus(iEvent,NClus);
1063  for (uint i=0; i< ClusterLabels.size(); i++){
1064  if ( doPlotsVsLUMI_ || doAllPlots ) {
1065  if (ClusterLabels[i] =="Pix") NumberOfPixelClustersVsLUMI->Fill(lumi,NClus[i]);
1066  if (ClusterLabels[i]=="Strip") NumberOfStripClustersVsLUMI->Fill(lumi,NClus[i]);
1067  }
1068  if (ClusterLabels[i] =="Pix") NumberOfPixelClustersVsGoodPVtx->Fill(float(totalNumGoodPV),NClus[i]);
1069  if (ClusterLabels[i]=="Strip") NumberOfStripClustersVsGoodPVtx->Fill(float(totalNumGoodPV),NClus[i]);
1070  }
1071 
1072  if ( doPlotsVsBXlumi_ ) {
1073  double bxlumi = theLumiDetails_->getValue(iEvent);
1074  NumberOfTracksVsBXlumi -> Fill( bxlumi, numberOfTracks );
1075  }
1076 
1077  if ( doProfilesVsLS_ || doAllPlots ) if ( totalNumGoodPV != 0 ) NumberOfGoodPVtxWO0VsLS -> Fill(static_cast<double>(iEvent.id().luminosityBlock()),float(totalNumGoodPV));
1078  if ( doPlotsVsBX_ || doAllPlots ) if ( totalNumGoodPV != 0 ) NumberOfGoodPVtxWO0VsBX -> Fill(bx, float(totalNumGoodPV));
1079  if ( doPlotsVsLUMI_ || doAllPlots ) if ( totalNumGoodPV != 0 ) NumberOfGoodPVtxWO0VsLUMI-> Fill(lumi,float(totalNumGoodPV));
1080 
1081  } // PU monitoring
1082 
1083  } // trackHandle is valid
1084 
1085 }
1086 
1087 
1089 {
1090 }
1091 
1092 void TrackingMonitor::setMaxMinBin(std::vector<double> &arrayMin, std::vector<double> &arrayMax, std::vector<int> &arrayBin, double smin, double smax, int sbin, double pmin, double pmax, int pbin)
1093 {
1094  arrayMin.resize(ClusterLabels.size());
1095  arrayMax.resize(ClusterLabels.size());
1096  arrayBin.resize(ClusterLabels.size());
1097 
1098  for (uint i=0; i<ClusterLabels.size(); ++i) {
1099 
1100  if (ClusterLabels[i]=="Pix" ) {arrayMin[i]=pmin; arrayMax[i]=pmax; arrayBin[i]=pbin;}
1101  else if(ClusterLabels[i]=="Strip") {arrayMin[i]=smin; arrayMax[i]=smax; arrayBin[i]=sbin;}
1102  else if(ClusterLabels[i]=="Tot" ) {arrayMin[i]=smin; arrayMax[i]=smax+pmax; arrayBin[i]=sbin;}
1103  else {edm::LogWarning("TrackingMonitor") << "Cluster Label " << ClusterLabels[i] << " not defined, using strip parameters ";
1104  arrayMin[i]=smin; arrayMax[i]=smax; arrayBin[i]=sbin;}
1105 
1106  }
1107 
1108 }
1109 
1110 void TrackingMonitor::setNclus(const edm::Event& iEvent,std::vector<int> &arrayNclus)
1111 {
1112 
1113  int ncluster_pix=-1;
1114  int ncluster_strip=-1;
1115 
1117  iEvent.getByToken(stripClustersToken_, strip_clusters );
1119  iEvent.getByToken(pixelClustersToken_, pixel_clusters );
1120 
1121  if (strip_clusters.isValid() && pixel_clusters.isValid()) {
1122  ncluster_pix = (*pixel_clusters).dataSize();
1123  ncluster_strip = (*strip_clusters).dataSize();
1124  }
1125 
1126  arrayNclus.resize(ClusterLabels.size());
1127  for (uint i=0; i<ClusterLabels.size(); ++i){
1128 
1129  if (ClusterLabels[i]=="Pix" ) arrayNclus[i]=ncluster_pix ;
1130  else if(ClusterLabels[i]=="Strip") arrayNclus[i]=ncluster_strip;
1131  else if(ClusterLabels[i]=="Tot" ) arrayNclus[i]=ncluster_pix+ncluster_strip;
1132  else {edm::LogWarning("TrackingMonitor") << "Cluster Label " << ClusterLabels[i] << " not defined using stri parametrs ";
1133  arrayNclus[i]=ncluster_strip ;}
1134  }
1135 
1136 }
edm::EDGetTokenT< std::vector< SeedStopInfo > > seedStopInfoToken_
edm::EDGetTokenT< edm::View< reco::Track > > trackToken_
T getParameter(std::string const &) const
edm::EDGetTokenT< edm::OwnVector< TrackingRegion > > regionToken_
edm::EDGetTokenT< edm::View< TrajectorySeed > > seedToken_
std::vector< MonitorElement * > NumberOfTrkVsClusters
MonitorElement * FractionOfGoodTracks
virtual void setMaxMinBin(std::vector< double > &, std::vector< double > &, std::vector< int > &, double, double, int, double, double, int)
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup, const TrajectorySeed &seed, const SeedStopInfo &stopInfo, const reco::BeamSpot &bs, const edm::ESHandle< MagneticField > &theMF, const edm::ESHandle< TransientTrackingRecHitBuilder > &theTTRHBuilder)
MonitorElement * NumberOfTracksVsBX
MonitorElement * NumberOfRecHitsPerTrackVsBX
MonitorElement * NumberOfRecHitsPerTrackVsLUMI
virtual void setNclus(const edm::Event &, std::vector< int > &)
~TrackingMonitor() override
MonitorElement * bookProfile(Args &&...args)
Definition: DQMStore.h:160
MonitorElement * NumberEventsOfVsGoodPVtx
GetLumi * theLumiDetails_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void initHisto(DQMStore::IBooker &ibooker, const edm::EventSetup &, const edm::ParameterSet &)
std::vector< TrackCandidate > TrackCandidateCollection
TH1 * getTH1() const
MonitorElement * FractionCandidatesOverSeeds
int bunchCrossing() const
Definition: EventBase.h:66
edm::InputTag pvSrc_
size_type size() const
MonitorElement * GoodTracksFractionVsLUMI
Provides a code based selection for trigger and DCS information in order to have no failing filters i...
MonitorElement * NumberOfPVtxVsGoodPVtx
MonitorElement * NumberOfMeanRecHitsPerTrack
MonitorElement * NumberOfTracksVsGoodPVtx
void initHisto(DQMStore::IBooker &ibooker, const edm::ParameterSet &)
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
#define nullptr
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:40
const Point & position() const
position
Definition: Vertex.h:109
void analyze(const edm::Event &, const edm::EventSetup &) override
MonitorElement * NumberOfStripClustersVsLUMI
MonitorElement * GoodTracksFractionVsLS
void Fill(long long x)
edm::EDGetTokenT< edm::View< reco::Track > > mvaTrackToken_
double getValue(const edm::Event &)
Definition: GetLumi.cc:64
std::string Quality_
MonitorElement * NumberOfGoodPVtxWO0VsLUMI
edm::InputTag bsSrc_
MonitorElement * NumberOfSeeds
int iEvent
Definition: GenABIO.cc:230
const_iterator begin() const
MonitorElement * NumberOfTrackingRegions
void setLumiFlag()
this ME is meant to be stored for each luminosity section
void setBX(const edm::Event &)
MonitorElement * NumberOfGoodPVtxVsLS
edm::EDGetTokenT< edm::View< reco::Track > > allTrackToken_
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
MonitorElement * NumberOfGoodPVtxVsLUMI
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
bool accept(const edm::Event &event, const edm::EventSetup &setup)
To be called from analyze/filter() methods.
bool empty() const
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:118
void endRun(const edm::Run &, const edm::EventSetup &) override
MonitorElement * NumberOfTracksVsLS
def pv(vc)
Definition: MetAnalyzer.py:6
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MonitorElement * NumberOfGoodPVtxWO0VsLS
double z() const
z coordinate
Definition: Vertex.h:115
bool getMapped(key_type const &k, value_type &result) const
Definition: Registry.cc:19
MonitorElement * NumberOfTracksVsPUPVtx
edm::EDGetTokenT< LumiScalersCollection > lumiscalersToken_
MonitorElement * NumberEventsOfVsBX
bool runTrackBuildingAnalyzerForSeed
void Reset()
reset ME (ie. contents, errors, etc)
MonitorElement * NumberOfStripClustersVsGoodPVtx
bool isValid() const
Definition: HandleBase.h:74
std::vector< MonitorElement * > SeedsVsClusters
MonitorElement * NumberOfPixelClustersVsGoodPVtx
dqm::TrackAnalyzer * theTrackAnalyzer
MonitorElement * NumberOfRecHitsPerTrackVsLS
MonitorElement * GoodTracksFractionVsGoodPVtx
double ndof() const
Definition: Vertex.h:105
MonitorElement * NumberOfRecHitsPerTrackVsGoodPVtx
edm::EDGetTokenT< TrackingRegionsSeedingLayerSets > regionLayerSetsToken_
std::string histname
edm::ParameterSetID confID_
MonitorElement * NumberOfPixelClustersVsLUMI
void setNumberOfGoodVertices(const edm::Event &)
std::vector< VertexMonitor * > theVertexMonitor
MonitorElement * NumberOfTracksVsBXlumi
edm::InputTag stripClusterInputTag_
bool doGeneralPropertiesPlots_
TrackBuildingAnalyzer * theTrackBuildingAnalyzer
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:279
bool isFake() const
Definition: Vertex.h:72
T const * product() const
Definition: Handle.h:81
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:136
std::string AlgoName_
edm::EDGetTokenT< TrackCandidateCollection > trackCandidateToken_
MonitorElement * NumberOfMeanLayersPerTrack
StringCutObjectSelector< reco::Track, true > denSelection_
const T & get() const
Definition: EventSetup.h:58
StringCutObjectSelector< reco::Track, true > numSelection_
def uint(string)
GenericTriggerEventFlag * genTriggerEventFlag_
edm::EDGetTokenT< reco::CandidateView > regionCandidateToken_
MonitorElement * GoodTracksFractionVsBX
edm::InputTag pixelClusterInputTag_
std::string const & label() const
Definition: InputTag.h:36
MonitorElement * NumberOfSeeds_lumiFlag
void beginLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &eSetup) override
edm::EventID id() const
Definition: EventBase.h:60
TrackingMonitor(const edm::ParameterSet &)
HLT enums.
edm::ESHandle< TransientTrackingRecHitBuilder > theTTRHBuilder
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
virtual void beginJob(void)
MonitorElement * NumberOfTrackCandidates
bool isUninitialized() const
Definition: EDGetToken.h:73
const_iterator end() const
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > pixelClustersToken_
void Reset(std::vector< TH2F > &depth)
edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > stripClustersToken_
void initRun(const edm::Run &run, const edm::EventSetup &setup)
To be called from beginRun() methods.
MonitorElement * NumberOfGoodPVtxVsBX
MonitorElement * NumberEventsOfVsLUMI
std::vector< std::tuple< edm::EDGetTokenT< MVACollection >, edm::EDGetTokenT< QualityMaskCollection > > > mvaQualityTokens_
MonitorElement * NumberOfTracks_lumiFlag
void setLumi(const edm::Event &, const edm::EventSetup &iSetup)
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
edm::EDGetTokenT< reco::BeamSpot > bsSrcToken_
MonitorElement * NumberOfTracks
size_t tracksSize() const
number of tracks
Definition: Vertex.cc:71
static Registry * instance()
Definition: Registry.cc:13
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::Track &track)
edm::EDGetTokenT< reco::VertexCollection > pvSrcToken_
Definition: Run.h:43
MonitorElement * NumberEventsOfVsLS
MonitorElement * NumberOfTracksVsLUMI
std::vector< std::string > ClusterLabels
MonitorElement * NumberOfGoodPVtxWO0VsBX
std::string builderName