16#ifndef ALICEO2_DATA_MCTRACK_H_
17#define ALICEO2_DATA_MCTRACK_H_
24#include "TLorentzVector.h"
25#include "TMCProcess.h"
28#include "TParticlePDG.h"
35namespace MCTrackHelper
55 MCTrackT(Int_t pdgCode, Int_t motherID, Int_t secondMotherID, Int_t firstDaughterID, Int_t lastDaughterID,
56 Double_t px, Double_t py, Double_t pz, Double_t
x, Double_t
y, Double_t
z, Double_t t,
69 void Print(Int_t iTrack = 0)
const;
88 Double_t
R2()
const {
return Vx() *
Vx() +
Vy() *
Vy(); }
90 Double_t
R()
const {
return std::sqrt(
R2()); }
101 Double_t
Px()
const {
return mStartVertexMomentumX; }
102 Double_t
Py()
const {
return mStartVertexMomentumY; }
103 Double_t
Pz()
const {
return mStartVertexMomentumZ; }
104 Double_t
Vx()
const {
return mStartVertexCoordinatesX; }
105 Double_t
Vy()
const {
return mStartVertexCoordinatesY; }
106 Double_t
Vz()
const {
return mStartVertexCoordinatesZ; }
107 Double_t
T()
const {
return mStartVertexCoordinatesT; }
111 double mx(mStartVertexMomentumX);
112 double my(mStartVertexMomentumY);
113 return std::sqrt(mx * mx + my * my);
118 double mx(mStartVertexMomentumX);
119 double my(mStartVertexMomentumY);
120 double mz(mStartVertexMomentumZ);
121 return std::sqrt(mx * mx + my * my + mz * mz);
126 double mx(mStartVertexMomentumX);
127 double my(mStartVertexMomentumY);
128 return (TMath::Pi() + TMath::ATan2(-my, -mx));
133 double_t pmom =
GetP();
134 double mz(mStartVertexMomentumZ);
135 if (pmom != TMath::Abs(mz)) {
136 return 0.5 * std::log((pmom + mz) / (pmom - mz));
150 double mz(mStartVertexMomentumZ);
151 return (mz == 0) ? TMath::PiOver2() : TMath::ACos(mz /
GetP());
163 Int_t
getHitMask()
const {
return ((PropEncoding)mProp).hitmask; }
177 auto prop = ((PropEncoding)mProp);
178 prop.hitmask |= 1 << iDetBit;
184 return (((PropEncoding)mProp).hitmask & (1 << bit)) > 0;
189 bool leftTrace(Int_t iDet, std::vector<int>
const& detIDtoBit)
const
191 auto bit = detIDtoBit[iDet];
214 auto prop = ((PropEncoding)mProp);
218 bool getStore()
const {
return ((PropEncoding)mProp).storage; }
220 bool hasHits()
const {
return ((PropEncoding)mProp).hitmask != 0; }
224 auto prop = ((PropEncoding)mProp);
230 int getProcess()
const {
return ((PropEncoding)mProp).process; }
237 auto prop = ((PropEncoding)mProp);
241 bool getToBeDone()
const {
return ((PropEncoding)mProp).toBeDone; }
245 auto prop = ((PropEncoding)mProp);
258 _T mStartVertexMomentumX, mStartVertexMomentumY, mStartVertexMomentumZ;
261 _T mStartVertexCoordinatesX, mStartVertexCoordinatesY, mStartVertexCoordinatesZ, mStartVertexCoordinatesT;
270 Int_t mMotherTrackId = -1;
271 Int_t mSecondMotherTrackId = -1;
273 Int_t mFirstDaughterTrackId = -1;
274 Int_t mLastDaughterTrackId = -1;
283 PropEncoding(
int a) :
i(
a) {}
298 Int_t mStatusCode = 0;
306 const auto mass = GetMass();
307 Double_t px = mStartVertexMomentumX;
308 Double_t py = mStartVertexMomentumY;
309 Double_t pz = mStartVertexMomentumZ;
310 return std::sqrt(mass * mass + px * px + py * py + pz * pz);
316 momentum.SetXYZ(mStartVertexMomentumX, mStartVertexMomentumY, mStartVertexMomentumZ);
322 momentum.SetXYZT(mStartVertexMomentumX, mStartVertexMomentumY, mStartVertexMomentumZ, GetEnergy());
328 vertex.SetXYZ(mStartVertexCoordinatesX, mStartVertexCoordinatesY, mStartVertexCoordinatesZ);
335 mSecondMotherTrackId(-1),
336 mFirstDaughterTrackId(-1),
337 mLastDaughterTrackId(-1),
338 mStartVertexMomentumX(0.),
339 mStartVertexMomentumY(0.),
340 mStartVertexMomentumZ(0.),
341 mStartVertexCoordinatesX(0.),
342 mStartVertexCoordinatesY(0.),
343 mStartVertexCoordinatesZ(0.),
344 mStartVertexCoordinatesT(0.),
351inline MCTrackT<T>::MCTrackT(Int_t pdgCode, Int_t motherId, Int_t secondMotherId, Int_t firstDaughterId, Int_t lastDaughterId,
352 Double_t px, Double_t py, Double_t pz, Double_t
x,
353 Double_t
y, Double_t
z, Double_t t, Int_t
mask)
355 mMotherTrackId(motherId),
356 mSecondMotherTrackId(secondMotherId),
357 mFirstDaughterTrackId(firstDaughterId),
358 mLastDaughterTrackId(lastDaughterId),
359 mStartVertexMomentumX(px),
360 mStartVertexMomentumY(py),
361 mStartVertexMomentumZ(pz),
362 mStartVertexCoordinatesX(
x),
363 mStartVertexCoordinatesY(
y),
364 mStartVertexCoordinatesZ(
z),
365 mStartVertexCoordinatesT(t),
373 : mPdgCode(part.GetPdgCode()),
374 mMotherTrackId(part.GetMother(0)),
375 mSecondMotherTrackId(part.GetMother(1)),
376 mFirstDaughterTrackId(part.GetFirstDaughter()),
377 mLastDaughterTrackId(part.GetLastDaughter()),
378 mStartVertexMomentumX(part.Px()),
379 mStartVertexMomentumY(part.Py()),
380 mStartVertexMomentumZ(part.Pz()),
381 mStartVertexCoordinatesX(part.Vx()),
382 mStartVertexCoordinatesY(part.Vy()),
383 mStartVertexCoordinatesZ(part.Vz()),
384 mStartVertexCoordinatesT(part.T() * 1e09),
385 mWeight(part.GetWeight()),
427 const auto e = GetEnergy();
429 0.5 * std::log((e +
static_cast<double>(mStartVertexMomentumZ)) / (e -
static_cast<double>(mStartVertexMomentumZ)));
436 auto procID = getProcess();
438 return TMCProcessName[procID];
440 return TMCProcessName[TMCProcess::kPNoProcess];
bool leftTraceGivenBitField(int bit) const
int getProcess() const
get the production process (id) of this track
o2::mcgenstatus::MCGenStatusEncoding getStatusCode() const
get generator status code
Int_t getFirstDaughterTrackId() const
Double_t GetStartVertexMomentumZ() const
void GetMomentum(TVector3 &momentum) const
Double_t GetTheta() const
Double_t R() const
production radius
bool getInhibited() const
void Get4Momentum(TLorentzVector &momentum) const
static constexpr int NHITBITS
Double_t GetStartVertexMomentumX() const
bool leftTrace(Int_t iDet, std::vector< int > const &detIDtoBit) const
MCTrackT(const MCTrackT &track)=default
Copy constructor.
Int_t getLastDaughterTrackId() const
_T getWeight() const
return particle weight
void SetLastDaughterTrackId(Int_t id)
Double_t GetMass() const
return mass from PDG Database if known (print message in case cannot look up)
void SetMotherTrackId(Int_t id)
Modifiers.
const char * getProdProcessAsString() const
get the string representation of the production process
Double_t GetRapidity() const
void SetFirstDaughterTrackId(Int_t id)
Double_t GetStartVertexCoordinatesY() const
bool isTransported() const
void setInhibited(bool f)
void Print(Int_t iTrack=0) const
Output to screen.
MCTrackT()
Default constructor.
Double_t GetStartVertexCoordinatesZ() const
void SetSecondMotherTrackId(Int_t id)
Double_t R2() const
production radius squared
Double_t GetStartVertexMomentumY() const
Double_t GetStartVertexCoordinatesT() const
void GetStartVertex(TVector3 &vertex) const
Double_t GetEnergy() const
MCTrackT(const TParticle &particle)
Constructor from TParticle.
MCTrackT(Int_t pdgCode, Int_t motherID, Int_t secondMotherID, Int_t firstDaughterID, Int_t lastDaughterID, Double_t px, Double_t py, Double_t pz, Double_t x, Double_t y, Double_t z, Double_t t, Int_t nPoints)
Standard constructor.
Int_t getSecondMotherTrackId() const
~MCTrackT()=default
Destructor.
void setHit(Int_t iDetBit)
Int_t getHitMask() const
Accessors to the hit mask.
Double_t GetStartVertexCoordinatesX() const
Int_t GetPdgCode() const
Accessors.
bool hasHits() const
determine if this track has hits
void setProcess(int proc)
set process property
Int_t getMotherTrackId() const
static Double_t Mass(int pdg, bool &success, TDatabasePDG *db=O2DatabasePDG::Instance())
static constexpr int nDetectors
number of defined detectors
GLboolean GLboolean GLboolean GLboolean a
GLdouble GLdouble GLdouble z
void printMassError(int pdg)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...