24#include <fairmq/Device.h>
25#include <fairlogger/Logger.h>
36 mEminHGTime = ic.
options().
get<
float>(
"eminhgtime");
37 mEminLGTime = ic.
options().
get<
float>(
"eminlgtime");
38 mEDigMin = ic.
options().
get<
float>(
"ecalibdigitmin");
39 mECluMin = ic.
options().
get<
float>(
"ecalibclumin");
41 if (mOutputDir.compare(
"/dev/null")) {
44 if (mMetaFileDir.compare(
"/dev/null")) {
48 LOG(info) <<
"Energy calibration options";
49 LOG(info) <<
" output-dif=" << mOutputDir;
50 bool toFillDigits = mOutputDir.compare(
"/dev/null");
52 LOG(info) <<
" Digits tree will be created";
54 LOG(info) <<
" Digits tree will NOT be created";
56 LOG(info) <<
" meta-output-dir=" << mMetaFileDir;
57 LOG(info) <<
" mgg histo ptMin=" << mPtMin;
58 LOG(info) <<
" Emin for HG time=" << mEminHGTime;
59 LOG(info) <<
" Emin for LG time=" << mEminLGTime;
60 LOG(info) <<
" Emin for out digits=" << mEDigMin;
61 LOG(info) <<
" Cluster Emin for out digits=" << mECluMin;
63 LOG(info) <<
" Root output dir=" << mOutputDir;
65 mCalibrator = std::make_unique<PHOSEnergyCalibrator>();
68 if (!mHasCalib && !mUseCCDB) {
69 mCalibParams = std::make_unique<CalibParams>(1);
70 mCalibrator->setCalibration(mCalibParams.get());
71 mBadMap = std::make_unique<BadChannelsMap>();
72 mCalibrator->setBadMap(mBadMap.get());
73 LOG(info) <<
"No reading BadMap/Calibration from ccdb requested, set default";
76 mCalibrator->setCuts(mPtMin, mEminHGTime, mEminLGTime, mEminHGTime, mEminLGTime);
77 mCalibrator->setFillDigitsTree(toFillDigits);
78 mCalibrator->setUpdateAtTheEndOfRunOnly();
88 static bool initOnceDone =
false;
102 LOG(info) <<
"Getting calib from CCDB";
105 mCalibrator->setBadMap(badMapPtr.get());
108 mCalibrator->setCalibration(calibPtr.get());
111 mOutputDigits.clear();
113 auto tfcounter = o2::header::get<o2::framework::DataProcessingHeader*>(pc.
inputs().
get(
"clusters").header)->startTime;
114 const gsl::span<const Cluster>&
clusters = pc.
inputs().
get<gsl::span<Cluster>>(
"clusters");
115 const gsl::span<const CluElement>& cluelements = pc.
inputs().
get<gsl::span<CluElement>>(
"cluelements");
116 const gsl::span<const TriggerRecord>& cluTR = pc.
inputs().
get<gsl::span<TriggerRecord>>(
"clusterTriggerRecords");
118 LOG(
debug) <<
"[PHOSEnergyCalibDevice - run] Received " << cluTR.size() <<
" TRs and " <<
clusters.size() <<
" clusters, running calibration";
119 if (mRunStartTime == 0) {
121 mRunStartTime = tinfo.creation;
122 mRunNumber = tinfo.runNumber;
125 if (!(LHCPeriodStr.empty())) {
126 mLHCPeriod = LHCPeriodStr;
128 const char* months[12] = {
"JAN",
"FEB",
"MAR",
"APR",
"MAY",
"JUN",
129 "JUL",
"AUG",
"SEP",
"OCT",
"NOV",
"DEC"};
130 std::time_t
tt = mRunStartTime / 1000;
131 std::tm* ltm = std::gmtime(&
tt);
132 mLHCPeriod = (std::string)months[ltm->tm_mon];
133 LOG(warning) <<
"LHCPeriod is not available, using current month " << mLHCPeriod;
137 mCalibrator->process(tfcounter,
clusters, cluelements, cluTR, mOutputDigits);
145 mCalibrator->endOfStream();
152 LOG(info) <<
"STOP: writing output digits file";
158 if (mOutputDigits.size() < 2) {
162 LOG(info) <<
"Filling tree with " << mOutputDigits.size() <<
" digits";
164 if (mWriteRootOutput) {
165 mFileName = mOutputDir + fmt::format(
"PHOS_CalibDigits_{}.root", mRunNumber);
166 LOG(info) <<
"Creating new tree for PHOS calib digits, output file=" << mFileName;
167 mFileOut = std::make_unique<TFile>(mFileName.c_str(),
"recreate");
168 mFileMetaData = std::make_unique<o2::dataformats::FileMetaData>();
169 mHistoFileName = mOutputDir + fmt::format(
"PHOS_CalibHistos_{}.root", mRunNumber);
170 mHistoFileOut = std::make_unique<TFile>(mHistoFileName.c_str(),
"recreate");
171 mHistoFileMetaData = std::make_unique<o2::dataformats::FileMetaData>();
176 LOG(info) <<
"Creating new tree for PHOS calib digits";
177 mTreeOut = std::make_unique<TTree>(
"phosCalibDig",
"O2 PHOS calib tree");
180 auto* br = mTreeOut->GetBranch(
"PHOSCalib");
182 br = mTreeOut->Branch(
"PHOSCalib", &mOutputDigits);
189 if (!mWriteRootOutput) {
196 LOG(info) <<
"Writing calibration digits";
198 int nbits = mTreeOut->Write();
199 LOG(info) <<
"Wrote " << nbits <<
" bits";
205 mFileMetaData->fillFileData(mFileName);
206 mFileMetaData->setDataTakingContext(mDataTakingContext);
207 mFileMetaData->type =
"calib";
208 mFileMetaData->priority =
"high";
210 std::string metaFileNameTmp = mMetaFileDir + fmt::format(
"PHOS_CalibDigits_{}.tmp", mRunNumber);
211 std::string metaFileName = mMetaFileDir + fmt::format(
"PHOS_CalibDigits_{}.done", mRunNumber);
212 if (mMetaFileDir.compare(
"/dev/null")) {
214 std::ofstream metaFileOut(metaFileNameTmp);
215 metaFileOut << *mFileMetaData.get();
217 std::filesystem::rename(metaFileNameTmp, metaFileName);
218 }
catch (std::exception
const& e) {
219 LOG(error) <<
"Failed to store PHOS meta data file " << metaFileName <<
", reason: " << e.what();
221 LOG(info) <<
"Stored metadate file " << mFileName <<
".done";
223 LOG(info) <<
"Scipped storing metafile as meta-dir=" << mMetaFileDir;
225 mFileMetaData.reset();
227 LOG(info) <<
"Writing calibration histograms";
229 mHistoFileOut->WriteObjectAny(mCalibrator->getCollectedHistos(),
"o2::phos::ETCalibHistos",
"histos");
230 mHistoFileOut->Close();
231 mHistoFileOut.reset();
234 mHistoFileMetaData->fillFileData(mHistoFileName);
235 mHistoFileMetaData->setDataTakingContext(mDataTakingContext);
236 mHistoFileMetaData->type =
"calib";
237 mHistoFileMetaData->priority =
"high";
239 metaFileNameTmp = mMetaFileDir + fmt::format(
"PHOS_CalibHistos_{}.tmp", mRunNumber);
240 metaFileName = mMetaFileDir + fmt::format(
"PHOS_CalibHistos_{}.done", mRunNumber);
241 if (mMetaFileDir.compare(
"/dev/null")) {
243 std::ofstream metaFileOut(metaFileNameTmp);
244 metaFileOut << *mHistoFileMetaData.get();
246 std::filesystem::rename(metaFileNameTmp, metaFileName);
247 }
catch (std::exception
const& e) {
248 LOG(error) <<
"Failed to store PHOS histos meta data file " << metaFileName <<
", reason: " << e.what();
250 LOG(info) <<
"Stored histos metadate file " << mHistoFileName <<
".done";
252 mHistoFileMetaData.reset();
257 std::vector<InputSpec> inputs;
260 inputs.emplace_back(
"clusterTriggerRecords",
o2::header::gDataOriginPHS,
"CLUSTERTRIGREC", 0, o2::framework::Lifetime::Timeframe);
265 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(
true,
273 std::vector<OutputSpec> outputs;
278 o2::framework::adaptFromTask<PHOSEnergyCalibDevice>(useCCDB, ccdbRequest, outputDir, metaFileDir, writeRootOutput),
Utils and constants for calibration and related workflows.
Device to collect histos and digits for PHOS energy and time calibration.
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
T get(const char *key) const
ConfigParamRegistry const & options()
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
CCDB container for bad (masked) channels in PHOS.
static Geometry * GetInstance()
void updateTimeDependentParams(ProcessingContext &pc)
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(o2::framework::InitContext &ic) final
void run(o2::framework::ProcessingContext &pc) final
void stop() final
This is invoked on stop.
constexpr o2::header::DataOrigin gDataOriginPHS
constexpr TFType INFINITE_TF
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
o2::framework::DataProcessorSpec getPHOSEnergyCalibDeviceSpec(bool useCCDB, const std::string &outputDir, const std::string &metaFileDir, bool writeRootOutput)
static void fillTFIDInfo(o2::framework::ProcessingContext &pc, o2::dataformats::TFIDInfo &ti)
static std::string rectifyDirectory(const std::string_view p)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Cluster > clusters