CMS 3D CMS Logo

CaloTowersCreator.cc
Go to the documentation of this file.
7 // severity level for ECAL
10 
11 //#define EDM_ML_DEBUG
12 
14  : algo_(conf.getParameter<double>("EBThreshold"),
15  conf.getParameter<double>("EEThreshold"),
16 
17  conf.getParameter<bool>("UseEtEBTreshold"),
18  conf.getParameter<bool>("UseEtEETreshold"),
19  conf.getParameter<bool>("UseSymEBTreshold"),
20  conf.getParameter<bool>("UseSymEETreshold"),
21 
22  conf.getParameter<double>("HcalThreshold"),
23  conf.getParameter<double>("HBThreshold"),
24  conf.getParameter<double>("HBThreshold1"),
25  conf.getParameter<double>("HBThreshold2"),
26  conf.getParameter<double>("HESThreshold"),
27  conf.getParameter<double>("HESThreshold1"),
28  conf.getParameter<double>("HEDThreshold"),
29  conf.getParameter<double>("HEDThreshold1"),
30  conf.getParameter<double>("HOThreshold0"),
31  conf.getParameter<double>("HOThresholdPlus1"),
32  conf.getParameter<double>("HOThresholdMinus1"),
33  conf.getParameter<double>("HOThresholdPlus2"),
34  conf.getParameter<double>("HOThresholdMinus2"),
35  conf.getParameter<double>("HF1Threshold"),
36  conf.getParameter<double>("HF2Threshold"),
37  conf.getParameter<std::vector<double> >("EBGrid"),
38  conf.getParameter<std::vector<double> >("EBWeights"),
39  conf.getParameter<std::vector<double> >("EEGrid"),
40  conf.getParameter<std::vector<double> >("EEWeights"),
41  conf.getParameter<std::vector<double> >("HBGrid"),
42  conf.getParameter<std::vector<double> >("HBWeights"),
43  conf.getParameter<std::vector<double> >("HESGrid"),
44  conf.getParameter<std::vector<double> >("HESWeights"),
45  conf.getParameter<std::vector<double> >("HEDGrid"),
46  conf.getParameter<std::vector<double> >("HEDWeights"),
47  conf.getParameter<std::vector<double> >("HOGrid"),
48  conf.getParameter<std::vector<double> >("HOWeights"),
49  conf.getParameter<std::vector<double> >("HF1Grid"),
50  conf.getParameter<std::vector<double> >("HF1Weights"),
51  conf.getParameter<std::vector<double> >("HF2Grid"),
52  conf.getParameter<std::vector<double> >("HF2Weights"),
53  conf.getParameter<double>("EBWeight"),
54  conf.getParameter<double>("EEWeight"),
55  conf.getParameter<double>("HBWeight"),
56  conf.getParameter<double>("HESWeight"),
57  conf.getParameter<double>("HEDWeight"),
58  conf.getParameter<double>("HOWeight"),
59  conf.getParameter<double>("HF1Weight"),
60  conf.getParameter<double>("HF2Weight"),
61  conf.getParameter<double>("EcutTower"),
62  conf.getParameter<double>("EBSumThreshold"),
63  conf.getParameter<double>("EESumThreshold"),
64  conf.getParameter<bool>("UseHO"),
65  // (for momentum reconstruction algorithm)
66  conf.getParameter<int>("MomConstrMethod"),
67  conf.getParameter<double>("MomHBDepth"),
68  conf.getParameter<double>("MomHEDepth"),
69  conf.getParameter<double>("MomEBDepth"),
70  conf.getParameter<double>("MomEEDepth"),
71  conf.getParameter<int>("HcalPhase")),
72 
73  ecalLabels_(conf.getParameter<std::vector<edm::InputTag> >("ecalInputs")),
74  allowMissingInputs_(conf.getParameter<bool>("AllowMissingInputs")),
75 
76  theHcalAcceptSeverityLevel_(conf.getParameter<unsigned int>("HcalAcceptSeverityLevel")),
77 
78  theRecoveredHcalHitsAreUsed_(conf.getParameter<bool>("UseHcalRecoveredHits")),
79  theRecoveredEcalHitsAreUsed_(conf.getParameter<bool>("UseEcalRecoveredHits")),
80 
81  // paramaters controlling the use of rejected hits
82 
83  useRejectedHitsOnly_(conf.getParameter<bool>("UseRejectedHitsOnly")),
84 
85  theHcalAcceptSeverityLevelForRejectedHit_(
86  conf.getParameter<unsigned int>("HcalAcceptSeverityLevelForRejectedHit")),
87 
88  useRejectedRecoveredHcalHits_(conf.getParameter<bool>("UseRejectedRecoveredHcalHits")),
89  useRejectedRecoveredEcalHits_(conf.getParameter<bool>("UseRejectedRecoveredEcalHits"))
90 
91 {
92  algo_.setMissingHcalRescaleFactorForEcal(conf.getParameter<double>("missingHcalRescaleFactorForEcal"));
93 
94  // register for data access
95  tok_hbhe_ = consumes<HBHERecHitCollection>(conf.getParameter<edm::InputTag>("hbheInput"));
96  tok_ho_ = consumes<HORecHitCollection>(conf.getParameter<edm::InputTag>("hoInput"));
97  tok_hf_ = consumes<HFRecHitCollection>(conf.getParameter<edm::InputTag>("hfInput"));
98 
99  const unsigned nLabels = ecalLabels_.size();
100  for (unsigned i = 0; i != nLabels; i++)
101  toks_ecal_.push_back(consumes<EcalRecHitCollection>(ecalLabels_[i]));
102 
111 
112  // get the Ecal severities to be excluded
113  const std::vector<std::string> severitynames =
114  conf.getParameter<std::vector<std::string> >("EcalRecHitSeveritiesToBeExcluded");
115 
116  theEcalSeveritiesToBeExcluded_ = StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynames);
117 
118  // get the Ecal severities to be used for bad towers
119  theEcalSeveritiesToBeUsedInBadTowers_ = StringToEnumValue<EcalSeverityLevel::SeverityLevel>(
120  conf.getParameter<std::vector<std::string> >("EcalSeveritiesToBeUsedInBadTowers"));
121 
122  if (eScales_.instanceLabel.empty())
123  produces<CaloTowerCollection>();
124  else
125  produces<CaloTowerCollection>(eScales_.instanceLabel);
126 
127 #ifdef EDM_ML_DEBUG
128  std::cout << "VI Producer " << (useRejectedHitsOnly_ ? "use rejectOnly " : " ")
129  << (allowMissingInputs_ ? "allowMissing " : " ") << nLabels << ' ' << severitynames.size() << std::endl;
130 #endif
131 }
132 
134  // get the necessary event setup objects...
139  c.get<CaloGeometryRecord>().get(pG);
140  c.get<HcalRecNumberingRecord>().get(htopo);
141  c.get<HcalRecNumberingRecord>().get(cttopo);
142  c.get<CaloGeometryRecord>().get(ctmap);
143 
144  // ECAL channel status map ****************************************
146  c.get<EcalChannelStatusRcd>().get(ecalChStatus);
147  const EcalChannelStatus* dbEcalChStatus = ecalChStatus.product();
148 
149  // HCAL channel status map ****************************************
151  c.get<HcalChannelQualityRcd>().get("withTopo", hcalChStatus);
152 
153  const HcalChannelQuality* dbHcalChStatus = hcalChStatus.product();
154 
155  // Assignment of severity levels **********************************
156  edm::ESHandle<HcalSeverityLevelComputer> hcalSevLvlComputerHndl;
157  c.get<HcalSeverityLevelComputerRcd>().get(hcalSevLvlComputerHndl);
158  const HcalSeverityLevelComputer* hcalSevLvlComputer = hcalSevLvlComputerHndl.product();
159 
160  edm::ESHandle<EcalSeverityLevelAlgo> ecalSevLvlAlgoHndl;
161  c.get<EcalSeverityLevelAlgoRcd>().get(ecalSevLvlAlgoHndl);
162  const EcalSeverityLevelAlgo* ecalSevLvlAlgo = ecalSevLvlAlgoHndl.product();
163 
172  algo_.setGeometry(cttopo.product(), ctmap.product(), htopo.product(), pG.product());
173 
174  // for treatment of problematic and anomalous cells
175 
176  algo_.setHcalChStatusFromDB(dbHcalChStatus);
177  algo_.setEcalChStatusFromDB(dbEcalChStatus);
178 
181 
184 
185  algo_.setHcalSevLvlComputer(hcalSevLvlComputer);
186  algo_.setEcalSevLvlAlgo(ecalSevLvlAlgo);
187 
189 
192 
195 
196 #ifdef EDM_ML_DEBUG
197  std::cout << "VI Produce: " << (useRejectedHitsOnly_ ? "use rejectOnly " : " ")
198  << (allowMissingInputs_ ? "allowMissing " : " ")
199  << (theRecoveredEcalHitsAreUsed_ ? "use RecoveredEcal " : " ") << toks_ecal_.size() << ' '
201  << std::endl;
202 #endif
203 
204  algo_.begin(); // clear the internal buffer
205 
206  // can't chain these in a big OR statement, or else it'll
207  // get triggered for each of the first three events
208  bool check1 = hcalSevLevelWatcher_.check(c);
209  bool check2 = hcalChStatusWatcher_.check(c);
210  bool check3 = caloTowerConstituentsWatcher_.check(c);
211  if (check1 || check2 || check3) {
213  }
214 
215  // check ecal SevLev
218 
219  // ----------------------------------------------------------
220  // For ecal error handling need to
221  // have access to the EB and EE collections at the end of
222  // tower reconstruction.
223 
226 
227  for (std::vector<edm::EDGetTokenT<EcalRecHitCollection> >::const_iterator i = toks_ecal_.begin();
228  i != toks_ecal_.end();
229  i++) {
231 
232  if (!e.getByToken(*i, ec_tmp))
233  continue;
234  if (ec_tmp->empty())
235  continue;
236 
237  // check if this is EB or EE
238  if ((ec_tmp->begin()->detid()).subdetId() == EcalBarrel) {
239  ebHandle = ec_tmp;
240  } else if ((ec_tmp->begin()->detid()).subdetId() == EcalEndcap) {
241  eeHandle = ec_tmp;
242  }
243  }
244 
245  algo_.setEbHandle(ebHandle);
246  algo_.setEeHandle(eeHandle);
247 
248  //-----------------------------------------------------------
249 
250  bool present;
251 
252  // Step A/C: Get Inputs and process (repeatedly)
254  present = e.getByToken(tok_hbhe_, hbhe);
255  if (present || !allowMissingInputs_)
256  algo_.process(*hbhe);
257 
259  present = e.getByToken(tok_ho_, ho);
260  if (present || !allowMissingInputs_)
261  algo_.process(*ho);
262 
264  present = e.getByToken(tok_hf_, hf);
265  if (present || !allowMissingInputs_)
266  algo_.process(*hf);
267 
268  std::vector<edm::EDGetTokenT<EcalRecHitCollection> >::const_iterator i;
269  for (i = toks_ecal_.begin(); i != toks_ecal_.end(); i++) {
271  present = e.getByToken(*i, ec);
272  if (present || !allowMissingInputs_)
273  algo_.process(*ec);
274  }
275 
276  // Step B: Create empty output
277  auto prod = std::make_unique<CaloTowerCollection>();
278 
279  // Step C: Process
280  algo_.finish(*prod);
281 
282 #ifdef EDM_ML_DEBUG
283  int totc = 0;
284  float totE = 0;
286  for (auto const& tw : (*prod)) {
287  totc += tw.constituents().size();
288  totE += tw.energy();
289  totP4 += tw.p4();
290  std::cout << "CaloTowerCreator: " << tw.id() << " with E " << tw.energy() << " and " << tw.constituents().size()
291  << " constituents\n";
292  }
293  std::cout << "VI " << (*prod).size() << " " << totc << " " << totE << " " << totP4 << std::endl;
294 #endif
295 
296  // Step D: Put into the event
297  if (eScales_.instanceLabel.empty())
298  e.put(std::move(prod));
299  else
301 }
302 
305  desc.add<double>("EBSumThreshold", 0.2);
306  desc.add<double>("HF2Weight", 1.0);
307  desc.add<double>("EBWeight", 1.0);
308  desc.add<double>("EESumThreshold", 0.45);
309  desc.add<double>("HOThreshold0", 1.1);
310  desc.add<double>("HOThresholdPlus1", 3.5);
311  desc.add<double>("HOThresholdMinus1", 3.5);
312  desc.add<double>("HOThresholdPlus2", 3.5);
313  desc.add<double>("HOThresholdMinus2", 3.5);
314  desc.add<double>("HBThreshold", 0.7);
315  desc.add<double>("HBThreshold1", 0.7);
316  desc.add<double>("HBThreshold2", 0.7);
317  desc.add<double>("HF1Threshold", 0.5);
318  desc.add<double>("HEDWeight", 1.0);
319  desc.add<double>("EEWeight", 1.0);
320  desc.add<double>("HESWeight", 1.0);
321  desc.add<double>("HF1Weight", 1.0);
322  desc.add<double>("HOWeight", 1.0);
323  desc.add<double>("EBThreshold", 0.07);
324  desc.add<double>("EEThreshold", 0.3);
325  desc.add<double>("HcalThreshold", -1000.0);
326  desc.add<double>("HF2Threshold", 0.85);
327  desc.add<double>("HESThreshold", 0.8);
328  desc.add<double>("HESThreshold1", 0.8);
329  desc.add<double>("HEDThreshold", 0.8);
330  desc.add<double>("HEDThreshold1", 0.8);
331  desc.add<double>("EcutTower", -1000.0);
332  desc.add<double>("HBWeight", 1.0);
333  desc.add<double>("MomHBDepth", 0.2);
334  desc.add<double>("MomHEDepth", 0.4);
335  desc.add<double>("MomEBDepth", 0.3);
336  desc.add<double>("MomEEDepth", 0.0);
337  desc.add<bool>("UseHO", true);
338  desc.add<bool>("UseEtEBTreshold", false);
339  desc.add<bool>("UseSymEBTreshold", true);
340  desc.add<bool>("UseEtEETreshold", false);
341  desc.add<bool>("UseSymEETreshold", true);
342  desc.add<bool>("UseHcalRecoveredHits", true);
343  desc.add<bool>("UseEcalRecoveredHits", false);
344  desc.add<bool>("UseRejectedHitsOnly", false);
345  desc.add<bool>("UseRejectedRecoveredHcalHits", true);
346  desc.add<bool>("UseRejectedRecoveredEcalHits", false);
347  desc.add<double>("missingHcalRescaleFactorForEcal", 0.0);
348  desc.add<bool>("AllowMissingInputs", false);
349  desc.add<std::vector<double> >("HBGrid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
350  desc.add<std::vector<double> >("EEWeights", {1.0, 1.0, 1.0, 1.0, 1.0});
351  desc.add<std::vector<double> >("HF2Weights", {1.0, 1.0, 1.0, 1.0, 1.0});
352  desc.add<std::vector<double> >("HOWeights", {1.0, 1.0, 1.0, 1.0, 1.0});
353  desc.add<std::vector<double> >("EEGrid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
354  desc.add<std::vector<double> >("HBWeights", {1.0, 1.0, 1.0, 1.0, 1.0});
355  desc.add<std::vector<double> >("HF2Grid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
356  desc.add<std::vector<double> >("HEDWeights", {1.0, 1.0, 1.0, 1.0, 1.0});
357  desc.add<std::vector<double> >("HF1Grid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
358  desc.add<std::vector<double> >("EBWeights", {1.0, 1.0, 1.0, 1.0, 1.0});
359  desc.add<std::vector<double> >("HF1Weights", {1.0, 1.0, 1.0, 1.0, 1.0});
360  desc.add<std::vector<double> >("HESGrid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
361  desc.add<std::vector<double> >("HESWeights", {1.0, 1.0, 1.0, 1.0, 1.0});
362  desc.add<std::vector<double> >("HEDGrid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
363  desc.add<std::vector<double> >("HOGrid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
364  desc.add<std::vector<double> >("EBGrid", {-1.0, 1.0, 10.0, 100.0, 1000.0});
365  desc.add<edm::InputTag>("hfInput", edm::InputTag("hfreco"));
366  desc.add<edm::InputTag>("hbheInput", edm::InputTag("hbhereco"));
367  desc.add<edm::InputTag>("hoInput", edm::InputTag("horeco"));
368  desc.add<std::vector<edm::InputTag> >(
369  "ecalInputs", {edm::InputTag("ecalRecHit", "EcalRecHitsEB"), edm::InputTag("ecalRecHit", "EcalRecHitsEE")});
370  desc.add<int>("MomConstrMethod", 1);
371  desc.add<unsigned int>("HcalAcceptSeverityLevel", 9);
372  desc.add<std::vector<std::string> >("EcalRecHitSeveritiesToBeExcluded", {"kTime", "kWeird", "kBad"});
373  desc.add<unsigned int>("HcalAcceptSeverityLevelForRejectedHit", 9999);
374  desc.add<std::vector<std::string> >("EcalSeveritiesToBeUsedInBadTowers", {});
375  desc.add<int>("HcalPhase", 0);
376 
377  descriptions.addDefault(desc);
378 }
CaloTowersCreator(const edm::ParameterSet &ps)
double HF2Scale
Definition: EScales.h:20
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
void setEcalChStatusFromDB(const EcalChannelStatus *s)
CaloTowersCreationAlgo algo_
double EEScale
Definition: EScales.h:14
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void produce(edm::Event &e, const edm::EventSetup &c) override
void setHcalChStatusFromDB(const HcalChannelQuality *s)
void finish(CaloTowerCollection &destCollection)
void setEeHandle(const edm::Handle< EcalRecHitCollection > ee)
double HOScale
Definition: EScales.h:18
std::vector< int > theEcalSeveritiesToBeExcluded_
double HF1Scale
Definition: EScales.h:19
edm::EDGetTokenT< HORecHitCollection > tok_ho_
void setGeometry(const CaloTowerTopology *cttopo, const CaloTowerConstituentsMap *ctmap, const HcalTopology *htopo, const CaloGeometry *geo)
double HEDScale
Definition: EScales.h:17
void setEbHandle(const edm::Handle< EcalRecHitCollection > eb)
void setUseRejectedRecoveredEcalHits(bool flag)
void addDefault(ParameterSetDescription const &psetDescription)
void setEcalSeveritiesToBeExcluded(const std::vector< int > &ecalSev)
void setHcalAcceptSeverityLevelForRejectedHit(unsigned int level)
void setHcalSevLvlComputer(const HcalSeverityLevelComputer *c)
std::vector< edm::EDGetTokenT< EcalRecHitCollection > > toks_ecal_
edm::EDGetTokenT< HBHERecHitCollection > tok_hbhe_
void SetEcalSeveritiesToBeUsedInBadTowers(const std::vector< int > &ecalSev)
void setRecoveredEcalHitsAreUsed(bool flag)
double EBScale
Definition: EScales.h:13
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double HBScale
Definition: EScales.h:15
edm::ESWatcher< HcalChannelQualityRcd > hcalChStatusWatcher_
void process(const HBHERecHitCollection &hbhe)
std::string instanceLabel
Definition: EScales.h:21
unsigned int theHcalAcceptSeverityLevelForRejectedHit_
void setRecoveredHcalHitsAreUsed(bool flag)
void setUseRejectedHitsOnly(bool flag)
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:52
void setMissingHcalRescaleFactorForEcal(float factor)
unsigned int theHcalAcceptSeverityLevel_
HLT enums.
T get() const
Definition: EventSetup.h:73
void setHcalAcceptSeverityLevel(unsigned int level)
std::vector< edm::InputTag > ecalLabels_
double HESScale
Definition: EScales.h:16
edm::ESWatcher< HcalSeverityLevelComputerRcd > hcalSevLevelWatcher_
void setEcalSevLvlAlgo(const EcalSeverityLevelAlgo *a)
void setUseRejectedRecoveredHcalHits(bool flag)
edm::ESWatcher< IdealGeometryRecord > caloTowerConstituentsWatcher_
T const * product() const
Definition: ESHandle.h:86
std::vector< int > theEcalSeveritiesToBeUsedInBadTowers_
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: LeafCandidate.h:23
def move(src, dest)
Definition: eostools.py:511
edm::EDGetTokenT< HFRecHitCollection > tok_hf_
const_iterator begin() const
edm::ESWatcher< EcalSeverityLevelAlgoRcd > ecalSevLevelWatcher_