Go to the documentation of this file.00001 #include <memory>
00002 #include "FWCore/Framework/interface/Frameworkfwd.h"
00003 #include "FWCore/Framework/interface/MakerMacros.h"
00004 #include "FWCore/Framework/interface/EDProducer.h"
00005
00006 #include "MuonAnalysis/MomentumScaleCalibration/interface/MomentumScaleCorrector.h"
00007 #include "MuonAnalysis/MomentumScaleCalibration/interface/ResolutionFunction.h"
00008
00009
00010
00011
00012 class MuonWithPFIsoProducer : public edm::EDProducer {
00013 public:
00014 explicit MuonWithPFIsoProducer(const edm::ParameterSet&);
00015 ~MuonWithPFIsoProducer();
00016
00017 private:
00018 virtual void beginJob() ;
00019 virtual void produce(edm::Event&, const edm::EventSetup&) override;
00020 virtual void endJob() ;
00021
00022 edm::InputTag muonTag_;
00023 edm::InputTag pfTag_;
00024
00025 bool usePfMuonsOnly_;
00026
00027 double trackIsoVeto_;
00028 double gammaIsoVeto_;
00029 double neutralHadronIsoVeto_;
00030 };
00031
00032 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00033 #include "DataFormats/Common/interface/Handle.h"
00034 #include "DataFormats/Common/interface/View.h"
00035 #include "FWCore/Framework/interface/Event.h"
00036 #include "DataFormats/MuonReco/interface/Muon.h"
00037 #include "DataFormats/MuonReco/interface/MuonFwd.h"
00038 #include "DataFormats/TrackReco/interface/Track.h"
00039 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
00040
00041 #include "DataFormats/GeometryVector/interface/VectorUtil.h"
00042
00044 MuonWithPFIsoProducer::MuonWithPFIsoProducer(const edm::ParameterSet& pset) {
00045
00046
00047 produces<std::vector<reco::Muon> >();
00048
00049
00050 muonTag_ = pset.getUntrackedParameter<edm::InputTag> ("MuonTag", edm::InputTag("muons"));
00051
00052
00053 pfTag_ = pset.getUntrackedParameter<edm::InputTag> ("PFTag", edm::InputTag("particleFlow"));
00054
00055
00056 usePfMuonsOnly_ = pset.getUntrackedParameter<bool> ("UsePfMuonsOnly", false);
00057
00058
00059 trackIsoVeto_ = pset.getUntrackedParameter<double> ("TrackIsoVeto", 0.01);
00060 gammaIsoVeto_ = pset.getUntrackedParameter<double> ("GammaIsoVeto", 0.07);
00061 neutralHadronIsoVeto_ = pset.getUntrackedParameter<double> ("NeutralHadronIsoVeto", 0.1);
00062
00063 }
00064
00066 MuonWithPFIsoProducer::~MuonWithPFIsoProducer(){
00067 }
00068
00070 void MuonWithPFIsoProducer::beginJob() {
00071 }
00072
00074 void MuonWithPFIsoProducer::endJob(){
00075 }
00076
00078 void MuonWithPFIsoProducer::produce(edm::Event& ev, const edm::EventSetup& iSetup) {
00079
00080
00081 std::auto_ptr<reco::MuonCollection> newmuons (new reco::MuonCollection);
00082
00083
00084 edm::Handle<edm::View<reco::Muon> > muonCollection;
00085 if (!ev.getByLabel(muonTag_, muonCollection)) {
00086 edm::LogError("") << ">>> Muon collection does not exist !!!";
00087 ev.put(newmuons);
00088 return;
00089 }
00090
00091
00092 edm::Handle<edm::View<reco::PFCandidate> > pfCollection;
00093 if (!ev.getByLabel(pfTag_, pfCollection)) {
00094 edm::LogError("") << ">>> PFCandidate collection does not exist !!!";
00095 ev.put(newmuons);
00096 return;
00097 }
00098
00099
00100
00101
00102
00103
00104
00105 unsigned int muonCollectionSize = muonCollection->size();
00106 unsigned int pfCollectionSize = pfCollection->size();
00107 for (unsigned int i=0; i<muonCollectionSize; i++) {
00108 edm::RefToBase<reco::Muon> mu = muonCollection->refAt(i);
00109
00110
00111 bool muonFound = false;
00112
00113
00114 reco::Muon* newmu = mu->clone();
00115 reco::TrackRef tk = mu->innerTrack();
00116
00117
00118 reco::MuonIsolation iso03;
00119 reco::MuonIsolation iso05;
00120
00121 for (unsigned int j=0; j<pfCollectionSize; j++) {
00122 edm::RefToBase<reco::PFCandidate> pf = pfCollection->refAt(j);
00123
00124
00125 bool thisIsTheMuon = false;
00126 if (tk.isNonnull() && pf->trackRef()==tk) {
00127 thisIsTheMuon = true;
00128 muonFound = true;
00129 }
00130
00131
00132 double deltaR = Geom::deltaR(mu->momentum(),pf->momentum());
00133 if (deltaR>0.5) continue;
00134
00135
00136 if ( pf->particleId()==reco::PFCandidate::h
00137 || pf->particleId()==reco::PFCandidate::e
00138 || pf->particleId()==reco::PFCandidate::mu ) {
00139 if (deltaR<trackIsoVeto_ || thisIsTheMuon) {
00140 iso05.trackerVetoPt += pf->pt();
00141 iso03.trackerVetoPt += pf->pt();
00142 } else {
00143 iso05.sumPt += pf->pt();
00144 iso05.nTracks++;
00145 if (deltaR<0.3) {
00146 iso03.sumPt += pf->pt();
00147 iso03.nTracks++;
00148 }
00149 }
00150
00151 } else if ( pf->particleId()==reco::PFCandidate::gamma
00152 || pf->particleId()==reco::PFCandidate::egamma_HF) {
00153 if (deltaR<gammaIsoVeto_) {
00154 iso05.emVetoEt += pf->pt();
00155 iso03.emVetoEt += pf->pt();
00156 } else {
00157 iso05.emEt += pf->pt();
00158 if (deltaR<0.3) iso03.emEt += pf->pt();
00159 }
00160
00161 } else if ( pf->particleId()==reco::PFCandidate::h0
00162 || pf->particleId()==reco::PFCandidate::h_HF) {
00163 if (deltaR<neutralHadronIsoVeto_) {
00164 iso05.hadVetoEt += pf->pt();
00165 iso03.hadVetoEt += pf->pt();
00166 } else {
00167 iso05.hadEt += pf->pt();
00168 if (deltaR<0.3) iso03.hadEt += pf->pt();
00169 }
00170 }
00171 }
00172
00173
00174 if (usePfMuonsOnly_ && (!muonFound)) continue;
00175
00176
00177 newmu->setIsolation(iso03,iso05);
00178
00179
00180 newmuons->push_back(*newmu);
00181
00182 }
00183
00184
00185 ev.put(newmuons);
00186 }
00187
00188 DEFINE_FWK_MODULE(MuonWithPFIsoProducer);