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.                  *
 **************************************************************************/

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// AliTPCExBEffective class                                                   //
// Correct for the rest of ExB effect which are not covered by physical models
//
// Motivation:
//   ExB correction: 
//      dr    =  c0* integral(Er/Ez) + c1* integral(Erphi/Ez)
//      drphi = -c1* integral(Er/Ez) + c0* integral(Erphi/Ez)
//   Where:      
//   wt = Bz*(k*vdrift/E)           ~ 0.3 at B=0.5 T 
//   c0 = 1/(1+T2*T2*wt*wt) 
//   c1 = T1*wt/(1+T1*T1*wt*wt)
//   
// Residual integral(Er/Ez,Erphi/Ez) obtained comparing the B field 0 and B field +-0.5 T setting
// minimizing track matching residuals 
// delta(Er/Ez) ~ sum[ poln(r) * polm(z) * cos(n,phi)] 
//  
////////////////////////////////////////////////////////////////////////////
#include "AliMagF.h"
#include "TGeoGlobalMagField.h"
#include "AliTPCcalibDB.h"
#include "AliTPCParam.h"
#include "AliLog.h"

#include "TMath.h"
#include "AliTPCROC.h"
#include "AliTPCExBEffective.h"
ClassImp(AliTPCExBEffective)

AliTPCExBEffective::AliTPCExBEffective()
  : AliTPCCorrection("ExB_effective","ExB effective"),
    fC0(1.),fC1(0.), 
    fPolynomA(0),
    fPolynomC(0),
    fPolynomValA(0),
    fPolynomValC(0)
{
  //
  // default constructor
  //
}

AliTPCExBEffective::~AliTPCExBEffective() {
  //
  // default destructor
  //
}



void AliTPCExBEffective::Init() {
  //
  // Initialization funtion
  //
  
  AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
  if (!magF) AliError("Magneticd field - not initialized");
  Double_t bzField = magF->SolenoidField()/10.; //field in T
  AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
  if (!param) AliError("Parameters - not initialized");
  Double_t vdrift = param->GetDriftV()/1000000.; // [cm/us]   // From dataBase: to be updated: per second (ideally)
  Double_t ezField = 400; // [V/cm]   // to be updated: never (hopefully)
  Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ; 
  // Correction Terms for effective omegaTau; obtained by a laser calibration run
  SetOmegaTauT1T2(wt,fT1,fT2);


}

void AliTPCExBEffective::Update(const TTimeStamp &/*timeStamp*/) {
  //
  // Update function 
  //
  AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
  if (!magF) AliError("Magneticd field - not initialized");
  Double_t bzField = magF->SolenoidField()/10.; //field in T
  AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
  if (!param) AliError("Parameters - not initialized");
  Double_t vdrift = param->GetDriftV()/1000000.; // [cm/us]   // From dataBase: to be updated: per second (ideally)
  Double_t ezField = 400; // [V/cm]   // to be updated: never (hopefully)
  Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ; 
  // Correction Terms for effective omegaTau; obtained by a laser calibration run
  SetOmegaTauT1T2(wt,fT1,fT2);


}



void AliTPCExBEffective::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
  //
  // Calculates the correction due conical shape
  //   
  if (!fPolynomA) return;
  AliTPCROC * calROC = AliTPCROC::Instance();
  const Double_t kRTPC0  =calROC->GetPadRowRadii(0,0);
  const Double_t kRTPC1  =calROC->GetPadRowRadii(36,calROC->GetNRows(36)-1);
  Float_t rmiddle=(kRTPC0+kRTPC1)/2.;
  //
  Double_t phi      = TMath::ATan2(x[1],x[0]);
  Double_t r        = TMath::Sqrt(x[1]*x[1]+x[0]*x[0]);
  Double_t driftN   = 1.-TMath::Abs(x[2])/calROC->GetZLength(0);  // drift from 0 to 1
  Double_t localxN  = 2*(r-rmiddle)/(kRTPC1-kRTPC0);         // normalize local x position
  //
  Double_t erez = 0;
  Double_t erphiez = 0;
  if (roc%36<18)  erez= GetSum(*fPolynomA, *fPolynomValA, localxN, driftN, phi,0);
  if (roc%36>=18) erez= GetSum(*fPolynomC, *fPolynomValC, localxN, driftN, phi,0);
  if (roc%36<18)  erphiez= GetSum(*fPolynomA, *fPolynomValA, localxN, driftN, phi,1);
  if (roc%36>=18) erphiez= GetSum(*fPolynomC, *fPolynomValC, localxN, driftN, phi,1);

  Double_t dr    =   fC0 * erez + fC1 * erphiez;
  Double_t drphi =  -fC1 * erez + fC0 * erphiez;
  
  // Calculate distorted position
  if ( r > 0.0 ) {
    r   =  r   + dr;
    phi =  phi + drphi/r;
  }
  // Calculate correction in cartesian coordinates
  dx[0] = r * TMath::Cos(phi) - x[0];
  dx[1] = r * TMath::Sin(phi) - x[1];
  dx[2] = 0.; // z distortion not implemented (1st order distortions)

}



