49 mCalibrator = std::make_unique<o2::calibration::IntegratedClusterCalibrator<ITPCC>>();
50 mEnableWritingPadStatusMap = ic.options().get<
bool>(
"enableWritingPadStatusMap");
51 const auto slotLength = ic.options().get<uint32_t>(
"tf-per-slot");
52 const auto maxDelay = ic.options().get<uint32_t>(
"max-delay");
53 const auto debug = ic.options().get<
bool>(
"debug");
54 mNthreads = ic.options().get<
int>(
"nthreads");
56 mProcess3D = ic.options().get<
bool>(
"process-3D-currents");
57 mCalibrator->setSlotLength(slotLength);
58 mCalibrator->setMaxSlotsDelay(maxDelay);
60 if (
debug && mProcess3D) {
62 mCalibrator->setDebug(
false);
64 mCalibrator->setDebug(
debug);
67 mCalibFileDir = ic.options().get<std::string>(
"output-dir");
68 if (mCalibFileDir !=
"/dev/null") {
71 mMetaFileDir = ic.options().get<std::string>(
"meta-output-dir");
72 if (mMetaFileDir !=
"/dev/null") {
75 mDumpCalibData = ic.options().get<
bool>(
"dump-calib-data");
84 if (mSetDataTakingCont) {
86 mSetDataTakingCont =
false;
90 mCalibrator->checkSlotsToFinalize(mCalibrator->getCurrentTFInfo().tfCounter, mCalibrator->getMaxSlotsDelay() * mCalibrator->getSlotLength());
92 LOGP(
debug,
"Created {} objects for {} slots with current TF {} and time stamp {}", mCalibrator->getTFinterval().size(), mCalibrator->getNSlots(), mCalibrator->getCurrentTFInfo().tfCounter, mCalibrator->getCurrentTFInfo().creation);
93 if (mCalibrator->hasCalibrationData()) {
94 sendOutput(pc.outputs());
97 const auto currents = pc.inputs().get<
ITPCC*>(pc.inputs().get(
"itpcc"));
100 mCalibrator->process(mCalibrator->getCurrentTFInfo().tfCounter, *currents);
105 LOGP(info,
"Finalizing calibration. Dumping all objects");
107 for (
int i = 0;
i < mCalibrator->getNSlots(); ++
i) {
108 mCalibrator->finalizeSlot(mCalibrator->getSlot(
i));
110 sendOutput(eos.outputs());
120 std::unique_ptr<o2::calibration::IntegratedClusterCalibrator<ITPCC>> mCalibrator;
121 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
122 std::string mMetaFileDir{};
123 std::string mCalibFileDir{};
125 bool mSetDataTakingCont{
true};
126 bool mDumpCalibData{
false};
127 bool mProcess3D{
false};
130 std::unique_ptr<CalDet<PadFlags>> mPadFlagsMap;
131 bool mEnableWritingPadStatusMap{
false};
135 auto calibrations = std::move(*mCalibrator).getCalibs();
136 const auto& intervals = mCalibrator->getTimeIntervals();
137 assert(calibrations.size() == intervals.size());
138 for (
unsigned int i = 0;
i < calibrations.size();
i++) {
139 auto&
object = calibrations[
i];
143 std::unique_ptr<std::vector<char>> imageFlagMap;
144 std::unique_ptr<std::vector<char>> imageITPC0;
147 std::iota(crus.begin(), crus.end(), 0);
149 IDCFactorization factorizeqMax(nIntegrationIntervals, 1, crus);
150 IDCFactorization factorizeqTot(nIntegrationIntervals, 1, crus);
151 IDCFactorization factorizeNCl(nIntegrationIntervals, 1, crus);
152 LOGP(info,
"Processing {} integration intervals", nIntegrationIntervals);
157 const unsigned int region = cruTmp.region();
158 const unsigned int sector = cruTmp.sector();
167 if (std::all_of(currNCl.begin() + indexStart, currNCl.begin() + indexEnd, [](
float x) { return x == 0; })) {
172 factorizeqMax.setIDCs(std::vector<float>(currqMax.begin() + indexStart, currqMax.begin() + indexEnd), cru, interval);
173 factorizeqTot.setIDCs(std::vector<float>(currqTot.begin() + indexStart, currqTot.begin() + indexEnd), cru, interval);
174 factorizeNCl.setIDCs(std::vector<float>(currNCl.begin() + indexStart, currNCl.begin() + indexEnd), cru, interval);
179 object.mIQMaxA = std::vector<float>();
180 object.mIQTotA = std::vector<float>();
181 object.mINClA = std::vector<float>();
186 object.mIQMaxC = std::vector<float>();
187 object.mIQTotC = std::vector<float>();
188 object.mINClC = std::vector<float>();
191 LOGP(info,
"Writing debug output to file");
192 factorizeqMax.setTimeStamp(info.getStartValidityTimestamp());
193 factorizeqTot.setTimeStamp(info.getStartValidityTimestamp());
194 factorizeNCl.setTimeStamp(info.getStartValidityTimestamp());
195 const int run = std::stoi(mDataTakingContext.
runNumber);
196 factorizeqMax.setRun(
run);
197 factorizeqTot.setRun(
run);
198 factorizeNCl.setRun(
run);
199 factorizeqMax.dumpLargeObjectToFile(fmt::format(
"IDCFactorization_qMax_{}_{}.root", info.getStartValidityTimestamp(), info.getEndValidityTimestamp()).data());
200 factorizeqTot.dumpLargeObjectToFile(fmt::format(
"IDCFactorization_qTot_{}_{}.root", info.getStartValidityTimestamp(), info.getEndValidityTimestamp()).data());
201 factorizeNCl.dumpLargeObjectToFile(fmt::format(
"IDCFactorization_NCl_{}_{}.root", info.getStartValidityTimestamp(), info.getEndValidityTimestamp()).data());
205 factorizeqMax.factorizeIDCs(
true,
false);
206 factorizeqTot.factorizeIDCs(
true,
false);
207 factorizeNCl.factorizeIDCs(
false,
false);
210 object.mIQMaxA = factorizeqMax.getIDCOneVec(
Side::A);
211 object.mIQMaxC = factorizeqMax.getIDCOneVec(
Side::C);
212 object.mIQTotA = factorizeqTot.getIDCOneVec(
Side::A);
213 object.mIQTotC = factorizeqTot.getIDCOneVec(
Side::C);
214 object.mINClA = factorizeNCl.getIDCOneVec(
Side::A);
215 object.mINClC = factorizeNCl.getIDCOneVec(
Side::C);
218 auto padStatusMap = factorizeNCl.getPadStatusMap();
219 if (mEnableWritingPadStatusMap) {
222 mPadFlagsMap = std::move(padStatusMap);
225 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoPadFlags.getPath(), ccdbInfoPadFlags.getFileName(), imageFlagMap->size(), ccdbInfoPadFlags.getStartValidityTimestamp(), ccdbInfoPadFlags.getEndValidityTimestamp());
230 if (!(*padStatusMap.get() == *mPadFlagsMap.get())) {
231 LOGP(info,
"Pad status map changed");
234 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoPadFlags.getPath(), ccdbInfoPadFlags.getFileName(), imageFlagMap->size(), ccdbInfoPadFlags.getStartValidityTimestamp(), ccdbInfoPadFlags.getEndValidityTimestamp());
237 mPadFlagsMap = std::move(padStatusMap);
244 itpczero.mIQMaxA = std::move(factorizeqMax).getIDCZero(
Side::A);
245 itpczero.mIQMaxC = std::move(factorizeqMax).getIDCZero(
Side::C);
246 itpczero.mIQTotA = std::move(factorizeqTot).getIDCZero(
Side::A);
247 itpczero.mIQTotC = std::move(factorizeqTot).getIDCZero(
Side::C);
248 itpczero.mINClA = std::move(factorizeNCl).getIDCZero(
Side::A);
249 itpczero.mINClC = std::move(factorizeNCl).getIDCZero(
Side::C);
253 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoITPC0.getPath(), ccdbInfoITPC0.getFileName(), imageITPC0->size(), ccdbInfoITPC0.getStartValidityTimestamp(), ccdbInfoITPC0.getEndValidityTimestamp());
259 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", info.getPath(), info.getFileName(),
image->size(), info.getStartValidityTimestamp(), info.getEndValidityTimestamp());
263 if (mDumpCalibData && mCalibFileDir !=
"/dev/null") {
264 std::string calibFName = fmt::format(
"itpc_cal_data_{}_{}.root", info.getStartValidityTimestamp(), info.getEndValidityTimestamp());
266 std::ofstream calFile(fmt::format(
"{}{}", mCalibFileDir, calibFName), std::ios::out | std::ios::binary);
270 std::string calibFNameMap = fmt::format(
"itpc_cal_map_data_{}_{}.root", info.getStartValidityTimestamp(), info.getEndValidityTimestamp());
271 std::ofstream calFileMap(fmt::format(
"{}{}", mCalibFileDir, calibFNameMap), std::ios::out | std::ios::binary);
272 calFileMap.write(imageFlagMap->data(), imageFlagMap->size());
276 std::string calibFNameI0 = fmt::format(
"itpc_cal0_data_{}_{}.root", info.getStartValidityTimestamp(), info.getEndValidityTimestamp());
277 std::ofstream calFileI0(fmt::format(
"{}{}", mCalibFileDir, calibFNameI0), std::ios::out | std::ios::binary);
278 calFileI0.write(imageITPC0->data(), imageITPC0->size());
281 }
catch (std::exception
const& e) {
282 LOG(error) <<
"Failed to store ITPCC calibration data file " << calibFName <<
", reason: " << e.what();
285 if (mMetaFileDir !=
"/dev/null") {
289 calMetaData.
type =
"calib";
291 auto metaFileNameTmp = fmt::format(
"{}{}.tmp", mMetaFileDir, calibFName);
292 auto metaFileName = fmt::format(
"{}{}.done", mMetaFileDir, calibFName);
294 std::ofstream metaFileOut(metaFileNameTmp);
295 metaFileOut << calMetaData;
297 std::filesystem::rename(metaFileNameTmp, metaFileName);
298 }
catch (std::exception
const& e) {
299 LOG(error) <<
"Failed to store CTF meta data file " << metaFileName <<
", reason: " << e.what();
304 mCalibrator->initOutput();