57d298100003461fb3b238343958ceed65c3f805
[u/mrichter/AliRoot.git] / TPC / AliTPCExBConical.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 AliTPCExBConical
17 /// 
18 /// Calculates the space point distortions due to the conical shape of ALICE TPC.
19 /// 
20 /// Becasue of mechanical deformation ALICE TPC, chambers are misaligned in z direction
21 /// TPC has roughly conical shape
22 /// 
23 /// For the moment ONLY efective correction used - NOT EDGE EFFECT calcualted
24 /// 
25 /// The class allows "effective Omega Tau" corrections.
26 /// 
27 /// Example usage:
28 ///
29 /// ~~~{.cxx}
30 /// AliTPCExBConical conical;
31 /// conical.SetOmegaTauT1T2(0.32,1.,1.); // values ideally from OCDB
32 /// conical.SetXConical(0.001);   // set conical in X direction (in rad)
33 /// // plot dRPhi distortions ...
34 /// conical.CreateHistoDRPhiinZR(1.,100,100)->Draw("surf2");
35 /// ~~~
36 /// 
37 /// \author Marian Ivanov, Jim Thomas, Magnus Mager, Stefan Rossegger
38 /// \date 02/05/2010
39
40 #include "AliMagF.h"
41 #include "TGeoGlobalMagField.h"
42 #include "AliTPCcalibDB.h"
43 #include "AliTPCParam.h"
44 #include "AliLog.h"
45
46 #include "TMath.h"
47 #include "AliTPCROC.h"
48 #include "AliTPCExBConical.h"
49 ClassImp(AliTPCExBConical)
50
51 AliTPCExBConical::AliTPCExBConical()
52   : AliTPCCorrection("exb_conical","ExB conical"),
53     fC1(0.),fC2(0.),fConicalFactor(0)
54 {
55   //
56   // default constructor
57   //
58   for (Int_t i=0; i<3; i++){
59     fConicalA[i]= 0;  
60     fConicalC[i]= 0;
61   }
62 }
63
64 AliTPCExBConical::~AliTPCExBConical() {
65   /// default destructor
66
67 }
68
69
70
71 void AliTPCExBConical::Init() {
72   /// Initialization funtion
73
74   AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
75   if (!magF) AliError("Magneticd field - not initialized");
76   Double_t bzField = magF->SolenoidField()/10.; ///< field in T
77   AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
78   if (!param) AliError("Parameters - not initialized");
79   Double_t vdrift = param->GetDriftV()/1000000.; ///< [cm/us]   // From dataBase: to be updated: per second (ideally)
80   Double_t ezField = 400; ///< [V/cm]   // to be updated: never (hopefully)
81   Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ; 
82   // Correction Terms for effective omegaTau; obtained by a laser calibration run
83   SetOmegaTauT1T2(wt,fT1,fT2);
84
85
86 }
87
88 void AliTPCExBConical::Update(const TTimeStamp &/*timeStamp*/) {
89   /// Update function
90
91   AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
92   if (!magF) AliError("Magneticd field - not initialized");
93   Double_t bzField = magF->SolenoidField()/10.; ///< field in T
94   AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
95   if (!param) AliError("Parameters - not initialized");
96   Double_t vdrift = param->GetDriftV()/1000000.; ///< [cm/us]   // From dataBase: to be updated: per second (ideally)
97   Double_t ezField = 400; ///< [V/cm]   // to be updated: never (hopefully)
98   Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ; 
99   // Correction Terms for effective omegaTau; obtained by a laser calibration run
100   SetOmegaTauT1T2(wt,fT1,fT2);
101
102
103 }
104
105
106
107 void AliTPCExBConical::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
108   /// Calculates the correction due conical shape
109
110   AliTPCROC * calROC = AliTPCROC::Instance();
111   const Double_t kRTPC0  =calROC->GetPadRowRadii(0,0);
112   const Double_t kRTPC1  =calROC->GetPadRowRadii(36,calROC->GetNRows(36)-1);
113   Float_t rmiddle=(kRTPC0+kRTPC1)/2.;
114   //
115   Double_t phi =TMath::ATan2(x[1],x[0]);
116   Double_t r =TMath::Sqrt(x[1]*x[1]+x[0]*x[0]);
117   Double_t dTheta=0;
118   if (roc%36<18)  dTheta = fConicalA[0]+TMath::Cos(phi)*fConicalA[1]+TMath::Sin(phi)*fConicalA[2];
119   if (roc%36>=18) {
120     dTheta = fConicalC[0]+TMath::Cos(phi)*fConicalC[1]+TMath::Sin(phi)*fConicalC[2];
121   }
122   Double_t corr=dTheta*fConicalFactor;
123   if (roc%36>=18) corr*=-1.;
124   Double_t drphi=fC1*corr;
125   Double_t dr   =fC2*corr;
126   dx[0]= TMath::Cos(phi)*dr-TMath::Sin(phi)*drphi;
127   dx[1]= TMath::Sin(phi)*dr+TMath::Cos(phi)*drphi;
128   dx[2]= -0.001*dTheta*(r-rmiddle); // dtheta in mrad
129
130 }
131
132 void AliTPCExBConical::Print(const Option_t* option) const {
133   /// Print function to check the settings (e.g. the conical in the X direction)
134   /// option=="a" prints the C0 and C1 coefficents for calibration purposes
135
136   TString opt = option; opt.ToLower();
137   printf("%s:%s\n",GetTitle(), GetName());
138   printf(" - T1: %1.4f, T2: %1.4f \n",fT1,fT2);  
139   printf("Conical settings: Empirical: %1.5f mm/mrad\n",fConicalFactor);
140   printf("Conical settings: A-Conical: %1.5f mrad:%1.5f mrad:%1.5f mrad \n",fConicalA[0],fConicalA[1],fConicalA[2]);
141   printf("Conical settings: C-Conical: %1.5f mrad:%1.5f mrad:%1.5f mrad \n",fConicalC[0],fConicalC[1],fConicalC[2]);
142
143 }
144
145
146 void AliTPCExBConical::SetConicalA(Float_t conicalA[3]){
147   /// set paramters of conical shape - A side - obtained from alignment
148
149   fConicalA[0]= conicalA[0];  // constant
150   fConicalA[1]= conicalA[1];  // cos 
151   fConicalA[2]= conicalA[2];  // sin
152 }
153 void AliTPCExBConical::SetConicalC(Float_t conicalC[3]){
154   /// set paramters of conical shape -C side obtained form the alignemnt
155
156   fConicalC[0]= conicalC[0];  // constant
157   fConicalC[1]= conicalC[1];  // cos 
158   fConicalC[2]= conicalC[2];  // sin
159 }