Double_t AliTPCExBEffective::GetSum(const TMatrixD& mpol, const TMatrixD&mcoef, Double_t r, Double_t drift, Double_t phi, Int_t coord) const {
  //
  // Summation of the polynomials
  //
  Int_t npols=mpol.GetNrows();
  Double_t sum=0;
  for (Int_t ipol=0;ipol<npols; ipol++){
    Double_t pR = 1, pD=1, pPhi=1;
    Int_t icoord   = TMath::Nint(mpol(ipol,0));
    if (icoord!=coord) continue;
    Int_t npolR    = TMath::Nint(mpol(ipol,1));
    Int_t npolD    = TMath::Nint(mpol(ipol,2));
    Int_t npolPhi  = TMath::Nint(mpol(ipol,3));
    Double_t coef=mcoef(ipol,0);
    //
    for (Int_t ipolR=1; ipolR<=npolR; ipolR++) pR*=r;           // use simple polynoms
    for (Int_t ipolD=1; ipolD<=npolD; ipolD++) pD*=drift;       // use simple polynoms
    pPhi=TMath::Cos(npolPhi*phi);
    sum+= pR*pD*pPhi*coef;
  }
  return sum;
}
 

void AliTPCExBEffective::SetPolynoms(const TMatrixD *polA,const TMatrixD *polC){
  //
  // Set correction polynom - coefficients
  //
  fPolynomA = new TMatrixD(*polA);
  fPolynomC = new TMatrixD(*polC);
}

void AliTPCExBEffective::SetCoeficients(const TMatrixD *valA,const TMatrixD *valC){
  //
  // Set correction polynom - coefficients
  //
  fPolynomValA = new TMatrixD(*valA);
  fPolynomValC = new TMatrixD(*valC);
}




