Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DParticleComboStep.h
Go to the documentation of this file.
1 #ifndef _DParticleComboStep_
2 #define _DParticleComboStep_
3 
4 #include <vector>
5 #include <iostream>
6 #include <memory>
7 
8 #include "particleType.h"
9 #include "DResettable.h"
10 #include "DLorentzVector.h"
12 #include "PID/DKinematicData.h"
15 #include "PID/DChargedTrack.h"
16 #include "ANALYSIS/DReactionStep.h"
17 
18 using namespace std;
19 using namespace jana;
20 
21 namespace DAnalysis
22 {
23 
25 {
26  public:
27  // RESET:
28  void Reset(void);
29  void Release(void){Reset();};
30 
31  //SET CONTENTS:
32  void Set_Contents(const DKinematicData* locInitialParticle, const vector<const DKinematicData*>& locFinalParticles, const DLorentzVector& locSpacetimeVertex);
33 
34  // SET INITIAL PARTICLE:
35  void Set_InitialParticle(const DKinematicData* locInitialParticle){dInitialParticle = locInitialParticle;}
36  void Set_InitialKinFitParticle(std::shared_ptr<const DKinFitParticle> locInitialKinFitParticle){dInitialKinFitParticle = locInitialKinFitParticle;}
37 
38  // SET FINAL PARTICLES:
39  void Add_FinalParticle(const DKinematicData* locFinalParticle){dFinalParticles.push_back(locFinalParticle);}
40  void Set_FinalParticle(const DKinematicData* locFinalParticle, size_t locFinalParticleIndex){dFinalParticles[locFinalParticleIndex] = locFinalParticle;}
41 
42  // SET MEASURED STEP:
43  void Set_MeasuredParticleComboStep(const DParticleComboStep* locMeasuredParticleComboStep){dMeasuredStep = locMeasuredParticleComboStep;}
44 
45  // SET PRODUCTION/DECAY SPACETIME VERTEX
46  void Set_SpacetimeVertex(const DLorentzVector& locSpacetimeVertex){dSpacetimeVertex = locSpacetimeVertex;}
47 
48  // GET INITIAL PARTICLES:
49  const DKinematicData* Get_InitialParticle(void) const{return dInitialParticle;}
50  const DKinematicData* Get_InitialParticle_Measured(void) const;
51  std::shared_ptr<const DKinFitParticle> Get_InitialKinFitParticle(void) const{return dInitialKinFitParticle;}
52 
53  // GET FINAL PARTICLES:
54  size_t Get_NumFinalParticles(void) const{return dFinalParticles.size();}
55 
56  const DKinematicData* Get_FinalParticle(size_t locFinalParticleIndex) const;
57  const DKinematicData* Get_FinalParticle_Measured(size_t locFinalParticleIndex) const;
58  vector<const DKinematicData*> Get_FinalParticles(void) const{return dFinalParticles;}
59  vector<const DKinematicData*> Get_FinalParticles_Measured(void) const{return ((dMeasuredStep == nullptr) ? dFinalParticles : dMeasuredStep->Get_FinalParticles());} //INCLUDES MISSING/DECAYING!!
60 
61  vector<const DKinematicData*> Get_FinalParticles(const DReactionStep* locReactionStep, bool locIncludeMissingFlag, bool locIncludeDecayingFlag = true, Charge_t locCharge = d_AllCharges) const;
62  vector<const DKinematicData*> Get_FinalParticles_Measured(const DReactionStep* locReactionStep, Charge_t locCharge = d_AllCharges) const; //excludes missing/decaying!
63 
64  const JObject* Get_FinalParticle_SourceObject(size_t locFinalParticleIndex) const; //if missing or decaying: source object is nullptr!
65  vector<const JObject*> Get_FinalParticle_SourceObjects(Charge_t locCharge = d_AllCharges) const;
66  const DKinematicData* Get_MissingParticle(const DReactionStep* locReactionStep) const; //returns nullptr if none missing!
67 
68  // GET PRODUCTION/DECAY SPACETIME VERTEX
69  DVector3 Get_Position(void) const{return dSpacetimeVertex.Vect();}
70  double Get_Time(void) const{return dSpacetimeVertex.T();}
71  DLorentzVector Get_SpacetimeVertex(void) const{return dSpacetimeVertex;}
72 
73  private:
74  const DParticleComboStep* dMeasuredStep = nullptr;
75 
76  // INITIAL PARTICLES:
77  const DKinematicData* dInitialParticle = nullptr; //if is nullptr: decaying or beam particle not yet set!
78  std::shared_ptr<const DKinFitParticle> dInitialKinFitParticle = nullptr; //not ideal. however, for decaying particles this can be EXTREMELY difficult to extract from the kinfitresults (e.g. if multiple pi0s)
79 
80  // FINAL PARTICLES:
81  vector<const DKinematicData*> dFinalParticles; //if particle is nullptr: missing or decaying! //these are DChargedTrackHypothesis or DNeutralParticleHypothesis objects if detected
82 
83  // PRODUCTION/DECAY SPACETIME VERTEX:
85 };
86 
87 inline void Print(const DParticleComboStep* locStep)
88 {
89  auto locInit = locStep->Get_InitialParticle();
90  if(locInit != nullptr)
91  {
92  auto locP3 = locInit->momentum();
93  cout << "init: pid, p, theta, phi = " << locInit->PID() << ", " << locP3.Mag() << ", " << locP3.Theta()*180.0/TMath::Pi() << ", " << locP3.Phi()*180.0/TMath::Pi() << "\n";
94  }
95  for(auto locParticle : locStep->Get_FinalParticles())
96  {
97  if(locParticle == nullptr)
98  continue;
99  auto locP3 = locParticle->momentum();
100  cout << "init: pid, p, theta, phi = " << locParticle->PID() << ", " << locP3.Mag() << ", " << locP3.Theta()*180.0/TMath::Pi() << ", " << locP3.Phi()*180.0/TMath::Pi() << "\n";
101  }
102 }
103 
104 const JObject* Get_FinalParticle_SourceObject(const DKinematicData* locParticle);
105 
106 inline const DKinematicData* DParticleComboStep::Get_InitialParticle_Measured(void) const
107 {
108  return ((dMeasuredStep != nullptr) ? dMeasuredStep->Get_InitialParticle() : dInitialParticle);
109 }
110 
111 inline void DParticleComboStep::Reset(void)
112 {
113  dMeasuredStep = nullptr;
114  dInitialParticle = nullptr;
115  dInitialKinFitParticle = nullptr;
116  dFinalParticles.clear();
117  dSpacetimeVertex.SetXYZT(0.0, 0.0, 0.0, 0.0);
118 }
119 
120 inline void DParticleComboStep::Set_Contents(const DKinematicData* locInitialParticle, const vector<const DKinematicData*>& locFinalParticles, const DLorentzVector& locSpacetimeVertex)
121 {
122  dInitialParticle = locInitialParticle;
123  dFinalParticles = locFinalParticles;
124  dSpacetimeVertex = locSpacetimeVertex;
125 }
126 
127 inline const JObject* DParticleComboStep::Get_FinalParticle_SourceObject(size_t locFinalParticleIndex) const
128 {
129  return DAnalysis::Get_FinalParticle_SourceObject(dFinalParticles[locFinalParticleIndex]);
130 }
131 
132 inline const DKinematicData* DParticleComboStep::Get_FinalParticle(size_t locFinalParticleIndex) const
133 {
134  if(locFinalParticleIndex >= dFinalParticles.size())
135  return nullptr;
136  return dFinalParticles[locFinalParticleIndex];
137 }
138 
139 inline const DKinematicData* DParticleComboStep::Get_FinalParticle_Measured(size_t locFinalParticleIndex) const
140 {
141  if(dMeasuredStep != nullptr)
142  return dMeasuredStep->Get_FinalParticle_Measured(locFinalParticleIndex);
143  if(locFinalParticleIndex >= dFinalParticles.size())
144  return nullptr;
145  return dFinalParticles[locFinalParticleIndex];
146 }
147 
148 inline const DKinematicData* DParticleComboStep::Get_MissingParticle(const DReactionStep* locReactionStep) const
149 {
150  int locMissingParticleIndex = locReactionStep->Get_MissingParticleIndex();
151  if(locMissingParticleIndex == DReactionStep::Get_ParticleIndex_None())
152  return nullptr;
153  return dFinalParticles[locMissingParticleIndex];
154 }
155 
156 inline vector<const DKinematicData*> DParticleComboStep::Get_FinalParticles(const DReactionStep* locReactionStep, bool locIncludeMissingFlag, bool locIncludeDecayingFlag, Charge_t locCharge) const
157 {
158  vector<const DKinematicData*> locFinalParticles;
159  auto locMissingParticleIndex = locReactionStep->Get_MissingParticleIndex();
160  for(int locPIDIndex = 0; locPIDIndex < int(locReactionStep->Get_NumFinalPIDs()); ++locPIDIndex)
161  {
162  if(!locIncludeMissingFlag && (locPIDIndex == locMissingParticleIndex))
163  continue;
164  if(!locIncludeDecayingFlag && (locPIDIndex != locMissingParticleIndex) && (Get_FinalParticle_SourceObject(locPIDIndex) == nullptr))
165  continue;
166  Particle_t locPID = locReactionStep->Get_FinalPID(locPIDIndex);
167  if(Is_CorrectCharge(locPID, locCharge))
168  locFinalParticles.push_back(dFinalParticles[locPIDIndex]);
169  }
170  return locFinalParticles;
171 }
172 
173 inline vector<const DKinematicData*> DParticleComboStep::Get_FinalParticles_Measured(const DReactionStep* locReactionStep, Charge_t locCharge) const
174 {
175  auto locStepPointer = (dMeasuredStep != nullptr) ? dMeasuredStep : this;
176  return locStepPointer->Get_FinalParticles(locReactionStep, false, false, locCharge);
177 }
178 
179 inline vector<const JObject*> DParticleComboStep::Get_FinalParticle_SourceObjects(Charge_t locCharge) const
180 {
181  vector<const JObject*> locSourceObjects;
182  for(size_t loc_i = 0; loc_i < Get_NumFinalParticles(); ++loc_i)
183  {
184  auto locSourceObject = Get_FinalParticle_SourceObject(loc_i);
185  if(locSourceObject == nullptr)
186  continue;
187  if(Is_CorrectCharge(dFinalParticles[loc_i]->PID(), locCharge))
188  locSourceObjects.push_back(locSourceObject);
189  }
190  return locSourceObjects;
191 }
192 
193 inline vector<const DKinematicData*> Get_ParticlesWithPID(Particle_t locPID, const vector<const DKinematicData*>& locInputParticles)
194 {
195  vector<const DKinematicData*> locOutputParticles;
196  for(auto locParticle : locInputParticles)
197  {
198  if(locParticle == nullptr)
199  continue;
200  if(locParticle->PID() == locPID)
201  locOutputParticles.push_back(locParticle);
202  }
203  return locOutputParticles;
204 }
205 
206 inline const JObject* Get_FinalParticle_SourceObject(const DKinematicData* locParticle)
207 {
208  if(locParticle == nullptr)
209  return nullptr;
210 
211  auto locChargedHypo = dynamic_cast<const DChargedTrackHypothesis*>(locParticle);
212  if(locChargedHypo != nullptr)
213  {
214  const DChargedTrack* locChargedTrack = nullptr;
215  locChargedHypo->GetSingle(locChargedTrack);
216  return static_cast<const JObject*>(locChargedTrack);
217  }
218 
219  auto locNeutralHypo = dynamic_cast<const DNeutralParticleHypothesis*>(locParticle);
220  return ((locNeutralHypo != nullptr) ? static_cast<const JObject*>(locNeutralHypo->Get_NeutralShower()) : nullptr);
221 }
222 
223 } // end namespace
224 
225 #endif // _DParticleComboStep_
226 
vector< const DKinematicData * > Get_FinalParticles_Measured(void) const
void Set_InitialKinFitParticle(std::shared_ptr< const DKinFitParticle > locInitialKinFitParticle)
TVector3 DVector3
Definition: DVector3.h:14
locHist_ADCmulti Print()
void Set_MeasuredParticleComboStep(const DParticleComboStep *locMeasuredParticleComboStep)
const JObject * Get_FinalParticle_SourceObject(const DKinematicData *locParticle)
void Add_FinalParticle(const DKinematicData *locFinalParticle)
TLorentzVector DLorentzVector
Charge_t
void Set_FinalParticle(const DKinematicData *locFinalParticle, size_t locFinalParticleIndex)
void Set_InitialParticle(const DKinematicData *locInitialParticle)
vector< const DKinematicData * > Get_FinalParticles(void) const
Particle_t Get_FinalPID(size_t locIndex) const
Definition: DReactionStep.h:87
size_t Get_NumFinalParticles(void) const
DLorentzVector Get_SpacetimeVertex(void) const
int Get_MissingParticleIndex(void) const
Definition: DReactionStep.h:93
static int Is_CorrectCharge(Particle_t locPID, Charge_t locCharge)
vector< const DKinematicData * > Get_ParticlesWithPID(Particle_t locPID, const vector< const DKinematicData * > &locInputParticles)
const DKinematicData * Get_InitialParticle(void) const
size_t Get_NumFinalPIDs(void) const
Definition: DReactionStep.h:89
const DVector3 & momentum(void) const
vector< const DKinematicData * > dFinalParticles
DVector3 Get_Position(void) const
void Set_SpacetimeVertex(const DLorentzVector &locSpacetimeVertex)
std::shared_ptr< const DKinFitParticle > Get_InitialKinFitParticle(void) const
Particle_t
Definition: particleType.h:12