Skip to content

Commit df493bd

Browse files
committed
Migrate the propagation service to CCDB tables
- Add a central table for common CCDB Objects
1 parent a7857ad commit df493bd

3 files changed

Lines changed: 132 additions & 20 deletions

File tree

Common/DataModel/GloCCDBObjects.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright 2019-2026 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+
12+
/// \file GloCCDBObjects.h
13+
/// \brief Declarative CCDB columns for the most-commonly needed GLO/ objects.
14+
///
15+
/// Provides a single shared timestamped table (`aod::GloCCDBObjects`) that
16+
/// tasks can join with `aod::BCsWithTimestamps` to obtain the four GLO/
17+
/// calibration objects without using `Service<BasicCCDBManager>`.
18+
///
19+
/// Usage:
20+
/// \code
21+
/// #include "Common/DataModel/GloCCDBObjects.h"
22+
/// // ...
23+
/// using BCsWithCCDB = soa::Join<aod::BCsWithTimestamps, aod::GloCCDBObjects>;
24+
/// void process(BCsWithCCDB const& bcs) {
25+
/// const auto& grpmag = bcs.begin().grpMagField();
26+
/// const auto& meanvtx = bcs.begin().meanVertex();
27+
/// const auto& grpecs = bcs.begin().grpECS();
28+
/// const auto& grplhcif= bcs.begin().grpLHCIF();
29+
/// }
30+
/// \endcode
31+
///
32+
/// If you need only a subset of the four objects, declare your own
33+
/// `DECLARE_SOA_TIMESTAMPED_TABLE` with the relevant subset of columns from
34+
/// the `o2::aod::ccdbGlo` namespace rather than joining `aod::GloCCDBObjects`.
35+
///
36+
/// Note: MatLayerCylSet is intentionally omitted — it requires
37+
/// `MatLayerCylSet::rectifyPtrFromFile()` after deserialisation, which the
38+
/// CCDB column mechanism does not perform.
39+
40+
#ifndef COMMON_DATAMODEL_GLOCCDBOBJECTS_H_
41+
#define COMMON_DATAMODEL_GLOCCDBOBJECTS_H_
42+
43+
#include <DataFormatsCalibration/MeanVertexObject.h>
44+
#include <DataFormatsParameters/GRPECSObject.h>
45+
#include <DataFormatsParameters/GRPLHCIFData.h>
46+
#include <DataFormatsParameters/GRPMagField.h>
47+
#include <Framework/ASoA.h>
48+
#include <Framework/AnalysisDataModel.h>
49+
50+
namespace o2::aod
51+
{
52+
namespace ccdbGlo
53+
{
54+
DECLARE_SOA_CCDB_COLUMN(GRPMagField, grpMagField, o2::parameters::GRPMagField, "GLO/Config/GRPMagField"); //!
55+
DECLARE_SOA_CCDB_COLUMN(MeanVertex, meanVertex, o2::dataformats::MeanVertexObject, "GLO/Calib/MeanVertex"); //!
56+
DECLARE_SOA_CCDB_COLUMN(GRPECSObject, grpECS, o2::parameters::GRPECSObject, "GLO/Config/GRPECS"); //!
57+
DECLARE_SOA_CCDB_COLUMN(GRPLHCIFData, grpLHCIF, o2::parameters::GRPLHCIFData, "GLO/Config/GRPLHCIF"); //!
58+
} // namespace ccdbGlo
59+
60+
/// Full table — join with aod::BCsWithTimestamps to obtain all four objects.
61+
DECLARE_SOA_TIMESTAMPED_TABLE(GloCCDBObjects, aod::Timestamps, o2::aod::timestamp::Timestamp, 1, "GLOCCDBOBJ", //!
62+
ccdbGlo::GRPMagField, ccdbGlo::MeanVertex, ccdbGlo::GRPECSObject, ccdbGlo::GRPLHCIFData);
63+
} // namespace o2::aod
64+
65+
#endif // COMMON_DATAMODEL_GLOCCDBOBJECTS_H_

Common/TableProducer/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ o2physics_add_dpl_workflow(track-propagation
7474
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
7575
COMPONENT_NAME Analysis)
7676

