2929#include " Framework/HistogramRegistry.h"
3030#include " DataFormatsCalibration/MeanVertexObject.h"
3131#include " CommonConstants/GeomConstants.h"
32+ #include " TableHelper.h"
3233
3334// The Run 3 AO2D stores the tracks at the point of innermost update. For a track with ITS this is the innermost (or second innermost)
3435// ITS layer. For a track without ITS, this is the TPC inner wall or for loopers in the TPC even a radius beyond that.
@@ -60,7 +61,7 @@ struct TrackPropagation {
6061
6162 o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT;
6263
63- const o2::dataformats::MeanVertexObject* mVtx = nullptr ;
64+ const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr ;
6465 o2::parameters::GRPMagField* grpmag = nullptr ;
6566 o2::base::MatLayerCylSet* lut = nullptr ;
6667
@@ -73,22 +74,29 @@ struct TrackPropagation {
7374
7475 void init (o2::framework::InitContext& initContext)
7576 {
76- if (doprocessCovariance == true && doprocessStandard == true ) {
77- LOGF (fatal, " Cannot enable processStandard and processCovariance at the same time. Please choose one." );
77+ int nEnabledProcesses = 0 ;
78+ if (doprocessStandard == true ) {
79+ LOG (info) << " Enabling processStandard" ;
80+ nEnabledProcesses++;
7881 }
79-
80- // Checking if the tables are requested in the workflow and enabling them
81- auto & workflows = initContext.services ().get <RunningWorkflowInfo const >();
82- for (DeviceSpec const & device : workflows.devices ) {
83- for (auto const & input : device.inputs ) {
84- if (input.matcher .binding == " TracksDCA" ) {
85- fillTracksDCA = true ;
86- }
87- if (input.matcher .binding == " TracksDCACov" ) {
88- fillTracksDCACov = true ;
89- }
90- }
82+ if (doprocessCovariance == true ) {
83+ LOG (info) << " Enabling processCovariance" ;
84+ nEnabledProcesses++;
85+ }
86+ if (doprocessStandardWithPID == true ) {
87+ LOG (info) << " Enabling processStandardWithPID" ;
88+ nEnabledProcesses++;
89+ }
90+ if (doprocessCovarianceWithPID == true ) {
91+ LOG (info) << " Enabling processCovarianceWithPID" ;
92+ nEnabledProcesses++;
93+ }
94+ if (nEnabledProcesses != 1 ) {
95+ LOG (fatal) << " Exactly one process flag must be set to true. Please choose one." ;
9196 }
97+ // Checking if the tables are requested in the workflow and enabling them
98+ fillTracksDCA = isTableRequiredInWorkflow (initContext, " TracksDCA" );
99+ fillTracksDCACov = isTableRequiredInWorkflow (initContext, " TracksDCACov" );
92100
93101 ccdb->setURL (ccdburl);
94102 ccdb->setCaching (true );
@@ -106,111 +114,132 @@ struct TrackPropagation {
106114 LOG (info) << " Setting magnetic field to current " << grpmag->getL3Current () << " A for run " << bc.runNumber () << " from its GRPMagField CCDB object" ;
107115 o2::base::Propagator::initFieldFromGRP (grpmag);
108116 o2::base::Propagator::Instance ()->setMatLUT (lut);
109- mVtx = ccdb->getForTimeStamp <o2::dataformats::MeanVertexObject>(mVtxPath , bc.timestamp ());
117+ mMeanVtx = ccdb->getForTimeStamp <o2::dataformats::MeanVertexObject>(mVtxPath , bc.timestamp ());
110118 runNumber = bc.runNumber ();
111119 }
112120
113- template <typename TTrack, typename TTrackPar>
114- void FillTracksPar (TTrack& track, aod::track::TrackTypeEnum trackType, TTrackPar& trackPar)
115- {
116- tracksParPropagated (track.collisionId (), trackType, trackPar.getX (), trackPar.getAlpha (), trackPar.getY (), trackPar.getZ (), trackPar.getSnp (), trackPar.getTgl (), trackPar.getQ2Pt ());
117- tracksParExtensionPropagated (trackPar.getPt (), trackPar.getP (), trackPar.getEta (), trackPar.getPhi ());
118- }
119-
120- void processStandard (aod::StoredTracksIU const & tracks, aod::Collisions const &, aod::BCsWithTimestamps const & bcs)
121+ // Running variables
122+ gpu::gpustd::array<float , 2 > mDcaInfo ;
123+ o2::dataformats::DCA mDcaInfoCov ;
124+ o2::dataformats::VertexBase mVtx ;
125+ o2::track::TrackParametrization<float > mTrackPar ;
126+ o2::track::TrackParametrizationWithError<float > mTrackParCov ;
127+
128+ template <typename TTrack, bool fillCovMat = false , bool useTrkPid = false >
129+ void fillTrackTables (TTrack const & tracks,
130+ aod::Collisions const &,
131+ aod::BCsWithTimestamps const & bcs)
121132 {
122133 if (bcs.size () == 0 ) {
123134 return ;
124135 }
125136 initCCDB (bcs.begin ());
126137
127- tracksParPropagated.reserve (tracks.size ());
128- tracksParExtensionPropagated.reserve (tracks.size ());
129- if (fillTracksDCA) {
130- tracksDCA.reserve (tracks.size ());
138+ if constexpr (fillCovMat) {
139+ tracksParCovPropagated.reserve (tracks.size ());
140+ tracksParCovExtensionPropagated.reserve (tracks.size ());
141+ if (fillTracksDCACov) {
142+ tracksDCACov.reserve (tracks.size ());
143+ }
144+ } else {
145+ tracksParPropagated.reserve (tracks.size ());
146+ tracksParExtensionPropagated.reserve (tracks.size ());
147+ if (fillTracksDCA) {
148+ tracksDCA.reserve (tracks.size ());
149+ }
131150 }
132151
133- gpu::gpustd::array<float , 2 > dcaInfo;
134-
135152 for (auto & track : tracks) {
136- dcaInfo[0 ] = 999 ;
137- dcaInfo[1 ] = 999 ;
153+ if constexpr (fillCovMat) {
154+ if (fillTracksDCACov) {
155+ mDcaInfoCov .set (999 , 999 , 999 , 999 , 999 );
156+ }
157+ setTrackParCov (track, mTrackParCov );
158+ if constexpr (useTrkPid) {
159+ mTrackParCov .setPID (track.pidForTracking ());
160+ }
161+ } else {
162+ if (fillTracksDCA) {
163+ mDcaInfo [0 ] = 999 ;
164+ mDcaInfo [1 ] = 999 ;
165+ }
166+ setTrackPar (track, mTrackPar );
167+ if constexpr (useTrkPid) {
168+ mTrackPar .setPID (track.pidForTracking ());
169+ }
170+ }
138171 aod::track::TrackTypeEnum trackType = (aod::track::TrackTypeEnum)track.trackType ();
139- auto trackPar = getTrackPar (track);
140172 // Only propagate tracks which have passed the innermost wall of the TPC (e.g. skipping loopers etc). Others fill unpropagated.
141173 if (track.trackType () == aod::track::TrackIU && track.x () < minPropagationRadius) {
142174 if (track.has_collision ()) {
143175 auto const & collision = track.collision ();
144- o2::base::Propagator::Instance ()->propagateToDCABxByBz ({collision.posX (), collision.posY (), collision.posZ ()}, trackPar, 2 .f , matCorr, &dcaInfo);
176+ if constexpr (fillCovMat) {
177+ mVtx .setPos ({collision.posX (), collision.posY (), collision.posZ ()});
178+ mVtx .setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
179+ o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , mTrackParCov , 2 .f , matCorr, &mDcaInfoCov );
180+ } else {
181+ o2::base::Propagator::Instance ()->propagateToDCABxByBz ({collision.posX (), collision.posY (), collision.posZ ()}, mTrackPar , 2 .f , matCorr, &mDcaInfo );
182+ }
145183 } else {
146- o2::base::Propagator::Instance ()->propagateToDCABxByBz ({mVtx ->getX (), mVtx ->getY (), mVtx ->getZ ()}, trackPar, 2 .f , matCorr, &dcaInfo);
184+ if constexpr (fillCovMat) {
185+ mVtx .setPos ({mMeanVtx ->getX (), mMeanVtx ->getY (), mMeanVtx ->getZ ()});
186+ mVtx .setCov (mMeanVtx ->getSigmaX () * mMeanVtx ->getSigmaX (), 0 .0f , mMeanVtx ->getSigmaY () * mMeanVtx ->getSigmaY (), 0 .0f , 0 .0f , mMeanVtx ->getSigmaZ () * mMeanVtx ->getSigmaZ ());
187+ o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , mTrackParCov , 2 .f , matCorr, &mDcaInfoCov );
188+ } else {
189+ o2::base::Propagator::Instance ()->propagateToDCABxByBz ({mMeanVtx ->getX (), mMeanVtx ->getY (), mMeanVtx ->getZ ()}, mTrackPar , 2 .f , matCorr, &mDcaInfo );
190+ }
147191 }
148192 trackType = aod::track::Track;
149193 }
150- FillTracksPar (track, trackType, trackPar);
151- if (fillTracksDCA) {
152- tracksDCA (dcaInfo[0 ], dcaInfo[1 ]);
194+ if constexpr (fillCovMat) {
195+ tracksParPropagated (track.collisionId (), trackType, mTrackParCov .getX (), mTrackParCov .getAlpha (), mTrackParCov .getY (), mTrackParCov .getZ (), mTrackParCov .getSnp (), mTrackParCov .getTgl (), mTrackParCov .getQ2Pt ());
196+ tracksParExtensionPropagated (mTrackParCov .getPt (), mTrackParCov .getP (), mTrackParCov .getEta (), mTrackParCov .getPhi ());
197+ // TODO do we keep the rho as 0? Also the sigma's are duplicated information
198+ tracksParCovPropagated (std::sqrt (mTrackParCov .getSigmaY2 ()), std::sqrt (mTrackParCov .getSigmaZ2 ()), std::sqrt (mTrackParCov .getSigmaSnp2 ()),
199+ std::sqrt (mTrackParCov .getSigmaTgl2 ()), std::sqrt (mTrackParCov .getSigma1Pt2 ()), 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
200+ tracksParCovExtensionPropagated (mTrackParCov .getSigmaY2 (), mTrackParCov .getSigmaZY (), mTrackParCov .getSigmaZ2 (), mTrackParCov .getSigmaSnpY (),
201+ mTrackParCov .getSigmaSnpZ (), mTrackParCov .getSigmaSnp2 (), mTrackParCov .getSigmaTglY (), mTrackParCov .getSigmaTglZ (), mTrackParCov .getSigmaTglSnp (),
202+ mTrackParCov .getSigmaTgl2 (), mTrackParCov .getSigma1PtY (), mTrackParCov .getSigma1PtZ (), mTrackParCov .getSigma1PtSnp (), mTrackParCov .getSigma1PtTgl (),
203+ mTrackParCov .getSigma1Pt2 ());
204+ if (fillTracksDCA) {
205+ tracksDCA (mDcaInfoCov .getY (), mDcaInfoCov .getZ ());
206+ }
207+ if (fillTracksDCACov) {
208+ tracksDCACov (mDcaInfoCov .getSigmaY2 (), mDcaInfoCov .getSigmaZ2 ());
209+ }
210+ } else {
211+ tracksParPropagated (track.collisionId (), trackType, mTrackPar .getX (), mTrackPar .getAlpha (), mTrackPar .getY (), mTrackPar .getZ (), mTrackPar .getSnp (), mTrackPar .getTgl (), mTrackPar .getQ2Pt ());
212+ tracksParExtensionPropagated (mTrackPar .getPt (), mTrackPar .getP (), mTrackPar .getEta (), mTrackPar .getPhi ());
213+ if (fillTracksDCA) {
214+ tracksDCA (mDcaInfo [0 ], mDcaInfo [1 ]);
215+ }
153216 }
154217 }
155218 }
156- PROCESS_SWITCH (TrackPropagation, processStandard, " Process without covariance" , true );
157219
158- void processCovariance (soa::Join< aod::StoredTracksIU, aod::TracksCovIU> const & tracks, aod::Collisions const &, aod::BCsWithTimestamps const & bcs)
220+ void processStandard ( aod::StoredTracksIU const & tracks, aod::Collisions const & collisions , aod::BCsWithTimestamps const & bcs)
159221 {
160- if (bcs.size () == 0 ) {
161- return ;
162- }
163- initCCDB (bcs.begin ());
164-
165- o2::dataformats::DCA dcaInfoCov;
166- o2::dataformats::VertexBase vtx;
222+ fillTrackTables<aod::StoredTracksIU, /* fillCovMat =*/ false , /* useTrkPid =*/ false >(tracks, collisions, bcs);
223+ }
224+ PROCESS_SWITCH (TrackPropagation, processStandard, " Process without covariance" , true );
167225
168- tracksParPropagated.reserve (tracks.size ());
169- tracksParExtensionPropagated.reserve (tracks.size ());
170- tracksParCovPropagated.reserve (tracks.size ());
171- tracksParCovExtensionPropagated.reserve (tracks.size ());
172- if (fillTracksDCA) {
173- tracksDCA.reserve (tracks.size ());
174- }
175- if (fillTracksDCACov) {
176- tracksDCACov.reserve (tracks.size ());
177- }
226+ void processStandardWithPID (soa::Join<aod::StoredTracksIU, aod::TracksExtra> const & tracks, aod::Collisions const & collisions, aod::BCsWithTimestamps const & bcs)
227+ {
228+ fillTrackTables<soa::Join<aod::StoredTracksIU, aod::TracksExtra>, /* fillCovMat =*/ false , /* useTrkPid =*/ true >(tracks, collisions, bcs);
229+ }
230+ PROCESS_SWITCH (TrackPropagation, processStandardWithPID, " Process without covariance and with PID in tracking" , false );
178231
179- for (auto & track : tracks) {
180- dcaInfoCov.set (999 , 999 , 999 , 999 , 999 );
181- auto trackParCov = getTrackParCov (track);
182- aod::track::TrackTypeEnum trackType = (aod::track::TrackTypeEnum)track.trackType ();
183- // Only propagate tracks which have passed the innermost wall of the TPC (e.g. skipping loopers etc). Others fill unpropagated.
184- if (track.trackType () == aod::track::TrackIU && track.x () < minPropagationRadius) {
185- if (track.has_collision ()) {
186- auto const & collision = track.collision ();
187- vtx.setPos ({collision.posX (), collision.posY (), collision.posZ ()});
188- vtx.setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
189- o2::base::Propagator::Instance ()->propagateToDCABxByBz (vtx, trackParCov, 2 .f , matCorr, &dcaInfoCov);
190- } else {
191- vtx.setPos ({mVtx ->getX (), mVtx ->getY (), mVtx ->getZ ()});
192- vtx.setCov (mVtx ->getSigmaX () * mVtx ->getSigmaX (), 0 .0f , mVtx ->getSigmaY () * mVtx ->getSigmaY (), 0 .0f , 0 .0f , mVtx ->getSigmaZ () * mVtx ->getSigmaZ ());
193- o2::base::Propagator::Instance ()->propagateToDCABxByBz (vtx, trackParCov, 2 .f , matCorr, &dcaInfoCov);
194- }
195- trackType = aod::track::Track;
196- }
197- FillTracksPar (track, trackType, trackParCov);
198- if (fillTracksDCA) {
199- tracksDCA (dcaInfoCov.getY (), dcaInfoCov.getZ ());
200- }
201- if (fillTracksDCACov) {
202- tracksDCACov (dcaInfoCov.getSigmaY2 (), dcaInfoCov.getSigmaZ2 ());
203- }
204- // TODO do we keep the rho as 0? Also the sigma's are duplicated information
205- tracksParCovPropagated (std::sqrt (trackParCov.getSigmaY2 ()), std::sqrt (trackParCov.getSigmaZ2 ()), std::sqrt (trackParCov.getSigmaSnp2 ()),
206- std::sqrt (trackParCov.getSigmaTgl2 ()), std::sqrt (trackParCov.getSigma1Pt2 ()), 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
207- tracksParCovExtensionPropagated (trackParCov.getSigmaY2 (), trackParCov.getSigmaZY (), trackParCov.getSigmaZ2 (), trackParCov.getSigmaSnpY (),
208- trackParCov.getSigmaSnpZ (), trackParCov.getSigmaSnp2 (), trackParCov.getSigmaTglY (), trackParCov.getSigmaTglZ (), trackParCov.getSigmaTglSnp (),
209- trackParCov.getSigmaTgl2 (), trackParCov.getSigma1PtY (), trackParCov.getSigma1PtZ (), trackParCov.getSigma1PtSnp (), trackParCov.getSigma1PtTgl (),
210- trackParCov.getSigma1Pt2 ());
211- }
232+ void processCovariance (soa::Join<aod::StoredTracksIU, aod::TracksCovIU> const & tracks, aod::Collisions const & collisions, aod::BCsWithTimestamps const & bcs)
233+ {
234+ fillTrackTables<soa::Join<aod::StoredTracksIU, aod::TracksCovIU>, /* fillCovMat =*/ true , /* useTrkPid =*/ false >(tracks, collisions, bcs);
212235 }
213236 PROCESS_SWITCH (TrackPropagation, processCovariance, " Process with covariance" , false );
237+
238+ void processCovarianceWithPID (soa::Join<aod::StoredTracksIU, aod::TracksCovIU, aod::TracksExtra> const & tracks, aod::Collisions const & collisions, aod::BCsWithTimestamps const & bcs)
239+ {
240+ fillTrackTables<soa::Join<aod::StoredTracksIU, aod::TracksCovIU, aod::TracksExtra>, /* fillCovMat =*/ true , /* useTrkPid =*/ false >(tracks, collisions, bcs);
241+ }
242+ PROCESS_SWITCH (TrackPropagation, processCovarianceWithPID, " Process with covariance and with PID in tracking" , false );
214243};
215244
216245// ****************************************************************************************
0 commit comments