ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/*
  TPC Kalman filter implementation for time dependent variables:


The drift velocity and the gas gain are changing in time.
The drift velocity and gas gain is a function of many parameters, but not all of 
them are known. We assume that the most important parameters are pressure and temperature
and the influence of other parameters (gas composition, and electric field) are only 
slowly varying in time and can be expressed by smooth function $x_{off}(t)$:
\begin{equation}
x(t) = x_{off}(t)+k_N\frac{\Delta{P/T}}{P/T}	
\end{equation}
where x(t) is the parameter which we observe.
\begin{equation}
\begin{split}
x(t)=\frac{\Delta{G}}{G_0}	\\
x(t)=\frac{\Delta{v_d}}{v_{d0}}	
\end{split}
\end{equation}

Kalman filter parameters are following:
\begin{itemize}
\item State vector  ($x_{off}(t)$, $k_N$) at given time
\item Covariance matrix
\end{itemize}

Kalman filter implent following functions:
\begin{itemize}
\item Prediction - adding covariance element $\sigma_{xoff}$
\item Update state vector with new measurement vector ($x_t,\frac{\Delta{P/T}}{P/T}$)
\end{itemize}


*/

#include "AliTPCkalmanTime.h"
#include "TTreeStream.h"
#include "TRandom.h"


AliTPCkalmanTime::AliTPCkalmanTime():
  TNamed(),
  fState(0),
  fCovariance(0),
  fTime(0)
{
  //
  // Default constructor
  //
}

AliTPCkalmanTime::AliTPCkalmanTime(Double_t time, Double_t xoff, Double_t k, Double_t sigmaxoff, Double_t sigmak): 
  TNamed(),
  fState(0),
  fCovariance(0),
  fTime(0)
{
  //
  // Default constructor
  //
  Init(time,xoff,k,sigmaxoff,sigmak);
}


void AliTPCkalmanTime::Init(Double_t time, Double_t xoff, Double_t k, Double_t sigmaxoff, Double_t sigmak){
  //
  // Default constructor
  //
  fState = new TMatrixD(2,1);
  fCovariance = new TMatrixD(2,2);
  (*fState)(0,0)= xoff;  // offset
  (*fState)(1,0)= k;     // slope of the taylor
  fTime=time;
  (*fCovariance)(0,0)=sigmaxoff*sigmaxoff;
  (*fCovariance)(1,1)=sigmak*sigmak;
  (*fCovariance)(0,1)=0;
  (*fCovariance)(1,0)=0;
}


void AliTPCkalmanTime::Propagate(Double_t time, Double_t sigma, TTreeSRedirector *debug){
  //
  // Propagate the Kalman
  //
  if (!fCovariance) return;
  if (!fState) return;
  Double_t deltaT  =time-fTime;  //delta time - param2 is the current time
  Double_t sigmaT2 =(deltaT*deltaT)*sigma*sigma; 
  if (debug){
    (*debug)<<"matP"<<
      "time="<<time<<
      "fTime="<<fTime<<
      "sigmaT2="<<sigmaT2<<
      "cov.="<<fCovariance<<
      "\n";
  }
  (*fCovariance)(0,0)+=sigmaT2;
  fTime=time;  
}

void  AliTPCkalmanTime::Update(Double_t x, Double_t xerr, Double_t ptratio,TTreeSRedirector *debug){
  //
  //
  //
  static TMatrixD matHk(1,2);    // vector to mesurement
  static TMatrixD measR(1,1);    // measurement error 
  static TMatrixD matQk(2,2);    // prediction noise vector
  static TMatrixD vecZk(1,1);    // measurement
  //
  static TMatrixD vecYk(1,1);    // Innovation or measurement residual
  static TMatrixD matHkT(2,1);
  static TMatrixD matSk(1,1);    // Innovation (or residual) covariance
  static TMatrixD matKk(2,1);    // Optimal Kalman gain
  static TMatrixD mat1(2,2);     // update covariance matrix
  static TMatrixD covXk2(2,2);
  //
  //
  TMatrixD covXk(*fCovariance);    // X covariance 
  TMatrixD vecXk(*fState);         // X vector
  //
  vecZk(0,0) = x;                // current mesurement
  measR(0,0) = xerr*xerr;        // measurement error                      
  matHk(0,0)=1;  matHk(0,1)= ptratio; 
  vecYk = vecZk-matHk*vecXk;     // Innovation or measurement residual
  //
  //
  matHkT=matHk.T(); matHk.T();
  matSk = (matHk*(covXk*matHkT))+measR;    // Innovation (or residual) covariance
  matSk.Invert();
  matKk = (covXk*matHkT)*matSk;            //  Optimal Kalman gain
  vecXk += matKk*vecYk;                    //  updated vector 
  mat1(0,0)=1; mat1(1,1)=1; 
  mat1(1,0)=0; mat1(0,1)=0;
  covXk2= (mat1-(matKk*matHk));
  //
  //
  //
  covXk =  covXk2*covXk;    
  //
  if (debug){
    (*debug)<<"matU"<<
      "time="<<fTime<<
      "x="<<x<<
      "xerr="<<xerr<<
      "pt="<<ptratio<<
      "matHk.="<<&matHk<<
      "matHkT.="<<&matHkT<<
      "matSk.="<<&matSk<<
      "matKk.="<<&matKk<<
      "covXk2.="<<&covXk2<<
      "covXk.="<<&covXk<<
      "cov.="<<fCovariance<<
      "vecYk.="<<&vecYk<<
      "vecXk.="<<&vecXk<<
      "vec.="<<fState<<
      "\n";
  }
  (*fCovariance)=covXk;
  (*fState)=vecXk;
}

