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/plugins/TrackingMonitor.h"
00025
00026 #include "FWCore/Framework/interface/ESHandle.h"
00027 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00028
00029 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00030 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00031 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
00032 #include "TrackingTools/PatternTools/interface/TSCPBuilderNoMaterial.h"
00033 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00034 #include "CommonTools/TriggerUtils/interface/GenericTriggerEventFlag.h"
00035 #include "DataFormats/Common/interface/DetSetVectorNew.h"
00036 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
00037 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
00038 #include <string>
00039
00040
00041
00042
00043 TrackingMonitor::TrackingMonitor(const edm::ParameterSet& iConfig)
00044 : dqmStore_( edm::Service<DQMStore>().operator->() )
00045 , conf_ ( iConfig )
00046 , theTrackAnalyzer( new TrackAnalyzer(conf_) )
00047 , theTrackBuildingAnalyzer( new TrackBuildingAnalyzer(conf_) )
00048 , NumberOfTracks(NULL)
00049 , NumberOfMeanRecHitsPerTrack(NULL)
00050 , NumberOfMeanLayersPerTrack(NULL)
00051 , NumberOfGoodTracks(NULL)
00052 , FractionOfGoodTracks(NULL)
00053 , NumberOfSeeds(NULL)
00054 , NumberOfTrackCandidates(NULL)
00055 , builderName( conf_.getParameter<std::string>("TTRHBuilder"))
00056 , doTrackerSpecific_( conf_.getParameter<bool>("doTrackerSpecific") )
00057 , doLumiAnalysis( conf_.getParameter<bool>("doLumiAnalysis"))
00058 , genTriggerEventFlag_(new GenericTriggerEventFlag(iConfig))
00059 {
00060 }
00061
00062
00063 TrackingMonitor::~TrackingMonitor()
00064 {
00065 if (theTrackAnalyzer) delete theTrackAnalyzer;
00066 if (theTrackBuildingAnalyzer) delete theTrackBuildingAnalyzer;
00067 if (genTriggerEventFlag_) delete genTriggerEventFlag_;
00068 }
00069
00070
00071 void TrackingMonitor::beginJob(void)
00072 {
00073
00074
00075 std::string Quality = conf_.getParameter<std::string>("Quality");
00076 std::string AlgoName = conf_.getParameter<std::string>("AlgoName");
00077 std::string MEFolderName = conf_.getParameter<std::string>("FolderName");
00078
00079
00080 if( Quality != "")
00081 {
00082 if( Quality != "highPurity" && Quality != "tight" && Quality != "loose")
00083 {
00084 edm::LogWarning("TrackingMonitor") << "Qualty Name is invalid, using no quality criterea by default";
00085 Quality = "";
00086 }
00087 }
00088
00089
00090 std::string CatagoryName = Quality != "" ? AlgoName + "_" + Quality : AlgoName;
00091
00092
00093 int TKNoBin = conf_.getParameter<int>( "TkSizeBin");
00094 double TKNoMin = conf_.getParameter<double>("TkSizeMin");
00095 double TKNoMax = conf_.getParameter<double>("TkSizeMax");
00096
00097 int TCNoBin = conf_.getParameter<int>( "TCSizeBin");
00098 double TCNoMin = conf_.getParameter<double>("TCSizeMin");
00099 double TCNoMax = conf_.getParameter<double>("TCSizeMax");
00100
00101 int TKNoSeedBin = conf_.getParameter<int>( "TkSeedSizeBin");
00102 double TKNoSeedMin = conf_.getParameter<double>("TkSeedSizeMin");
00103 double TKNoSeedMax = conf_.getParameter<double>("TkSeedSizeMax");
00104
00105 int MeanHitBin = conf_.getParameter<int>( "MeanHitBin");
00106 double MeanHitMin = conf_.getParameter<double>("MeanHitMin");
00107 double MeanHitMax = conf_.getParameter<double>("MeanHitMax");
00108
00109 int MeanLayBin = conf_.getParameter<int>( "MeanLayBin");
00110 double MeanLayMin = conf_.getParameter<double>("MeanLayMin");
00111 double MeanLayMax = conf_.getParameter<double>("MeanLayMax");
00112
00113 std::string StateName = conf_.getParameter<std::string>("MeasurementState");
00114 if
00115 (
00116 StateName != "OuterSurface" &&
00117 StateName != "InnerSurface" &&
00118 StateName != "ImpactPoint" &&
00119 StateName != "default" &&
00120 StateName != "All"
00121 )
00122 {
00123
00124 edm::LogWarning("TrackingMonitor") << "State Name is invalid, using 'ImpactPoint' by default";
00125 }
00126
00127 dqmStore_->setCurrentFolder(MEFolderName);
00128
00129
00130
00131 dqmStore_->setCurrentFolder(MEFolderName+"/GeneralProperties");
00132
00133 histname = "NumberOfTracks_" + CatagoryName;
00134 NumberOfTracks = dqmStore_->book1D(histname, histname, TKNoBin, TKNoMin, TKNoMax);
00135 NumberOfTracks->setAxisTitle("Number of Tracks per Event", 1);
00136 NumberOfTracks->setAxisTitle("Number of Events", 2);
00137
00138 histname = "NumberOfMeanRecHitsPerTrack_" + CatagoryName;
00139 NumberOfMeanRecHitsPerTrack = dqmStore_->book1D(histname, histname, MeanHitBin, MeanHitMin, MeanHitMax);
00140 NumberOfMeanRecHitsPerTrack->setAxisTitle("Mean number of RecHits per Track", 1);
00141 NumberOfMeanRecHitsPerTrack->setAxisTitle("Entries", 2);
00142
00143 histname = "NumberOfMeanLayersPerTrack_" + CatagoryName;
00144 NumberOfMeanLayersPerTrack = dqmStore_->book1D(histname, histname, MeanLayBin, MeanLayMin, MeanLayMax);
00145 NumberOfMeanLayersPerTrack->setAxisTitle("Mean number of Layers per Track", 1);
00146 NumberOfMeanLayersPerTrack->setAxisTitle("Entries", 2);
00147
00148 histname = "NumberOfGoodTracks_" + CatagoryName;
00149 NumberOfGoodTracks = dqmStore_->book1D(histname, histname, TKNoBin, TKNoMin, TKNoMax);
00150 NumberOfGoodTracks->setAxisTitle("Number of Good Tracks per Event", 1);
00151 NumberOfGoodTracks->setAxisTitle("Number of Events", 2);
00152
00153 histname = "FractionOfGoodTracks_" + CatagoryName;
00154 FractionOfGoodTracks = dqmStore_->book1D(histname, histname, 101, -0.005, 1.005);
00155 FractionOfGoodTracks->setAxisTitle("Fraction of High Purity Tracks (Tracks with Pt>1GeV)", 1);
00156 FractionOfGoodTracks->setAxisTitle("Entries", 2);
00157
00158 theTrackAnalyzer->beginJob(dqmStore_);
00159
00160
00161
00162 if (conf_.getParameter<bool>("doSeedParameterHistos"))
00163 {
00164 dqmStore_->setCurrentFolder(MEFolderName+"/TrackBuilding");
00165
00166 histname = "NumberOfSeeds_" + CatagoryName;
00167 NumberOfSeeds = dqmStore_->book1D(histname, histname, TKNoSeedBin, TKNoSeedMin, TKNoSeedMax);
00168 NumberOfSeeds->setAxisTitle("Number of Seeds per Event", 1);
00169 NumberOfSeeds->setAxisTitle("Number of Events", 2);
00170
00171 histname = "NumberOfTrackCandidates_" + CatagoryName;
00172 NumberOfTrackCandidates = dqmStore_->book1D(histname, histname, TCNoBin, TCNoMin, TCNoMax);
00173 NumberOfTrackCandidates->setAxisTitle("Number of Track Candidates per Event", 1);
00174 NumberOfTrackCandidates->setAxisTitle("Number of Event", 2);
00175
00176 theTrackBuildingAnalyzer->beginJob(dqmStore_);
00177 }
00178 if (doLumiAnalysis) {
00179 if (NumberOfTracks) NumberOfTracks->setLumiFlag();
00180 if (NumberOfGoodTracks) NumberOfGoodTracks->setLumiFlag();
00181 if (FractionOfGoodTracks) FractionOfGoodTracks->setLumiFlag();
00182 theTrackAnalyzer->setLumiFlag();
00183 }
00184 if (doTrackerSpecific_) {
00185 int NClusPxBin = conf_.getParameter<int>( "NClusPxBin");
00186 double NClusPxMin = conf_.getParameter<double>("NClusPxMin");
00187 double NClusPxMax = conf_.getParameter<double>("NClusPxMax");
00188
00189
00190 int NClusStrBin = conf_.getParameter<int>( "NClusStrBin");
00191 double NClusStrMin = conf_.getParameter<double>("NClusStrMin");
00192 double NClusStrMax = conf_.getParameter<double>("NClusStrMax");
00193
00194 int NClus2DStrBin = conf_.getParameter<int>( "NClus2DStrBin");
00195 double NClus2DStrMin = conf_.getParameter<double>("NClus2DStrMin");
00196 double NClus2DStrMax = conf_.getParameter<double>("NClus2DStrMax");
00197 int NClus2DPxBin = conf_.getParameter<int>( "NClus2DPxBin");
00198 double NClus2DPxMin = conf_.getParameter<double>("NClus2DPxMin");
00199 double NClus2DPxMax = conf_.getParameter<double>("NClus2DPxMax");
00200
00201 int NClus2DTotBin = conf_.getParameter<int>( "NClus2DTotBin");
00202 double NClus2DTotMin = conf_.getParameter<double>("NClus2DTotMin");
00203 double NClus2DTotMax = conf_.getParameter<double>("NClus2DTotMax");
00204 int NTrk2DBin = conf_.getParameter<int>( "NTrk2DBin");
00205 double NTrk2DMin = conf_.getParameter<double>("NTrk2DMin");
00206 double NTrk2DMax = conf_.getParameter<double>("NTrk2DMax");
00207
00208 dqmStore_->setCurrentFolder(MEFolderName+"/HitProperties");
00209 histname = "NumberOfClustersInPixel_" + CatagoryName;
00210 NumberOfPixelClus = dqmStore_->book1D(histname, histname, NClusPxBin, NClusPxMin, NClusPxMax);
00211 NumberOfPixelClus->setAxisTitle("# of Clusters in Pixel", 1);
00212 NumberOfPixelClus->setAxisTitle("Number of Events", 2);
00213
00214 histname = "NumberOfClustersInStrip_" + CatagoryName;
00215 NumberOfStripClus = dqmStore_->book1D(histname, histname, NClusStrBin, NClusStrMin, NClusStrMax);
00216 NumberOfStripClus->setAxisTitle("# of Clusters in Strip Detectors", 1);
00217 NumberOfStripClus->setAxisTitle("Number of Events", 2);
00218
00219 histname = "PixelClustersVsStripClusters_" + CatagoryName;
00220 NumberOfStripVsStripClus = dqmStore_->book2D(histname, histname, NClus2DStrBin, NClus2DStrMin, NClus2DStrMax,
00221 NClus2DPxBin, NClus2DPxMin, NClus2DPxMax);
00222 NumberOfStripVsStripClus->setAxisTitle("# of Clusters in Strip Detectors", 1);
00223 NumberOfStripVsStripClus->setAxisTitle("# of Clusters in Pixel Detectors", 2);
00224
00225 histname = "RatioOfPixelAndStripClusters_" + CatagoryName;
00226 RatioOfPixelAndStripClus = dqmStore_->book1D(histname, histname, 100, 0.0, 1.6);
00227 RatioOfPixelAndStripClus->setAxisTitle("ArcTan(PixelCluster/StripClusters)", 1);
00228 RatioOfPixelAndStripClus->setAxisTitle("Number of Events", 2);
00229
00230 histname = "TracksVsClusters_" + CatagoryName;
00231 NumberOfTrkVsClus = dqmStore_->book2D(histname,histname,NTrk2DBin,NTrk2DMin,NTrk2DMax,
00232 NClus2DTotBin,NClus2DTotMin,NClus2DTotMax);
00233 NumberOfTrkVsClus->setAxisTitle("Number of Tracks", 1);
00234 NumberOfTrkVsClus->setAxisTitle("# of Clusters in (Pixel+Strip) Detectors", 2);
00235
00236 }
00237
00238
00239 }
00240
00241
00242
00243 void TrackingMonitor::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
00244 {
00245
00246 if ( genTriggerEventFlag_->on() ) genTriggerEventFlag_->initRun( iRun, iSetup );
00247 }
00248
00249
00250
00251 void TrackingMonitor::beginLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& eSetup) {
00252 if (doLumiAnalysis) {
00253 dqmStore_->softReset(NumberOfTracks);
00254 dqmStore_->softReset(NumberOfGoodTracks);
00255 dqmStore_->softReset(FractionOfGoodTracks);
00256 theTrackAnalyzer->doSoftReset(dqmStore_);
00257 }
00258 }
00259
00260
00261
00262 void TrackingMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00263 {
00264
00265 if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( iEvent, iSetup) ) return;
00266
00267
00268 edm::InputTag trackProducer = conf_.getParameter<edm::InputTag>("TrackProducer");
00269 edm::InputTag seedProducer = conf_.getParameter<edm::InputTag>("SeedProducer");
00270 edm::InputTag tcProducer = conf_.getParameter<edm::InputTag>("TCProducer");
00271 edm::InputTag bsSrc = conf_.getParameter<edm::InputTag>("beamSpot");
00272 std::string Quality = conf_.getParameter<std::string>("Quality");
00273 std::string Algo = conf_.getParameter<std::string>("AlgoName");
00274
00275
00276
00277
00278
00279
00280 edm::Handle<reco::TrackCollection> trackHandle;
00281 iEvent.getByLabel(trackProducer, trackHandle);
00282
00283 if (trackHandle.isValid())
00284 {
00285
00286 reco::TrackCollection trackCollection = *trackHandle;
00287
00288 int totalNumTracks = 0, totalRecHits = 0, totalLayers = 0;
00289 int totalNumHPTracks = 0, totalNumPt1Tracks = 0, totalNumHPPt1Tracks = 0;
00290
00291 for (reco::TrackCollection::const_iterator track = trackCollection.begin(); track!=trackCollection.end(); ++track)
00292 {
00293
00294 if( track->quality(reco::TrackBase::highPurity) ) {
00295 ++totalNumHPTracks;
00296 if ( track->pt() >= 1. ) ++totalNumHPPt1Tracks;
00297 }
00298
00299 if ( track->pt() >= 1. ) ++totalNumPt1Tracks;
00300
00301
00302 if( Quality == "highPurity")
00303 {
00304 if( !track->quality(reco::TrackBase::highPurity) ) continue;
00305 }
00306 else if( Quality == "tight")
00307 {
00308 if( !track->quality(reco::TrackBase::tight) ) continue;
00309 }
00310 else if( Quality == "loose")
00311 {
00312 if( !track->quality(reco::TrackBase::loose) ) continue;
00313 }
00314
00315 totalNumTracks++;
00316 totalRecHits += track->found();
00317 totalLayers += track->hitPattern().trackerLayersWithMeasurement();
00318
00319
00320 theTrackAnalyzer->analyze(iEvent, iSetup, *track);
00321 }
00322
00323 NumberOfTracks->Fill(totalNumTracks);
00324 NumberOfGoodTracks->Fill(totalNumHPPt1Tracks);
00325
00326 double frac = 0.;
00327 if (totalNumPt1Tracks > 0) frac = static_cast<double>(totalNumHPPt1Tracks)/static_cast<double>(totalNumPt1Tracks);
00328 FractionOfGoodTracks->Fill(frac);
00329
00330 if( totalNumTracks > 0 )
00331 {
00332 double meanRecHits = static_cast<double>(totalRecHits) / static_cast<double>(totalNumTracks);
00333 double meanLayers = static_cast<double>(totalLayers) / static_cast<double>(totalNumTracks);
00334 NumberOfMeanRecHitsPerTrack->Fill(meanRecHits);
00335 NumberOfMeanLayersPerTrack->Fill(meanLayers);
00336 }
00337
00338
00339
00340
00341
00342
00343 if (conf_.getParameter<bool>("doSeedParameterHistos"))
00344 {
00345
00346
00347 edm::ESHandle<MagneticField> theMF;
00348 iSetup.get<IdealMagneticFieldRecord>().get(theMF);
00349
00350
00351 edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00352 iEvent.getByLabel(bsSrc,recoBeamSpotHandle);
00353 const reco::BeamSpot& bs = *recoBeamSpotHandle;
00354
00355
00356 edm::Handle<TrackCandidateCollection> theTCHandle;
00357 iEvent.getByLabel(tcProducer, theTCHandle );
00358 const TrackCandidateCollection& theTCCollection = *theTCHandle;
00359
00360
00361 if (theTCHandle.isValid())
00362 {
00363 NumberOfTrackCandidates->Fill(theTCCollection.size());
00364 iSetup.get<TransientRecHitRecord>().get(builderName,theTTRHBuilder);
00365 for( TrackCandidateCollection::const_iterator cand = theTCCollection.begin(); cand != theTCCollection.end(); ++cand)
00366 {
00367 theTrackBuildingAnalyzer->analyze(iEvent, iSetup, *cand, bs, theMF, theTTRHBuilder);
00368 }
00369 }
00370 else
00371 {
00372 edm::LogWarning("TrackingMonitor") << "No Track Candidates in the event. Not filling associated histograms";
00373 }
00374
00375
00376 edm::Handle<edm::View<TrajectorySeed> > seedHandle;
00377 iEvent.getByLabel(seedProducer, seedHandle);
00378 const edm::View<TrajectorySeed>& seedCollection = *seedHandle;
00379
00380
00381 if (seedHandle.isValid())
00382 {
00383 NumberOfSeeds->Fill(seedCollection.size());
00384
00385 iSetup.get<TransientRecHitRecord>().get(builderName,theTTRHBuilder);
00386 for(size_t i=0; i < seedHandle->size(); ++i)
00387 {
00388 edm::RefToBase<TrajectorySeed> seed(seedHandle, i);
00389 theTrackBuildingAnalyzer->analyze(iEvent, iSetup, *seed, bs, theMF, theTTRHBuilder);
00390 }
00391 }
00392 else
00393 {
00394 edm::LogWarning("TrackingMonitor") << "No Trajectory seeds in the event. Not filling associated histograms";
00395 }
00396 }
00397 if ( doTrackerSpecific_)
00398 {
00399 edm::Handle< edmNew::DetSetVector<SiStripCluster> > strip_clusters;
00400 iEvent.getByLabel("siStripClusters", strip_clusters);
00401 edm::Handle< edmNew::DetSetVector<SiPixelCluster> > pixel_clusters;
00402 iEvent.getByLabel("siPixelClusters", pixel_clusters);
00403 if (strip_clusters.isValid() && pixel_clusters.isValid())
00404 {
00405 unsigned int ncluster_pix = (*pixel_clusters).dataSize();
00406 unsigned int ncluster_strip = (*strip_clusters).dataSize();
00407 double ratio = 0.0;
00408 if ( ncluster_pix > 0) ratio = atan(ncluster_pix*1.0/ncluster_strip);
00409
00410 NumberOfStripClus->Fill(ncluster_strip);
00411 NumberOfPixelClus->Fill(ncluster_pix);
00412 NumberOfStripVsStripClus->Fill(ncluster_strip,ncluster_pix);
00413 RatioOfPixelAndStripClus->Fill(ratio);
00414 NumberOfTrkVsClus->Fill(totalNumTracks, ncluster_strip+ncluster_pix);
00415 }
00416 }
00417
00418 }
00419 else
00420 {
00421 return;
00422 }
00423 }
00424 void TrackingMonitor::endRun(const edm::Run&, const edm::EventSetup&)
00425 {
00426 if (doLumiAnalysis) {
00427 dqmStore_->disableSoftReset(NumberOfTracks);
00428 dqmStore_->disableSoftReset(NumberOfGoodTracks);
00429 dqmStore_->disableSoftReset(FractionOfGoodTracks);
00430 theTrackAnalyzer->undoSoftReset(dqmStore_);
00431 }
00432
00433 }
00434
00435 void TrackingMonitor::endJob(void)
00436 {
00437 bool outputMEsInRootFile = conf_.getParameter<bool>("OutputMEsInRootFile");
00438 std::string outputFileName = conf_.getParameter<std::string>("OutputFileName");
00439 if(outputMEsInRootFile)
00440 {
00441 dqmStore_->showDirStructure();
00442 dqmStore_->save(outputFileName);
00443 }
00444 }
00445
00446 DEFINE_FWK_MODULE(TrackingMonitor);