]>
Commit | Line | Data |
---|---|---|
ffab0c37 | 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 | ||
0fd1fc0b | 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 | ||
534fd34a | 40 | #include "AliMagF.h" |
41 | #include "TGeoGlobalMagField.h" | |
42 | #include "AliTPCcalibDB.h" | |
43 | #include "AliTPCParam.h" | |
44 | #include "AliLog.h" | |
ffab0c37 | 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() { | |
0fd1fc0b | 65 | /// default destructor |
66 | ||
ffab0c37 | 67 | } |
68 | ||
534fd34a | 69 | |
70 | ||
ffab0c37 | 71 | void AliTPCExBConical::Init() { |
0fd1fc0b | 72 | /// Initialization funtion |
73 | ||
534fd34a | 74 | AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField(); |
75 | if (!magF) AliError("Magneticd field - not initialized"); | |
0fd1fc0b | 76 | Double_t bzField = magF->SolenoidField()/10.; ///< field in T |
534fd34a | 77 | AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters(); |
78 | if (!param) AliError("Parameters - not initialized"); | |
0fd1fc0b | 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) | |
ffab0c37 | 81 | Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ; |
ffab0c37 | 82 | // Correction Terms for effective omegaTau; obtained by a laser calibration run |
534fd34a | 83 | SetOmegaTauT1T2(wt,fT1,fT2); |
ffab0c37 | 84 | |
ffab0c37 | 85 | |
86 | } | |
87 | ||
88 | void AliTPCExBConical::Update(const TTimeStamp &/*timeStamp*/) { | |
0fd1fc0b | 89 | /// Update function |
90 | ||
534fd34a | 91 | AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField(); |
92 | if (!magF) AliError("Magneticd field - not initialized"); | |
0fd1fc0b | 93 | Double_t bzField = magF->SolenoidField()/10.; ///< field in T |
534fd34a | 94 | AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters(); |
95 | if (!param) AliError("Parameters - not initialized"); | |
0fd1fc0b | 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) | |
ffab0c37 | 98 | Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ; |
ffab0c37 | 99 | // Correction Terms for effective omegaTau; obtained by a laser calibration run |
534fd34a | 100 | SetOmegaTauT1T2(wt,fT1,fT2); |
101 | ||
ffab0c37 | 102 | |
ffab0c37 | 103 | } |
104 | ||
105 | ||
106 | ||
107 | void AliTPCExBConical::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) { | |
0fd1fc0b | 108 | /// Calculates the correction due conical shape |
109 | ||
ffab0c37 | 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; | |
be67055b | 128 | dx[2]= -0.001*dTheta*(r-rmiddle); // dtheta in mrad |
ffab0c37 | 129 | |
130 | } | |
131 | ||
b1f0a2a5 | 132 | void AliTPCExBConical::Print(const Option_t* option) const { |
0fd1fc0b | 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 | |
ffab0c37 | 135 | |
136 | TString opt = option; opt.ToLower(); | |
534fd34a | 137 | printf("%s:%s\n",GetTitle(), GetName()); |
138 | printf(" - T1: %1.4f, T2: %1.4f \n",fT1,fT2); | |
ffab0c37 | 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]){ | |
0fd1fc0b | 147 | /// set paramters of conical shape - A side - obtained from alignment |
148 | ||
ffab0c37 | 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]){ | |
0fd1fc0b | 154 | /// set paramters of conical shape -C side obtained form the alignemnt |
155 | ||
ffab0c37 | 156 | fConicalC[0]= conicalC[0]; // constant |
157 | fConicalC[1]= conicalC[1]; // cos | |
158 | fConicalC[2]= conicalC[2]; // sin | |
159 | } |