18#include <fairlogger/Logger.h>
36 mStatistics = ic.
options().
get<
int>(
"statistics");
40 mhRatio.reset(
new TH2F(
"HGLGRatio",
"HGLGRatio",
n, 1792.5,
n + 1792.5, 100, 10., 20.));
48 if (mRunStartTime == 0) {
52 if (mStatistics <= 0) {
56 if (!mOldCalibParams) {
58 LOG(info) <<
"Getting calib from CCDB";
61 mOldCalibParams = std::make_unique<o2::phos::CalibParams>(1);
66 LOG(
debug) <<
"[PHOSHGLGRatioCalibDevice - run] Received " <<
cells.size() <<
" cells, running calibration ...";
67 auto cellsTR = ctx.
inputs().
get<gsl::span<o2::phos::TriggerRecord>>(
"cellTriggerRecords");
68 for (
const auto& tr : cellsTR) {
69 int firstCellInEvent = tr.getFirstEntry();
70 int lastCellInEvent = firstCellInEvent + tr.getNumberOfObjects();
73 for (
int i = firstCellInEvent;
i < lastCellInEvent;
i++) {
76 auto search = mMapPairs.find(
c.getAbsId());
77 if (
search != mMapPairs.end()) {
78 if (
c.getHighGain()) {
79 search->second.mHGAmp =
c.getEnergy();
82 search->second.mLGAmp =
c.getEnergy();
86 if (
c.getHighGain()) {
87 pa.mHGAmp =
c.getEnergy();
90 pa.mLGAmp =
c.getEnergy();
92 mMapPairs.insert({
c.getAbsId(), pa});
98 if (mStatistics <= 0) {
99 LOG(info) <<
"[PHOSHGLGRatioCalibDevice - finalyzing calibration]";
110 if (mStatistics > 0) {
111 LOG(info) <<
"[PHOSHGLGRatioCalibDevice - endOfStream]";
122 for (
auto& it : mMapPairs) {
123 if (it.second.mHGAmp > 0 && it.second.mLGAmp > mMinLG) {
124 mhRatio->Fill(it.first,
float(it.second.mHGAmp / it.second.mLGAmp));
134 if (mhRatio->Integral() > 2 * minimalStatistics *
n) {
136 TF1* fitFunc =
new TF1(
"fitFunc",
"gaus", 0., 4000.);
137 fitFunc->SetParameters(1., 200., 60.);
138 fitFunc->SetParLimits(1, 10., 2000.);
139 for (
short i =
n;
i > 0;
i--) {
140 TH1D* tmp = mhRatio->ProjectionY(Form(
"channel%d",
i),
i,
i);
141 fitFunc->SetParameters(tmp->Integral(), tmp->GetMean(), tmp->GetRMS());
142 if (tmp->Integral() < minimalStatistics) {
146 tmp->Fit(fitFunc,
"QL0",
"", 0., 20.);
147 float a = fitFunc->GetParameter(1);
148 mCalibParams->setHGLGRatio(
i + 1792,
a);
161 mCalibParams->setGain(
i, 0.005);
162 mCalibParams->setHGTimeCalib(
i, 0.);
163 mCalibParams->setLGTimeCalib(
i, 0.);
167 LOG(info) <<
"Retrieving current HG/LG ratio from CCDB";
169 if (!mOldCalibParams) {
171 LOG(error) <<
"Can not read current CalibParams from ccdb";
175 LOG(info) <<
"Got current calibration from CCDB";
180 if (mOldCalibParams->getHGLGRatio(
i) > 0) {
181 dp = mCalibParams->getHGLGRatio(
i) / mOldCalibParams->getHGLGRatio(
i);
183 if (mCalibParams->getHGLGRatio(
i) == 0 && mOldCalibParams->getHGLGRatio(
i) == 0) {
188 if (abs(dp - 1.) > 0.1) {
192 mCalibParams->setGain(
i, mOldCalibParams->getGain(
i));
193 mCalibParams->setHGTimeCalib(
i, mOldCalibParams->getHGTimeCalib(
i));
194 mCalibParams->setLGTimeCalib(
i, mOldCalibParams->getLGTimeCalib(
i));
196 LOG(info) << nChanged <<
"channels changed more than 10 %";
197 if (nChanged > kMinorChange) {
198 LOG(error) <<
"too many channels changed: " << nChanged <<
" (threshold " << kMinorChange <<
")";
200 LOG(error) <<
"you may use --forceupdate option to force updating ccdb";
212 if (mUpdateCCDB || mForceUpdate) {
215 std::map<std::string, std::string> md;
216 long validityTime = mRunStartTime + 31622400000;
222 <<
" of size " <<
image->size()
231 LOG(info) <<
"[PHOSHGLGRatioCalibDevice - sendOutput] Sending QC ";
238 std::vector<InputSpec> inputs;
246 std::vector<OutputSpec> outputs;
253 o2::framework::adaptFromTask<PHOSHGLGRatioCalibDevice>(useCCDB, forceUpdate),
Utils and constants for calibration and related workflows.
Definition of the Names Generator class.
static std::string generateFileName(const std::string &inp)
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
long getEndValidityTimestamp() const
const std::string & getPath() const
void setMetaData(const std::map< std::string, std::string > &md)
long getStartValidityTimestamp() const
const std::string & getFileName() const
T get(const char *key) const
DataAllocator & outputs()
ConfigParamRegistry const & options()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
static constexpr short NCHANNELS
Number of channels starting from 1.
void run(o2::framework::ProcessingContext &pc) final
void init(o2::framework::InitContext &ic) final
void sendOutput(DataAllocator &output)
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
GLboolean GLboolean GLboolean GLboolean a
constexpr o2::header::DataOrigin gDataOriginPHS
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
bool search(DeviceExecution const &execution, std::string const &option, std::string const &argument)
std::vector< ConfigParamSpec > Options
DataProcessorSpec getHGLGRatioCalibSpec(bool useCCDB, bool forceUpdate)
static constexpr o2::header::DataOrigin gDataOriginCDBWrapper
static constexpr o2::header::DataOrigin gDataOriginCDBPayload
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Cell > cells