void AliTPCExBEffective::Print(const Option_t* option) const {
  //
  // Print function to check the settings (e.g. the twist in the X direction)
  // option=="a" prints the C0 and C1 coefficents for calibration purposes
  //

  TString opt = option; opt.ToLower();
  printf("%s\t%s\n",GetName(),GetTitle());
  
  if (opt.Contains("a")) { // Print all details
    printf(" - T1: %1.4f, T2: %1.4f \n",fT1,fT2);
    printf(" - C0: %1.4f, C1: %1.4f \n",fC0,fC1);
    fPolynomValA->Print();
    fPolynomValC->Print();
  }    
 
 
}
 AliTPCExBEffective.cxx:1
 AliTPCExBEffective.cxx:2
 AliTPCExBEffective.cxx:3
 AliTPCExBEffective.cxx:4
 AliTPCExBEffective.cxx:5
 AliTPCExBEffective.cxx:6
 AliTPCExBEffective.cxx:7
 AliTPCExBEffective.cxx:8
 AliTPCExBEffective.cxx:9
 AliTPCExBEffective.cxx:10
 AliTPCExBEffective.cxx:11
 AliTPCExBEffective.cxx:12
 AliTPCExBEffective.cxx:13
 AliTPCExBEffective.cxx:14
 AliTPCExBEffective.cxx:15
 AliTPCExBEffective.cxx:16
 AliTPCExBEffective.cxx:17
 AliTPCExBEffective.cxx:18
 AliTPCExBEffective.cxx:19
 AliTPCExBEffective.cxx:20
 AliTPCExBEffective.cxx:21
 AliTPCExBEffective.cxx:22
 AliTPCExBEffective.cxx:23
 AliTPCExBEffective.cxx:24
 AliTPCExBEffective.cxx:25
 AliTPCExBEffective.cxx:26
 AliTPCExBEffective.cxx:27
 AliTPCExBEffective.cxx:28
 AliTPCExBEffective.cxx:29
 AliTPCExBEffective.cxx:30
 AliTPCExBEffective.cxx:31
 AliTPCExBEffective.cxx:32
 AliTPCExBEffective.cxx:33
 AliTPCExBEffective.cxx:34
 AliTPCExBEffective.cxx:35
 AliTPCExBEffective.cxx:36
 AliTPCExBEffective.cxx:37
 AliTPCExBEffective.cxx:38
 AliTPCExBEffective.cxx:39
 AliTPCExBEffective.cxx:40
 AliTPCExBEffective.cxx:41
 AliTPCExBEffective.cxx:42
 AliTPCExBEffective.cxx:43
 AliTPCExBEffective.cxx:44
 AliTPCExBEffective.cxx:45
 AliTPCExBEffective.cxx:46
 AliTPCExBEffective.cxx:47
 AliTPCExBEffective.cxx:48
 AliTPCExBEffective.cxx:49
 AliTPCExBEffective.cxx:50
 AliTPCExBEffective.cxx:51
 AliTPCExBEffective.cxx:52
 AliTPCExBEffective.cxx:53
 AliTPCExBEffective.cxx:54
 AliTPCExBEffective.cxx:55
 AliTPCExBEffective.cxx:56
 AliTPCExBEffective.cxx:57
 AliTPCExBEffective.cxx:58
 AliTPCExBEffective.cxx:59
 AliTPCExBEffective.cxx:60
 AliTPCExBEffective.cxx:61
 AliTPCExBEffective.cxx:62
 AliTPCExBEffective.cxx:63
 AliTPCExBEffective.cxx:64
 AliTPCExBEffective.cxx:65
 AliTPCExBEffective.cxx:66
 AliTPCExBEffective.cxx:67
 AliTPCExBEffective.cxx:68
 AliTPCExBEffective.cxx:69
 AliTPCExBEffective.cxx:70
 AliTPCExBEffective.cxx:71
 AliTPCExBEffective.cxx:72
 AliTPCExBEffective.cxx:73
 AliTPCExBEffective.cxx:74
 AliTPCExBEffective.cxx:75
 AliTPCExBEffective.cxx:76
 AliTPCExBEffective.cxx:77
 AliTPCExBEffective.cxx:78
 AliTPCExBEffective.cxx:79
 AliTPCExBEffective.cxx:80
 AliTPCExBEffective.cxx:81
 AliTPCExBEffective.cxx:82
 AliTPCExBEffective.cxx:83
 AliTPCExBEffective.cxx:84
 AliTPCExBEffective.cxx:85
 AliTPCExBEffective.cxx:86
 AliTPCExBEffective.cxx:87
 AliTPCExBEffective.cxx:88
 AliTPCExBEffective.cxx:89
 AliTPCExBEffective.cxx:90
 AliTPCExBEffective.cxx:91
 AliTPCExBEffective.cxx:92
 AliTPCExBEffective.cxx:93
 AliTPCExBEffective.cxx:94
 AliTPCExBEffective.cxx:95
 AliTPCExBEffective.cxx:96
 AliTPCExBEffective.cxx:97
 AliTPCExBEffective.cxx:98
 AliTPCExBEffective.cxx:99
 AliTPCExBEffective.cxx:100
 AliTPCExBEffective.cxx:101
 AliTPCExBEffective.cxx:102
 AliTPCExBEffective.cxx:103
 AliTPCExBEffective.cxx:104
 AliTPCExBEffective.cxx:105
 AliTPCExBEffective.cxx:106
 AliTPCExBEffective.cxx:107
 AliTPCExBEffective.cxx:108
 AliTPCExBEffective.cxx:109
 AliTPCExBEffective.cxx:110
 AliTPCExBEffective.cxx:111
 AliTPCExBEffective.cxx:112
 AliTPCExBEffective.cxx:113
 AliTPCExBEffective.cxx:114
 AliTPCExBEffective.cxx:115
 AliTPCExBEffective.cxx:116
 AliTPCExBEffective.cxx:117
 AliTPCExBEffective.cxx:118
 AliTPCExBEffective.cxx:119
 AliTPCExBEffective.cxx:120
 AliTPCExBEffective.cxx:121
 AliTPCExBEffective.cxx:122
 AliTPCExBEffective.cxx:123
 AliTPCExBEffective.cxx:124
 AliTPCExBEffective.cxx:125
 AliTPCExBEffective.cxx:126
 AliTPCExBEffective.cxx:127
 AliTPCExBEffective.cxx:128
 AliTPCExBEffective.cxx:129
 AliTPCExBEffective.cxx:130
 AliTPCExBEffective.cxx:131
 AliTPCExBEffective.cxx:132
 AliTPCExBEffective.cxx:133
 AliTPCExBEffective.cxx:134
 AliTPCExBEffective.cxx:135
 AliTPCExBEffective.cxx:136
 AliTPCExBEffective.cxx:137
 AliTPCExBEffective.cxx:138
 AliTPCExBEffective.cxx:139
 AliTPCExBEffective.cxx:140
 AliTPCExBEffective.cxx:141
 AliTPCExBEffective.cxx:142
 AliTPCExBEffective.cxx:143
 AliTPCExBEffective.cxx:144
 AliTPCExBEffective.cxx:145
 AliTPCExBEffective.cxx:146
 AliTPCExBEffective.cxx:147
 AliTPCExBEffective.cxx:148
 AliTPCExBEffective.cxx:149
 AliTPCExBEffective.cxx:150
 AliTPCExBEffective.cxx:151
 AliTPCExBEffective.cxx:152
 AliTPCExBEffective.cxx:153
 AliTPCExBEffective.cxx:154
 AliTPCExBEffective.cxx:155
 AliTPCExBEffective.cxx:156
 AliTPCExBEffective.cxx:157
 AliTPCExBEffective.cxx:158
 AliTPCExBEffective.cxx:159
 AliTPCExBEffective.cxx:160
 AliTPCExBEffective.cxx:161
 AliTPCExBEffective.cxx:162
 AliTPCExBEffective.cxx:163
 AliTPCExBEffective.cxx:164
 AliTPCExBEffective.cxx:165
 AliTPCExBEffective.cxx:166
 AliTPCExBEffective.cxx:167
 AliTPCExBEffective.cxx:168
 AliTPCExBEffective.cxx:169
 AliTPCExBEffective.cxx:170
 AliTPCExBEffective.cxx:171
 AliTPCExBEffective.cxx:172
 AliTPCExBEffective.cxx:173
 AliTPCExBEffective.cxx:174
 AliTPCExBEffective.cxx:175
 AliTPCExBEffective.cxx:176
 AliTPCExBEffective.cxx:177
 AliTPCExBEffective.cxx:178
 AliTPCExBEffective.cxx:179
 AliTPCExBEffective.cxx:180
 AliTPCExBEffective.cxx:181
 AliTPCExBEffective.cxx:182
 AliTPCExBEffective.cxx:183
 AliTPCExBEffective.cxx:184
 AliTPCExBEffective.cxx:185
 AliTPCExBEffective.cxx:186
 AliTPCExBEffective.cxx:187
 AliTPCExBEffective.cxx:188
 AliTPCExBEffective.cxx:189
 AliTPCExBEffective.cxx:190
 AliTPCExBEffective.cxx:191
 AliTPCExBEffective.cxx:192
 AliTPCExBEffective.cxx:193
 AliTPCExBEffective.cxx:194
 AliTPCExBEffective.cxx:195
 AliTPCExBEffective.cxx:196
 AliTPCExBEffective.cxx:197
 AliTPCExBEffective.cxx:198
 AliTPCExBEffective.cxx:199
 AliTPCExBEffective.cxx:200
 AliTPCExBEffective.cxx:201
 AliTPCExBEffective.cxx:202
 AliTPCExBEffective.cxx:203
 AliTPCExBEffective.cxx:204
 AliTPCExBEffective.cxx:205