CMS 3D CMS Logo

IsoDepositIsolator.cc
Go to the documentation of this file.
2 #include <sstream>
3 
6 
7 #include <boost/regex.hpp>
8 
11 using namespace reco::isodeposit;
12 
13 IsoDepositIsolator::IsoDepositIsolator(const edm::ParameterSet &conf, edm::ConsumesCollector & iC, bool withCut) :
14  BaseIsolator(conf,iC,withCut), deltaR_(conf.getParameter<double>("deltaR")),
15  mode_(Sum), skipDefaultVeto_(false),
16  inputIsoDepositToken_(iC.consumes<Isolation>(input_))
17 {
18  if (conf.exists("mode")) {
19  std::string mode = conf.getParameter<std::string>("mode");
20  if (mode == "sum") mode_ = Sum;
21  else if (mode == "sumRelative") mode_ = SumRelative;
22  else if (mode == "max") mode_ = Max;
23  else if (mode == "maxRelative") mode_ = MaxRelative;
24  else if (mode == "sum2") mode_ = Sum2;
25  else if (mode == "sum2Relative") mode_ = Sum2Relative;
26  else if (mode == "count") mode_ = Count;
27  else throw cms::Exception("Not Implemented") << "Mode '" << mode << "' not implemented. " <<
28  "Supported modes are 'sum', 'sumRelative', 'max', 'maxRelative', 'sum2', 'sum2Relative', 'count'." <<
29  "New methods can be easily implemented if requested.";
30  }
31 
32  if (conf.exists("veto")) {
33  vetos_.push_back(new ConeVeto(Direction(), conf.getParameter<double>("veto")));
34  }
35  if (conf.exists("threshold")) {
36  vetos_.push_back(new ThresholdVeto(conf.getParameter<double>("threshold")));
37  }
38  if (conf.exists("skipDefaultVeto")) {
39  skipDefaultVeto_ = conf.getParameter<bool>("skipDefaultVeto");
40  }
41 
42  if (conf.exists("vetos")) { // expert configuration
43  if (!vetos_.empty())
44  throw cms::Exception("Configuration") << "You can't both configure this module with 'veto'/'threshold' AND with 'vetos'!";
45  if (!conf.exists("skipDefaultVeto"))
46  throw cms::Exception("Configuration") << "When using the expert configuration variable 'vetos' you must specify the value for 'skipDefaultVeto' too.";
47 
48  typedef std::vector<std::string> vstring;
49  vstring vetos = conf.getParameter< vstring >("vetos");
51  for (vstring::const_iterator it = vetos.begin(), ed = vetos.end(); it != ed; ++it) {
52  vetos_.push_back( IsoDepositVetoFactory::make( it->c_str(), evdep, iC ) );
53  if (evdep != 0) evdepVetos_.push_back(evdep);
54  }
55  }
56 
57 }
58 
60  for (AbsVetos::iterator it = vetos_.begin(), ed = vetos_.end(); it != ed; ++it) {
61  delete *it;
62  }
63 }
64 
65 void
67  event.getByToken(inputIsoDepositToken_, handle_);
68  for (EventDependentAbsVetos::iterator it = evdepVetos_.begin(), ed = evdepVetos_.end(); it != ed; ++it) {
69  (*it)->setEvent(event,eventSetup);
70  }
71 }
72 
73 void
75  handle_.clear();
76 }
77 
80  using namespace std;
81  ostringstream oss;
82  oss << input_.encode() << "(dR=" << deltaR_ <<")";
83  return oss.str();
84 }
85 
86 float
88  const reco::IsoDeposit &dep = handle_->get(id, index);
89 
90  double eta = dep.eta(), phi = dep.phi(); // better to center on the deposit direction that could be, e.g., the impact point at calo
91  for (AbsVetos::const_iterator it = vetos_.begin(), ed = vetos_.end(); it != ed; ++it) {
92  (const_cast<AbsVeto *>(*it))->centerOn(eta, phi); // I need the const_cast to be able to 'move' the veto
93  }
94  switch (mode_) {
95  case Count: return dep.countWithin(deltaR_, vetos_, skipDefaultVeto_);
96  case Sum: return dep.sumWithin(deltaR_, vetos_, skipDefaultVeto_);
97  case SumRelative: return dep.sumWithin(deltaR_, vetos_, skipDefaultVeto_) / dep.candEnergy() ;
98  case Sum2: return dep.sum2Within(deltaR_, vetos_, skipDefaultVeto_);
99  case Sum2Relative: return dep.sum2Within(deltaR_, vetos_, skipDefaultVeto_) / (dep.candEnergy() * dep.candEnergy()) ;
100  case Max: return dep.maxWithin(deltaR_, vetos_, skipDefaultVeto_);
101  case MaxRelative: return dep.maxWithin(deltaR_, vetos_, skipDefaultVeto_) / dep.candEnergy() ;
102  }
103  throw cms::Exception("Logic error") << "Should not happen at " << __FILE__ << ", line " << __LINE__; // avoid gcc warning
104 }
105 
static reco::isodeposit::AbsVeto * make(const char *string, edm::ConsumesCollector &iC)
T getParameter(std::string const &) const
virtual void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
double candEnergy() const
Get energy or pT attached to cand trajectory.
Definition: IsoDeposit.h:136
double sum2Within(double coneSize, const AbsVetos &vetos=AbsVetos(), bool skipDepositVeto=false) const
Definition: IsoDeposit.cc:146
double eta() const
Definition: IsoDeposit.h:74
vector< string > vstring
Definition: ExoticaDQM.cc:8
reco::isodeposit::AbsVetos vetos_
double phi() const
Definition: IsoDeposit.h:75
bool exists(std::string const &parameterName) const
checks if a parameter exists
double deltaR_
double countWithin(double coneSize, const AbsVetos &vetos=AbsVetos(), bool skipDepositVeto=false) const
Definition: IsoDeposit.cc:134
double maxWithin(double coneSize, const AbsVetos &vetos=AbsVetos(), bool skipDepositVeto=false) const
Definition: IsoDeposit.cc:150
std::string encode() const
Definition: InputTag.cc:165
double sumWithin(double coneSize, const AbsVetos &vetos=AbsVetos(), bool skipDepositVeto=false) const
Definition: IsoDeposit.cc:138
edm::Handle< Isolation > handle_
reco::isodeposit::EventDependentAbsVetos evdepVetos_
edm::EDGetTokenT< Isolation > inputIsoDepositToken_
virtual float getValue(const edm::ProductID &id, size_t index) const
virtual std::string description() const
Definition: event.py:1