1 #ifndef ALIRELALIGNERKALMAN_H
2 #define ALIRELALIGNERKALMAN_H
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * See cxx source for full Copyright notice */
7 ///////////////////////////////////////////////////////////////////////////////
9 // Relative alignment of two tracking volumes (default ITS and TPC)
10 // (see AliRelAlignerKalman.cxx for details)
12 // Origin: Mikolaj Krzewicki, Nikhef, Mikolaj.Krzewicki@cern.ch
14 //////////////////////////////////////////////////////////////////////////////
21 class AliExternalTrackParam;
25 class AliRelAlignerKalman : public TObject {
28 AliRelAlignerKalman();
29 virtual ~AliRelAlignerKalman();
30 AliRelAlignerKalman& operator= (const AliRelAlignerKalman& a );
31 AliRelAlignerKalman(const AliRelAlignerKalman& a);
34 Bool_t AddCosmicEvent( const AliESDEvent* pEvent );
36 void Print(Option_t* option="") const;
38 Double_t GetPsi() const {return (*fPX)(0);}
39 Double_t GetTheta() const {return (*fPX)(1);}
40 Double_t GetPhi() const {return (*fPX)(2);}
41 Double_t GetX() const {return (*fPX)(3);}
42 Double_t GetY() const {return (*fPX)(4);}
43 Double_t GetZ() const {return (*fPX)(5);}
44 Double_t GetTPCvdCorr() const {return (*fPX)(6);}
45 Double_t GetTPCt0() const {return (*fPX)(7);}
46 Double_t GetTPCvdY() const {if (fgkNSystemParams>8) return (*fPX)(8); else return 0.0;}
47 Double_t GetPsiErr() const {return TMath::Sqrt((*fPXcov)(0,0));}
48 Double_t GetThetaErr() const {return TMath::Sqrt((*fPXcov)(1,1));}
49 Double_t GetPhiErr() const {return TMath::Sqrt((*fPXcov)(2,2));}
50 Double_t GetXErr() const {return TMath::Sqrt((*fPXcov)(3,3));}
51 Double_t GetYErr() const {return TMath::Sqrt((*fPXcov)(4,4));}
52 Double_t GetZErr() const {return TMath::Sqrt((*fPXcov)(5,5));}
53 Double_t GetTPCvdCorrErr() const {return TMath::Sqrt((*fPXcov)(6,6));}
54 Double_t GetTPCt0Err() const {return TMath::Sqrt((*fPXcov)(7,7));}
55 Double_t GetTPCvdYErr() const {if (fgkNSystemParams>8) return TMath::Sqrt((*fPXcov)(8,8)); else return 0.0;}
56 void GetMeasurement( TVectorD& mes ) const { mes = *fPMeasurement; }
57 TVectorD* GetMeasurement() { return fPMeasurement; }
58 void GetMeasurementCov( TMatrixDSym& cov ) const { cov = *fPMeasurementCov; }
59 void SetMeasurement( const TVectorD& mes ) {*fPMeasurement = mes;}
60 void SetMeasurementCov( const TMatrixDSym& cov ) {*fPMeasurementCov = cov;}
61 TMatrixDSym* GetMeasurementCov() const { return fPMeasurementCov; }
62 void GetState( TVectorD& state ) const { state = *fPX; }
63 TVectorD* GetState() const { return fPX; }
64 void GetStateCov ( TMatrixDSym& cov ) const { cov = *fPXcov; }
65 void SetState( const TVectorD& param ) {*fPX = param;}
66 void SetStateCov (const TMatrixDSym& cov ) {*fPXcov = cov;}
67 TMatrixDSym* GetStateCov() const { return fPXcov; }
68 void GetSeed( TVectorD& seed, TMatrixDSym& seedCov ) const { seed = *fPX; seedCov = *fPXcov; }
69 void SetSeed( const TVectorD& seed, const TMatrixDSym& seedCov ) {*fPX = seed; *fPXcov = seedCov; }
72 Bool_t AddESDevent( const AliESDEvent* pEvent );
73 Bool_t AddESDtrack( const AliESDtrack* pTrack );
74 void SetMagField( const Double_t f ) { fMagField=f; }
75 Double_t GetMagField() const { return fMagField; }
76 Bool_t FindCosmicTrackletNumbersInEvent( TArrayI& outITStracksTArr, TArrayI& outTPCtracksTArr, const AliESDEvent* pEvent );
78 void SetRefSurface( const Double_t x, const Double_t alpha );
79 void PrintCorrelationMatrix();
80 //void PrintCovarianceCorrection();
81 void PrintSystemMatrix();
83 void ResetCovariance( const Double_t number=0. );
84 void ResetTPCparamsCovariance( const Double_t number=0. );
85 Double_t* GetStateArr() const { return fPX->GetMatrixArray(); }
86 Double_t* GetStateCovArr() const { return fPXcov->GetMatrixArray(); }
87 Double_t* GetMeasurementArr() const { return fPMeasurement->GetMatrixArray(); }
88 Double_t* GetMeasurementCovArr() const { return fPMeasurementCov->GetMatrixArray(); }
89 TMatrixD* GetH() const { return fPH; }
90 const Double_t* GetDeltaArr() const {return fDelta;}
91 void SetNumericalParanoia( const Bool_t mode=kFALSE ) { fNumericalParanoia=mode; }
92 void SetCorrectionMode( const Bool_t mode=kTRUE ) { fCorrectionMode=mode; }
93 void SetOutRejSigma( const Double_t a=2. ) { fOutRejSigmas = a; }
94 void SetRejectOutliers( const Bool_t r=kTRUE ) {fRejectOutliers = r;}
95 Bool_t SetTrackParams( const AliExternalTrackParam* exparam1, const AliExternalTrackParam* exparam2 );
96 const AliExternalTrackParam* GetTrackParams1() const {return fPTrackParamArr1;}
97 const AliExternalTrackParam* GetTrackParams2() const {return fPTrackParamArr2;}
98 void SetMinPointsVol1( const Int_t min ) {fMinPointsVol1=min;}
99 void SetMinPointsVol2( const Int_t min ) {fMinPointsVol2=min;}
100 void SetRequireMatchInTPC( const Bool_t s=kTRUE ) {fRequireMatchInTPC = s;}
101 void SetQ( const Double_t Q = 1e-10 ) { fQ = Q; }
102 void SetMaxMatchingDistance( const Double_t m ) {fMaxMatchingDistance=m;}
103 void SetMaxMatchingAngle( const Double_t m ) {fMaxMatchingAngle=m;}
104 void SetTPCvd( const Float_t v ) {fTPCvd=v;}
105 void SetTPCZLengthA( const Double_t l ) {fTPCZLengthA=l;}
106 void SetTPCZLengthC( const Double_t l ) {fTPCZLengthC=l;}
107 Bool_t CorrectTrack( AliExternalTrackParam* tr, const TVectorD& misalignment ) const;
108 Bool_t MisalignTrack( AliExternalTrackParam* tr, const TVectorD& misalignment ) const;
109 static void Angles( TVectorD &angles, const TMatrixD &rotmat );
110 static void RotMat( TMatrixD& R, const TVectorD& angles );
111 static void TMatrixDSymFromTMatrixD( TMatrixDSym& matsym, const TMatrixD& mat );
112 Bool_t IsPositiveDefinite( const TMatrixD& mat ) const;
115 Bool_t UpdateEstimateKalman();
116 Bool_t PrepareMeasurement();
117 Bool_t PrepareSystemMatrix();
118 Bool_t PredictMeasurement( TVectorD& z, const TVectorD& x );
119 Bool_t IsOutlier( const TVectorD& update, const TMatrixDSym& covmatrix );
122 static const Int_t fgkNTracksPerMeasurement=1; //how many tracks for one update
123 static const Int_t fgkNMeasurementParams=4; //how many measurables
124 static const Int_t fgkNSystemParams=9; //how many fit parameters
127 Double_t fAlpha; //!rotation angle between the local and global coordinate system like in AliExternalTrackParam
128 Double_t fLocalX; //!local x coordinate of reference plane = r(global)
129 AliExternalTrackParam* fPTrackParamArr1; //!local track parameters
130 AliExternalTrackParam* fPTrackParamArr2; //!local track parameters
131 Double_t fMagField; //magnetic field
133 //Kalman filter related stuff
134 TVectorD* fPX; //System (fit) parameters (phi, theta, psi, x, y, z, driftcorr, driftoffset )
135 TMatrixDSym* fPXcov; //covariance matrix of system parameters
136 TMatrixD* fPH; //!System measurement matrix
137 Double_t fQ; //!measure for system noise
138 TVectorD* fPMeasurement; //!the measurement vec for Kalman filter (theta,phi,x,z)
139 TMatrixDSym* fPMeasurementCov; //!measurement vec cvariance
140 Double_t fOutRejSigmas; //number of sigmas for outlier rejection
141 Double_t* fDelta; //array with differentials for calculating derivatives for every parameter(see PrepareSystemMatrix())
144 Bool_t fNumericalParanoia; //whether to perform additional checks for numerical stability
145 Bool_t fRejectOutliers; //whether to do outlier rejection in the Kalman filter
146 Bool_t fRequireMatchInTPC; //when looking for a cosmic in event, require that TPC has 2 matching segments
147 Bool_t fCuts; //track cuts?
148 Int_t fMinPointsVol1; //mininum number of points in volume 1
149 Int_t fMinPointsVol2; //mininum number of points in volume 2
150 Double_t fMinMom; //min momentum of track for track cuts
151 Double_t fMaxMom; //max momentum of track for track cuts
152 Double_t fMaxMatchingAngle; //cuts
153 Double_t fMaxMatchingDistance; //cuts
154 Bool_t fCorrectionMode; //calculate corrective transform for TPC (or monitor actual TPC misal params)
157 Int_t fNTracks; //number of processed tracks
158 Int_t fNUpdates; //number of successful Kalman updates
159 Int_t fNOutliers; //number of outliers
160 Int_t fNMatchedCosmics; //number of cosmic events with matching tracklets (good cosmics)
161 Int_t fNMatchedTPCtracklets;//number of cosmic events with 2 matching TPC tracklets
162 Int_t fNProcessedEvents; //number of processed events
163 Int_t fTrackInBuffer; //number of tracks in buffer
166 Double_t fTPCvd; //TPC drift velocity
167 Double_t fTPCZLengthA; //TPC length side A
168 Double_t fTPCZLengthC; //TPC length side C
170 ClassDef(AliRelAlignerKalman,1) //AliRelAlignerKalman class