Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DKinematicData.h
Go to the documentation of this file.
1 #ifndef _DKINEMATICDATA_
2 #define _DKINEMATICDATA_
3 
4 #include <memory>
5 
6 #include <JANA/JObject.h>
7 
8 #include "GlueX.h"
9 
10 #include "DVector3.h"
11 #include "DLorentzVector.h"
12 #include "particleType.h"
13 #include "TMatrixFSym.h"
14 #include "DResettable.h"
15 #include "DResourcePool.h"
16 
17 #ifndef SPEED_OF_LIGHT
18 #define SPEED_OF_LIGHT 29.9792458
19 #endif
20 
21 using namespace std;
22 using namespace jana;
23 
24 class DKinematicData : public JObject, public DResettable
25 {
26  public:
27 
28  // constructors and destructor
29  DKinematicData(void);
30  DKinematicData(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition = DVector3(), double locTime = 0.0, const shared_ptr<const TMatrixFSym>& locErrorMatrix = nullptr);
31  DKinematicData(const DKinematicData& locSourceData, bool locShareKinematicsFlag = false);
32  virtual ~DKinematicData(void) {};
33 
34  //Assignment operator
35  DKinematicData& operator=(const DKinematicData& locSourceData);
36  void Share_FromInput_Kinematics(const DKinematicData* locSourceData);
37 
38  //Reset & Release
39  virtual void Reset(void);
40  virtual void Release(void);
41 
42  //GETTERS
43  Particle_t PID(void) const{return dKinematicInfo->dPID;}
44  double mass(void) const{return ParticleMass(dKinematicInfo->dPID);}
45  double charge(void) const{return ParticleCharge(dKinematicInfo->dPID);}
46  const DVector3& momentum(void) const{return dKinematicInfo->dMomentum;}
47  const DVector3& position(void) const{return dKinematicInfo->dPosition;}
48  double time(void) const{return dKinematicInfo->dTime;}
49  shared_ptr<const TMatrixFSym> errorMatrix(void) const{return dErrorMatrix;}
50 
51  //components
52  double px(void) const{return dKinematicInfo->dMomentum.Px();}
53  double py(void) const{return dKinematicInfo->dMomentum.Py();}
54  double pz(void) const{return dKinematicInfo->dMomentum.Pz();}
55  double x(void) const{return dKinematicInfo->dPosition.X();}
56  double y(void) const{return dKinematicInfo->dPosition.Y();}
57  double z(void) const{return dKinematicInfo->dPosition.Z();}
58 
59  //derived quantities
60  double energy(void) const{return sqrt(mass()*mass() + pmag2());}
61  double pperp(void) const{return sqrt(px()*px() + py()*py());}
62  double pperp2(void) const{return px()*px() + py()*py();}
63  double pmag(void) const{return dKinematicInfo->dMomentum.Mag();}
64  double pmag2(void) const{return dKinematicInfo->dMomentum.Mag2();}
65  DLorentzVector lorentzMomentum(void) const{return DLorentzVector(momentum(), energy());}
66  DLorentzVector x4(void) const{return DLorentzVector(position(), time());}
67 
68  //SETTERS
69  void Set_Members(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition = DVector3(), double locTime = 0.0, const shared_ptr<const TMatrixFSym>& locErrorMatrix = nullptr);
70  void setPID(Particle_t locPID){dKinematicInfo->dPID = locPID;}
71  void setMomentum(const DVector3& aMomentum){dKinematicInfo->dMomentum = aMomentum;}
72  void setPosition(const DVector3& aPosition){dKinematicInfo->dPosition = aPosition;}
73  void setTime(double locTime){dKinematicInfo->dTime = locTime;}
74  void setErrorMatrix(const shared_ptr<const TMatrixFSym>& aMatrix){dErrorMatrix = aMatrix;}
75  void setErrorMatrix(const shared_ptr<TMatrixFSym>& aMatrix){dErrorMatrix = std::const_pointer_cast<const TMatrixFSym>(aMatrix);}
76 
77  void toStrings(vector<pair<string,string> > &items) const
78  {
79  AddString(items, "PID", "%i", (int)PID());
80  AddString(items, "Name", "%s", ParticleType(PID()));
81  AddString(items, "q", "%+1.0f", charge());
82  AddString(items, "x(cm)", "%3.1f", x());
83  AddString(items, "y(cm)", "%3.1f", y());
84  AddString(items, "z(cm)", "%3.1f", z());
85  AddString(items, "E(GeV)", "%2.4f", energy());
86  AddString(items, "t(ns)", "%2.3f", time());
87  AddString(items, "p(GeV/c)", "%2.3f", momentum().Mag());
88  AddString(items, "theta(deg)", "%2.3f", momentum().Theta()*180.0/M_PI);
89  AddString(items, "phi(deg)", "%2.3f", momentum().Phi()*180.0/M_PI);
90  }
91 
92  class DKinematicInfo : public DResettable
93  {
94  public:
95  //CONSTRUCTORS
96  DKinematicInfo(void) = default;
97  DKinematicInfo(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition = DVector3(), double locTime = 0.0);
98 
99  void Set_Members(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition = DVector3(), double locTime = 0.0);
100  void Reset(void);
101  void Release(void){};
102 
103  //MEMBERS
107  double dTime = 0.0; // Time of the track propagated at dPosition
108  };
109 
110  private:
111 
112  //memory of object in shared_ptr is managed automatically: deleted automatically when no references are left
113  //This is done because sometimes a new object is needed (e.g. DChargedTrackHypothesis) for which this info hasn't changed (from DTrackTimeBased)
114  //Thus, just share this between the two objects, instead of doubling the memory usage
115  //By inheriting this class, you also get to share the same interface
116  shared_ptr<DKinematicInfo> dKinematicInfo = nullptr;
117 
118  //This member must be separate from DKinematicInfo or else it may be recycled on a different thread from which it was created, causing a race condition!
119  shared_ptr<const TMatrixFSym> dErrorMatrix = nullptr; // Order is (px, py, pz, x, y, z, t)
120 
121  static thread_local shared_ptr<DResourcePool<DKinematicInfo>> dResourcePool_KinematicInfo;
122 };
123 
124 /************************************************************** CONSTRUCTORS & OPERATORS ***************************************************************/
125 
126 inline DKinematicData::DKinematicData(void) : dKinematicInfo(dResourcePool_KinematicInfo->Get_SharedResource()), dErrorMatrix(nullptr){}
127 
128 inline DKinematicData::DKinematicData(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition, double locTime, const shared_ptr<const TMatrixFSym>& locErrorMatrix) :
129  dKinematicInfo(dResourcePool_KinematicInfo->Get_SharedResource()), dErrorMatrix(locErrorMatrix)
130 {
131  dKinematicInfo->Set_Members(locPID, locMomentum, locPosition, locTime);
132 }
133 
135 {
136  dKinematicInfo = const_cast<DKinematicData*>(locSourceData)->dKinematicInfo;
137  dErrorMatrix = locSourceData->dErrorMatrix;
138 }
139 
140 inline DKinematicData::DKinematicData(const DKinematicData& locSourceData, bool locShareKinematicsFlag)
141 {
142  //Default is NOT to share: create a new, independent copy of the input data (tracked separately from input so it can be modified)
143  if(locShareKinematicsFlag)
144  dKinematicInfo = locSourceData.dKinematicInfo;
145  else
146  {
147  dKinematicInfo = dResourcePool_KinematicInfo->Get_SharedResource();
148  *dKinematicInfo = *(locSourceData.dKinematicInfo);
149  }
150  dErrorMatrix = locSourceData.dErrorMatrix; //it's const so it can't be modified: share and then replace if desired
151 }
152 
154 {
155  //Guard against self-assignment
156  if(dKinematicInfo == locSourceData.dKinematicInfo)
157  return *this;
158 
159  //Replace current data with a new, independent copy of the input data: tracked separately from input so it can be modified
160  dKinematicInfo = dResourcePool_KinematicInfo->Get_SharedResource();
161  *dKinematicInfo = *(locSourceData.dKinematicInfo);
162 
163  dErrorMatrix = locSourceData.dErrorMatrix; //it's const so it can't be modified: share and then replace if desired
164  return *this;
165 }
166 
167 inline DKinematicData::DKinematicInfo::DKinematicInfo(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition, double locTime) :
168 dPID(locPID), dMomentum(locMomentum), dPosition(locPosition), dTime(locTime) {}
169 
170 /*********************************************************************** RESET & RELEASE *************************************************************************/
171 
172 inline void DKinematicData::Set_Members(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition, double locTime, const shared_ptr<const TMatrixFSym>& locErrorMatrix)
173 {
174  dKinematicInfo->Set_Members(locPID, locMomentum, locPosition, locTime);
175  dErrorMatrix = locErrorMatrix;
176 }
177 
178 inline void DKinematicData::DKinematicInfo::Set_Members(Particle_t locPID, const DVector3& locMomentum, DVector3 locPosition, double locTime)
179 {
180  dPID = locPID;
181  dMomentum = locMomentum;
182  dPosition = locPosition;
183  dTime = locTime;
184 }
185 
186 inline void DKinematicData::Reset(void)
187 {
188  dKinematicInfo = dResourcePool_KinematicInfo->Get_SharedResource(); //not safe to reset individually, since you don't know what it's shared with
189  dErrorMatrix = nullptr;
190  ClearAssociatedObjects();
191 }
192 
193 inline void DKinematicData::Release(void)
194 {
195  dKinematicInfo = nullptr;
196  dErrorMatrix = nullptr;
197  ClearAssociatedObjects();
198 }
199 
201 {
202  dPID = Unknown;
203  dMomentum = DVector3();
204  dPosition = DVector3();
205  dTime = 0.0;
206 }
207 
208 #endif /* _DKINEMATICDATA_ */
double pmag2(void) const
void setMomentum(const DVector3 &aMomentum)
void setTime(double locTime)
shared_ptr< const TMatrixFSym > dErrorMatrix
double px(void) const
virtual void Release(void)
double pmag(void) const
double py(void) const
double z(void) const
TVector3 DVector3
Definition: DVector3.h:14
double energy(void) const
Double_t x[NCHANNELS]
Definition: st_tw_resols.C:39
double pz(void) const
virtual ~DKinematicData(void)
#define y
const DVector3 & position(void) const
void Set_Members(Particle_t locPID, const DVector3 &locMomentum, DVector3 locPosition=DVector3(), double locTime=0.0, const shared_ptr< const TMatrixFSym > &locErrorMatrix=nullptr)
DKinematicData & operator=(const DKinematicData &locSourceData)
static char * ParticleType(Particle_t p)
Definition: particleType.h:142
DLorentzVector x4(void) const
double x(void) const
TLorentzVector DLorentzVector
static int ParticleCharge(Particle_t p)
double y(void) const
double time(void) const
void setErrorMatrix(const shared_ptr< const TMatrixFSym > &aMatrix)
void Share_FromInput_Kinematics(const DKinematicData *locSourceData)
double charge(void) const
TH1D * py[NCHANNELS]
void setPID(Particle_t locPID)
DLorentzVector lorentzMomentum(void) const
static double ParticleMass(Particle_t p)
double sqrt(double)
virtual void Reset(void)
const DVector3 & momentum(void) const
void toStrings(vector< pair< string, string > > &items) const
shared_ptr< const TMatrixFSym > errorMatrix(void) const
void setErrorMatrix(const shared_ptr< TMatrixFSym > &aMatrix)
static thread_local shared_ptr< DResourcePool< DKinematicInfo > > dResourcePool_KinematicInfo
shared_ptr< DKinematicInfo > dKinematicInfo
void setPosition(const DVector3 &aPosition)
void Set_Members(Particle_t locPID, const DVector3 &locMomentum, DVector3 locPosition=DVector3(), double locTime=0.0)
double pperp(void) const
double pperp2(void) const
Particle_t PID(void) const
double mass(void) const
Particle_t
Definition: particleType.h:12