FairRoot/PandaRoot
genfit2/trackReps/include/RKTrackRep.h
Go to the documentation of this file.
1 /* Copyright 2008-2010, Technische Universitaet Muenchen,
2  Authors: Christian Hoeppner & Sebastian Neubert & Johannes Rauch
3 
4  This file is part of GENFIT.
5 
6  GENFIT is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published
8  by the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  GENFIT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with GENFIT. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
24 #ifndef genfit_RKTrackRep_h
25 #define genfit_RKTrackRep_h
26 
27 #include "AbsTrackRep.h"
28 #include "StateOnPlane.h"
29 #include "RKTools.h"
30 #include "StepLimits.h"
31 
32 
33 namespace genfit {
34 
38 struct RKStep {
39  MatStep matStep_; // material properties and stepsize
40  M1x7 state7_; // 7D state vector
42 
43  RKStep() {
44  memset(state7_, 0x00, 7*sizeof(double));
45  }
46 };
47 
48 
52 struct ExtrapStep {
53  M7x7 jac7_; // 5D jacobian of transport
54  M7x7 noise7_; // 5D noise matrix
55 
57  memset(jac7_, 0, sizeof(M7x7));
58  memset(noise7_, 0, sizeof(M7x7));
59  }
60 };
61 
62 
70 class RKTrackRep : public AbsTrackRep {
71 
72 
73  public:
74 
75  RKTrackRep();
76  RKTrackRep(int pdgCode, char propDir = 0);
77 
78  virtual ~RKTrackRep();
79 
80  virtual AbsTrackRep* clone() const {return new RKTrackRep(*this);}
81 
82  virtual double extrapolateToPlane(StateOnPlane& state,
83  const SharedPlanePtr& plane,
84  bool stopAtBoundary = false,
85  bool calcJacobianNoise = false) const;
86 
88 
89  virtual double extrapolateToLine(StateOnPlane& state,
90  const TVector3& linePoint,
91  const TVector3& lineDirection,
92  bool stopAtBoundary = false,
93  bool calcJacobianNoise = false) const;
94 
95  virtual double extrapolateToPoint(StateOnPlane& state,
96  const TVector3& point,
97  bool stopAtBoundary = false,
98  bool calcJacobianNoise = false) const {
99  return extrapToPoint(state, point, NULL, stopAtBoundary, calcJacobianNoise);
100  }
101 
102  virtual double extrapolateToPoint(StateOnPlane& state,
103  const TVector3& point,
104  const TMatrixDSym& G, // weight matrix (metric)
105  bool stopAtBoundary = false,
106  bool calcJacobianNoise = false) const {
107  return extrapToPoint(state, point, &G, stopAtBoundary, calcJacobianNoise);
108  }
109 
110  virtual double extrapolateToCylinder(StateOnPlane& state,
111  double radius,
112  const TVector3& linePoint = TVector3(0.,0.,0.),
113  const TVector3& lineDirection = TVector3(0.,0.,1.),
114  bool stopAtBoundary = false,
115  bool calcJacobianNoise = false) const;
116 
117  virtual double extrapolateToSphere(StateOnPlane& state,
118  double radius,
119  const TVector3& point = TVector3(0.,0.,0.),
120  bool stopAtBoundary = false,
121  bool calcJacobianNoise = false) const;
122 
123  virtual double extrapolateBy(StateOnPlane& state,
124  double step,
125  bool stopAtBoundary = false,
126  bool calcJacobianNoise = false) const;
127 
128 
129  unsigned int getDim() const {return 5;}
130 
131  virtual TVector3 getPos(const StateOnPlane& state) const;
132 
133  virtual TVector3 getMom(const StateOnPlane& state) const;
134  virtual void getPosMom(const StateOnPlane& state, TVector3& pos, TVector3& mom) const;
135 
136  virtual double getMomMag(const StateOnPlane& state) const;
137  virtual double getMomVar(const MeasuredStateOnPlane& state) const;
138 
139  virtual TMatrixDSym get6DCov(const MeasuredStateOnPlane& state) const;
140  virtual void getPosMomCov(const MeasuredStateOnPlane& state, TVector3& pos, TVector3& mom, TMatrixDSym& cov) const;
141  virtual double getCharge(const StateOnPlane& state) const;
142  virtual double getQop(const StateOnPlane& state) const {return state.getState()(0);}
143  double getSpu(const StateOnPlane& state) const;
144  double getTime(const StateOnPlane& state) const;
145 
146  virtual void getForwardJacobianAndNoise(TMatrixD& jacobian, TMatrixDSym& noise, TVectorD& deltaState) const;
147 
148  virtual void getBackwardJacobianAndNoise(TMatrixD& jacobian, TMatrixDSym& noise, TVectorD& deltaState) const;
149 
150  std::vector<genfit::MatStep> getSteps() const;
151 
152  virtual double getRadiationLenght() const;
153 
154  virtual void setPosMom(StateOnPlane& state, const TVector3& pos, const TVector3& mom) const;
155  virtual void setPosMom(StateOnPlane& state, const TVectorD& state6) const;
156  virtual void setPosMomErr(MeasuredStateOnPlane& state, const TVector3& pos, const TVector3& mom, const TVector3& posErr, const TVector3& momErr) const;
157  virtual void setPosMomCov(MeasuredStateOnPlane& state, const TVector3& pos, const TVector3& mom, const TMatrixDSym& cov6x6) const;
158  virtual void setPosMomCov(MeasuredStateOnPlane& state, const TVectorD& state6, const TMatrixDSym& cov6x6) const;
159 
160  virtual void setChargeSign(StateOnPlane& state, double charge) const;
161  virtual void setQop(StateOnPlane& state, double qop) const {state.getState()(0) = qop;}
162 
163  void setSpu(StateOnPlane& state, double spu) const;
164  void setTime(StateOnPlane& state, double time) const;
165 
167 
174  double RKPropagate(M1x7& state7,
175  M7x7* jacobian,
176  M1x3& SA,
177  double S,
178  bool varField = true,
179  bool calcOnlyLastRowOfJ = false) const;
180 
181  virtual bool isSameType(const AbsTrackRep* other);
182  virtual bool isSame(const AbsTrackRep* other);
183 
184  private:
185 
186  void initArrays() const;
187 
188  virtual double extrapToPoint(StateOnPlane& state,
189  const TVector3& point,
190  const TMatrixDSym* G = NULL, // weight matrix (metric)
191  bool stopAtBoundary = false,
192  bool calcJacobianNoise = false) const;
193 
194  void getState7(const StateOnPlane& state, M1x7& state7) const;
195  void getState5(StateOnPlane& state, const M1x7& state7) const; // state7 must already lie on plane of state!
196 
197  void transformPM7(const MeasuredStateOnPlane& state,
198  M7x7& out7x7) const;
199 
200  void calcJ_pM_5x7(M5x7& J_pM, const TVector3& U, const TVector3& V, const M1x3& pTilde, double spu) const;
201 
202  void transformPM6(const MeasuredStateOnPlane& state,
203  M6x6& out6x6) const;
204 
205  void transformM7P(const M7x7& in7x7,
206  const M1x7& state7,
207  MeasuredStateOnPlane& state) const; // plane must already be set!
208 
209  void calcJ_Mp_7x5(M7x5& J_Mp, const TVector3& U, const TVector3& V, const TVector3& W, const M1x3& A) const;
210 
211  void calcForwardJacobianAndNoise(const M1x7& startState7, const DetPlane& startPlane,
212  const M1x7& destState7, const DetPlane& destPlane) const;
213 
214  void transformM6P(const M6x6& in6x6,
215  const M1x7& state7,
216  MeasuredStateOnPlane& state) const; // plane and charge must already be set!
217 
219 
228  bool RKutta(const M1x4& SU,
229  const DetPlane& plane,
230  double charge,
231  double mass,
232  M1x7& state7,
233  M7x7* jacobianT,
234  M1x7* J_MMT_unprojected_lastRow,
235  double& coveredDistance, // signed
236  double& flightTime,
237  bool& checkJacProj,
238  M7x7& noiseProjection,
239  StepLimits& limits,
240  bool onlyOneStep = false,
241  bool calcOnlyLastRowOfJ = false) const;
242 
243  double estimateStep(const M1x7& state7,
244  const M1x4& SU,
245  const DetPlane& plane,
246  const double& charge,
247  double& relMomLoss,
248  StepLimits& limits) const;
249 
250  TVector3 pocaOnLine(const TVector3& linePoint,
251  const TVector3& lineDirection,
252  const TVector3& point) const;
253 
255 
263  double Extrap(const DetPlane& startPlane, // plane where Extrap starts
264  const DetPlane& destPlane, // plane where Extrap has to extrapolate to
265  double charge,
266  double mass,
267  bool& isAtBoundary,
268  M1x7& state7,
269  double& flightTime,
270  bool fillExtrapSteps,
271  TMatrixDSym* cov = nullptr,
272  bool onlyOneStep = false,
273  bool stopAtBoundary = false,
274  double maxStep = 1.E99) const;
275 
276  void checkCache(const StateOnPlane& state, const SharedPlanePtr* plane) const;
277 
278  double momMag(const M1x7& state7) const;
279 
280 
283  mutable std::vector<RKStep> RKSteps_;
284  mutable int RKStepsFXStart_;
285  mutable int RKStepsFXStop_;
286  mutable std::vector<ExtrapStep> ExtrapSteps_;
287 
289  mutable TMatrixDSym fNoise_;
290 
291  mutable bool useCache_;
292  mutable unsigned int cachePos_;
293 
294  // auxiliary variables and arrays
295  // needed in Extrap()
296  mutable StepLimits limits_;
297  mutable M7x7 noiseArray_;
299  mutable M7x7 J_MMT_;
300 
301  public:
302 
303  ClassDef(RKTrackRep, 1)
304 
305 };
306 
307 } /* End of namespace genfit */
310 #endif // genfit_RKTrackRep_h
double getTime(const StateOnPlane &state) const
Get the time corresponding to the StateOnPlane. Extrapolation.
TVector3 pos
virtual void setPosMomErr(MeasuredStateOnPlane &state, const TVector3 &pos, const TVector3 &mom, const TVector3 &posErr, const TVector3 &momErr) const
Set position and momentum and error of state.
double momMag(const M1x7 &state7) const
void initArrays() const
M7x7 noiseProjection_
noise matrix of the last extrapolation
Detector plane.
Definition: DetPlane.h:61
boost::shared_ptr< genfit::DetPlane > SharedPlanePtr
Shared Pointer to a DetPlane.
virtual double extrapToPoint(StateOnPlane &state, const TVector3 &point, const TMatrixDSym *G=NULL, bool stopAtBoundary=false, bool calcJacobianNoise=false) const
virtual AbsTrackRep * clone() const
Clone the trackRep.
virtual void getPosMom(const StateOnPlane &state, TVector3 &pos, TVector3 &mom) const
Get cartesian position and momentum vector of a state.
virtual double extrapolateToPoint(StateOnPlane &state, const TVector3 &point, bool stopAtBoundary=false, bool calcJacobianNoise=false) const
Extrapolates the state to the POCA to a point, and returns the extrapolation length and...
std::vector< RKStep > RKSteps_
state where the last extrapolation has ended
virtual void getForwardJacobianAndNoise(TMatrixD &jacobian, TMatrixDSym &noise, TVectorD &deltaState) const
Get the jacobian and noise matrix of the last extrapolation.
void checkCache(const StateOnPlane &state, const SharedPlanePtr *plane) const
void setTime(StateOnPlane &state, double time) const
Set time at which the state was defined.
bool RKutta(const M1x4 &SU, const DetPlane &plane, double charge, double mass, M1x7 &state7, M7x7 *jacobianT, M1x7 *J_MMT_unprojected_lastRow, double &coveredDistance, double &flightTime, bool &checkJacProj, M7x7 &noiseProjection, StepLimits &limits, bool onlyOneStep=false, bool calcOnlyLastRowOfJ=false) const
Propagates the particle through the magnetic field.
Simple struct containing MaterialProperties and stepsize in the material.
Definition: AbsTrackRep.h:42
TVector3 pocaOnLine(const TVector3 &linePoint, const TVector3 &lineDirection, const TVector3 &point) const
Helper to store different limits on the stepsize for the RKTRackRep.
Definition: StepLimits.h:54
virtual void setChargeSign(StateOnPlane &state, double charge) const
Set the sign of the charge according to charge.
virtual double getMomMag(const StateOnPlane &state) const
get the magnitude of the momentum in GeV.
virtual ~RKTrackRep()
double M6x6[6 *6]
Definition: RKTools.h:38
Abstract base class for a track representation.
Definition: AbsTrackRep.h:66
double M1x4[1 *4]
Definition: RKTools.h:34
StateOnPlane with additional covariance matrix.
unsigned int cachePos_
use cached RKSteps_ for extrapolation
virtual void setPosMom(StateOnPlane &state, const TVector3 &pos, const TVector3 &mom) const
Set position and momentum of state.
Double_t mom
Definition: plot_dirc.C:14
virtual double extrapolateToPoint(StateOnPlane &state, const TVector3 &point, const TMatrixDSym &G, bool stopAtBoundary=false, bool calcJacobianNoise=false) const
Extrapolates the state to the POCA to a point in the metric of G, and returns the extrapolation lengt...
void transformM7P(const M7x7 &in7x7, const M1x7 &state7, MeasuredStateOnPlane &state) const
virtual double getRadiationLenght() const
Get the accumulated X/X0 (path / radiation length) of the material crossed in the last extrapolation...
double M7x5[7 *5]
Definition: RKTools.h:42
virtual TVector3 getPos(const StateOnPlane &state) const
Get the cartesian position of a state.
unsigned int getDim() const
Get the dimension of the state vector used by the track representation.
virtual double getMomVar(const MeasuredStateOnPlane &state) const
get the variance of the absolute value of the momentum .
virtual void getBackwardJacobianAndNoise(TMatrixD &jacobian, TMatrixDSym &noise, TVectorD &deltaState) const
Get the jacobian and noise matrix of the last extrapolation if it would have been done in opposite di...
void setSpu(StateOnPlane &state, double spu) const
A state with arbitrary dimension defined in a DetPlane.
Definition: StateOnPlane.h:45
#define W
Definition: createSTT.C:76
virtual double getCharge(const StateOnPlane &state) const
Get the (fitted) charge of a state. This is not always equal the pdg charge (e.g. if the charge sign ...
virtual double extrapolateToPlane(StateOnPlane &state, const SharedPlanePtr &plane, bool stopAtBoundary=false, bool calcJacobianNoise=false) const
Extrapolates the state to plane, and returns the extrapolation length and, via reference, the extrapolated state.
virtual double getQop(const StateOnPlane &state) const
Get charge over momentum.
double M1x7[1 *7]
Definition: RKTools.h:36
void transformPM7(const MeasuredStateOnPlane &state, M7x7 &out7x7) const
virtual TMatrixDSym get6DCov(const MeasuredStateOnPlane &state) const
Get the 6D covariance.
void calcJ_pM_5x7(M5x7 &J_pM, const TVector3 &U, const TVector3 &V, const M1x3 &pTilde, double spu) const
std::vector< ExtrapStep > ExtrapSteps_
TClonesArray * point
Definition: anaLmdDigi.C:29
virtual TVector3 getMom(const StateOnPlane &state) const
Get the cartesian momentum vector of a state.
double estimateStep(const M1x7 &state7, const M1x4 &SU, const DetPlane &plane, const double &charge, double &relMomLoss, StepLimits &limits) const
double M5x7[5 *7]
Definition: RKTools.h:44
virtual double extrapolateBy(StateOnPlane &state, double step, bool stopAtBoundary=false, bool calcJacobianNoise=false) const
Extrapolates the state by step (cm) and returns the extrapolation length and, via reference...
TMatrixD fJacobian_
steps made in Extrap during last extrapolation
double RKPropagate(M1x7 &state7, M7x7 *jacobian, M1x3 &SA, double S, bool varField=true, bool calcOnlyLastRowOfJ=false) const
The actual Runge Kutta propagation.
void calcForwardJacobianAndNoise(const M1x7 &startState7, const DetPlane &startPlane, const M1x7 &destState7, const DetPlane &destPlane) const
virtual bool isSame(const AbsTrackRep *other)
check if other is of same type (e.g. RKTrackRep) and has same pdg code.
int RKStepsFXStart_
RungeKutta steps made in the last extrapolation.
void transformPM6(const MeasuredStateOnPlane &state, M6x6 &out6x6) const
virtual bool isSameType(const AbsTrackRep *other)
check if other is of same type (e.g. RKTrackRep).
void calcJ_Mp_7x5(M7x5 &J_Mp, const TVector3 &U, const TVector3 &V, const TVector3 &W, const M1x3 &A) const
virtual void setPosMomCov(MeasuredStateOnPlane &state, const TVector3 &pos, const TVector3 &mom, const TMatrixDSym &cov6x6) const
Set position, momentum and covariance of state.
StateOnPlane lastEndState_
state where the last extrapolation has started
virtual double extrapolateToLine(StateOnPlane &state, const TVector3 &linePoint, const TVector3 &lineDirection, bool stopAtBoundary=false, bool calcJacobianNoise=false) const
Extrapolates the state to the POCA to a line, and returns the extrapolation length and...
double M1x3[1 *3]
Definition: RKTools.h:33
virtual double extrapolateToLine(StateOnPlane &state, const TVector3 &linePoint, const TVector3 &lineDirection, bool stopAtBoundary=false, bool calcJacobianNoise=false) const =0
Extrapolates the state to the POCA to a line, and returns the extrapolation length and...
double Extrap(const DetPlane &startPlane, const DetPlane &destPlane, double charge, double mass, bool &isAtBoundary, M1x7 &state7, double &flightTime, bool fillExtrapSteps, TMatrixDSym *cov=nullptr, bool onlyOneStep=false, bool stopAtBoundary=false, double maxStep=1.E99) const
Handles propagation and material effects.
AbsTrackRep with 5D track parameterization in plane coordinates: (q/p, u', v', u, v) ...
void transformM6P(const M6x6 &in6x6, const M1x7 &state7, MeasuredStateOnPlane &state) const
virtual void getPosMomCov(const MeasuredStateOnPlane &state, TVector3 &pos, TVector3 &mom, TMatrixDSym &cov) const
Translates MeasuredStateOnPlane into 3D position, momentum and 6x6 covariance.
virtual double extrapolateToCylinder(StateOnPlane &state, double radius, const TVector3 &linePoint=TVector3(0., 0., 0.), const TVector3 &lineDirection=TVector3(0., 0., 1.), bool stopAtBoundary=false, bool calcJacobianNoise=false) const
Extrapolates the state to the cylinder surface, and returns the extrapolation length and...
double M7x7[7 *7]
Definition: RKTools.h:39
double noise
virtual void setQop(StateOnPlane &state, double qop) const
Set charge/momentum.
double getSpu(const StateOnPlane &state) const
const TVectorD & getState() const
Definition: StateOnPlane.h:60
std::vector< genfit::MatStep > getSteps() const
Get stepsizes and material properties of crossed materials of the last extrapolation.
void getState5(StateOnPlane &state, const M1x7 &state7) const
TMatrixT< double > TMatrixD
Definition: PndLmdDim.h:52
virtual double extrapolateToSphere(StateOnPlane &state, double radius, const TVector3 &point=TVector3(0., 0., 0.), bool stopAtBoundary=false, bool calcJacobianNoise=false) const
Extrapolates the state to the sphere surface, and returns the extrapolation length and...
Matrix inversion tools.
Definition: AbsBField.h:29
void getState7(const StateOnPlane &state, M1x7 &state7) const