00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "DataFormats/TrackReco/interface/Track.h"
00010 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00011 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00012 #include "DataFormats/TrackCandidate/interface/TrackCandidateCollection.h"
00013 #include "DataFormats/TrackCandidate/interface/TrackCandidate.h"
00014 #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
00015 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
00016 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00017 #include "MagneticField/Engine/interface/MagneticField.h"
00018
00019 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00020 #include "FWCore/Utilities/interface/InputTag.h"
00021 #include "DQMServices/Core/interface/DQMStore.h"
00022 #include "DQM/TrackingMonitor/interface/TrackBuildingAnalyzer.h"
00023 #include "DQM/TrackingMonitor/interface/TrackAnalyzer.h"
00024 #include "DQM/TrackingMonitor/interface/VertexMonitor.h"
00025 #include "DQM/TrackingMonitor/interface/TrackingMonitor.h"
00026
00027 #include "FWCore/Framework/interface/ESHandle.h"
00028 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00029
00030 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00031 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00032 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
00033 #include "TrackingTools/PatternTools/interface/TSCPBuilderNoMaterial.h"
00034 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00035 #include "CommonTools/TriggerUtils/interface/GenericTriggerEventFlag.h"
00036 #include "DataFormats/Common/interface/DetSetVectorNew.h"
00037 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
00038 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
00039
00040 #include "DataFormats/VertexReco/interface/Vertex.h"
00041 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00042
00043 #include "DQM/TrackingMonitor/interface/GetLumi.h"
00044
00045 #include <string>
00046
00047
00048
00049
00050 TrackingMonitor::TrackingMonitor(const edm::ParameterSet& iConfig)
00051 : dqmStore_( edm::Service<DQMStore>().operator->() )
00052 , conf_ ( iConfig )
00053 , theTrackAnalyzer( new TrackAnalyzer(conf_) )
00054 , theTrackBuildingAnalyzer( new TrackBuildingAnalyzer(conf_) )
00055 , NumberOfTracks(NULL)
00056 , NumberOfMeanRecHitsPerTrack(NULL)
00057 , NumberOfMeanLayersPerTrack(NULL)
00058 , NumberOfGoodTracks(NULL)
00059 , FractionOfGoodTracks(NULL)
00060 , NumberOfSeeds(NULL)
00061 , NumberOfTrackCandidates(NULL)
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 , NumberOfGoodTrkVsClus(NULL)
00072 , NumberOfTracksVsLS(NULL)
00073 , NumberOfGoodTracksVsLS(NULL)
00074 , GoodTracksFractionVsLS(NULL)
00075 , GoodTracksNumberOfRecHitsPerTrackVsLS(NULL)
00076
00077
00078 , NumberOfTracksVsGoodPVtx(NULL)
00079 , NumberOfTracksVsBXlumi(NULL)
00080 , NumberOfGoodTracksVsGoodPVtx(NULL)
00081 , NumberOfGoodTracksVsBXlumi(NULL)
00082 , FractionOfGoodTracksVsGoodPVtx(NULL)
00083 , FractionOfGoodTracksVsBXlumi(NULL)
00084
00085 , NumberOfTracks_lumiFlag(NULL)
00086 , NumberOfGoodTracks_lumiFlag(NULL)
00087
00088 , builderName ( conf_.getParameter<std::string>("TTRHBuilder"))
00089 , doTrackerSpecific_ ( conf_.getParameter<bool>("doTrackerSpecific") )
00090 , doLumiAnalysis ( conf_.getParameter<bool>("doLumiAnalysis"))
00091 , doProfilesVsLS_ ( conf_.getParameter<bool>("doProfilesVsLS"))
00092 , doAllPlots ( conf_.getParameter<bool>("doAllPlots"))
00093 , doGeneralPropertiesPlots_( conf_.getParameter<bool>("doGeneralPropertiesPlots"))
00094 , doHitPropertiesPlots_ ( conf_.getParameter<bool>("doHitPropertiesPlots"))
00095 , doGoodTrackPlots_ ( conf_.getParameter<bool>("doGoodTrackPlots") )
00096 , doPUmonitoring_ ( conf_.getParameter<bool>("doPUmonitoring") )
00097 , genTriggerEventFlag_(new GenericTriggerEventFlag(iConfig))
00098 {
00099
00100 if ( doPUmonitoring_ ) {
00101
00102
00103 doPlotsVsBXlumi_ = conf_.getParameter<bool>("doPlotsVsBXlumi");
00104 doPlotsVsGoodPVtx_ = conf_.getParameter<bool>("doPlotsVsGoodPVtx");
00105
00106 if ( doPlotsVsBXlumi_ )
00107 theLumiDetails_ = new GetLumi( iConfig.getParameter<edm::ParameterSet>("BXlumiSetup") );
00108
00109 std::vector<edm::InputTag> primaryVertexInputTags = conf_.getParameter<std::vector<edm::InputTag> >("primaryVertexInputTags");
00110 std::vector<edm::InputTag> selPrimaryVertexInputTags = conf_.getParameter<std::vector<edm::InputTag> >("selPrimaryVertexInputTags");
00111 std::vector<std::string> pvLabels = conf_.getParameter<std::vector<std::string> > ("pvLabels");
00112
00113 if (primaryVertexInputTags.size()==pvLabels.size() and primaryVertexInputTags.size()==selPrimaryVertexInputTags.size()) {
00114 for (size_t i=0; i<primaryVertexInputTags.size(); i++) {
00115 edm::InputTag iPVinputTag = primaryVertexInputTags[i];
00116 edm::InputTag iSelPVinputTag = selPrimaryVertexInputTags[i];
00117 std::string iPVlabel = pvLabels[i];
00118
00119 theVertexMonitor.push_back(new VertexMonitor(conf_,iPVinputTag,iSelPVinputTag,iPVlabel));
00120 }
00121 }
00122 }
00123
00124 }
00125
00126
00127 TrackingMonitor::~TrackingMonitor()
00128 {
00129 if (theTrackAnalyzer) delete theTrackAnalyzer;
00130 if (theTrackBuildingAnalyzer) delete theTrackBuildingAnalyzer;
00131 if ( doPUmonitoring_ )
00132 for (size_t i=0; i<theVertexMonitor.size(); i++)
00133 if (theVertexMonitor[i]) delete theVertexMonitor[i];
00134 if (genTriggerEventFlag_) delete genTriggerEventFlag_;
00135 }
00136
00137
00138 void TrackingMonitor::beginJob(void)
00139 {
00140
00141
00142 std::string Quality = conf_.getParameter<std::string>("Quality");
00143 std::string AlgoName = conf_.getParameter<std::string>("AlgoName");
00144 std::string MEFolderName = conf_.getParameter<std::string>("FolderName");
00145
00146
00147 if( Quality != "")
00148 {
00149 if( Quality != "highPurity" && Quality != "tight" && Quality != "loose")
00150 {
00151 edm::LogWarning("TrackingMonitor") << "Qualty Name is invalid, using no quality criterea by default";
00152 Quality = "";
00153 }
00154 }
00155
00156
00157 std::string CategoryName = Quality != "" ? AlgoName + "_" + Quality : AlgoName;
00158
00159
00160 int TKNoBin = conf_.getParameter<int>( "TkSizeBin");
00161 double TKNoMin = conf_.getParameter<double>("TkSizeMin");
00162 double TKNoMax = conf_.getParameter<double>("TkSizeMax");
00163
00164 int TCNoBin = conf_.getParameter<int>( "TCSizeBin");
00165 double TCNoMin = conf_.getParameter<double>("TCSizeMin");
00166 double TCNoMax = conf_.getParameter<double>("TCSizeMax");
00167
00168 int TKNoSeedBin = conf_.getParameter<int>( "TkSeedSizeBin");
00169 double TKNoSeedMin = conf_.getParameter<double>("TkSeedSizeMin");
00170 double TKNoSeedMax = conf_.getParameter<double>("TkSeedSizeMax");
00171
00172 int MeanHitBin = conf_.getParameter<int>( "MeanHitBin");
00173 double MeanHitMin = conf_.getParameter<double>("MeanHitMin");
00174 double MeanHitMax = conf_.getParameter<double>("MeanHitMax");
00175
00176 int MeanLayBin = conf_.getParameter<int>( "MeanLayBin");
00177 double MeanLayMin = conf_.getParameter<double>("MeanLayMin");
00178 double MeanLayMax = conf_.getParameter<double>("MeanLayMax");
00179
00180 int LSBin = conf_.getParameter<int>( "LSBin");
00181 int LSMin = conf_.getParameter<double>("LSMin");
00182 int LSMax = conf_.getParameter<double>("LSMax");
00183
00184 std::string StateName = conf_.getParameter<std::string>("MeasurementState");
00185 if
00186 (
00187 StateName != "OuterSurface" &&
00188 StateName != "InnerSurface" &&
00189 StateName != "ImpactPoint" &&
00190 StateName != "default" &&
00191 StateName != "All"
00192 )
00193 {
00194
00195 edm::LogWarning("TrackingMonitor") << "State Name is invalid, using 'ImpactPoint' by default";
00196 }
00197
00198 dqmStore_->setCurrentFolder(MEFolderName);
00199
00200
00201
00202
00203 if (doGeneralPropertiesPlots_ || doAllPlots){
00204
00205 dqmStore_->setCurrentFolder(MEFolderName+"/GeneralProperties");
00206
00207 histname = "NumberOfTracks_" + CategoryName;
00208
00209
00210 NumberOfTracks = dqmStore_->book1D(histname, histname, 3*TKNoBin, TKNoMin, (TKNoMax+0.5)*3.-0.5);
00211 NumberOfTracks->setAxisTitle("Number of Tracks per Event", 1);
00212 NumberOfTracks->setAxisTitle("Number of Events", 2);
00213
00214 histname = "NumberOfMeanRecHitsPerTrack_" + CategoryName;
00215 NumberOfMeanRecHitsPerTrack = dqmStore_->book1D(histname, histname, MeanHitBin, MeanHitMin, MeanHitMax);
00216 NumberOfMeanRecHitsPerTrack->setAxisTitle("Mean number of found RecHits per Track", 1);
00217 NumberOfMeanRecHitsPerTrack->setAxisTitle("Entries", 2);
00218
00219 histname = "NumberOfMeanLayersPerTrack_" + CategoryName;
00220 NumberOfMeanLayersPerTrack = dqmStore_->book1D(histname, histname, MeanLayBin, MeanLayMin, MeanLayMax);
00221 NumberOfMeanLayersPerTrack->setAxisTitle("Mean number of Layers per Track", 1);
00222 NumberOfMeanLayersPerTrack->setAxisTitle("Entries", 2);
00223
00224 dqmStore_->setCurrentFolder(MEFolderName+"/GeneralProperties/GoodTracks");
00225
00226 histname = "NumberOfGoodTracks_" + CategoryName;
00227 NumberOfGoodTracks = dqmStore_->book1D(histname, histname, TKNoBin, TKNoMin, TKNoMax);
00228 NumberOfGoodTracks->setAxisTitle("Number of Good Tracks per Event", 1);
00229 NumberOfGoodTracks->setAxisTitle("Number of Events", 2);
00230
00231 histname = "FractionOfGoodTracks_" + CategoryName;
00232 FractionOfGoodTracks = dqmStore_->book1D(histname, histname, 101, -0.005, 1.005);
00233 FractionOfGoodTracks->setAxisTitle("Fraction of High Purity Tracks (Tracks with Pt>1GeV)", 1);
00234 FractionOfGoodTracks->setAxisTitle("Entries", 2);
00235 }
00236
00237 if ( doLumiAnalysis ) {
00238
00239 dqmStore_->setCurrentFolder(MEFolderName+"/LSanalysis");
00240
00241 histname = "NumberOfTracks_lumiFlag_" + CategoryName;
00242 NumberOfTracks_lumiFlag = dqmStore_->book1D(histname, histname, 3*TKNoBin, TKNoMin, (TKNoMax+0.5)*3.-0.5);
00243 NumberOfTracks_lumiFlag->setAxisTitle("Number of Tracks per Event", 1);
00244 NumberOfTracks_lumiFlag->setAxisTitle("Number of Events", 2);
00245
00246 if ( doGoodTrackPlots_ ) {
00247 histname = "NumberOfGoodTracks_lumiFlag_" + CategoryName;
00248 NumberOfGoodTracks_lumiFlag = dqmStore_->book1D(histname, histname, TKNoBin, TKNoMin, TKNoMax);
00249 NumberOfGoodTracks_lumiFlag->setAxisTitle("Number of Good Tracks per Event", 1);
00250 NumberOfGoodTracks_lumiFlag->setAxisTitle("Number of Events", 2);
00251 }
00252
00253 }
00254
00255
00256
00257
00258
00259 if ( doProfilesVsLS_ || doAllPlots) {
00260
00261 dqmStore_->setCurrentFolder(MEFolderName+"/GeneralProperties");
00262
00263 histname = "NumberOfTracksVsLS_"+ CategoryName;
00264 NumberOfTracksVsLS = dqmStore_->bookProfile(histname,histname, LSBin,LSMin,LSMax, TKNoMin, (TKNoMax+0.5)*3.-0.5,"");
00265 NumberOfTracksVsLS->getTH1()->SetBit(TH1::kCanRebin);
00266 NumberOfTracksVsLS->setAxisTitle("#Lumi section",1);
00267 NumberOfTracksVsLS->setAxisTitle("Number of Tracks",2);
00268
00269 if (doGoodTrackPlots_ || doAllPlots ){
00270 dqmStore_->setCurrentFolder(MEFolderName+"/GeneralProperties/GoodTracks");
00271
00272 histname = "NumberOfGoodTracksVsLS_"+ CategoryName;
00273 NumberOfGoodTracksVsLS = dqmStore_->bookProfile(histname,histname, LSBin,LSMin,LSMax, TKNoMin, TKNoMax,"");
00274 NumberOfGoodTracksVsLS->getTH1()->SetBit(TH1::kCanRebin);
00275 NumberOfGoodTracksVsLS->setAxisTitle("#Lumi section",1);
00276 NumberOfGoodTracksVsLS->setAxisTitle("Number of Good Tracks",2);
00277
00278 histname = "GoodTracksFractionVsLS_"+ CategoryName;
00279 GoodTracksFractionVsLS = dqmStore_->bookProfile(histname,histname, LSBin,LSMin,LSMax,0,1.1,"");
00280 GoodTracksFractionVsLS->getTH1()->SetBit(TH1::kCanRebin);
00281 GoodTracksFractionVsLS->setAxisTitle("#Lumi section",1);
00282 GoodTracksFractionVsLS->setAxisTitle("Fraction of Good Tracks",2);
00283
00284 histname = "GoodTracksNumberOfRecHitsPerTrackVsLS_" + CategoryName;
00285 GoodTracksNumberOfRecHitsPerTrackVsLS = dqmStore_->bookProfile(histname,histname, LSBin,LSMin,LSMax,0.,40.,"");
00286 GoodTracksNumberOfRecHitsPerTrackVsLS->getTH1()->SetBit(TH1::kCanRebin);
00287 GoodTracksNumberOfRecHitsPerTrackVsLS->setAxisTitle("#Lumi section",1);
00288 GoodTracksNumberOfRecHitsPerTrackVsLS->setAxisTitle("Mean number of RecHits per Good track",2);
00289 }
00290 }
00291
00292
00293
00294
00295 if ( doPUmonitoring_ ) {
00296
00297 for (size_t i=0; i<theVertexMonitor.size(); i++)
00298 theVertexMonitor[i]->beginJob(dqmStore_);
00299
00300 dqmStore_->setCurrentFolder(MEFolderName+"/PUmonitoring");
00301
00302 if ( doPlotsVsGoodPVtx_ ) {
00303
00304 int GoodPVtxBin = conf_.getParameter<int>("GoodPVtxBin");
00305 double GoodPVtxMin = conf_.getParameter<double>("GoodPVtxMin");
00306 double GoodPVtxMax = conf_.getParameter<double>("GoodPVtxMax");
00307
00308 histname = "NumberOfTracksVsGoodPVtx";
00309 NumberOfTracksVsGoodPVtx = dqmStore_->bookProfile(histname,histname,GoodPVtxBin,GoodPVtxMin,GoodPVtxMax,TKNoMin, (TKNoMax+0.5)*3.-0.5,"");
00310 NumberOfTracksVsGoodPVtx->getTH1()->SetBit(TH1::kCanRebin);
00311 NumberOfTracksVsGoodPVtx->setAxisTitle("Number of PV",1);
00312 NumberOfTracksVsGoodPVtx->setAxisTitle("Mean number of Tracks per Event",2);
00313
00314 histname = "NumberOfGoodTracksVsGoodPVtx";
00315 NumberOfGoodTracksVsGoodPVtx = dqmStore_->bookProfile(histname,histname,GoodPVtxBin,GoodPVtxMin,GoodPVtxMax, TKNoMin, TKNoMax,"");
00316 NumberOfGoodTracksVsGoodPVtx->getTH1()->SetBit(TH1::kCanRebin);
00317 NumberOfGoodTracksVsGoodPVtx->setAxisTitle("Number of PV",1);
00318 NumberOfGoodTracksVsGoodPVtx->setAxisTitle("Mean number of Good Tracks per Event",2);
00319
00320 histname = "FractionOfGoodTracksVsGoodPVtx";
00321 FractionOfGoodTracksVsGoodPVtx = dqmStore_->bookProfile(histname,histname,GoodPVtxBin,GoodPVtxMin,GoodPVtxMax, TKNoMin, TKNoMax,"");
00322 FractionOfGoodTracksVsGoodPVtx->getTH1()->SetBit(TH1::kCanRebin);
00323 FractionOfGoodTracksVsGoodPVtx->setAxisTitle("Number of PV",1);
00324 FractionOfGoodTracksVsGoodPVtx->setAxisTitle("Mean fraction of Good Tracks per Event",2);
00325 }
00326
00327 if ( doPlotsVsBXlumi_ ) {
00328
00329 edm::ParameterSet BXlumiParameters = conf_.getParameter<edm::ParameterSet>("BXlumiSetup");
00330 int BXlumiBin = BXlumiParameters.getParameter<int>("BXlumiBin");
00331 double BXlumiMin = BXlumiParameters.getParameter<double>("BXlumiMin");
00332 double BXlumiMax = BXlumiParameters.getParameter<double>("BXlumiMax");
00333
00334 histname = "NumberOfTracksVsBXlumi_"+ CategoryName;
00335 NumberOfTracksVsBXlumi = dqmStore_->bookProfile(histname,histname, BXlumiBin,BXlumiMin,BXlumiMax, TKNoMin, TKNoMax,"");
00336 NumberOfTracksVsBXlumi->getTH1()->SetBit(TH1::kCanRebin);
00337 NumberOfTracksVsBXlumi->setAxisTitle("lumi BX [10^{30}Hzcm^{-2}]",1);
00338 NumberOfTracksVsBXlumi->setAxisTitle("Mean number of Good Tracks",2);
00339
00340 histname = "NumberOfGoodTracksVsBXlumi_"+ CategoryName;
00341 NumberOfGoodTracksVsBXlumi = dqmStore_->bookProfile(histname,histname, BXlumiBin,BXlumiMin,BXlumiMax, TKNoMin, TKNoMax,"");
00342 NumberOfGoodTracksVsBXlumi->getTH1()->SetBit(TH1::kCanRebin);
00343 NumberOfGoodTracksVsBXlumi->setAxisTitle("lumi BX [10^{30}Hzcm^{-2}]",1);
00344 NumberOfGoodTracksVsBXlumi->setAxisTitle("Mean number of Good Tracks",2);
00345
00346 histname = "FractionOfGoodTracksVsBXlumi_"+ CategoryName;
00347 FractionOfGoodTracksVsBXlumi = dqmStore_->bookProfile(histname,histname, BXlumiBin,BXlumiMin,BXlumiMax, TKNoMin, TKNoMax,"");
00348 FractionOfGoodTracksVsBXlumi->getTH1()->SetBit(TH1::kCanRebin);
00349 FractionOfGoodTracksVsBXlumi->setAxisTitle("lumi BX [10^{30}Hzcm^{-2}]",1);
00350 FractionOfGoodTracksVsBXlumi->setAxisTitle("Mean fraction of Good Tracks",2);
00351
00352 }
00353 }
00354
00355 theTrackAnalyzer->beginJob(dqmStore_);
00356
00357
00358
00359
00360 dqmStore_->setCurrentFolder(MEFolderName+"/TrackBuilding");
00361
00362 doAllSeedPlots=conf_.getParameter<bool>("doSeedParameterHistos");
00363 doSeedNumberPlot=conf_.getParameter<bool>("doSeedNumberHisto");
00364 doSeedVsClusterPlot=conf_.getParameter<bool>("doSeedVsClusterHisto");
00365
00366
00367 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"));
00368
00369 edm::InputTag seedProducer = conf_.getParameter<edm::InputTag>("SeedProducer");
00370
00371 if (doAllSeedPlots || doSeedNumberPlot){
00372 histname = "NumberOfSeeds_"+ seedProducer.label() + "_"+ CategoryName;
00373 NumberOfSeeds = dqmStore_->book1D(histname, histname, TKNoSeedBin, TKNoSeedMin, TKNoSeedMax);
00374 NumberOfSeeds->setAxisTitle("Number of Seeds per Event", 1);
00375 NumberOfSeeds->setAxisTitle("Number of Events", 2);
00376 }
00377
00378 if (doAllSeedPlots || doSeedVsClusterPlot){
00379
00380 ClusterLabels= conf_.getParameter<std::vector<std::string> >("ClusterLabels");
00381
00382 std::vector<double> histoMin,histoMax;
00383 std::vector<int> histoBin;
00384
00385 int NClusPxBin = conf_.getParameter<int>( "NClusPxBin");
00386 double NClusPxMin = conf_.getParameter<double>("NClusPxMin");
00387 double NClusPxMax = conf_.getParameter<double>("NClusPxMax");
00388
00389 int NClusStrBin = conf_.getParameter<int>( "NClusStrBin");
00390 double NClusStrMin = conf_.getParameter<double>("NClusStrMin");
00391 double NClusStrMax = conf_.getParameter<double>("NClusStrMax");
00392
00393 setMaxMinBin(histoMin,histoMax,histoBin,NClusStrMin,NClusStrMax,NClusStrBin,NClusPxMin,NClusPxMax,NClusPxBin);
00394
00395 for (uint i=0; i<ClusterLabels.size(); i++){
00396 histname = "SeedsVsClusters_" + seedProducer.label() + "_Vs_" + ClusterLabels[i] + "_" + CategoryName;
00397 SeedsVsClusters.push_back(dynamic_cast<MonitorElement*>(dqmStore_->book2D(histname, histname, histoBin[i], histoMin[i], histoMax[i],
00398 TKNoSeedBin, TKNoSeedMin, TKNoSeedMax)));
00399 SeedsVsClusters[i]->setAxisTitle("Number of Clusters", 1);
00400 SeedsVsClusters[i]->setAxisTitle("Number of Seeds", 2);
00401 }
00402 }
00403
00404
00405 doTkCandPlots=conf_.getParameter<bool>("doTrackCandHistos");
00406
00407
00408 if (doTkCandPlots){
00409
00410 edm::InputTag tcProducer = conf_.getParameter<edm::InputTag>("TCProducer");
00411
00412 histname = "NumberOfTrackCandidates_"+ tcProducer.label() + "_"+ CategoryName;
00413 NumberOfTrackCandidates = dqmStore_->book1D(histname, histname, TCNoBin, TCNoMin, TCNoMax);
00414 NumberOfTrackCandidates->setAxisTitle("Number of Track Candidates per Event", 1);
00415 NumberOfTrackCandidates->setAxisTitle("Number of Event", 2);
00416 }
00417
00418
00419 theTrackBuildingAnalyzer->beginJob(dqmStore_);
00420
00421
00422 if (doLumiAnalysis) {
00423
00424
00425
00426 if ( NumberOfTracks_lumiFlag ) NumberOfTracks_lumiFlag -> setLumiFlag();
00427 if ( NumberOfGoodTracks_lumiFlag ) NumberOfGoodTracks_lumiFlag -> setLumiFlag();
00428 theTrackAnalyzer->setLumiFlag();
00429 }
00430
00431 if (doTrackerSpecific_ || doAllPlots) {
00432
00433 ClusterLabels= conf_.getParameter<std::vector<std::string> >("ClusterLabels");
00434
00435 std::vector<double> histoMin,histoMax;
00436 std::vector<int> histoBin;
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454 int NClusStrBin = conf_.getParameter<int>( "NClusStrBin");
00455 double NClusStrMin = conf_.getParameter<double>("NClusStrMin");
00456 double NClusStrMax = conf_.getParameter<double>("NClusStrMax");
00457
00458 int NClusPxBin = conf_.getParameter<int>( "NClusPxBin");
00459 double NClusPxMin = conf_.getParameter<double>("NClusPxMin");
00460 double NClusPxMax = conf_.getParameter<double>("NClusPxMax");
00461
00462 int NTrk2DBin = conf_.getParameter<int>( "NTrk2DBin");
00463 double NTrk2DMin = conf_.getParameter<double>("NTrk2DMin");
00464 double NTrk2DMax = conf_.getParameter<double>("NTrk2DMax");
00465
00466
00467 setMaxMinBin(histoMin,histoMax,histoBin,
00468 NClusStrMin,NClusStrMax,NClusStrBin,
00469 NClusPxMin, NClusPxMax, NClusPxBin);
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481 dqmStore_->setCurrentFolder(MEFolderName+"/HitProperties");
00482
00483 for (uint i=0; i<ClusterLabels.size(); i++){
00484
00485 dqmStore_->setCurrentFolder(MEFolderName+"/HitProperties");
00486 histname = "TracksVs" + ClusterLabels[i] + "Cluster_" + CategoryName;
00487 NumberOfTrkVsClusters.push_back(dynamic_cast<MonitorElement*>(dqmStore_->book2D(histname, histname,
00488 histoBin[i], histoMin[i], histoMax[i],
00489 NTrk2DBin,NTrk2DMin,NTrk2DMax
00490 )));
00491 std::string title = "Number of " + ClusterLabels[i] + " Clusters";
00492 NumberOfTrkVsClusters[i]->setAxisTitle(title, 1);
00493 NumberOfTrkVsClusters[i]->setAxisTitle("Number of Seeds", 2);
00494
00495 if (doGoodTrackPlots_ || doAllPlots ) {
00496
00497 dqmStore_->setCurrentFolder(MEFolderName+"/HitProperties/GoodTracks");
00498
00499 if(ClusterLabels[i].compare("Tot")==0){
00500 histname = "GoodTracksVs" + ClusterLabels[i] + "Cluster_" + CategoryName;
00501 NumberOfGoodTrkVsClus = dqmStore_->book2D(histname,histname,
00502 histoBin[i], histoMin[i], histoMax[i],
00503 TKNoBin,TKNoMin,TKNoMax
00504 );
00505 NumberOfGoodTrkVsClus->setAxisTitle("# of Clusters in (Pixel+Strip) Detectors", 1);
00506 NumberOfGoodTrkVsClus->setAxisTitle("Number of Good Tracks", 2);
00507 }
00508 }
00509 }
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520 }
00521
00522
00523 }
00524
00525
00526
00527 void TrackingMonitor::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
00528 {
00529
00530
00531 if ( genTriggerEventFlag_->on() ) genTriggerEventFlag_->initRun( iRun, iSetup );
00532 }
00533
00534
00535
00536 void TrackingMonitor::beginLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& eSetup) {
00537
00538 if (doLumiAnalysis) {
00539
00540
00541
00542
00543 if ( NumberOfTracks_lumiFlag ) NumberOfTracks_lumiFlag -> Reset();
00544 if ( doGoodTrackPlots_ )
00545 if ( NumberOfGoodTracks_lumiFlag ) NumberOfGoodTracks_lumiFlag -> Reset();
00546 theTrackAnalyzer->doReset(dqmStore_);
00547 }
00548 }
00549
00550
00551
00552 void TrackingMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00553 {
00554
00555 if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( iEvent, iSetup) ) return;
00556
00557
00558 edm::InputTag trackProducer = conf_.getParameter<edm::InputTag>("TrackProducer");
00559 edm::InputTag seedProducer = conf_.getParameter<edm::InputTag>("SeedProducer");
00560 edm::InputTag tcProducer = conf_.getParameter<edm::InputTag>("TCProducer");
00561 edm::InputTag bsSrc = conf_.getParameter<edm::InputTag>("beamSpot");
00562 edm::InputTag pvSrc_ = conf_.getParameter<edm::InputTag>("primaryVertex");
00563 std::string Quality = conf_.getParameter<std::string>("Quality");
00564 std::string Algo = conf_.getParameter<std::string>("AlgoName");
00565
00566
00567
00568
00569
00570
00571 edm::Handle<reco::TrackCollection> trackHandle;
00572 iEvent.getByLabel(trackProducer, trackHandle);
00573
00574 if (trackHandle.isValid())
00575 {
00576
00577 reco::TrackCollection trackCollection = *trackHandle;
00578
00579 int totalNumTracks = 0, totalRecHits = 0, totalLayers = 0;
00580 int totalNumHPTracks = 0, totalNumPt1Tracks = 0, totalNumHPPt1Tracks = 0;
00581 double frac = 0.;
00582 for (reco::TrackCollection::const_iterator track = trackCollection.begin(); track!=trackCollection.end(); ++track)
00583 {
00584
00585 if( track->quality(reco::TrackBase::highPurity) ) {
00586 ++totalNumHPTracks;
00587 if ( track->pt() >= 1. ) {
00588 ++totalNumHPPt1Tracks;
00589 if ( doProfilesVsLS_ || doAllPlots)
00590 if ( doGoodTrackPlots_ || doAllPlots ) {
00591 GoodTracksNumberOfRecHitsPerTrackVsLS->Fill(static_cast<double>(iEvent.id().luminosityBlock()),track->recHitsSize());
00592 }
00593 }
00594 }
00595
00596 if ( track->pt() >= 1. ) ++totalNumPt1Tracks;
00597
00598
00599 if( Quality == "highPurity")
00600 {
00601 if( !track->quality(reco::TrackBase::highPurity) ) continue;
00602 }
00603 else if( Quality == "tight")
00604 {
00605 if( !track->quality(reco::TrackBase::tight) ) continue;
00606 }
00607 else if( Quality == "loose")
00608 {
00609 if( !track->quality(reco::TrackBase::loose) ) continue;
00610 }
00611
00612 totalNumTracks++;
00613 totalRecHits += track->numberOfValidHits();
00614 totalLayers += track->hitPattern().trackerLayersWithMeasurement();
00615
00616
00617 theTrackAnalyzer->analyze(iEvent, iSetup, *track);
00618 }
00619
00620 if (totalNumPt1Tracks > 0) frac = static_cast<double>(totalNumHPPt1Tracks)/static_cast<double>(totalNumPt1Tracks);
00621
00622 if (doGeneralPropertiesPlots_ || doAllPlots){
00623 NumberOfTracks -> Fill(totalNumTracks);
00624 NumberOfGoodTracks -> Fill(totalNumHPPt1Tracks);
00625 FractionOfGoodTracks -> Fill(frac);
00626 }
00627
00628 if ( doProfilesVsLS_ || doAllPlots) {
00629 NumberOfTracksVsLS->Fill(static_cast<double>(iEvent.id().luminosityBlock()),totalNumTracks);
00630 if ( doGoodTrackPlots_ || doAllPlots ) {
00631 NumberOfGoodTracksVsLS->Fill(static_cast<double>(iEvent.id().luminosityBlock()),totalNumHPPt1Tracks);
00632 GoodTracksFractionVsLS->Fill(static_cast<double>(iEvent.id().luminosityBlock()),frac);
00633 }
00634 }
00635
00636 if ( doLumiAnalysis ) {
00637 NumberOfTracks_lumiFlag -> Fill(totalNumTracks);
00638 if ( doGoodTrackPlots_ )
00639 NumberOfGoodTracks_lumiFlag -> Fill(totalNumHPPt1Tracks);
00640 }
00641
00642 if (doGeneralPropertiesPlots_ || doAllPlots){
00643 if( totalNumTracks > 0 )
00644 {
00645 double meanRecHits = static_cast<double>(totalRecHits) / static_cast<double>(totalNumTracks);
00646 double meanLayers = static_cast<double>(totalLayers) / static_cast<double>(totalNumTracks);
00647 NumberOfMeanRecHitsPerTrack -> Fill(meanRecHits);
00648 NumberOfMeanLayersPerTrack -> Fill(meanLayers);
00649 }
00650 }
00651
00652
00653
00654
00655
00656
00657
00658 if (doTkCandPlots)
00659 {
00660
00661
00662 edm::ESHandle<MagneticField> theMF;
00663 iSetup.get<IdealMagneticFieldRecord>().get(theMF);
00664
00665
00666 edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00667 iEvent.getByLabel(bsSrc,recoBeamSpotHandle);
00668 const reco::BeamSpot& bs = *recoBeamSpotHandle;
00669
00670
00671 edm::Handle<TrackCandidateCollection> theTCHandle;
00672 iEvent.getByLabel(tcProducer, theTCHandle );
00673 const TrackCandidateCollection& theTCCollection = *theTCHandle;
00674
00675 if (theTCHandle.isValid())
00676 {
00677 NumberOfTrackCandidates->Fill(theTCCollection.size());
00678 iSetup.get<TransientRecHitRecord>().get(builderName,theTTRHBuilder);
00679 for( TrackCandidateCollection::const_iterator cand = theTCCollection.begin(); cand != theTCCollection.end(); ++cand)
00680 {
00681 theTrackBuildingAnalyzer->analyze(iEvent, iSetup, *cand, bs, theMF, theTTRHBuilder);
00682 }
00683 }
00684 else
00685 {
00686 edm::LogWarning("TrackingMonitor") << "No Track Candidates in the event. Not filling associated histograms";
00687 }
00688 }
00689
00690
00691
00692 if (doAllSeedPlots || doSeedNumberPlot || doSeedVsClusterPlot || runTrackBuildingAnalyzerForSeed){
00693
00694
00695 edm::Handle<edm::View<TrajectorySeed> > seedHandle;
00696 iEvent.getByLabel(seedProducer, seedHandle);
00697 const edm::View<TrajectorySeed>& seedCollection = *seedHandle;
00698
00699
00700 if (seedHandle.isValid())
00701 {
00702 if(doAllSeedPlots || doSeedNumberPlot) NumberOfSeeds->Fill(seedCollection.size());
00703
00704 if(doAllSeedPlots || doSeedVsClusterPlot){
00705
00706 std::vector<int> NClus;
00707 setNclus(iEvent,NClus);
00708 for (uint i=0; i< ClusterLabels.size(); i++){
00709 SeedsVsClusters[i]->Fill(NClus[i],seedCollection.size());
00710 }
00711 }
00712
00713 if (doAllSeedPlots || runTrackBuildingAnalyzerForSeed){
00714
00715
00716
00717 edm::ESHandle<MagneticField> theMF;
00718 iSetup.get<IdealMagneticFieldRecord>().get(theMF);
00719
00720
00721 edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00722 iEvent.getByLabel(bsSrc,recoBeamSpotHandle);
00723 const reco::BeamSpot& bs = *recoBeamSpotHandle;
00724
00725 iSetup.get<TransientRecHitRecord>().get(builderName,theTTRHBuilder);
00726 for(size_t i=0; i < seedHandle->size(); ++i)
00727 {
00728 edm::RefToBase<TrajectorySeed> seed(seedHandle, i);
00729 theTrackBuildingAnalyzer->analyze(iEvent, iSetup, *seed, bs, theMF, theTTRHBuilder);
00730 }
00731 }
00732
00733 }
00734 else
00735 {
00736 edm::LogWarning("TrackingMonitor") << "No Trajectory seeds in the event. Not filling associated histograms";
00737 }
00738 }
00739
00740
00741 if (doTrackerSpecific_ || doAllPlots)
00742 {
00743 std::vector<int> NClus;
00744 setNclus(iEvent,NClus);
00745 for (uint i=0; i< ClusterLabels.size(); i++){
00746 NumberOfTrkVsClusters[i]->Fill(NClus[i],totalNumTracks);
00747 }
00748 if ( doGoodTrackPlots_ || doAllPlots ) {
00749 for (uint i=0; i< ClusterLabels.size(); i++){
00750 if(ClusterLabels[i].compare("Tot")==0){
00751 NumberOfGoodTrkVsClus->Fill( NClus[i],totalNumHPPt1Tracks);
00752 }
00753 }
00754 }
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779 }
00780
00781 if ( doPUmonitoring_ ) {
00782
00783
00784 for (size_t i=0; i<theVertexMonitor.size(); i++)
00785 theVertexMonitor[i]->analyze(iEvent, iSetup);
00786
00787 if ( doPlotsVsGoodPVtx_ ) {
00788
00789 edm::InputTag primaryVertexInputTag = conf_.getParameter<edm::InputTag>("primaryVertex");
00790
00791 size_t totalNumGoodPV = 0;
00792 edm::Handle< reco::VertexCollection > pvHandle;
00793 iEvent.getByLabel(primaryVertexInputTag, pvHandle );
00794 if (pvHandle.isValid())
00795 {
00796
00797 for (reco::VertexCollection::const_iterator pv = pvHandle->begin();
00798 pv != pvHandle->end(); ++pv) {
00799
00800
00801 if (pv->isFake() || pv->tracksSize()==0) continue;
00802
00803
00804 if (pv->ndof() < 4. || pv->z() > 24.) continue;
00805 totalNumGoodPV++;
00806 }
00807
00808 NumberOfTracksVsGoodPVtx -> Fill( totalNumGoodPV, totalNumTracks );
00809 NumberOfGoodTracksVsGoodPVtx -> Fill( totalNumGoodPV, totalNumHPPt1Tracks );
00810 FractionOfGoodTracksVsGoodPVtx -> Fill( totalNumGoodPV, frac );
00811 }
00812 }
00813
00814 if ( doPlotsVsBXlumi_ ) {
00815
00816 double bxlumi = theLumiDetails_->getValue(iEvent);
00817
00818 NumberOfTracksVsBXlumi -> Fill( bxlumi, totalNumTracks );
00819 NumberOfGoodTracksVsBXlumi -> Fill( bxlumi, totalNumHPPt1Tracks );
00820 FractionOfGoodTracksVsBXlumi -> Fill( bxlumi, frac );
00821 }
00822
00823 }
00824
00825 }
00826
00827 }
00828
00829
00830 void TrackingMonitor::endRun(const edm::Run&, const edm::EventSetup&)
00831 {
00832 if (doLumiAnalysis) {
00833
00834
00835
00836
00837
00838
00839 }
00840
00841 }
00842
00843 void TrackingMonitor::endJob(void)
00844 {
00845 bool outputMEsInRootFile = conf_.getParameter<bool>("OutputMEsInRootFile");
00846 std::string outputFileName = conf_.getParameter<std::string>("OutputFileName");
00847 if(outputMEsInRootFile)
00848 {
00849 dqmStore_->showDirStructure();
00850 dqmStore_->save(outputFileName);
00851 }
00852 }
00853
00854 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)
00855 {
00856 arrayMin.resize(ClusterLabels.size());
00857 arrayMax.resize(ClusterLabels.size());
00858 arrayBin.resize(ClusterLabels.size());
00859
00860 for (uint i=0; i<ClusterLabels.size(); ++i){
00861
00862 if (ClusterLabels[i].compare("Pix")==0) {arrayMin[i]=pmin; arrayMax[i]=pmax; arrayBin[i]=pbin;}
00863 else if(ClusterLabels[i].compare("Strip")==0){arrayMin[i]=smin; arrayMax[i]=smax; arrayBin[i]=sbin;}
00864 else if(ClusterLabels[i].compare("Tot")==0){arrayMin[i]=smin; arrayMax[i]=smax+pmax; arrayBin[i]=sbin;}
00865 else {edm::LogWarning("TrackingMonitor") << "Cluster Label " << ClusterLabels[i] << " not defined, using strip parameters ";
00866 arrayMin[i]=smin; arrayMax[i]=smax; arrayBin[i]=sbin;}
00867
00868 }
00869
00870 }
00871
00872 void TrackingMonitor::setNclus(const edm::Event& iEvent,std::vector<int> &arrayNclus)
00873 {
00874
00875 int ncluster_pix=-1;
00876 int ncluster_strip=-1;
00877
00878 edm::Handle< edmNew::DetSetVector<SiStripCluster> > strip_clusters;
00879 iEvent.getByLabel("siStripClusters", strip_clusters);
00880 edm::Handle< edmNew::DetSetVector<SiPixelCluster> > pixel_clusters;
00881 iEvent.getByLabel("siPixelClusters", pixel_clusters);
00882
00883 if (strip_clusters.isValid() && pixel_clusters.isValid())
00884 {
00885 ncluster_pix = (*pixel_clusters).dataSize();
00886 ncluster_strip = (*strip_clusters).dataSize();
00887 }
00888
00889 arrayNclus.resize(ClusterLabels.size());
00890 for (uint i=0; i<ClusterLabels.size(); ++i){
00891
00892 if (ClusterLabels[i].compare("Pix")==0) arrayNclus[i]=ncluster_pix ;
00893 else if(ClusterLabels[i].compare("Strip")==0) arrayNclus[i]=ncluster_strip;
00894 else if(ClusterLabels[i].compare("Tot")==0)arrayNclus[i]=ncluster_pix+ncluster_strip;
00895 else {edm::LogWarning("TrackingMonitor") << "Cluster Label " << ClusterLabels[i] << " not defined using stri parametrs ";
00896 arrayNclus[i]=ncluster_strip ;}
00897 }
00898
00899 }
00900 DEFINE_FWK_MODULE(TrackingMonitor);