running local for SP and LYZEP and new histograms for QC
[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 #include "AliTracker.h"
29 #include "AliCodeTimer.h"
30
31 #include "AliTRDtransform.h"
32 #include "AliTRDcluster.h"
33 #include "AliTRDgeometry.h"
34 #include "AliTRDpadPlane.h"
35 #include "AliTRDCommonParam.h"
36 #include "AliTRDcalibDB.h"
37 #include "Cal/AliTRDCalDet.h"
38 #include "Cal/AliTRDCalROC.h"
39
40 ClassImp(AliTRDtransform)
41
42 //_____________________________________________________________________________
43 //AliTRDtransform::AliTRDtransform()
44 //  :AliTransform()
45 AliTRDtransform::AliTRDtransform()
46   :TObject()
47   ,fGeo(0x0)
48   ,fDetector(0)
49   ,fParam(0x0)
50   ,fCalibration(0x0)
51   ,fCalVdriftROC(0x0)
52   ,fCalT0ROC(0x0)
53   ,fCalVdriftDet(0x0)
54   ,fCalT0Det(0x0)
55   ,fCalVdriftDetValue(0)
56   ,fCalT0DetValue(0)
57   ,fSamplingFrequency(0)
58   ,fPadPlane(0x0)
59   ,fZShiftIdeal(0)
60   ,fMatrix(0x0)
61 {
62   //
63   // AliTRDtransform default constructor
64   //
65
66 }
67
68 //_____________________________________________________________________________
69 //AliTRDtransform::AliTRDtransform(Int_t det)
70 //  :AliTransform()
71 AliTRDtransform::AliTRDtransform(Int_t det)
72   :TObject()
73   ,fGeo(0x0)
74   ,fDetector(0)
75   ,fParam(0x0)
76   ,fCalibration(0x0)
77   ,fCalVdriftROC(0x0)
78   ,fCalT0ROC(0x0)
79   ,fCalVdriftDet(0x0)
80   ,fCalT0Det(0x0)
81   ,fCalVdriftDetValue(0)
82   ,fCalT0DetValue(0)
83   ,fSamplingFrequency(0)
84   ,fPadPlane(0x0)
85   ,fZShiftIdeal(0)
86   ,fMatrix(0x0)
87 {
88   //
89   // AliTRDtransform constructor for a given detector
90   //
91
92   fGeo               = new AliTRDgeometry();
93   if (!fGeo->CreateClusterMatrixArray()) {
94     AliError("Could not get transformation matrices\n");
95   }
96
97   fParam             = AliTRDCommonParam::Instance();
98   if (!fParam) {
99     AliError("Could not get common parameters\n");
100   }
101   fSamplingFrequency = fParam->GetSamplingFrequency();
102
103   fCalibration       = AliTRDcalibDB::Instance();
104   if (!fCalibration) {
105     AliError("Cannot find calibration object");
106   }
107
108   // Get the calibration objects for the global calibration
109   fCalVdriftDet      = fCalibration->GetVdriftDet();
110   fCalT0Det          = fCalibration->GetT0Det();
111
112   SetDetector(det);
113
114 }
115
116 //_____________________________________________________________________________
117 //AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
118 //  :AliTransform(t)
119 AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
120   :TObject(t)
121   ,fGeo(0x0)
122   ,fDetector(t.fDetector)
123   ,fParam(0x0)
124   ,fCalibration(0x0)
125   ,fCalVdriftROC(0x0)
126   ,fCalT0ROC(0x0)
127   ,fCalVdriftDet(0x0)
128   ,fCalT0Det(0x0)
129   ,fCalVdriftDetValue(0)
130   ,fCalT0DetValue(0)
131   ,fSamplingFrequency(0)
132   ,fPadPlane(0x0)
133   ,fZShiftIdeal(0)
134   ,fMatrix(0x0)
135 {
136   //
137   // AliTRDtransform copy constructor
138   //
139
140   if (fGeo) {
141     delete fGeo;
142   }
143   fGeo               = new AliTRDgeometry();
144   fGeo->CreateClusterMatrixArray();
145
146   fParam             = AliTRDCommonParam::Instance();
147   if (!fParam) {
148     AliError("Could not get common parameters\n");
149   }
150   fSamplingFrequency = fParam->GetSamplingFrequency();
151
152   fCalibration = AliTRDcalibDB::Instance();
153   if (!fCalibration) {
154     AliError("Cannot find calibration object");
155   }
156   fCalVdriftDet      = fCalibration->GetVdriftDet();
157   fCalT0Det          = fCalibration->GetT0Det();
158
159 }
160
161 //_____________________________________________________________________________
162 AliTRDtransform::~AliTRDtransform()
163 {
164   //
165   // AliTRDtransform destructor
166   //
167
168   if (fGeo) {
169     delete fGeo;
170   }
171
172 }
173
174 //_____________________________________________________________________________
175 void AliTRDtransform::SetDetector(Int_t det)
176 {
177   //
178   // Set to a new detector number and update the calibration objects
179   // and values accordingly
180   //
181
182   fDetector          = det;
183
184   // Get the calibration objects for the pad-by-pad calibration
185   fCalVdriftROC      = fCalibration->GetVdriftROC(det);
186   fCalT0ROC          = fCalibration->GetT0ROC(det);
187
188   // Get the detector wise defined calibration values
189   fCalVdriftDetValue = fCalVdriftDet->GetValue(det);
190   fCalT0DetValue     = fCalT0Det->GetValue(det);
191
192   // Shift needed to define Z-position relative to middle of chamber
193   Int_t layer        = fGeo->GetLayer(det);
194   Int_t stack        = fGeo->GetStack(det);
195   fPadPlane          = fGeo->GetPadPlane(layer,stack);
196   fZShiftIdeal       = 0.5 * (fPadPlane->GetRow0() + fPadPlane->GetRowEnd());
197
198   // Get the current transformation matrix
199   fMatrix            = fGeo->GetClusterMatrix(det);
200
201 }
202
203 //_____________________________________________________________________________
204 Bool_t AliTRDtransform::Transform(Double_t *x, Int_t *i, UInt_t time, Bool_t &out, Int_t  /*coordinateType*/)
205 {
206   //
207   // Transforms the local cluster coordinates into calibrated 
208   // space point positions defined in the local tracking system.
209   //
210   // Here the calibration for T0, Vdrift and ExB is applied as well.
211   //
212   // Input:
213   //   x[0] = COL-position relative to the center pad (pad units)
214   //   x[1] = cluster signal in left pad
215   //   x[2] = cluster signal in middle pad
216   //   x[3] = cluster signal in right pad
217   //   i[0] = ROW pad number
218   //   i[1] = COL pad number
219   //   time = time bin number (uncalibrated for t0)
220   //
221   // Output:
222   //   x[0] = X-positions in tracking CS
223   //   x[1] = Y-positions in tracking CS
224   //   x[2] = Z-positions in tracking CS
225   //   x[3] = total cluster charge
226   //   x[4] = error in Y-direction
227   //   x[5] = error in Z-direction
228   //   i[2] = time bin number (calibrated for t0)
229   //
230
231   Double_t posLocal[3];
232   Double_t posTracking[3];
233
234   Int_t row = i[0];
235   Int_t col = i[1];
236
237   // Parameters to adjust the X position
238   const Double_t kX0shift = 2.52 + 0.04273; //[cm]
239   const Double_t kT0shift = 3.19e-3;        //[us]
240
241   if (!fMatrix) {
242
243     x[0] = 0.0;
244     x[1] = 0.0;
245     x[2] = 0.0;
246     x[3] = 0.0;
247     x[4] = 0.0;
248     x[5] = 0.0;
249     i[2] = 0;
250
251     return kFALSE;
252
253   }
254   else {
255  
256     // Calibration values
257     Double_t vdrift      = fCalVdriftDetValue * fCalVdriftROC->GetValue(col,row);
258     Double_t t0          = fCalT0DetValue     + fCalT0ROC->GetValue(col,row);
259
260     // T0 correction
261     Double_t timeT0Cal   = time - t0;
262     // Calculate the X-position,
263     Double_t xLocal      = ((timeT0Cal + 0.5) / fSamplingFrequency + kT0shift) * vdrift; 
264
265     // Length of the amplification region
266     Double_t ampLength   = (Double_t) AliTRDgeometry::CamHght();
267     // The drift distance
268     Double_t driftLength = TMath::Max(xLocal - 0.5*ampLength,0.0);
269     // ExB correction
270     Double_t exbCorr     = fCalibration->GetOmegaTau(vdrift
271                                                     ,-0.1*AliTracker::GetBz());
272
273     // Pad dimensions
274     Double_t rowSize     = fPadPlane->GetRowSize(row);
275     Double_t colSize     = fPadPlane->GetColSize(col);
276
277     // Invert the X-position,
278     // apply ExB correction to the Y-position
279     // and move to the Z-position relative to the middle of the chamber
280     posLocal[0] = -xLocal;
281     posLocal[1] =  (fPadPlane->GetColPos(col) + (0.5 + x[0]) * colSize) - driftLength * exbCorr;
282     posLocal[2] =  (fPadPlane->GetRowPos(row) -         0.5  * rowSize) - fZShiftIdeal;
283
284     // Go to tracking coordinates
285     fMatrix->LocalToMaster(posLocal,posTracking);
286
287     // The total charge of the cluster
288     Double_t q0             = x[1];
289     Double_t q1             = x[2];
290     Double_t q2             = x[3];
291     Double_t clusterCharge  = q0 + q1 + q2; 
292     Double_t clusterSigmaY2 = 0.0;
293     if (clusterCharge > 0.0) {
294       clusterSigmaY2 = (q1 * (q0 + q2) + 4.0 * q0 * q2)
295                      / (clusterCharge*clusterCharge);
296     }
297
298     // Output values
299     x[0] = posTracking[0] + kX0shift;
300     x[1] = posTracking[1];
301     x[2] = posTracking[2];
302     x[3] = clusterCharge;
303     x[4] = colSize*colSize * (clusterSigmaY2 + 1.0/12.0);
304     x[5] = rowSize*rowSize / 12.0;                                       
305     i[2] = TMath::Nint(timeT0Cal);
306                 
307     // For TRD tracking calibration awareness
308     out  = ((i[2] < 0) || (i[2] > Int_t(3.5 * fSamplingFrequency/vdrift))) ? kTRUE : kFALSE; 
309
310     return kTRUE;
311
312   }
313
314 }
315
316 //_____________________________________________________________________________
317 void AliTRDtransform::Recalibrate(AliTRDcluster *c, Bool_t setDet)
318 {
319   //
320   // Recalibrates the position of a given cluster
321   // If <setDet> is TRUE, the detector number is set for each cluster
322   // automatically. Otherwise, AliTRDtransform::SetDetector() has to
323   // be used.
324   //
325
326   if (setDet) {
327     SetDetector(c->GetDetector());
328   }
329
330   // Transform the local cluster coordinates into recalibrated 
331   // space point positions defined in the local tracking system.
332   // Here the calibration for T0, Vdrift and ExB is applied as well.
333   Double_t clusterXYZ[6];
334   clusterXYZ[0] = c->GetCenter();
335   clusterXYZ[1] = 0.0;
336   clusterXYZ[2] = 0.0;
337   clusterXYZ[3] = 0.0;
338   clusterXYZ[4] = 0.0;
339   clusterXYZ[5] = 0.0;
340   Int_t    clusterRCT[3];
341   clusterRCT[0] = c->GetPadRow();
342   clusterRCT[1] = c->GetPadCol();
343   clusterRCT[2] = 0;
344   Int_t time    = c->GetPadTime();
345   Bool_t out;
346   Transform(clusterXYZ,clusterRCT,((UInt_t) time), out, 0);
347
348   // Set the recalibrated coordinates
349   c->SetX(clusterXYZ[0]);
350   c->SetY(clusterXYZ[1]);
351   c->SetZ(clusterXYZ[2]);
352   c->SetLocalTimeBin(((Char_t) clusterRCT[2]));
353   c->SetInChamber(!out);
354
355 }