]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/TPCbase/AliTPCExBEffective.cxx
doxy: TPC/TPCbase converted
[u/mrichter/AliRoot.git] / TPC / TPCbase / AliTPCExBEffective.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /// \class AliTPCExBEffective
17 /// \brief Correct for the rest of ExB effect which are not covered by physical models
18 ///
19 /// Motivation:
20 ///  ExB correction:
21 ///     dr    =  c0* integral(Er/Ez) + c1* integral(Erphi/Ez)
22 ///     drphi = -c1* integral(Er/Ez) + c0* integral(Erphi/Ez)
23 ///  Where:
24 ///  wt = Bz*(k*vdrift/E)           ~ 0.3 at B=0.5 T
25 ///  c0 = 1/(1+T2*T2*wt*wt)
26 ///  c1 = T1*wt/(1+T1*T1*wt*wt)
27 ///
28 /// Residual integral(Er/Ez,Erphi/Ez) obtained comparing the B field 0 and B field +-0.5 T setting
29 /// minimizing track matching residuals
30 /// delta(Er/Ez) ~ sum[ poln(r) * polm(z) * cos(n,phi)]
31
32 #include "AliMagF.h"
33 #include "TGeoGlobalMagField.h"
34 #include "AliTPCcalibDB.h"
35 #include "AliTPCParam.h"
36 #include "AliLog.h"
37
38 #include "TMath.h"
39 #include "AliTPCROC.h"
40 #include "AliTPCExBEffective.h"
41 /// \cond CLASSIMP
42 ClassImp(AliTPCExBEffective)
43 /// \endcond
44
45 AliTPCExBEffective::AliTPCExBEffective()
46   : AliTPCCorrection("ExB_effective","ExB effective"),
47     fC0(1.),fC1(0.),
48     fPolynomA(0),
49     fPolynomC(0),
50     fPolynomValA(0),
51     fPolynomValC(0)
52 {
53   //
54   // default constructor
55   //
56 }
57
58 AliTPCExBEffective::~AliTPCExBEffective() {
59   /// default destructor
60
61 }
62
63
64
65 void AliTPCExBEffective::Init() {
66   /// Initialization funtion
67
68   AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
69   if (!magF) AliError("Magneticd field - not initialized");
70   Double_t bzField = magF->SolenoidField()/10.; //field in T
71   AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
72   if (!param) AliError("Parameters - not initialized");
73   Double_t vdrift = param->GetDriftV()/1000000.; // [cm/us]   // From dataBase: to be updated: per second (ideally)
74   Double_t ezField = 400; // [V/cm]   // to be updated: never (hopefully)
75   Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ;
76   // Correction Terms for effective omegaTau; obtained by a laser calibration run
77   SetOmegaTauT1T2(wt,fT1,fT2);
78
79
80 }
81
82 void AliTPCExBEffective::Update(const TTimeStamp &/*timeStamp*/) {
83   /// Update function
84
85   AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
86   if (!magF) AliError("Magneticd field - not initialized");
87   Double_t bzField = magF->SolenoidField()/10.; //field in T
88   AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
89   if (!param) AliError("Parameters - not initialized");
90   Double_t vdrift = param->GetDriftV()/1000000.; // [cm/us]   // From dataBase: to be updated: per second (ideally)
91   Double_t ezField = 400; // [V/cm]   // to be updated: never (hopefully)
92   Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ;
93   // Correction Terms for effective omegaTau; obtained by a laser calibration run
94   SetOmegaTauT1T2(wt,fT1,fT2);
95
96
97 }
98
99
100
101 void AliTPCExBEffective::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
102   /// Calculates the correction due conical shape
103
104   if (!fPolynomA) return;
105   AliTPCROC * calROC = AliTPCROC::Instance();
106   const Double_t kRTPC0  =calROC->GetPadRowRadii(0,0);
107   const Double_t kRTPC1  =calROC->GetPadRowRadii(36,calROC->GetNRows(36)-1);
108   Float_t rmiddle=(kRTPC0+kRTPC1)/2.;
109   //
110   Double_t phi      = TMath::ATan2(x[1],x[0]);
111   Double_t r        = TMath::Sqrt(x[1]*x[1]+x[0]*x[0]);
112   Double_t driftN   = 1.-TMath::Abs(x[2])/calROC->GetZLength(0);  // drift from 0 to 1
113   Double_t localxN  = 2*(r-rmiddle)/(kRTPC1-kRTPC0);         // normalize local x position
114   //
115   Double_t erez = 0;
116   Double_t erphiez = 0;
117   if (roc%36<18)  erez= GetSum(*fPolynomA, *fPolynomValA, localxN, driftN, phi,0);
118   if (roc%36>=18) erez= GetSum(*fPolynomC, *fPolynomValC, localxN, driftN, phi,0);
119   if (roc%36<18)  erphiez= GetSum(*fPolynomA, *fPolynomValA, localxN, driftN, phi,1);
120   if (roc%36>=18) erphiez= GetSum(*fPolynomC, *fPolynomValC, localxN, driftN, phi,1);
121
122   Double_t dr    =   fC0 * erez + fC1 * erphiez;
123   Double_t drphi =  -fC1 * erez + fC0 * erphiez;
124
125   // Calculate distorted position
126   if ( r > 0.0 ) {
127     r   =  r   + dr;
128     phi =  phi + drphi/r;
129   }
130   // Calculate correction in cartesian coordinates
131   dx[0] = r * TMath::Cos(phi) - x[0];
132   dx[1] = r * TMath::Sin(phi) - x[1];
133   dx[2] = 0.; // z distortion not implemented (1st order distortions)
134
135 }
136
137
138
139 Double_t AliTPCExBEffective::GetSum(const TMatrixD& mpol, const TMatrixD&mcoef, Double_t r, Double_t drift, Double_t phi, Int_t coord) const {
140   /// Summation of the polynomials
141
142   Int_t npols=mpol.GetNrows();
143   Double_t sum=0;
144   for (Int_t ipol=0;ipol<npols; ipol++){
145     Double_t pR = 1, pD=1, pPhi=1;
146     Int_t icoord   = TMath::Nint(mpol(ipol,0));
147     if (icoord!=coord) continue;
148     Int_t npolR    = TMath::Nint(mpol(ipol,1));
149     Int_t npolD    = TMath::Nint(mpol(ipol,2));
150     Int_t npolPhi  = TMath::Nint(mpol(ipol,3));
151     Double_t coef=mcoef(ipol,0);
152     //
153     for (Int_t ipolR=1; ipolR<=npolR; ipolR++) pR*=r;           // use simple polynoms
154     for (Int_t ipolD=1; ipolD<=npolD; ipolD++) pD*=drift;       // use simple polynoms
155     pPhi=TMath::Cos(npolPhi*phi);
156     sum+= pR*pD*pPhi*coef;
157   }
158   return sum;
159 }
160
161
162 void AliTPCExBEffective::SetPolynoms(const TMatrixD *polA,const TMatrixD *polC){
163   /// Set correction polynom - coefficients
164
165   fPolynomA = new TMatrixD(*polA);
166   fPolynomC = new TMatrixD(*polC);
167 }
168
169 void AliTPCExBEffective::SetCoeficients(const TMatrixD *valA,const TMatrixD *valC){
170   /// Set correction polynom - coefficients
171
172   fPolynomValA = new TMatrixD(*valA);
173   fPolynomValC = new TMatrixD(*valC);
174 }
175
176
177
178
179 void AliTPCExBEffective::Print(const Option_t* option) const {
180   /// Print function to check the settings (e.g. the twist in the X direction)
181   /// option=="a" prints the C0 and C1 coefficents for calibration purposes
182
183   TString opt = option; opt.ToLower();
184   printf("%s\t%s\n",GetName(),GetTitle());
185
186   if (opt.Contains("a")) { // Print all details
187     printf(" - T1: %1.4f, T2: %1.4f \n",fT1,fT2);
188     printf(" - C0: %1.4f, C1: %1.4f \n",fC0,fC1);
189     fPolynomValA->Print();
190     fPolynomValC->Print();
191   }
192
193
194 }