@@ -44,7 +44,6 @@ namespace analysis
4444{
4545namespace trackextension
4646{
47- constexpr long run3grp_timestamp = (1619781650000 + 1619781529000 ) / 2 ;
4847const char * ccdbpath_lut = " GLO/Param/MatLUT" ;
4948const char * ccdbpath_geo = " GLO/Config/Geometry" ;
5049const 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