Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DAnalysisUtilities.h
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DAnalysisUtilities.h
4 // Created: Tue Apr 6 17:01:54 EDT 2010
5 // Creator: pmatt (on Darwin Amelia.local 9.8.0 i386)
6 //
7 
8 #ifndef _DAnalysisUtilities_
9 #define _DAnalysisUtilities_
10 
11 #include <deque>
12 #include <set>
13 
14 #include <JANA/JEventLoop.h>
15 #include <JANA/JObject.h>
16 
17 #include "DANA/DApplication.h"
18 #include "HDGEOMETRY/DGeometry.h"
21 
22 #include "DLorentzVector.h"
23 
24 #include "TRACKING/DMCThrown.h"
28 
29 #include "PID/DChargedTrack.h"
30 #include "PID/DNeutralShower.h"
33 #include "PID/DParticleID.h"
34 #include "PID/DKinematicData.h"
35 #include "PID/DBeamPhoton.h"
36 #include "PID/DParticleID.h"
37 #include "PID/DEventRFBunch.h"
38 
40 
44 
45 using namespace std;
46 using namespace jana;
47 using namespace DAnalysis;
48 
50 namespace DAnalysis
51 {
53 }
54 
55 class DAnalysisUtilities : public JObject
56 {
57  public:
58  JOBJECT_PUBLIC(DAnalysisUtilities);
59 
60  // Constructor and destructor
61  DAnalysisUtilities(JEventLoop *loop);
62 
63  bool Check_IsBDTSignalEvent(JEventLoop* locEventLoop, const DReaction* locReaction, bool locExclusiveMatchFlag, bool locIncludeDecayingToReactionFlag) const;
64  void Replace_DecayingParticleWithProducts(deque<pair<const DMCThrown*, deque<const DMCThrown*> > >& locThrownSteps, size_t locStepIndex) const;
65  bool Check_ThrownsMatchReaction(JEventLoop* locEventLoop, const DReaction* locReaction, bool locExclusiveMatchFlag) const;
66  bool Check_ThrownsMatchReaction(const DReaction* locThrownReaction, const DParticleCombo* locThrownCombo, const DReaction* locReaction, bool locExclusiveMatchFlag) const;
67 
68  void Get_UnusedChargedTracks(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, vector<const DChargedTrack*>& locUnusedChargedTracks) const;
69  void Get_UnusedTimeBasedTracks(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, vector<const DTrackTimeBased*>& locUnusedTimeBasedTracks) const;
70  void Get_UnusedWireBasedTracks(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, vector<const DTrackWireBased*>& locUnusedWireBasedTracks) const;
71  void Get_UnusedTrackCandidates(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, vector<const DTrackCandidate*>& locUnusedTrackCandidates) const;
72 
73  void Get_UnusedNeutralShowers(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, vector<const DNeutralShower*>& locUnusedNeutralShowers) const;
74  void Get_UnusedNeutralParticles(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, vector<const DNeutralParticle*>& locUnusedNeutralParticles) const;
75 
76  void Get_ThrownParticleSteps(JEventLoop* locEventLoop, deque<pair<const DMCThrown*, deque<const DMCThrown*> > >& locThrownSteps) const;
77  bool Are_ThrownPIDsSameAsDesired(JEventLoop* locEventLoop, const deque<Particle_t>& locDesiredPIDs, Particle_t locMissingPID = Unknown) const;
78 
79  double Calc_DOCAVertex(const DVector3 &locUnitDir1, const DVector3 &locUnitDir2, const DVector3 &locVertex1, const DVector3 &locVertex2, DVector3& locDOCAPoint) const;
80  double Calc_DOCA(const DVector3 &locUnitDir1, const DVector3 &locUnitDir2, const DVector3 &locVertex1, const DVector3 &locVertex2) const;
81  double Calc_DOCA(const DVector3 &locUnitDir1, const DVector3 &locUnitDir2, const DVector3 &locVertex1, const DVector3 &locVertex2, DVector3 &locInterDOCA1, DVector3 &locInterDOCA2) const;
82  double Calc_DOCAToVertex(const DVector3& locUnitDir, const DVector3& locPosition, const DVector3& locVertex) const;
83  double Calc_DOCAToVertex(const DVector3& locUnitDir, const DVector3& locPosition, const DVector3& locVertex, DVector3& locPOCA) const;
84 
85  double Calc_DOCAVertex(const DKinFitParticle* locKinFitParticle1, const DKinFitParticle* locKinFitParticle2, DVector3& locDOCAVertex) const;
86  double Calc_DOCA(const DKinFitParticle* locKinFitParticle1, const DKinFitParticle* locKinFitParticle2) const;
87  double Calc_DOCA(const DKinFitParticle* locKinFitParticle1, const DKinFitParticle* locKinFitParticle2, DVector3 &locInterDOCA1, DVector3 &locInterDOCA2) const;
88 
89  double Calc_DOCAToVertex(const DKinFitParticle* locKinFitParticle, const DVector3& locVertex) const;
90  double Calc_DOCAToVertex(const DKinFitParticle* locKinFitParticle, const DVector3& locVertex, DVector3& locPOCA) const;
91 
92  double Calc_DOCAVertex(const DKinematicData* locKinematicData1, const DKinematicData* locKinematicData2, DVector3& locDOCAVertex) const;
93  double Calc_DOCA(const DKinematicData* locKinematicData1, const DKinematicData* locKinematicData2) const;
94  double Calc_DOCA(const DKinematicData* locKinematicData1, const DKinematicData* locKinematicData2, DVector3 &locInterDOCA1, DVector3 &locInterDOCA2) const;
95  double Calc_DOCAToVertex(const DKinematicData* locKinematicData, const DVector3& locVertex) const;
96  double Calc_DOCAToVertex(const DKinematicData* locKinematicData, const DVector3& locVertex, DVector3& locPOCA) const;
97 
98  jerror_t Calc_DOCA(const DKinFitParticle* locKinFitParticle1,
99  const DKinFitParticle* locKinFitParticle2,
100  DVector3 &pos1_out,DVector3 &pos2_out,
101  double &doca) const;
102  jerror_t Calc_DOCA(const DKinematicData* locKinematicData1,
103  const DKinematicData* locKinematicData2,
104  DVector3 &pos1_out,DVector3 &pos2_out,
105  double &doca) const;
106  jerror_t Calc_DOCA(double q1,double q2,
107  const DVector3 &pos1_in,
108  const DVector3 &pos2_in,
109  const DVector3 &mom1_in,
110  const DVector3 &mom2_in,
111  DVector3 &pos1_out,DVector3 &pos2_out,
112  double &doca) const;
113 
114  DLorentzVector Calc_MissingP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, bool locUseKinFitDataFlag) const;
115  DLorentzVector Calc_MissingP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, set<pair<const JObject*, unsigned int> >& locSourceObjects, bool locUseKinFitDataFlag) const;
116  DLorentzVector Calc_MissingP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, size_t locStepIndex, int locUpToStepIndex, set<size_t> locUpThroughIndices, bool locUseKinFitDataFlag) const;
117  DLorentzVector Calc_MissingP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, size_t locStepIndex, int locUpToStepIndex, set<size_t> locUpThroughIndices, set<pair<const JObject*, unsigned int> >& locSourceObjects, bool locUseKinFitDataFlag) const;
118  DLorentzVector Calc_FinalStateP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, size_t locStepIndex, bool locUseKinFitDataFlag) const;
119  DLorentzVector Calc_FinalStateP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, size_t locStepIndex, set<pair<const JObject*, unsigned int> >& locSourceObjects, bool locUseKinFitDataFlag) const;
120  DLorentzVector Calc_FinalStateP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, size_t locStepIndex, set<size_t> locToIncludeIndices, bool locUseKinFitDataFlag) const;
121  DLorentzVector Calc_FinalStateP4(const DReaction* locReaction, const DParticleCombo* locParticleCombo, size_t locStepIndex, set<size_t> locToIncludeIndices, set<pair<const JObject*, unsigned int> >& locSourceObjects, bool locUseKinFitDataFlag) const;
122 
123  double Calc_Energy_UnusedShowers(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo) const;
124  int Calc_Momentum_UnusedTracks(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, double &locSumPMag_UnusedTracks, TVector3 &locSumP3_UnusedTracks) const;
125 
126  // These routines use the MEAURED particle data. For the kinfit-data result, just use the error matrix from the missing particle
127  TMatrixFSym Calc_MissingP3Covariance(const DReaction* locReaction, const DParticleCombo* locParticleCombo) const;
128  TMatrixFSym Calc_MissingP3Covariance(const DReaction* locReaction, const DParticleCombo* locParticleCombo, size_t locStepIndex, int locUpToStepIndex, set<size_t> locUpThroughIndices) const;
129 
130  double Calc_CrudeTime(const vector<const DKinematicData*>& locParticles, const DVector3& locCommonVertex) const;
131  double Calc_CrudeTime(const vector<DKinFitParticle*>& locParticles, const DVector3& locCommonVertex) const;
132  DVector3 Calc_CrudeVertex(const vector<const DKinematicData*>& locParticles) const;
133  DVector3 Calc_CrudeVertex(const vector<shared_ptr<DKinFitParticle>>& locParticles) const;
134  DVector3 Calc_CrudeVertex(const vector<const DChargedTrackHypothesis*>& locParticles) const;
135  DVector3 Calc_CrudeVertex(const vector<const DTrackTimeBased*>& locParticles) const;
136 
137  set<set<size_t> > Build_IndexCombos(const DReactionStep* locReactionStep, deque<Particle_t> locToIncludePIDs) const;
138 
139  //For handling helical tracks
140  bool Get_IsBFieldNearBeamline(void) const;
141  DVector3 Get_BField(const DVector3& locPosition) const;
142  double Propagate_Track(int locCharge, const DVector3& locPropagateToPoint, DLorentzVector& locMeasuredX4, DLorentzVector& locMeasuredP4, TMatrixFSym* locCovarianceMatrix) const; //returns path length change
143  double Calc_PathLength_Step(int locCharge, const DVector3& locPropagateToPoint, DLorentzVector& locMeasuredX4, DLorentzVector& locMeasuredP4) const;
144  double Calc_PathLength_FineGrained(int locCharge, const DVector3& locPropagateToPoint, DVector3 locMeasuredPosition, DVector3 locMeasuredMomentum) const;
145  void Propagate_Track(double locDeltaPathLength, int locCharge, DLorentzVector& locX4, DLorentzVector& locP4, TMatrixFSym* locCovarianceMatrix) const;
146 
147  private:
148 
149  bool Handle_Decursion(int& locParticleIndex, deque<size_t>& locComboDeque, deque<int>& locResumeAtIndices, deque<deque<size_t> >& locPossibilities) const;
150 
154  double dMinDistanceForStraightTrack = 2.0;
155 
156  const DParticleID* dPIDAlgorithm = nullptr;
157  const DMagneticFieldMap* dMagneticFieldMap = nullptr;
158  mutable DParticleComboCreator* dParticleComboCreator = nullptr;
159 
161 
163 };
164 
165 
167 {
168  if(dMagneticFieldMap == NULL)
169  return false;
170 
171  return (dynamic_cast<const DMagneticFieldMapNoField*>(dMagneticFieldMap) == NULL);
172 }
173 
174 inline DVector3 DAnalysisUtilities::Get_BField(const DVector3& locPosition) const
175 {
176  if(!Get_IsBFieldNearBeamline())
177  return DVector3(0.0, 0.0, 0.0);
178 
179  double locBx, locBy, locBz;
180  dMagneticFieldMap->GetField(locPosition.X(), locPosition.Y(), locPosition.Z(), locBx, locBy, locBz);
181  return (DVector3(locBx, locBy, locBz));
182 }
183 
184 #endif // _DAnalysisUtilities_
TVector3 DVector3
Definition: DVector3.h:14
bool Get_IsBFieldNearBeamline(void) const
TLorentzVector DLorentzVector
DVector3 Get_BField(const DVector3 &locPosition) const
Particle_t
Definition: particleType.h:12