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