|
| 1 | +#include <map> |
| 2 | +#include <string> |
| 3 | + |
| 4 | +#include "TH1.h" |
| 5 | + |
| 6 | +#include "FWCore/Framework/interface/Frameworkfwd.h" |
| 7 | +#include "FWCore/Framework/interface/Event.h" |
| 8 | +#include "FWCore/Framework/interface/EDAnalyzer.h" |
| 9 | +#include "FWCore/ParameterSet/interface/ParameterSet.h" |
| 10 | +#include "FWCore/ServiceRegistry/interface/Service.h" |
| 11 | +#include "CommonTools/UtilAlgos/interface/TFileService.h" |
| 12 | +#include "DataFormats/PatCandidates/interface/Muon.h" |
| 13 | + |
| 14 | +#include "DataFormats/PatCandidates/interface/Electron.h" |
| 15 | +#include "DataFormats/PatCandidates/interface/Muon.h" |
| 16 | + |
| 17 | +class MyZPeakAnalyzer : public edm::EDAnalyzer { |
| 18 | + |
| 19 | +public: |
| 20 | + explicit MyZPeakAnalyzer(const edm::ParameterSet&); |
| 21 | + ~MyZPeakAnalyzer(); |
| 22 | + |
| 23 | +private: |
| 24 | + |
| 25 | + virtual void beginJob() ; |
| 26 | + virtual void analyze(const edm::Event&, const edm::EventSetup&); |
| 27 | + virtual void endJob() ; |
| 28 | + |
| 29 | + // simple map to contain all histograms; |
| 30 | + // histograms are booked in the beginJob() |
| 31 | + // method |
| 32 | + std::map<std::string,TH1F*> histContainer_; |
| 33 | + // ----------member data --------------------------- |
| 34 | + edm::EDGetTokenT<pat::MuonCollection> muonCollToken; |
| 35 | + edm::EDGetTokenT<pat::ElectronCollection> elecCollToken; |
| 36 | + |
| 37 | + // input tags |
| 38 | + edm::InputTag muonSrc_; |
| 39 | + edm::InputTag elecSrc_; |
| 40 | +}; |
| 41 | + |
| 42 | + |
| 43 | +MyZPeakAnalyzer::MyZPeakAnalyzer(const edm::ParameterSet& iConfig): |
| 44 | + |
| 45 | + histContainer_(), |
| 46 | + muonSrc_(iConfig.getUntrackedParameter<edm::InputTag>("muonSrc")), |
| 47 | + elecSrc_(iConfig.getUntrackedParameter<edm::InputTag>("elecSrc")){ |
| 48 | + |
| 49 | + muonCollToken = consumes<pat::MuonCollection>(muonSrc_); |
| 50 | + elecCollToken = consumes<pat::ElectronCollection>(elecSrc_); |
| 51 | + |
| 52 | +} |
| 53 | + |
| 54 | +MyZPeakAnalyzer::~MyZPeakAnalyzer(){ |
| 55 | +} |
| 56 | + |
| 57 | +void |
| 58 | +MyZPeakAnalyzer::analyze(const edm::Event& iEvent, |
| 59 | + const edm::EventSetup& iSetup){ |
| 60 | + |
| 61 | + // get pat muon collection |
| 62 | + edm::Handle< std::vector<pat::Muon>> muons; |
| 63 | + iEvent.getByToken(muonCollToken, muons); |
| 64 | + |
| 65 | + // fill pat muon histograms |
| 66 | + for (auto it = muons->cbegin(); it != muons->cend(); ++it) { |
| 67 | + histContainer_["muonPt"] ->Fill(it->pt()); |
| 68 | + histContainer_["muonEta"]->Fill(it->eta()); |
| 69 | + histContainer_["muonPhi"]->Fill(it->phi()); |
| 70 | + |
| 71 | + if( it->pt()>20 && fabs(it->eta())<2.1 ){ |
| 72 | + for (auto it2 = muons->cbegin(); it2 != muons->cend(); ++it2){ |
| 73 | + if (it2 > it){ |
| 74 | + // check only muon pairs of unequal charge |
| 75 | + if( it->charge()*it2->charge()<0){ |
| 76 | + histContainer_["mumuMass"]->Fill((it->p4()+it2->p4()).mass()); |
| 77 | + } |
| 78 | + } |
| 79 | + } |
| 80 | + } |
| 81 | + } |
| 82 | + |
| 83 | + // get pat electron collection |
| 84 | + edm::Handle< std::vector<pat::Electron>> electrons; |
| 85 | + iEvent.getByToken(elecCollToken, electrons); |
| 86 | + |
| 87 | + // loop over electrons |
| 88 | + for (auto it = electrons->cbegin(); it != electrons->cend(); ++it) { |
| 89 | + histContainer_["elePt"] ->Fill(it->pt()); |
| 90 | + histContainer_["eleEta"]->Fill(it->eta()); |
| 91 | + histContainer_["elePhi"]->Fill(it->phi()); |
| 92 | + } |
| 93 | + |
| 94 | + // Multiplicity |
| 95 | + histContainer_["eleMult" ]->Fill(electrons->size()); |
| 96 | + histContainer_["muonMult"]->Fill(muons->size() ); |
| 97 | +} |
| 98 | + |
| 99 | +void |
| 100 | +MyZPeakAnalyzer::beginJob() |
| 101 | +{ |
| 102 | + // register to the TFileService |
| 103 | + edm::Service<TFileService> fs; |
| 104 | + |
| 105 | + |
| 106 | + histContainer_["mumuMass"]=fs->make<TH1F>("mumuMass", "mass", 90, 30., 120.); |
| 107 | + |
| 108 | + // book histograms for Multiplicity: |
| 109 | + |
| 110 | + histContainer_["eleMult"]=fs->make<TH1F>("eleMult", "electron multiplicity", 100, 0, 50); |
| 111 | + histContainer_["muonMult"]=fs->make<TH1F>("muonMult", "muon multiplicity", 100, 0, 50); |
| 112 | + |
| 113 | + // book histograms for Pt: |
| 114 | + |
| 115 | + histContainer_["elePt"]=fs->make<TH1F>("elePt", "electron Pt", 100, 0, 200); |
| 116 | + histContainer_["muonPt"]=fs->make<TH1F>("muonPt", "muon Pt", 100, 0, 200); |
| 117 | + |
| 118 | + // book histograms for Eta: |
| 119 | + histContainer_["eleEta"]=fs->make<TH1F>("eleEta", "electron Eta",100, -5, 5); |
| 120 | + histContainer_["muonEta"]=fs->make<TH1F>("muonEta", "muon Eta", 100, -5, 5); |
| 121 | + |
| 122 | + |
| 123 | + // book histograms for Phi: |
| 124 | + histContainer_["elePhi"]=fs->make<TH1F>("elePhi", "electron Phi", 100, -3.5, 3.5); |
| 125 | + histContainer_["muonPhi"]=fs->make<TH1F>("muonPhi", "muon Phi", 100, -3.5, 3.5); |
| 126 | + |
| 127 | +} |
| 128 | + |
| 129 | +void |
| 130 | +MyZPeakAnalyzer::endJob() |
| 131 | +{ |
| 132 | +} |
| 133 | + |
| 134 | +#include "FWCore/Framework/interface/MakerMacros.h" |
| 135 | +DEFINE_FWK_MODULE(MyZPeakAnalyzer); |
0 commit comments