00001
00002 #include "DQMOffline/Muon/src/DiMuonHistograms.h"
00003
00004
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
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
00087 TightTightMuon.push_back(dbe->book1D("TightTightMuon"+EtaName,"InvMass_{Tight,Tight}"+EtaName,nBin, 55.0, 125.0));
00088
00089
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
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
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
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
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
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
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
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 }
00297 }
00298 }
00299