Skip to content

Commit a856da8

Browse files
Proper handling of GRP objects for Run3 runs (#331)
* Proper handling of GRP objects for Run3 runs * Get rid of the hard coded timestamps
1 parent cc18d2d commit a856da8

1 file changed

Lines changed: 24 additions & 27 deletions

File tree

Common/TableProducer/trackextension.cxx

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ namespace analysis
4444
{
4545
namespace trackextension
4646
{
47-
constexpr long run3grp_timestamp = (1619781650000 + 1619781529000) / 2;
4847
const char* ccdbpath_lut = "GLO/Param/MatLUT";
4948
const char* ccdbpath_geo = "GLO/Config/Geometry";
5049
const char* ccdbpath_grp = "GLO/GRP/GRP";
@@ -57,6 +56,7 @@ struct TrackExtension {
5756
Produces<aod::TracksExtended> extendedTrackQuantities;
5857
Service<o2::ccdb::BasicCCDBManager> ccdb;
5958

59+
o2::base::MatLayerCylSet* lut;
6060
int mRunNumber;
6161
float mMagField;
6262

@@ -68,15 +68,10 @@ struct TrackExtension {
6868
ccdb->setCaching(true);
6969
ccdb->setLocalObjectValidityChecking();
7070

71-
auto lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get<o2::base::MatLayerCylSet>(ccdbpath_lut));
71+
lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get<o2::base::MatLayerCylSet>(ccdbpath_lut));
7272

7373
if (!o2::base::GeometryManager::isGeometryLoaded()) {
7474
ccdb->get<TGeoManager>(ccdbpath_geo);
75-
/* it seems this is needed at this level for the material LUT to work properly */
76-
/* but what happens if the run changes while doing the processing? */
77-
o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp<o2::parameters::GRPObject>(ccdbpath_grp, analysis::trackextension::run3grp_timestamp);
78-
o2::base::Propagator::initFieldFromGRP(grpo);
79-
o2::base::Propagator::Instance()->setMatLUT(lut);
8075
}
8176
mRunNumber = 0;
8277
mMagField = 0.0;
@@ -86,39 +81,32 @@ struct TrackExtension {
8681
{
8782
using namespace analysis::trackextension;
8883

89-
int lastCollId = -1;
9084
for (auto& track : tracks) {
9185
std::array<float, 2> dca{1e10f, 1e10f};
9286
if (track.has_collision()) {
9387
if (track.trackType() == o2::aod::track::TrackTypeEnum::Run2Track && track.itsChi2NCl() != 0.f && track.tpcChi2NCl() != 0.f && std::abs(track.x()) < 10.f) {
94-
if (lastCollId != track.collisionId()) {
95-
auto bc = track.collision_as<aod::Collisions>().bc_as<aod::BCsWithTimestamps>();
96-
if (mRunNumber != bc.runNumber()) {
97-
o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp<o2::parameters::GRPObject>(ccdbpath_grp, bc.timestamp());
98-
if (grpo != nullptr) {
99-
mMagField = grpo->getNominalL3Field();
100-
LOGF(info, "Setting magnetic field to %f kG for run %d", mMagField, bc.runNumber());
101-
} else {
102-
LOGF(fatal, "GRP object is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp());
103-
}
104-
mRunNumber = bc.runNumber();
88+
auto bc = track.collision_as<aod::Collisions>().bc_as<aod::BCsWithTimestamps>();
89+
if (mRunNumber != bc.runNumber()) {
90+
o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp<o2::parameters::GRPObject>(ccdbpath_grp, bc.timestamp());
91+
if (grpo != nullptr) {
92+
mMagField = grpo->getNominalL3Field();
93+
LOGF(info, "Setting magnetic field to %f kG for run %d", mMagField, bc.runNumber());
94+
} else {
95+
LOGF(fatal, "GRP object is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp());
10596
}
106-
lastCollId = track.collisionId();
97+
mRunNumber = bc.runNumber();
10798
}
10899
auto trackPar = getTrackPar(track);
109100
auto const& collision = track.collision();
110101
trackPar.propagateParamToDCA({collision.posX(), collision.posY(), collision.posZ()}, mMagField, &dca);
111102
}
112103
}
113104
extendedTrackQuantities(dca[0], dca[1]);
114-
115-
// TODO: add realtive pt resolution sigma(pt)/pt \approx pt * sigma(1/pt)
116-
// TODO: add geometrical length / fiducial volume
117105
}
118106
}
119107
PROCESS_SWITCH(TrackExtension, processRun2, "Process Run2 track extension task", true);
120108

121-
void processRun3(aod::FullTracks const& tracks, aod::Collisions const&)
109+
void processRun3(aod::Tracks const& tracks, aod::Collisions const&, aod::BCsWithTimestamps const&)
122110
{
123111
using namespace analysis::trackextension;
124112

@@ -135,6 +123,18 @@ struct TrackExtension {
135123
std::array<float, 2> dca{1e10f, 1e10f};
136124
if (track.has_collision()) {
137125
if (track.trackType() == o2::aod::track::TrackTypeEnum::Track) {
126+
auto bc = track.collision_as<aod::Collisions>().bc_as<aod::BCsWithTimestamps>();
127+
if (mRunNumber != bc.runNumber()) {
128+
auto grpo = ccdb->getForTimeStamp<o2::parameters::GRPObject>(ccdbpath_grp, bc.timestamp());
129+
if (grpo != nullptr) {
130+
o2::base::Propagator::initFieldFromGRP(grpo);
131+
o2::base::Propagator::Instance()->setMatLUT(lut);
132+
LOGF(info, "Setting magnetic field to %d kG for run %d from its GRP CCDB object", grpo->getNominalL3Field(), bc.runNumber());
133+
} else {
134+
LOGF(fatal, "GRP object is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp());
135+
}
136+
mRunNumber = bc.runNumber();
137+
}
138138
auto trackPar = getTrackPar(track);
139139
auto const& collision = track.collision();
140140
gpu::gpustd::array<float, 2> dcaInfo;
@@ -145,9 +145,6 @@ struct TrackExtension {
145145
}
146146
}
147147
extendedTrackQuantities(dca[0], dca[1]);
148-
149-
// TODO: add realtive pt resolution sigma(pt)/pt \approx pt * sigma(1/pt)
150-
// TODO: add geometrical length / fiducial volume
151148
}
152149
}
153150
PROCESS_SWITCH(TrackExtension, processRun3, "Process Run3 track extension task", false);

0 commit comments

Comments
 (0)