CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/DQMOffline/Muon/src/DiMuonHistograms.cc

Go to the documentation of this file.
00001 /* This Class Header */
00002 #include "DQMOffline/Muon/src/DiMuonHistograms.h"
00003 
00004 /* Collaborating Class Header */
00005 #include "FWCore/Framework/interface/MakerMacros.h"
00006 #include "FWCore/Framework/interface/Frameworkfwd.h"
00007 #include "FWCore/Framework/interface/Event.h"
00008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00009 #include "FWCore/Framework/interface/ESHandle.h"
00010 #include "FWCore/Utilities/interface/Exception.h"
00011 #include "DataFormats/MuonReco/interface/Muon.h"
00012 #include "DataFormats/MuonReco/interface/MuonFwd.h" 
00013 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00014 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00015 #include "DataFormats/VertexReco/interface/Vertex.h"
00016 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00017 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
00018 
00019 
00020 using namespace edm;
00021 
00022 #include "TLorentzVector.h"
00023 #include "TFile.h"
00024 #include <vector>
00025 #include "math.h"
00026 
00027 
00028 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00029 #include "RecoMuon/TrackingTools/interface/MuonPatternRecoDumper.h"
00030 
00031 
00032 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00033 #include "DataFormats/TrackReco/interface/Track.h"
00034 
00035 /* C++ Headers */
00036 #include <iostream>
00037 #include <fstream>
00038 #include <cmath>
00039 using namespace std;
00040 using namespace edm;
00041 
00042 DiMuonHistograms::DiMuonHistograms(const edm::ParameterSet& pSet, MuonServiceProxy *theService):MuonAnalyzerBase(theService){ 
00043   parameters = pSet;
00044 }
00045 
00046 DiMuonHistograms::~DiMuonHistograms() { }
00047 
00048 void DiMuonHistograms::beginJob(DQMStore * dbe) {
00049   
00050   metname = "DiMuonhistograms";
00051   LogTrace(metname)<<"[DiMuonHistograms] Parameters initialization";
00052   dbe->setCurrentFolder("Muons/DiMuonHistograms");  
00053 
00054   theMuonCollectionLabel = parameters.getParameter<edm::InputTag>("MuonCollection");
00055   bsTag  = parameters.getParameter<edm::InputTag>("bsLabel");
00056   vertexTag  = parameters.getParameter<edm::InputTag>("vertexLabel");
00057 
00058   etaBin = parameters.getParameter<int>("etaBin");
00059   etaBBin = parameters.getParameter<int>("etaBBin");
00060   etaEBin = parameters.getParameter<int>("etaEBin");
00061   
00062   etaBMin = parameters.getParameter<double>("etaBMin");
00063   etaBMax = parameters.getParameter<double>("etaBMax");
00064   etaECMin = parameters.getParameter<double>("etaECMin");
00065   etaECMax = parameters.getParameter<double>("etaECMax");
00066   
00067   LowMassMin = parameters.getParameter<double>("LowMassMin");  
00068   LowMassMax = parameters.getParameter<double>("LowMassMax");
00069   HighMassMin = parameters.getParameter<double>("HighMassMin");
00070   HighMassMax = parameters.getParameter<double>("HighMassMax");
00071 
00072   int nBin = 0;
00073   for (unsigned int iEtaRegion=0; iEtaRegion<3; iEtaRegion++){
00074     if (iEtaRegion==0) { EtaName = "";         nBin = etaBin;} 
00075     if (iEtaRegion==1) { EtaName = "_Barrel";  nBin = etaBBin;}
00076     if (iEtaRegion==2) { EtaName = "_EndCap";  nBin = etaEBin;}
00077     
00078     GlbGlbMuon_LM.push_back(dbe->book1D("GlbGlbMuon_LM"+EtaName,"InvMass_{GLB,GLB}"+EtaName,nBin, LowMassMin, LowMassMax));
00079     TrkTrkMuon_LM.push_back(dbe->book1D("TrkTrkMuon_LM"+EtaName,"InvMass_{TRK,TRK}"+EtaName,nBin, LowMassMin, LowMassMax));
00080     StaTrkMuon_LM.push_back(dbe->book1D("StaTrkMuon_LM"+EtaName,"InvMass_{STA,TRK}"+EtaName,nBin, LowMassMin, LowMassMax));
00081     
00082     GlbGlbMuon_HM.push_back(dbe->book1D("GlbGlbMuon_HM"+EtaName,"InvMass_{GLB,GLB}"+EtaName,nBin, HighMassMin, HighMassMax));
00083     TrkTrkMuon_HM.push_back(dbe->book1D("TrkTrkMuon_HM"+EtaName,"InvMass_{TRK,TRK}"+EtaName,nBin, HighMassMin, HighMassMax));
00084     StaTrkMuon_HM.push_back(dbe->book1D("StaTrkMuon_HM"+EtaName,"InvMass_{STA,TRK}"+EtaName,nBin, HighMassMin, HighMassMax));
00085     
00086     // arround the Z peak
00087     TightTightMuon.push_back(dbe->book1D("TightTightMuon"+EtaName,"InvMass_{Tight,Tight}"+EtaName,nBin, 55.0, 125.0));
00088 
00089     // low-mass resonances
00090     SoftSoftMuon.push_back(dbe->book1D("SoftSoftMuon"+EtaName,"InvMass_{Soft,Soft}"+EtaName,nBin, 5.0, 55.0));
00091   }
00092 }
00093 void DiMuonHistograms::analyze(const edm::Event & iEvent,const edm::EventSetup& iSetup) {
00094 
00095 
00096   // ==========================================================
00097   // Look for the Primary Vertex (and use the BeamSpot instead, if you can't find it):
00098 
00099   reco::Vertex::Point posVtx;
00100   reco::Vertex::Error errVtx;
00101  
00102   unsigned int theIndexOfThePrimaryVertex = 999.;
00103  
00104   edm::Handle<reco::VertexCollection> vertex;
00105   iEvent.getByLabel(vertexTag, vertex);
00106 
00107  if ( vertex.isValid() ){
00108   for (unsigned int ind=0; ind<vertex->size(); ++ind) {
00109     if ( (*vertex)[ind].isValid() && !((*vertex)[ind].isFake()) ) {
00110       theIndexOfThePrimaryVertex = ind;
00111       break;
00112     }
00113   }
00114  }
00115   if (theIndexOfThePrimaryVertex<100) {
00116     posVtx = ((*vertex)[theIndexOfThePrimaryVertex]).position();
00117     errVtx = ((*vertex)[theIndexOfThePrimaryVertex]).error();
00118   }   else {
00119     LogInfo("RecoMuonValidator") << "reco::PrimaryVertex not found, use BeamSpot position instead\n";
00120   
00121     edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00122     iEvent.getByLabel(bsTag,recoBeamSpotHandle);
00123     
00124     reco::BeamSpot bs = *recoBeamSpotHandle;
00125     
00126     posVtx = bs.position();
00127     errVtx(0,0) = bs.BeamWidthX();
00128     errVtx(1,1) = bs.BeamWidthY();
00129     errVtx(2,2) = bs.sigmaZ();
00130   }
00131   const reco::Vertex thePrimaryVertex(posVtx,errVtx);
00132   // ==========================================================
00133 
00134 
00135 
00136 
00137   LogTrace(metname)<<"[DiMuonHistograms] Analyze the mu in different eta regions";
00138   edm::Handle<reco::MuonCollection> muons;
00139   iEvent.getByLabel(theMuonCollectionLabel, muons);
00140 
00141   reco::BeamSpot beamSpot;
00142   Handle<reco::BeamSpot> beamSpotHandle;
00143   iEvent.getByLabel("offlineBeamSpot", beamSpotHandle);
00144   beamSpot = *beamSpotHandle;
00145 
00146   if(!muons.isValid()) return;
00147 
00148   // Loop on muon collection
00149   TLorentzVector Mu1, Mu2;
00150   float charge = 99.;
00151   float InvMass = -99.;
00152 
00153   for (reco::MuonCollection::const_iterator recoMu1 = muons->begin(); recoMu1!=muons->end(); ++recoMu1) {
00154     LogTrace(metname)<<"[DiMuonHistograms] loop over 1st muon"<<endl;
00155 
00156     // Loop on second muons to fill invariant mass plots
00157     for (reco::MuonCollection::const_iterator recoMu2 = recoMu1; recoMu2!=muons->end(); ++recoMu2){ 
00158       LogTrace(metname)<<"[DiMuonHistograms] loop over 2nd muon"<<endl;
00159       if (recoMu1==recoMu2) continue;
00160       
00161       // Global-Global Muon
00162       if (recoMu1->isGlobalMuon() && recoMu2->isGlobalMuon()) {
00163         LogTrace(metname)<<"[DiMuonHistograms] Glb-Glb pair"<<endl;
00164         reco::TrackRef recoCombinedGlbTrack1 = recoMu1->combinedMuon();
00165         reco::TrackRef recoCombinedGlbTrack2 = recoMu2->combinedMuon();
00166         Mu1.SetPxPyPzE(recoCombinedGlbTrack1->px(), recoCombinedGlbTrack1->py(),recoCombinedGlbTrack1->pz(), recoCombinedGlbTrack1->p());
00167         Mu2.SetPxPyPzE(recoCombinedGlbTrack2->px(), recoCombinedGlbTrack2->py(),recoCombinedGlbTrack2->pz(), recoCombinedGlbTrack2->p());
00168         
00169         charge  = recoCombinedGlbTrack1->charge()*recoCombinedGlbTrack2->charge();
00170         if (charge < 0) {
00171           InvMass = (Mu1+Mu2).M();
00172           for (unsigned int iEtaRegion=0; iEtaRegion<3; iEtaRegion++){
00173             if (iEtaRegion==0) {EtaCutMin= 0.;         EtaCutMax=2.4;       }
00174             if (iEtaRegion==1) {EtaCutMin= etaBMin;    EtaCutMax=etaBMax;   } 
00175             if (iEtaRegion==2) {EtaCutMin= etaECMin;   EtaCutMax=etaECMax;  }
00176             
00177             if(fabs(recoCombinedGlbTrack1->eta())>EtaCutMin && fabs(recoCombinedGlbTrack1->eta())<EtaCutMax && 
00178                fabs(recoCombinedGlbTrack2->eta())>EtaCutMin && fabs(recoCombinedGlbTrack2->eta())<EtaCutMax){
00179               if (InvMass < LowMassMax)  GlbGlbMuon_LM[iEtaRegion]->Fill(InvMass);
00180               if (InvMass > HighMassMin) GlbGlbMuon_HM[iEtaRegion]->Fill(InvMass);
00181             }
00182           }
00183         }
00184         // Also Tight-Tight Muon Selection
00185 
00186         if ( muon::isTightMuon(*recoMu1, thePrimaryVertex)  && 
00187              muon::isTightMuon(*recoMu2, thePrimaryVertex) ) { 
00188           
00189           LogTrace(metname)<<"[DiMuonHistograms] Tight-Tight pair"<<endl;
00190           for (unsigned int iEtaRegion=0; iEtaRegion<3; iEtaRegion++){
00191             if (iEtaRegion==0) {EtaCutMin= 0.;         EtaCutMax=2.4;       }
00192             if (iEtaRegion==1) {EtaCutMin= etaBMin;    EtaCutMax=etaBMax;   } 
00193             if (iEtaRegion==2) {EtaCutMin= etaECMin;   EtaCutMax=etaECMax;  }
00194 
00195             if(fabs(recoCombinedGlbTrack1->eta())>EtaCutMin && fabs(recoCombinedGlbTrack1->eta())<EtaCutMax && 
00196                fabs(recoCombinedGlbTrack2->eta())>EtaCutMin && fabs(recoCombinedGlbTrack2->eta())<EtaCutMax){
00197               if (InvMass > 55. && InvMass < 125.) TightTightMuon[iEtaRegion]->Fill(InvMass);
00198             }
00199           }
00200         }
00201       }
00202     
00203       // Now check for STA-TRK 
00204       if (recoMu2->isStandAloneMuon() && recoMu1->isTrackerMuon()) {
00205         LogTrace(metname)<<"[DiMuonHistograms] STA-Trk pair"<<endl;
00206         reco::TrackRef recoStaTrack = recoMu2->standAloneMuon();
00207         reco::TrackRef recoTrack    = recoMu1->track();
00208         Mu2.SetPxPyPzE(recoStaTrack->px(), recoStaTrack->py(),recoStaTrack->pz(), recoStaTrack->p());
00209         Mu1.SetPxPyPzE(recoTrack->px(), recoTrack->py(),recoTrack->pz(), recoTrack->p());
00210 
00211         charge  = recoStaTrack->charge()*recoTrack->charge();
00212         if (charge < 0) {
00213           InvMass = (Mu1+Mu2).M();
00214           for (unsigned int iEtaRegion=0; iEtaRegion<3; iEtaRegion++){
00215             if (iEtaRegion==0) {EtaCutMin= 0.;         EtaCutMax=2.4;       }
00216             if (iEtaRegion==1) {EtaCutMin= etaBMin;    EtaCutMax=etaBMax;   } 
00217             if (iEtaRegion==2) {EtaCutMin= etaECMin;   EtaCutMax=etaECMax;  }
00218             
00219             if(fabs(recoStaTrack->eta())>EtaCutMin && fabs(recoStaTrack->eta())<EtaCutMax &&
00220                fabs(recoTrack->eta())>EtaCutMin && fabs(recoTrack->eta())<EtaCutMax){
00221               if (InvMass < LowMassMax)  StaTrkMuon_LM[iEtaRegion]->Fill(InvMass);
00222               if (InvMass > HighMassMin) StaTrkMuon_HM[iEtaRegion]->Fill(InvMass);
00223             }
00224           }
00225         }
00226       }
00227       if (recoMu1->isStandAloneMuon() && recoMu2->isTrackerMuon()) {
00228         LogTrace(metname)<<"[DiMuonHistograms] STA-Trk pair"<<endl;
00229         reco::TrackRef recoStaTrack = recoMu1->standAloneMuon();
00230         reco::TrackRef recoTrack    = recoMu2->track();
00231         Mu1.SetPxPyPzE(recoStaTrack->px(), recoStaTrack->py(),recoStaTrack->pz(), recoStaTrack->p());
00232         Mu2.SetPxPyPzE(recoTrack->px(), recoTrack->py(),recoTrack->pz(), recoTrack->p());
00233 
00234         charge  = recoStaTrack->charge()*recoTrack->charge();
00235         if (charge < 0) {
00236           InvMass = (Mu1+Mu2).M();
00237           for (unsigned int iEtaRegion=0; iEtaRegion<3; iEtaRegion++){
00238             if (iEtaRegion==0) {EtaCutMin= 0.;         EtaCutMax=2.4;       }
00239             if (iEtaRegion==1) {EtaCutMin= etaBMin;    EtaCutMax=etaBMax;   } 
00240             if (iEtaRegion==2) {EtaCutMin= etaECMin;   EtaCutMax=etaECMax;  }
00241             
00242             if(fabs(recoStaTrack->eta())>EtaCutMin && fabs(recoStaTrack->eta())<EtaCutMax &&
00243                fabs(recoTrack->eta())>EtaCutMin && fabs(recoTrack->eta())<EtaCutMax){
00244               if (InvMass < LowMassMax)  StaTrkMuon_LM[iEtaRegion]->Fill(InvMass);
00245               if (InvMass > HighMassMin) StaTrkMuon_HM[iEtaRegion]->Fill(InvMass);
00246             }
00247           }
00248         }
00249       }
00250 
00251       // TRK-TRK dimuon 
00252       if (recoMu1->isTrackerMuon() && recoMu2->isTrackerMuon()) {
00253         LogTrace(metname)<<"[DiMuonHistograms] Trk-Trk dimuon pair"<<endl;
00254         reco::TrackRef recoTrack2 = recoMu2->track();
00255         reco::TrackRef recoTrack1 = recoMu1->track();
00256         Mu2.SetPxPyPzE(recoTrack2->px(), recoTrack2->py(),recoTrack2->pz(), recoTrack2->p());
00257         Mu1.SetPxPyPzE(recoTrack1->px(), recoTrack1->py(),recoTrack1->pz(), recoTrack1->p());
00258         
00259         charge  = recoTrack1->charge()*recoTrack2->charge();
00260         if (charge < 0) {
00261           InvMass = (Mu1+Mu2).M();
00262           for (unsigned int iEtaRegion=0; iEtaRegion<3; iEtaRegion++){
00263             if (iEtaRegion==0) {EtaCutMin= 0.;         EtaCutMax=2.4;       }
00264             if (iEtaRegion==1) {EtaCutMin= etaBMin;    EtaCutMax=etaBMax;   } 
00265             if (iEtaRegion==2) {EtaCutMin= etaECMin;   EtaCutMax=etaECMax;  }
00266             
00267             if(fabs(recoTrack1->eta())>EtaCutMin && fabs(recoTrack1->eta())<EtaCutMax &&
00268                fabs(recoTrack2->eta())>EtaCutMin && fabs(recoTrack2->eta())<EtaCutMax){
00269               if (InvMass < LowMassMax)  TrkTrkMuon_LM[iEtaRegion]->Fill(InvMass);
00270               if (InvMass > HighMassMin) TrkTrkMuon_HM[iEtaRegion]->Fill(InvMass);
00271             }
00272           }
00273         }
00274 
00275 
00276         LogTrace(metname)<<"[DiMuonHistograms] Soft-Soft pair"<<endl;
00277 
00278         if (muon::isSoftMuon(*recoMu1, thePrimaryVertex)  && 
00279             muon::isSoftMuon(*recoMu2, thePrimaryVertex) ) { 
00280           
00281           if (charge < 0) {
00282             InvMass = (Mu1+Mu2).M();
00283             for (unsigned int iEtaRegion=0; iEtaRegion<3; iEtaRegion++){
00284               if (iEtaRegion==0) {EtaCutMin= 0.;         EtaCutMax=2.4; }
00285               if (iEtaRegion==1) {EtaCutMin= etaBMin;    EtaCutMax=etaBMax; }
00286               if (iEtaRegion==2) {EtaCutMin= etaECMin;   EtaCutMax=etaECMax; }
00287               
00288               if(fabs(recoTrack1->eta())>EtaCutMin && fabs(recoTrack1->eta())<EtaCutMax &&
00289                  fabs(recoTrack2->eta())>EtaCutMin && fabs(recoTrack2->eta())<EtaCutMax){
00290                 SoftSoftMuon[iEtaRegion]->Fill(InvMass); 
00291               }
00292             }
00293           }
00294         } 
00295       }
00296     } //muon2
00297   } //Muon1
00298 }
00299