Project
Loading...
Searching...
No Matches
CorrectionMapsLoader.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#include "Framework/Logger.h"
23#include "TTree.h"
24
25using namespace o2::tpc;
26using namespace o2::framework;
27
28//________________________________________________________
30{
31 pc.inputs().get<o2::tpc::CorrMapParam*>("tpcCorrPar");
32 const auto lumiMode = getLumiScaleMode();
33 if (lumiMode != LumiScaleMode::NoCorrection && lumiMode != LumiScaleMode::StaticMapOnly) {
34 pc.inputs().get<o2::gpu::TPCFastTransform*>("tpcCorrMap");
35 }
36 if (lumiMode != LumiScaleMode::NoCorrection) {
37 pc.inputs().get<o2::gpu::TPCFastTransform*>("tpcCorrMapRef");
38 }
39
41 pc.inputs().get<o2::gpu::TPCFastTransform*>("tpcCorrMapSecFluc");
42 pc.inputs().get<TTree*>("tpcSecFlucInfo");
43 }
44
45 const int maxDumRep = 5;
46 int dumRep = 0;
47 o2::ctp::LumiInfo lumiObj;
48 static o2::ctp::LumiInfo lumiPrev;
49
51 // check if tpcScaler is valid and CTP fallback is allowed
52 if (tpcScaler == -1.f) {
53 const bool canUseCTPScaling = mCorrMap && mCorrMapRef && mCorrMap->isIDCSet() && mCorrMapRef->isIDCSet() && mCorrMap->isLumiSet() && mCorrMapRef->isLumiSet();
54 if (canUseCTPScaling) {
55 LOGP(info, "Invalid TPC scaler value {} received for IDC-based scaling! Using CTP fallback", tpcScaler);
57 setMeanLumi(mCorrMap->getLumi(), false);
58 setMeanLumiRef(mCorrMapRef->getLumi());
60 } else if (mCorrMap) {
61 // CTP scaling is not possible, dont do any scaling to avoid applying wrong corrections
62 const float storedIDC = mCorrMap->getIDC();
63 LOGP(warning, "Invalid TPC scaler value {} received for IDC-based scaling! CTP fallback not possible, using stored IDC of {} from the map to avoid applying wrong corrections", tpcScaler, storedIDC);
64 setInstLumi(storedIDC);
65 }
66 } else {
68 // reset back to normal operation
69 LOGP(info, "Valid TPC scaler value {} received, switching back to IDC-based scaling", tpcScaler);
71 setMeanLumi(mCorrMap->getIDC(), false);
72 setMeanLumiRef(mCorrMapRef->getIDC());
74 }
75 // correct IDC received
76 setInstLumi(tpcScaler);
77 }
78 }
79
81 if (pc.inputs().get<gsl::span<char>>("CTPLumi").size() == sizeof(o2::ctp::LumiInfo)) {
82 lumiPrev = lumiObj = pc.inputs().get<o2::ctp::LumiInfo>("CTPLumi");
83 } else {
84 if (dumRep < maxDumRep && lumiPrev.nHBFCounted == 0 && lumiPrev.nHBFCountedFV0 == 0) {
85 LOGP(alarm, "Previous TF lumi used to substitute dummy input is empty, warning {} of {}", ++dumRep, maxDumRep);
86 }
87 lumiObj = lumiPrev;
88 }
89 setInstLumiCTP(mInstLumiCTPFactor * (mLumiCTPSource == 0 ? lumiObj.getLumi() : lumiObj.getLumiAlt()));
92 }
93 }
94
96}
97
98//________________________________________________________
99void CorrectionMapsLoader::requestCCDBInputs(std::vector<InputSpec>& inputs, const CorrectionMapsGloOpts& gloOpts)
100{
101 LOGP(info, "Requesting CCDB inputs for TPC correction maps with lumiType={} and lumiMode={}", static_cast<int>(gloOpts.lumiType), static_cast<int>(gloOpts.lumiMode));
102 if (gloOpts.lumiMode == LumiScaleMode::Linear) {
103 addInput(inputs, {"tpcCorrMap", o2::header::gDataOriginTPC, "CorrMap", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalCorrMap), {}, 1)}); // time-dependent
104 addInput(inputs, {"tpcCorrMapRef", o2::header::gDataOriginTPC, "CorrMapRef", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalCorrMapRef), {}, 0)}); // load once
105 } else if (gloOpts.lumiMode == LumiScaleMode::DerivativeMap) {
106 addInput(inputs, {"tpcCorrMap", o2::header::gDataOriginTPC, "CorrMap", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalCorrMap), {}, 1)}); // time-dependent
107 addInput(inputs, {"tpcCorrMapRef", o2::header::gDataOriginTPC, "CorrMapRef", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalCorrDerivMap), {}, 1)}); // time-dependent
108 } else if (gloOpts.lumiMode == LumiScaleMode::DerivativeMapMC) {
109 // for MC corrections
110 addInput(inputs, {"tpcCorrMap", "TPC", "CorrMap", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalCorrMapMC), {}, 1)}); // time-dependent
111 addInput(inputs, {"tpcCorrMapRef", "TPC", "CorrMapRef", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalCorrDerivMapMC), {}, 1)}); // time-dependent
112 } else if (gloOpts.lumiMode == LumiScaleMode::NoCorrection) {
113 // no correction maps needed — a dummy map is created at runtime
114 } else if (gloOpts.lumiMode == LumiScaleMode::StaticMapOnly) {
115 addInput(inputs, {"tpcCorrMapRef", "TPC", "CorrMapRef", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalCorrMapRef), {}, 0)}); // load once
116 } else {
117 LOG(fatal) << "Correction mode unknown! Choose either 0 (default) or 1 (derivative map) for flag corrmap-lumi-mode.";
118 }
119
120 // load sector edge fluctuation correction only for data
121 if (gloOpts.enableSecEdgeFlucCorrection) {
122 addInput(inputs, {"tpcCorrMapSecFluc", o2::header::gDataOriginTPC, "CorrMapSecFluc", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalSecEdgeCorrection), {}, 1)}); // time-dependent
123 addInput(inputs, {"tpcSecFlucInfo", o2::header::gDataOriginTPC, "InfoMapSecFluc", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CalSecEdgeInfo), {}, 1)}); // time-dependent
124 }
125
126 if (gloOpts.requestCTPLumi) {
127 addInput(inputs, {"CTPLumi", "CTP", "LUMI", 0, Lifetime::Timeframe});
128 }
129
130 addInput(inputs, {"tpcCorrPar", o2::header::gDataOriginTPC, "CorrMapParam", 0, Lifetime::Condition, ccdbParamSpec(CDBTypeMap.at(CDBType::CorrMapParam), {}, 0)}); // load once
131}
132
133//________________________________________________________
134void CorrectionMapsLoader::addInput(std::vector<InputSpec>& inputs, InputSpec&& isp)
135{
136 if (std::find(inputs.begin(), inputs.end(), isp) == inputs.end()) {
137 inputs.emplace_back(isp);
138 }
139}
140
141//________________________________________________________
142void CorrectionMapsLoader::addOption(std::vector<ConfigParamSpec>& options, ConfigParamSpec&& osp)
143{
144 if (std::find(options.begin(), options.end(), osp) == options.end()) {
145 options.emplace_back(osp);
146 }
147}
148
149//________________________________________________________
151{
152 if (matcher == ConcreteDataMatcher(o2::header::gDataOriginTPC, "CorrMap", 0)) {
156 if (getMeanLumiOverride() != 0) {
159 LOGP(info, "CorrMap mean lumi rate is overridden to {}", mCorrMap->getLumi());
162 LOGP(info, "CorrMap mean IDC rate is overridden to {}", mCorrMap->getIDC());
163 }
164 }
165 float mapMeanRate = 0;
167 mapMeanRate = mCorrMap->getLumi();
169 mapMeanRate = mCorrMap->getIDC();
170 }
172 checkMeanScaleConsistency(mapMeanRate, mCorrMap->getCTP2IDCFallBackThreshold());
173 }
174 if (getMeanLumiOverride() == 0 && mapMeanRate > 0.) {
175 setMeanLumi(mapMeanRate, false);
176 }
177 LOGP(debug, "MeanLumiOverride={} MeanLumiMap={} -> meanLumi = {}", getMeanLumiOverride(), mapMeanRate, getMeanLumi());
179 return true;
180 }
181 if (matcher == ConcreteDataMatcher(o2::header::gDataOriginTPC, "CorrMapRef", 0)) {
185 if (getMeanLumiRefOverride() != 0) {
188 LOGP(info, "CorrMapRef mean lumi rate is overridden to {}", mCorrMapRef->getLumi());
191 LOGP(info, "CorrMapRef mean IDC rate is overridden to {}", mCorrMapRef->getIDC());
192 }
193 }
194 float mapRefMeanRate = 0;
196 mapRefMeanRate = mCorrMapRef->getLumi();
198 mapRefMeanRate = mCorrMapRef->getIDC();
199 }
201 checkMeanScaleConsistency(mapRefMeanRate, mCorrMapRef->getCTP2IDCFallBackThreshold());
202 }
203 if (getMeanLumiRefOverride() == 0) {
204 setMeanLumiRef(mapRefMeanRate);
205 }
206 LOGP(debug, "MeanLumiRefOverride={} MeanLumiMap={} -> meanLumi = {}", getMeanLumiRefOverride(), mapRefMeanRate, getMeanLumiRef());
208 return true;
209 }
210 if (matcher == ConcreteDataMatcher(o2::header::gDataOriginTPC, "CorrMapParam", 0)) {
211 const auto& par = o2::tpc::CorrMapParam::Instance();
212 mMeanLumiOverride = par.lumiMean; // negative value switches off corrections !!!
213 mMeanLumiRefOverride = par.lumiMeanRef;
214 mInstCTPLumiOverride = par.lumiInst;
215 mInstLumiCTPFactor = par.lumiInstFactor;
216 mLumiCTPSource = par.ctpLumiSource;
217
218 if (mMeanLumiOverride != 0.) {
220 }
221 if (mMeanLumiRefOverride != 0.) {
223 }
224 if (mInstCTPLumiOverride != 0.) {
227 setInstLumi(getInstLumiCTP(), false);
228 }
229 }
231 int scaleType = static_cast<int>(getLumiScaleType());
232 const std::array<std::string, 3> lumiS{"OFF", "CTP", "TPC scaler"};
233 if (scaleType >= lumiS.size()) {
234 LOGP(fatal, "Wrong corrmap-lumi-mode provided!");
235 }
236
237 LOGP(info, "TPC correction map params updated: SP corrections: {} (corr.map scaling type={}, override values: lumiMean={} lumiRefMean={} lumiScaleMode={}), CTP Lumi: source={} lumiInstOverride={} , LumiInst scale={} ",
238 canUseCorrections() ? "ON" : "OFF",
240 }
241 if (matcher == ConcreteDataMatcher(o2::header::gDataOriginTPC, "CorrMapSecFluc", 0)) {
245 return true;
246 }
247 if (matcher == ConcreteDataMatcher(o2::header::gDataOriginTPC, "InfoMapSecFluc", 0)) {
248 LOGP(info, "Updating TPC sector edge fluctuation info");
249 mSecEdgeFlucInfo.setFromTree(*((TTree*)obj));
250 LOGP(info, "Loaded sector edge fluctuation information with {} intervals for {} runs", mSecEdgeFlucInfo.size(), mSecEdgeFlucInfo.getNRuns());
251 return true;
252 }
253 return false;
254}
255
256//________________________________________________________
258{
260 LOGP(fatal, "TPC correction lumi scaling mode is not set");
261 }
262 const auto& inputRouts = ic.services().get<const o2::framework::DeviceSpec>().inputs;
263 bool foundCTP = false;
264 for (const auto& route : inputRouts) {
265 if (route.matcher == InputSpec{"CTPLumi", "CTP", "LUMI", 0, Lifetime::Timeframe}) {
266 foundCTP = true;
267 }
268 }
269 setLumiCTPAvailable(foundCTP);
270 if ((getLumiScaleType() == LumiScaleType::CTPLumi && !foundCTP) || (getLumiScaleType() == LumiScaleType::TPCScaler && !idcsAvailable)) {
271 LOGP(fatal, "Lumi scaling source {}({}) is not available for TPC correction", static_cast<int>(getLumiScaleType()), getLumiScaleType() == LumiScaleType::CTPLumi ? "CTP" : "TPCScaler");
272 }
273}
274
275void CorrectionMapsLoader::checkMeanScaleConsistency(float meanLumi, float threshold) const
276{
278 if (meanLumi < threshold) {
279 LOGP(fatal, "CTP Lumi scaling source is requested, but the map mean scale {} is below the threshold {}", meanLumi, threshold);
280 }
282 if (meanLumi > threshold) {
283 LOGP(fatal, "IDC scaling source is requested, but the map mean scale {} is above the threshold {}", meanLumi, threshold);
284 }
285 }
286}
CDB Type definitions for TPC.
Implementation of the parameter class for the CorrectionMapsLoader options.
Helper class to access load maps from CCDB.
std::ostringstream debug
ServiceRegistryRef services()
Definition InitContext.h:34
decltype(auto) get(R binding, int part=0) const
InputRecord & inputs()
The inputs associated with this processing context.
o2::gpu::TPCFastTransform * mCorrMap
void setMeanLumiRef(float v, bool report=false)
void setLumiScaleType(tpc::LumiScaleType v)
void setCorrMapSecEdgeFluc(o2::gpu::TPCFastTransform *m)
o2::gpu::TPCFastTransform * mCorrMapSecEdgeFluc
tpc::LumiScaleType getLumiScaleType() const
void setInstLumi(float v, bool report=false)
void setCorrMapRef(o2::gpu::TPCFastTransform *m)
void setMeanLumi(float v, bool report=false)
o2::gpu::TPCFastTransform * mCorrMapRef
void setCorrMap(o2::gpu::TPCFastTransform *m)
tpc::LumiScaleMode getLumiScaleMode() const
void setLumi(float l)
Set Lumi info.
void setCTP2IDCFallBackThreshold(float v)
o2::tpc::SectorEdgeFluctuations mSecEdgeFlucInfo
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
void extractCCDBInputs(o2::framework::ProcessingContext &pc, float tpcScaler=-1.f)
void init(o2::framework::InitContext &ic, bool idcsAvailable)
static void addOption(std::vector< o2::framework::ConfigParamSpec > &options, o2::framework::ConfigParamSpec &&osp)
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs, const o2::tpc::CorrectionMapsGloOpts &gloOpts)
void checkMeanScaleConsistency(float meanLumi, float threshold) const
static void addInput(std::vector< o2::framework::InputSpec > &inputs, o2::framework::InputSpec &&isp)
size_t size() const
Total number of intervals across all runs.
void setFromTree(TTree &tree, const int iEntry=0, const char *brName="SectorEdgeFluctuation")
set this object from input tree
size_t getNRuns() const
number of total runs stored
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)
Global TPC definitions and constants.
Definition SimTraits.h:168
@ DerivativeMap
map(lumi) = mean_map + lumiScale * (derivativeMap) where derivativeMap = (mean_map_A - mean_map_B)
@ Linear
map(lumi) = (mean_map - referenceMap) * lumiScale + referenceMap
@ NoCorrection
no corrections at all
@ StaticMapOnly
use only static map instead of main map
@ DerivativeMapMC
same DerivativeMap, but for MC
const std::unordered_map< CDBType, const std::string > CDBTypeMap
Storage name in CCDB for each calibration and parameter type.
Definition CDBTypes.h:98
@ TPCScaler
use TPC scaler for scaling
@ CTPLumi
use CTP luminosity for scaling
@ CalCorrMapMC
Cluster correction map (high IR rate distortions) for MC.
@ CalCorrMapRef
Cluster correction reference map (static distortions)
@ CalCorrMap
Cluster correction map (high IR rate distortions)
@ CalSecEdgeCorrection
calibration object for sector edge distortions
float getLumiAlt() const
Definition LumiInfo.h:34
uint32_t nHBFCounted
Definition LumiInfo.h:26
uint32_t nHBFCountedFV0
Definition LumiInfo.h:27
float getLumi() const
Definition LumiInfo.h:32
bool enableSecEdgeFlucCorrection
enable correction of sector edge fluctuations
LumiScaleType lumiType
what estimator to used for corrections scaling: 0: no scaling, 1: CTP, 2: IDC
bool requestCTPLumi
request CTP Lumi regardless of what is used for corrections scaling
LumiScaleMode lumiMode
what corrections method to use: 0: classical scaling, 1: Using of the derivative map,...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"