00001 #ifndef MuonIsolationProducers_MuIsolatorResultProducer_H
00002 #define MuonIsolationProducers_MuIsolatorResultProducer_H
00003
00004 #include "FWCore/Framework/interface/EDProducer.h"
00005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00006
00007 #include "RecoMuon/MuonIsolation/interface/MuIsoBaseIsolator.h"
00008
00009 #include "FWCore/Framework/interface/Event.h"
00010
00011 #include "DataFormats/Common/interface/RefToBase.h"
00012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00013
00014 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00015 #include "DataFormats/Common/interface/ValueMap.h"
00016
00017
00018 #include <string>
00019
00020 namespace edm { class EventSetup; }
00021
00022 struct muisorhelper {
00023 typedef muonisolation::MuIsoBaseIsolator Isolator;
00024 typedef Isolator::Result Result;
00025 typedef Isolator::ResultType ResultType;
00026 typedef std::vector<Result> Results;
00027 typedef Isolator::DepositContainer DepositContainer;
00028
00029 template<typename BT>
00030 class CandMap {
00031 public:
00032 typedef typename edm::RefToBase<BT> key_type;
00033 typedef typename edm::Handle<edm::View<BT> > handle_type;
00034 typedef DepositContainer value_type;
00035 typedef std::pair<key_type, value_type> pair_type;
00036 typedef typename std::vector<pair_type > map_type;
00037 typedef typename map_type::iterator iterator;
00038
00039 map_type& get() { return cMap_;}
00040 const map_type& get() const {return cMap_;}
00041 const handle_type& handle() const { return handle_;}
00042 void setHandle(const handle_type& rhs) { handle_ = rhs;}
00043 private:
00044 map_type cMap_;
00045 handle_type handle_;
00046 };
00047
00048 };
00049
00051 template <typename BT= reco::Candidate>
00052 class MuIsolatorResultProducer : public edm::EDProducer {
00053
00054 public:
00055 MuIsolatorResultProducer(const edm::ParameterSet&);
00056
00057 virtual ~MuIsolatorResultProducer();
00058
00059 virtual void produce(edm::Event&, const edm::EventSetup&);
00060
00061 private:
00062 typedef muisorhelper::Isolator Isolator;
00063 typedef muisorhelper::Result Result;
00064 typedef muisorhelper::ResultType ResultType;
00065 typedef muisorhelper::Results Results;
00066 typedef muisorhelper::DepositContainer DepositContainer;
00067
00068 typedef muisorhelper::CandMap<BT> CandMap;
00069
00070 struct DepositConf {
00071 edm::InputTag tag;
00072 double weight;
00073 double threshold;
00074 };
00075
00076 struct VetoCuts {
00077 bool selectAll;
00078 double muAbsEtaMax;
00079 double muPtMin;
00080 double muAbsZMax;
00081 double muD0Max;
00082 };
00083
00084
00085
00086 void callWhatProduces();
00087
00088 unsigned int initAssociation(edm::Event& event, CandMap& candMapT) const;
00089
00090 void initVetos(std::vector<reco::IsoDeposit::Vetos*>& vetos, CandMap& candMap) const;
00091
00092 template <typename RT>
00093 void writeOutImpl(edm::Event& event, const CandMap& candMapT, const Results& results) const;
00094
00095 void writeOut(edm::Event& event, const CandMap& candMap, const Results& results) const;
00096
00097 edm::ParameterSet theConfig;
00098 std::vector<DepositConf> theDepositConfs;
00099
00101 bool theRemoveOtherVetos;
00102 VetoCuts theVetoCuts;
00103
00105 Isolator* theIsolator;
00106 ResultType theResultType;
00107
00108
00110 std::string theBeamlineOption;
00111 edm::InputTag theBeamSpotLabel;
00112 reco::TrackBase::Point theBeam;
00113 };
00114
00115
00117 template<typename BT>
00118 template<typename RT> inline
00119 void MuIsolatorResultProducer<BT>::writeOutImpl(edm::Event& event, const CandMap& candMapT,
00120 const Results& results) const {
00122 std::vector<RT> resV(results.size());
00123 for (unsigned int i = 0; i< resV.size(); ++i) resV[i] = results[i].val<RT>();
00124 std::auto_ptr<edm::ValueMap<RT> > outMap(new edm::ValueMap<RT>());
00125 typename edm::ValueMap<RT>::Filler filler(*outMap);
00126
00128 if (candMapT.get().size()>0){
00129 filler.insert(candMapT.handle(), resV.begin(), resV.end());
00130 filler.fill();
00131 }
00132
00133 event.put(outMap);
00134 }
00135
00136
00138 template<typename BT>
00139 inline void MuIsolatorResultProducer<BT>::writeOut(edm::Event& event,
00140 const CandMap& candMapT,
00141 const Results& results) const {
00142
00143 std::string metname = "RecoMuon|MuonIsolationProducers";
00144 LogDebug(metname)<<"Before calling writeOutMap with result type "<<theIsolator->resultType();
00145
00146 if (theResultType == Isolator::ISOL_INT_TYPE) writeOutImpl<int>(event, candMapT, results);
00147 if (theResultType == Isolator::ISOL_FLOAT_TYPE) writeOutImpl<float>(event, candMapT, results);
00148 if (theResultType == Isolator::ISOL_BOOL_TYPE) writeOutImpl<bool>(event, candMapT, results);
00149 }
00150
00151
00153 template<typename BT>
00154 inline void MuIsolatorResultProducer<BT>::callWhatProduces() {
00155 if (theResultType == Isolator::ISOL_FLOAT_TYPE) produces<edm::ValueMap<float> >();
00156 if (theResultType == Isolator::ISOL_INT_TYPE ) produces<edm::ValueMap<int> >();
00157 if (theResultType == Isolator::ISOL_BOOL_TYPE ) produces<edm::ValueMap<bool> >();
00158 }
00159
00160
00161 #include "FWCore/Framework/interface/EDProducer.h"
00162 #include "FWCore/Framework/interface/EventSetup.h"
00163 #include "DataFormats/Common/interface/Handle.h"
00164
00165 #include "FWCore/Framework/interface/ESHandle.h"
00166
00167 #include "DataFormats/MuonReco/interface/Muon.h"
00168 #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
00169 #include "DataFormats/RecoCandidate/interface/IsoDepositFwd.h"
00170 #include "DataFormats/Common/interface/RefToBase.h"
00171 #include "DataFormats/TrackReco/interface/Track.h"
00172 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00173
00174 #include "RecoMuon/MuonIsolation/interface/Range.h"
00175 #include "DataFormats/RecoCandidate/interface/IsoDepositDirection.h"
00176
00177 #include "RecoMuon/MuonIsolation/interface/IsolatorByDeposit.h"
00178 #include "RecoMuon/MuonIsolation/interface/IsolatorByDepositCount.h"
00179 #include "RecoMuon/MuonIsolation/interface/IsolatorByNominalEfficiency.h"
00180
00181 #include <string>
00182
00183
00185 template<typename BT>
00186 MuIsolatorResultProducer<BT>::MuIsolatorResultProducer(const edm::ParameterSet& par) :
00187 theConfig(par),
00188 theRemoveOtherVetos(par.getParameter<bool>("RemoveOtherVetos")),
00189 theIsolator(0),
00190 theBeam(0,0,0)
00191 {
00192 LogDebug("RecoMuon|MuonIsolation")<<" MuIsolatorResultProducer CTOR";
00193
00195 std::vector<edm::ParameterSet> depositInputs =
00196 par.getParameter<std::vector<edm::ParameterSet> >("InputMuIsoDeposits");
00197
00198 std::vector<double> dWeights( depositInputs.size());
00199 std::vector<double> dThresholds( depositInputs.size());
00200
00201 for (unsigned int iDep = 0; iDep < depositInputs.size(); ++iDep){
00202 DepositConf dConf;
00203 dConf.tag = depositInputs[iDep].getParameter<edm::InputTag>("DepositTag");
00204 dConf.weight = depositInputs[iDep].getParameter<double>("DepositWeight");
00205 dConf.threshold = depositInputs[iDep].getParameter<double>("DepositThreshold");
00206
00207 dWeights[iDep] = dConf.weight;
00208 dThresholds[iDep] = dConf.threshold;
00209
00210 theDepositConfs.push_back(dConf);
00211 }
00212
00213 edm::ParameterSet isoPset = par.getParameter<edm::ParameterSet>("IsolatorPSet");
00215 std::string isolatorType = isoPset.getParameter<std::string>("ComponentName");
00216 if ( isolatorType == "IsolatorByDeposit"){
00217 std::string coneSizeType = isoPset.getParameter<std::string>("ConeSizeType");
00218 if (coneSizeType == "FixedConeSize"){
00219 float coneSize(isoPset.getParameter<double>("coneSize"));
00220
00221 theIsolator = new muonisolation::IsolatorByDeposit(coneSize, dWeights, dThresholds);
00222
00223
00224 } else if (coneSizeType == "CutsConeSize"){
00226
00227
00228
00229 }
00230 } else if ( isolatorType == "IsolatorByNominalEfficiency"){
00232 theIsolator = new muonisolation::IsolatorByNominalEfficiency("noname", std::vector<std::string>(1,"8:0.97"), dWeights);
00233 } else if ( isolatorType == "IsolatorByDepositCount"){
00234 std::string coneSizeType = isoPset.getParameter<std::string>("ConeSizeType");
00235 if (coneSizeType == "FixedConeSize"){
00236 float coneSize(isoPset.getParameter<double>("coneSize"));
00237
00238 theIsolator = new muonisolation::IsolatorByDepositCount(coneSize, dThresholds);
00239
00240
00241 } else if (coneSizeType == "CutsConeSize"){
00242
00243
00244
00245 }
00246 }
00247
00248 if (theIsolator == 0 ){
00249 edm::LogError("MuonIsolationProducers")<<"Failed to initialize an isolator";
00250 }
00251 theResultType = theIsolator->resultType();
00252
00253 callWhatProduces();
00254
00255 if (theRemoveOtherVetos){
00256 edm::ParameterSet vetoPSet = par.getParameter<edm::ParameterSet>("VetoPSet");
00257 theVetoCuts.selectAll = vetoPSet.getParameter<bool>("SelectAll");
00258
00262 if (! theVetoCuts.selectAll){
00263 theVetoCuts.muAbsEtaMax = vetoPSet.getParameter<double>("MuAbsEtaMax");
00264 theVetoCuts.muPtMin = vetoPSet.getParameter<double>("MuPtMin");
00265 theVetoCuts.muAbsZMax = vetoPSet.getParameter<double>("MuAbsZMax");
00266 theVetoCuts.muD0Max = vetoPSet.getParameter<double>("MuD0Max");
00267 theBeamlineOption = par.getParameter<std::string>("BeamlineOption");
00268 theBeamSpotLabel = par.getParameter<edm::InputTag>("BeamSpotLabel");
00269 }
00270 }
00271 }
00272
00274 template<typename BT>
00275 MuIsolatorResultProducer<BT>::~MuIsolatorResultProducer(){
00276 if (theIsolator) delete theIsolator;
00277 LogDebug("RecoMuon|MuIsolatorResultProducer")<<" MuIsolatorResultProducer DTOR";
00278 }
00279
00280
00281 template<typename BT>
00282 void MuIsolatorResultProducer<BT>::produce(edm::Event& event, const edm::EventSetup& eventSetup){
00283
00284 std::string metname = "RecoMuon|MuonIsolationProducers";
00285 LogDebug(metname)<<" Muon Deposit producing..."
00286 <<" BEGINING OF EVENT " <<"================================";
00287
00288 theBeam = reco::TrackBase::Point(0,0, 0);
00289
00291 if(theRemoveOtherVetos && ! theVetoCuts.selectAll){
00292 if (theBeamlineOption.compare("BeamSpotFromEvent") == 0){
00293
00294 reco::BeamSpot beamSpot;
00295 edm::Handle<reco::BeamSpot> beamSpotH;
00296
00297 event.getByLabel(theBeamSpotLabel,beamSpotH);
00298
00299 if (beamSpotH.isValid()){
00300 theBeam = beamSpotH->position();
00301 LogTrace(metname)<<"Extracted beam point at "<<theBeam<<std::endl;
00302 }
00303 }
00304 }
00305
00311 CandMap candMapT;
00312
00313 unsigned int colSize = initAssociation(event, candMapT);
00314
00316 Results results(colSize);
00317
00319 std::vector<reco::IsoDeposit::Vetos*> vetoDeps(theDepositConfs.size(), 0);
00320
00321 if (colSize != 0){
00322 if (theRemoveOtherVetos){
00323
00324 initVetos(vetoDeps, candMapT);
00325 }
00326
00328 for (unsigned int muI=0; muI < colSize; ++muI){
00329 results[muI] = theIsolator->result(candMapT.get()[muI].second, *(candMapT.get()[muI].first));
00330
00331 if (results[muI].typeF()!= theIsolator->resultType()){
00332 edm::LogError("MuonIsolationProducers")<<"Failed to get result from the isolator";
00333 }
00334 }
00335
00336 }
00337
00338 LogDebug(metname)<<"Ready to write out results of size "<<results.size();
00339 writeOut(event, candMapT, results);
00340
00341 for(unsigned int iDep = 0; iDep< vetoDeps.size(); ++iDep){
00343 if (vetoDeps[iDep]){
00344 delete vetoDeps[iDep];
00345 vetoDeps[iDep] = 0;
00346 }
00347 }
00348 }
00349
00350 template<typename BT>
00351 unsigned int
00352 MuIsolatorResultProducer<BT>::initAssociation(edm::Event& event, CandMap& candMapT) const {
00353 std::string metname = "RecoMuon|MuonIsolationProducers";
00354
00355 typedef reco::IsoDepositMap::container CT;
00356
00357 for (unsigned int iMap = 0; iMap < theDepositConfs.size(); ++iMap){
00358 edm::Handle<reco::IsoDepositMap> depH;
00359 event.getByLabel(theDepositConfs[iMap].tag, depH);
00360 LogDebug(metname) <<"Got Deposits of size "<<depH->size();
00361 if (depH->size()==0) continue;
00362
00365 typename CandMap::handle_type keyH;
00366 event.get(depH->begin().id(), keyH);
00367 candMapT.setHandle(keyH);
00368 typename CT::const_iterator depHCI = depH->begin().begin();
00369 typename CT::const_iterator depEnd = depH->begin().end();
00370 unsigned int keyI=0;
00371 for (; depHCI != depEnd; ++depHCI, ++keyI){
00372
00373 typename CandMap::key_type muPtr(keyH->refAt(keyI));
00375 if (iMap == 0) candMapT.get().push_back(typename CandMap::pair_type(muPtr, DepositContainer(theDepositConfs.size())));
00376 typename CandMap::iterator muI = candMapT.get().begin();
00377 for (; muI != candMapT.get().end(); ++muI){
00378 if (muI->first == muPtr) break;
00379 }
00380 if (muI->first != muPtr){
00381 edm::LogError("MuonIsolationProducers")<<"Failed to align muon map";
00382 }
00383 muI->second[iMap].dep = &*depHCI;
00384 }
00385 }
00386
00387 LogDebug(metname)<<"Picked and aligned nDeps = "<<candMapT.get().size();
00388 return candMapT.get().size();
00389 }
00390
00391 template <typename BT >
00392 void MuIsolatorResultProducer<BT>::initVetos(std::vector<reco::IsoDeposit::Vetos*>& vetos, CandMap& candMapT) const {
00393 std::string metname = "RecoMuon|MuonIsolationProducers";
00394
00395
00396 if (theRemoveOtherVetos){
00397 LogDebug(metname)<<"Start checking for vetos based on input/expected vetos.size of "<<vetos.size()
00398 <<" passed at "<<&vetos
00399 <<" and an input map.size of "<<candMapT.get().size();
00400
00401 unsigned int muI = 0;
00402 for (; muI < candMapT.get().size(); ++muI) {
00403 typename CandMap::key_type mu = candMapT.get()[muI].first;
00404 double d0 = ( (mu->vx() - theBeam.x() )* mu->py() - (mu->vy() - theBeam.y())* mu->px() ) / mu->pt();
00405 LogDebug(metname)<<"Muon at index "<<muI;
00406 if (theVetoCuts.selectAll
00407 || (fabs(mu->eta()) < theVetoCuts.muAbsEtaMax
00408 && mu->pt() > theVetoCuts.muPtMin
00409 && fabs(mu->vz()) < theVetoCuts.muAbsZMax
00410 && fabs(d0) < theVetoCuts.muD0Max
00411 )
00412 ){
00413 LogDebug(metname)<<"muon passes the cuts";
00414 for (unsigned int iDep =0; iDep < candMapT.get()[muI].second.size(); ++iDep){
00415 if (vetos[iDep] == 0) vetos[iDep] = new reco::IsoDeposit::Vetos();
00416
00417 vetos[iDep]->push_back(candMapT.get()[muI].second[iDep].dep->veto());
00418 }
00419 }
00420 }
00421
00422 LogDebug(metname)<<"Assigning vetos";
00423 muI = 0;
00424 for (; muI < candMapT.get().size(); ++muI) {
00425 for(unsigned int iDep =0; iDep < candMapT.get()[muI].second.size(); ++iDep){
00426 candMapT.get()[muI].second[iDep].vetos = vetos[iDep];
00427 }
00428 }
00429 LogDebug(metname)<<"Done with vetos";
00430 }
00431 }
00432
00433
00434
00435 #endif