Project
Loading...
Searching...
No Matches
TPCCalibPadGainTracksSpec.h
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
14
15#ifndef O2_CALIBRATION_TPCCALIBPADGAINTRACKSSPEC_H
16#define O2_CALIBRATION_TPCCALIBPADGAINTRACKSSPEC_H
17
18#include "Framework/Task.h"
19#include "Framework/Logger.h"
32#include "GPUO2InterfaceUtils.h"
34#include <random>
35
36using namespace o2::framework;
38using namespace o2::tpc;
39
40namespace o2
41{
42namespace tpc
43{
44
46{
47 public:
48 TPCCalibPadGainTracksDevice(std::shared_ptr<o2::globaltracking::DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> req, const o2::tpc::CorrectionMapsLoaderGloOpts& sclOpts, const uint32_t publishAfterTFs, const bool debug, const bool useLastExtractedMapAsReference, const std::string polynomialsFile, const bool disablePolynomialsCCDB) : mDataRequest(dr), mPublishAfter(publishAfterTFs), mDebug(debug), mUseLastExtractedMapAsReference(useLastExtractedMapAsReference), mDisablePolynomialsCCDB(disablePolynomialsCCDB), mCCDBRequest(req)
49 {
50 if (!polynomialsFile.empty()) {
51 LOGP(info, "Loading polynomials from file {}", polynomialsFile);
52 mPadGainTracks.loadPolTopologyCorrectionFromFile(polynomialsFile.data());
53 mDisablePolynomialsCCDB = true;
54 }
55 mTPCCorrMapsLoader.setLumiScaleType(sclOpts.lumiType);
56 mTPCCorrMapsLoader.setLumiScaleMode(sclOpts.lumiMode);
57 mTPCCorrMapsLoader.setCheckCTPIDCConsistency(sclOpts.checkCTPIDCconsistency);
58 }
59
61 {
63 mTPCCorrMapsLoader.init(ic);
64 // setting up the histogram ranges
65 const auto nBins = ic.options().get<int>("nBins");
66 auto reldEdxMin = ic.options().get<float>("reldEdxMin");
67 auto reldEdxMax = ic.options().get<float>("reldEdxMax");
68 const auto underflowBin = ic.options().get<bool>("underflowBin");
69 const auto overflowBin = ic.options().get<bool>("overflowBin");
70 const auto donotnormalize = ic.options().get<bool>("do-not-normalize");
71 const auto disableLogTransform = ic.options().get<bool>("disable-log-transform");
72 mPadGainTracks.setLogTransformQ(!disableLogTransform);
73 float mindEdx = ic.options().get<float>("mindEdx");
74 float maxdEdx = ic.options().get<float>("maxdEdx");
75 if (!disableLogTransform) {
76 if (reldEdxMin > -1) {
77 reldEdxMin = std::log(1 + reldEdxMin);
78 } else {
79 LOGP(warn, "reldEdxMin (={}) is smaller than -1!", reldEdxMin);
80 }
81 if (reldEdxMax > 0) {
82 reldEdxMax = std::log(1 + reldEdxMax);
83 } else {
84 LOGP(warn, "reldEdxMax (={}) is smaller than 0!", reldEdxMax);
85 }
86 }
87 mPadGainTracks.init(nBins, reldEdxMin, reldEdxMax, underflowBin, overflowBin);
88 mPadGainTracks.setdEdxMin(mindEdx);
89 mPadGainTracks.setdEdxMax(maxdEdx);
90 mPadGainTracks.doNotNomalize(donotnormalize);
91
92 const auto propagateTrack = ic.options().get<bool>("do-not-propagateTrack");
93 mPadGainTracks.setPropagateTrack(!propagateTrack);
94
95 const auto dedxRegionType = ic.options().get<int>("dedxRegionType");
96 mPadGainTracks.setdEdxRegion(static_cast<CalibPadGainTracks::DEdxRegion>(dedxRegionType));
97
98 const auto dedxType = ic.options().get<int>("dedxType");
99 mPadGainTracks.setMode(static_cast<CalibPadGainTracks::DEdxType>(dedxType));
100
101 const auto chargeType = ic.options().get<int>("chargeType");
102 assert(chargeType == 0 || chargeType == 1);
103 mPadGainTracks.setChargeType(static_cast<ChargeType>(chargeType));
104
105 mUseEveryNthTF = ic.options().get<int>("useEveryNthTF");
106 if (mUseEveryNthTF <= 0) {
107 mUseEveryNthTF = 1;
108 }
109
110 if (mPublishAfter > 1) {
111 std::mt19937 rng(std::time(nullptr));
112 std::uniform_int_distribution<std::mt19937::result_type> dist(1, mPublishAfter);
113 mFirstTFSend = dist(rng);
114 LOGP(info, "Publishing first data after {} processed TFs", mFirstTFSend);
115 }
116
117 mMaxTracksPerTF = ic.options().get<int>("maxTracksPerTF");
118
119 const std::string gainMapFile = ic.options().get<std::string>("gainMapFile");
120 if (!gainMapFile.empty()) {
121 LOGP(info, "Loading GainMap from file {}", gainMapFile);
122 mPadGainTracks.setRefGainMap(gainMapFile.data(), "GainMap");
123 }
124
125 const auto etaMax = ic.options().get<float>("etaMax");
126 mPadGainTracks.setMaxEta(etaMax);
127
128 const auto minClusters = ic.options().get<int>("minClusters");
129 mPadGainTracks.setMinNClusters(minClusters);
130
131 const auto momMin = ic.options().get<float>("momMin");
132 const auto momMax = ic.options().get<float>("momMax");
133 LOGP(info, "Using particle tracks with {} GeV/c < p < {} GeV/c ", momMin, momMax);
134 mPadGainTracks.setMomentumRange(momMin, momMax);
135 }
136
137 void finaliseCCDB(ConcreteDataMatcher& matcher, void* obj) final
138 {
139 LOGP(info, "finaliseCCDB");
140 if (matcher == ConcreteDataMatcher(gDataOriginTPC, "RESIDUALGAINMAP", 0)) {
141 if (!mUsingDefaultGainMapForFirstIter) {
142 LOGP(info, "Updating reference gain map from previous iteration from CCDB");
143 const auto* gainMapResidual = static_cast<std::unordered_map<std::string, o2::tpc::CalDet<float>>*>(obj);
144 mPadGainTracks.setRefGainMap(gainMapResidual->at("GainMap"));
145 } else {
146 // just skip for the first time asking for an object -> not gain map will be used as reference
147 LOGP(info, "Skipping loading reference gain map for first iteration from CCDB");
148 mUsingDefaultGainMapForFirstIter = false;
149 }
150 } else if (matcher == ConcreteDataMatcher(gDataOriginTPC, "TOPOLOGYGAIN", 0)) {
151 LOGP(info, "Updating Q topology correction from CCDB");
152 const auto* topologyCorr = static_cast<o2::tpc::CalibdEdxTrackTopologyPolContainer*>(obj);
153 mPadGainTracks.setPolTopologyCorrectionFromContainer(*topologyCorr);
154 } else if (mTPCVDriftHelper.accountCCDBInputs(matcher, obj)) {
155 } else if (mTPCCorrMapsLoader.accountCCDBInputs(matcher, obj)) {
156 } else if (o2::base::GRPGeomHelper::instance().finaliseCCDB(matcher, obj)) {
158 LOGP(info, "Setting magnetic field to {} kG", field);
159 mPadGainTracks.setFieldNominalGPUBz(field);
160 }
161 }
162
164 {
165 const auto currentTF = processing_helpers::getCurrentTF(pc);
166 if (mTFCounter++ % mUseEveryNthTF) {
167 LOGP(info, "Skipping TF {}", currentTF);
168 return;
169 }
172 recoData.collectData(pc, *mDataRequest.get());
173
174 auto tracks = recoData.getTPCTracks();
175 auto clRefs = recoData.getTPCTracksClusterRefs();
176 const auto& clusters = recoData.inputsTPCclusters;
177 const auto nTracks = tracks.size();
178 if (nTracks == 0) {
179 return;
180 }
181 LOGP(detail, "Processing TF {} with {} tracks by considering {} tracks", currentTF, nTracks, mMaxTracksPerTF);
182
183 if (!mDisablePolynomialsCCDB) {
184 pc.inputs().get<o2::tpc::CalibdEdxTrackTopologyPolContainer*>("tpctopologygain");
185 }
186
187 if (mUseLastExtractedMapAsReference) {
188 LOGP(info, "fetching residual gain map");
189 pc.inputs().get<std::unordered_map<std::string, o2::tpc::CalDet<float>>*>("tpcresidualgainmap");
190 }
191 mTPCVDriftHelper.extractCCDBInputs(pc);
192 mTPCCorrMapsLoader.extractCCDBInputs(pc);
193 bool updateMaps = false;
194 if (mTPCCorrMapsLoader.isUpdated()) {
195 mTPCCorrMapsLoader.acknowledgeUpdate();
196 updateMaps = true;
197 }
198 mPadGainTracks.setTPCCorrMaps(&mTPCCorrMapsLoader);
199 if (mTPCVDriftHelper.isUpdated()) {
200 LOGP(info, "Updating TPC fast transform map with new VDrift factor of {} wrt reference {} and DriftTimeOffset correction {} wrt {} from source {}",
201 mTPCVDriftHelper.getVDriftObject().corrFact, mTPCVDriftHelper.getVDriftObject().refVDrift,
202 mTPCVDriftHelper.getVDriftObject().timeOffsetCorr, mTPCVDriftHelper.getVDriftObject().refTimeOffset,
203 mTPCVDriftHelper.getSourceName());
204 mPadGainTracks.setTPCVDrift(mTPCVDriftHelper.getVDriftObject());
205 mTPCVDriftHelper.acknowledgeUpdate();
206 updateMaps = true;
207 }
208 if (updateMaps) {
209 mTPCCorrMapsLoader.updateVDrift(mTPCVDriftHelper.getVDriftObject().corrFact, mTPCVDriftHelper.getVDriftObject().refVDrift, mTPCVDriftHelper.getVDriftObject().getTimeOffset());
210 }
211
212 mPadGainTracks.setMembers(&tracks, &clRefs, clusters->clusterIndex, recoData.clusterShMapTPC, recoData.occupancyMapTPC);
213 mPadGainTracks.processTracks(mMaxTracksPerTF);
214 ++mProcessedTFs;
215 if ((mFirstTFSend == mProcessedTFs) || (mPublishAfter && (mProcessedTFs % mPublishAfter) == 0)) {
216 LOGP(info, "Publishing after {} TFs", mProcessedTFs);
217 mProcessedTFs = 0;
218 mFirstTFSend = 0; // set to zero in order to only trigger once
219 if (mDebug) {
220 mPadGainTracks.dumpToFile(fmt::format("calPadGain_TF{}.root", currentTF).data());
221 }
222 sendOutput(pc.outputs());
223 }
224 }
225
226 private:
227 const uint32_t mPublishAfter{0};
228 const bool mDebug{false};
229 const bool mUseLastExtractedMapAsReference{false};
230 bool mDisablePolynomialsCCDB{false};
231 std::shared_ptr<o2::globaltracking::DataRequest> mDataRequest;
232 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
233 uint32_t mProcessedTFs{0};
234 uint32_t mTFCounter{0};
235 CalibPadGainTracks mPadGainTracks{false};
236 bool mUsingDefaultGainMapForFirstIter{true};
237 unsigned int mUseEveryNthTF{1};
238 unsigned int mFirstTFSend{1};
239 int mMaxTracksPerTF{-1};
240 o2::tpc::VDriftHelper mTPCVDriftHelper{};
241 o2::tpc::CorrectionMapsLoader mTPCCorrMapsLoader{};
242
243 void sendOutput(DataAllocator& output)
244 {
245 output.snapshot(Output{"TPC", "TRACKGAINHISTOS", 0}, *mPadGainTracks.getHistos().get());
246 mPadGainTracks.resetHistos();
247 }
248};
249
250DataProcessorSpec getTPCCalibPadGainTracksSpec(const uint32_t publishAfterTFs, const bool debug, const bool useLastExtractedMapAsReference, const std::string polynomialsFile, bool disablePolynomialsCCDB, const o2::tpc::CorrectionMapsLoaderGloOpts& sclOpts)
251{
252 std::vector<InputSpec> inputs;
253 auto dataRequest = std::make_shared<o2::globaltracking::DataRequest>();
254 dataRequest->requestTracks(o2::dataformats::GlobalTrackID::getSourceMask(o2::dataformats::GlobalTrackID::TPC), false);
255 dataRequest->requestClusters(o2::dataformats::GlobalTrackID::getSourceMask(o2::dataformats::GlobalTrackID::TPC), false);
256
257 if (sclOpts.lumiType == 1) {
258 dataRequest->inputs.emplace_back("CTPLumi", "CTP", "LUMI", 0, Lifetime::Timeframe);
259 }
260
261 if (!polynomialsFile.empty()) {
262 disablePolynomialsCCDB = true;
263 }
264
265 if (!disablePolynomialsCCDB) {
266 dataRequest->inputs.emplace_back("tpctopologygain", gDataOriginTPC, "TOPOLOGYGAIN", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalTopologyGain)));
267 }
268
269 if (useLastExtractedMapAsReference) {
270 dataRequest->inputs.emplace_back("tpcresidualgainmap", gDataOriginTPC, "RESIDUALGAINMAP", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalPadGainResidual)));
271 }
272
273 o2::tpc::VDriftHelper::requestCCDBInputs(dataRequest->inputs);
274 Options opts{
275 {"nBins", VariantType::Int, 20, {"Number of bins per histogram"}},
276 {"reldEdxMin", VariantType::Int, 0, {"Minimum x coordinate of the histogram for Q/(dE/dx)"}},
277 {"reldEdxMax", VariantType::Int, 3, {"Maximum x coordinate of the histogram for Q/(dE/dx)"}},
278 {"underflowBin", VariantType::Bool, false, {"Using under flow bin"}},
279 {"overflowBin", VariantType::Bool, true, {"Using overflow flow bin"}},
280 {"momMin", VariantType::Float, 0.3f, {"minimum momentum of the tracks which are used for the pad-by-pad gain map"}},
281 {"momMax", VariantType::Float, 1.f, {"maximum momentum of the tracks which are used for the pad-by-pad gain map"}},
282 {"etaMax", VariantType::Float, 1.f, {"maximum eta of the tracks which are used for the pad-by-pad gain map"}},
283 {"disable-log-transform", VariantType::Bool, false, {"Disable the transformation of q/dedx -> log(1 + q/dedx)"}},
284 {"do-not-normalize", VariantType::Bool, false, {"Do not normalize the cluster charge to the dE/dx"}},
285 {"mindEdx", VariantType::Float, 10.f, {"Minimum accepted dE/dx value"}},
286 {"maxdEdx", VariantType::Float, 500.f, {"Maximum accepted dE/dx value (-1=accept all dE/dx)"}},
287 {"minClusters", VariantType::Int, 50, {"minimum number of clusters of tracks which are used for the pad-by-pad gain map"}},
288 {"gainMapFile", VariantType::String, "", {"file to reference gain map, which will be used for correcting the cluster charge"}},
289 {"dedxRegionType", VariantType::Int, 2, {"using the dE/dx per chamber (0), stack (1) or per sector (2)"}},
290 {"dedxType", VariantType::Int, 0, {"recalculating the dE/dx (0), using it from tracking (1)"}},
291 {"chargeType", VariantType::Int, 0, {"Using qMax (0) or qTot (1) for the dE/dx and the pad-by-pad histograms"}},
292 {"do-not-propagateTrack", VariantType::Bool, false, {"Performing a refit for obtaining track parameters instead of propagating."}},
293 {"useEveryNthTF", VariantType::Int, 10, {"Using only a fraction of the data: 1: Use every TF, 10: Use only every tenth TF."}},
294 {"maxTracksPerTF", VariantType::Int, 10000, {"Maximum number of processed tracks per TF (-1 for processing all tracks)"}},
295 };
296 o2::tpc::CorrectionMapsLoader::requestCCDBInputs(dataRequest->inputs, opts, sclOpts);
297
298 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
299 false, // GRPECS=true
300 false, // GRPLHCIF
301 true, // GRPMagField
302 true, // askMatLUT
304 dataRequest->inputs);
305
306 std::vector<OutputSpec> outputs;
307 outputs.emplace_back(gDataOriginTPC, "TRACKGAINHISTOS", 0, o2::framework::Lifetime::Sporadic);
308
309 return DataProcessorSpec{
310 "calib-tpc-gainmap-tracks",
311 dataRequest->inputs,
312 outputs,
313 AlgorithmSpec{adaptFromTask<TPCCalibPadGainTracksDevice>(dataRequest, ccdbRequest, sclOpts, publishAfterTFs, debug, useLastExtractedMapAsReference, polynomialsFile, disablePolynomialsCCDB)},
314 opts}; // end DataProcessorSpec
315}
316
317} // namespace tpc
318} // namespace o2
319
320#endif
Simple interface to the CDB manager.
Helper class to access load maps from CCDB.
Wrapper container for different reconstructed object types.
Helper for geometry and GRP related CCDB requests.
Header of the General Run Parameters object.
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
Definition of the Names Generator class.
Helper class to extract VDrift from different sources.
std::ostringstream debug
Helper class to obtain TPC clusters / digits / labels from DPL.
void checkUpdates(o2::framework::ProcessingContext &pc)
bool finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static float getNominalGPUBz(T &src)
void resetHistos()
resetting the histograms which are used for extraction of the gain map
bool setLogTransformQ(const bool logTransformQ)
set if the cluster charge is transformed using log(1+Q)
const auto & getHistos() const
returns calpad containing pad-by-pad histograms
void init(const unsigned int nBins, const float xmin, const float xmax, const bool useUnderflow, const bool useOverflow)
Gain calibration class.
void setTPCCorrMaps(o2::gpu::CorrectionMapsHelper *maph)
set cluster correction maps helper
void setTPCVDrift(const o2::tpc::VDriftCorrFact &v)
set VDrift correction
void setPolTopologyCorrectionFromContainer(const CalibdEdxTrackTopologyPolContainer &polynomials)
void doNotNomalize(const bool doNotNormCharge)
void setdEdxMin(const float mindedx)
void setMomentumRange(const float momMin, const float momMax)
void setRefGainMap(const char *inpFile, const char *mapName)
void loadPolTopologyCorrectionFromFile(std::string_view fileName)
void processTracks(const int nMaxTracks=-1)
void setdEdxMax(const float maxdEdx)
void setFieldNominalGPUBz(const float field)
void setdEdxRegion(const DEdxRegion dedx)
set how the dedx is calculated which is used for normalizing the cluster charge
void setPropagateTrack(const bool propagate)
void setMaxEta(const float eta)
void setMinNClusters(const int nCl)
DEdxType
mode of normalizing qmax
void setChargeType(const ChargeType chargeType)
void dumpToFile(const char *outFileName="calPadGainTracks.root", const char *outName="calPadGain") const
void setMembers(gsl::span< const o2::tpc::TrackTPC > *vTPCTracksArrayInp, gsl::span< const o2::tpc::TPCClRefElem > *tpcTrackClIdxVecInput, const o2::tpc::ClusterNativeAccess &clIndex, gsl::span< const unsigned char > TPCRefitterShMap, gsl::span< const unsigned int > TPCRefitterOccMap)
void extractCCDBInputs(o2::framework::ProcessingContext &pc)
void updateVDrift(float vdriftCorr, float vdrifRef, float driftTimeOffset=0)
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs, std::vector< o2::framework::ConfigParamSpec > &options, const CorrectionMapsLoaderGloOpts &gloOpts)
void init(o2::framework::InitContext &ic)
void run(o2::framework::ProcessingContext &pc) final
void init(o2::framework::InitContext &ic) final
TPCCalibPadGainTracksDevice(std::shared_ptr< o2::globaltracking::DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > req, const o2::tpc::CorrectionMapsLoaderGloOpts &sclOpts, const uint32_t publishAfterTFs, const bool debug, const bool useLastExtractedMapAsReference, const std::string polynomialsFile, const bool disablePolynomialsCCDB)
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs, bool laser=true, bool itstpcTgl=true)
void extractCCDBInputs(o2::framework::ProcessingContext &pc, bool laser=true, bool itstpcTgl=true)
const VDriftCorrFact & getVDriftObject() const
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
static std::string_view getSourceName(Source s)
bool isUpdated() const
GLboolean * data
Definition glcorearb.h:298
constexpr o2::header::DataOrigin gDataOriginTPC
Definition DataHeader.h:576
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
auto get(const std::byte *buffer, size_t=0)
Definition DataHeader.h:454
uint32_t getCurrentTF(o2::framework::ProcessingContext &pc)
Global TPC definitions and constants.
Definition SimTraits.h:167
o2::framework::DataProcessorSpec getTPCCalibPadGainTracksSpec(const bool useLastExtractedMapAsReference)
create a processor spec
ChargeType
Definition Defs.h:70
const std::unordered_map< CDBType, const std::string > CDBTypeMap
Storage name in CCDB for each calibration and parameter type.
Definition CDBTypes.h:96
@ CalPadGainResidual
ResidualpPad gain calibration (e.g. from tracks)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
gsl::span< const unsigned char > clusterShMapTPC
externally set TPC clusters sharing map
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
std::unique_ptr< o2::tpc::internal::getWorkflowTPCInput_ret > inputsTPCclusters
gsl::span< const unsigned int > occupancyMapTPC
externally set TPC clusters occupancy map
simple struct to enable writing the MultivariatePolynomialCT to file
int lumiType
what estimator to used for corrections scaling: 0: no scaling, 1: CTP, 2: IDC
int lumiMode
what corrections method to use: 0: classical scaling, 1: Using of the derivative map,...
float refTimeOffset
additive time offset reference (\mus)
float refVDrift
reference vdrift for which factor was extracted
float getTimeOffset() const
float timeOffsetCorr
additive time offset correction (\mus)
float corrFact
drift velocity correction factor (multiplicative)
std::vector< Cluster > clusters