15#ifndef O2_CALIBRATION_TPCCALIBPADGAINTRACKSSPEC_H 
   16#define O2_CALIBRATION_TPCCALIBPADGAINTRACKSSPEC_H 
   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)
 
   50    if (!polynomialsFile.empty()) {
 
   51      LOGP(info, 
"Loading polynomials from file {}", polynomialsFile);
 
   53      mDisablePolynomialsCCDB = 
true;
 
 
   63    mTPCCorrMapsLoader.
init(ic);
 
   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");
 
   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);
 
   79        LOGP(warn, 
"reldEdxMin (={}) is smaller than -1!", reldEdxMin);
 
   82        reldEdxMax = std::log(1 + reldEdxMax);
 
   84        LOGP(warn, 
"reldEdxMax (={}) is smaller than 0!", reldEdxMax);
 
   87    mPadGainTracks.
init(nBins, reldEdxMin, reldEdxMax, underflowBin, overflowBin);
 
   92    const auto propagateTrack = ic.options().get<
bool>(
"do-not-propagateTrack");
 
   95    const auto dedxRegionType = ic.options().get<
int>(
"dedxRegionType");
 
   98    const auto dedxType = ic.options().get<
int>(
"dedxType");
 
  101    const auto chargeType = ic.options().get<
int>(
"chargeType");
 
  102    assert(chargeType == 0 || chargeType == 1);
 
  105    mUseEveryNthTF = ic.options().get<
int>(
"useEveryNthTF");
 
  106    if (mUseEveryNthTF <= 0) {
 
  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);
 
  117    mMaxTracksPerTF = ic.options().get<
int>(
"maxTracksPerTF");
 
  119    const std::string gainMapFile = ic.options().get<std::string>(
"gainMapFile");
 
  120    if (!gainMapFile.empty()) {
 
  121      LOGP(info, 
"Loading GainMap from file {}", gainMapFile);
 
  125    const auto etaMax = ic.options().get<
float>(
"etaMax");
 
  128    const auto minClusters = ic.options().get<
int>(
"minClusters");
 
  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);
 
 
  139    LOGP(info, 
"finaliseCCDB");
 
  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"));
 
  147        LOGP(info, 
"Skipping loading reference gain map for first iteration from CCDB");
 
  148        mUsingDefaultGainMapForFirstIter = 
false;
 
  151      LOGP(info, 
"Updating Q topology correction from CCDB");
 
  158      LOGP(info, 
"Setting magnetic field to {} kG", field);
 
 
  166    if (mTFCounter++ % mUseEveryNthTF) {
 
  167      LOGP(info, 
"Skipping TF {}", currentTF);
 
  177    const auto nTracks = tracks.size();
 
  181    LOGP(detail, 
"Processing TF {} with {} tracks by considering {} tracks", currentTF, nTracks, mMaxTracksPerTF);
 
  183    if (!mDisablePolynomialsCCDB) {
 
  187    if (mUseLastExtractedMapAsReference) {
 
  188      LOGP(info, 
"fetching residual gain map");
 
  189      pc.inputs().get<std::unordered_map<std::string, o2::tpc::CalDet<float>>*>(
"tpcresidualgainmap");
 
  193    bool updateMaps = 
false;
 
  200      LOGP(info, 
"Updating TPC fast transform map with new VDrift factor of {} wrt reference {} and DriftTimeOffset correction {} wrt {} from source {}",
 
  215    if ((mFirstTFSend == mProcessedTFs) || (mPublishAfter && (mProcessedTFs % mPublishAfter) == 0)) {
 
  216      LOGP(info, 
"Publishing after {} TFs", mProcessedTFs);
 
  220        mPadGainTracks.
dumpToFile(fmt::format(
"calPadGain_TF{}.root", currentTF).
data());
 
  222      sendOutput(pc.outputs());
 
 
  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};                                 
 
  236  bool mUsingDefaultGainMapForFirstIter{
true};            
 
  237  unsigned int mUseEveryNthTF{1};                         
 
  238  unsigned int mFirstTFSend{1};                           
 
  239  int mMaxTracksPerTF{-1};                                
 
 
  252  std::vector<InputSpec> inputs;
 
  253  auto dataRequest = std::make_shared<o2::globaltracking::DataRequest>();
 
  258    dataRequest->inputs.emplace_back(
"CTPLumi", 
"CTP", 
"LUMI", 0, Lifetime::Timeframe);
 
  261  if (!polynomialsFile.empty()) {
 
  262    disablePolynomialsCCDB = 
true;
 
  265  if (!disablePolynomialsCCDB) {
 
  269  if (useLastExtractedMapAsReference) {
 
  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)"}},
 
  298  auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,                          
 
  304                                                                dataRequest->inputs);
 
  306  std::vector<OutputSpec> outputs;
 
  307  outputs.emplace_back(gDataOriginTPC, 
"TRACKGAINHISTOS", 0, o2::framework::Lifetime::Sporadic);
 
  310    "calib-tpc-gainmap-tracks",
 
  313    AlgorithmSpec{adaptFromTask<TPCCalibPadGainTracksDevice>(dataRequest, ccdbRequest, sclOpts, publishAfterTFs, 
debug, useLastExtractedMapAsReference, polynomialsFile, disablePolynomialsCCDB)},
 
 
Simple interface to the CDB manager.
 
Helper class to access load maps from CCDB.
 
Helper for geometry and GRP related CCDB requests.
 
Header of the General Run Parameters object.
 
Definition of the Names Generator class.
 
Helper class to extract VDrift from different sources.
 
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)
 
void setLumiScaleType(int32_t v)
 
void setLumiScaleMode(int32_t v)
 
void setCheckCTPIDCConsistency(bool v)
 
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)
 
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 setMode(DEdxType iMode)
 
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)
 
constexpr o2::header::DataOrigin gDataOriginTPC
 
Defining PrimaryVertex explicitly as messageable.
 
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
 
std::vector< ConfigParamSpec > Options
 
uint32_t getCurrentTF(o2::framework::ProcessingContext &pc)
 
Global TPC definitions and constants.
 
o2::framework::DataProcessorSpec getTPCCalibPadGainTracksSpec(const bool useLastExtractedMapAsReference)
create a processor spec
 
const std::unordered_map< CDBType, const std::string > CDBTypeMap
Storage name in CCDB for each calibration and parameter type.
 
@ CalPadGainResidual
ResidualpPad gain calibration (e.g. from tracks)
 
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
 
auto getTPCTracksClusterRefs() const
 
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
 
auto getTPCTracks() const
 
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
 
bool checkCTPIDCconsistency
 
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