]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDtransform.cxx
Changes in order to modify also ITSonly tracks
[u/mrichter/AliRoot.git] / TRD / AliTRDtransform.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 /* $Id$ */
17
18 ////////////////////////////////////////////////////////////////////////////
19 //                                                                        //
20 //  Transforms clusters into space points with calibrated positions       //
21 //  defined in the local tracking system                                  //
22 //                                                                        //
23 ////////////////////////////////////////////////////////////////////////////
24
25 #include <TGeoMatrix.h>
26
27 #include "AliLog.h"
28
29 #include "AliTRDtransform.h"
30 #include "AliTRDcluster.h"
31 #include "AliTRDgeometry.h"
32 #include "AliTRDpadPlane.h"
33 #include "AliTRDCommonParam.h"
34 #include "AliTRDcalibDB.h"
35 #include "Cal/AliTRDCalDet.h"
36 #include "Cal/AliTRDCalROC.h"
37
38 ClassImp(AliTRDtransform)
39
40 AliTRDgeometry* AliTRDtransform::fgGeo = NULL;
41
42 //_____________________________________________________________________________
43 AliTRDtransform::AliTRDtransform()
44   :TObject()
45   ,fDetector(0)
46   ,fParam(0x0)
47   ,fCalibration(0x0)
48   ,fCalVdriftROC(0x0)
49   ,fCalT0ROC(0x0)
50   ,fCalPRFROC(0x0)
51   ,fkCalVdriftDet(0x0)
52   ,fkCalT0Det(0x0)
53   ,fCalVdriftDetValue(0)
54   ,fCalT0DetValue(0)
55   ,fSamplingFrequency(0)
56   ,fPadPlane(0x0)
57   ,fZShiftIdeal(0)
58   ,fMatrix(0x0)
59 {
60   //
61   // AliTRDtransform default constructor
62   //
63
64   if(!fgGeo){
65     fgGeo = new AliTRDgeometry();
66     if (!fgGeo->CreateClusterMatrixArray()) {
67       AliError("Could not get transformation matrices\n");
68     }
69   }
70
71   fParam             = AliTRDCommonParam::Instance();
72   if (!fParam) {
73     AliError("Could not get common parameters\n");
74   }
75   fSamplingFrequency = fParam->GetSamplingFrequency();
76
77   fCalibration       = AliTRDcalibDB::Instance();
78   if (!fCalibration) {
79     AliError("Cannot find calibration object");
80   }
81
82   // Get the calibration objects for the global calibration
83   fkCalVdriftDet     = fCalibration->GetVdriftDet();
84   fkCalT0Det         = fCalibration->GetT0Det();
85
86 }
87
88 //_____________________________________________________________________________
89 AliTRDtransform::AliTRDtransform(Int_t det)
90   :TObject()
91   ,fDetector(0)
92   ,fParam(0x0)
93   ,fCalibration(0x0)
94   ,fCalVdriftROC(0x0)
95   ,fCalT0ROC(0x0)
96   ,fCalPRFROC(0x0)
97   ,fkCalVdriftDet(0x0)
98   ,fkCalT0Det(0x0)
99   ,fCalVdriftDetValue(0)
100   ,fCalT0DetValue(0)
101   ,fSamplingFrequency(0)
102   ,fPadPlane(0x0)
103   ,fZShiftIdeal(0)
104   ,fMatrix(0x0)
105 {
106   //
107   // AliTRDtransform constructor for a given detector
108   //
109
110   if(!fgGeo){
111     fgGeo = new AliTRDgeometry();
112     if (!fgGeo->CreateClusterMatrixArray()) {
113       AliError("Could not get transformation matrices\n");
114     }
115   }
116
117   fParam             = AliTRDCommonParam::Instance();
118   if (!fParam) {
119     AliError("Could not get common parameters\n");
120   }
121   fSamplingFrequency = fParam->GetSamplingFrequency();
122
123   fCalibration       = AliTRDcalibDB::Instance();
124   if (!fCalibration) {
125     AliError("Cannot find calibration object");
126   }
127
128   // Get the calibration objects for the global calibration
129   fkCalVdriftDet     = fCalibration->GetVdriftDet();
130   fkCalT0Det         = fCalibration->GetT0Det();
131
132   SetDetector(det);
133
134 }
135
136 //_____________________________________________________________________________
137 AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
138   :TObject(t)
139   ,fDetector(t.fDetector)
140   ,fParam(0x0)
141   ,fCalibration(0x0)
142   ,fCalVdriftROC(0x0)
143   ,fCalT0ROC(0x0)
144   ,fCalPRFROC(0x0)
145   ,fkCalVdriftDet(0x0)
146   ,fkCalT0Det(0x0)
147   ,fCalVdriftDetValue(0)
148   ,fCalT0DetValue(0)
149   ,fSamplingFrequency(0)
150   ,fPadPlane(0x0)
151   ,fZShiftIdeal(0)
152   ,fMatrix(0x0)
153 {
154   //
155   // AliTRDtransform copy constructor
156   //
157
158   fParam             = AliTRDCommonParam::Instance();
159   if (!fParam) {
160     AliError("Could not get common parameters\n");
161   }
162   fSamplingFrequency = fParam->GetSamplingFrequency();
163
164   fCalibration = AliTRDcalibDB::Instance();
165   if (!fCalibration) {
166     AliError("Cannot find calibration object");
167   }
168   fkCalVdriftDet     = fCalibration->GetVdriftDet();
169   fkCalT0Det         = fCalibration->GetT0Det();
170
171 }
172
173 //_____________________________________________________________________________
174 AliTRDtransform::~AliTRDtransform()
175 {
176   //
177   // AliTRDtransform destructor
178   //
179
180 }
181
182 //_____________________________________________________________________________
183 AliTRDtransform &AliTRDtransform::operator=(const AliTRDtransform &t)
184 {
185   //
186   // Assignment operator
187   //
188
189   if (this != &t) {
190     ((AliTRDtransform &) t).Copy(*this);
191   }
192
193   return *this;
194
195 }
196
197 //_____________________________________________________________________________
198 void AliTRDtransform::Copy(TObject &t) const
199 {
200   //
201   // Copy function
202   //
203
204   ((AliTRDtransform &) t).fDetector          = fDetector;
205   ((AliTRDtransform &) t).fParam             = AliTRDCommonParam::Instance();
206   ((AliTRDtransform &) t).fCalibration       = AliTRDcalibDB::Instance();
207   if (fCalibration) {
208     ((AliTRDtransform &) t).fkCalVdriftDet   = fCalibration->GetVdriftDet();
209     ((AliTRDtransform &) t).fkCalT0Det       = fCalibration->GetT0Det();
210   }
211   else {
212     ((AliTRDtransform &) t).fkCalVdriftDet   = 0;
213     ((AliTRDtransform &) t).fkCalT0Det       = 0;
214   }
215   ((AliTRDtransform &) t).fCalVdriftROC      = 0x0;
216   ((AliTRDtransform &) t).fCalT0ROC          = 0x0;
217   ((AliTRDtransform &) t).fCalPRFROC         = 0x0;
218   ((AliTRDtransform &) t).fCalVdriftDetValue = 0; 
219   ((AliTRDtransform &) t).fCalT0DetValue     = 0;
220   ((AliTRDtransform &) t).fSamplingFrequency = 0;
221   ((AliTRDtransform &) t).fPadPlane          = 0x0;
222   ((AliTRDtransform &) t).fZShiftIdeal       = 0;
223   ((AliTRDtransform &) t).fMatrix            = 0x0;
224
225 }
226
227 //_____________________________________________________________________________
228 void AliTRDtransform::SetDetector(Int_t det)
229 {
230   //
231   // Set to a new detector number and update the calibration objects
232   // and values accordingly
233   //
234
235   fDetector          = det;
236
237   // Get the calibration objects for the pad-by-pad calibration
238   fCalVdriftROC      = fCalibration->GetVdriftROC(det);
239   fCalT0ROC          = fCalibration->GetT0ROC(det);
240   fCalPRFROC         = fCalibration->GetPRFROC(det);
241
242   // Get the detector wise defined calibration values
243   fCalVdriftDetValue = fkCalVdriftDet->GetValue(det);
244   fCalT0DetValue     = fkCalT0Det->GetValue(det);
245
246   // Shift needed to define Z-position relative to middle of chamber
247   Int_t layer        = fgGeo->GetLayer(det);
248   Int_t stack        = fgGeo->GetStack(det);
249   fPadPlane          = fgGeo->GetPadPlane(layer,stack);
250   fZShiftIdeal       = 0.5 * (fPadPlane->GetRow0() + fPadPlane->GetRowEnd());
251
252   // Get the current transformation matrix
253   fMatrix            = fgGeo->GetClusterMatrix(det);
254
255 }
256
257 //_____________________________________________________________________________
258 Bool_t AliTRDtransform::Transform(AliTRDcluster *c)
259 {
260   //
261   // Transforms the local cluster coordinates into calibrated 
262   // space point positions defined in the local tracking system.
263   //
264   // Here the calibration for T0, Vdrift and ExB is applied as well.
265   //
266   // Input: Cluster in the local chamber coordinates
267   // Output: Tracking cluster
268
269   if (!fMatrix) return kFALSE;
270
271
272   // Parameters to adjust the X position of clusters in the alignable volume
273   const Double_t kX0shift = AliTRDgeometry::AnodePos(); //[cm]
274
275  
276   // Retrieve calibration values
277   Int_t col = c->GetPadCol(), row = c->GetPadRow();
278   // drift velocity
279   Double_t vd  = fCalVdriftDetValue * fCalVdriftROC->GetValue(col,row);
280   // t0
281   Double_t t0  = fCalT0DetValue     + fCalT0ROC->GetValue(col,row);
282   t0 /= fSamplingFrequency;
283   // ExB correction
284   Double_t exb = AliTRDCommonParam::Instance()->GetOmegaTau(vd);
285
286   Float_t x = c->GetXloc(t0, vd);
287
288   // Pad dimensions
289   Double_t rs = fPadPlane->GetRowSize(row);
290   Double_t cs = fPadPlane->GetColSize(col);
291
292   // cluster error with diffusion corrections
293   Double_t s2  = cs*fCalPRFROC->GetValue(col, row); 
294   s2 *= s2; 
295   Float_t dl, dt;
296   AliTRDCommonParam::Instance()->GetDiffCoeff(dl, dt, vd);
297
298   Double_t y0 = fPadPlane->GetColPos(col) + .5*cs;
299   Double_t loc[] = {
300     kX0shift-x,                    // Invert the X-position,
301     c->GetYloc(y0, s2, cs) - x*exb,// apply ExB correction
302     fPadPlane->GetRowPos(row) - .5*rs - fZShiftIdeal // move the Z-position relative to the middle of the chamber
303   };
304
305   // Go to tracking coordinates
306   Double_t trk[3];
307   fMatrix->LocalToMaster(loc, trk);
308
309   // store tracking values
310   c->SetX(trk[0]);c->SetY(trk[1]);c->SetZ(trk[2]);
311   c->SetSigmaY2(s2, dt, exb, x);
312   c->SetSigmaZ2(fPadPlane->GetRowSize(row)*fPadPlane->GetRowSize(row)/12.);
313   
314   return kTRUE;
315
316 }
317
318 //_____________________________________________________________________________
319 void AliTRDtransform::Recalibrate(AliTRDcluster *c, Bool_t setDet)
320 {
321   //
322   // Recalibrates the position of a given cluster
323   // If <setDet> is TRUE, the detector number is set for each cluster
324   // automatically. Otherwise, AliTRDtransform::SetDetector() has to
325   // be used.
326   //
327
328   if (setDet) SetDetector(c->GetDetector());
329   Transform(c);
330
331 }