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 **************************************************************************/
18 ////////////////////////////////////////////////////////////////////////////
20 // Transforms clusters into space points with calibrated positions //
21 // defined in the local tracking system //
23 ////////////////////////////////////////////////////////////////////////////
25 #include <TGeoMatrix.h>
28 #include "AliTracker.h"
29 #include "AliCodeTimer.h"
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"
40 ClassImp(AliTRDtransform)
42 //_____________________________________________________________________________
43 //AliTRDtransform::AliTRDtransform()
45 AliTRDtransform::AliTRDtransform()
55 ,fCalVdriftDetValue(0)
57 ,fSamplingFrequency(0)
63 // AliTRDtransform default constructor
68 //_____________________________________________________________________________
69 //AliTRDtransform::AliTRDtransform(Int_t det)
71 AliTRDtransform::AliTRDtransform(Int_t det)
81 ,fCalVdriftDetValue(0)
83 ,fSamplingFrequency(0)
89 // AliTRDtransform constructor for a given detector
92 fGeo = new AliTRDgeometry();
93 if (!fGeo->CreateClusterMatrixArray()) {
94 AliError("Could not get transformation matrices\n");
97 fParam = AliTRDCommonParam::Instance();
99 AliError("Could not get common parameters\n");
101 fSamplingFrequency = fParam->GetSamplingFrequency();
103 fCalibration = AliTRDcalibDB::Instance();
105 AliError("Cannot find calibration object");
108 // Get the calibration objects for the global calibration
109 fCalVdriftDet = fCalibration->GetVdriftDet();
110 fCalT0Det = fCalibration->GetT0Det();
116 //_____________________________________________________________________________
117 //AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
119 AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
122 ,fDetector(t.fDetector)
129 ,fCalVdriftDetValue(0)
131 ,fSamplingFrequency(0)
137 // AliTRDtransform copy constructor
143 fGeo = new AliTRDgeometry();
144 fGeo->CreateClusterMatrixArray();
146 fParam = AliTRDCommonParam::Instance();
148 AliError("Could not get common parameters\n");
150 fSamplingFrequency = fParam->GetSamplingFrequency();
152 fCalibration = AliTRDcalibDB::Instance();
154 AliError("Cannot find calibration object");
156 fCalVdriftDet = fCalibration->GetVdriftDet();
157 fCalT0Det = fCalibration->GetT0Det();
161 //_____________________________________________________________________________
162 AliTRDtransform::~AliTRDtransform()
165 // AliTRDtransform destructor
174 //_____________________________________________________________________________
175 void AliTRDtransform::SetDetector(Int_t det)
178 // Set to a new detector number and update the calibration objects
179 // and values accordingly
184 // Get the calibration objects for the pad-by-pad calibration
185 fCalVdriftROC = fCalibration->GetVdriftROC(det);
186 fCalT0ROC = fCalibration->GetT0ROC(det);
188 // Get the detector wise defined calibration values
189 fCalVdriftDetValue = fCalVdriftDet->GetValue(det);
190 fCalT0DetValue = fCalT0Det->GetValue(det);
192 // Shift needed to define Z-position relative to middle of chamber
193 Int_t pla = fGeo->GetPlane(det);
194 Int_t cha = fGeo->GetChamber(det);
195 fPadPlane = fGeo->GetPadPlane(pla,cha);
196 fZShiftIdeal = 0.5 * (fPadPlane->GetRow0() + fPadPlane->GetRowEnd());
198 // Get the current transformation matrix
199 fMatrix = fGeo->GetClusterMatrix(det);
203 //_____________________________________________________________________________
204 Bool_t AliTRDtransform::Transform(Double_t *x, Int_t *i, UInt_t time, Bool_t &out, Int_t /*coordinateType*/)
207 // Transforms the local cluster coordinates into calibrated
208 // space point positions defined in the local tracking system.
210 // Here the calibration for T0, Vdrift and ExB is applied as well.
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)
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)
231 Double_t posLocal[3];
232 Double_t posTracking[3];
237 // Parameter to adjust the X position
238 const Double_t kX0shift = 2.52;
255 // Calibration values
256 Double_t vdrift = fCalVdriftDetValue * fCalVdriftROC->GetValue(col,row);
257 Double_t t0 = fCalT0DetValue + fCalT0ROC->GetValue(col,row);
260 Double_t timeT0Cal = time - t0;
261 // Calculate the X-position,
262 Double_t xLocal = (timeT0Cal + 0.5) / fSamplingFrequency * vdrift;
264 // Length of the amplification region
265 Double_t ampLength = (Double_t) AliTRDgeometry::CamHght();
266 // The drift distance
267 Double_t driftLength = TMath::Max(xLocal - 0.5*ampLength,0.0);
269 Double_t exbCorr = fCalibration->GetOmegaTau(vdrift
270 ,-0.1*AliTracker::GetBz());
273 Double_t rowSize = fPadPlane->GetRowSize(row);
274 Double_t colSize = fPadPlane->GetColSize(col);
276 // Invert the X-position,
277 // apply ExB correction to the Y-position
278 // and move to the Z-position relative to the middle of the chamber
279 posLocal[0] = -xLocal;
280 posLocal[1] = (fPadPlane->GetColPos(col) - (x[0] + 0.5) * colSize) - driftLength * exbCorr;
281 posLocal[2] = (fPadPlane->GetRowPos(row) - 0.5 * rowSize) - fZShiftIdeal;
283 // Go to tracking coordinates
284 fMatrix->LocalToMaster(posLocal,posTracking);
286 // The total charge of the cluster
290 Double_t clusterCharge = q0 + q1 + q2;
291 Double_t clusterSigmaY2 = 0.0;
292 if (clusterCharge > 0.0) {
293 clusterSigmaY2 = (q1 * (q0 + q2) + 4.0 * q0 * q2)
294 / (clusterCharge*clusterCharge);
298 x[0] = posTracking[0] + kX0shift;
299 x[1] = posTracking[1];
300 x[2] = posTracking[2];
301 x[3] = clusterCharge;
302 x[4] = colSize*colSize * (clusterSigmaY2 + 1.0/12.0);
303 x[5] = rowSize*rowSize / 12.0;
304 i[2] = TMath::Nint(timeT0Cal);
306 // A.Bercuci for TRD tracking calibration awareness
307 out = (i[2] < 0 || i[2] > Int_t(3.5*fSamplingFrequency/vdrift)) ? kTRUE : kFALSE;
315 //_____________________________________________________________________________
316 void AliTRDtransform::Recalibrate(AliTRDcluster *c, Bool_t setDet)
319 // Recalibrates the position of a given cluster
320 // If <setDet> is TRUE, the detector number is set for each cluster
321 // automatically. Otherwise, AliTRDtransform::SetDetector() has to
326 SetDetector(c->GetDetector());
329 // Transform the local cluster coordinates into recalibrated
330 // space point positions defined in the local tracking system.
331 // Here the calibration for T0, Vdrift and ExB is applied as well.
332 Double_t clusterXYZ[6];
333 clusterXYZ[0] = c->GetCenter();
340 clusterRCT[0] = c->GetPadRow();
341 clusterRCT[1] = c->GetPadCol();
343 Int_t time = c->GetPadTime();
345 Transform(clusterXYZ,clusterRCT,((UInt_t) time), out, 0);
347 // Set the recalibrated coordinates
348 c->SetX(clusterXYZ[0]);
349 c->SetY(clusterXYZ[1]);
350 c->SetZ(clusterXYZ[2]);
351 c->SetLocalTimeBin(((Char_t) clusterRCT[2]));
352 c->SetInChamber(!out);