66 const std::map<CaloSampling::CaloSample, float> dynRange{
67 {CaloSampling::PreSamplerB, 2},
68 {CaloSampling::EMB1, 2},
69 {CaloSampling::EMB2, 10},
70 {CaloSampling::EMB3, 10},
71 {CaloSampling::PreSamplerE, 2},
72 {CaloSampling::EME1, 2},
73 {CaloSampling::EME2, 10},
74 {CaloSampling::EME3, 10},
75 {CaloSampling::HEC0, 2},
76 {CaloSampling::HEC1, 2},
77 {CaloSampling::HEC2, 2},
78 {CaloSampling::HEC3, 2,},
79 {CaloSampling::FCAL0, 10},
80 {CaloSampling::FCAL1, 10},
81 {CaloSampling::FCAL2, 10},
86 const std::map<CaloSampling::CaloSample, std::vector<std::pair<float, float> > > noiseMap{
87 {CaloSampling::PreSamplerB, {{5, 3.2}}},
88 {CaloSampling::EMB1, {{0.8, 1.8}, {5, 2.1}}},
89 {CaloSampling::EMB2, {{0.8, 1.4}, {5, 1.7}}},
90 {CaloSampling::EMB3, {{0.8, 1.4}, {5, 1.7}}},
91 {CaloSampling::PreSamplerE, {{5, 3.5}}},
92 {CaloSampling::EME1, {{2, 2.7}, {5, 2.9}}},
93 {CaloSampling::EME2, {{2, 1.3}, {5, 1.5}}},
94 {CaloSampling::EME3, {{2, 1.3}, {5, 1.5}}},
95 {CaloSampling::HEC0, {{5, 3.1}}},
96 {CaloSampling::HEC1, {{5, 3.1}}},
97 {CaloSampling::HEC2, {{5, 2.1}}},
98 {CaloSampling::HEC3, {{5, 2.1}}},
100 {CaloSampling::FCAL0, {{5, 4.3}}},
101 {CaloSampling::FCAL1, {{5, 4.6}}},
102 {CaloSampling::FCAL2, {{5, 4.5}}},
112 std::unique_ptr<LArRampMC> rampMC = std::make_unique<LArRampMC>();
116 const auto& symIDs = larMCsymHdl->symIds();
118 const int nUsableBits = int(pow(2,
m_nADCBits) * 3 / 4.);
124 const Identifier id = (*cablingHdl)->cnvToIdentifier(hwid);
126 const auto rangeIt = dynRange.find(sampling);
127 if (rangeIt == dynRange.end())[[
unlikely]]{
128 ATH_MSG_WARNING(
"LArR4ElecCalibCalculator::stop: sampling not found in dynRange.");
131 const double mARange = rangeIt->second;
132 const double uAperADC = 1000 * mARange / nUsableBits;
133 const double dac2uA = (*DAC2uAHdl)->DAC2UA(hwid);
134 const double ADC2DAC = uAperADC / dac2uA;
137 const double ADC2MeV = ADC2DAC * dac2uA * uA2MeVHdl->UA2MEV(hwid);
138 const double adc2uA = ADC2DAC * dac2uA;
140 << uAperADC <<
", ADC/mA " << nUsableBits / mARange <<
", DAC2uA " << dac2uA <<
", Ramp " << ADC2DAC <<
", ADC2MeV=" << ADC2MeV
141 <<
", ADC2DAC*dac2uA=" << adc2uA);
143 std::vector<float> vRamp;
145 vRamp.push_back(ADC2DAC);
156 std::unique_ptr<LArRampSym> rampSym = std::make_unique<LArRampSym>(*larMCsymHdl, rampMC.get());
159 if (
sc.isFailure()) {
165 if (
sc.isFailure()) {
172 std::vector<float> pedVec, pedRMSVec;
175 std::unique_ptr<LArPedestalMC> pedPtr = std::make_unique<LArPedestalMC>();
176 pedPtr->set(pedVec, pedRMSVec);
182 std::unique_ptr<LArNoiseMC> noisePtr = std::make_unique<LArNoiseMC>();
188 const Identifier id = (*cablingHdl)->cnvToIdentifier(hwid);
193 const auto& pairs = noiseMap.find(sampling)->second;
195 for (
auto [e, n] : pairs) {
198 ATH_MSG_DEBUG(
"Sampling: " << sampling <<
", eta=" <<
eta <<
", noise=" << noise);
206 std::unique_ptr<LArNoiseSym> noiseSym = std::make_unique<LArNoiseSym>(*larMCsymHdl, noisePtr.get());
210 sc =
detStore()->record(std::move(noiseSym),
"LArNoiseSym");
211 if (
sc.isFailure()) {
221 chai::Tag::Metadata chaiMD{.iovType=chai::Tag::IovType::RunNumberLumiBlock,
222 .objectType=
"crest-json-single-iov",
223 .synchronization=chai::Tag::Synchronization::All,
224 .status=chai::Tag::Status::Unlocked,
225 .nodeDescription = chai::Tag::buildNodeDescription(chai::Tag::IovType::RunNumberLumiBlock,
"CondAttrListCollection", 1238547719u)
228 std::vector<float> rampsHG, rampsMG, noiseHG, noiseMG, ped, pedRMS;
239 for (
unsigned idx = 0; idx < hashmax; ++idx) {
242 if (!(*cablingHdl)->isOnlineConnectedFromHash(hIdx)) {
243 rampsHG.push_back(0);
244 rampsHG.push_back(-999);
245 rampsMG.push_back(0);
246 rampsMG.push_back(-999);
247 noiseHG.push_back(-999);
248 noiseMG.push_back(-999);
251 rampsHG.push_back(rampvecHG[0]);
252 rampsHG.push_back(rampvecHG[1]);
254 rampsMG.push_back(rampvecMG[0]);
255 rampsMG.push_back(rampvecMG[1]);
262 auto gt=db.createGlobalTag(
"GlobalTestTag",
"test",
"MC");
266 chai::PayloadSpec spec(chai::FieldSpec({{
"Pedestal", chai::Type::Blob}, {
"PedestalRMS", chai::Type::Blob}, {
"version", chai::Type::UInt32}}),
273 auto tag = db.createTag(
"LARElecCalibPedestal-R4-00",
"Pedestal of FEB 2", spec, chaiMD);
274 gt->addTag(
"/LAR/ElecCalibMC/Pedestal",
"LARElecCalibPedestal-R4-00");
276 chai::Container container = tag->buildContainer();
277 for (
size_t g = 0; g < 2; ++g) {
278 container[g].push(std::move(vecToBlobData(ped)));
279 container[g].push(std::move(vecToBlobData(pedRMS)));
280 container[g].push(0);
282 tag->addPayload(container, 0);
286 chai::PayloadSpec spec(chai::FieldSpec({{
"RampVec", chai::Type::Blob}, {
"nPoints", chai::Type::UInt32}, {
"version", chai::Type::UInt32}}),
293 auto tag = db.createTag(
"LARElecCalibMCRamp-R4-00",
"Electronic gain of FEB 2", spec, chaiMD);
294 gt->addTag(
"/LAR/ElecCalibMC/Ramp",
"LARElecCalibMCRamp-R4-00");
296 chai::Container container = tag->buildContainer();
297 container[0].push(std::move(vecToBlobData(rampsHG)));
298 container[0].push(2);
299 container[0].push(0);
301 container[1].push(std::move(vecToBlobData(rampsMG)));
302 container[1].push(2);
303 container[1].push(0);
305 tag->addPayload(container, 0);
309 chai::PayloadSpec spec(chai::FieldSpec({{
"Noise", chai::Type::Blob}, {
"version", chai::Type::UInt32}}),
316 auto tag = db.createTag(
"LARElecCalibMCNoise-R4-00",
"Noise of FEB 2 (in ADC counts)", spec, chaiMD);
317 gt->addTag(
"/LAR/ElecCalibMC/Noise",
"LARElecCalibMCNoise-R4-00");
319 chai::Container container = tag->buildContainer();
321 container[0].push(std::move(vecToBlobData(noiseHG)));
322 container[0].push(0);
324 container[1].push(std::move(vecToBlobData(noiseMG)));
325 container[1].push(0);
326 tag->addPayload(container, 0);
330 return StatusCode::SUCCESS;