Update of the TPC-ITS alignment code (Mikolaj)
[u/mrichter/AliRoot.git] / STEER / AliRelAlignerKalman.h
index 5fa2b81d5e4f0cfd6e0b5136699c0ea6f9d2cd54..95c5a5d2ba1025935eeb08b06bd3c584bccc0e94 100644 (file)
 //
 //////////////////////////////////////////////////////////////////////////////
 
-#include <iostream>
 #include <TMath.h>
+#include <TObject.h>
+#include <TVectorD.h>
 #include <TMatrix.h>
-#include <TVector.h>
-#include <TVector3.h>
-#include <TDecompLU.h>
-#include <TArrayI.h>
-#include <TH1D.h>
-#include <TF1.h>
 
-#include "AliESDtrack.h"
-#include "AliTrackPointArray.h"
-#include "AliGeomManager.h"
-#include "AliTrackFitterKalman.h"
-#include "AliTrackFitterRieman.h"
-#include "AliESDfriendTrack.h"
-#include "AliESDEvent.h"
-#include "AliESDVertex.h"
+class AliExternalTrackParam;
+class AliESDEvent;
+class AliESDtrack;
 
-class AliRelAlignerKalman {
+class AliRelAlignerKalman : public TObject {
 
 public:
     AliRelAlignerKalman();
-    virtual ~AliRelAlignerKalman() {}
+    virtual ~AliRelAlignerKalman();
+    AliRelAlignerKalman& operator= (const AliRelAlignerKalman& a );
+    AliRelAlignerKalman(const AliRelAlignerKalman& a);
 
     //User methods:
-    Bool_t AddESDTrack( AliESDtrack* pTrack );
-    Bool_t AddTrackPointArray( AliTrackPointArray* pTrackPointArr );
-    Bool_t AddCosmicEventSeparateTracking( AliESDEvent* pEvent );
+    Bool_t AddCosmicEvent( const AliESDEvent* pEvent );
+    Bool_t AddTrackParams( const AliExternalTrackParam* p1, const AliExternalTrackParam* p2 );
     
-    void Print();
-    void PrintCorrelationMatrix();
-
-    void GetMeasurementCov( TMatrixDSym& cov ) { cov = *fPMeasurementCov; }
-    void GetMeasurement( TVectorD& mes ) { mes = *fPMeasurement; }
-    void GetState( TVectorD& state ) { state = *fPX; }
-    void GetStateCov ( TMatrixDSym& cov ) { cov = *fPXcov; }
-    void GetSeed( TVectorD& seed, TMatrixDSym& seedCov ) { seed = *fPX; seedCov = *fPXcov; }
-    Double_t* GetStateArr() { return fPX->GetMatrixArray(); }
-    Double_t* GetStateCovArr() { return fPXcov->GetMatrixArray(); }
-    Double_t* GetMeasurementArr() { return fPMeasurement->GetMatrixArray(); }
-    Double_t* GetMeasurementCovArr() { return fPMeasurementCov->GetMatrixArray(); }
-    
-    Bool_t SetCalibrationPass( Bool_t cp=kTRUE );
-
-    //Experts only:
-    void SetOutRejSigma( const Double_t a=2. ) { fOutRejSigmas = a; }
-    void SetMeasurementCov( const TMatrixDSym& cov ) {*fPMeasurementCov = cov;}
+    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; }
-    void SetTrackParams1( const TVector3& point, const TMatrixDSym& pointcov, const TVector3& dir, const TMatrixDSym& dircov );
-    void SetTrackParams2( const TVector3& point, const TMatrixDSym& pointcov, const TVector3& dir, const TMatrixDSym& dircov );
-    void SetTrackParams2b( const TVector3& point, const TMatrixDSym& pointcov, const TVector3& dir, const TMatrixDSym& dircov );
-    void SetRefSurface( const TVector3& point, const TVector3& dir );
-    void SetRefSurface( const AliTrackPoint& point, const Bool_t horizontal=kTRUE );
-    void SetRefSurface( const Double_t y );
-    Bool_t PrepareUpdate();
+    Bool_t Merge( const AliRelAlignerKalman* al );
+
+    //Expert methods:
+    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 );
     Bool_t Update();
