18 : fRefPedestals(nullptr),
19 fRefPedestalWidths(nullptr),
20 fRawPedestals(nullptr),
21 fRawPedestalWidths(nullptr),
22 fValPedestals(nullptr),
23 fValPedestalWidths(nullptr),
31 for (
int i = 0;
i < 4;
i++)
33 for (
int k = 0;
k < 4;
k++)
34 state.push_back(
true);
73 hbHists.ALLPEDS =
new TH1F(
"HBHE All Pedestals",
"HBHE All Peds", 10, 0, 9);
74 hbHists.PEDRMS =
new TH1F(
"HBHE All Pedestal Widths",
"HBHE All Pedestal RMS", 100, 0, 3);
75 hbHists.PEDMEAN =
new TH1F(
"HBHE All Pedestal Means",
"HBHE All Pedestal Means", 100, 0, 9);
76 hbHists.CHI2 =
new TH1F(
"HBHE Chi2/ndf for whole range Gauss fit",
"HBHE Chi2/ndf Gauss", 200, 0., 50.);
78 hoHists.ALLPEDS =
new TH1F(
"HO All Pedestals",
"HO All Peds", 10, 0, 9);
79 hoHists.PEDRMS =
new TH1F(
"HO All Pedestal Widths",
"HO All Pedestal RMS", 100, 0, 3);
80 hoHists.PEDMEAN =
new TH1F(
"HO All Pedestal Means",
"HO All Pedestal Means", 100, 0, 9);
81 hoHists.CHI2 =
new TH1F(
"HO Chi2/ndf for whole range Gauss fit",
"HO Chi2/ndf Gauss", 200, 0., 50.);
83 hfHists.ALLPEDS =
new TH1F(
"HF All Pedestals",
"HF All Peds", 10, 0, 9);
84 hfHists.PEDRMS =
new TH1F(
"HF All Pedestal Widths",
"HF All Pedestal RMS", 100, 0, 3);
85 hfHists.PEDMEAN =
new TH1F(
"HF All Pedestal Means",
"HF All Pedestal Means", 100, 0, 9);
86 hfHists.CHI2 =
new TH1F(
"HF Chi2/ndf for whole range Gauss fit",
"HF Chi2/ndf Gauss", 200, 0., 50.);
92 for (
int i = 0;
i < 16;
i++)
93 _meot->second[
i].first->Delete();
96 for (
int i = 0;
i < 16;
i++)
97 _meot->second[
i].first->Delete();
100 for (
int i = 0;
i < 16;
i++)
101 _meot->second[
i].first->Delete();
149 edm::LogError(
"HcalPedestalAnalysis") <<
"Event with " << (
int)
hbhe.size() <<
" HBHE Digis passed.";
180 edm::LogError(
"HcalPedestalAnalysis") <<
"Event with " << (
int)
ho.size() <<
" HO Digis passed.";
206 edm::LogError(
"HcalPedestalAnalysis") <<
"Event with " << (
int)
hf.size() <<
" HF Digis passed.";
248 static const int bins = 10;
249 static const int bins2 = 100;
252 map<int, PEDBUNCH> _mei;
253 static map<HcalDetId, map<int, float> > QieCalibMap;
254 string type =
"HBHE";
257 if (
detid.ieta() < 16)
259 if (
detid.ieta() > 16)
261 if (
detid.ieta() == 16) {
262 if (
detid.depth() < 3)
264 if (
detid.depth() == 3)
275 if (
_meot == toolT.end()) {
276 map<int, PEDBUNCH>
insert;
277 map<int, float> qiecalib;
279 for (
int i = 0;
i < 4;
i++) {
291 "%s Product, eta=%d phi=%d d=%d caps=%d*%d",
300 "%s Product, eta=%d phi=%d d=%d caps=%d*%d",
309 "%s Product, eta=%d phi=%d d=%d caps=%d*%d",
318 sprintf(
name,
"%s Signal in TS 4+5, eta=%d phi=%d d=%d",
type.c_str(),
detid.ieta(),
detid.iphi(),
detid.depth());
324 "%s Signal in TS 4+5-(0+1+2+3)/2., eta=%d phi=%d d=%d",
333 QieCalibMap[
detid] = qiecalib;
336 _mei =
_meot->second;
348 _mei[qie1.
capid()].first->Reset();
349 _mei[qie1.
capid() + 4].first->Reset();
350 _mei[qie1.
capid() + 8].first->Reset();
351 _mei[qie1.
capid() + 12].first->Reset();
356 _mei[qie1.
capid()].first->Fill(qie1.
adc());
358 _mei[qie1.
capid()].first->Fill(charge1);
359 }
else if (qie1.
adc() >=
bins) {
360 _mei[qie1.
capid()].first->AddBinContent(
bins + 1, 1);
366 map<int, float> qiecalib = QieCalibMap[
detid];
369 if (charge1 * charge2 < bins2) {
370 _mei[qie1.
capid() + 4 *
flag].first->Fill(charge1 * charge2);
372 _mei[qie1.
capid() + 4 *
flag].first->Fill(bins2);
398 map<int, PEDBUNCH> _mei =
_meot->second;
399 _mei[16].first->Fill(qie4.
adc() + qie5.
adc() - 1.);
400 _mei[17].first->Fill(qie4.
adc() + qie5.
adc() - qie2.
adc() - qie3.
adc());
401 _mei[18].first->Fill(qie4.
adc() + qie5.
adc() - (qie0.
adc() + qie1.
adc() + qie2.
adc() + qie3.
adc()) / 2.);
407 char PedSampleNum[20];
410 sprintf(PedSampleNum,
"HB_Sample%d",
sample);
412 m_file->mkdir(PedSampleNum);
415 sprintf(PedSampleNum,
"HO_Sample%d",
sample);
417 m_file->mkdir(PedSampleNum);
420 sprintf(PedSampleNum,
"HF_Sample%d",
sample);
422 m_file->mkdir(PedSampleNum);
442 for (
int i = 0;
i < 4;
i++) {
443 TF1*
fit =
_meot->second[
i].first->GetFunction(
"gaus");
445 if (
fit->GetNDF() != 0)
448 sig[
i][
i] =
fit->GetParameter(2);
449 dcap[
i] =
fit->GetParError(1);
450 dsig[
i][
i] =
fit->GetParError(2);
453 for (
int i = 0;
i < 4;
i++) {
455 sig[
i][
i] =
_meot->second[
i].first->GetRMS();
468 for (
int i = 0;
i < 4;
i++) {
471 _meot->second[
i].first->GetXaxis()->SetTitle(
"ADC");
473 _meot->second[
i].first->GetXaxis()->SetTitle(
"Charge, fC");
474 _meot->second[
i].first->GetYaxis()->SetTitle(
"CapID samplings");
475 _meot->second[
i].first->Write();
478 _meot->second[
i].second.first[0].push_back(
cap[
i]);
479 _meot->second[
i].second.first[1].push_back(dcap[
i]);
480 _meot->second[
i].second.first[2].push_back(sig[
i][
i]);
481 _meot->second[
i].second.first[3].push_back(dsig[
i][
i]);
482 _meot->second[
i].second.first[4].push_back(
chi2[
i]);
484 PedMeans->Fill(
cap[
i]);
485 PedWidths->Fill(sig[
i][
i]);
490 for (
int i = 16;
i < 19;
i++) {
492 _meot->second[
i].first->GetXaxis()->SetTitle(
"ADC");
494 _meot->second[
i].first->GetXaxis()->SetTitle(
"Charge, fC");
495 _meot->second[
i].first->GetYaxis()->SetTitle(
"Events");
496 _meot->second[
i].first->Write();
501 sig[0][0] = sig[0][0] * sig[0][0];
502 sig[1][1] = sig[1][1] * sig[1][1];
503 sig[2][2] = sig[2][2] * sig[2][2];
504 sig[3][3] = sig[3][3] * sig[3][3];
508 sig[0][1] =
_meot->second[4].first->GetMean() -
cap[0] *
cap[1];
509 sig[0][2] =
_meot->second[8].first->GetMean() -
cap[0] *
cap[2];
510 sig[1][2] =
_meot->second[5].first->GetMean() -
cap[1] *
cap[2];
511 sig[1][3] =
_meot->second[9].first->GetMean() -
cap[1] *
cap[3];
512 sig[2][3] =
_meot->second[6].first->GetMean() -
cap[2] *
cap[3];
513 sig[0][3] =
_meot->second[12].first->GetMean() -
cap[0] *
cap[3];
514 sig[1][0] =
_meot->second[13].first->GetMean() -
cap[1] *
cap[0];
515 sig[2][0] =
_meot->second[10].first->GetMean() -
cap[2] *
cap[0];
516 sig[2][1] =
_meot->second[14].first->GetMean() -
cap[2] *
cap[1];
517 sig[3][1] =
_meot->second[11].first->GetMean() -
cap[3] *
cap[1];
518 sig[3][2] =
_meot->second[15].first->GetMean() -
cap[3] *
cap[2];
519 sig[3][0] =
_meot->second[7].first->GetMean() -
cap[3] *
cap[0];
522 for (
int i = 0;
i < 4;
i++) {
524 _meot->second[
i].second.first[5].push_back(sig[
i][(
i + 1) % 4]);
525 _meot->second[
i].second.first[6].push_back(2 * sig[
i][
i] * dsig[
i][
i]);
526 _meot->second[
i].second.first[7].push_back(sig[
i][(
i + 2) % 4]);
527 _meot->second[
i].second.first[8].push_back(2 * sig[
i][
i] * dsig[
i][
i]);
528 _meot->second[
i].second.first[9].push_back(sig[
i][(
i + 3) % 4]);
529 _meot->second[
i].second.first[10].push_back(2 * sig[
i][
i] * dsig[
i][
i]);
534 _meot->second[
i + 4].first->GetXaxis()->SetTitle(
"ADC^2");
536 _meot->second[
i + 4].first->GetXaxis()->SetTitle(
"Charge^2, fC^2");
537 _meot->second[
i + 4].first->GetYaxis()->SetTitle(
"2-CapID samplings");
538 _meot->second[
i + 4].first->Write();
540 _meot->second[
i + 8].first->GetXaxis()->SetTitle(
"ADC^2");
542 _meot->second[
i + 8].first->GetXaxis()->SetTitle(
"Charge^2, fC^2");
543 _meot->second[
i + 8].first->GetYaxis()->SetTitle(
"2-CapID samplings");
544 _meot->second[
i + 8].first->Write();
546 _meot->second[
i + 12].first->GetXaxis()->SetTitle(
"ADC^2");
548 _meot->second[
i + 12].first->GetXaxis()->SetTitle(
"Charge^2, fC^2");
549 _meot->second[
i + 12].first->GetYaxis()->SetTitle(
"2-CapID samplings");
550 _meot->second[
i + 12].first->Write();
557 sig[1][0] = sig[0][1];
558 sig[2][0] = sig[0][2];
559 sig[2][1] = sig[1][2];
560 sig[3][1] = sig[1][3];
561 sig[3][2] = sig[2][3];
562 sig[0][3] = sig[3][0];
638 for (
int i = 0;
i < 4;
i++)
687 map<int, std::vector<double> > AverageValues;
690 for (
int i = 0;
i < 4;
i++) {
693 sprintf(
name,
"Pedestal trend, eta=%d phi=%d d=%d cap=%d",
detid.ieta(),
detid.iphi(),
detid.depth(),
i);
694 int bins =
_meot->second[
i].second.first[0].size();
698 sprintf(
name,
"Width trend, eta=%d phi=%d d=%d cap=%d",
detid.ieta(),
detid.iphi(),
detid.depth(),
i);
699 bins =
_meot->second[
i].second.first[2].size();
703 "Correlation trend, eta=%d phi=%d d=%d caps=%d*%d",
709 bins =
_meot->second[
i].second.first[5].size();
721 std::vector<double>::iterator sample_it;
724 for (sample_it =
_meot->second[
i].second.first[0].begin(); sample_it !=
_meot->second[
i].second.first[0].end();
726 _meot->second[
i].second.second[0]->SetBinContent(++
j, *sample_it);
729 for (sample_it =
_meot->second[
i].second.first[1].begin(); sample_it !=
_meot->second[
i].second.first[1].end();
731 _meot->second[
i].second.second[0]->SetBinError(++
j, *sample_it);
734 _meot->second[
i].second.second[0]->Fit(
"pol0",
"Q");
735 TF1*
fit =
_meot->second[
i].second.second[0]->GetFunction(
"pol0");
736 AverageValues[0].push_back(
fit->GetParameter(0));
737 AverageValues[1].push_back(
fit->GetParError(0));
739 AverageValues[2].push_back(
fit->GetChisquare() /
fit->GetNDF());
741 AverageValues[2].push_back(
fit->GetChisquare());
743 _meot->second[
i].second.second[0]->GetXaxis()->SetTitle(
name);
744 _meot->second[
i].second.second[0]->GetYaxis()->SetTitle(
"Pedestal value");
745 _meot->second[
i].second.second[0]->Write();
748 for (sample_it =
_meot->second[
i].second.first[2].begin(); sample_it !=
_meot->second[
i].second.first[2].end();
750 _meot->second[
i].second.second[1]->SetBinContent(++
j, *sample_it);
753 for (sample_it =
_meot->second[
i].second.first[3].begin(); sample_it !=
_meot->second[
i].second.first[3].end();
755 _meot->second[
i].second.second[1]->SetBinError(++
j, *sample_it);
757 _meot->second[
i].second.second[1]->GetXaxis()->SetTitle(
name);
758 _meot->second[
i].second.second[1]->GetYaxis()->SetTitle(
"Pedestal width");
759 _meot->second[
i].second.second[1]->Write();
762 for (sample_it =
_meot->second[
i].second.first[5].begin(); sample_it !=
_meot->second[
i].second.first[5].end();
764 _meot->second[
i].second.second[2]->SetBinContent(++
j, *sample_it);
767 for (sample_it =
_meot->second[
i].second.first[6].begin(); sample_it !=
_meot->second[
i].second.first[6].end();
769 _meot->second[
i].second.second[2]->SetBinError(++
j, *sample_it);
771 _meot->second[
i].second.second[2]->GetXaxis()->SetTitle(
name);
772 _meot->second[
i].second.second[2]->GetYaxis()->SetTitle(
"Close correlation");
773 _meot->second[
i].second.second[2]->Write();
801 for (sample_it =
_meot->second[
i].second.first[4].begin(); sample_it !=
_meot->second[
i].second.first[4].end();
803 Chi2->Fill(*sample_it);
807 CapidAverage =
new TH1F(
"Constant fit: Pedestal Values",
808 "Constant fit: Pedestal Values",
809 AverageValues[0].
size(),
811 AverageValues[0].
size());
812 std::vector<double>::iterator sample_it;
814 for (sample_it = AverageValues[0].
begin(); sample_it != AverageValues[0].end(); ++sample_it) {
815 CapidAverage->SetBinContent(++
j, *sample_it);
818 for (sample_it = AverageValues[1].
begin(); sample_it != AverageValues[1].end(); ++sample_it) {
819 CapidAverage->SetBinError(++
j, *sample_it);
821 CapidChi2 =
new TH1F(
822 "Constant fit: Chi2/ndf",
"Constant fit: Chi2/ndf", AverageValues[2].
size(), 0., AverageValues[2].
size());
824 for (sample_it = AverageValues[2].
begin(); sample_it != AverageValues[2].end(); ++sample_it) {
825 CapidChi2->SetBinContent(++
j, *sample_it);
828 Chi2->GetXaxis()->SetTitle(
"Chi2/ndf");
829 Chi2->GetYaxis()->SetTitle(
"50 x [(16+2) x 4 x 4] `events`");
831 CapidAverage->GetYaxis()->SetTitle(
"Pedestal value");
832 CapidAverage->GetXaxis()->SetTitle(
"(16+2) x 4 x 4 `events`");
833 CapidAverage->Write();
834 CapidChi2->GetYaxis()->SetTitle(
"Chi2/ndf");
835 CapidChi2->GetXaxis()->SetTitle(
"(16+2) x 4 x 4 `events`");
852 float RefPedSigs[4][4];
854 float RawPedSigs[4][4];
855 map<HcalDetId, bool> isinRaw;
856 map<HcalDetId, bool> isinRef;
859 std::ofstream PedValLog;
860 PedValLog.open(
"HcalPedVal.log");
862 if (nstat[0] + nstat[1] + nstat[2] + nstat[3] < 2500)
863 PedValLog <<
"HcalPedVal: warning - low statistics" << std::endl;
865 for (
int i = 0;
i < (
int)RawChanns.size();
i++) {
868 for (
int i = 0;
i < (
int)RefChanns.size();
i++) {
870 isinRaw[
detid] =
false;
871 isinRef[
detid] =
true;
873 for (
int i = 0;
i < (
int)RawChanns.size();
i++) {
875 isinRaw[
detid] =
true;
876 if (isinRef[
detid] ==
false) {
877 PedValLog <<
"HcalPedVal: channel " <<
detid <<
" not found in reference set" << std::endl;
878 std::cerr <<
"HcalPedVal: channel " <<
detid <<
" not found in reference set" << std::endl;
884 for (
int i = 0;
i < (
int)RefChanns.size();
i++) {
886 for (
int icap = 0; icap < 4; icap++) {
888 for (
int icap2 = icap; icap2 < 4; icap2++) {
891 RefPedSigs[icap2][icap] = RefPedSigs[icap][icap2];
896 if (isinRaw[
detid]) {
897 for (
int icap = 0; icap < 4; icap++) {
899 for (
int icap2 = icap; icap2 < 4; icap2++) {
902 RawPedSigs[icap2][icap] = RawPedSigs[icap][icap2];
907 for (
int icap = 0; icap < 4; icap++) {
908 if (RawPedVals[icap] < 1. || RawPedSigs[icap][icap] < 0.01)
909 isinRaw[
detid] =
false;
910 for (
int icap2 = icap; icap2 < 4; icap2++) {
911 if (fabs(RawPedSigs[icap][icap2] /
sqrt(RawPedSigs[icap][icap] * RawPedSigs[icap2][icap2])) > 1.)
912 isinRaw[
detid] =
false;
918 if (isinRaw[
detid]) {
919 for (
int icap = 0; icap < 4; icap++) {
920 int icap2 = (icap + 1) % 4;
921 float width =
sqrt(RawPedSigs[icap][icap]);
922 float erof1 =
width /
sqrt((
float)nstat[icap]);
923 float erof2 =
sqrt(erof1 * erof1 + RawPedSigs[icap][icap] / (
float)nstat[icap]);
924 float erofwidth =
width /
sqrt(2. * nstat[icap]);
925 float diffof1 = RawPedVals[icap] - RefPedVals[icap];
926 float diffof2 = RawPedVals[icap] + RawPedVals[icap2] - RefPedVals[icap] - RefPedVals[icap2];
927 float diffofw =
width -
sqrt(RefPedSigs[icap][icap]);
933 if (nTS == 1 && fabs(diffof1) > 0.5 + erof1) {
935 PedValLog <<
"HcalPedVal: drift in channel " <<
detid <<
" cap " << icap <<
": " << RawPedVals[icap] <<
" - " 936 << RefPedVals[icap] <<
" = " << diffof1 << std::endl;
938 if (nTS == 2 && fabs(diffof2) > 0.5 + erof2) {
940 PedValLog <<
"HcalPedVal: drift in channel " <<
detid <<
" caps " << icap <<
"+" << icap2 <<
": " 941 << RawPedVals[icap] <<
"+" << RawPedVals[icap2] <<
" - " << RefPedVals[icap] <<
"+" 942 << RefPedVals[icap2] <<
" = " << diffof2 << std::endl;
944 if (fabs(diffofw) > 0.15 *
width + erofwidth) {
946 PedValLog <<
"HcalPedVal: width changed in channel " <<
detid <<
" cap " << icap <<
": " <<
width <<
" - " 947 <<
sqrt(RefPedSigs[icap][icap]) <<
" = " << diffofw << std::endl;
954 PedValLog <<
"HcalPedVal: no valid data from channel " <<
detid << std::endl;
959 for (
int icap = 0; icap < 4; icap++) {
960 for (
int icap2 = icap; icap2 < 4; icap2++)
961 widthsp.
setSigma(icap2, icap, RefPedSigs[icap2][icap]);
970 PedValLog <<
"HcalPedVal: all pedestals checked OK" << std::endl;
974 if (erflag % 100000 == 0) {
975 for (
int i = 0;
i < (
int)RefChanns.size();
i++) {
977 if (isinRaw[
detid]) {
979 for (
int icap = 0; icap < 4; icap++) {
981 for (
int icap2 = icap; icap2 < 4; icap2++) {
984 RefPedSigs[icap2][icap] = RefPedSigs[icap][icap2];
985 widthsp.
setSigma(icap2, icap, RefPedSigs[icap2][icap]);
997 for (
int i = 0;
i < (
int)RawChanns.size();
i++) {
999 if (isinRaw[
detid]) {
1001 for (
int icap = 0; icap < 4; icap++) {
1003 for (
int icap2 = icap; icap2 < 4; icap2++) {
1006 RawPedSigs[icap2][icap] = RawPedSigs[icap][icap2];
1007 widthsp.
setSigma(icap2, icap, RawPedSigs[icap2][icap]);
struct HcalPedestalAnalysis::@60 hfHists
constexpr HcalDetId const & id() const
HcalPedestals * fRawPedestals
constexpr const HcalQIESample & sample(int i) const
access a sample
constexpr HcalQIESample const & sample(int i) const
access a sample
void per2CapsHists(int flag, int id, const HcalDetId detid, const HcalQIESample &qie1, const HcalQIESample &qie2, std::map< HcalDetId, std::map< int, PEDBUNCH > > &toolT, const HcalDbService &cond)
HcalPedestalAnalysis(const edm::ParameterSet &ps)
Constructor.
float getValue(int fCapId) const
get value for capId = 0..3
std::string m_outputFileMean
std::vector< T >::const_iterator const_iterator
const HcalTopology * fTopology
Log< level::Error, false > LogError
std::vector< bool > state
const HcalPedestalWidths * fRefPedestalWidths
void processEvent(const HBHEDigiCollection &hbhe, const HODigiCollection &ho, const HFDigiCollection &hf, const HcalDbService &cond)
std::map< HcalDetId, std::map< int, PEDBUNCH > >::iterator _meot
const Item * getValues(DetId fId, bool throwOnFail=true) const
const HcalQIECoder * m_coder
T getUntrackedParameter(std::string const &, T const &) const
~HcalPedestalAnalysis()
Destructor.
constexpr HcalQIESample const & sample(int i) const
access a sample
int done(const HcalPedestals *fInputPedestals, const HcalPedestalWidths *fInputWidths, HcalPedestals *fOutputPedestals, HcalPedestalWidths *fOutputWidths)
const HcalQIEShape * m_shape
void GetPedConst(std::map< HcalDetId, std::map< int, PEDBUNCH > > &toolT, TH1F *PedMeans, TH1F *PedWidths)
void setup(const std::string &m_outputFileROOT)
struct HcalPedestalAnalysis::@60 hoHists
std::vector< DetId > getAllChannels() const
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
float getSigma(int fCapId1, int fCapId2) const
get correlation element for capId1/2 = 0..3
std::string m_outputFileWidth
constexpr int size() const
total number of samples in the digi
constexpr const HcalDetId & id() const
HcalPedestals * fValPedestals
std::string m_outputFileROOT
Log< level::Info, false > LogInfo
struct HcalPedestalAnalysis::@60 hbHists
void AllChanHists(const HcalDetId detid, const HcalQIESample &qie0, const HcalQIESample &qie1, const HcalQIESample &qie2, const HcalQIESample &qie3, const HcalQIESample &qie4, const HcalQIESample &qie5, std::map< HcalDetId, std::map< int, PEDBUNCH > > &toolT)
constexpr int size() const
total number of samples in the digi
constexpr int capid() const
get the Capacitor id
constexpr int adc() const
get the ADC sample
const HcalPedestals * fRefPedestals
HcalPedestalWidths * fValPedestalWidths
Log< level::Warning, false > LogWarning
constexpr int size() const
total number of samples in the digi
bool addValues(const Item &myItem)
static int HcalPedVal(int nstat[4], const HcalPedestals *fRefPedestals, const HcalPedestalWidths *fRefPedestalWidths, HcalPedestals *fRawPedestals, HcalPedestalWidths *fRawPedestalWidths, HcalPedestals *fValPedestals, HcalPedestalWidths *fValPedestalWidths)
HcalPedestalWidths * fRawPedestalWidths
void Trendings(std::map< HcalDetId, std::map< int, PEDBUNCH > > &toolT, TH1F *Chi2, TH1F *CapidAverage, TH1F *CapidChi2)
void setSigma(int fCapId1, int fCapId2, float fSigma)
float charge(const HcalQIEShape &fShape, unsigned fAdc, unsigned fCapId) const
ADC [0..127] + capid [0..3] -> fC conversion.
constexpr HcalDetId const & id() const