4646#include " CCDB/BasicCCDBManager.h"
4747#include " DataFormatsParameters/GRPObject.h"
4848#include " DataFormatsParameters/GRPMagField.h"
49+ #include " Common/Core/TPCVDriftManager.h"
4950
5051using namespace o2 ;
5152using namespace o2 ::framework;
@@ -278,6 +279,7 @@ struct StrangenessBuilder {
278279 struct : ConfigurableGroup {
279280 std::string prefix = " v0BuilderOpts" ;
280281 Configurable<bool > generatePhotonCandidates{" generatePhotonCandidates" , false , " generate gamma conversion candidates (V0s using TPC-only tracks)" };
282+ Configurable<bool > moveTPCOnlyTracks{" moveTPCOnlyTracks" , true , " if dealing with TPC-only tracks, move them according to TPC drift / time info" };
281283
282284 // baseline conditionals of V0 building
283285 Configurable<int > minCrossedRows{" minCrossedRows" , 50 , " minimum TPC crossed rows for daughter tracks" };
@@ -341,6 +343,9 @@ struct StrangenessBuilder {
341343 int mRunNumber ;
342344 o2::base::MatLayerCylSet* lut = nullptr ;
343345
346+ // for handling TPC-only tracks (photons)
347+ o2::aod::common::TPCVDriftManager mVDriftMgr ;
348+
344349 // for tagging V0s used in cascades
345350 std::vector<o2::pwglf::v0candidate> v0sFromCascades; // Vector of v0 candidates used in cascades
346351 std::vector<int > v0Map; // index to relate V0s -> v0sFromCascades
@@ -625,6 +630,12 @@ struct StrangenessBuilder {
625630 // mmark this run as configured
626631 mRunNumber = bc.runNumber ();
627632
633+ if (v0BuilderOpts.generatePhotonCandidates .value && v0BuilderOpts.moveTPCOnlyTracks .value ) {
634+ // initialize only if needed, avoid unnecessary CCDB calls
635+ mVDriftMgr .init (&ccdb->instance ());
636+ mVDriftMgr .update (timestamp);
637+ }
638+
628639 return true ;
629640 }
630641
@@ -1098,7 +1109,7 @@ struct StrangenessBuilder {
10981109 }
10991110
11001111 // __________________________________________________
1101- template <typename TCollisions, typename TTracks, typename TV0s, typename TMCParticles>
1112+ template <class TBCs , typename TCollisions, typename TTracks, typename TV0s, typename TMCParticles>
11021113 void buildV0s (TCollisions const & collisions, TV0s const & v0s, TTracks const & tracks, TMCParticles const & mcParticles)
11031114 {
11041115 // prepare MC containers (not necessarily used)
@@ -1134,7 +1145,38 @@ struct StrangenessBuilder {
11341145 }
11351146 auto const & posTrack = tracks.rawIteratorAt (v0.posTrackId );
11361147 auto const & negTrack = tracks.rawIteratorAt (v0.negTrackId );
1137- if (!straHelper.buildV0Candidate (v0.collisionId , pvX, pvY, pvZ, posTrack, negTrack, v0.isCollinearV0 , mEnabledTables [kV0Covs ])) {
1148+
1149+ auto posTrackPar = getTrackParCov (posTrack);
1150+ auto negTrackPar = getTrackParCov (negTrack);
1151+
1152+ // handle TPC-only tracks properly (photon conversions)
1153+ if (v0BuilderOpts.moveTPCOnlyTracks ) {
1154+ bool isPosTPCOnly = (posTrack.hasTPC () && !posTrack.hasITS () && !posTrack.hasTRD () && !posTrack.hasTOF ());
1155+ if (isPosTPCOnly) {
1156+ // Nota bene: positive is TPC-only -> this entire V0 merits treatment as photon candidate
1157+ posTrackPar.setPID (o2::track::PID::Electron);
1158+ negTrackPar.setPID (o2::track::PID::Electron);
1159+
1160+ auto const & collision = collisions.rawIteratorAt (v0.collisionId );
1161+ if (!mVDriftMgr .moveTPCTrack <TBCs, TCollisions>(collision, posTrack, posTrackPar)) {
1162+ return ;
1163+ }
1164+ }
1165+
1166+ bool isNegTPCOnly = (negTrack.hasTPC () && !negTrack.hasITS () && !negTrack.hasTRD () && !negTrack.hasTOF ());
1167+ if (isNegTPCOnly) {
1168+ // Nota bene: negative is TPC-only -> this entire V0 merits treatment as photon candidate
1169+ posTrackPar.setPID (o2::track::PID::Electron);
1170+ negTrackPar.setPID (o2::track::PID::Electron);
1171+
1172+ auto const & collision = collisions.rawIteratorAt (v0.collisionId );
1173+ if (!mVDriftMgr .moveTPCTrack <TBCs, TCollisions>(collision, negTrack, negTrackPar)) {
1174+ return ;
1175+ }
1176+ }
1177+ }
1178+
1179+ if (!straHelper.buildV0Candidate (v0.collisionId , pvX, pvY, pvZ, posTrack, negTrack, posTrackPar, negTrackPar, v0.isCollinearV0 , mEnabledTables [kV0Covs ])) {
11381180 products.v0dataLink (-1 , -1 );
11391181 continue ;
11401182 }
@@ -2107,7 +2149,7 @@ struct StrangenessBuilder {
21072149 markV0sUsedInCascades (v0List, cascadeList, trackedCascades);
21082150
21092151 // build V0s
2110- buildV0s (collisions, v0List, tracks, mcParticles);
2152+ buildV0s<TBCs> (collisions, v0List, tracks, mcParticles);
21112153
21122154 // build cascades
21132155 buildCascades (collisions, cascadeList, tracks, mcParticles);
@@ -2121,22 +2163,22 @@ struct StrangenessBuilder {
21212163 populateCascadeInterlinks ();
21222164 }
21232165
2124- void processRealData (aod::Collisions const & collisions, aod::V0s const & v0s, aod::Cascades const & cascades, aod::TrackedCascades const & trackedCascades, FullTracksExtIU const & tracks, aod::BCsWithTimestamps const & bcs)
2166+ void processRealData (soa::Join< aod::Collisions, aod::EvSels> const & collisions, aod::V0s const & v0s, aod::Cascades const & cascades, aod::TrackedCascades const & trackedCascades, FullTracksExtIU const & tracks, aod::BCsWithTimestamps const & bcs)
21252167 {
21262168 dataProcess (collisions, static_cast <TObject*>(nullptr ), v0s, cascades, trackedCascades, tracks, bcs, static_cast <TObject*>(nullptr ));
21272169 }
21282170
2129- void processRealDataRun2 (aod::Collisions const & collisions, aod::V0s const & v0s, aod::Cascades const & cascades, FullTracksExt const & tracks, aod::BCsWithTimestamps const & bcs)
2171+ void processRealDataRun2 (soa::Join< aod::Collisions, aod::EvSels> const & collisions, aod::V0s const & v0s, aod::Cascades const & cascades, FullTracksExt const & tracks, aod::BCsWithTimestamps const & bcs)
21302172 {
21312173 dataProcess (collisions, static_cast <TObject*>(nullptr ), v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, static_cast <TObject*>(nullptr ));
21322174 }
21332175
2134- void processMonteCarlo (soa::Join<aod::Collisions, aod::McCollisionLabels> const & collisions, aod::McCollisions const & mccollisions, aod::V0s const & v0s, aod::Cascades const & cascades, aod::TrackedCascades const & trackedCascades, FullTracksExtLabeledIU const & tracks, aod::BCsWithTimestamps const & bcs, aod::McParticles const & mcParticles)
2176+ void processMonteCarlo (soa::Join<aod::Collisions, aod::EvSels, aod:: McCollisionLabels> const & collisions, aod::McCollisions const & mccollisions, aod::V0s const & v0s, aod::Cascades const & cascades, aod::TrackedCascades const & trackedCascades, FullTracksExtLabeledIU const & tracks, aod::BCsWithTimestamps const & bcs, aod::McParticles const & mcParticles)
21352177 {
21362178 dataProcess (collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles);
21372179 }
21382180
2139- void processMonteCarloRun2 (soa::Join<aod::Collisions, aod::McCollisionLabels> const & collisions, aod::McCollisions const & mccollisions, aod::V0s const & v0s, aod::Cascades const & cascades, FullTracksExtLabeled const & tracks, aod::BCsWithTimestamps const & bcs, aod::McParticles const & mcParticles)
2181+ void processMonteCarloRun2 (soa::Join<aod::Collisions, aod::EvSels, aod:: McCollisionLabels> const & collisions, aod::McCollisions const & mccollisions, aod::V0s const & v0s, aod::Cascades const & cascades, FullTracksExtLabeled const & tracks, aod::BCsWithTimestamps const & bcs, aod::McParticles const & mcParticles)
21402182 {
21412183 dataProcess (collisions, mccollisions, v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, mcParticles);
21422184 }
0 commit comments