CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/DQM/TrackingMonitor/plugins/TrackingMonitor.cc

Go to the documentation of this file.
00001 /*
00002  *  See header file for a description of this class.
00003  *
00004  *  $Date: 2010/11/26 10:45:09 $
00005  *  $Revision: 1.20 $
00006  *  \author Suchandra Dutta , Giorgia Mila
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 // TrackingMonitor 
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     // parameters from the configuration
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     // test for the Quality veriable validity
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     // use the AlgoName and Quality Name
00090     std::string CatagoryName = Quality != "" ? AlgoName + "_" + Quality : AlgoName;
00091 
00092     // get binning from the configuration
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         // print warning
00124         edm::LogWarning("TrackingMonitor")  << "State Name is invalid, using 'ImpactPoint' by default";
00125     }
00126 
00127     dqmStore_->setCurrentFolder(MEFolderName);
00128 
00129     // book the General Property histograms
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     // book the Seed Property histograms
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 // -- BeginRun
00242 //---------------------------------------------------------------------------------//
00243 void TrackingMonitor::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
00244 {
00245   // Initialize the GenericTriggerEventFlag
00246   if ( genTriggerEventFlag_->on() ) genTriggerEventFlag_->initRun( iRun, iSetup );
00247 }
00248 
00249 // - BeginLumi
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 // -- Analyse
00261 // ---------------------------------------------------------------------------------//
00262 void TrackingMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) 
00263 {
00264     // Filter out events if Trigger Filtering is requested
00265     if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( iEvent, iSetup) ) return;
00266 
00267     // input tags for collections from the configuration
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     //  Analyse the tracks
00276     //  if the collection is empty, do not fill anything
00277     // ---------------------------------------------------------------------------------//
00278 
00279     // get the track collection
00280     edm::Handle<reco::TrackCollection> trackHandle;
00281     iEvent.getByLabel(trackProducer, trackHandle);
00282 
00283     if (trackHandle.isValid()) 
00284     {
00285 
00286        reco::TrackCollection trackCollection = *trackHandle;
00287         // calculate the mean # rechits and layers
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             // do analysis per track
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         //  Analyse the Track Building variables 
00340         //  if the collection is empty, do not fill anything
00341         // ---------------------------------------------------------------------------------//
00342         
00343         if (conf_.getParameter<bool>("doSeedParameterHistos")) 
00344           {
00345             
00346             // magnetic field
00347             edm::ESHandle<MagneticField> theMF;
00348             iSetup.get<IdealMagneticFieldRecord>().get(theMF);  
00349             
00350             // get the beam spot
00351             edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00352             iEvent.getByLabel(bsSrc,recoBeamSpotHandle);
00353             const reco::BeamSpot& bs = *recoBeamSpotHandle;      
00354             
00355             // get the candidate collection
00356             edm::Handle<TrackCandidateCollection> theTCHandle;
00357             iEvent.getByLabel(tcProducer, theTCHandle ); 
00358             const TrackCandidateCollection& theTCCollection = *theTCHandle;
00359             
00360             // fill the TrackCandidate info
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             // get the seed collection
00376             edm::Handle<edm::View<TrajectorySeed> > seedHandle;
00377             iEvent.getByLabel(seedProducer, seedHandle);
00378             const edm::View<TrajectorySeed>& seedCollection = *seedHandle;
00379             
00380             // fill the seed info
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);