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;
136 mCalibrator->process(tfcounter,
clusters, cluelements, cluTR, mOutputDigits);
144 mCalibrator->endOfStream();
151 LOG(info) <<
"STOP: writing output digits file";
157 if (mOutputDigits.size() < 2) {
161 LOG(info) <<
"Filling tree with " << mOutputDigits.size() <<
" digits";
163 if (mWriteRootOutput) {
164 mFileName = mOutputDir + fmt::format(
"PHOS_CalibDigits_{}.root", mRunNumber);
165 LOG(info) <<
"Creating new tree for PHOS calib digits, output file=" << mFileName;
166 mFileOut = std::make_unique<TFile>(mFileName.c_str(),
"recreate");
167 mFileMetaData = std::make_unique<o2::dataformats::FileMetaData>();
168 mHistoFileName = mOutputDir + fmt::format(
"PHOS_CalibHistos_{}.root", mRunNumber);
169 mHistoFileOut = std::make_unique<TFile>(mHistoFileName.c_str(),
"recreate");
170 mHistoFileMetaData = std::make_unique<o2::dataformats::FileMetaData>();
175 LOG(info) <<
"Creating new tree for PHOS calib digits";
176 mTreeOut = std::make_unique<TTree>(
"phosCalibDig",
"O2 PHOS calib tree");
179 auto* br = mTreeOut->GetBranch(
"PHOSCalib");
181 br = mTreeOut->Branch(
"PHOSCalib", &mOutputDigits);
188 if (!mWriteRootOutput) {
195 LOG(info) <<
"Writing calibration digits";
197 int nbits = mTreeOut->Write();
198 LOG(info) <<
"Wrote " << nbits <<
" bits";
204 mFileMetaData->fillFileData(mFileName);
205 mFileMetaData->setDataTakingContext(mDataTakingContext);
206 mFileMetaData->type =
"calib";
207 mFileMetaData->priority =
"high";
209 std::string metaFileNameTmp = mMetaFileDir + fmt::format(
"PHOS_CalibDigits_{}.tmp", mRunNumber);
210 std::string metaFileName = mMetaFileDir + fmt::format(
"PHOS_CalibDigits_{}.done", mRunNumber);
211 if (mMetaFileDir.compare(
"/dev/null")) {
213 std::ofstream metaFileOut(metaFileNameTmp);
214 metaFileOut << *mFileMetaData.get();
216 std::filesystem::rename(metaFileNameTmp, metaFileName);
217 }
catch (std::exception
const& e) {
218 LOG(error) <<
"Failed to store PHOS meta data file " << metaFileName <<
", reason: " << e.what();
220 LOG(info) <<
"Stored metadate file " << mFileName <<
".done";
222 LOG(info) <<
"Scipped storing metafile as meta-dir=" << mMetaFileDir;
224 mFileMetaData.reset();
226 LOG(info) <<
"Writing calibration histograms";
228 mHistoFileOut->WriteObjectAny(mCalibrator->getCollectedHistos(),
"o2::phos::ETCalibHistos",
"histos");
229 mHistoFileOut->Close();
230 mHistoFileOut.reset();
233 mHistoFileMetaData->fillFileData(mHistoFileName);
234 mHistoFileMetaData->setDataTakingContext(mDataTakingContext);
235 mHistoFileMetaData->type =
"calib";
236 mHistoFileMetaData->priority =
"high";
238 metaFileNameTmp = mMetaFileDir + fmt::format(
"PHOS_CalibHistos_{}.tmp", mRunNumber);
239 metaFileName = mMetaFileDir + fmt::format(
"PHOS_CalibHistos_{}.done", mRunNumber);
240 if (mMetaFileDir.compare(
"/dev/null")) {
242 std::ofstream metaFileOut(metaFileNameTmp);
243 metaFileOut << *mHistoFileMetaData.get();
245 std::filesystem::rename(metaFileNameTmp, metaFileName);
246 }
catch (std::exception
const& e) {
247 LOG(error) <<
"Failed to store PHOS histos meta data file " << metaFileName <<
", reason: " << e.what();
249 LOG(info) <<
"Stored histos metadate file " << mHistoFileName <<
".done";
251 mHistoFileMetaData.reset();
256 std::vector<InputSpec> inputs;
259 inputs.emplace_back(
"clusterTriggerRecords",
o2::header::gDataOriginPHS,
"CLUSTERTRIGREC", 0, o2::framework::Lifetime::Timeframe);
264 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(
true,
272 std::vector<OutputSpec> outputs;
277 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 std::string rectifyDirectory(const std::string_view p)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Cluster > clusters