Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DKinFitUtils.h
Go to the documentation of this file.
1 #ifndef _DKinFitUtils_
2 #define _DKinFitUtils_
3 
4 #include <deque>
5 #include <set>
6 #include <map>
7 #include <algorithm>
8 
9 #include "TVector3.h"
10 #include "TLorentzVector.h"
11 #include "TMatrixFSym.h"
12 
13 #include "DResourcePool.h"
14 
15 #include "DKinFitter.h"
16 #include "DKinFitChain.h"
17 #include "DKinFitParticle.h"
18 #include "DKinFitConstraint.h"
19 #include "DKinFitConstraint_Mass.h"
20 #include "DKinFitConstraint_P4.h"
23 
24 using namespace std;
25 
26 class DKinFitUtils //contains pure-virtual functions: cannot directly instantiate class, can only inherit from it
27 {
28  friend class DKinFitter;
29 
30  public:
31 
32  /***************************************************************** INITIALIZE ***************************************************************/
33 
34  //STRUCTORS
35  DKinFitUtils(void);
36  virtual ~DKinFitUtils(void){};
37 
38  //RESET: IF YOU OVERRIDE THESE IN THE DERIVED CLASS, BE SURE TO CALL THE BASE CLASS FUNCTIONS!
39  virtual void Reset_NewEvent(void);
40  virtual void Reset_NewFit(void){};
41 
42  /************************************************************ CONTROL AND MAPPING ***********************************************************/
43 
44  //GET CONTROL
45  bool Get_LinkVerticesFlag(void) const{return dLinkVerticesFlag;}
46  bool Get_DebugLevel(void) const{return dDebugLevel;}
47  bool Get_UpdateCovarianceMatricesFlag(void) const{return dUpdateCovarianceMatricesFlag;}
48 
49  //SET CONTROL
50  void Set_LinkVerticesFlag(bool locLinkVerticesFlag){dLinkVerticesFlag = locLinkVerticesFlag;}
51  void Set_DebugLevel(int locDebugLevel){dDebugLevel = locDebugLevel;}
52  void Set_UpdateCovarianceMatricesFlag(bool locUpdateCovarianceMatricesFlag){dUpdateCovarianceMatricesFlag = locUpdateCovarianceMatricesFlag;}
53 
54  //GET INPUT FROM OUTPUT
55  shared_ptr<DKinFitParticle> Get_InputKinFitParticle(const shared_ptr<DKinFitParticle>& locKinFitParticle) const;
56 
57  /************************************************************** CREATE PARTICLES ************************************************************/
58 
59  //If multiple constraints, it is EXTREMELY CRITICAL that only one DKinFitParticle be created per particle, so that the particles are correctly linked across constraints!!
60  shared_ptr<DKinFitParticle> Make_BeamParticle(int locPID, int locCharge, double locMass, TLorentzVector locSpacetimeVertex, TVector3 locMomentum, const shared_ptr<const TMatrixFSym>& locCovarianceMatrix);
61  shared_ptr<DKinFitParticle> Make_TargetParticle(int locPID, int locCharge, double locMass);
62 
63  //locPathLength is from timing detector to vertex (for updating the time)
64  shared_ptr<DKinFitParticle> Make_DetectedParticle(int locPID, int locCharge, double locMass, TLorentzVector locSpacetimeVertex, TVector3 locMomentum, double locPathLength, const shared_ptr<const TMatrixFSym>& locCovarianceMatrix);
65  shared_ptr<DKinFitParticle> Make_DetectedShower(int locPID, double locMass, TLorentzVector locSpacetimeVertex, double locShowerEnergy, const shared_ptr<const TMatrixFSym>& locCovarianceMatrix);
66 
67  shared_ptr<DKinFitParticle> Make_MissingParticle(int locPID, int locCharge, double locMass);
68  shared_ptr<DKinFitParticle> Make_DecayingParticle(int locPID, int locCharge, double locMass, const set<shared_ptr<DKinFitParticle>>& locFromInitialState, const set<shared_ptr<DKinFitParticle>>& locFromFinalState);
69 
70  /************************************************************* CREATE CONSTRAINTS ***********************************************************/
71 
72  shared_ptr<DKinFitConstraint_Mass> Make_MassConstraint(const shared_ptr<DKinFitParticle>& locDecayingParticle);
73  shared_ptr<DKinFitConstraint_P4> Make_P4Constraint(const set<shared_ptr<DKinFitParticle>>& locInitialParticles, const set<shared_ptr<DKinFitParticle>>& locFinalParticles);
74  shared_ptr<DKinFitConstraint_Vertex> Make_VertexConstraint(const set<shared_ptr<DKinFitParticle>>& locFullConstrainParticles, const set<shared_ptr<DKinFitParticle>>& locNoConstrainParticles, TVector3 locVertexGuess = TVector3());
75  shared_ptr<DKinFitConstraint_Spacetime> Make_SpacetimeConstraint(const set<shared_ptr<DKinFitParticle>>& locFullConstrainParticles, const set<shared_ptr<DKinFitParticle>>& locOnlyConstrainTimeParticles,
76  const set<shared_ptr<DKinFitParticle>>& locNoConstrainParticles, TLorentzVector locSpacetimeGuess = TLorentzVector());
77 
78  virtual bool Validate_Constraints(const set<shared_ptr<DKinFitConstraint>>& locKinFitConstraints) const; //empty, can override
79 
80  /*********************************************************** CALCULATION ROUTINES ***********************************************************/
81 
82  //if input flag is true: return the value of the p4 at spot defined by locKinFitParticle->Get_Position() //else at the common vertex
83  //useful for setting the momentum: locKinFitParticle->Set_Momentum()
84  TLorentzVector Calc_DecayingP4_ByPosition(const DKinFitParticle* locKinFitParticle, bool locAtPositionFlag, bool locDontPropagateAtAllFlag = false) const;
85 
86  //if input flag is true: return the value of the p4 at the vertex where the p3-deriving particles are at
87  //useful for doing mass constraints
88  TLorentzVector Calc_DecayingP4_ByP3Derived(const DKinFitParticle* locKinFitParticle, bool locAtP3DerivedFlag, bool locDontPropagateAtAllFlag = false) const;
89 
90  //if input flag is true: return the value of the p4 at the production vertex //else return it at the decay vertex
91  TLorentzVector Calc_DecayingP4_ByVertex(const DKinFitParticle* locKinFitParticle, bool locAtProductionVertexFlag, bool locDontPropagateAtAllFlag = false) const;
92 
93  bool Propagate_TrackInfoToCommonVertex(const DKinFitParticle* locKinFitParticle, const TMatrixDSym* locVXi, TVector3& locMomentum, TLorentzVector& locSpacetimeVertex, pair<double, double>& locPathLengthPair, pair<double, double>& locRestFrameLifetimePair, TMatrixFSym* locCovarianceMatrix) const;
94 
95  /********************************************************** DKINFITCHAIN RESOURCES **********************************************************/
96 
97  //Build output chain
98  shared_ptr<const DKinFitChain> Build_OutputKinFitChain(const shared_ptr<const DKinFitChain>& locInputKinFitChain, set<shared_ptr<DKinFitParticle>>& locKinFitOutputParticles);
99 
100  protected:
101 
102  void Print_Matrix(const TMatrixD& locMatrix) const;
103  void Print_Matrix(const TMatrixF& locMatrix) const;
104 
105  /************************************************************* ABSTRACT FUNCTIONS ***********************************************************/
106 
107  //MUST DEFINE IN A DERIVED CLASS
108  //FOR SETUP:
109  virtual bool Get_IncludeBeamlineInVertexFitFlag(void) const = 0;
110 
111  //FOR FITS:
112  virtual TVector3 Get_BField(const TVector3& locPosition) const = 0; //must return in units of Tesla!!
113  virtual bool Get_IsBFieldNearBeamline(void) const = 0;
114 
115  /********************************************************* GET AND RECYCLE RESOURCES ********************************************************/
116 
117  shared_ptr<TMatrixFSym> Get_SymMatrixResource(unsigned int locNumMatrixRows);
118 
119  /************************************************************** CLONE RESOURCES *************************************************************/
120 
121  //if need to modify a constraint without disrupting the original: note that particles aren't cloned!
122  shared_ptr<DKinFitConstraint_P4> Clone_KinFitConstraint_P4(const DKinFitConstraint_P4* locConstraint);
123  shared_ptr<DKinFitConstraint_Mass> Clone_KinFitConstraint_Mass(const DKinFitConstraint_Mass* locConstraint);
124  shared_ptr<DKinFitConstraint_Vertex> Clone_KinFitConstraint_Vertex(const DKinFitConstraint_Vertex* locConstraint);
125  shared_ptr<DKinFitConstraint_Spacetime> Clone_KinFitConstraint_Spacetime(const DKinFitConstraint_Spacetime* locConstraint);
126 
127  shared_ptr<TMatrixFSym> Clone_SymMatrix(const TMatrixFSym* locMatrix); //use sparingly in inherited class (if at all)!!
128 
129  /************************************************************* RECYCLE RESOURCES ************************************************************/
130 
131  // Do this if you are discarding the results from the previous fit (e.g. fit failed, or used to get a vertex guess)
132  // Functions are virtual in case the inheriting class wants to manage the memory differently
133  void Recycle_LastFitMemory(set<shared_ptr<DKinFitConstraint>>& locKinFitConstraints);
134 
135  /************************************************************** PROTECTED MEMBERS ***********************************************************/
136 
137  bool Get_IsDecayingParticleDefinedByProducts(const DKinFitParticle* locKinFitParticle) const;
138 
139  DKinFitter* dKinFitter; //is set by DKinFitter constructor!
143 
144  shared_ptr<DResourcePool<DKinFitChainStep>> dResourcePool_KinFitChainStep;
145  shared_ptr<DResourcePool<DKinFitChain>> dResourcePool_KinFitChain;
146 
147  private:
148 
149  /************************************************************** CLONE RESOURCES *************************************************************/
150 
151  shared_ptr<DKinFitParticle> Clone_KinFitParticle(const shared_ptr<DKinFitParticle>& locKinFitParticle);
152  set<shared_ptr<DKinFitParticle>> Build_CloneParticleSet(const set<shared_ptr<DKinFitParticle>>& locInputParticles, const map<shared_ptr<DKinFitParticle>, shared_ptr<DKinFitParticle>>& locCloneIOMap) const;
153  set<shared_ptr<DKinFitConstraint>> Clone_ParticlesAndConstraints(const set<shared_ptr<DKinFitConstraint>>& locInputConstraints);
154 
155  /*********************************************************** CALCULATION ROUTINES ***********************************************************/
156 
157  //Don't call directly: Rather, call the public wrappers (simpler)
158  TLorentzVector Calc_DecayingP4(const DKinFitParticle* locKinFitParticle, bool locIsConstrainedParticle, double locStateSignMultiplier, bool locDontPropagateAtAllFlag = false) const;
159 
160  bool Calc_PathLength(const DKinFitParticle* locKinFitParticle, const TMatrixDSym* locVXi, const TMatrixFSym* locCovarianceMatrix, pair<double, double>& locPathLengthPair, pair<double, double>& locRestFrameLifetimePair) const;
161  void Calc_DecayingParticleJacobian(const DKinFitParticle* locKinFitParticle, bool locDontPropagateDecayingP3Flag, double locStateSignMultiplier, int locNumEta, const map<const DKinFitParticle*, int>& locAdditionalPxParamIndices, TMatrixD& locJacobian) const;
162 
163  /*************************************************************** CLONE MAPPING **************************************************************/
164 
165  //Cannot map input -> output: many outputs for a given input (same particle used in multiple kinfits)
166  map<shared_ptr<DKinFitParticle>, shared_ptr<DKinFitParticle>> dParticleMap_OutputToInput;
167 
168  /************************************************************* CONSTRAINT MAPPING ***********************************************************/
169 
170  class DSpacetimeParticles //used for map only
171  {
172  public:
173  DSpacetimeParticles(const set<shared_ptr<DKinFitParticle>>& locFullConstrainParticles, const set<shared_ptr<DKinFitParticle>>& locOnlyConstrainTimeParticles, const set<shared_ptr<DKinFitParticle>>& locNoConstrainParticles) :
174  dFullConstrainParticles(locFullConstrainParticles), dOnlyConstrainTimeParticles(locOnlyConstrainTimeParticles), dNoConstrainParticles(locNoConstrainParticles) {}
175 
176  bool operator<(const DSpacetimeParticles& locSpacetimeParticles) const;
177 
178  set<shared_ptr<DKinFitParticle>> dFullConstrainParticles;
179  set<shared_ptr<DKinFitParticle>> dOnlyConstrainTimeParticles;
180  set<shared_ptr<DKinFitParticle>> dNoConstrainParticles;
181  };
182 
183  //Maps of user-created constraints, with the inputs necessary to create them as the keys.
184  //These are used to save memory: If a duplicate set of information is entered, instead of creating a new constraint, just return the original one.
185  //At the beginning of the fit, these resources are cloned, so that the originals (these) are not modified by the fit.
186  //Thus, they can be reused between fits/combos/reactions.
187  map<shared_ptr<DKinFitParticle>, shared_ptr<DKinFitConstraint_Mass>> dMassConstraintMap;
188  map<pair<set<shared_ptr<DKinFitParticle>>, set<shared_ptr<DKinFitParticle>> >, shared_ptr<DKinFitConstraint_P4>> dP4ConstraintMap; //pair: initial/final state
189  map<pair<set<shared_ptr<DKinFitParticle>>, set<shared_ptr<DKinFitParticle>> >, shared_ptr<DKinFitConstraint_Vertex>> dVertexConstraintMap; //pair: full/no constrain
190  map<DSpacetimeParticles, shared_ptr<DKinFitConstraint_Spacetime>> dSpacetimeConstraintMap;
191 
192  /************************************************************** RESOURCE POOLS **************************************************************/
193 
194  shared_ptr<DResourcePool<DKinFitConstraint_Mass>> dResourcePool_MassConstraint;
195  shared_ptr<DResourcePool<DKinFitConstraint_P4>> dResourcePool_P4Constraint;
196  shared_ptr<DResourcePool<DKinFitConstraint_Vertex>> dResourcePool_VertexConstraint;
197  shared_ptr<DResourcePool<DKinFitConstraint_Spacetime>> dResourcePool_SpacetimeConstraint;
198 
199  shared_ptr<DResourcePool<TMatrixFSym>> dResourcePool_TMatrixFSym;
200  shared_ptr<DResourcePool<DKinFitParticle>> dResourcePool_KinFitParticle;
201 };
202 
203 inline shared_ptr<DKinFitParticle> DKinFitUtils::Get_InputKinFitParticle(const shared_ptr<DKinFitParticle>& locOutputKinFitParticle) const
204 {
205  auto locIterator = dParticleMap_OutputToInput.find(locOutputKinFitParticle);
206  return (locIterator != dParticleMap_OutputToInput.end() ? locIterator->second : NULL);
207 }
208 
210 {
211  if(dFullConstrainParticles < locSpacetimeParticles.dFullConstrainParticles)
212  return true;
213  else if(dFullConstrainParticles > locSpacetimeParticles.dFullConstrainParticles)
214  return false;
215 
216  if(dOnlyConstrainTimeParticles < locSpacetimeParticles.dOnlyConstrainTimeParticles)
217  return true;
218  else if(dOnlyConstrainTimeParticles > locSpacetimeParticles.dOnlyConstrainTimeParticles)
219  return false;
220 
221  return (dNoConstrainParticles < locSpacetimeParticles.dNoConstrainParticles);
222 }
223 
224 #endif // _DKinFitUtils_
void Reset_NewEvent(void)
Definition: DKinFitter.cc:71
void Set_UpdateCovarianceMatricesFlag(bool locUpdateCovarianceMatricesFlag)
Definition: DKinFitUtils.h:52
bool Get_DebugLevel(void) const
Definition: DKinFitUtils.h:46
bool operator<(const DSourceComboUse &lhs, const DSourceComboUse &rhs)
Definition: DSourceCombo.h:95
DSpacetimeParticles(const set< shared_ptr< DKinFitParticle >> &locFullConstrainParticles, const set< shared_ptr< DKinFitParticle >> &locOnlyConstrainTimeParticles, const set< shared_ptr< DKinFitParticle >> &locNoConstrainParticles)
Definition: DKinFitUtils.h:173
map< DSpacetimeParticles, shared_ptr< DKinFitConstraint_Spacetime > > dSpacetimeConstraintMap
Definition: DKinFitUtils.h:190
unsigned int dDebugLevel
Definition: DKinFitter.h:163
shared_ptr< DResourcePool< DKinFitConstraint_Spacetime > > dResourcePool_SpacetimeConstraint
Definition: DKinFitUtils.h:197
set< shared_ptr< DKinFitParticle > > dFullConstrainParticles
Definition: DKinFitUtils.h:178
bool dUpdateCovarianceMatricesFlag
Definition: DKinFitUtils.h:142
set< shared_ptr< DKinFitParticle > > dOnlyConstrainTimeParticles
Definition: DKinFitUtils.h:179
void Recycle_LastFitMemory(void)
Definition: DKinFitter.cc:98
map< pair< set< shared_ptr< DKinFitParticle > >, set< shared_ptr< DKinFitParticle > > >, shared_ptr< DKinFitConstraint_P4 > > dP4ConstraintMap
Definition: DKinFitUtils.h:188
shared_ptr< DResourcePool< DKinFitConstraint_P4 > > dResourcePool_P4Constraint
Definition: DKinFitUtils.h:195
shared_ptr< DResourcePool< DKinFitChain > > dResourcePool_KinFitChain
Definition: DKinFitUtils.h:145
map< shared_ptr< DKinFitParticle >, shared_ptr< DKinFitConstraint_Mass > > dMassConstraintMap
Definition: DKinFitUtils.h:187
bool operator<(const DSpacetimeParticles &locSpacetimeParticles) const
Definition: DKinFitUtils.h:209
virtual ~DKinFitUtils(void)
Definition: DKinFitUtils.h:36
bool Get_LinkVerticesFlag(void) const
Definition: DKinFitUtils.h:45
virtual void Reset_NewFit(void)
Definition: DKinFitUtils.h:40
DKinFitter * dKinFitter
Definition: DKinFitUtils.h:139
bool dLinkVerticesFlag
Definition: DKinFitUtils.h:140
bool Get_UpdateCovarianceMatricesFlag(void) const
Definition: DKinFitUtils.h:47
shared_ptr< DResourcePool< DKinFitParticle > > dResourcePool_KinFitParticle
Definition: DKinFitUtils.h:200
map< shared_ptr< DKinFitParticle >, shared_ptr< DKinFitParticle > > dParticleMap_OutputToInput
Definition: DKinFitUtils.h:166
void Set_LinkVerticesFlag(bool locLinkVerticesFlag)
Definition: DKinFitUtils.h:50
set< shared_ptr< DKinFitParticle > > dNoConstrainParticles
Definition: DKinFitUtils.h:180
map< pair< set< shared_ptr< DKinFitParticle > >, set< shared_ptr< DKinFitParticle > > >, shared_ptr< DKinFitConstraint_Vertex > > dVertexConstraintMap
Definition: DKinFitUtils.h:189
shared_ptr< DKinFitParticle > Get_InputKinFitParticle(const shared_ptr< DKinFitParticle > &locKinFitParticle) const
Definition: DKinFitUtils.h:203
shared_ptr< DResourcePool< TMatrixFSym > > dResourcePool_TMatrixFSym
Definition: DKinFitUtils.h:199
shared_ptr< DResourcePool< DKinFitConstraint_Mass > > dResourcePool_MassConstraint
Definition: DKinFitUtils.h:194
shared_ptr< DResourcePool< DKinFitConstraint_Vertex > > dResourcePool_VertexConstraint
Definition: DKinFitUtils.h:196
shared_ptr< DResourcePool< DKinFitChainStep > > dResourcePool_KinFitChainStep
Definition: DKinFitUtils.h:144
void Set_DebugLevel(int locDebugLevel)
Definition: DKinFitUtils.h:51