@@ -57,6 +57,7 @@ struct TrackExtension {
5757 Produces<aod::TracksExtended> extendedTrackQuantities;
5858 Service<o2::ccdb::BasicCCDBManager> ccdb;
5959
60+ o2::base::MatLayerCylSet* lut;
6061 int mRunNumber ;
6162 float mMagField ;
6263
@@ -68,15 +69,10 @@ struct TrackExtension {
6869 ccdb->setCaching (true );
6970 ccdb->setLocalObjectValidityChecking ();
7071
71- auto lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (ccdb->get <o2::base::MatLayerCylSet>(ccdbpath_lut));
72+ lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (ccdb->get <o2::base::MatLayerCylSet>(ccdbpath_lut));
7273
7374 if (!o2::base::GeometryManager::isGeometryLoaded ()) {
7475 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);
8076 }
8177 mRunNumber = 0 ;
8278 mMagField = 0.0 ;
@@ -118,7 +114,7 @@ struct TrackExtension {
118114 }
119115 PROCESS_SWITCH (TrackExtension, processRun2, " Process Run2 track extension task" , true );
120116
121- void processRun3 (aod::FullTracks const & tracks, aod::Collisions const &)
117+ void processRun3 (aod::FullTracks const & tracks, aod::Collisions const &, aod::BCsWithTimestamps const & )
122118 {
123119 using namespace analysis ::trackextension;
124120
@@ -131,10 +127,26 @@ struct TrackExtension {
131127 /* when a new run (Run3) is processed */
132128 o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT;
133129
130+ int lastCollId = -1 ;
134131 for (auto & track : tracks) {
135132 std::array<float , 2 > dca{1e10f, 1e10f};
136133 if (track.has_collision ()) {
137134 if (track.trackType () == o2::aod::track::TrackTypeEnum::Track) {
135+ if (lastCollId != track.collisionId ()) {
136+ auto bc = track.collision_as <aod::Collisions>().bc_as <aod::BCsWithTimestamps>();
137+ if (mRunNumber != bc.runNumber ()) {
138+ auto grpo = ccdb->getForTimeStamp <o2::parameters::GRPObject>(ccdbpath_grp, bc.timestamp ());
139+ if (grpo != nullptr ) {
140+ o2::base::Propagator::initFieldFromGRP (grpo);
141+ o2::base::Propagator::Instance ()->setMatLUT (lut);
142+ LOGF (info, " Setting magnetic field to %d kG for run %d from its GRP CCDB object" , grpo->getNominalL3Field (), bc.runNumber ());
143+ } else {
144+ LOGF (fatal, " GRP object is not available in CCDB for run=%d at timestamp=%llu" , bc.runNumber (), bc.timestamp ());
145+ }
146+ mRunNumber = bc.runNumber ();
147+ }
148+ lastCollId = track.collisionId ();
149+ }
138150 auto trackPar = getTrackPar (track);
139151 auto const & collision = track.collision ();
140152 gpu::gpustd::array<float , 2 > dcaInfo;
0 commit comments