-    Bool_t IsReady() {return fFitted;}
+    void SetRefSurface( const Double_t x, const Double_t alpha );
+    void PrintCorrelationMatrix();
+    //void PrintCovarianceCorrection();
+    void PrintSystemMatrix();
+    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; }
+    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;}
+    Bool_t SetTrackParams( const AliExternalTrackParam* exparam1, const AliExternalTrackParam* exparam2 );
+    const AliExternalTrackParam* GetTrackParams1() const {return fPTrackParamArr1;}
+    const AliExternalTrackParam* GetTrackParams2() const {return fPTrackParamArr2;}
+    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 Set3TracksMode( Bool_t mode=kTRUE );
-    void SetCosmicEvent( Bool_t cosmic=kTRUE ) {Set3TracksMode(cosmic);}
-    void PrintDebugInfo();
+    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;}
     
 protected:
     Bool_t UpdateEstimateKalman();
-    Bool_t FillMeasurement();
-    Bool_t FillMeasurementMatrix();
+    Bool_t PrepareMeasurement();
+    Bool_t PrepareSystemMatrix();
+    Bool_t PreparePrediction();
     Bool_t PredictMeasurement( TVectorD& z, const TVectorD& x );
-    void GetThetaPhiCov( TMatrixDSym& cov, const TVector3& vec, const TMatrixDSym& vecCov );
-    void Angles( TVectorD &angles, const TMatrixD &rotmat );
-    void RotMat( TMatrixD& R, const TVectorD& angles );
-    Bool_t IntersectionLinePlane( TVector3& intersection, const TVector3& base, const TVector3& dir, const TVector3& p, const TVector3& n );
-    void TMatrixDSym_from_TMatrixD( TMatrixDSym& matsym, const TMatrixD& mat );
-    void SanitizeExtendedCovMatrix( TMatrixDSym& covout, const TMatrixDSym& pointcov, const TVector3& dir );
-    Bool_t ProcessTrackPointArrays();
-
-    Bool_t ExtractSubTrackPointArray( AliTrackPointArray* pTrackOut, TArrayI* pVolIDArrayOut, const AliTrackPointArray* pTrackIn, const Int_t firstlayer, const Int_t lastlayer );
-    Bool_t FitTrackPointArrayRieman( TVector3* pPoint, TMatrixDSym* pPointCov, TVector3* pDir, TMatrixDSym* pDirCov, AliTrackPointArray* pTrackPointArray, TArrayI* pVolIDs, AliTrackPoint* pRefPoint );
-    Bool_t FitTrackPointArrayKalman( TVector3* pPoint, TMatrixDSym* pPointCov, TVector3* pDir, TMatrixDSym* pDirCov, AliTrackPointArray* pTrackPointArray, TArrayI* pVolIDs, AliTrackPoint* pRefPoint );
-    Bool_t FindCosmicInEvent( AliESDEvent* pEvent );
-    void SortTrackPointArrayWithY( AliTrackPointArray* pout, const AliTrackPointArray* pin, const Bool_t descending=kFALSE );
-    void JoinTrackArrays( AliTrackPointArray* pout, const AliTrackPointArray* pin1, const AliTrackPointArray* pin2 );
-    Bool_t UpdateCalibration();
+    Bool_t IsOutlier( const TVectorD& update, const TMatrixDSym& covmatrix );
 
 private:
-    AliTrackPointArray* fPTrackPointArray1;  //track point array in first volume (ITS)
-    AliTrackPointArray* fPTrackPointArray2;  //track point array in second volume (TPC)
-    AliTrackPointArray* fPTrackPointArray2b; //optionally second trackpoint array in second volume (TPC)
-    TArrayI* fPVolIDArray1;                 //array with VolID's of the points in the trackpointarray 
-    TArrayI* fPVolIDArray2;                 //array with VolID's of the points in the trackpointarray
-    TArrayI* fPVolIDArray2b;                //array with VolID's of the points in the trackpointarray
-    TVector3* fPDir1;  //track 1 direction
-    TVector3* fPDir2;  //track 2 direction
-    TVector3* fPDir2b; //track 2b direction (for cosmics)
-    TMatrixDSym* fPDir1Cov;     //Covariance matrix of dir vec track 1
-    TMatrixDSym* fPDir2Cov;     //Covariance matrix of dir vec track 2
-    TMatrixDSym* fPDir2bCov;    //Covariance matrix of dir vec track 2b
-    TMatrixDSym* fPDir1ThetaPhiCov; //Covariance matrix of the dir vector in spherical coord (angles only)
-    TMatrixDSym* fPDir2ThetaPhiCov; //Covariance matrix of the dir vector in spherical coord (angles only)
-    TMatrixDSym* fPDir2bThetaPhiCov; //Covariance matrix of the dir vector in spherical coord (angles only)
-    TVector3* fPPoint1;  //track 1 extrapolated point at reference surface
-    TVector3* fPPoint2;  //track 2 extrapolated point at reference surface
-    TVector3* fPPoint2b; //track 2b extrapol. (for cosmics)
-    TMatrixDSym* fPPoint1Cov; //covariance matrix of point 1
-    TMatrixDSym* fPPoint2Cov; //covariance matrix of point 2
-    TMatrixDSym* fPPoint2bCov; //covariance matrix of point 2b
-    TVector3* fPRefPoint;    //a point on the reference surface
-    TVector3* fPRefPointDir; //reference surfaces' direction vec
-    AliTrackPoint* fPRefAliTrackPoint; //reference point as an AliTrackPoint (orientation stored in cov matrix)
-    TMatrixD* fPRotMat; // system rotation matrix for estimated alignment angles
+    static const Int_t fgkNTracksPerMeasurement=1;        //how many tracks for one update
+    static const Int_t fgkNMeasurementParams=4;           //how many measurables
+    static const Int_t fgkNSystemParams=9;                //how many fit parameters
     
-    //
+    //Track parameters
+    Double_t fAlpha;       //!rotation angle between the local and global coordinate system like in AliExternalTrackParam
+    Double_t fLocalX;      //!local x coordinate of reference plane = r(global)
+    AliExternalTrackParam* fPTrackParamArr1;   //!local track parameters
+    AliExternalTrackParam* fPTrackParamArr2;   //!local track parameters
+    Double_t fMagField; //!magnetic field
+
     //Kalman filter related stuff
-    //
     TVectorD* fPX; //System (fit) parameters (phi, theta, psi, x, y, z, driftcorr, driftoffset )
     TMatrixDSym* fPXcov; //covariance matrix of system parameters
-
-    TMatrixD* fPH;      //System measurement matrix
-    Double_t fQ;        //measure for system noise
-    
-    TVectorD* fPMeasurement; //the measurement vec for Kalman filter (theta,phi,x,z)
-    TMatrixDSym* fPMeasurementCov; //measurement vec cvariance
-
-    Int_t fNMeasurementParams; //how many numbers do we measure?
-    Int_t fNSystemParams;      //how many parameters do we fit?
-
+    TMatrixD* fPH;      //!System measurement matrix
+    Double_t fQ;        //!measure for system noise
+    TVectorD* fPMeasurement; //!the measurement vec for Kalman filter (theta,phi,x,z)
+    TMatrixDSym* fPMeasurementCov; //!measurement vec cvariance
+    TVectorD* fPMeasurementPrediction; //!prediction of the measurement
     Double_t fOutRejSigmas; //number of sigmas for outlier rejection
-    //
-    //
-    //
-
-    Bool_t f3TracksMode; //are we using 3 tracklets?
-    Bool_t fSortTrackPointsWithY; //whether to sort the points after processing
-    Bool_t fFixedMeasurementCovariance; //don't fiddle with measurement cov - supply it externally
-    Bool_t fCalibrationPass;
-    Bool_t fCalibrationUpdated;
+    Double_t* fDelta; //array with differentials for calculating derivatives for every parameter(see PrepareSystemMatrix())
+
+    //Control
+    Bool_t fNumericalParanoia; //!whether to perform additional checks for numerical stability
+    Bool_t fRejectOutliers; //!whether to do outlier rejection in the Kalman filter
+    Bool_t fRequireMatchInTPC;  //!when looking for a cosmic in event, require that TPC has 2 matching segments
+    Bool_t fCuts;    //!track cuts?
+    Int_t fMinPointsVol1;   //!mininum number of points in volume 1
+    Int_t fMinPointsVol2;   //!mininum number of points in volume 2
+    Double_t fMinMom;       //!min momentum of track for track cuts
+    Double_t fMaxMom;       //!max momentum of track for track cuts
+    Double_t fMaxMatchingAngle; //!cuts
+    Double_t fMaxMatchingDistance; //!cuts
+    Bool_t fCorrectionMode; //calculate corrective transform for TPC (or monitor actual TPC misal params)
     
