ROOT logo
#include "AliRieman.h"
#include "TTreeStream.h"
#include "TRandom.h"
#include "AliExternalTrackParam.h"

/*
  //
  // Test Progaram for AliRieman class
  //
  // How to use it:
  // 1. Load compiled macros
  // 2. Run function TestRieman()
  // 3. Open file and tree with results
  // 4. Check results - residuals - pulls
  // See example bellow:
  
  .L AliGenInfo.C+
  .L TestRieman.C+
  TestRieman();

  TFile  f("TestRieman.root");
  TTree * tree = (TTree*)f.Get("Test");
  tree->Draw("Rieman.fZ-RiemanRef.fZ:Rieman.fX")

  AliComparisonDraw comp;
  comp->fTree = tree;
  comp->DrawXY("Par0.fP[2]","(Par0.fP[4]-ParR.fP[4])/sqrt(ParR.fC[14])","1","1",5,-0.1,0.1,-5.1,5.1);
  comp->fRes->Draw();

*/



void GetProlongation(Double_t xk, Double_t &x, Double_t *param, Double_t &y, Double_t &z){
  Double_t dx=xk-x;  
  Double_t f1=param[2], f2=f1 + param[4]*dx;
  Double_t r1=TMath::Sqrt((1.-f1)*(1.+f1)), r2=TMath::Sqrt((1.-f2)*(1.+f2));
  y  = param[0] + dx*(f1+f2)/(r1+r2);
  //z  = param[1] + dx*(r2 + f2*(f1+f2)/(r1+r2))*param[3];
  //z    = param[1] + dx*(f1+f2)/(f1*r2 + f2*r1)*param[3];
  Double_t dy   = y-param[0];
  Double_t dfi  = 2*TMath::ASin(0.5*TMath::Sqrt(dx*dx+dy*dy)*TMath::Abs(param[4]));
  Double_t sign = (dx>0) ?  1:-1;
  z  = param[1] + sign*param[3]*dfi/param[4];  
}


