00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "DQM/Physics/src/BPhysicsOniaDQM.h"
00010
00011 #include "FWCore/Framework/interface/Event.h"
00012 #include "FWCore/Framework/interface/EventSetup.h"
00013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00014
00015 #include "DQMServices/Core/interface/DQMStore.h"
00016 #include "DQMServices/Core/interface/MonitorElement.h"
00017 #include "FWCore/ServiceRegistry/interface/Service.h"
00018
00019 #include "DataFormats/Common/interface/Handle.h"
00020 #include "DataFormats/MuonReco/interface/MuonFwd.h"
00021 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
00022 #include "DataFormats/TrackReco/interface/Track.h"
00023 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00024 #include "DataFormats/VertexReco/interface/Vertex.h"
00025 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00026
00027 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00028
00029 using namespace std;
00030 using namespace edm;
00031 using namespace reco;
00032
00033 BPhysicsOniaDQM::BPhysicsOniaDQM(const ParameterSet& parameters) {
00034
00035 theMuonCollectionLabel = parameters.getParameter<InputTag>("MuonCollection");
00036 vertex = parameters.getParameter<InputTag>("vertex");
00037
00038 global_background = NULL;
00039 diMuonMass_global = NULL;
00040 tracker_background = NULL;
00041 diMuonMass_tracker = NULL;
00042 standalone_background = NULL;
00043 diMuonMass_standalone = NULL;
00044
00045 glbSigCut = NULL;
00046 glbSigNoCut = NULL;
00047 glbBkgNoCut = NULL;
00048 staSigCut = NULL;
00049 staSigNoCut = NULL;
00050 staBkgNoCut = NULL;
00051 trkSigCut = NULL;
00052 trkSigNoCut = NULL;
00053 trkBkgNoCut = NULL;
00054
00055
00056
00057
00058 }
00059
00060 BPhysicsOniaDQM::~BPhysicsOniaDQM() {
00061 }
00062
00063 void BPhysicsOniaDQM::beginJob() {
00064
00065 theDbe = Service<DQMStore>().operator->();
00066
00067 metname = "oniaAnalyzer";
00068 LogTrace(metname)<<"[BPhysicsOniaDQM] Parameters initialization";
00069
00070 if(theDbe!=NULL){
00071 theDbe->setCurrentFolder("Physics/BPhysics");
00072 global_background = theDbe->book1D("global_background", "Same-sign global-global dimuon mass", 750, 0, 15);
00073 diMuonMass_global = theDbe->book1D("diMuonMass_global", "Opposite-sign global-global dimuon mass", 750, 0, 15);
00074 tracker_background = theDbe->book1D("tracker_background", "Same-sign tracker-tracker (arbitrated) dimuon mass", 750, 0, 15);
00075 diMuonMass_tracker = theDbe->book1D("diMuonMass_tracker", "Opposite-sign tracker-tracker (arbitrated) dimuon mass", 750, 0, 15);
00076 standalone_background = theDbe->book1D("standalone_background", "Same-sign standalone-standalone dimuon mass", 500, 0, 15);
00077 diMuonMass_standalone = theDbe->book1D("diMuonMass_standalone", "Opposite-sign standalone-standalone dimuon mass", 500, 0, 15);
00078
00079 glbSigCut = theDbe->book1D("glbSigCut", "Opposite-sign glb-glb dimuon mass", 650, 0, 130);
00080 glbSigNoCut = theDbe->book1D("glbSigNoCut", "Opposite-sign glb-glb dimuon mass (no cut)", 650, 0, 130);
00081 glbBkgNoCut = theDbe->book1D("glbBkgNoCut", "Same-sign glb-glb dimuon mass (no cut)", 650, 0, 130);
00082 staSigCut = theDbe->book1D("staSigCut", "Opposite-sign sta-sta dimuon mass", 430, 0, 129);
00083 staSigNoCut = theDbe->book1D("staSigNoCut", "Opposite-sign sta-sta dimuon mass (no cut)", 430, 0, 129);
00084 staBkgNoCut = theDbe->book1D("staBkgNoCut", "Same-sign sta-sta dimuon mass (no cut)", 430, 0, 129);
00085 trkSigCut = theDbe->book1D("trkSigCut", "Opposite-sign trk-trk dimuon mass", 650, 0, 130);
00086 trkSigNoCut = theDbe->book1D("trkSigNoCut", "Opposite-sign trk-trk dimuon mass (no cut)", 650, 0, 130);
00087 trkBkgNoCut = theDbe->book1D("trkBkgNoCutt", "Same-sign trk-trk dimuon mass (no cut)", 650, 0, 130);
00088 }
00089
00090 }
00091
00092 void BPhysicsOniaDQM::analyze(const Event& iEvent, const EventSetup& iSetup) {
00093
00094 LogTrace(metname)<<"[BPhysicsOniaDQM] Analysis of event # ";
00095
00096
00097 Handle<MuonCollection> muons;
00098 iEvent.getByLabel(theMuonCollectionLabel,muons);
00099
00100 Handle<reco::VertexCollection> privtxs;
00101 iEvent.getByLabel(vertex,privtxs);
00102 VertexCollection::const_iterator privtx;
00103
00104 if(privtxs->begin() != privtxs->end()){
00105 privtx = privtxs->begin();
00106 RefVtx = privtx->position();
00107 } else {
00108 RefVtx.SetXYZ(0.,0.,0.);
00109 }
00110
00111 if(muons.isValid()){
00112 for (MuonCollection::const_iterator recoMu1 = muons->begin(); recoMu1!=muons->end(); ++recoMu1){
00113
00114
00115 if(recoMu1->isGlobalMuon() || recoMu1->isTrackerMuon() || recoMu1->isStandAloneMuon()){
00116 for (MuonCollection::const_iterator recoMu2 = recoMu1+1; recoMu2!=muons->end(); ++recoMu2){
00117
00118
00119 if (recoMu1->isGlobalMuon() && recoMu2->isGlobalMuon()){
00120 math::XYZVector vec1 = recoMu1->globalTrack()->momentum();
00121 math::XYZVector vec2 = recoMu2->globalTrack()->momentum();
00122 float massJPsi = computeMass(vec1,vec2);
00123
00124
00125 if (((*recoMu1).charge()*(*recoMu2).charge())<0) {
00126 if(diMuonMass_global!=NULL){
00127 diMuonMass_global->Fill(massJPsi);
00128 }
00129
00130 if(glbSigNoCut!=NULL){
00131 glbSigNoCut->Fill(massJPsi);
00132 if (selGlobalMuon(*recoMu1) && selGlobalMuon(*recoMu2)) {
00133 if (glbSigCut!=NULL) glbSigCut->Fill(massJPsi);
00134 if (massJPsi >= 3.0 && massJPsi <= 3.2) jpsiGlbSigPerLS++;
00135 }
00136 }
00137 } else {
00138 if(global_background!=NULL){
00139 global_background->Fill (massJPsi);
00140 }
00141
00142 if(glbBkgNoCut!=NULL){
00143 glbBkgNoCut->Fill(massJPsi);
00144 }
00145 }
00146 }
00147
00148 if(recoMu1->isStandAloneMuon() && recoMu2->isStandAloneMuon() &&
00149 fabs(recoMu1->outerTrack()->d0()) < 5 && fabs(recoMu1->outerTrack()->dz()) < 30 &&
00150 fabs(recoMu2->outerTrack()->d0()) < 5 && fabs(recoMu2->outerTrack()->dz()) < 30){
00151 math::XYZVector vec1 = recoMu1->outerTrack()->momentum();
00152 math::XYZVector vec2 = recoMu2->outerTrack()->momentum();
00153 float massJPsi = computeMass(vec1,vec2);
00154
00155
00156 if (((*recoMu1).charge()*(*recoMu2).charge())<0) {
00157 if(diMuonMass_standalone!=NULL){
00158 diMuonMass_standalone->Fill(massJPsi);
00159 }
00160
00161 if(staSigNoCut!=NULL){
00162 staSigNoCut->Fill(massJPsi);
00163
00164
00165
00166
00167 }
00168 } else {
00169 if(standalone_background!=NULL){
00170 standalone_background->Fill (massJPsi);
00171 }
00172
00173 if(staBkgNoCut!=NULL){
00174 staBkgNoCut->Fill(massJPsi);
00175 }
00176 }
00177 }
00178
00179 if(recoMu1->isTrackerMuon() && recoMu2->isTrackerMuon() &&
00180 muon::isGoodMuon(*recoMu1, muon::TrackerMuonArbitrated) &&
00181 muon::isGoodMuon(*recoMu2, muon::TrackerMuonArbitrated)){
00182 math::XYZVector vec1 = recoMu1->innerTrack()->momentum();
00183 math::XYZVector vec2 = recoMu2->innerTrack()->momentum();
00184 float massJPsi = computeMass(vec1,vec2);
00185
00186
00187 if (((*recoMu1).charge()*(*recoMu2).charge())<0) {
00188 if(diMuonMass_tracker!=NULL){
00189 diMuonMass_tracker->Fill(massJPsi);
00190 }
00191
00192 if(trkSigNoCut!=NULL){
00193 trkSigNoCut->Fill(massJPsi);
00194 if (selTrackerMuon(*recoMu1) && selTrackerMuon(*recoMu2)) {
00195 if (trkSigCut!=NULL) trkSigCut->Fill(massJPsi);
00196 if(massJPsi >= 3.0 && massJPsi <= 3.2) jpsiTrkSigPerLS++;
00197 }
00198 }
00199 } else {
00200 if(tracker_background!=NULL){
00201 tracker_background->Fill (massJPsi);
00202 }
00203
00204 if(trkBkgNoCut!=NULL){
00205 trkBkgNoCut->Fill(massJPsi);
00206 }
00207 }
00208 }
00209
00210 }
00211 }
00212 }
00213 }
00214
00215 }
00216
00217 void BPhysicsOniaDQM::endJob(void) {
00218 LogTrace(metname)<<"[BPhysicsOniaDQM] EndJob";
00219 }
00220
00221 void BPhysicsOniaDQM::beginLuminosityBlock(const edm::LuminosityBlock &lumiBlock, const edm::EventSetup &iSetup)
00222 {
00223 LogTrace(metname)<<"[BPhysicsOniaDQM] Start of a LuminosityBlock";
00224
00225 jpsiGlbSigPerLS = 0;
00226 jpsiStaSigPerLS = 0;
00227 jpsiTrkSigPerLS = 0;
00228 }
00229
00230 void BPhysicsOniaDQM::endLuminosityBlock(const edm::LuminosityBlock &lumiBlock, const edm::EventSetup &iSetup)
00231 {
00232 LogTrace(metname)<<"[BPhysicsOniaDQM] Start of a LuminosityBlock";
00233
00234 edm::Handle<LumiSummary> lumiSummary;
00235 lumiBlock.getByLabel("lumiProducer",lumiSummary);
00236
00237 int LBlockNum = lumiBlock.id().luminosityBlock();
00238
00239 jpsiGlbSig.insert( pair<int,int>(LBlockNum, jpsiGlbSigPerLS) );
00240 jpsiStaSig.insert( pair<int,int>(LBlockNum, jpsiStaSigPerLS) );
00241 jpsiTrkSig.insert( pair<int,int>(LBlockNum, jpsiTrkSigPerLS) );
00242
00243
00244 if (jpsiGlbSig.size()%5 != 0) return;
00245
00246 theDbe->setCurrentFolder("Physics/BPhysics");
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277 }
00278
00279 void BPhysicsOniaDQM::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
00280 {
00281 LogTrace(metname)<<"[BPhysicsOniaDQM] Start of a Run";
00282 }
00283
00284 void BPhysicsOniaDQM::endRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
00285 {
00286 LogTrace(metname)<<"[BPhysicsOniaDQM] End of a Run";
00287
00288 if (!jpsiGlbSig.empty()) {
00289 jpsiGlbSig.clear();
00290 jpsiStaSig.clear();
00291 jpsiTrkSig.clear();
00292 }
00293 }
00294
00295 float BPhysicsOniaDQM::computeMass(const math::XYZVector &vec1,const math::XYZVector &vec2){
00296
00297 float massMu = 0.10566;
00298 float eMu1 = -999;
00299 if(massMu*massMu + vec1.Mag2()>0)
00300 eMu1 = sqrt(massMu*massMu + vec1.Mag2());
00301 float eMu2 = -999;
00302 if(massMu*massMu + vec2.Mag2()>0)
00303 eMu2 = sqrt(massMu*massMu + vec2.Mag2());
00304
00305 float pJPsi = -999;
00306 if((vec1+vec2).Mag2()>0)
00307 pJPsi = sqrt((vec1+vec2).Mag2());
00308 float eJPsi = eMu1 + eMu2;
00309
00310 float massJPsi = -999;
00311 if((eJPsi*eJPsi - pJPsi*pJPsi) > 0)
00312 massJPsi = sqrt(eJPsi*eJPsi - pJPsi*pJPsi);
00313
00314 return massJPsi;
00315 }
00316
00317 bool BPhysicsOniaDQM::isMuonInAccept(const reco::Muon &recoMu)
00318 {
00319 return (fabs(recoMu.eta()) < 2.4 &&
00320 ((fabs(recoMu.eta()) < 1.3 && recoMu.pt() > 3.3) ||
00321 (fabs(recoMu.eta()) > 1.3 && fabs(recoMu.eta()) < 2.2 && recoMu.p() > 2.9) ||
00322 (fabs(recoMu.eta()) > 2.2 && recoMu.pt() > 0.8)));
00323 }
00324
00325 bool BPhysicsOniaDQM::selGlobalMuon(const reco::Muon &recoMu)
00326 {
00327 TrackRef iTrack = recoMu.innerTrack();
00328 const reco::HitPattern &p = iTrack->hitPattern();
00329
00330 TrackRef gTrack = recoMu.globalTrack();
00331 const reco::HitPattern &q = gTrack->hitPattern();
00332
00333 return (isMuonInAccept(recoMu) &&
00334 iTrack->found() > 11 &&
00335 gTrack->chi2()/gTrack->ndof() < 20.0 &&
00336 q.numberOfValidMuonHits() > 0 &&
00337 iTrack->chi2()/iTrack->ndof() < 4.0 &&
00338
00339
00340 p.pixelLayersWithMeasurement() > 1 &&
00341 fabs(iTrack->dxy(RefVtx)) < 3.0 &&
00342 fabs(iTrack->dz(RefVtx)) < 15.0 );
00343 }
00344
00345 bool BPhysicsOniaDQM::selTrackerMuon(const reco::Muon &recoMu)
00346 {
00347 TrackRef iTrack = recoMu.innerTrack();
00348 const reco::HitPattern &p = iTrack->hitPattern();
00349
00350 return (isMuonInAccept(recoMu) &&
00351 iTrack->found() > 11 &&
00352 iTrack->chi2()/iTrack->ndof() < 4.0 &&
00353
00354
00355 p.pixelLayersWithMeasurement() > 1 &&
00356 fabs(iTrack->dxy(RefVtx)) < 3.0 &&
00357 fabs(iTrack->dz(RefVtx)) < 15.0 );
00358 }
00359