diff --git a/Common/TableProducer/propagationServiceV2.cxx b/Common/TableProducer/propagationServiceV2.cxx index 151c39eb2bc..364d27101e6 100644 --- a/Common/TableProducer/propagationServiceV2.cxx +++ b/Common/TableProducer/propagationServiceV2.cxx @@ -109,26 +109,29 @@ struct propagationServiceV2 { strangenessBuilderModule.init(baseOpts, v0BuilderOpts, cascadeBuilderOpts, preSelectOpts, histos, initContext); } - // Load MatLUT once (needs rectifyPtrFromFile, kept manual), set B-field per run from - // GRPMagField CCDB column, and refresh mMeanVtx pointer every call (pointer into current - // BC table, valid only for the duration of this process() invocation). + // Load MatLUT once (needs rectifyPtrFromFile, kept manual), set B-field and mean vertex + // once per run from GRPMagField/MeanVertex CCDB columns. template void initCCDB(TBC const& bc0) { + if (ccdbLoader.runNumber != bc0.runNumber()) { + LOG(info) << "Setting B-field to current " << bc0.grpMagField().getL3Current() << " A for run " << bc0.runNumber() << " from GRPMagField CCDB column"; + o2::base::Propagator::initFieldFromGRP(&bc0.grpMagField()); + ccdbLoader.mMeanVtx = &bc0.meanVertex(); + ccdbLoader.runNumber = bc0.runNumber(); + } else { + // Verify the CCDB column buffer has not been replaced mid-run. + // The deserialised pointer must be stable for the lifetime of a run. + if (&bc0.meanVertex() != ccdbLoader.mMeanVtx) { + LOG(fatal) << "MeanVertex CCDB column pointer changed within run " << bc0.runNumber() << " — unexpected buffer replacement"; + } + } if (!ccdbLoader.lut) { LOG(info) << "Loading material look-up table for run: " << bc0.runNumber(); ccdbLoader.lut = o2::base::MatLayerCylSet::rectifyPtrFromFile( ccdb->template getForRun(standardCCDBLoaderConfigurables.lutPath.value, bc0.runNumber())); o2::base::Propagator::Instance()->setMatLUT(ccdbLoader.lut); } - // Always refresh: pointer into current BC table, invalidated after process() returns - ccdbLoader.mMeanVtx = &bc0.meanVertex(); - if (ccdbLoader.runNumber != bc0.runNumber()) { - const auto& grpmag = bc0.grpMagField(); // from declarative CCDB column - LOG(info) << "Setting B-field to current " << grpmag.getL3Current() << " A for run " << bc0.runNumber() << " from GRPMagField CCDB column"; - o2::base::Propagator::initFieldFromGRP(&grpmag); - ccdbLoader.runNumber = bc0.runNumber(); - } } void processRealData(soa::Join const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, BCsWithCCDB const& bcs)