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"
29#include "TPCFastTransformPOD.h"
31#include "GPUO2InterfaceUtils.h"
33#include <random>
34
35using namespace o2::framework;
37using namespace o2::tpc;
38
39namespace o2
40{
41namespace tpc
42{
43
45{
46 public:
47 TPCCalibPadGainTracksDevice(std::shared_ptr<o2::globaltracking::DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> req, 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)
48 {
49 if (!polynomialsFile.empty()) {
50 LOGP(info, "Loading polynomials from file {}", polynomialsFile);
51 mPadGainTracks.loadPolTopologyCorrectionFromFile(polynomialsFile.data());
52 mDisablePolynomialsCCDB = true;
53 }
54 }
55
57 {
59 // setting up the histogram ranges
60 const auto nBins = ic.options().get<int>("nBins");
61 auto reldEdxMin = ic.options().get<float>("reldEdxMin");
62 auto reldEdxMax = ic.options().get<float>("reldEdxMax");
63 const auto underflowBin = ic.options().get<bool>("underflowBin");
64 const auto overflowBin = ic.options().get<bool>("overflowBin");
65 const auto donotnormalize = ic.options().get<bool>("do-not-normalize");
66 const auto disableLogTransform = ic.options().get<bool>("disable-log-transform");
67 mPadGainTracks.setLogTransformQ(!disableLogTransform);
68 float mindEdx = ic.options().get<float>("mindEdx");
69 float maxdEdx = ic.options().get<float>("maxdEdx");
70 if (!disableLogTransform) {
71 if (reldEdxMin > -1) {
72 reldEdxMin = std::log(1 + reldEdxMin);
73 } else {
74 LOGP(warn, "reldEdxMin (={}) is smaller than -1!", reldEdxMin);
75 }
76 if (reldEdxMax > 0) {
77 reldEdxMax = std::log(1 + reldEdxMax);
78 } else {
79 LOGP(warn, "reldEdxMax (={}) is smaller than 0!", reldEdxMax);
80 }
81 }
82 mPadGainTracks.init(nBins, reldEdxMin, reldEdxMax, underflowBin, overflowBin);
83 mPadGainTracks.setdEdxMin(mindEdx);
84 mPadGainTracks.setdEdxMax(maxdEdx);
85 mPadGainTracks.doNotNomalize(donotnormalize);
86
87 const auto propagateTrack = ic.options().get<bool>("do-not-propagateTrack");
88 mPadGainTracks.setPropagateTrack(!propagateTrack);
89
90 const auto dedxRegionType = ic.options().get<int>("dedxRegionType");
91 mPadGainTracks.setdEdxRegion(static_cast<CalibPadGainTracks::DEdxRegion>(dedxRegionType));
92
93 const auto dedxType = ic.options().get<int>("dedxType");
94 mPadGainTracks.setMode(static_cast<CalibPadGainTracks::DEdxType>(dedxType));
95
96 const auto chargeType = ic.options().get<int>("chargeType");
97 assert(chargeType == 0 || chargeType == 1);
98 mPadGainTracks.setChargeType(static_cast<ChargeType>(chargeType));
99
100 mUseEveryNthTF = ic.options().get<int>("useEveryNthTF");
101 if (mUseEveryNthTF <= 0) {
102 mUseEveryNthTF = 1;
103 }
104
105 if (mPublishAfter > 1) {
106 std::mt19937 rng(std::time(nullptr));
107 std::uniform_int_distribution<std::mt19937::result_type> dist(1, mPublishAfter);
108 mFirstTFSend = dist(rng);
109 LOGP(info, "Publishing first data after {} processed TFs", mFirstTFSend);
110 }
111
112 mMaxTracksPerTF = ic.options().get<int>("maxTracksPerTF");
113
114 const std::string gainMapFile = ic.options().get<std::string>("gainMapFile");
115 if (!gainMapFile.empty()) {
116 LOGP(info, "Loading GainMap from file {}", gainMapFile);
117 mPadGainTracks.setRefGainMap(gainMapFile.data(), "GainMap");
118 }
119
120 const auto etaMax = ic.options().get<float>("etaMax");
121 mPadGainTracks.setMaxEta(etaMax);
122
123 const auto minClusters = ic.options().get<int>("minClusters");
124 mPadGainTracks.setMinNClusters(minClusters);
125
126 const auto momMin = ic.options().get<float>("momMin");
127 const auto momMax = ic.options().get<float>("momMax");
128 LOGP(info, "Using particle tracks with {} GeV/c < p < {} GeV/c ", momMin, momMax);
129 mPadGainTracks.setMomentumRange(momMin, momMax);
130 }
131
132 void finaliseCCDB(ConcreteDataMatcher& matcher, void* obj) final
133 {
134 LOGP(info, "finaliseCCDB");
135 if (matcher == ConcreteDataMatcher(gDataOriginTPC, "RESIDUALGAINMAP", 0)) {
136 if (!mUsingDefaultGainMapForFirstIter) {
137 LOGP(info, "Updating reference gain map from previous iteration from CCDB");
138 const auto* gainMapResidual = static_cast<std::unordered_map<std::string, o2::tpc::CalDet<float>>*>(obj);
139 mPadGainTracks.setRefGainMap(gainMapResidual->at("GainMap"));
140 } else {
141 // just skip for the first time asking for an object -> not gain map will be used as reference
142 LOGP(info, "Skipping loading reference gain map for first iteration from CCDB");
143 mUsingDefaultGainMapForFirstIter = false;
144 }
145 } else if (matcher == ConcreteDataMatcher(gDataOriginTPC, "TOPOLOGYGAIN", 0)) {
146 LOGP(info, "Updating Q topology correction from CCDB");
147 const auto* topologyCorr = static_cast<o2::tpc::CalibdEdxTrackTopologyPolContainer*>(obj);
148 mPadGainTracks.setPolTopologyCorrectionFromContainer(*topologyCorr);
149 } else if (o2::base::GRPGeomHelper::instance().finaliseCCDB(matcher, obj)) {
151 LOGP(info, "Setting magnetic field to {} kG", field);
152 mPadGainTracks.setFieldNominalGPUBz(field);
153 }
154 }
155
157 {
158 const auto currentTF = processing_helpers::getCurrentTF(pc);
159 if (mTFCounter++ % mUseEveryNthTF) {
160 LOGP(info, "Skipping TF {}", currentTF);
161 return;
162 }
165 recoData.collectData(pc, *mDataRequest.get());
166
167 auto tracks = recoData.getTPCTracks();
168 auto clRefs = recoData.getTPCTracksClusterRefs();
169 const auto& clusters = recoData.inputsTPCclusters;
170 const auto nTracks = tracks.size();
171 if (nTracks == 0) {
172 return;
173 }
174 LOGP(detail, "Processing TF {} with {} tracks by considering {} tracks", currentTF, nTracks, mMaxTracksPerTF);
175
176 if (!mDisablePolynomialsCCDB) {
177 pc.inputs().get<o2::tpc::CalibdEdxTrackTopologyPolContainer*>("tpctopologygain");
178 }
179
180 if (mUseLastExtractedMapAsReference) {
181 LOGP(info, "fetching residual gain map");
182 pc.inputs().get<std::unordered_map<std::string, o2::tpc::CalDet<float>>*>("tpcresidualgainmap");
183 }
184
185 auto const& raw = pc.inputs().get<const char*>("corrMap");
186 mTPCCorrMaps = &o2::gpu::TPCFastTransformPOD::get(raw);
187 mPadGainTracks.setTPCCorrMaps(mTPCCorrMaps);
188 mPadGainTracks.setMembers(&tracks, &clRefs, clusters->clusterIndex, recoData.clusterShMapTPC, recoData.occupancyMapTPC);
189 mPadGainTracks.processTracks(mMaxTracksPerTF);
190 ++mProcessedTFs;
191 if ((mFirstTFSend == mProcessedTFs) || (mPublishAfter && (mProcessedTFs % mPublishAfter) == 0)) {
192 LOGP(info, "Publishing after {} TFs", mProcessedTFs);
193 mProcessedTFs = 0;
194 mFirstTFSend = 0; // set to zero in order to only trigger once
195 if (mDebug) {
196 mPadGainTracks.dumpToFile(fmt::format("calPadGain_TF{}.root", currentTF).data());
197 }
198 sendOutput(pc.outputs());
199 }
200 }
201
202 private:
203 const uint32_t mPublishAfter{0};
204 const bool mDebug{false};
205 const bool mUseLastExtractedMapAsReference{false};
206 bool mDisablePolynomialsCCDB{false};
207 std::shared_ptr<o2::globaltracking::DataRequest> mDataRequest;
208 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
209 uint32_t mProcessedTFs{0};
210 uint32_t mTFCounter{0};
211 CalibPadGainTracks mPadGainTracks{false};
212 bool mUsingDefaultGainMapForFirstIter{true};
213 unsigned int mUseEveryNthTF{1};
214 unsigned int mFirstTFSend{1};
215 int mMaxTracksPerTF{-1};
216 const o2::gpu::TPCFastTransformPOD* mTPCCorrMaps{nullptr};
217
218 void sendOutput(DataAllocator& output)
219 {
220 output.snapshot(Output{"TPC", "TRACKGAINHISTOS", 0}, *mPadGainTracks.getHistos().get());
221 mPadGainTracks.resetHistos();
222 }
223};
224
225DataProcessorSpec getTPCCalibPadGainTracksSpec(const uint32_t publishAfterTFs, const bool debug, const bool useLastExtractedMapAsReference, const std::string polynomialsFile, bool disablePolynomialsCCDB)
226{
227 std::vector<InputSpec> inputs;
228 auto dataRequest = std::make_shared<o2::globaltracking::DataRequest>();
229 dataRequest->requestTracks(o2::dataformats::GlobalTrackID::getSourceMask(o2::dataformats::GlobalTrackID::TPC), false);
230 dataRequest->requestClusters(o2::dataformats::GlobalTrackID::getSourceMask(o2::dataformats::GlobalTrackID::TPC), false);
231
232 // if (sclOpts.lumiType == 1) {
233 // dataRequest->inputs.emplace_back("CTPLumi", "CTP", "LUMI", 0, Lifetime::Timeframe);
234 // }
235
236 if (!polynomialsFile.empty()) {
237 disablePolynomialsCCDB = true;
238 }
239
240 if (!disablePolynomialsCCDB) {
241 dataRequest->inputs.emplace_back("tpctopologygain", gDataOriginTPC, "TOPOLOGYGAIN", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalTopologyGain)));
242 }
243
244 if (useLastExtractedMapAsReference) {
245 dataRequest->inputs.emplace_back("tpcresidualgainmap", gDataOriginTPC, "RESIDUALGAINMAP", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalPadGainResidual)));
246 }
247
248 Options opts{
249 {"nBins", VariantType::Int, 20, {"Number of bins per histogram"}},
250 {"reldEdxMin", VariantType::Int, 0, {"Minimum x coordinate of the histogram for Q/(dE/dx)"}},
251 {"reldEdxMax", VariantType::Int, 3, {"Maximum x coordinate of the histogram for Q/(dE/dx)"}},
252 {"underflowBin", VariantType::Bool, false, {"Using under flow bin"}},
253 {"overflowBin", VariantType::Bool, true, {"Using overflow flow bin"}},
254 {"momMin", VariantType::Float, 0.3f, {"minimum momentum of the tracks which are used for the pad-by-pad gain map"}},
255 {"momMax", VariantType::Float, 1.f, {"maximum momentum of the tracks which are used for the pad-by-pad gain map"}},
256 {"etaMax", VariantType::Float, 1.f, {"maximum eta of the tracks which are used for the pad-by-pad gain map"}},
257 {"disable-log-transform", VariantType::Bool, false, {"Disable the transformation of q/dedx -> log(1 + q/dedx)"}},
258 {"do-not-normalize", VariantType::Bool, false, {"Do not normalize the cluster charge to the dE/dx"}},
259 {"mindEdx", VariantType::Float, 10.f, {"Minimum accepted dE/dx value"}},
260 {"maxdEdx", VariantType::Float, 500.f, {"Maximum accepted dE/dx value (-1=accept all dE/dx)"}},
261 {"minClusters", VariantType::Int, 50, {"minimum number of clusters of tracks which are used for the pad-by-pad gain map"}},
262 {"gainMapFile", VariantType::String, "", {"file to reference gain map, which will be used for correcting the cluster charge"}},
263 {"dedxRegionType", VariantType::Int, 2, {"using the dE/dx per chamber (0), stack (1) or per sector (2)"}},
264 {"dedxType", VariantType::Int, 0, {"recalculating the dE/dx (0), using it from tracking (1)"}},
265 {"chargeType", VariantType::Int, 0, {"Using qMax (0) or qTot (1) for the dE/dx and the pad-by-pad histograms"}},
266 {"do-not-propagateTrack", VariantType::Bool, false, {"Performing a refit for obtaining track parameters instead of propagating."}},
267 {"useEveryNthTF", VariantType::Int, 10, {"Using only a fraction of the data: 1: Use every TF, 10: Use only every tenth TF."}},
268 {"maxTracksPerTF", VariantType::Int, 10000, {"Maximum number of processed tracks per TF (-1 for processing all tracks)"}},
269 };
270 dataRequest->inputs.emplace_back("corrMap", o2::header::gDataOriginTPC, "TPCCORRMAP", 0, Lifetime::Timeframe);
271
272 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
273 false, // GRPECS=true
274 false, // GRPLHCIF
275 true, // GRPMagField
276 true, // askMatLUT
278 dataRequest->inputs);
279
280 std::vector<OutputSpec> outputs;
281 outputs.emplace_back(gDataOriginTPC, "TRACKGAINHISTOS", 0, o2::framework::Lifetime::Sporadic);
282
283 return DataProcessorSpec{
284 "calib-tpc-gainmap-tracks",
285 dataRequest->inputs,
286 outputs,
287 AlgorithmSpec{adaptFromTask<TPCCalibPadGainTracksDevice>(dataRequest, ccdbRequest, publishAfterTFs, debug, useLastExtractedMapAsReference, polynomialsFile, disablePolynomialsCCDB)},
288 opts}; // end DataProcessorSpec
289}
290
291} // namespace tpc
292} // namespace o2
293
294#endif
Simple interface to the CDB manager.
Wrapper container for different reconstructed object types.
std::ostringstream debug
o2::raw::RawFileWriter * raw
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.
POD correction map.
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 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 setTPCCorrMaps(const o2::gpu::TPCFastTransformPOD *maph)
set cluster correction maps helper
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 run(o2::framework::ProcessingContext &pc) final
void init(o2::framework::InitContext &ic) final
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
TPCCalibPadGainTracksDevice(std::shared_ptr< o2::globaltracking::DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > req, const uint32_t publishAfterTFs, const bool debug, const bool useLastExtractedMapAsReference, const std::string polynomialsFile, const bool disablePolynomialsCCDB)
GLboolean * data
Definition glcorearb.h:298
constexpr o2::header::DataOrigin gDataOriginTPC
Definition DataHeader.h:576
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
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:168
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
std::vector< Cluster > clusters