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

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// AliTPCExBEffectiveSector class                                                   //
// Correct for the rest of ExB effect which are not covered yet 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)
//   
//  
//  3 correction maps 0 implemented as histogram used
//  R-Phi correction map obtained minimizing residuals betwee the track
//        and space points (AliTPCcalibAlign class). Track is defined using
//        the points from the refernce plain at the middle of the TPC
//        and vertex
//        Corrected primar tracks straight pointing to the primary vertex
//
//  R distortion - obtained using the cluster residuals in the setup with
//                 plus and minus field 
//                 Only high momenta tracks used for this calibration (1 GeV threshold)
//     drphi_plus-drphi_minus=-2*c1 integral(Er/Ez)
//               - Erphi/Ez cancels   
////////////////////////////////////////////////////////////////////////////
#include "AliMagF.h"
#include "TGeoGlobalMagField.h"
#include "AliTPCcalibDB.h"
#include "AliTPCParam.h"
#include "AliLog.h"

#include "TMath.h"
#include "AliTPCROC.h"
#include "TFile.h"
#include "TAxis.h"
#include "TTree.h"
#include "TTreeStream.h"
#include "THnSparse.h"
#include "THnBase.h"
#include "TProfile.h"
#include "TH2F.h"
#include "TH3F.h"
#include "TROOT.h"
#include "AliTPCExBEffectiveSector.h"
ClassImp(AliTPCExBEffectiveSector)

AliTPCExBEffectiveSector::AliTPCExBEffectiveSector()
  : AliTPCCorrection("ExB_effectiveSector","ExB effective sector"),
    fC0(1.),fC1(0.), 
    fCorrectionR(0),        // radial correction
    fCorrectionRPhi(0),     // r-phi correction
    fCorrectionZ(0)        // z correction
{
  //
  // default constructor
  //
}

AliTPCExBEffectiveSector::~AliTPCExBEffectiveSector() {
  //
  // default destructor
  //
  delete fCorrectionR;        // radial correction
  delete fCorrectionRPhi;     // r-phi correction
  delete fCorrectionZ;        // z correction
}



void AliTPCExBEffectiveSector::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 AliTPCExBEffectiveSector::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 AliTPCExBEffectiveSector::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
  //
  // Calculates the correction using the lookup table (histogram) of distortion
  // The histogram is created as poscl - postrack
  //   
  dx[0]=0;
  dx[1]=0;
  dx[2]=0;
  if (!fCorrectionRPhi) return;
  Double_t phi      = TMath::ATan2(x[1],x[0]);
  Double_t r        = TMath::Sqrt(x[1]*x[1]+x[0]*x[0]);
  Double_t sector   = 9.*phi/TMath::Pi();
  if (sector<0) sector+=18.;
  Double_t        kZ=x[2]/r;
  //
  if (kZ>1.2)        kZ= 1.2;
  if (kZ<-1.2)       kZ= -1.2;
  if (roc%36<18)  kZ= TMath::Abs(kZ);
  if (roc%36>=18) kZ=-TMath::Abs(kZ);
  if (TMath::Abs(kZ)<0.15){
    kZ = (roc%36<18) ? 0.15:-0.15;
  }  
  //
  Double_t dlR=0;
  Double_t dlRPhi=0;
  Double_t dlZ=0;
  Double_t rr=TMath::Max(r,fCorrectionRPhi->GetYaxis()->GetXmin()+0.01);
  rr=TMath::Min(rr,fCorrectionRPhi->GetYaxis()->GetXmax()-0.01);
  Double_t kZZ=TMath::Max(kZ,fCorrectionRPhi->GetZaxis()->GetXmin()+0.001);
  kZZ=TMath::Min(kZZ,fCorrectionRPhi->GetZaxis()->GetXmax()-0.001);

  if (fCorrectionRPhi) {  
    //    dlRPhi= -fCorrectionRPhi->Interpolate(sector,rr,kZZ);
    dlRPhi= -fCorrectionRPhi->GetBinContent(fCorrectionRPhi->FindBin(sector,rr,kZZ));
  }
  if (fCorrectionR)    {
    //    dlR= -fCorrectionR->Interpolate(sector,rr,kZZ);
    dlR= -fCorrectionR->GetBinContent(fCorrectionR->FindBin(sector,rr,kZZ));
  }
  if (fCorrectionZ)    {
    //    dlZ= -fCorrectionZ->Interpolate(sector,rr,kZZ);
    dlZ= -fCorrectionZ->GetBinContent(fCorrectionZ->FindBin(sector,rr,kZZ));
  }
  Double_t dr    = fC0*dlR  + fC1*dlRPhi;
  Double_t drphi = -fC1*dlR + fC0*dlRPhi;
   // 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] = dlZ; 

}

void AliTPCExBEffectiveSector::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);
  }    
}

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