Project
Loading...
Searching...
No Matches
CalibdEdxSpec.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
17
18// o2 includes
19#include "CCDB/CcdbApi.h"
20#include "CCDB/CcdbObjectInfo.h"
21// #include "CommonUtils/NameConf.h"
23// #include "DataFormatsParameters/GRPObject.h"
25#include "Framework/Task.h"
32#include "TPCBase/CDBTypes.h"
33#include "TPCBase/Utils.h"
35
36using namespace o2::framework;
37
38namespace o2::tpc
39{
40
41class CalibdEdxDevice : public Task
42{
43 public:
44 CalibdEdxDevice(std::shared_ptr<o2::base::GRPGeomRequest> req, const o2::base::Propagator::MatCorrType matType) : mCCDBRequest(req), mMatType(matType) {}
45
47 {
49 const auto minEntriesSector = ic.options().get<int>("min-entries-sector");
50 const auto minEntries1D = ic.options().get<int>("min-entries-1d");
51 const auto minEntries2D = ic.options().get<int>("min-entries-2d");
52 const auto fitPasses = ic.options().get<int>("fit-passes");
53 const auto fitThreshold = ic.options().get<float>("fit-threshold");
54 const auto fitThresholdLowFactor = ic.options().get<float>("fit-threshold-low-factor");
55
56 const auto dEdxBins = ic.options().get<int>("dedxbins");
57 const auto mindEdx = ic.options().get<float>("min-dedx");
58 const auto maxdEdx = ic.options().get<float>("max-dedx");
59 const auto angularBins = ic.options().get<int>("angularbins");
60 const auto fitSnp = ic.options().get<bool>("fit-snp");
61 mMakeGaussianFits = !ic.options().get<bool>("disable-gaussian-fits");
62
63 mDumpToFile = ic.options().get<int>("file-dump");
64
65 mCalib = std::make_unique<CalibdEdx>(dEdxBins, mindEdx, maxdEdx, angularBins, fitSnp);
66 mCalib->setApplyCuts(false);
67 mCalib->setSectorFitThreshold(minEntriesSector);
68 mCalib->set1DFitThreshold(minEntries1D);
69 mCalib->set2DFitThreshold(minEntries2D);
70 mCalib->setElectronCut(fitThreshold, fitPasses, fitThresholdLowFactor);
71 mCalib->setMaterialType(mMatType);
72
73 mCustomdEdxFileName = o2::gpu::GPUConfigurableParamGPUSettingsO2::Instance().dEdxCorrFile;
74 mDisableTimeGain = o2::gpu::GPUConfigurableParamGPUSettingsO2::Instance().dEdxDisableResidualGain;
75
76 if (mDisableTimeGain) {
77 LOGP(info, "TimeGain correction was disabled via GPU_global.dEdxDisableResidualGain=1");
78 }
79
80 if (!mDisableTimeGain && !mCustomdEdxFileName.empty()) {
81 std::unique_ptr<TFile> fdEdxCustom(TFile::Open(mCustomdEdxFileName.data()));
82 if (!fdEdxCustom || !fdEdxCustom->IsOpen() || fdEdxCustom->IsZombie()) {
83 LOGP(error, "Could not open custom TimeGain file {}", mCustomdEdxFileName);
84 } else {
85 const auto timeGain = fdEdxCustom->Get<o2::tpc::CalibdEdxCorrection>("CalibdEdxCorrection");
86 if (!timeGain) {
87 LOGP(error, "Could not load 'CalibdEdxCorrection' from file {}", mCustomdEdxFileName);
88 } else {
89 const auto meanParamTot = timeGain->getMeanParams(ChargeType::Tot);
90 LOGP(info, "Loaded custom TimeGain from file {} with {} dimensions and mean qTot Params {}", mCustomdEdxFileName, timeGain->getDims(), utils::elementsToString(meanParamTot));
91 mCalib->setCalibrationInput(*timeGain);
92 }
93 }
94 }
95 }
96
97 void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final
98 {
100 return;
101 }
102 if ((mDisableTimeGain == 0) && mCustomdEdxFileName.empty() && (matcher == ConcreteDataMatcher("TPC", "TIMEGAIN", 0))) {
103 mCalib->setCalibrationInput(*(o2::tpc::CalibdEdxCorrection*)obj);
104 const auto meanParamTot = mCalib->getCalibrationInput().getMeanParams(ChargeType::Tot);
105 LOGP(info, "Updating TimeGain with {} dimensions and mean qTot Params {}", mCalib->getCalibrationInput().getDims(), utils::elementsToString(meanParamTot));
106 return;
107 }
108 }
109
110 void run(ProcessingContext& pc) final
111 {
113 checkUpdates(pc);
114 const auto tfcounter = o2::header::get<DataProcessingHeader*>(pc.inputs().get("tracks").header)->startTime;
115 const auto tracks = pc.inputs().get<gsl::span<TrackTPC>>("tracks");
116
117 LOGP(detail, "Processing TF {} with {} tracks", tfcounter, tracks.size());
118 mCalib->fill(tracks);
119
120 // store run number and CCDB time only once
121 if ((mTimeStampStart == 0) || (pc.services().get<o2::framework::TimingInfo>().timeslice == 0)) {
122 mRunNumber = processing_helpers::getRunNumber(pc);
123 mTimeStampStart = processing_helpers::getTimeStamp(pc, o2::base::GRPGeomHelper::instance().getOrbitResetTimeMS());
124 LOGP(info, "Setting start time stamp for writing to CCDB to {}", mTimeStampStart);
125 }
126 }
127
129 {
130 LOGP(info, "Finalizing calibration");
131 mCalib->finalize(mMakeGaussianFits);
132 mCalib->print();
133 sendOutput(eos.outputs());
134
135 if (mDumpToFile) {
136 mCalib->dumpToFile("calibdEdx_Obj.root", "calib");
137 mCalib->getCalib().writeToFile("calibdEdx.root");
138 if (mDumpToFile > 1) {
139 mCalib->writeTTree("calibdEdx.histo.tree.root");
140 }
141 }
142 }
143
144 private:
145 void sendOutput(DataAllocator& output)
146 {
147 const auto& corr = mCalib->getCalib();
148 o2::ccdb::CcdbObjectInfo info(CDBTypeMap.at(CDBType::CalTimeGain), std::string{}, std::string{}, std::map<std::string, std::string>{{"runNumber", std::to_string(mRunNumber)}}, mTimeStampStart, o2::ccdb::CcdbObjectInfo::INFINITE_TIMESTAMP);
149 auto image = o2::ccdb::CcdbApi::createObjectImage(&corr, &info);
150 LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", info.getPath(), info.getFileName(), image->size(), info.getStartValidityTimestamp(), info.getEndValidityTimestamp());
151 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TPC_CalibdEdx", 0}, *image.get());
152 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TPC_CalibdEdx", 0}, info);
153 }
154
155 void checkUpdates(ProcessingContext& pc) const
156 {
157 if (pc.inputs().isValid("tpctimegain")) {
158 pc.inputs().get<o2::tpc::CalibdEdxCorrection*>("tpctimegain");
159 } else {
160 return;
161 }
162 }
163
164 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
165 const o2::base::Propagator::MatCorrType mMatType{};
166 int mDumpToFile{};
167 uint64_t mRunNumber{0};
168 uint64_t mTimeStampStart{0};
169 std::unique_ptr<CalibdEdx> mCalib;
170 bool mMakeGaussianFits{true};
171 bool mDisableTimeGain{false};
172 std::string mCustomdEdxFileName{};
173};
174
176{
177 const bool enableAskMatLUT = matType == o2::base::Propagator::MatCorrType::USEMatCorrLUT;
178 std::vector<OutputSpec> outputs;
179 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TPC_CalibdEdx"}, Lifetime::Sporadic);
180 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TPC_CalibdEdx"}, Lifetime::Sporadic);
181 std::vector<InputSpec> inputs{{"tracks", "TPC", "MIPS", Lifetime::Sporadic}};
182 inputs.emplace_back("tpctimegain", "TPC", "TIMEGAIN", 0, Lifetime::Condition, ccdbParamSpec(o2::tpc::CDBTypeMap.at(o2::tpc::CDBType::CalTimeGain), {}, 1)); // time-dependent
183
184 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
185 false, // GRPECS=true
186 false, // GRPLHCIF
187 true, // GRPMagField
188 enableAskMatLUT, // askMatLUT
190 inputs,
191 true,
192 true);
193
194 return DataProcessorSpec{
195 "tpc-calib-dEdx",
196 inputs,
197 outputs,
198 adaptFromTask<CalibdEdxDevice>(ccdbRequest, matType),
199 Options{
200 {"min-entries-sector", VariantType::Int, 1000, {"min entries per GEM stack to enable sector by sector correction. Below this value we only perform one fit per ROC type (IROC, OROC1, ...; no side nor sector information)."}},
201 {"min-entries-1d", VariantType::Int, 10000, {"minimum entries per stack to fit 1D correction"}},
202 {"min-entries-2d", VariantType::Int, 50000, {"minimum entries per stack to fit 2D correction"}},
203 {"fit-passes", VariantType::Int, 3, {"number of fit iterations"}},
204 {"fit-threshold", VariantType::Float, 0.2f, {"dEdx width around the MIP peak used in the fit"}},
205 {"fit-threshold-low-factor", VariantType::Float, 1.5f, {"factor for low dEdx width around the MIP peak used in the fit"}},
206
207 {"dedxbins", VariantType::Int, 70, {"number of dEdx bins"}},
208 {"min-dedx", VariantType::Float, 10.0f, {"minimum value for dEdx histograms"}},
209 {"max-dedx", VariantType::Float, 90.0f, {"maximum value for dEdx histograms"}},
210 {"angularbins", VariantType::Int, 36, {"number of angular bins: Tgl and Snp"}},
211 {"fit-snp", VariantType::Bool, false, {"enable Snp correction"}},
212 {"disable-gaussian-fits", VariantType::Bool, false, {"disable calibration with gaussian fits and use mean instead"}},
213
214 {"file-dump", VariantType::Int, 0, {"directly dump calibration to file"}}}};
215}
216
217} // namespace o2::tpc
CDB Type definitions for TPC.
Workflow for time based dE/dx calibration.
This file provides the container used for time based residual dE/dx calibration.
Utils and constants for calibration and related workflows.
Helper for geometry and GRP related CCDB requests.
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
static constexpr long INFINITE_TIMESTAMP
bool isValid(std::string const &s) const
Helper method to be used to check if a given part of the InputRecord is present.
decltype(auto) get(R binding, int part=0) const
InputRecord & inputs()
The inputs associated with this processing context.
CalibdEdxDevice(std::shared_ptr< o2::base::GRPGeomRequest > req, const o2::base::Propagator::MatCorrType matType)
void init(framework::InitContext &ic) final
void endOfStream(EndOfStreamContext &eos) final
void run(ProcessingContext &pc) final
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
GLeglImageOES image
Definition glcorearb.h:4021
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
uint64_t getTimeStamp(o2::framework::ProcessingContext &pc)
uint64_t getRunNumber(o2::framework::ProcessingContext &pc)
std::string elementsToString(Iterator begin, Iterator end, const std::string separator=", ")
Definition Utils.h:74
Global TPC definitions and constants.
Definition SimTraits.h:167
@ Tot
Definition Defs.h:72
o2::framework::DataProcessorSpec getCalibdEdxSpec(const o2::base::Propagator::MatCorrType matType)
create a processor spec
const std::unordered_map< CDBType, const std::string > CDBTypeMap
Storage name in CCDB for each calibration and parameter type.
Definition CDBTypes.h:94
@ CalTimeGain
Gain variation over time.
static constexpr o2::header::DataOrigin gDataOriginCDBWrapper
Definition Utils.h:44
static constexpr o2::header::DataOrigin gDataOriginCDBPayload
Definition Utils.h:43