-
Notifications
You must be signed in to change notification settings - Fork 0
/
AliAlgTrack.h
220 lines (204 loc) · 10.5 KB
/
AliAlgTrack.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#ifndef ALIALGTRACK_H
#define ALIALGTRACK_H
#include "AliExternalTrackParam.h"
#include "AliAlgPoint.h"
#include <TObjArray.h>
#include <TArrayD.h>
#include <TArrayI.h>
/*--------------------------------------------------------
Track model for the alignment: AliExternalTrackParam for kinematics
proper with number of multiple scattering kinks.
Full support for derivatives and residuals calculation
-------------------------------------------------------*/
// Author: [email protected]
//#define DEBUG 4
class AliAlgTrack: public AliExternalTrackParam
{
public:
enum {kCosmicBit=BIT(14),kFieldONBit=BIT(15),kResidDoneBit=BIT(16),
kDerivDoneBit=BIT(17),kKalmanDoneBit=BIT(18)};
enum {kNKinParBOFF=4 // N params for ExternalTrackParam part w/o field
,kNKinParBON=5 // N params for ExternalTrackParam part with field
,kParY = 0 // track parameters
,kParZ
,kParSnp
,kParTgl
,kParQ2Pt
};
AliAlgTrack();
virtual ~AliAlgTrack();
void DefineDOFs();
Double_t GetMass() const {return fMass;}
Double_t GetMinX2X0Pt2Account() const {return fMinX2X0Pt2Account;}
Int_t GetNPoints() const {return fPoints.GetEntriesFast();}
AliAlgPoint* GetPoint(int i) const {return (AliAlgPoint*)fPoints[i];}
void AddPoint(AliAlgPoint* p) {fPoints.AddLast(p);}
void SetMass(double m) {fMass = m;}
void SetMinX2X0Pt2Account(double v) {fMinX2X0Pt2Account = v;}
Int_t GetNLocPar() const {return fNLocPar;}
Int_t GetNLocExtPar() const {return fNLocExtPar;}
Int_t GetInnerPointID() const {return fInnerPointID;}
AliAlgPoint* GetInnerPoint() const {return GetPoint(fInnerPointID);}
//
virtual void Clear(Option_t *opt="");
virtual void Print(Option_t *opt="") const;
virtual void DumpCoordinates() const;
//
Bool_t PropagateToPoint(AliExternalTrackParam& tr, const AliAlgPoint* pnt,
int minNSteps,double maxStep,Bool_t matCor, double* matPar=0);
Bool_t PropagateParamToPoint(AliExternalTrackParam& tr, const AliAlgPoint* pnt, double maxStep=3); // param only
Bool_t PropagateParamToPoint(AliExternalTrackParam* trSet, int nTr, const AliAlgPoint* pnt, double maxStep=3); // params only
//
Bool_t CalcResiduals(const double *params=0);
Bool_t CalcResidDeriv(double *params=0);
Bool_t CalcResidDerivGlo(AliAlgPoint* pnt);
//
Bool_t IsCosmic() const {return TestBit(kCosmicBit);}
void SetCosmic(Bool_t v=kTRUE) {SetBit(kCosmicBit,v);}
Bool_t GetFieldON() const {return TestBit(kFieldONBit);}
void SetFieldON(Bool_t v=kTRUE) {SetBit(kFieldONBit,v);}
Bool_t GetResidDone() const {return TestBit(kResidDoneBit);}
void SetResidDone(Bool_t v=kTRUE) {SetBit(kResidDoneBit,v);}
Bool_t GetDerivDone() const {return TestBit(kDerivDoneBit);}
void SetDerivDone(Bool_t v=kTRUE) {SetBit(kDerivDoneBit,v);}
Bool_t GetKalmanDone() const {return TestBit(kKalmanDoneBit);}
void SetKalmanDone(Bool_t v=kTRUE) {SetBit(kKalmanDoneBit,v);}
//
void SortPoints();
Bool_t IniFit();
Bool_t ResidKalman();
Bool_t ProcessMaterials();
Bool_t CombineTracks(AliExternalTrackParam& trcL, const AliExternalTrackParam& trcU);
//
void SetChi2(double c) {fChi2 = c;};
Double_t GetChi2() const {return fChi2;}
void SetChi2Ini(double c) {fChi2Ini = c;};
Double_t GetChi2Ini() const {return fChi2Ini;}
Double_t GetChi2CosmUp() const {return fChi2CosmUp;}
Double_t GetChi2CosmDn() const {return fChi2CosmDn;}
//
void ImposePtBOff(double pt) {fP[kParQ2Pt] = 1./pt;}
// propagation methods
void CopyFrom(const AliExternalTrackParam* etp);
Bool_t ApplyMatCorr(AliExternalTrackParam& trPar, const Double_t *corrDiag, const AliAlgPoint* pnt);
Bool_t ApplyMatCorr(AliExternalTrackParam* trSet, int ntr, const Double_t *corrDiaf,const AliAlgPoint* pnt);
Bool_t ApplyMatCorr(AliExternalTrackParam& trPar, const Double_t *corrpar);
//
Double_t GetResidual(int dim, int pntID) const {return fResidA[dim][pntID];}
Double_t *GetDResDLoc(int dim, int pntID) const {return &fDResDLocA[dim][pntID*fNLocPar];}
Double_t *GetDResDGlo(int dim, int id) const {return &fDResDGloA[dim][id];}
Int_t *GetGloParID() const {return fGloParIDA;}
//
void SetParams(AliExternalTrackParam& tr, double x, double alp, const double* par,Bool_t add);
void SetParams(AliExternalTrackParam* trSet, int ntr, double x, double alp, const double* par,Bool_t add);
void SetParam(AliExternalTrackParam& tr, int par, double val);
void SetParam(AliExternalTrackParam* trSet, int ntr, int par, double val);
void ModParam(AliExternalTrackParam& tr, int par, double delta);
void ModParam(AliExternalTrackParam* trSet, int ntr, int par, double delta);
//
void RichardsonDeriv(const AliExternalTrackParam* trSet, const double *delta,
const AliAlgPoint* pnt, double& derY, double& derZ);
//
const Double_t* GetLocPars() const {return fLocParA;}
void SetLocPars(const double* pars);
//
protected:
//
Bool_t CalcResidDeriv(double *params,Bool_t invert,int pFrom,int pTo);
Bool_t CalcResiduals(const double *params,Bool_t invert,int pFrom,int pTo);
Bool_t FitLeg(AliExternalTrackParam& trc, int pFrom,int pTo, Bool_t &inv);
Bool_t ProcessMaterials(AliExternalTrackParam& trc, int pFrom,int pTo);
//
void CheckExpandDerGloBuffer(int minSize);
//
static Double_t RichardsonExtrap(double *val, int ord=1);
static Double_t RichardsonExtrap(const double *val, int ord=1);
//
// ---------- dummies ----------
AliAlgTrack(const AliAlgTrack&);
AliAlgTrack& operator=(const AliAlgTrack&);
//
protected:
//
Int_t fNLocPar; // number of local params
Int_t fNLocExtPar; // number of local params for the external track param
Int_t fNGloPar; // number of free global parameters the track depends on
Int_t fNDF; // number of degrees of freedom
Int_t fInnerPointID; // ID of inner point in sorted track. For 2-leg cosmics - innermost point of lower leg
Bool_t fNeedInv[2]; // set if one of cosmic legs need inversion
Double_t fMinX2X0Pt2Account; // minimum X2X0/pT accumulated between 2 points worth to account
Double_t fMass; // assumed mass
Double_t fChi2; // chi2 with current residuals
Double_t fChi2CosmUp; // chi2 for cosmic upper leg
Double_t fChi2CosmDn; // chi2 for cosmic down leg
Double_t fChi2Ini; // chi2 with current residuals
TObjArray fPoints; // alignment points
TArrayD fResid[2]; // residuals array
TArrayD fDResDLoc[2]; // array for derivatives over local params
TArrayD fDResDGlo[2]; // array for derivatives over global params
TArrayD fLocPar; // local parameters array
TArrayI fGloParID; // IDs of relevant global params
Double_t *fResidA[2]; //! fast access to residuals
Double_t *fDResDLocA[2]; //! fast access to local derivatives
Double_t *fDResDGloA[2]; //! fast access to global derivatives
Int_t *fGloParIDA; //! fast access to relevant global param IDs
Double_t *fLocParA; //! fast access to local params
//
ClassDef(AliAlgTrack,2)
};
//____________________________________________________________________________________________
inline void AliAlgTrack::SetParams(AliExternalTrackParam& tr, double x, double alp, const double* par,Bool_t add)
{
// set track params
const float kDefQ2PtCosm = 1., kDefG2PtColl = 1./0.6;
tr.SetParamOnly(x,alp,par);
double *parTr = (double*) tr.GetParameter();
if (add) { // par is correction to reference params
for (int i=kNKinParBON;i--;) parTr[i] += GetParameter()[i];
}
if (!GetFieldON()) parTr[4] = IsCosmic() ? kDefQ2PtCosm : kDefG2PtColl; // only 4 params are valid
//
}
//____________________________________________________________________________________________
inline void AliAlgTrack::SetParams(AliExternalTrackParam* trSet, int ntr, double x, double alp, const double* par,Bool_t add)
{
// set parames for multiple tracks (VECTORIZE THIS)
if (!add) { // full parameter supplied
for (int itr=ntr;itr--;) SetParams(trSet[itr],x,alp,par,kFALSE);
return;
}
double partr[kNKinParBON]={0}; // par is a correction to reference parameter
for (int i=fNLocExtPar;i--;) partr[i] = GetParameter()[i] + par[i];
for (int itr=ntr;itr--;) SetParams(trSet[itr],x,alp,partr,kFALSE);
}
//____________________________________________________________________________________________
inline void AliAlgTrack::SetParam(AliExternalTrackParam& tr, int par, double val)
{
// set track parameter
((double*)tr.GetParameter())[par] = val;
}
//____________________________________________________________________________________________
inline void AliAlgTrack::SetParam(AliExternalTrackParam* trSet, int ntr, int par, double val)
{
// set parames for multiple tracks (VECTORIZE THIS)
for (int itr=ntr;itr--;) ((double*)trSet[itr].GetParameter())[par] = val;
}
//____________________________________________________________________________________________
inline void AliAlgTrack::ModParam(AliExternalTrackParam & tr, int par, double delta)
{
// modify track parameter
((double*)tr.GetParameter())[par] += delta;
}
//____________________________________________________________________________________________
inline void AliAlgTrack::ModParam(AliExternalTrackParam* trSet, int ntr, int par, double delta)
{
// modify track parameter (VECTORIZE THOS)
for (int itr=ntr;itr--;) ModParam(trSet[itr],par,delta);
}
//______________________________________________
inline void AliAlgTrack::CopyFrom(const AliExternalTrackParam* etp)
{
// assign kinematics
Set(etp->GetX(),etp->GetAlpha(),etp->GetParameter(),etp->GetCovariance());
}
#endif