2727#include " Common/CCDB/TriggerAliases.h"
2828#include " Common/Core/CollisionTypeHelper.h"
2929#include " Common/Core/EventPlaneHelper.h"
30+ #include " Common/Core/PID/PIDTOFParamService.h"
3031#include " Common/Core/fwdtrackUtilities.h"
3132#include " Common/Core/trackUtilities.h"
3233
@@ -129,18 +130,19 @@ class VarManager : public TObject
129130 ReducedMuon = BIT (14 ),
130131 ReducedMuonExtra = BIT (15 ),
131132 ReducedMuonCov = BIT (16 ),
132- ParticleMC = BIT (17 ),
133- Pair = BIT (18 ), // TODO: check whether we really need the Pair member here
134- AmbiTrack = BIT (19 ),
135- AmbiMuon = BIT (20 ),
136- DalitzBits = BIT (21 ),
137- TrackTPCPID = BIT (22 ),
138- TrackMFT = BIT (23 ),
139- ReducedTrackCollInfo = BIT (24 ), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo
140- ReducedMuonCollInfo = BIT (25 ), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo
141- MuonRealign = BIT (26 ),
142- MuonCovRealign = BIT (27 ),
143- MFTCov = BIT (28 )
133+ Pair = BIT (17 ), // TODO: check whether we really need the Pair member here
134+ AmbiTrack = BIT (18 ),
135+ AmbiMuon = BIT (19 ),
136+ DalitzBits = BIT (20 ),
137+ TrackTPCPID = BIT (21 ),
138+ TrackMFT = BIT (22 ),
139+ ReducedTrackCollInfo = BIT (23 ), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo
140+ ReducedMuonCollInfo = BIT (24 ), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo
141+ MuonRealign = BIT (25 ),
142+ MuonCovRealign = BIT (26 ),
143+ MFTCov = BIT (27 ),
144+ TrackTOFService = BIT (28 ),
145+ ParticleMC = BIT (29 )
144146 };
145147
146148 enum PairCandidateType {
@@ -188,8 +190,17 @@ class VarManager : public TObject
188190 kRunNo = 0 ,
189191 kNRunWiseVariables ,
190192
193+ // Timeframe wise variables
194+ kTFNBCs = kNRunWiseVariables ,
195+ kTFNCollisions ,
196+ kTFNMCCollisions ,
197+ kTFNTracks ,
198+ kTFNMuons ,
199+ kTFNMFTs ,
200+ kNTFWiseVariables ,
201+
191202 // Event wise variables
192- kTimestamp ,
203+ kTimestamp = kNTFWiseVariables ,
193204 kTimeFromSOR , // Time since Start of Run (SOR) in minutes
194205 kCollisionTime ,
195206 kCollisionTimeRes ,
@@ -442,7 +453,6 @@ class VarManager : public TObject
442453 kTwoR2SP2 , // Scalar product resolution of event2 for ME technique
443454 kTwoR2EP1 , // Event plane resolution of event2 for ME technique
444455 kTwoR2EP2 , // Event plane resolution of event2 for ME technique
445- kNEventWiseVariables ,
446456
447457 // Variables for event mixing with cumulant
448458 kV22m ,
@@ -453,9 +463,10 @@ class VarManager : public TObject
453463 kV24ME ,
454464 kWV22ME ,
455465 kWV24ME ,
466+ kNEventWiseVariables ,
456467
457468 // Basic track/muon/pair wise variables
458- kX ,
469+ kX = kNEventWiseVariables ,
459470 kY ,
460471 kZ ,
461472 kPt ,
@@ -571,7 +582,7 @@ class VarManager : public TObject
571582 kNBarrelTrackVariables ,
572583
573584 // Muon track variables
574- kMuonNClusters ,
585+ kMuonNClusters = kNBarrelTrackVariables ,
575586 kMuonPDca ,
576587 kMuonRAtAbsorberEnd ,
577588 kMCHBitMap ,
@@ -1163,8 +1174,8 @@ class VarManager : public TObject
11631174 static void FillBC (T const & bc, float * values = nullptr );
11641175 template <uint32_t fillMap, typename T>
11651176 static void FillEvent (T const & event, float * values = nullptr );
1166- template <uint32_t fillMap, typename TEvent, typename TAssoc, typename TTracks >
1167- static void FillEventTrackEstimators (TEvent const & collision, TAssoc const & groupedTrackIndices, TTracks const & tracks , float * values = nullptr );
1177+ template <typename T >
1178+ static void FillTimeFrame (T const & tfTable , float * values = nullptr );
11681179 template <typename T>
11691180 static void FillEventFlowResoFactor (T const & hs_sp, T const & hs_ep, float * values = nullptr );
11701181 template <typename T>
@@ -1181,7 +1192,7 @@ class VarManager : public TObject
11811192 static void FillPhoton (T const & photon, float * values = nullptr );
11821193 template <uint32_t fillMap, typename T, typename C>
11831194 static void FillTrackCollision (T const & track, C const & collision, float * values = nullptr );
1184- template <int candidateType, typename T1, typename T2, typename C>
1195+ template <int candidateType, uint32_t fillMap, typename T1, typename T2, typename C>
11851196 static void FillTrackCollisionMC (T1 const & track, T2 const & MotherTrack, C const & collision, float * values = nullptr );
11861197 template <uint32_t fillMap, typename T, typename C, typename M, typename P>
11871198 static void FillTrackCollisionMatCorr (T const & track, C const & collision, M const & materialCorr, P const & propagator, float * values = nullptr );
@@ -1364,7 +1375,7 @@ class VarManager : public TObject
13641375 VarManager& operator =(const VarManager& c);
13651376 VarManager (const VarManager& c);
13661377
1367- ClassDef (VarManager, 4 );
1378+ ClassDef (VarManager, 5 );
13681379};
13691380
13701381template <typename T, typename C>
@@ -1633,6 +1644,32 @@ void VarManager::FillGlobalMuonRefitCov(T1 const& muontrack, T2 const& mfttrack,
16331644 }
16341645}
16351646
1647+ template <typename T>
1648+ void VarManager::FillTimeFrame (T const & tf, float * values)
1649+ {
1650+ if (!values) {
1651+ values = fgValues;
1652+ }
1653+ if constexpr (T::template contains<o2::aod::BCs>()) {
1654+ values[kTFNBCs ] = tf.size ();
1655+ }
1656+ if constexpr (T::template contains<o2::aod::Collisions>()) {
1657+ values[kTFNCollisions ] = tf.size ();
1658+ }
1659+ if constexpr (T::template contains<o2::aod::McCollisions>()) {
1660+ values[kTFNMCCollisions ] = tf.size ();
1661+ }
1662+ if constexpr (T::template contains<o2::aod::Tracks>()) {
1663+ values[kTFNTracks ] = tf.size ();
1664+ }
1665+ if constexpr (T::template contains<o2::aod::FwdTracks>()) {
1666+ values[kTFNMuons ] = tf.size ();
1667+ }
1668+ if constexpr (T::template contains<o2::aod::MFTTracks>()) {
1669+ values[kTFNMFTs ] = tf.size ();
1670+ }
1671+ }
1672+
16361673template <typename T>
16371674void VarManager::FillBC (T const & bc, float * values)
16381675{
@@ -2138,56 +2175,6 @@ void VarManager::FillEvent(T const& event, float* values)
21382175 // FillEventDerived(values);
21392176}
21402177
2141- template <uint32_t fillMap, typename TEvent, typename TAssoc, typename TTracks>
2142- void VarManager::FillEventTrackEstimators (TEvent const & collision, TAssoc const & assocs, TTracks const & /* tracks*/ , float * values)
2143- {
2144- // Compute median Z for the large dcaZ tracks in the TPC
2145- // This is for studies of the pileup impact on the TPC
2146-
2147- if (!values) {
2148- values = fgValues;
2149- }
2150-
2151- if constexpr ((fillMap & Track) > 0 && (fillMap & TrackDCA) > 0 ) {
2152-
2153- std::vector<float > tracksP;
2154- std::vector<float > tracksM;
2155-
2156- for (const auto & assoc : assocs) {
2157- auto track = assoc.template track_as <TTracks>();
2158- // compute the dca of this track wrt the collision
2159- auto trackPar = getTrackPar (track);
2160- std::array<float , 2 > dca{1e10f, 1e10f};
2161- trackPar.propagateParamToDCA ({collision.posX (), collision.posY (), collision.posZ ()}, fgMagField, &dca);
2162-
2163- // if it is a displaced track longitudinally, add it to the track vector
2164- if (abs (dca[0 ]) < 3.0 && abs (dca[1 ]) > 4.0 ) {
2165- if (track.tgl () > 0.1 ) {
2166- tracksP.push_back (track.z ());
2167- }
2168- if (track.tgl () < -0.1 ) {
2169- tracksM.push_back (track.z ());
2170- }
2171- }
2172- } // end loop over associations
2173-
2174- // compute the number of pileup contributors and the median z for pileup
2175- if (tracksP.size () > 0 ) {
2176- std::sort (tracksP.begin (), tracksP.end ());
2177- auto midP = tracksP.size () / 2 ;
2178- values[kNTPCpileupContribA ] = tracksP.size ();
2179- values[kNTPCpileupZA ] = (tracksP.size () % 2 ? (tracksP[midP] + tracksP[midP - 1 ]) / 2 : tracksP[midP]);
2180- }
2181-
2182- if (tracksM.size () > 0 ) {
2183- std::sort (tracksM.begin (), tracksM.end ());
2184- values[kNTPCpileupContribC ] = tracksM.size ();
2185- auto midM = tracksM.size () / 2 ;
2186- values[kNTPCpileupZC ] = (tracksM.size () % 2 ? (tracksM[midM] + tracksM[midM - 1 ]) / 2 : tracksM[midM]);
2187- }
2188- }
2189- }
2190-
21912178template <typename T>
21922179void VarManager::FillEventFlowResoFactor (T const & hs_sp, T const & hs_ep, float * values)
21932180{
@@ -2280,25 +2267,17 @@ void VarManager::FillTwoEvents(T const& ev1, T const& ev2, float* values)
22802267 if (!values) {
22812268 values = fgValues;
22822269 }
2283-
2270+ // if constexpr (T::template contains<o2::aod::Collision>()) {
22842271 values[kTwoEvPosZ1 ] = ev1.posZ ();
22852272 values[kTwoEvPosZ2 ] = ev2.posZ ();
22862273 values[kTwoEvPosR1 ] = std::sqrt (ev1.posX () * ev1.posX () + ev1.posY () * ev1.posY ());
22872274 values[kTwoEvPosR2 ] = std::sqrt (ev2.posX () * ev2.posX () + ev2.posY () * ev2.posY ());
2288- values[kTwoEvPVcontrib1 ] = ev1.numContrib ();
2289- values[kTwoEvPVcontrib2 ] = ev2.numContrib ();
2290- if (ev1.numContrib () < ev2.numContrib ()) {
2291- values[kTwoEvPosZ1 ] = ev2.posZ ();
2292- values[kTwoEvPosZ2 ] = ev1.posZ ();
2293- values[kTwoEvPVcontrib1 ] = ev2.numContrib ();
2294- values[kTwoEvPVcontrib2 ] = ev1.numContrib ();
2295- values[kTwoEvPosR1 ] = std::sqrt (ev2.posX () * ev2.posX () + ev2.posY () * ev2.posY ());
2296- ;
2297- values[kTwoEvPosR2 ] = std::sqrt (ev1.posX () * ev1.posX () + ev1.posY () * ev1.posY ());
2298- }
22992275 values[kTwoEvDeltaZ ] = ev1.posZ () - ev2.posZ ();
23002276 values[kTwoEvDeltaX ] = ev1.posX () - ev2.posX ();
23012277 values[kTwoEvDeltaY ] = ev1.posY () - ev2.posY ();
2278+ // }
2279+ values[kTwoEvPVcontrib1 ] = ev1.numContrib ();
2280+ values[kTwoEvPVcontrib2 ] = ev2.numContrib ();
23022281 values[kTwoEvDeltaR ] = std::sqrt (values[kTwoEvDeltaX ] * values[kTwoEvDeltaX ] + values[kTwoEvDeltaY ] * values[kTwoEvDeltaY ]);
23032282}
23042283
@@ -2680,6 +2659,12 @@ void VarManager::FillTrack(T const& track, float* values)
26802659 values[kTOFbeta ] = track.beta ();
26812660 }
26822661 }
2662+ if constexpr ((fillMap & TrackTOFService) > 0 ) {
2663+ values[kTOFnSigmaEl ] = track.tofNSigmaDynEl ();
2664+ values[kTOFnSigmaEl ] = track.tofNSigmaDynPi ();
2665+ values[kTOFnSigmaEl ] = track.tofNSigmaDynKa ();
2666+ values[kTOFnSigmaEl ] = track.tofNSigmaDynPr ();
2667+ }
26832668 if constexpr ((fillMap & TrackTPCPID) > 0 ) {
26842669 values[kTPCnSigmaEl ] = track.tpcNSigmaEl ();
26852670 values[kTPCnSigmaPi ] = track.tpcNSigmaPi ();
@@ -2870,47 +2855,55 @@ void VarManager::FillTrackMC(const U& mcStack, T const& track, float* values)
28702855 FillTrackDerived (values);
28712856}
28722857
2873- template <int candidateType, typename T1, typename T2, typename C>
2858+ template <int candidateType, uint32_t fillMap, typename T1, typename T2, typename C>
28742859void VarManager::FillTrackCollisionMC (T1 const & track, T2 const & MotherTrack, C const & collision, float * values)
28752860{
28762861
28772862 if (!values) {
28782863 values = fgValues;
28792864 }
28802865
2881- float m = 0.0 ;
2882- float pdgLifetime = 0.0 ;
2883- if (std::abs (MotherTrack.pdgCode ()) == 521 ) {
2884- m = o2::constants::physics::MassBPlus;
2885- pdgLifetime = 1.638e-12 ; // s
2886- }
2866+ float m = o2::constants::physics::MassBPlus;
2867+ float pdgLifetime = 1.638e-12 ; // s
28872868 if (std::abs (MotherTrack.pdgCode ()) == 511 ) {
28882869 m = o2::constants::physics::MassB0;
28892870 pdgLifetime = 1.517e-12 ; // s
28902871 }
28912872
2873+ // Extract the collision primary vertex position using constexpr, since the collision type may be CollisionMC or ReducedMCEvent
2874+ double collPos[3 ] = {0.0 , 0.0 , 0.0 };
2875+ if constexpr (fillMap & ObjTypes::CollisionMC) {
2876+ collPos[0 ] = collision.posX ();
2877+ collPos[1 ] = collision.posY ();
2878+ collPos[2 ] = collision.posZ ();
2879+ } else if constexpr (fillMap & ObjTypes::ReducedEventMC) {
2880+ collPos[0 ] = collision.mcPosX ();
2881+ collPos[1 ] = collision.mcPosY ();
2882+ collPos[2 ] = collision.mcPosZ ();
2883+ }
2884+
28922885 // displaced vertex is compued with decay product (track) and momentum of mother particle (MotherTrack)
2893- values[kMCVertexingLxy ] = (collision. mcPosX () - track.vx ()) * (collision. mcPosX () - track.vx ()) +
2894- (collision. mcPosY () - track.vy ()) * (collision. mcPosY () - track.vy ());
2895- values[kMCVertexingLz ] = (collision. mcPosZ () - track.vz ()) * (collision. mcPosZ () - track.vz ());
2886+ values[kMCVertexingLxy ] = (collPos[ 0 ] - track.vx ()) * (collPos[ 0 ] - track.vx ()) +
2887+ (collPos[ 1 ] - track.vy ()) * (collPos[ 1 ] - track.vy ());
2888+ values[kMCVertexingLz ] = (collPos[ 2 ] - track.vz ()) * (collPos[ 2 ] - track.vz ());
28962889 values[kMCVertexingLxyz ] = values[kMCVertexingLxy ] + values[kMCVertexingLz ];
28972890 values[kMCVertexingLxy ] = std::sqrt (values[kMCVertexingLxy ]);
28982891 values[kMCVertexingLz ] = std::sqrt (values[kMCVertexingLz ]);
28992892 values[kMCVertexingLxyz ] = std::sqrt (values[kMCVertexingLxyz ]);
2900- values[kMCVertexingTauz ] = (collision. mcPosZ () - track.vz ()) * m / (TMath::Abs (MotherTrack.pz ()) * o2::constants::physics::LightSpeedCm2NS);
2893+ values[kMCVertexingTauz ] = (collPos[ 2 ] - track.vz ()) * m / (TMath::Abs (MotherTrack.pz ()) * o2::constants::physics::LightSpeedCm2NS);
29012894 values[kMCVertexingTauxy ] = values[kMCVertexingLxy ] * m / (MotherTrack.pt () * o2::constants::physics::LightSpeedCm2NS);
29022895
2903- values[kMCCosPointingAngle ] = ((collision. mcPosX () - track.vx ()) * MotherTrack.px () +
2904- (collision. mcPosY () - track.vy ()) * MotherTrack.py () +
2905- (collision. mcPosZ () - track.vz ()) * MotherTrack.pz ()) /
2896+ values[kMCCosPointingAngle ] = ((collPos[ 0 ] - track.vx ()) * MotherTrack.px () +
2897+ (collPos[ 1 ] - track.vy ()) * MotherTrack.py () +
2898+ (collPos[ 2 ] - track.vz ()) * MotherTrack.pz ()) /
29062899 (MotherTrack.p () * values[VarManager::kMCVertexingLxyz ]);
29072900
29082901 values[kMCLxyExpected ] = (MotherTrack.pt () / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S);
29092902 values[kMCLxyzExpected ] = (MotherTrack.p () / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S);
29102903
2911- values[kMCVertexingLzProjected ] = ((track.vz () - collision. mcPosZ () ) * MotherTrack.pz ()) / TMath::Abs (MotherTrack.pz ());
2912- values[kMCVertexingLxyProjected ] = (((track.vx () - collision. mcPosX ()) * MotherTrack.px ()) + ((track.vy () - collision. mcPosY () ) * MotherTrack.py ())) / TMath::Abs (MotherTrack.pt ());
2913- values[kMCVertexingLxyzProjected ] = (((track.vx () - collision. mcPosX ()) * MotherTrack.px ()) + ((track.vy () - collision. mcPosY ()) * MotherTrack.py ()) + ((track.vz () - collision. mcPosZ () ) * MotherTrack.pz ())) / MotherTrack.p ();
2904+ values[kMCVertexingLzProjected ] = ((track.vz () - collPos[ 2 ] ) * MotherTrack.pz ()) / TMath::Abs (MotherTrack.pz ());
2905+ values[kMCVertexingLxyProjected ] = (((track.vx () - collPos[ 0 ]) * MotherTrack.px ()) + ((track.vy () - collPos[ 1 ] ) * MotherTrack.py ())) / TMath::Abs (MotherTrack.pt ());
2906+ values[kMCVertexingLxyzProjected ] = (((track.vx () - collPos[ 1 ]) * MotherTrack.px ()) + ((track.vy () - collPos[ 1 ]) * MotherTrack.py ()) + ((track.vz () - collPos[ 2 ] ) * MotherTrack.pz ())) / MotherTrack.p ();
29142907 values[kMCVertexingTauxyProjected ] = values[kMCVertexingLxyProjected ] * m / (MotherTrack.pt ());
29152908 values[kMCVertexingTauzProjected ] = values[kMCVertexingLzProjected ] * m / TMath::Abs (MotherTrack.pz ());
29162909 values[kMCVertexingTauxyzProjected ] = values[kMCVertexingLxyzProjected ] * m / (MotherTrack.p ());
0 commit comments