void AliTPCkalmanTime::TestMC(const char * fname){
  //
  // Test of the class
  /*
    Usage:
    AliTPCkalmanTime::TestMC("testKalman.root");
    TFile f("testKalman.root");
    
   */
  //
  TTreeSRedirector *pcstream = new TTreeSRedirector(fname);
  //
  const Double_t kp0=0;
  const Double_t kp1=1;
  const Int_t    klength=10*24*60*60;       // 10 days mesurement
  const Double_t ksigmap0=0.001/(24*60*60.); // 0.005 change in one day
  const Int_t    deltat=5*60;                // 5 minutes step
  const Double_t kmessError=0.0005;
  AliTPCkalmanTime testKalman;

  for (Int_t iter=0; iter<100;iter++){
    Double_t sp0      = kp0+gRandom->Gaus(0,0.01);    // variable to estimate -offset 
    Double_t sp1      = kp1+gRandom->Gaus(0,0.2);    // variable to estimate slope
    Double_t cp0      = sp0;    // variable to estimate 
    Double_t cp1      = sp1;
    
    //
    testKalman.Init(0,cp0+gRandom->Gaus(0,0.05),cp1+gRandom->Gaus(0,0.2),0.05,0.2);
    Double_t dptratio= 0;
    for (Int_t itime=0; itime<klength; itime+=deltat){
      dptratio+=gRandom->Gaus(0,0.0005);
      cp0     +=gRandom->Gaus(0,ksigmap0*deltat);
      //
      Double_t vdrift  = cp0+dptratio*cp1+gRandom->Gaus(0,kmessError);
      testKalman.Propagate(itime,ksigmap0,pcstream);
      Double_t fdrift = (*(testKalman.fState))(0,0) + dptratio*(*(testKalman.fState))(1,0);
      (*pcstream)<<"drift"<<
	"iter="<<iter<<
	"time="<<itime<<
	"vdrift="<<vdrift<<
	"fdrift="<<fdrift<<
	"pt="<<dptratio<<
	"sp0="<<sp0<<
	"sp1="<<sp1<<
	"cp0="<<cp0<<
	"cp1="<<cp1<<
	"vecXk.="<<testKalman.fState<<
	"covXk.="<<testKalman.fCovariance<<
	"\n";
      testKalman.Update(vdrift,kmessError,dptratio,pcstream);
    }
  }
  delete pcstream;
}

 AliTPCkalmanTime.cxx:1
 AliTPCkalmanTime.cxx:2
 AliTPCkalmanTime.cxx:3
 AliTPCkalmanTime.cxx:4
 AliTPCkalmanTime.cxx:5
 AliTPCkalmanTime.cxx:6
 AliTPCkalmanTime.cxx:7
 AliTPCkalmanTime.cxx:8
 AliTPCkalmanTime.cxx:9
 AliTPCkalmanTime.cxx:10
 AliTPCkalmanTime.cxx:11
 AliTPCkalmanTime.cxx:12
 AliTPCkalmanTime.cxx:13
 AliTPCkalmanTime.cxx:14
 AliTPCkalmanTime.cxx:15
 AliTPCkalmanTime.cxx:16
 AliTPCkalmanTime.cxx:17
 AliTPCkalmanTime.cxx:18
 AliTPCkalmanTime.cxx:19
 AliTPCkalmanTime.cxx:20
 AliTPCkalmanTime.cxx:21
 AliTPCkalmanTime.cxx:22
 AliTPCkalmanTime.cxx:23
 AliTPCkalmanTime.cxx:24
 AliTPCkalmanTime.cxx:25
 AliTPCkalmanTime.cxx:26
 AliTPCkalmanTime.cxx:27
 AliTPCkalmanTime.cxx:28
 AliTPCkalmanTime.cxx:29
 AliTPCkalmanTime.cxx:30
 AliTPCkalmanTime.cxx:31
 AliTPCkalmanTime.cxx:32
 AliTPCkalmanTime.cxx:33
 AliTPCkalmanTime.cxx:34
 AliTPCkalmanTime.cxx:35
 AliTPCkalmanTime.cxx:36
 AliTPCkalmanTime.cxx:37
 AliTPCkalmanTime.cxx:38
 AliTPCkalmanTime.cxx:39
 AliTPCkalmanTime.cxx:40
 AliTPCkalmanTime.cxx:41
 AliTPCkalmanTime.cxx:42
 AliTPCkalmanTime.cxx:43
 AliTPCkalmanTime.cxx:44
 AliTPCkalmanTime.cxx:45
 AliTPCkalmanTime.cxx:46
 AliTPCkalmanTime.cxx:47
 AliTPCkalmanTime.cxx:48
 AliTPCkalmanTime.cxx:49
 AliTPCkalmanTime.cxx:50
 AliTPCkalmanTime.cxx:51
 AliTPCkalmanTime.cxx:52
 AliTPCkalmanTime.cxx:53
 AliTPCkalmanTime.cxx:54
 AliTPCkalmanTime.cxx:55
 AliTPCkalmanTime.cxx:56
 AliTPCkalmanTime.cxx:57
 AliTPCkalmanTime.cxx:58
 AliTPCkalmanTime.cxx:59
 AliTPCkalmanTime.cxx:60
 AliTPCkalmanTime.cxx:61
 AliTPCkalmanTime.cxx:62
 AliTPCkalmanTime.cxx:63
 AliTPCkalmanTime.cxx:64
 AliTPCkalmanTime.cxx:65
 AliTPCkalmanTime.cxx:66
 AliTPCkalmanTime.cxx:67
 AliTPCkalmanTime.cxx:68
 AliTPCkalmanTime.cxx:69
 AliTPCkalmanTime.cxx:70
 AliTPCkalmanTime.cxx:71
 AliTPCkalmanTime.cxx:72
 AliTPCkalmanTime.cxx:73
 AliTPCkalmanTime.cxx:74
 AliTPCkalmanTime.cxx:75
 AliTPCkalmanTime.cxx:76
 AliTPCkalmanTime.cxx:77
 AliTPCkalmanTime.cxx:78
 AliTPCkalmanTime.cxx:79
 AliTPCkalmanTime.cxx:80
 AliTPCkalmanTime.cxx:81
 AliTPCkalmanTime.cxx:82
 AliTPCkalmanTime.cxx:83
 AliTPCkalmanTime.cxx:84
 AliTPCkalmanTime.cxx:85
 AliTPCkalmanTime.cxx:86
 AliTPCkalmanTime.cxx:87
 AliTPCkalmanTime.cxx:88
 AliTPCkalmanTime.cxx:89
 AliTPCkalmanTime.cxx:90
 AliTPCkalmanTime.cxx:91
 AliTPCkalmanTime.cxx:92
 AliTPCkalmanTime.cxx:93
 AliTPCkalmanTime.cxx:94
 AliTPCkalmanTime.cxx:95
 AliTPCkalmanTime.cxx:96
 AliTPCkalmanTime.cxx:97
 AliTPCkalmanTime.cxx:98
 AliTPCkalmanTime.cxx:99
 AliTPCkalmanTime.cxx:100
 AliTPCkalmanTime.cxx:101
 AliTPCkalmanTime.cxx:102
 AliTPCkalmanTime.cxx:103
 AliTPCkalmanTime.cxx:104
 AliTPCkalmanTime.cxx:105
 AliTPCkalmanTime.cxx:106
 AliTPCkalmanTime.cxx:107
 AliTPCkalmanTime.cxx:108
 AliTPCkalmanTime.cxx:109
 AliTPCkalmanTime.cxx:110
 AliTPCkalmanTime.cxx:111
 AliTPCkalmanTime.cxx:112
 AliTPCkalmanTime.cxx:113
 AliTPCkalmanTime.cxx:114
 AliTPCkalmanTime.cxx:115
 AliTPCkalmanTime.cxx:116
 AliTPCkalmanTime.cxx:117
 AliTPCkalmanTime.cxx:118
 AliTPCkalmanTime.cxx:119
 AliTPCkalmanTime.cxx:120
 AliTPCkalmanTime.cxx:121
 AliTPCkalmanTime.cxx:122
 AliTPCkalmanTime.cxx:123
 AliTPCkalmanTime.cxx:124
 AliTPCkalmanTime.cxx:125
 AliTPCkalmanTime.cxx:126
 AliTPCkalmanTime.cxx:127
 AliTPCkalmanTime.cxx:128
 AliTPCkalmanTime.cxx:129
 AliTPCkalmanTime.cxx:130
 AliTPCkalmanTime.cxx:131
 AliTPCkalmanTime.cxx:132
 AliTPCkalmanTime.cxx:133
 AliTPCkalmanTime.cxx:134
 AliTPCkalmanTime.cxx:135
 AliTPCkalmanTime.cxx:136
 AliTPCkalmanTime.cxx:137
 AliTPCkalmanTime.cxx:138
 AliTPCkalmanTime.cxx:139
 AliTPCkalmanTime.cxx:140
 AliTPCkalmanTime.cxx:141
 AliTPCkalmanTime.cxx:142
 AliTPCkalmanTime.cxx:143
 AliTPCkalmanTime.cxx:144
 AliTPCkalmanTime.cxx:145
 AliTPCkalmanTime.cxx:146
 AliTPCkalmanTime.cxx:147
 AliTPCkalmanTime.cxx:148
 AliTPCkalmanTime.cxx:149
 AliTPCkalmanTime.cxx:150
 AliTPCkalmanTime.cxx:151
 AliTPCkalmanTime.cxx:152
 AliTPCkalmanTime.cxx:153
 AliTPCkalmanTime.cxx:154
 AliTPCkalmanTime.cxx:155
 AliTPCkalmanTime.cxx:156
 AliTPCkalmanTime.cxx:157
 AliTPCkalmanTime.cxx:158
 AliTPCkalmanTime.cxx:159
 AliTPCkalmanTime.cxx:160
 AliTPCkalmanTime.cxx:161
 AliTPCkalmanTime.cxx:162
 AliTPCkalmanTime.cxx:163
 AliTPCkalmanTime.cxx:164
 AliTPCkalmanTime.cxx:165
 AliTPCkalmanTime.cxx:166
 AliTPCkalmanTime.cxx:167
 AliTPCkalmanTime.cxx:168
 AliTPCkalmanTime.cxx:169
 AliTPCkalmanTime.cxx:170
 AliTPCkalmanTime.cxx:171
 AliTPCkalmanTime.cxx:172
 AliTPCkalmanTime.cxx:173
 AliTPCkalmanTime.cxx:174
 AliTPCkalmanTime.cxx:175
 AliTPCkalmanTime.cxx:176
 AliTPCkalmanTime.cxx:177
 AliTPCkalmanTime.cxx:178
 AliTPCkalmanTime.cxx:179
 AliTPCkalmanTime.cxx:180
 AliTPCkalmanTime.cxx:181
 AliTPCkalmanTime.cxx:182
 AliTPCkalmanTime.cxx:183
 AliTPCkalmanTime.cxx:184
 AliTPCkalmanTime.cxx:185
 AliTPCkalmanTime.cxx:186
 AliTPCkalmanTime.cxx:187
 AliTPCkalmanTime.cxx:188
 AliTPCkalmanTime.cxx:189
 AliTPCkalmanTime.cxx:190
 AliTPCkalmanTime.cxx:191
 AliTPCkalmanTime.cxx:192
 AliTPCkalmanTime.cxx:193
 AliTPCkalmanTime.cxx:194
 AliTPCkalmanTime.cxx:195
 AliTPCkalmanTime.cxx:196
 AliTPCkalmanTime.cxx:197
 AliTPCkalmanTime.cxx:198
 AliTPCkalmanTime.cxx:199
 AliTPCkalmanTime.cxx:200
 AliTPCkalmanTime.cxx:201
 AliTPCkalmanTime.cxx:202
 AliTPCkalmanTime.cxx:203
 AliTPCkalmanTime.cxx:204
 AliTPCkalmanTime.cxx:205
 AliTPCkalmanTime.cxx:206
 AliTPCkalmanTime.cxx:207
 AliTPCkalmanTime.cxx:208
 AliTPCkalmanTime.cxx:209
 AliTPCkalmanTime.cxx:210
 AliTPCkalmanTime.cxx:211
 AliTPCkalmanTime.cxx:212
 AliTPCkalmanTime.cxx:213
 AliTPCkalmanTime.cxx:214
 AliTPCkalmanTime.cxx:215
 AliTPCkalmanTime.cxx:216
 AliTPCkalmanTime.cxx:217
 AliTPCkalmanTime.cxx:218
 AliTPCkalmanTime.cxx:219
 AliTPCkalmanTime.cxx:220
 AliTPCkalmanTime.cxx:221
 AliTPCkalmanTime.cxx:222
 AliTPCkalmanTime.cxx:223
 AliTPCkalmanTime.cxx:224
 AliTPCkalmanTime.cxx:225
 AliTPCkalmanTime.cxx:226
 AliTPCkalmanTime.cxx:227
 AliTPCkalmanTime.cxx:228
 AliTPCkalmanTime.cxx:229
 AliTPCkalmanTime.cxx:230
 AliTPCkalmanTime.cxx:231