40 std::atomic<int> JetIDHelper::sanity_checks_left_{100};
45 useRecHits_ =
pset.getParameter<
bool>(
"useRecHits");
66 fSubDetector1_ = -1.0;
67 fSubDetector2_ = -1.0;
68 fSubDetector3_ = -1.0;
69 fSubDetector4_ = -1.0;
70 restrictedEMF_ = -1.0;
73 approximatefHPD_ = -1.0;
74 approximatefRBX_ = -1.0;
76 fEB_ = fEE_ = fHB_ = fHE_ = fHO_ = fLong_ = fShort_ = -1.0;
77 fLS_ = fHFOOT_ = -1.0;
89 "If using RecHits to calculate the precise jet ID variables that need them, "
90 "their sources need to be specified");
107 if (E_Had + E_EM > 0)
108 restrictedEMF_ = E_EM / (E_EM + E_Had);
110 cout <<
"jet pT: " <<
jet.pt() <<
", eT: " <<
jet.et() <<
", E: " <<
jet.energy() <<
" rEMF: " << restrictedEMF_
116 vector<subtower> subtowers, Ecal_subtowers, Hcal_subtowers, HO_subtowers;
117 vector<double> HPD_energies, RBX_energies;
120 event,
jet, subtowers, Ecal_subtowers, Hcal_subtowers, HO_subtowers, HPD_energies, RBX_energies, iDbg);
123 for (
unsigned int i = 0;
i < subtowers.size(); ++
i)
124 cout <<
" " << subtowers[
i].E <<
"," << subtowers[
i].Nhit;
126 for (
unsigned int i = 0;
i < Ecal_subtowers.size(); ++
i)
127 cout <<
" " << Ecal_subtowers[
i].E <<
"," << Ecal_subtowers[
i].Nhit;
129 for (
unsigned int i = 0;
i < Hcal_subtowers.size(); ++
i)
130 cout <<
" " << Hcal_subtowers[
i].E <<
"," << Hcal_subtowers[
i].Nhit;
132 for (
unsigned int i = 0;
i < HO_subtowers.size(); ++
i)
133 cout <<
" " << HO_subtowers[
i].E <<
"," << HO_subtowers[
i].Nhit;
135 for (
unsigned int i = 0;
i < HPD_energies.size(); ++
i)
136 cout <<
" " << HPD_energies[
i];
138 for (
unsigned int i = 0;
i < RBX_energies.size(); ++
i)
139 cout <<
" " << RBX_energies[
i];
144 hitsInN90_ = hitsInNCarrying(0.9, subtowers);
145 nHCALTowers_ = Hcal_subtowers.size();
146 vector<subtower>::const_iterator it;
147 it = find_if(Ecal_subtowers.begin(), Ecal_subtowers.end(),
hasNonPositiveE);
148 nECALTowers_ = it - Ecal_subtowers.begin();
151 double max_HPD_energy = 0., max_RBX_energy = 0.;
152 std::vector<double>::const_iterator it_max_HPD_energy = std::max_element(HPD_energies.begin(), HPD_energies.end());
153 std::vector<double>::const_iterator it_max_RBX_energy = std::max_element(RBX_energies.begin(), RBX_energies.end());
154 if (it_max_HPD_energy != HPD_energies.end()) {
155 max_HPD_energy = *it_max_HPD_energy;
157 if (it_max_RBX_energy != RBX_energies.end()) {
158 max_RBX_energy = *it_max_RBX_energy;
160 if (
jet.energy() > 0) {
161 if (!HPD_energies.empty())
162 approximatefHPD_ = max_HPD_energy /
jet.energy();
163 if (!RBX_energies.empty())
164 approximatefRBX_ = max_HPD_energy /
jet.energy();
171 vector<double> energies, subdet_energies, Ecal_energies, Hcal_energies, HO_energies;
172 double LS_bad_energy, HF_OOT_energy;
173 classifyJetComponents(
event,
188 n90Hits_ = nCarrying(0.9, energies);
191 if (
jet.energy() > 0) {
192 if (!HPD_energies.empty())
193 fHPD_ = max_HPD_energy /
jet.energy();
194 if (!RBX_energies.empty())
195 fRBX_ = max_RBX_energy /
jet.energy();
196 if (!subdet_energies.empty())
197 fSubDetector1_ = subdet_energies.at(0) /
jet.energy();
198 if (subdet_energies.size() > 1)
199 fSubDetector2_ = subdet_energies.at(1) /
jet.energy();
200 if (subdet_energies.size() > 2)
201 fSubDetector3_ = subdet_energies.at(2) /
jet.energy();
202 if (subdet_energies.size() > 3)
203 fSubDetector4_ = subdet_energies.at(3) /
jet.energy();
204 fLS_ = LS_bad_energy /
jet.energy();
205 fHFOOT_ = HF_OOT_energy /
jet.energy();
207 if (iDbg > 0 && sanity_checks_left_.load(std::memory_order_acquire) > 0) {
208 --sanity_checks_left_;
209 double EH_sum = accumulate(Ecal_energies.begin(), Ecal_energies.end(), 0.);
210 EH_sum = accumulate(Hcal_energies.begin(), Hcal_energies.end(), EH_sum);
211 double EHO_sum = accumulate(HO_energies.begin(), HO_energies.end(), EH_sum);
212 if (
jet.energy() > 0.001 &&
abs(EH_sum /
jet.energy() - 1) > 0.01 &&
abs(EHO_sum /
jet.energy() - 1) > 0.01)
214 <<
") does not match the total energy in the recHits (" << EHO_sum
215 <<
", or without HO: " << EH_sum <<
") . Are these the right recHits? "
216 <<
"Were jet energy corrections mistakenly applied before jet ID? A bug?";
218 cout <<
"Sanity check - E: " <<
jet.energy() <<
" =? EH_sum: " << EH_sum <<
" / EHO_sum: " << EHO_sum << endl;
223 cout <<
"DBG - fHPD: " << fHPD_ <<
", fRBX: " << fRBX_ <<
", nh90: " << n90Hits_ <<
", fLS: " << fLS_
224 <<
", fHFOOT: " << fHFOOT_ << endl;
225 cout <<
" -~fHPD: " << approximatefHPD_ <<
", ~fRBX: " << approximatefRBX_ <<
", hits in n90: " << hitsInN90_
227 cout <<
" - nHCALTowers: " << nHCALTowers_ <<
", nECALTowers: " << nECALTowers_
228 <<
"; subdet fractions: " << fSubDetector1_ <<
", " << fSubDetector2_ <<
", " << fSubDetector3_ <<
", "
229 << fSubDetector4_ << endl;
236 for (
unsigned int i = 0;
i < descending_energies.size(); ++
i)
237 totalE += descending_energies[
i];
240 unsigned int NC = descending_energies.size();
243 for (
unsigned int i = descending_energies.size();
i > 0; --
i) {
244 runningE += descending_energies[
i - 1];
245 if (runningE < (1 -
fraction) * totalE)
252 const std::vector<subtower> &descending_towers) {
254 for (
unsigned int i = 0;
i < descending_towers.size(); ++
i)
255 totalE += descending_towers[
i].E;
261 for (
unsigned int i = descending_towers.size();
i > 0; --
i) {
262 runningE += descending_towers[
i - 1].E;
263 if (runningE >= (1 -
fraction) * totalE)
264 NH += descending_towers[
i - 1].Nhit;
272 vector<double> &energies,
273 vector<double> &subdet_energies,
274 vector<double> &Ecal_energies,
275 vector<double> &Hcal_energies,
276 vector<double> &HO_energies,
277 vector<double> &HPD_energies,
278 vector<double> &RBX_energies,
279 double &LS_bad_energy,
280 double &HF_OOT_energy,
283 subdet_energies.clear();
284 Ecal_energies.clear();
285 Hcal_energies.clear();
287 HPD_energies.clear();
288 RBX_energies.clear();
289 LS_bad_energy = HF_OOT_energy = 0.;
294 std::map<int, double> HPD_energy_map, RBX_energy_map;
295 vector<double> EB_energies, EE_energies, HB_energies, HE_energies, short_energies, long_energies;
302 event.getByToken(input_HBHERecHits_token_,
HBHERecHits);
303 event.getByToken(input_HORecHits_token_, HORecHits);
304 event.getByToken(input_HFRecHits_token_,
HFRecHits);
305 event.getByToken(input_EBRecHits_token_,
EBRecHits);
306 event.getByToken(input_EERecHits_token_,
EERecHits);
308 cout <<
"# of rechits found - HBHE: " <<
HBHERecHits->size() <<
", HO: " << HORecHits->
size()
311 vector<CaloTowerPtr>
towers =
jet.getCaloConstituents();
314 cout <<
"In classifyJetComponents. # of towers found: " <<
nTowers << endl;
316 for (
int iTower = 0; iTower <
nTowers; iTower++) {
319 int nCells =
tower->constituentsSize();
321 cout <<
"tower #" << iTower <<
" has " << nCells <<
" cells. "
322 <<
"It's at iEta: " <<
tower->ieta() <<
", iPhi: " <<
tower->iphi() << endl;
324 const vector<DetId> &cellIDs =
tower->constituents();
326 for (
int iCell = 0; iCell < nCells; ++iCell) {
334 if (theRecHit == HORecHits->
end()) {
335 edm::LogWarning(
"UnexpectedEventContents") <<
"Can't find the HO recHit with ID: " << HcalID;
338 hitE = theRecHit->energy();
339 HO_energies.push_back(hitE);
344 edm::LogWarning(
"UnexpectedEventContents") <<
"Can't find the HF recHit with ID: " << HcalID;
347 hitE = theRecHit->energy();
349 cout <<
"hit #" << iCell <<
" is HF , E: " << hitE <<
" iEta: " << theRecHit->id().ieta()
350 <<
", depth: " << theRecHit->id().depth() <<
", iPhi: " << theRecHit->id().iphi();
352 if (HcalID.
depth() == 1)
353 long_energies.push_back(hitE);
355 short_energies.push_back(hitE);
357 uint32_t
flags = theRecHit->flags();
359 LS_bad_energy += hitE;
363 HF_OOT_energy += hitE;
364 if (iDbg > 4 &&
flags)
365 cout <<
"flags: " <<
flags <<
" -> LS_bad_energy: " << LS_bad_energy <<
", HF_OOT_energy: " << HF_OOT_energy
372 edm::LogWarning(
"UnexpectedEventContents") <<
"Can't find the HBHE recHit with ID: " << HcalID;
375 hitE = theRecHit->energy();
376 int iEta = theRecHit->id().ieta();
377 int depth = theRecHit->id().depth();
379 int hitIPhi = theRecHit->id().iphi();
381 cout <<
"hit #" << iCell <<
" is HBHE, E: " << hitE <<
" iEta: " <<
iEta <<
", depth: " <<
depth
382 <<
", iPhi: " << theRecHit->id().iphi() <<
" -> " <<
region;
388 int iRBX = 100 *
region + ((hitIPhi + 1) % 72) / 4;
391 if ((0
x1 & hitIPhi) == 0) {
392 edm::LogError(
"CodeAssumptionsViolated") <<
"Bug?! Jet ID code assumes no even iPhi recHits at HE edges";
395 bool oddnessIEta = HBHE_oddness(
iEta,
depth);
396 bool upperIPhi = ((hitIPhi % 4) == 1 || (hitIPhi % 4) == 2);
400 if (upperIPhi != oddnessIEta)
407 HPD_energy_map[iHPD] += hitE;
408 RBX_energy_map[iRBX] += hitE;
410 cout <<
" --> H[" << iHPD <<
"]=" << HPD_energy_map[iHPD] <<
", R[" << iRBX <<
"]=" << RBX_energy_map[iRBX];
415 HB_energies.push_back(hitE);
417 HE_energies.push_back(hitE);
421 edm::LogWarning(
"UnexpectedEventContents") <<
"HCal hitE==0? (or unknown subdetector?)";
426 int EcalNum = cellIDs[iCell].subdetId();
429 EBDetId EcalID = cellIDs[iCell];
432 edm::LogWarning(
"UnexpectedEventContents") <<
"Can't find the EB recHit with ID: " << EcalID;
435 hitE = theRecHit->energy();
436 EB_energies.push_back(hitE);
437 }
else if (EcalNum == 2) {
438 EEDetId EcalID = cellIDs[iCell];
441 edm::LogWarning(
"UnexpectedEventContents") <<
"Can't find the EE recHit with ID: " << EcalID;
444 hitE = theRecHit->energy();
445 EE_energies.push_back(hitE);
448 edm::LogWarning(
"UnexpectedEventContents") <<
"ECal hitE==0? (or unknown subdetector?)";
450 cout <<
"EcalNum: " << EcalNum <<
" hitE: " << hitE << endl;
464 Hcal_energies.insert(Hcal_energies.end(), HB_energies.begin(), HB_energies.end());
465 Hcal_energies.insert(Hcal_energies.end(), HE_energies.begin(), HE_energies.end());
466 Hcal_energies.insert(Hcal_energies.end(), short_energies.begin(), short_energies.end());
467 Hcal_energies.insert(Hcal_energies.end(), long_energies.begin(), long_energies.end());
468 Ecal_energies.insert(Ecal_energies.end(), EB_energies.begin(), EB_energies.end());
469 Ecal_energies.insert(Ecal_energies.end(), EE_energies.begin(), EE_energies.end());
477 HPD_energy_map.begin(), HPD_energy_map.end(), std::inserter(HPD_energies, HPD_energies.end()),
select2nd);
481 RBX_energy_map.begin(), RBX_energy_map.end(), std::inserter(RBX_energies, RBX_energies.end()),
select2nd);
485 energies.insert(energies.end(), Hcal_energies.begin(), Hcal_energies.end());
486 energies.insert(energies.end(), Ecal_energies.begin(), Ecal_energies.end());
487 energies.insert(energies.end(), HO_energies.begin(), HO_energies.end());
488 std::sort(energies.begin(), energies.end(), greater<double>());
491 fEB_ = std::accumulate(EB_energies.begin(), EB_energies.end(), 0.);
492 fEE_ = std::accumulate(EE_energies.begin(), EE_energies.end(), 0.);
493 fHB_ = std::accumulate(HB_energies.begin(), HB_energies.end(), 0.);
494 fHE_ = std::accumulate(HE_energies.begin(), HE_energies.end(), 0.);
495 fHO_ = std::accumulate(HO_energies.begin(), HO_energies.end(), 0.);
496 fShort_ = std::accumulate(short_energies.begin(), short_energies.end(), 0.);
497 fLong_ = std::accumulate(long_energies.begin(), long_energies.end(), 0.);
498 subdet_energies.push_back(fEB_);
499 subdet_energies.push_back(fEE_);
500 subdet_energies.push_back(fHB_);
501 subdet_energies.push_back(fHE_);
502 subdet_energies.push_back(fHO_);
503 subdet_energies.push_back(fShort_);
504 subdet_energies.push_back(fLong_);
505 std::sort(subdet_energies.begin(), subdet_energies.end(), greater<double>());
506 if (
jet.energy() > 0) {
507 fEB_ /=
jet.energy();
508 fEE_ /=
jet.energy();
509 fHB_ /=
jet.energy();
510 fHE_ /=
jet.energy();
511 fHO_ /=
jet.energy();
512 fShort_ /=
jet.energy();
513 fLong_ /=
jet.energy();
515 if (fEB_ > 0 || fEE_ > 0 || fHB_ > 0 || fHE_ > 0 || fHO_ > 0 || fShort_ > 0 || fLong_ > 0)
516 edm::LogError(
"UnexpectedEventContents") <<
"Jet ID Helper found energy in subdetectors and jet E <= 0";
522 vector<subtower> &subtowers,
523 vector<subtower> &Ecal_subtowers,
524 vector<subtower> &Hcal_subtowers,
525 vector<subtower> &HO_subtowers,
526 vector<double> &HPD_energies,
527 vector<double> &RBX_energies,
530 Ecal_subtowers.clear();
531 Hcal_subtowers.clear();
532 HO_subtowers.clear();
533 HPD_energies.clear();
534 RBX_energies.clear();
536 std::map<int, double> HPD_energy_map, RBX_energy_map;
538 vector<CaloTowerPtr>
towers =
jet.getCaloConstituents();
541 cout <<
"classifyJetTowers started. # of towers found: " <<
nTowers << endl;
543 for (
int iTower = 0; iTower <
nTowers; iTower++) {
546 int nEM = 0, nHad = 0, nHO = 0;
547 const vector<DetId> &cellIDs =
tower->constituents();
548 int nCells = cellIDs.size();
550 cout <<
"tower #" << iTower <<
" has " << nCells <<
" cells. "
551 <<
"It's at iEta: " <<
tower->ieta() <<
", iPhi: " <<
tower->iphi() << endl;
553 for (
int iCell = 0; iCell < nCells; ++iCell) {
568 double E_em =
tower->emEnergy();
570 Ecal_subtowers.push_back(
subtower(E_em, nEM));
572 double E_HO =
tower->outerEnergy();
574 HO_subtowers.push_back(
subtower(E_HO, nHO));
576 double E_had =
tower->hadEnergy();
578 Hcal_subtowers.push_back(
subtower(E_had, nHad));
583 int iPhi =
tower->iphi();
585 cout <<
"tower has E_had: " << E_had <<
" iEta: " <<
iEta <<
", iPhi: " << iPhi <<
" -> " << reg;
587 if (reg == HEneg || reg == HBneg || reg == HBpos || reg == HEpos) {
588 int oddnessIEta = HBHE_oddness(
iEta);
592 int iHPD = 100 * reg;
593 int iRBX = 100 * reg + ((iPhi + 1) % 72) / 4;
595 if ((reg == HEneg || reg == HEpos) &&
std::abs(
iEta) >= 21) {
596 if ((0
x1 & iPhi) == 0) {
597 edm::LogError(
"CodeAssumptionsViolated") <<
"Bug?! Jet ID code assumes no even iPhi recHits at HE edges";
600 bool boolOddnessIEta = oddnessIEta;
601 bool upperIPhi = ((iPhi % 4) == 1 || (iPhi % 4) == 2);
605 if (upperIPhi != boolOddnessIEta)
612 HPD_energy_map[iHPD] += E_had;
613 RBX_energy_map[iRBX] += E_had;
615 cout <<
" --> H[" << iHPD <<
"]=" << HPD_energy_map[iHPD] <<
", R[" << iRBX <<
"]=" << RBX_energy_map[iRBX];
626 HPD_energy_map.begin(), HPD_energy_map.end(), std::inserter(HPD_energies, HPD_energies.end()),
select2nd);
630 RBX_energy_map.begin(), RBX_energy_map.end(), std::inserter(RBX_energies, RBX_energies.end()),
select2nd);
634 subtowers.insert(subtowers.end(), Hcal_subtowers.begin(), Hcal_subtowers.end());
635 subtowers.insert(subtowers.end(), Ecal_subtowers.begin(), Ecal_subtowers.end());
636 subtowers.insert(subtowers.end(), HO_subtowers.begin(), HO_subtowers.end());
645 if (ae == 29 &&
depth == 1)
672 return unknown_region;
674 return unknown_region;