CMS 3D CMS Logo

EgammaHLTFilteredObjProducer.h
Go to the documentation of this file.
1 #ifndef RECOEGAMMA_EGAMMAHLTPRODUCERS_EGAMMAHLTFILTEREDOBJPRODUCER_H
2 #define RECOEGAMMA_EGAMMAHLTPRODUCERS_EGAMMAHLTFILTEREDOBJPRODUCER_H
3 
4 
14 
18 
19 namespace {
20  template<typename T> edm::Handle<T> getHandle(const edm::Event& event,const edm::EDGetTokenT<T>& token)
21  {
23  event.getByToken(token,handle);
24  return handle;
25  }
26 
27 }
28 
29 template <typename OutCollType>
31 public:
32  class SelectionCut {
33  public:
35  ebCut_(pset.getParameter<edm::ParameterSet>("barrelCut")),
36  eeCut_(pset.getParameter<edm::ParameterSet>("endcapCut")),
37  varToken_(iC.consumes<reco::RecoEcalCandidateIsolationMap>(pset.getParameter<edm::InputTag>("var")))
38  {}
39 
40  ~SelectionCut()=default;
41 
43  CutValues cut = std::abs(cand->eta())<1.479 ? ebCut_ : eeCut_;
44  return cut(*cand,getVar(cand));
45  }
46 
47  float getVar(const reco::RecoEcalCandidateRef& cand)const{
48  auto res = varHandle_->find(cand);
49  if(res!=varHandle_->end()) return res->val;
50  else{
51  //FIX ME: add some provenance info to this
52  throw cms::Exception("LogicError") <<" candidate not found in collection ";
53  }
54  }
55 
56  void getHandles(const edm::Event& event){
57  event.getByToken(varToken_,varHandle_);
58  }
59  private:
60  struct CutValues {
61  float cut;
62  float cutOverE;
63  float cutOverE2;
64  bool useEt;
65  std::function<bool(float,float)> compFunc;
66 
68  cut(pset.getParameter<double>("cut")),
69  cutOverE(pset.getParameter<double>("cutOverE")),
70  cutOverE2(pset.getParameter<double>("cutOverE2")),
71  useEt(pset.getParameter<bool>("useEt")),
72  compFunc(std::less<float>()) {}
73 
74  bool operator()(const reco::RecoEcalCandidate& cand,float value)const{
75  if(compFunc(value,cut)) return true;
76  else{
77  float energyInv = useEt ? 1./cand.et() : 1./cand.energy();
78  return compFunc(value*energyInv,cutOverE) ||
79  compFunc(value*energyInv*energyInv,cutOverE2);
80  }
81  }
82  };
83 
88  };
89 
91  ~EgammaHLTFilteredObjProducer() override =default;
92  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);
93 
94  void produce(edm::Event&, const edm::EventSetup&) override;
95 
96 private:
97  //different collection types may need to specialise this function
98  //eg if you wanted superclusters it would output.push_back(cand->superCluster())
99  static void addObj(const reco::RecoEcalCandidateRef& cand,OutCollType& output){
100  output.push_back(cand);
101  }
102 
104  std::vector<SelectionCut> cuts_;
105 };
106 
107 
108 template<typename OutCollType>
111  candsToken_(consumes<reco::RecoEcalCandidateCollection>(pset.getParameter<edm::InputTag>("cands")))
112 {
113  const auto& cutPsets = pset.getParameter<std::vector<edm::ParameterSet> >("cuts");
114  for(auto& cutPset : cutPsets){
115  cuts_.push_back(SelectionCut(cutPset,consumesCollector()));
116  }
117 
118  produces<OutCollType>();
119 
120 }
121 
122 template<typename OutCollType>
125 {
127  desc.add<edm::InputTag>("cands",edm::InputTag("hltEgammaCandidates"));
128 
130  edm::ParameterSetDescription regionCutsDesc;
131  regionCutsDesc.add<double>("cut",-1);
132  regionCutsDesc.add<double>("cutOverE",-1);
133  regionCutsDesc.add<double>("cutOverE2",-1);
134  regionCutsDesc.add<bool>("useEt",false);
135  edm::ParameterSet cutDefaults;
136  cutDefaults.addParameter<double>("cutOverE",0.2);
137  cutDefaults.addParameter<double>("useEt",false);
138 
139  cutsDesc.add<edm::ParameterSetDescription>("barrelCut",regionCutsDesc);
140  cutsDesc.add<edm::ParameterSetDescription>("endcapCut",regionCutsDesc);
141  cutsDesc.add<edm::InputTag>("var",edm::InputTag("hltEgammaHoverE"));
142 
144  defaults.addParameter<edm::InputTag>("var",edm::InputTag("hltEgammaHoverE"));
145  defaults.addParameter<edm::ParameterSet>("barrelCut",cutDefaults);
146  defaults.addParameter<edm::ParameterSet>("endcapCut",cutDefaults);
147  desc.addVPSet("cuts",cutsDesc,std::vector<edm::ParameterSet>{defaults});
148  descriptions.addWithDefaultLabel(desc);
149 }
150 
151 template<typename OutCollType>
154 {
155  for(auto& cut : cuts_) cut.getHandles(iEvent);
156  auto candsHandle = getHandle(iEvent,candsToken_);
157 
158  auto output = std::make_unique<OutCollType>();
159 
160  for(size_t candNr=0;candNr<candsHandle->size();candNr++){
161  reco::RecoEcalCandidateRef candRef(candsHandle,candNr);
162  bool passAllCuts=true;
163  for(const auto& cut: cuts_){
164  if(!cut(candRef)){
165  passAllCuts=false;
166  break;
167  }
168  }
169  if(passAllCuts) addObj(candRef,*output);
170  }
171 
172  iEvent.put(std::move(output));
173 }
174 
175 #endif
T getParameter(std::string const &) const
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
edm::AssociationMap< edm::OneToValue< std::vector< reco::RecoEcalCandidate >, float > > RecoEcalCandidateIsolationMap
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
ParameterDescriptionBase * addVPSet(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
const_iterator end() const
last iterator over the map (read only)
EgammaHLTFilteredObjProducer(const edm::ParameterSet &pset)
edm::EDGetTokenT< reco::RecoEcalCandidateIsolationMap > varToken_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const_iterator find(const key_type &k) const
find element with specified reference key
Definition: Electron.h:6
void produce(edm::Event &, const edm::EventSetup &) override
int iEvent
Definition: GenABIO.cc:224
def defaults(locpath, dataType, var)
double et() const final
transverse energy
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:125
double energy() const final
energy
~EgammaHLTFilteredObjProducer() override=default
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Definition: value.py:1
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::Handle< reco::RecoEcalCandidateIsolationMap > varHandle_
static void addObj(const reco::RecoEcalCandidateRef &cand, OutCollType &output)
SelectionCut(const edm::ParameterSet &pset, edm::ConsumesCollector &&iC)
float getVar(const reco::RecoEcalCandidateRef &cand) const
bool operator()(const reco::RecoEcalCandidate &cand, float value) const
bool operator()(const reco::RecoEcalCandidateRef &cand) const
std::vector< RecoEcalCandidate > RecoEcalCandidateCollection
collectin of RecoEcalCandidate objects
fixed size matrix
HLT enums.
edm::EDGetTokenT< reco::RecoEcalCandidateCollection > candsToken_
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1