-    Bool_t fFitted; //did fitting finish without error?
-    Bool_t fCuts;    //track cuts?
-
+    //Counters
     Int_t fNTracks; //number of processed tracks
-    Int_t fNUpdates; //number of successful Kalman update
+    Int_t fNUpdates; //number of successful Kalman updates
     Int_t fNOutliers; //number of outliers
-    Int_t fNUnfitted; //number of trackpointarrays that were not fitted for some reason
-    Int_t fNMatchedCosmics; //number of matched tracklets for cosmics
-
-    Int_t fMinPointsVol1;   //mininum number of points in volume 1
-    Int_t fMinPointsVol2;   //mininum number of points in volume 2
-    Double_t fMinMom;       //min momentum of track for track cuts
-    Double_t fMaxMom;       //max momentum of track for track cuts
-    Double_t fMinAbsSinPhi; //more cuts
-    Double_t fMaxAbsSinPhi; //more cuts
-    Double_t fMinSinTheta;  //cuts
-    Double_t fMaxSinTheta;  //cuts
-    Double_t fMaxMatchingAngle; //cuts
-    Double_t fMaxMatchingDistance; //cuts
-    Int_t fFirstLayerVol1; //first layer of volume 1
-    Int_t fLastLayerVol1;  //last layer of volume 1
-    Int_t fFirstLayerVol2; //first layer of volume 2
-    Int_t fLastLayerVol2;  //last layer of volume 2
-
-    TVector3 * fPVec010; //vector pointing up
-
-    //Control and calibration histograms
-    TH1D* fPXMesHist;  //histo of x measurement
-    TH1D* fPZMesHist;  //histo of y measurement
-    TH1D* fPPhiMesHist; //histo of phi measurement
-    TH1D* fPThetaMesHist; //histo of theta measurement
-    TH1D* fPXMesHist2;  //histo of x measurement (3tracks mode)
-    TH1D* fPZMesHist2;  //histo of y measurement (3tracks mode)
-    TH1D* fPPhiMesHist2; //histo of phi measurement (3tracks mode)
-    TH1D* fPThetaMesHist2; //histo of theta measurement (3tracks mode)
-    TH1D* fPMesCov11Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TH1D* fPMesCov22Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TH1D* fPMesCov33Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TH1D* fPMesCov44Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TH1D* fPMesCov55Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TH1D* fPMesCov66Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TH1D* fPMesCov77Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TH1D* fPMesCov88Hist;  //histogram of the covariance of a fit parameter, used in calibration
-    TMatrixDSym* fPMeasurementCovCorr; //correction to be applied to the measurement covariance
-    
-    static const Int_t fgkNMeasurementParams2TrackMode = 4; //how many measurables in 2 track mode
-    static const Int_t fgkNMeasurementParams3TrackMode = 8; //how many measurables in 3 track mode
-    static const Int_t fgkNSystemParams = 8;                //how many fit parameters
+    Int_t fNMatchedCosmics; //number of cosmic events with matching tracklets (good cosmics)
+    Int_t fNMatchedTPCtracklets;//number of cosmic events with 2 matching TPC tracklets
+    Int_t fNProcessedEvents; //number of processed events
+    Int_t fTrackInBuffer; //!number of tracks in buffer
+    UInt_t fTimeStamp;
+
+    //TPC stuff
+    Double_t fTPCvd; //TPC drift velocity
+    Double_t fTPCZLengthA; //TPC length side A
+    Double_t fTPCZLengthC; //TPC length side C
     
-    AliRelAlignerKalman& operator= (const AliRelAlignerKalman& aligner );
-    AliRelAlignerKalman(const AliRelAlignerKalman&);
-
     ClassDef(AliRelAlignerKalman,1)     //AliRelAlignerKalman class
 };
 
 #endif
+