#ifndef ALIRELALIGNERKALMAN_H
#define ALIRELALIGNERKALMAN_H
#include <TMath.h>
#include <TVectorD.h>
#include <TMatrix.h>
class TObject;
class AliExternalTrackParam;
class AliESDEvent;
class AliESDtrack;
class TArrayI;
class TObjArray;
class AliRelAlignerKalman : public TObject {
public:
AliRelAlignerKalman();
virtual ~AliRelAlignerKalman();
AliRelAlignerKalman& operator= (const AliRelAlignerKalman& a );
AliRelAlignerKalman(const AliRelAlignerKalman& a);
Bool_t AddCosmicEvent( const AliESDEvent* pEvent );
Bool_t AddTrackParams( const AliExternalTrackParam* p1, const AliExternalTrackParam* p2 );
void Print(Option_t* option="") const;
Double_t GetPsi() const {return (*fPX)(0);}
Double_t GetTheta() const {return (*fPX)(1);}
Double_t GetPhi() const {return (*fPX)(2);}
Double_t GetX() const {return (*fPX)(3);}
Double_t GetY() const {return (*fPX)(4);}
Double_t GetZ() const {return (*fPX)(5);}
Double_t GetTPCvdCorr() const {return (*fPX)(6);}
Double_t GetTPCt0() const {return (*fPX)(7);}
Double_t GetTPCvdY() const {if (fgkNSystemParams>8) return (*fPX)(8); else return 0.0;}
Double_t GetPsiErr() const {return TMath::Sqrt((*fPXcov)(0,0));}
Double_t GetThetaErr() const {return TMath::Sqrt((*fPXcov)(1,1));}
Double_t GetPhiErr() const {return TMath::Sqrt((*fPXcov)(2,2));}
Double_t GetXErr() const {return TMath::Sqrt((*fPXcov)(3,3));}
Double_t GetYErr() const {return TMath::Sqrt((*fPXcov)(4,4));}
Double_t GetZErr() const {return TMath::Sqrt((*fPXcov)(5,5));}
Double_t GetTPCvdCorrErr() const {return TMath::Sqrt((*fPXcov)(6,6));}
Double_t GetTPCt0Err() const {return TMath::Sqrt((*fPXcov)(7,7));}
Double_t GetTPCvdYErr() const {if (fgkNSystemParams>8) return TMath::Sqrt((*fPXcov)(8,8)); else return 0.0;}
void GetMeasurement( TVectorD& mes ) const { mes = *fPMeasurement; }
TVectorD* GetMeasurement() { return fPMeasurement; }
void GetMeasurementCov( TMatrixDSym& cov ) const { cov = *fPMeasurementCov; }
void SetMeasurement( const TVectorD& mes ) {*fPMeasurement = mes;}
void SetMeasurementCov( const TMatrixDSym& cov ) {*fPMeasurementCov = cov;}
TMatrixDSym* GetMeasurementCov() const { return fPMeasurementCov; }
void GetState( TVectorD& state ) const { state = *fPX; }
TVectorD* GetState() const { return fPX; }
void GetStateCov ( TMatrixDSym& cov ) const { cov = *fPXcov; }
void SetState( const TVectorD& param ) {*fPX = param;}
void SetStateCov (const TMatrixDSym& cov ) {*fPXcov = cov;}
TMatrixDSym* GetStateCov() const { return fPXcov; }
void GetSeed( TVectorD& seed, TMatrixDSym& seedCov ) const { seed = *fPX; seedCov = *fPXcov; }
void SetSeed( const TVectorD& seed, const TMatrixDSym& seedCov ) {*fPX = seed; *fPXcov = seedCov; }
Bool_t Merge( const AliRelAlignerKalman* al );
Long64_t Merge( TCollection* list );
Bool_t AddESDevent( const AliESDEvent* pEvent );
Bool_t AddESDtrack( const AliESDtrack* pTrack );
void SetMagField( const Double_t f ) { fMagField=f; }
Double_t GetMagField() const { return fMagField; }
Bool_t FindCosmicTrackletNumbersInEvent( TArrayI& outITStracksTArr, TArrayI& outTPCtracksTArr, const AliESDEvent* pEvent );
Int_t FindMatchingTracks(TObjArray& arrITS, TObjArray& arrTPC, AliESDEvent* pESD);
Bool_t Update();
void PrintCorrelationMatrix();
void PrintSystemMatrix();
Int_t CheckCovariance();
void Reset();
void ResetCovariance( const Double_t number=0. );
void ResetTPCparamsCovariance( const Double_t number=0. );
Double_t* GetStateArr() const { return fPX->GetMatrixArray(); }
Double_t* GetStateCovArr() const { return fPXcov->GetMatrixArray(); }
Double_t* GetMeasurementArr() const { return fPMeasurement->GetMatrixArray(); }
Double_t* GetMeasurementCovArr() const { return fPMeasurementCov->GetMatrixArray(); }
TMatrixD* GetH() const { return fPH; }
TVectorD* GetMeasurementPrediction() const {return fPMeasurementPrediction;}
const Double_t* GetDeltaArr() const {return fDelta;}
void SetNumericalParanoia( const Bool_t mode=kFALSE ) { fNumericalParanoia=mode; }
void SetCorrectionMode( const Bool_t mode=kTRUE ) { fCorrectionMode=mode; }
void SetOutRejSigma( const Double_t a=2. ) { fOutRejSigmas = a; }
void SetRejectOutliers( const Bool_t r=kTRUE ) {fRejectOutliers = r;}
void SetRejectOutliersSigma2Median( const Bool_t b=kTRUE );
void SetOutRejSigma2Median( const Double_t s ) {fOutRejSigma2Median = s;}
Bool_t SetTrackParams( const AliExternalTrackParam* exparam1, const AliExternalTrackParam* exparam2 );
const AliExternalTrackParam* GetTrackParams1() const {return fPTrackParam1;}
const AliExternalTrackParam* GetTrackParams2() const {return fPTrackParam2;}
void SetMinPointsVol1( const Int_t min ) {fMinPointsVol1=min;}
void SetMinPointsVol2( const Int_t min ) {fMinPointsVol2=min;}
void SetRequireMatchInTPC( const Bool_t s=kTRUE ) {fRequireMatchInTPC = s;}
void SetQ( const Double_t Q = 1e-10 ) { fQ = Q; }
void SetMaxMatchingDistance( const Double_t m ) {fMaxMatchingDistance=m;}
void SetMaxMatchingAngle( const Double_t m ) {fMaxMatchingAngle=m;}
void SetTPCvd( const Float_t v ) {fTPCvd=v;}
void SetTPCZLengthA( const Double_t l ) {fTPCZLengthA=l;}
void SetTPCZLengthC( const Double_t l ) {fTPCZLengthC=l;}
Bool_t CorrectTrack( AliExternalTrackParam* tr, const TVectorD& misalignment ) const;
Bool_t MisalignTrack( AliExternalTrackParam* tr, const TVectorD& misalignment ) const;
static void Angles( TVectorD &angles, const TMatrixD &rotmat );
static void RotMat( TMatrixD& R, const TVectorD& angles );
static void TMatrixDSymFromTMatrixD( TMatrixDSym& matsym, const TMatrixD& mat );
Bool_t IsPositiveDefinite( const TMatrixD& mat ) const;
void SetTimeStamp( const UInt_t ts ) { fTimeStamp = ts; }
UInt_t GetTimeStamp() const {return fTimeStamp;}
void SetRunNumber( const Int_t rn ) { fRunNumber = rn; }
Int_t GetRunNumber() const {return fRunNumber;}
Int_t Compare(const TObject *obj) const;
Bool_t IsSortable() const { return kTRUE; }
Int_t GetNTracks() const {return fNTracks;}
Int_t GetNUpdates() const {return fNUpdates;}
Int_t GetNOutliers() const {return fNOutliers;}
Int_t GetNOutliersSigma2Median() const {return fNOutliersSigma2Median;}
Int_t GetNMerges() const {return fNMerges;}
Int_t GetNMergesFailed() const {return fNMergesFailed;}
void SetPoint2Track( Bool_t o );
protected:
Bool_t UpdateEstimateKalman();
Bool_t PrepareMeasurement();
Bool_t PrepareSystemMatrix();
Bool_t PreparePrediction();
Bool_t PredictMeasurement( TVectorD& z, const TVectorD& x );
Bool_t IsOutlier( const TVectorD& update, const TMatrixDSym& covmatrix );
Bool_t IsOutlierSigma2Median( const AliExternalTrackParam* pITS, const AliExternalTrackParam* pTPC );
private:
static const Int_t fgkNSystemParams=9;
static const Int_t fgkNtracksSigma2Median=500;
AliExternalTrackParam* fPTrackParam1;
AliExternalTrackParam* fPTrackParam2;
Double_t fMagField;
Int_t fNMeasurementParams;
TVectorD* fPX;
TMatrixDSym* fPXcov;
TMatrixD* fPH;
Double_t fQ;
TVectorD* fPMeasurement;
TMatrixDSym* fPMeasurementCov;
TVectorD* fPMeasurementPrediction;
Double_t fOutRejSigmas;
Double_t fOutRejSigma2Median;
Double_t fDelta[fgkNSystemParams];
Double_t* fResArrSigma2Median[4];
Bool_t fYZOnly;
Bool_t fNumericalParanoia;
Bool_t fRejectOutliers;
Bool_t fRejectOutliersSigma2Median;
Bool_t fRequireMatchInTPC;
Bool_t fCuts;
Int_t fMinPointsVol1;
Int_t fMinPointsVol2;
Double_t fMinPt;
Double_t fMaxPt;
Double_t fMaxMatchingAngle;
Double_t fMaxMatchingDistance;
Bool_t fCorrectionMode;
Int_t fNTracks;
Int_t fNUpdates;
Int_t fNOutliers;
Int_t fNOutliersSigma2Median;
Int_t fNMatchedCosmics;
Int_t fNMatchedTPCtracklets;
Int_t fNProcessedEvents;
UInt_t fTimeStamp;
Int_t fRunNumber;
Int_t fNMerges;
Int_t fNMergesFailed;
Double_t fTPCvd;
Double_t fTPCZLengthA;
Double_t fTPCZLengthC;
ClassDef(AliRelAlignerKalman,4)
};
#endif
AliRelAlignerKalman.h:100 AliRelAlignerKalman.h:101 AliRelAlignerKalman.h:102 AliRelAlignerKalman.h:103 AliRelAlignerKalman.h:104 AliRelAlignerKalman.h:105 AliRelAlignerKalman.h:106 AliRelAlignerKalman.h:107 AliRelAlignerKalman.h:108 AliRelAlignerKalman.h:109 AliRelAlignerKalman.h:110 AliRelAlignerKalman.h:111 AliRelAlignerKalman.h:112 AliRelAlignerKalman.h:113 AliRelAlignerKalman.h:114 AliRelAlignerKalman.h:115 AliRelAlignerKalman.h:116 AliRelAlignerKalman.h:117 AliRelAlignerKalman.h:118 AliRelAlignerKalman.h:119 AliRelAlignerKalman.h:120 AliRelAlignerKalman.h:121 AliRelAlignerKalman.h:122 AliRelAlignerKalman.h:123 AliRelAlignerKalman.h:124 AliRelAlignerKalman.h:125 AliRelAlignerKalman.h:126 AliRelAlignerKalman.h:127 AliRelAlignerKalman.h:128 AliRelAlignerKalman.h:129 AliRelAlignerKalman.h:130 AliRelAlignerKalman.h:131 AliRelAlignerKalman.h:132 AliRelAlignerKalman.h:133 AliRelAlignerKalman.h:134 AliRelAlignerKalman.h:135 AliRelAlignerKalman.h:136 AliRelAlignerKalman.h:137 AliRelAlignerKalman.h:138 AliRelAlignerKalman.h:139 AliRelAlignerKalman.h:140 AliRelAlignerKalman.h:141 AliRelAlignerKalman.h:142 AliRelAlignerKalman.h:143 AliRelAlignerKalman.h:144 AliRelAlignerKalman.h:145 AliRelAlignerKalman.h:146 AliRelAlignerKalman.h:147 AliRelAlignerKalman.h:148 AliRelAlignerKalman.h:149 AliRelAlignerKalman.h:150 AliRelAlignerKalman.h:151 AliRelAlignerKalman.h:152 AliRelAlignerKalman.h:153 AliRelAlignerKalman.h:154 AliRelAlignerKalman.h:155 AliRelAlignerKalman.h:156 AliRelAlignerKalman.h:157 AliRelAlignerKalman.h:158 AliRelAlignerKalman.h:159 AliRelAlignerKalman.h:160 AliRelAlignerKalman.h:161 AliRelAlignerKalman.h:162 AliRelAlignerKalman.h:163 AliRelAlignerKalman.h:164 AliRelAlignerKalman.h:165 AliRelAlignerKalman.h:166 AliRelAlignerKalman.h:167 AliRelAlignerKalman.h:168 AliRelAlignerKalman.h:169 AliRelAlignerKalman.h:170 AliRelAlignerKalman.h:171 AliRelAlignerKalman.h:172 AliRelAlignerKalman.h:173 AliRelAlignerKalman.h:174 AliRelAlignerKalman.h:175 AliRelAlignerKalman.h:176 AliRelAlignerKalman.h:177 AliRelAlignerKalman.h:178 AliRelAlignerKalman.h:179 AliRelAlignerKalman.h:180 AliRelAlignerKalman.h:181 AliRelAlignerKalman.h:182 AliRelAlignerKalman.h:183 AliRelAlignerKalman.h:184 AliRelAlignerKalman.h:185 AliRelAlignerKalman.h:186 AliRelAlignerKalman.h:187 AliRelAlignerKalman.h:188 AliRelAlignerKalman.h:189 AliRelAlignerKalman.h:190 AliRelAlignerKalman.h:191 AliRelAlignerKalman.h:192 AliRelAlignerKalman.h:193 AliRelAlignerKalman.h:194 AliRelAlignerKalman.h:195 AliRelAlignerKalman.h:196 AliRelAlignerKalman.h:197 AliRelAlignerKalman.h:198 AliRelAlignerKalman.h:199 AliRelAlignerKalman.h:200 AliRelAlignerKalman.h:201 AliRelAlignerKalman.h:202 AliRelAlignerKalman.h:203 AliRelAlignerKalman.h:204 AliRelAlignerKalman.h:205 AliRelAlignerKalman.h:206