1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 //-------------------------------------------------------
17 // Implementation of the TPC transformation class
19 // Origin: Marian Ivanov Marian.Ivanov@cern.ch
22 // Class for tranformation of the coordinate frame
24 // local coordinate frame (sector, padrow, pad, timebine) ==>
25 // rotated global (tracking) cooridnate frame (sector, lx,ly,lz)
27 // Unisochronity - (substract time0 - pad by pad)
28 // Drift velocity - Currently common drift velocity - functionality of AliTPCParam
32 // AliTPCclustererMI::AddCluster
33 // AliTPCtrackerMI::Transform
35 //-------------------------------------------------------
38 cdb=AliCDBManager::Instance()
39 cdb->SetDefaultStorage("local:///u/mmager/mycalib1")
40 c=AliTPCcalibDB::Instance()
42 Double_t x[]={1.0,2.0,3.0}
45 trafo.Transform(x,i,0,1)
50 #include "AliTPCROC.h"
51 #include "AliTPCCalPad.h"
52 #include "AliTPCCalROC.h"
53 #include "AliTPCcalibDB.h"
54 #include "AliTPCParam.h"
57 #include "AliTPCExB.h"
58 #include "AliTPCTransform.h"
62 AliTPCTransform::AliTPCTransform() {
66 for (Int_t i=0;i<18;++i) {
67 Double_t alpha=TMath::DegToRad()*(10.+20.*(i%18));
68 fSins[i]=TMath::Sin(alpha);
69 fCoss[i]=TMath::Cos(alpha);
73 AliTPCTransform::~AliTPCTransform() {
79 void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/,
80 Int_t /*coordinateType*/) {
81 // input: x[0] - pad row
85 // output: x[0] - x (all in the rotated global coordinate frame)
88 Int_t row=TMath::Nint(x[0]);
89 Int_t pad=TMath::Nint(x[1]);
91 AliTPCcalibDB* const calib=AliTPCcalibDB::Instance();
93 AliTPCCalPad * time0TPC = calib->GetPadTime0();
94 AliTPCParam * param = calib->GetParameters();
96 AliFatal("Time unisochronity missing");
100 AliFatal("Parameters missing");
104 // Apply Time0 correction - Pad by pad fluctuation
106 x[2]-=time0TPC->GetCalROC(sector)->GetValue(row,pad);
108 // Tranform from pad - time coordinate system to the rotated global (tracking) system
110 Local2RotatedGlobal(sector,x);
115 //TODO: calib->GetParameters()->GetClusterMatrix(sector)->LocalToMaster(x,xx);
116 RotatedGlobal2Global(sector,x);
121 calib->GetExB()->Correct(x,xx);
123 Global2RotatedGlobal(sector,xx);
125 x[0]=xx[0];x[1]=xx[1];x[2]=xx[2];
128 void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const {
131 // Tranform coordinate from
132 // row, pad, time to x,y,z
135 // Current implementation - common drift velocity - for full chamber
136 // TODO: use a map or parametrisation!
140 AliTPCcalibDB* const calib=AliTPCcalibDB::Instance();
141 AliTPCParam * param = calib->GetParameters();
143 AliFatal("Parameters missing");
145 Int_t row=TMath::Nint(x[0]);
146 Int_t pad=TMath::Nint(x[1]);
148 const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector();
150 Double_t zwidth = param->GetZWidth();
151 Double_t padWidth = 0;
152 Double_t padLength = 0;
156 maxPad = param->GetNPadsLow(row);
157 sign = (sector < kNIS/2) ? 1 : -1;
158 padLength = param->GetPadPitchLength(sector,row);
159 padWidth = param->GetPadPitchWidth(sector);
161 maxPad = param->GetNPadsUp(row);
162 sign = ((sector-kNIS) < kNOS/2) ? 1 : -1;
163 padLength = param->GetPadPitchLength(sector,row);
164 padWidth = param->GetPadPitchWidth(sector);
168 x[0] = param->GetPadRowRadii(sector,row); // padrow X position - ideal
172 x[1]=(x[1]-0.5*maxPad)*padWidth;
176 x[2]*= zwidth; // tranform time bin to the distance to the ROC
177 x[2]-= 3.*param->GetZSigma() + param->GetNTBinsL1()*zwidth;
178 // subtract the time offsets
179 x[2] = sign*( param->GetZLength(sector) - x[2]);
182 inline void AliTPCTransform::RotatedGlobal2Global(Int_t sector,Double_t *x) const {
184 // transform possition rotated global to the global
187 GetCosAndSin(sector,cos,sin);
189 x[0]= cos*tmp+sin*x[1];
190 x[1]=-sin*tmp+cos*x[1];
193 inline void AliTPCTransform::Global2RotatedGlobal(Int_t sector,Double_t *x) const {
195 // tranform possition Global2RotatedGlobal
198 GetCosAndSin(sector,cos,sin);
200 x[0]= cos*tmp-sin*x[1];
201 x[1]= sin*tmp+cos*x[1];
204 inline void AliTPCTransform::GetCosAndSin(Int_t sector,Double_t &cos,
205 Double_t &sin) const {
206 cos=fCoss[sector%18];
207 sin=fSins[sector%18];
210 ClassImp(AliTPCTransform)