CMS 3D CMS Logo

HLTHcalPFClusterIsolationProducer.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <vector>
3 #include <memory>
4 
13 
16 
19 
22 
24 
27 
30 
33 
34 template <typename T1>
36  typedef std::vector<T1> T1Collection;
39 
40 public:
43 
44  void produce(edm::StreamID sid, edm::Event&, const edm::EventSetup&) const override;
45  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
46 
47 private:
53 
54  const bool useHF_;
55 
56  const double drMax_;
57  const double drVetoBarrel_;
58  const double drVetoEndcap_;
59  const double etaStripBarrel_;
60  const double etaStripEndcap_;
61  const double energyBarrel_;
62  const double energyEndcap_;
63  const bool useEt_;
64 
65  const bool doRhoCorrection_;
66  const double rhoMax_;
67  const double rhoScale_;
68  const std::vector<double> effectiveAreas_;
69  const std::vector<double> absEtaLowEdges_;
70 };
71 
72 template <typename T1>
74  : pfClusterProducerHCAL_(
75  consumes<reco::PFClusterCollection>(config.getParameter<edm::InputTag>("pfClusterProducerHCAL"))),
76  rhoProducer_(consumes<double>(config.getParameter<edm::InputTag>("rhoProducer"))),
77  pfClusterProducerHFEM_(
78  consumes<reco::PFClusterCollection>(config.getParameter<edm::InputTag>("pfClusterProducerHFEM"))),
79  pfClusterProducerHFHAD_(
80  consumes<reco::PFClusterCollection>(config.getParameter<edm::InputTag>("pfClusterProducerHFHAD"))),
81  useHF_(config.getParameter<bool>("useHF")),
82  drMax_(config.getParameter<double>("drMax")),
83  drVetoBarrel_(config.getParameter<double>("drVetoBarrel")),
84  drVetoEndcap_(config.getParameter<double>("drVetoEndcap")),
85  etaStripBarrel_(config.getParameter<double>("etaStripBarrel")),
86  etaStripEndcap_(config.getParameter<double>("etaStripEndcap")),
87  energyBarrel_(config.getParameter<double>("energyBarrel")),
88  energyEndcap_(config.getParameter<double>("energyEndcap")),
89  useEt_(config.getParameter<bool>("useEt")),
90  doRhoCorrection_(config.getParameter<bool>("doRhoCorrection")),
91  rhoMax_(config.getParameter<double>("rhoMax")),
92  rhoScale_(config.getParameter<double>("rhoScale")),
93  effectiveAreas_(config.getParameter<std::vector<double>>("effectiveAreas")),
94  absEtaLowEdges_(config.getParameter<std::vector<double>>("absEtaLowEdges")) {
95  if (doRhoCorrection_) {
96  if (absEtaLowEdges_.size() != effectiveAreas_.size())
97  throw cms::Exception("IncompatibleVects") << "absEtaLowEdges and effectiveAreas should be of the same size. \n";
98 
99  if (absEtaLowEdges_.at(0) != 0.0)
100  throw cms::Exception("IncompleteCoverage") << "absEtaLowEdges should start from 0. \n";
101 
102  for (unsigned int aIt = 0; aIt < absEtaLowEdges_.size() - 1; aIt++) {
103  if (!(absEtaLowEdges_.at(aIt) < absEtaLowEdges_.at(aIt + 1)))
104  throw cms::Exception("ImproperBinning") << "absEtaLowEdges entries should be in increasing order. \n";
105  }
106  }
107 
108  std::string recoCandidateProducerName = "recoCandidateProducer";
111  recoCandidateProducerName = "recoEcalCandidateProducer";
112  recoCandidateProducer_ = consumes<T1Collection>(config.getParameter<edm::InputTag>(recoCandidateProducerName));
113 
114  produces<T1IsolationMap>();
115 }
116 
117 template <typename T1>
119 
120 template <typename T1>
122  std::string recoCandidateProducerName = "recoCandidateProducer";
125  recoCandidateProducerName = "recoEcalCandidateProducer";
126 
128  desc.add<edm::InputTag>(recoCandidateProducerName, edm::InputTag("hltL1SeededRecoEcalCandidatePF"));
129  desc.add<edm::InputTag>("pfClusterProducerHCAL", edm::InputTag("hltParticleFlowClusterHCAL"));
130  desc.ifValue(
131  edm::ParameterDescription<bool>("useHF", false, true),
133  "pfClusterProducerHFEM", edm::InputTag("hltParticleFlowClusterHFEM"), true) and
135  "pfClusterProducerHFHAD", edm::InputTag("hltParticleFlowClusterHFHAD"), true)) or
136  false >> (edm::ParameterDescription<edm::InputTag>("pfClusterProducerHFEM", edm::InputTag(""), true) and
137  edm::ParameterDescription<edm::InputTag>("pfClusterProducerHFHAD", edm::InputTag(""), true)));
138  desc.add<edm::InputTag>("rhoProducer", edm::InputTag("fixedGridRhoFastjetAllCalo"));
139  desc.add<bool>("doRhoCorrection", false);
140  desc.add<double>("rhoMax", 9.9999999E7);
141  desc.add<double>("rhoScale", 1.0);
142  desc.add<double>("drMax", 0.3);
143  desc.add<double>("drVetoBarrel", 0.0);
144  desc.add<double>("drVetoEndcap", 0.0);
145  desc.add<double>("etaStripBarrel", 0.0);
146  desc.add<double>("etaStripEndcap", 0.0);
147  desc.add<double>("energyBarrel", 0.0);
148  desc.add<double>("energyEndcap", 0.0);
149  desc.add<bool>("useEt", true);
150  desc.add<std::vector<double>>("effectiveAreas", {0.2, 0.25}); // 2016 post-ichep sinEle default
151  desc.add<std::vector<double>>("absEtaLowEdges", {0.0, 1.479}); // Barrel, Endcap
153 }
154 
155 template <typename T1>
158  const edm::EventSetup&) const {
159  edm::Handle<double> rhoHandle;
160  double rho = 0.0;
161  if (doRhoCorrection_) {
162  iEvent.getByToken(rhoProducer_, rhoHandle);
163  rho = *(rhoHandle.product());
164  }
165 
166  if (rho > rhoMax_)
167  rho = rhoMax_;
168 
169  rho = rho * rhoScale_;
170 
171  edm::Handle<T1Collection> recoCandHandle;
172 
173  std::vector<edm::Handle<reco::PFClusterCollection>> clusterHandles;
174  edm::Handle<reco::PFClusterCollection> clusterHcalHandle;
175  edm::Handle<reco::PFClusterCollection> clusterHfemHandle;
176  edm::Handle<reco::PFClusterCollection> clusterHfhadHandle;
177 
178  iEvent.getByToken(recoCandidateProducer_, recoCandHandle);
179  iEvent.getByToken(pfClusterProducerHCAL_, clusterHcalHandle);
180  //const reco::PFClusterCollection* forIsolationHcal = clusterHcalHandle.product();
181  clusterHandles.push_back(clusterHcalHandle);
182 
183  if (useHF_) {
184  iEvent.getByToken(pfClusterProducerHFEM_, clusterHfemHandle);
185  clusterHandles.push_back(clusterHfemHandle);
186  iEvent.getByToken(pfClusterProducerHFHAD_, clusterHfhadHandle);
187  clusterHandles.push_back(clusterHfhadHandle);
188  }
189 
190  T1IsolationMap recoCandMap(recoCandHandle);
192  drMax_, drVetoBarrel_, drVetoEndcap_, etaStripBarrel_, etaStripEndcap_, energyBarrel_, energyEndcap_, useEt_);
193 
194  for (unsigned int iReco = 0; iReco < recoCandHandle->size(); iReco++) {
195  T1Ref candRef(recoCandHandle, iReco);
196 
197  float sum = isoAlgo.getSum(candRef, clusterHandles);
198 
199  if (doRhoCorrection_) {
200  int iEA = -1;
201  auto cEta = std::abs(candRef->eta());
202  for (int bIt = absEtaLowEdges_.size() - 1; bIt > -1; bIt--) {
203  if (cEta >= absEtaLowEdges_[bIt]) {
204  iEA = bIt;
205  break;
206  }
207  }
208  sum = sum - rho * effectiveAreas_[iEA];
209  }
210 
211  recoCandMap.insert(candRef, sum);
212  }
213 
214  iEvent.put(std::make_unique<T1IsolationMap>(recoCandMap));
215 }
216 
219 
void produce(edm::StreamID sid, edm::Event &, const edm::EventSetup &) const override
T const * product() const
Definition: Handle.h:70
edm::AssociationMap< edm::OneToValue< std::vector< T1 >, float > > T1IsolationMap
Definition: config.py:1
std::string defaultModuleLabel()
const edm::EDGetTokenT< reco::PFClusterCollection > pfClusterProducerHFHAD_
int iEvent
Definition: GenABIO.cc:224
const edm::EDGetTokenT< reco::PFClusterCollection > pfClusterProducerHCAL_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
HLTHcalPFClusterIsolationProducer< reco::RecoEcalCandidate > EgammaHLTHcalPFClusterIsolationProducer
double getSum(const T1Ref candRef, const std::vector< edm::Handle< reco::PFClusterCollection >> &clusterHandles)
std::vector< l1t::PFCluster > PFClusterCollection
Definition: PFCluster.h:87
edm::EDGetTokenT< T1Collection > recoCandidateProducer_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void insert(const key_type &k, const data_type &v)
insert an association
void add(std::string const &label, ParameterSetDescription const &psetDescription)
fixed size matrix
HLT enums.
const edm::EDGetTokenT< reco::PFClusterCollection > pfClusterProducerHFEM_
HLTHcalPFClusterIsolationProducer(const edm::ParameterSet &)
HLTHcalPFClusterIsolationProducer< reco::RecoChargedCandidate > MuonHLTHcalPFClusterIsolationProducer