00001
00006
00007 #include "FWCore/Framework/interface/EDProducer.h"
00008 #include "FWCore/Framework/interface/Event.h"
00009 #include "FWCore/Framework/interface/EventSetup.h"
00010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00011 #include "DataFormats/Common/interface/Handle.h"
00012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00013
00014 #include "DataFormats/RecoCandidate/interface/IsoDepositDirection.h"
00015 #include "RecoMuon/L2MuonIsolationProducer/src/L2MuonIsolationProducer.h"
00016
00017 #include "DataFormats/Common/interface/AssociationMap.h"
00018 #include "DataFormats/TrackReco/interface/Track.h"
00019 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00020 #include "DataFormats/RecoCandidate/interface/IsoDepositFwd.h"
00021
00022 #include "PhysicsTools/IsolationAlgos/interface/IsoDepositExtractor.h"
00023 #include "PhysicsTools/IsolationAlgos/interface/IsoDepositExtractorFactory.h"
00024
00025 #include <string>
00026
00027 using namespace edm;
00028 using namespace std;
00029 using namespace reco;
00030 using namespace muonisolation;
00031
00033 L2MuonIsolationProducer::L2MuonIsolationProducer(const ParameterSet& par) :
00034 theConfig(par),
00035 theSACollectionLabel(par.getParameter<edm::InputTag>("StandAloneCollectionLabel")),
00036 theCuts(par.getParameter<std::vector<double> > ("EtaBounds"),
00037 par.getParameter<std::vector<double> > ("ConeSizes"),
00038 par.getParameter<std::vector<double> > ("Thresholds")),
00039 optOutputIsoDeposits(par.getParameter<bool>("OutputMuIsoDeposits")),
00040 theExtractor(0)
00041 {
00042 LogDebug("Muon|RecoMuon|L2MuonIsolationProducer")<<" L2MuonIsolationProducer constructor called";
00043
00044 if (optOutputIsoDeposits) produces<reco::IsoDepositMap>();
00045 produces<edm::ValueMap<bool> >();
00046 }
00047
00049 L2MuonIsolationProducer::~L2MuonIsolationProducer(){
00050 LogDebug("Muon|RecoMuon|L2MuonIsolationProducer")<<" L2MuonIsolationProducer destructor called";
00051 if (theExtractor) delete theExtractor;
00052 }
00053
00055 void L2MuonIsolationProducer::beginJob(const edm::EventSetup& iSetup){
00056
00057
00058
00059 edm::ParameterSet extractorPSet = theConfig.getParameter<edm::ParameterSet>("ExtractorPSet");
00060 std::string extractorName = extractorPSet.getParameter<std::string>("ComponentName");
00061 theExtractor = IsoDepositExtractorFactory::get()->create( extractorName, extractorPSet);
00062 }
00063
00065 void L2MuonIsolationProducer::produce(Event& event, const EventSetup& eventSetup){
00066 std::string metname = "Muon|RecoMuon|L2MuonIsolationProducer";
00067
00068 LogDebug(metname)<<" L2 Muon Isolation producing...";
00069
00070
00071 LogDebug(metname)<<" Taking the StandAlone muons: "<<theSACollectionLabel;
00072 Handle<TrackCollection> tracks;
00073 event.getByLabel(theSACollectionLabel,tracks);
00074
00075
00076 LogDebug(metname)<<" Get energy around";
00077 std::auto_ptr<reco::IsoDepositMap> depMap( new reco::IsoDepositMap());
00078 std::auto_ptr<edm::ValueMap<bool> > isoMap( new edm::ValueMap<bool> ());
00079
00080 theExtractor->fillVetos(event,eventSetup,*tracks);
00081
00082 uint nTracks = tracks->size();
00083 std::vector<IsoDeposit> deps(nTracks);
00084 std::vector<bool> isos(nTracks, false);
00085
00086 for (unsigned int i=0; i<nTracks; i++) {
00087 TrackRef tk(tracks,i);
00088
00089 deps[i] = theExtractor->deposit(event, eventSetup, *tk);
00090
00091 muonisolation::Cuts::CutSpec cuts_here = theCuts(tk->eta());
00092
00093 double conesize = cuts_here.conesize;
00094 double dephlt = deps[i].depositWithin(conesize);
00095 if (dephlt<cuts_here.threshold) {
00096 isos[i] = true;
00097 } else {
00098 isos[i] = false;
00099 }
00100 }
00101
00102
00103
00104 if (optOutputIsoDeposits){
00106 reco::IsoDepositMap::Filler depFiller(*depMap);
00107 depFiller.insert(tracks, deps.begin(), deps.end());
00108 depFiller.fill();
00109 event.put(depMap);
00110 }
00111
00112 edm::ValueMap<bool> ::Filler isoFiller(*isoMap);
00113 isoFiller.insert(tracks, isos.begin(), isos.end());
00114 isoFiller.fill();
00115 event.put(isoMap);
00116
00117 LogDebug(metname) <<" Event loaded"
00118 <<"================================";
00119 }