Processing SPD Mean Vertex only in PHYSICS runs.
[u/mrichter/AliRoot.git] / STEER / AliRelAlignerKalman.h
1 #ifndef ALIRELALIGNERKALMAN_H
2 #define ALIRELALIGNERKALMAN_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               */
6
7 ///////////////////////////////////////////////////////////////////////////////
8 //
9 //     Relative alignment of two tracking volumes (default ITS and TPC)
10 //     (see AliRelAlignerKalman.cxx for details)
11 //
12 //     Origin: Mikolaj Krzewicki, Nikhef, Mikolaj.Krzewicki@cern.ch
13 //
14 //////////////////////////////////////////////////////////////////////////////
15
16 #include <TMath.h>
17 #include <TVectorD.h>
18 #include <TMatrix.h>
19
20 class TObject;
21 class AliExternalTrackParam;
22 class AliESDEvent;
23 class AliESDtrack;
24
25 class AliRelAlignerKalman : public TObject {
26
27 public:
28     AliRelAlignerKalman();
29     virtual ~AliRelAlignerKalman();
30     AliRelAlignerKalman& operator= (const AliRelAlignerKalman& a );
31     AliRelAlignerKalman(const AliRelAlignerKalman& a);
32
33     //User methods:
34     Bool_t AddCosmicEvent( const AliESDEvent* pEvent );
35     Bool_t AddTrackParams( const AliExternalTrackParam* p1, const AliExternalTrackParam* p2 );
36     
37     void Print(Option_t* option="") const;
38
39     Double_t GetPsi() const {return (*fPX)(0);}
40     Double_t GetTheta() const {return (*fPX)(1);}
41     Double_t GetPhi() const {return (*fPX)(2);}
42     Double_t GetX() const {return (*fPX)(3);}
43     Double_t GetY() const {return (*fPX)(4);}
44     Double_t GetZ() const {return (*fPX)(5);}
45     Double_t GetTPCvdCorr() const {return (*fPX)(6);}
46     Double_t GetTPCt0() const {return (*fPX)(7);}
47     Double_t GetTPCvdY() const {if (fgkNSystemParams>8) return (*fPX)(8); else return 0.0;}
48     Double_t GetPsiErr() const {return TMath::Sqrt((*fPXcov)(0,0));}
49     Double_t GetThetaErr() const {return TMath::Sqrt((*fPXcov)(1,1));}
50     Double_t GetPhiErr() const {return TMath::Sqrt((*fPXcov)(2,2));}
51     Double_t GetXErr() const {return TMath::Sqrt((*fPXcov)(3,3));}
52     Double_t GetYErr() const {return TMath::Sqrt((*fPXcov)(4,4));}
53     Double_t GetZErr() const {return TMath::Sqrt((*fPXcov)(5,5));}
54     Double_t GetTPCvdCorrErr() const {return TMath::Sqrt((*fPXcov)(6,6));}
55     Double_t GetTPCt0Err() const {return TMath::Sqrt((*fPXcov)(7,7));}
56     Double_t GetTPCvdYErr() const {if (fgkNSystemParams>8) return TMath::Sqrt((*fPXcov)(8,8)); else return 0.0;}
57     void GetMeasurement( TVectorD& mes ) const { mes = *fPMeasurement; }
58     TVectorD* GetMeasurement() { return fPMeasurement; }
59     void GetMeasurementCov( TMatrixDSym& cov ) const { cov = *fPMeasurementCov; }
60     void SetMeasurement( const TVectorD& mes ) {*fPMeasurement = mes;}
61     void SetMeasurementCov( const TMatrixDSym& cov ) {*fPMeasurementCov = cov;}
62     TMatrixDSym* GetMeasurementCov() const { return fPMeasurementCov; }
63     void GetState( TVectorD& state ) const { state = *fPX; }
64     TVectorD* GetState() const { return fPX; }
65     void GetStateCov ( TMatrixDSym& cov ) const { cov = *fPXcov; }
66     void SetState( const TVectorD& param ) {*fPX = param;}
67     void SetStateCov (const TMatrixDSym& cov ) {*fPXcov = cov;}
68     TMatrixDSym* GetStateCov() const { return fPXcov; }
69     void GetSeed( TVectorD& seed, TMatrixDSym& seedCov ) const { seed = *fPX; seedCov = *fPXcov; }
70     void SetSeed( const TVectorD& seed, const TMatrixDSym& seedCov ) {*fPX = seed; *fPXcov = seedCov; }
71     Bool_t Merge( const AliRelAlignerKalman* al );
72
73     //Expert methods:
74     Bool_t AddESDevent( const AliESDEvent* pEvent );
75     Bool_t AddESDtrack( const AliESDtrack* pTrack );
76     void SetMagField( const Double_t f ) { fMagField=f; }
77     Double_t GetMagField() const { return fMagField; }
78     Bool_t FindCosmicTrackletNumbersInEvent( TArrayI& outITStracksTArr, TArrayI& outTPCtracksTArr, const AliESDEvent* pEvent );
79     Bool_t Update();
80     void PrintCorrelationMatrix();
81     //void PrintCovarianceCorrection();
82     void PrintSystemMatrix();
83     void Reset();
84     void ResetCovariance( const Double_t number=0. );
85     void ResetTPCparamsCovariance( const Double_t number=0. );
86     Double_t* GetStateArr() const { return fPX->GetMatrixArray(); }
87     Double_t* GetStateCovArr() const { return fPXcov->GetMatrixArray(); }
88     Double_t* GetMeasurementArr() const { return fPMeasurement->GetMatrixArray(); }
89     Double_t* GetMeasurementCovArr() const { return fPMeasurementCov->GetMatrixArray(); }
90     TMatrixD* GetH() const { return fPH; }
91     const Double_t* GetDeltaArr() const {return fDelta;}
92     void SetNumericalParanoia( const Bool_t mode=kFALSE ) { fNumericalParanoia=mode; }
93     void SetCorrectionMode( const Bool_t mode=kTRUE ) { fCorrectionMode=mode; }
94     void SetOutRejSigma( const Double_t a=2. ) { fOutRejSigmas = a; }
95     void SetRejectOutliers( const Bool_t r=kTRUE ) {fRejectOutliers = r;}
96     Bool_t SetTrackParams( const AliExternalTrackParam* exparam1, const AliExternalTrackParam* exparam2 );
97     const AliExternalTrackParam* GetTrackParams1() const {return fPTrackParamArr1;}
98     const AliExternalTrackParam* GetTrackParams2() const {return fPTrackParamArr2;}
99     void SetMinPointsVol1( const Int_t min ) {fMinPointsVol1=min;}
100     void SetMinPointsVol2( const Int_t min ) {fMinPointsVol2=min;}
101     void SetRequireMatchInTPC( const Bool_t s=kTRUE ) {fRequireMatchInTPC = s;}
102     void SetQ( const Double_t Q = 1e-10 ) { fQ = Q; }
103     void SetMaxMatchingDistance( const Double_t m ) {fMaxMatchingDistance=m;}
104     void SetMaxMatchingAngle( const Double_t m ) {fMaxMatchingAngle=m;}
105     void SetTPCvd( const Float_t v ) {fTPCvd=v;}
106     void SetTPCZLengthA( const Double_t l ) {fTPCZLengthA=l;}
107     void SetTPCZLengthC( const Double_t l ) {fTPCZLengthC=l;}
108     Bool_t CorrectTrack( AliExternalTrackParam* tr, const TVectorD& misalignment ) const;
109     Bool_t MisalignTrack( AliExternalTrackParam* tr, const TVectorD& misalignment ) const;
110     static void Angles( TVectorD &angles, const TMatrixD &rotmat );
111     static void RotMat( TMatrixD& R, const TVectorD& angles );
112     static void TMatrixDSymFromTMatrixD( TMatrixDSym& matsym, const TMatrixD& mat );
113     Bool_t IsPositiveDefinite( const TMatrixD& mat ) const;
114     void SetTimeStamp( const UInt_t ts ) { fTimeStamp = ts; }
115     UInt_t GetTimeStamp() const {return fTimeStamp;}
116     void SetRunNumber( const Int_t rn ) { fRunNumber = rn; }
117     Int_t GetRunNumber() const {return fRunNumber;}
118     Int_t Compare(const TObject *obj) const;
119     Bool_t IsSortable() const { return kTRUE; }
120     Int_t GetNTracks() const {return fNTracks;}
121     Int_t GetNUpdates() const {return fNUpdates;}
122     Int_t GetNOutliers() const {return fNOutliers;}
123     void SetPoint2Track( Bool_t o );
124     
125 protected:
126     Bool_t UpdateEstimateKalman();
127     Bool_t PrepareMeasurement();
128     Bool_t PrepareSystemMatrix();
129     Bool_t PreparePrediction();
130     Bool_t PredictMeasurement( TVectorD& z, const TVectorD& x );
131     Bool_t IsOutlier( const TVectorD& update, const TMatrixDSym& covmatrix );
132
133 private:
134     static const Int_t fgkNTracksPerMeasurement=1;        //how many tracks for one update
135     static const Int_t fgkNSystemParams=9;                //how many fit parameters
136     
137     //Track parameters
138     Double_t fAlpha;       //!rotation angle between the local and global coordinate system like in AliExternalTrackParam
139     Double_t fLocalX;      //!local x coordinate of reference plane = r(global)
140     AliExternalTrackParam* fPTrackParamArr1;   //!local track parameters
141     AliExternalTrackParam* fPTrackParamArr2;   //!local track parameters
142     Double_t fMagField; //!magnetic field
143
144     //Kalman filter related stuff
145     Int_t fNMeasurementParams;           //how many measurables
146     TVectorD* fPX; //System (fit) parameters (phi, theta, psi, x, y, z, driftcorr, driftoffset )
147     TMatrixDSym* fPXcov; //covariance matrix of system parameters
148     TMatrixD* fPH;      //!System measurement matrix
149     Double_t fQ;        //!measure for system noise
150     TVectorD* fPMeasurement; //!the measurement vec for Kalman filter (theta,phi,x,z)
151     TMatrixDSym* fPMeasurementCov; //!measurement vec cvariance
152     TVectorD* fPMeasurementPrediction; //!prediction of the measurement
153     Double_t fOutRejSigmas; //number of sigmas for outlier rejection
154     Double_t fDelta[fgkNSystemParams]; //array with differentials for calculating derivatives for every parameter(see PrepareSystemMatrix())
155
156     //Control
157     Bool_t fYZOnly;   //whether to consider only yz without directions.
158     Bool_t fNumericalParanoia; //!whether to perform additional checks for numerical stability
159     Bool_t fRejectOutliers; //!whether to do outlier rejection in the Kalman filter
160     Bool_t fRequireMatchInTPC;  //!when looking for a cosmic in event, require that TPC has 2 matching segments
161     Bool_t fCuts;    //!track cuts?
162     Int_t fMinPointsVol1;   //!mininum number of points in volume 1
163     Int_t fMinPointsVol2;   //!mininum number of points in volume 2
164     Double_t fMinMom;       //!min momentum of track for track cuts
165     Double_t fMaxMom;       //!max momentum of track for track cuts
166     Double_t fMaxMatchingAngle; //!cuts
167     Double_t fMaxMatchingDistance; //!cuts
168     Bool_t fCorrectionMode; //calculate corrective transform for TPC (or monitor actual TPC misal params)
169     
170     //Counters
171     Int_t fNTracks; //number of processed tracks
172     Int_t fNUpdates; //number of successful Kalman updates
173     Int_t fNOutliers; //number of outliers
174     Int_t fNMatchedCosmics; //number of cosmic events with matching tracklets (good cosmics)
175     Int_t fNMatchedTPCtracklets;//number of cosmic events with 2 matching TPC tracklets
176     Int_t fNProcessedEvents; //number of processed events
177     Int_t fTrackInBuffer; //!number of tracks in buffer
178     UInt_t fTimeStamp;    //time stamp
179     Int_t fRunNumber;    //run number
180
181     //TPC stuff
182     Double_t fTPCvd; //TPC drift velocity
183     Double_t fTPCZLengthA; //TPC length side A
184     Double_t fTPCZLengthC; //TPC length side C
185     
186     ClassDef(AliRelAlignerKalman,2)     //AliRelAlignerKalman class
187 };
188
189 #endif
190
191