77+
7778
o2physics_add_dpl_workflow(propagationservice
7879
SOURCES propagationService.cxx
7980
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle O2Physics::TPCDriftManager

Common/TableProducer/propagationServiceV2.cxx

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
// granted to it by virtue of its status as an Intergovernmental Organization
1010
// or submit itself to any jurisdiction.
1111

12-
/// \file propagationService.cxx
13-
/// \brief
12+
/// \file propagationServiceV2.cxx
13+
/// \brief V2: GRPMagField and MeanVertexObject sourced from aod::GloCCDBObjects declarative CCDB table.
1414
/// \author ALICE
1515

1616
//===============================================================
@@ -26,12 +26,16 @@
2626
#include "PWGLF/Utils/strangenessBuilderModule.h"
2727

2828
#include "Common/DataModel/EventSelection.h"
29+
#include "Common/DataModel/GloCCDBObjects.h"
2930
#include "Common/DataModel/PIDResponseTPC.h"
3031
#include "Common/Tools/StandardCCDBLoader.h"
3132
#include "Common/Tools/TrackPropagationModule.h"
3233
#include "Common/Tools/TrackTuner.h"
3334

3435
#include <CCDB/BasicCCDBManager.h>
36+
#include <DetectorsBase/MatLayerCylSet.h>
37+
#include <DetectorsBase/Propagator.h>
38+
#include <Framework/ASoA.h>
3539
#include <Framework/AnalysisDataModel.h>
3640
#include <Framework/AnalysisHelpers.h>
3741
#include <Framework/AnalysisTask.h>
@@ -46,7 +50,6 @@
4650

4751
using namespace o2;
4852
using namespace o2::framework;
49-
// using namespace o2::framework::expressions;
5053

5154
// use parameters + cov mat non-propagated, aux info + (extension propagated)
5255
using FullTracksExt = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov>;
@@ -62,15 +65,22 @@ using TracksWithExtra = soa::Join<aod::Tracks, aod::TracksExtra>;
6265
// For dE/dx association in pre-selection
6366
using TracksExtraWithPID = soa::Join<aod::TracksExtra, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullKa, aod::pidTPCFullHe>;
6467

65-
struct propagationService {
66-
// CCDB boilerplate declarations
68+
struct propagationServiceV2 {
69+
// Service<BasicCCDBManager> kept for MatLUT (rectifyPtrFromFile) and
70+
// strangenessBuilderModule (V-drift via ccdb->instance()).
71+
// GRPMagField and MeanVertex are sourced from CCDB columns instead.
6772
o2::framework::Configurable<std::string> ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
6873
Service<o2::ccdb::BasicCCDBManager> ccdb;
6974

70-
// propagation stuff
75+
// propagation stuff — ccdbLoader used only for lut + mMeanVtx (set from column) + runNumber
7176
o2::common::StandardCCDBLoaderConfigurables standardCCDBLoaderConfigurables;
7277
o2::common::StandardCCDBLoader ccdbLoader;
7378

79+
// Declarative CCDB path overrides (replace grpmagPath / mVtxPath in StandardCCDBLoaderConfigurables)
80+
// Option names: "ccdb:fGRPMagField" and "ccdb:fMeanVertex" respectively.
81+
ConfigurableCCDBPath<o2::aod::ccdbGlo::GRPMagField> grpmagPath;
82+
ConfigurableCCDBPath<o2::aod::ccdbGlo::MeanVertex> mVtxPath;
83+
7484
// boilerplate: strangeness builder stuff
7585
o2::pwglf::strangenessbuilder::products products;
7686
o2::pwglf::strangenessbuilder::coreConfigurables baseOpts;
@@ -87,12 +97,14 @@ struct propagationService {
8797
o2::common::TrackPropagationConfigurables trackPropagationConfigurables;
8898
o2::common::TrackPropagationModule trackPropagation;
8999

100+
using BCsWithCCDB = soa::Join<aod::BCsWithTimestamps, aod::GloCCDBObjects>;
101+
90102
// registry
91103
HistogramRegistry histos{"histos"};
92104

93105
void init(o2::framework::InitContext& initContext)
94106
{
95-
// CCDB boilerplate init
107+
// Only needed for MatLUT fetch and strangenessBuilderModule V-drift
96108
ccdb->setCaching(true);
97109
ccdb->setLocalObjectValidityChecking();
98110
ccdb->setURL(ccdburl.value);
@@ -102,38 +114,72 @@ struct propagationService {
102114
strangenessBuilderModule.init(baseOpts, v0BuilderOpts, cascadeBuilderOpts, preSelectOpts, histos, initContext);
103115
}
104116

105-
void processRealData(soa::Join<aod::Collisions, aod::EvSels> const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs)
117+
// Load MatLUT once (needs rectifyPtrFromFile, kept manual), set B-field per run from
118+
// GRPMagField CCDB column, and refresh mMeanVtx pointer every call (pointer into current
119+
// BC table, valid only for the duration of this process() invocation).
120+
template <typename TBC>
121+
void initCCDB(TBC const& bc0)
122+
{
123+
if (!ccdbLoader.lut) {
124+
LOG(info) << "Loading material look-up table for run: " << bc0.runNumber();
125+
ccdbLoader.lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(
126+
ccdb->template getForRun<o2::base::MatLayerCylSet>(standardCCDBLoaderConfigurables.lutPath.value, bc0.runNumber()));
127+
o2::base::Propagator::Instance()->setMatLUT(ccdbLoader.lut);
128+
}
129+
// Always refresh: pointer into current BC table, invalidated after process() returns
130+
ccdbLoader.mMeanVtx = &bc0.meanVertex();
131+
if (ccdbLoader.runNumber != bc0.runNumber()) {
132+
const auto& grpmag = bc0.grpMagField(); // from declarative CCDB column
133+
LOG(info) << "Setting B-field to current " << grpmag.getL3Current() << " A for run " << bc0.runNumber() << " from GRPMagField CCDB column";
134+
o2::base::Propagator::initFieldFromGRP(&grpmag);
135+
ccdbLoader.runNumber = bc0.runNumber();
136+
}
137+
}
138+
139+
void processRealData(soa::Join<aod::Collisions, aod::EvSels> const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, BCsWithCCDB const& bcs)
106140
{
107-
ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs);
141+
if (bcs.size() == 0) {
142+
return;
143+
}
144+
initCCDB(bcs.begin());
108145
trackPropagation.fillTrackTables<false>(trackPropagationConfigurables, trackTunerObj, ccdbLoader, collisions, tracks, trackPropagationProducts, histos);
109146
strangenessBuilderModule.dataProcess(ccdb, histos, collisions, static_cast<TObject*>(nullptr), v0s, cascades, trackedCascades, tracks, bcs, static_cast<TObject*>(nullptr), products);
110147
}
111148

112-
void processMonteCarlo(soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels> const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles)
149+
void processMonteCarlo(soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels> const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, BCsWithCCDB const& bcs, aod::McParticles const& mcParticles)
113150
{
114-
ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs);
151+
if (bcs.size() == 0) {
152+
return;
153+
}
154+
initCCDB(bcs.begin());
115155
trackPropagation.fillTrackTables<true>(trackPropagationConfigurables, trackTunerObj, ccdbLoader, collisions, tracks, trackPropagationProducts, histos);
116156
strangenessBuilderModule.dataProcess(ccdb, histos, collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles, products);
117157
}
118158

119-
void processRealDataWithPID(soa::Join<aod::Collisions, aod::EvSels> const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIUWithPID const& tracks, aod::BCsWithTimestamps const& bcs)
159+
void processRealDataWithPID(soa::Join<aod::Collisions, aod::EvSels> const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIUWithPID const& tracks, BCsWithCCDB const& bcs)
120160
{
121-
ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs);
161+
if (bcs.size() == 0) {
162+
return;
163+
}
164+
initCCDB(bcs.begin());
122165
trackPropagation.fillTrackTables<false>(trackPropagationConfigurables, trackTunerObj, ccdbLoader, collisions, tracks, trackPropagationProducts, histos);
123166
strangenessBuilderModule.dataProcess(ccdb, histos, collisions, static_cast<TObject*>(nullptr), v0s, cascades, trackedCascades, tracks, bcs, static_cast<TObject*>(nullptr), products);
124167
}
125168

126-
void processMonteCarloWithPID(soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels> const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIUWithPID const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles)
169+
void processMonteCarloWithPID(soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels> const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIUWithPID const& tracks, BCsWithCCDB const& bcs, aod::McParticles const& mcParticles)
127170
{
128-
ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs);
171+
if (bcs.size() == 0) {
172+
return;
173+
}
174+
initCCDB(bcs.begin());
129175
trackPropagation.fillTrackTables<true>(trackPropagationConfigurables, trackTunerObj, ccdbLoader, collisions, tracks, trackPropagationProducts, histos);
130176
strangenessBuilderModule.dataProcess(ccdb, histos, collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles, products);
131177
}
132178

133-
PROCESS_SWITCH(propagationService, processRealData, "process real data", true);
134-
PROCESS_SWITCH(propagationService, processMonteCarlo, "process monte carlo", false);
135-
PROCESS_SWITCH(propagationService, processRealDataWithPID, "process real data", false);
136-
PROCESS_SWITCH(propagationService, processMonteCarloWithPID, "process monte carlo", false);
179+
PROCESS_SWITCH(propagationServiceV2, processRealData, "process real data", true);
180+
PROCESS_SWITCH(propagationServiceV2, processMonteCarlo, "process monte carlo", false);
181+
PROCESS_SWITCH(propagationServiceV2, processRealDataWithPID, "process real data", false);
182+
PROCESS_SWITCH(propagationServiceV2, processMonteCarloWithPID, "process monte carlo", false);
137183
};
138184

139185
//****************************************************************************************
@@ -143,6 +189,6 @@ struct propagationService {
143189
//****************************************************************************************
144190
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
145191
{
146-
WorkflowSpec workflow{adaptAnalysisTask<propagationService>(cfgc)};
192+
WorkflowSpec workflow{adaptAnalysisTask<propagationServiceV2>(cfgc)};
147193
return workflow;
148194
}

0 commit comments

Comments
 (0)