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 fGeo->ReadGeoMatrices();
95 fParam = AliTRDCommonParam::Instance();
97 AliError("Could not get common parameters\n");
99 fSamplingFrequency = fParam->GetSamplingFrequency();
101 fCalibration = AliTRDcalibDB::Instance();
103 AliError("Cannot find calibration object");
106 // Get the calibration objects for the global calibration
107 fCalVdriftDet = fCalibration->GetVdriftDet();
108 fCalT0Det = fCalibration->GetT0Det();
114 //_____________________________________________________________________________
115 //AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
117 AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
120 ,fDetector(t.fDetector)
127 ,fCalVdriftDetValue(0)
129 ,fSamplingFrequency(0)
135 // AliTRDtransform copy constructor
141 fGeo = new AliTRDgeometry();
142 fGeo->ReadGeoMatrices();
144 fParam = AliTRDCommonParam::Instance();
146 AliError("Could not get common parameters\n");
148 fSamplingFrequency = fParam->GetSamplingFrequency();
150 fCalibration = AliTRDcalibDB::Instance();
152 AliError("Cannot find calibration object");
154 fCalVdriftDet = fCalibration->GetVdriftDet();
155 fCalT0Det = fCalibration->GetT0Det();
159 //_____________________________________________________________________________
160 AliTRDtransform::~AliTRDtransform()
163 // AliTRDtransform destructor
172 //_____________________________________________________________________________
173 void AliTRDtransform::SetDetector(Int_t det)
176 // Set to a new detector number and update the calibration objects
177 // and values accordingly
182 // Get the calibration objects for the pad-by-pad calibration
183 fCalVdriftROC = fCalibration->GetVdriftROC(det);
184 fCalT0ROC = fCalibration->GetT0ROC(det);
186 // Get the detector wise defined calibration values
187 fCalVdriftDetValue = fCalVdriftDet->GetValue(det);
188 fCalT0DetValue = fCalT0Det->GetValue(det);
190 // Shift needed to define Z-position relative to middle of chamber
191 Int_t pla = fGeo->GetPlane(det);
192 Int_t cha = fGeo->GetChamber(det);
193 fPadPlane = fGeo->GetPadPlane(pla,cha);
194 fZShiftIdeal = 0.5 * (fPadPlane->GetRow0() + fPadPlane->GetRowEnd());
196 // Get the current transformation matrix
197 fMatrix = fGeo->GetCorrectionMatrix(det);
201 //_____________________________________________________________________________
202 void AliTRDtransform::Transform(Double_t *x, Int_t *i, UInt_t time
203 , Int_t /*coordinateType*/)
206 // Transforms the local cluster coordinates into calibrated
207 // space point positions defined in the local tracking system.
209 // Here the calibration for T0, Vdrift and ExB is applied as well.
212 // x[0] = COL-position relative to the center pad (pad units)
213 // x[1] = cluster signal in left pad
214 // x[2] = cluster signal in middle pad
215 // x[3] = cluster signal in right pad
216 // i[0] = ROW pad number
217 // i[1] = COL pad number
218 // time = time bin number (uncalibrated for t0)
221 // x[0] = X-positions in tracking CS
222 // x[1] = Y-positions in tracking CS
223 // x[2] = Z-positions in tracking CS
224 // x[3] = total cluster charge
225 // x[4] = error in Y-direction
226 // x[5] = error in Z-direction
227 // i[2] = time bin number (calibrated for t0)
230 Double_t posLocal[3];
231 Double_t posTracking[3];
236 // Parameter to adjust the X position
237 const Double_t kX0shift = 2.52;
252 // Calibration values
253 Double_t vdrift = fCalVdriftDetValue * fCalVdriftROC->GetValue(col,row);
254 Double_t t0 = fCalT0DetValue + fCalT0ROC->GetValue(col,row);
257 Double_t timeT0Cal = time - t0;
258 // Calculate the X-position,
259 Double_t xLocal = (timeT0Cal + 0.5) / fSamplingFrequency * vdrift;
261 // Length of the amplification region
262 Double_t ampLength = (Double_t) AliTRDgeometry::CamHght();
263 // The drift distance
264 Double_t driftLength = TMath::Max(xLocal - 0.5*ampLength,0.0);
266 Double_t exbCorr = fCalibration->GetOmegaTau(vdrift
267 ,-0.1*AliTracker::GetBz());
270 Double_t rowSize = fPadPlane->GetRowSize(row);
271 Double_t colSize = fPadPlane->GetColSize(col);
273 // Invert the X-position,
274 // apply ExB correction to the Y-position
275 // and move to the Z-position relative to the middle of the chamber
276 posLocal[0] = -xLocal;
277 posLocal[1] = (fPadPlane->GetColPos(col) - (x[0] + 0.5) * colSize) - driftLength * exbCorr;
278 posLocal[2] = (fPadPlane->GetRowPos(row) - 0.5 * rowSize) - fZShiftIdeal;
280 // Go to tracking coordinates
281 fMatrix->LocalToMaster(posLocal,posTracking);
283 // The total charge of the cluster
287 Double_t clusterCharge = q0 + q1 + q2;
288 Double_t clusterSigmaY2 = 0.0;
289 if (clusterCharge > 0.0) {
290 clusterSigmaY2 = (q1 * (q0 + q2) + 4.0 * q0 * q2)
291 / (clusterCharge*clusterCharge);
295 x[0] = posTracking[0] + kX0shift;
296 x[1] = posTracking[1];
297 x[2] = posTracking[2];
298 x[3] = clusterCharge;
299 x[4] = colSize*colSize * (clusterSigmaY2 + 1.0/12.0);
300 x[5] = rowSize*rowSize / 12.0;
301 i[2] = TMath::Nint(timeT0Cal);
307 //_____________________________________________________________________________
308 void AliTRDtransform::Recalibrate(AliTRDcluster *c, Bool_t setDet)
311 // Recalibrates the position of a given cluster
312 // If <setDet> is TRUE, the detector number is set for each cluster
313 // automatically. Otherwise, AliTRDtransform::SetDetector() has to
318 SetDetector(c->GetDetector());
321 // Transform the local cluster coordinates into recalibrated
322 // space point positions defined in the local tracking system.
323 // Here the calibration for T0, Vdrift and ExB is applied as well.
324 Double_t clusterXYZ[6];
325 clusterXYZ[0] = c->GetCenter();
332 clusterRCT[0] = c->GetPadRow();
333 clusterRCT[1] = c->GetPadCol();
335 Int_t time = c->GetPadTime();
336 Transform(clusterXYZ,clusterRCT,((UInt_t) time),0);
338 // Set the recalibrated coordinates
339 c->SetX(clusterXYZ[0]);
340 c->SetY(clusterXYZ[1]);
341 c->SetZ(clusterXYZ[2]);
342 c->SetLocalTimeBin(((Char_t) clusterRCT[2]));