void TestRieman(){
  const Double_t kB2C=0.299792458e-3;
  TTreeSRedirector cstream("TestRieman.root");
  AliRieman rieman(1000);
  AliRieman riemanR(1000);
  AliRieman riemanRef(1000);
  Int_t npoints =150;
  Double_t param[5], paramIdeal[5], paramR[5];

  for (Int_t i=0; i<10000; i++){
    //
    // random samples
    //
    Double_t r     = 600*(1+0.5*(gRandom->Rndm()-0.5));  
    Double_t kz    = 2*(gRandom->Rndm()-0.5);
    Double_t snp   = (gRandom->Rndm()-0.5)*0.3;
    Double_t sy    =0.1, sz =0.1;
    Double_t sign  = (gRandom->Rndm()>0.5? -1:1);

    Double_t x0    = 0;
    Double_t y0    = snp*x0+10*(gRandom->Rndm()-0.5);
    Double_t z0    = kz*x0+20*(gRandom->Rndm()-0.5);
    param[0] = y0;
    param[1] = z0;
    param[2] = snp;
    param[3] = kz;
    param[4] = sign/r;
    Double_t covar[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    Double_t covarI[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    Double_t covarR[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    AliExternalTrackParam trackParam(x0, 0, param,  covar);
    //    
    //
    rieman.Reset();
    riemanR.Reset();
    riemanRef.Reset();
    //    for (Float_t dx =0; dx<90; dx+=5){trackParam.PropagateTo(dx,1./kB2C);}
    for (Int_t ipoint =0; ipoint<npoints; ipoint++){
      Double_t x   =  90 + ipoint;
      Double_t y,z; 
      GetProlongation(x, x0, param,y,z);  
      //       trackParam.PropagateTo(x,1./kB2C);     
      //       y = trackParam.GetY();
      //       z = trackParam.GetZ();
      //      for (Float_t dx =0; dx<1; dx+=1){trackParam.PropagateTo(x+dx,1./kB2C);}
      //      Double_t xyz[3];
      // trackParam.GetXYZAt(x,1./kB2C,xyz);
      //       y = xyz[1];
      //       z = xyz[2];
      //
      rieman.AddPoint(x,y,z,sy,sz);
      riemanR.AddPoint(x, gRandom->Gaus(y,sy), gRandom->Gaus(z,sz), sy,sz);
    }
    rieman.Update();
    riemanR.Update();
    //
    // track extrapolation errrs
    //
    for (Int_t ipoint =0; ipoint<npoints; ipoint++){
      Double_t x =  rieman.GetX()[ipoint];
      Double_t y = riemanR.GetYat(x);
      Double_t z = riemanR.GetZat(x);
      Double_t sty = riemanR.GetErrY(x);
      Double_t stz = riemanR.GetErrZ(x);
      riemanRef.AddPoint(x, y,z,sty,stz);
    }
    riemanRef.Update();
    rieman.GetExternalParameters(x0, paramIdeal,covarI);
    riemanR.GetExternalParameters(x0, paramR,covarR);

    AliExternalTrackParam trackParamI(x0, 0, paramIdeal,  covarI);
    AliExternalTrackParam trackParamR(x0, 0, paramR,  covarR);
    AliRieman * res = rieman.MakeResiduals(); // residuals
    AliRieman * resR = riemanR.MakeResiduals(); // residuals
    cstream<<"Test"<<
      "x0="<<x0<<
      "Par0.="<<&trackParam<<
      "ParI.="<<&trackParamI<<
      "ParR.="<<&trackParamR<<
      "Rieman.="<<&rieman<<  
      "RiemanR.="<<&riemanR<<  
      "RiemanRef.="<<&riemanRef<<  
      "Res.="<<res<<
      "ResR.="<<resR<<
      "\n";
    delete res;
    delete resR;
  }  
}

 TestRieman.C:1
 TestRieman.C:2
 TestRieman.C:3
 TestRieman.C:4
 TestRieman.C:5
 TestRieman.C:6
 TestRieman.C:7
 TestRieman.C:8
 TestRieman.C:9
 TestRieman.C:10
 TestRieman.C:11
 TestRieman.C:12
 TestRieman.C:13
 TestRieman.C:14
 TestRieman.C:15
 TestRieman.C:16
 TestRieman.C:17
 TestRieman.C:18
 TestRieman.C:19
 TestRieman.C:20
 TestRieman.C:21
 TestRieman.C:22
 TestRieman.C:23
 TestRieman.C:24
 TestRieman.C:25
 TestRieman.C:26
 TestRieman.C:27
 TestRieman.C:28
 TestRieman.C:29
 TestRieman.C:30
 TestRieman.C:31
 TestRieman.C:32
 TestRieman.C:33
 TestRieman.C:34
 TestRieman.C:35
 TestRieman.C:36
 TestRieman.C:37
 TestRieman.C:38
 TestRieman.C:39
 TestRieman.C:40
 TestRieman.C:41
 TestRieman.C:42
 TestRieman.C:43
 TestRieman.C:44
 TestRieman.C:45
 TestRieman.C:46
 TestRieman.C:47
 TestRieman.C:48
 TestRieman.C:49
 TestRieman.C:50
 TestRieman.C:51
 TestRieman.C:52
 TestRieman.C:53
 TestRieman.C:54
 TestRieman.C:55
 TestRieman.C:56
 TestRieman.C:57
 TestRieman.C:58
 TestRieman.C:59
 TestRieman.C:60
 TestRieman.C:61
 TestRieman.C:62
 TestRieman.C:63
 TestRieman.C:64
 TestRieman.C:65
 TestRieman.C:66
 TestRieman.C:67
 TestRieman.C:68
 TestRieman.C:69
 TestRieman.C:70
 TestRieman.C:71
 TestRieman.C:72
 TestRieman.C:73
 TestRieman.C:74
 TestRieman.C:75
 TestRieman.C:76
 TestRieman.C:77
 TestRieman.C:78
 TestRieman.C:79
 TestRieman.C:80
 TestRieman.C:81
 TestRieman.C:82
 TestRieman.C:83
 TestRieman.C:84
 TestRieman.C:85
 TestRieman.C:86
 TestRieman.C:87
 TestRieman.C:88
 TestRieman.C:89
 TestRieman.C:90
 TestRieman.C:91
 TestRieman.C:92
 TestRieman.C:93
 TestRieman.C:94
 TestRieman.C:95
 TestRieman.C:96
 TestRieman.C:97
 TestRieman.C:98
 TestRieman.C:99
 TestRieman.C:100
 TestRieman.C:101
 TestRieman.C:102
 TestRieman.C:103
 TestRieman.C:104
 TestRieman.C:105
 TestRieman.C:106
 TestRieman.C:107
 TestRieman.C:108
 TestRieman.C:109
 TestRieman.C:110
 TestRieman.C:111
 TestRieman.C:112
 TestRieman.C:113
 TestRieman.C:114
 TestRieman.C:115
 TestRieman.C:116
 TestRieman.C:117
 TestRieman.C:118
 TestRieman.C:119
 TestRieman.C:120
 TestRieman.C:121
 TestRieman.C:122
 TestRieman.C:123
 TestRieman.C:124
 TestRieman.C:125
 TestRieman.C:126
 TestRieman.C:127
 TestRieman.C:128
 TestRieman.C:129
 TestRieman.C:130
 TestRieman.C:131
 TestRieman.C:132
 TestRieman.C:133
 TestRieman.C:134
 TestRieman.C:135
 TestRieman.C:136
 TestRieman.C:137
 TestRieman.C:138