ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  Transforms clusters into space points with calibrated positions       //
//  defined in the local tracking system                                  //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#include <TGeoMatrix.h>

#include "AliLog.h"

#include "AliTRDtransform.h"
#include "AliTRDcluster.h"
#include "AliTRDgeometry.h"
#include "AliTRDpadPlane.h"
#include "AliTRDCommonParam.h"
#include "AliTRDcalibDB.h"
#include "Cal/AliTRDCalDet.h"
#include "Cal/AliTRDCalROC.h"

ClassImp(AliTRDtransform)

//_____________________________________________________________________________
AliTRDtransform::AliTRDtransform()
  :TObject()
  ,fDetector(0)
  ,fParam(0x0)
  ,fCalibration(0x0)
  ,fCalVdriftROC(0x0)
  ,fCalT0ROC(0x0)
  ,fCalPRFROC(0x0)
  ,fkCalVdriftDet(0x0)
  ,fkCalT0Det(0x0)
  ,fkCalExBDet(0x0)
  ,fCalVdriftDetValue(0)
  ,fCalT0DetValue(0)
  ,fCalExBDetValue(0)
  ,fSamplingFrequency(0)
  ,fPadPlane(0x0)
  ,fZShiftIdeal(0)
  ,fMatrix(0x0)
{
  //
  // AliTRDtransform default constructor
  //

  fParam             = AliTRDCommonParam::Instance();
  if (!fParam) {
    AliError("Could not get common parameters\n");
  }
  fSamplingFrequency = fParam->GetSamplingFrequency();

  fCalibration       = AliTRDcalibDB::Instance();
  if (!fCalibration) {
    AliError("Cannot find calibration object");
  }

  // Get the calibration objects for the global calibration
  fkCalVdriftDet     = fCalibration->GetVdriftDet();
  fkCalT0Det         = fCalibration->GetT0Det();
  fkCalExBDet        = fCalibration->GetExBDet();

}

//_____________________________________________________________________________
AliTRDtransform::AliTRDtransform(Int_t det)
  :TObject()
  ,fDetector(0)
  ,fParam(0x0)
  ,fCalibration(0x0)
  ,fCalVdriftROC(0x0)
  ,fCalT0ROC(0x0)
  ,fCalPRFROC(0x0)
  ,fkCalVdriftDet(0x0)
  ,fkCalT0Det(0x0)
  ,fkCalExBDet(0x0)
  ,fCalVdriftDetValue(0)
  ,fCalT0DetValue(0)
  ,fCalExBDetValue(0)
  ,fSamplingFrequency(0)
  ,fPadPlane(0x0)
  ,fZShiftIdeal(0)
  ,fMatrix(0x0)
{
  //
  // AliTRDtransform constructor for a given detector
  //

  fParam             = AliTRDCommonParam::Instance();
  if (!fParam) {
    AliError("Could not get common parameters\n");
  }
  fSamplingFrequency = fParam->GetSamplingFrequency();

  fCalibration       = AliTRDcalibDB::Instance();
  if (!fCalibration) {
    AliError("Cannot find calibration object");
  }

  // Get the calibration objects for the global calibration
  fkCalVdriftDet     = fCalibration->GetVdriftDet();
  fkCalT0Det         = fCalibration->GetT0Det();
  fkCalExBDet        = fCalibration->GetExBDet();

  SetDetector(det);

}

//_____________________________________________________________________________
AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
  :TObject(t)
  ,fDetector(t.fDetector)
  ,fParam(0x0)
  ,fCalibration(0x0)
  ,fCalVdriftROC(0x0)
  ,fCalT0ROC(0x0)
  ,fCalPRFROC(0x0)
  ,fkCalVdriftDet(0x0)
  ,fkCalT0Det(0x0)
  ,fkCalExBDet(0x0)
  ,fCalVdriftDetValue(0)
  ,fCalT0DetValue(0)
  ,fCalExBDetValue(0)
  ,fSamplingFrequency(0)
  ,fPadPlane(0x0)
  ,fZShiftIdeal(0)
  ,fMatrix(0x0)
{
  //
  // AliTRDtransform copy constructor
  //

  fParam             = AliTRDCommonParam::Instance();
  if (!fParam) {
    AliError("Could not get common parameters\n");
  }
  fSamplingFrequency = fParam->GetSamplingFrequency();

  fCalibration = AliTRDcalibDB::Instance();
  if (!fCalibration) {
    AliError("Cannot find calibration object");
  }
  fkCalVdriftDet     = fCalibration->GetVdriftDet();
  fkCalT0Det         = fCalibration->GetT0Det();
  fkCalExBDet        = fCalibration->GetExBDet();
}

//_____________________________________________________________________________
AliTRDtransform::~AliTRDtransform()
{
  //
  // AliTRDtransform destructor
  //
  //  delete fCalibration;
}

//_____________________________________________________________________________
AliTRDtransform &AliTRDtransform::operator=(const AliTRDtransform &t)
{
  //
  // Assignment operator
  //

  if (this != &t) {
    ((AliTRDtransform &) t).Copy(*this);
  }

  return *this;

}

//_____________________________________________________________________________
void AliTRDtransform::Copy(TObject &t) const
{
  //
  // Copy function
  //

  ((AliTRDtransform &) t).fDetector          = fDetector;
  ((AliTRDtransform &) t).fParam             = AliTRDCommonParam::Instance();
  ((AliTRDtransform &) t).fCalibration       = AliTRDcalibDB::Instance();
  if (fCalibration) {
    ((AliTRDtransform &) t).fkCalVdriftDet   = fCalibration->GetVdriftDet();
    ((AliTRDtransform &) t).fkCalT0Det       = fCalibration->GetT0Det();
    ((AliTRDtransform &) t).fkCalExBDet      = fCalibration->GetExBDet();
  }
  else {
    ((AliTRDtransform &) t).fkCalVdriftDet   = 0;
    ((AliTRDtransform &) t).fkCalT0Det       = 0;
    ((AliTRDtransform &) t).fkCalExBDet      = 0;
  }
  ((AliTRDtransform &) t).fCalVdriftROC      = 0x0;
  ((AliTRDtransform &) t).fCalT0ROC          = 0x0;
  ((AliTRDtransform &) t).fCalPRFROC         = 0x0;
  ((AliTRDtransform &) t).fCalVdriftDetValue = 0; 
  ((AliTRDtransform &) t).fCalT0DetValue     = 0;
  ((AliTRDtransform &) t).fCalExBDetValue     = 0;
  ((AliTRDtransform &) t).fSamplingFrequency = 0;
  ((AliTRDtransform &) t).fPadPlane          = 0x0;
  ((AliTRDtransform &) t).fZShiftIdeal       = 0;
  ((AliTRDtransform &) t).fMatrix            = 0x0;

}

//_____________________________________________________________________________
AliTRDgeometry& AliTRDtransform::Geometry()
{
  static AliTRDgeometry g;
  if (!g.CreateClusterMatrixArray()) {
    AliErrorGeneral("AliTRDtransform::Geometry()", "Could not get transformation matrices\n");
  }
  return g;
}

//_____________________________________________________________________________
void AliTRDtransform::SetDetector(Int_t det)
{
  //
  // Set to a new detector number and update the calibration objects
  // and values accordingly
  //

  fDetector          = det;

  // Get the calibration objects for the pad-by-pad calibration
  fCalVdriftROC      = fCalibration->GetVdriftROC(det);
  fCalT0ROC          = fCalibration->GetT0ROC(det);
  fCalPRFROC         = fCalibration->GetPRFROC(det);

  // Get the detector wise defined calibration values
  fCalVdriftDetValue = fkCalVdriftDet->GetValue(det);
  fCalT0DetValue     = fkCalT0Det->GetValue(det);
  fCalExBDetValue    = fkCalExBDet->GetValue(det);

  // Shift needed to define Z-position relative to middle of chamber
  Int_t layer        = Geometry().GetLayer(det);
  Int_t stack        = Geometry().GetStack(det);
  fPadPlane          = Geometry().GetPadPlane(layer,stack);
  fZShiftIdeal       = 0.5 * (fPadPlane->GetRow0() + fPadPlane->GetRowEnd());

  // Get the current transformation matrix
  fMatrix            = Geometry().GetClusterMatrix(det);

}

//_____________________________________________________________________________
Bool_t AliTRDtransform::Transform(AliTRDcluster *c)
{
  //
  // Transforms the local cluster coordinates into calibrated 
  // space point positions defined in the local tracking system.
  //
  // Here the calibration for T0, Vdrift and ExB is applied as well.
  //
  // Input: Cluster in the local chamber coordinates
  // Output: Tracking cluster

  if (!fMatrix) return kFALSE;


  // Parameters to adjust the X position of clusters in the alignable volume
  const Double_t kX0shift = AliTRDgeometry::AnodePos(); //[cm]

 
  // Retrieve calibration values
  Int_t col = c->GetPadCol(), row = c->GetPadRow();
  // drift velocity
  Double_t vd  = fCalVdriftDetValue * fCalVdriftROC->GetValue(col,row);
  // t0
  Double_t t0  = fCalT0DetValue     + fCalT0ROC->GetValue(col,row);
  t0 /= fSamplingFrequency;
  // ExB correction
  Double_t exb = fCalExBDetValue;//AliTRDCommonParam::Instance()->GetOmegaTau(vd);

  Float_t x = c->GetXloc(t0, vd);

  // Pad dimensions
  Double_t rs = fPadPlane->GetRowSize(row);
  Double_t cs = fPadPlane->GetColSize(col);

  // cluster error with diffusion corrections
  Double_t s2  = cs*fCalPRFROC->GetValue(col, row); 
  s2 *= s2; 
  Float_t dl, dt;
  AliTRDCommonParam::Instance()->GetDiffCoeff(dl, dt, vd);

  Double_t y0 = fPadPlane->GetColPos(col) + .5*cs;
  Double_t loc[] = {
    kX0shift-x,                    // Invert the X-position,
    c->GetYloc(y0, s2, cs) - x*exb,// apply ExB correction
    fPadPlane->GetRowPos(row) - .5*rs - fZShiftIdeal // move the Z-position relative to the middle of the chamber
  };

  // Go to tracking coordinates
  Double_t trk[3];
  fMatrix->LocalToMaster(loc, trk);

  // store tracking values
  c->SetX(trk[0]);c->SetY(trk[1]);c->SetZ(trk[2]);
  c->SetSigmaY2(s2, dt, exb, x);
  c->SetSigmaZ2(fPadPlane->GetRowSize(row)*fPadPlane->GetRowSize(row)/12.);
  
  return kTRUE;

}

//_____________________________________________________________________________
void AliTRDtransform::Recalibrate(AliTRDcluster *c, Bool_t setDet)
{
  //
  // Recalibrates the position of a given cluster
  // If <setDet> is TRUE, the detector number is set for each cluster
  // automatically. Otherwise, AliTRDtransform::SetDetector() has to
  // be used.
  //

  if (setDet) SetDetector(c->GetDetector());
  Transform(c);

}
 AliTRDtransform.cxx:1
 AliTRDtransform.cxx:2
 AliTRDtransform.cxx:3
 AliTRDtransform.cxx:4
 AliTRDtransform.cxx:5
 AliTRDtransform.cxx:6
 AliTRDtransform.cxx:7
 AliTRDtransform.cxx:8
 AliTRDtransform.cxx:9
 AliTRDtransform.cxx:10
 AliTRDtransform.cxx:11
 AliTRDtransform.cxx:12
 AliTRDtransform.cxx:13
 AliTRDtransform.cxx:14
 AliTRDtransform.cxx:15
 AliTRDtransform.cxx:16
 AliTRDtransform.cxx:17
 AliTRDtransform.cxx:18
 AliTRDtransform.cxx:19
 AliTRDtransform.cxx:20
 AliTRDtransform.cxx:21
 AliTRDtransform.cxx:22
 AliTRDtransform.cxx:23
 AliTRDtransform.cxx:24
 AliTRDtransform.cxx:25
 AliTRDtransform.cxx:26
 AliTRDtransform.cxx:27
 AliTRDtransform.cxx:28
 AliTRDtransform.cxx:29
 AliTRDtransform.cxx:30
 AliTRDtransform.cxx:31
 AliTRDtransform.cxx:32
 AliTRDtransform.cxx:33
 AliTRDtransform.cxx:34
 AliTRDtransform.cxx:35
 AliTRDtransform.cxx:36
 AliTRDtransform.cxx:37
 AliTRDtransform.cxx:38
 AliTRDtransform.cxx:39
 AliTRDtransform.cxx:40
 AliTRDtransform.cxx:41
 AliTRDtransform.cxx:42
 AliTRDtransform.cxx:43
 AliTRDtransform.cxx:44
 AliTRDtransform.cxx:45
 AliTRDtransform.cxx:46
 AliTRDtransform.cxx:47
 AliTRDtransform.cxx:48
 AliTRDtransform.cxx:49
 AliTRDtransform.cxx:50
 AliTRDtransform.cxx:51
 AliTRDtransform.cxx:52
 AliTRDtransform.cxx:53
 AliTRDtransform.cxx:54
 AliTRDtransform.cxx:55
 AliTRDtransform.cxx:56
 AliTRDtransform.cxx:57
 AliTRDtransform.cxx:58
 AliTRDtransform.cxx:59
 AliTRDtransform.cxx:60
 AliTRDtransform.cxx:61
 AliTRDtransform.cxx:62
 AliTRDtransform.cxx:63
 AliTRDtransform.cxx:64
 AliTRDtransform.cxx:65
 AliTRDtransform.cxx:66
 AliTRDtransform.cxx:67
 AliTRDtransform.cxx:68
 AliTRDtransform.cxx:69
 AliTRDtransform.cxx:70
 AliTRDtransform.cxx:71
 AliTRDtransform.cxx:72
 AliTRDtransform.cxx:73
 AliTRDtransform.cxx:74
 AliTRDtransform.cxx:75
 AliTRDtransform.cxx:76
 AliTRDtransform.cxx:77
 AliTRDtransform.cxx:78
 AliTRDtransform.cxx:79
 AliTRDtransform.cxx:80
 AliTRDtransform.cxx:81
 AliTRDtransform.cxx:82
 AliTRDtransform.cxx:83
 AliTRDtransform.cxx:84
 AliTRDtransform.cxx:85
 AliTRDtransform.cxx:86
 AliTRDtransform.cxx:87
 AliTRDtransform.cxx:88
 AliTRDtransform.cxx:89
 AliTRDtransform.cxx:90
 AliTRDtransform.cxx:91
 AliTRDtransform.cxx:92
 AliTRDtransform.cxx:93
 AliTRDtransform.cxx:94
 AliTRDtransform.cxx:95
 AliTRDtransform.cxx:96
 AliTRDtransform.cxx:97
 AliTRDtransform.cxx:98
 AliTRDtransform.cxx:99
 AliTRDtransform.cxx:100
 AliTRDtransform.cxx:101
 AliTRDtransform.cxx:102
 AliTRDtransform.cxx:103
 AliTRDtransform.cxx:104
 AliTRDtransform.cxx:105
 AliTRDtransform.cxx:106
 AliTRDtransform.cxx:107
 AliTRDtransform.cxx:108
 AliTRDtransform.cxx:109
 AliTRDtransform.cxx:110
 AliTRDtransform.cxx:111
 AliTRDtransform.cxx:112
 AliTRDtransform.cxx:113
 AliTRDtransform.cxx:114
 AliTRDtransform.cxx:115
 AliTRDtransform.cxx:116
 AliTRDtransform.cxx:117
 AliTRDtransform.cxx:118
 AliTRDtransform.cxx:119
 AliTRDtransform.cxx:120
 AliTRDtransform.cxx:121
 AliTRDtransform.cxx:122
 AliTRDtransform.cxx:123
 AliTRDtransform.cxx:124
 AliTRDtransform.cxx:125
 AliTRDtransform.cxx:126
 AliTRDtransform.cxx:127
 AliTRDtransform.cxx:128
 AliTRDtransform.cxx:129
 AliTRDtransform.cxx:130
 AliTRDtransform.cxx:131
 AliTRDtransform.cxx:132
 AliTRDtransform.cxx:133
 AliTRDtransform.cxx:134
 AliTRDtransform.cxx:135
 AliTRDtransform.cxx:136
 AliTRDtransform.cxx:137
 AliTRDtransform.cxx:138
 AliTRDtransform.cxx:139
 AliTRDtransform.cxx:140
 AliTRDtransform.cxx:141
 AliTRDtransform.cxx:142
 AliTRDtransform.cxx:143
 AliTRDtransform.cxx:144
 AliTRDtransform.cxx:145
 AliTRDtransform.cxx:146
 AliTRDtransform.cxx:147
 AliTRDtransform.cxx:148
 AliTRDtransform.cxx:149
 AliTRDtransform.cxx:150
 AliTRDtransform.cxx:151
 AliTRDtransform.cxx:152
 AliTRDtransform.cxx:153
 AliTRDtransform.cxx:154
 AliTRDtransform.cxx:155
 AliTRDtransform.cxx:156
 AliTRDtransform.cxx:157
 AliTRDtransform.cxx:158
 AliTRDtransform.cxx:159
 AliTRDtransform.cxx:160
 AliTRDtransform.cxx:161
 AliTRDtransform.cxx:162
 AliTRDtransform.cxx:163
 AliTRDtransform.cxx:164
 AliTRDtransform.cxx:165
 AliTRDtransform.cxx:166
 AliTRDtransform.cxx:167
 AliTRDtransform.cxx:168
 AliTRDtransform.cxx:169
 AliTRDtransform.cxx:170
 AliTRDtransform.cxx:171
 AliTRDtransform.cxx:172
 AliTRDtransform.cxx:173
 AliTRDtransform.cxx:174
 AliTRDtransform.cxx:175
 AliTRDtransform.cxx:176
 AliTRDtransform.cxx:177
 AliTRDtransform.cxx:178
 AliTRDtransform.cxx:179
 AliTRDtransform.cxx:180
 AliTRDtransform.cxx:181
 AliTRDtransform.cxx:182
 AliTRDtransform.cxx:183
 AliTRDtransform.cxx:184
 AliTRDtransform.cxx:185
 AliTRDtransform.cxx:186
 AliTRDtransform.cxx:187
 AliTRDtransform.cxx:188
 AliTRDtransform.cxx:189
 AliTRDtransform.cxx:190
 AliTRDtransform.cxx:191
 AliTRDtransform.cxx:192
 AliTRDtransform.cxx:193
 AliTRDtransform.cxx:194
 AliTRDtransform.cxx:195
 AliTRDtransform.cxx:196
 AliTRDtransform.cxx:197
 AliTRDtransform.cxx:198
 AliTRDtransform.cxx:199
 AliTRDtransform.cxx:200
 AliTRDtransform.cxx:201
 AliTRDtransform.cxx:202
 AliTRDtransform.cxx:203
 AliTRDtransform.cxx:204
 AliTRDtransform.cxx:205
 AliTRDtransform.cxx:206
 AliTRDtransform.cxx:207
 AliTRDtransform.cxx:208
 AliTRDtransform.cxx:209
 AliTRDtransform.cxx:210
 AliTRDtransform.cxx:211
 AliTRDtransform.cxx:212
 AliTRDtransform.cxx:213
 AliTRDtransform.cxx:214
 AliTRDtransform.cxx:215
 AliTRDtransform.cxx:216
 AliTRDtransform.cxx:217
 AliTRDtransform.cxx:218
 AliTRDtransform.cxx:219
 AliTRDtransform.cxx:220
 AliTRDtransform.cxx:221
 AliTRDtransform.cxx:222
 AliTRDtransform.cxx:223
 AliTRDtransform.cxx:224
 AliTRDtransform.cxx:225
 AliTRDtransform.cxx:226
 AliTRDtransform.cxx:227
 AliTRDtransform.cxx:228
 AliTRDtransform.cxx:229
 AliTRDtransform.cxx:230
 AliTRDtransform.cxx:231
 AliTRDtransform.cxx:232
 AliTRDtransform.cxx:233
 AliTRDtransform.cxx:234
 AliTRDtransform.cxx:235
 AliTRDtransform.cxx:236
 AliTRDtransform.cxx:237
 AliTRDtransform.cxx:238
 AliTRDtransform.cxx:239
 AliTRDtransform.cxx:240
 AliTRDtransform.cxx:241
 AliTRDtransform.cxx:242
 AliTRDtransform.cxx:243
 AliTRDtransform.cxx:244
 AliTRDtransform.cxx:245
 AliTRDtransform.cxx:246
 AliTRDtransform.cxx:247
 AliTRDtransform.cxx:248
 AliTRDtransform.cxx:249
 AliTRDtransform.cxx:250
 AliTRDtransform.cxx:251
 AliTRDtransform.cxx:252
 AliTRDtransform.cxx:253
 AliTRDtransform.cxx:254
 AliTRDtransform.cxx:255
 AliTRDtransform.cxx:256
 AliTRDtransform.cxx:257
 AliTRDtransform.cxx:258
 AliTRDtransform.cxx:259
 AliTRDtransform.cxx:260
 AliTRDtransform.cxx:261
 AliTRDtransform.cxx:262
 AliTRDtransform.cxx:263
 AliTRDtransform.cxx:264
 AliTRDtransform.cxx:265
 AliTRDtransform.cxx:266
 AliTRDtransform.cxx:267
 AliTRDtransform.cxx:268
 AliTRDtransform.cxx:269
 AliTRDtransform.cxx:270
 AliTRDtransform.cxx:271
 AliTRDtransform.cxx:272
 AliTRDtransform.cxx:273
 AliTRDtransform.cxx:274
 AliTRDtransform.cxx:275
 AliTRDtransform.cxx:276
 AliTRDtransform.cxx:277
 AliTRDtransform.cxx:278
 AliTRDtransform.cxx:279
 AliTRDtransform.cxx:280
 AliTRDtransform.cxx:281
 AliTRDtransform.cxx:282
 AliTRDtransform.cxx:283
 AliTRDtransform.cxx:284
 AliTRDtransform.cxx:285
 AliTRDtransform.cxx:286
 AliTRDtransform.cxx:287
 AliTRDtransform.cxx:288
 AliTRDtransform.cxx:289
 AliTRDtransform.cxx:290
 AliTRDtransform.cxx:291
 AliTRDtransform.cxx:292
 AliTRDtransform.cxx:293
 AliTRDtransform.cxx:294
 AliTRDtransform.cxx:295
 AliTRDtransform.cxx:296
 AliTRDtransform.cxx:297
 AliTRDtransform.cxx:298
 AliTRDtransform.cxx:299
 AliTRDtransform.cxx:300
 AliTRDtransform.cxx:301
 AliTRDtransform.cxx:302
 AliTRDtransform.cxx:303
 AliTRDtransform.cxx:304
 AliTRDtransform.cxx:305
 AliTRDtransform.cxx:306
 AliTRDtransform.cxx:307
 AliTRDtransform.cxx:308
 AliTRDtransform.cxx:309
 AliTRDtransform.cxx:310
 AliTRDtransform.cxx:311
 AliTRDtransform.cxx:312
 AliTRDtransform.cxx:313
 AliTRDtransform.cxx:314
 AliTRDtransform.cxx:315
 AliTRDtransform.cxx:316
 AliTRDtransform.cxx:317
 AliTRDtransform.cxx:318
 AliTRDtransform.cxx:319
 AliTRDtransform.cxx:320
 AliTRDtransform.cxx:321
 AliTRDtransform.cxx:322
 AliTRDtransform.cxx:323
 AliTRDtransform.cxx:324
 AliTRDtransform.cxx:325
 AliTRDtransform.cxx:326
 AliTRDtransform.cxx:327
 AliTRDtransform.cxx:328
 AliTRDtransform.cxx:329
 AliTRDtransform.cxx:330
 AliTRDtransform.cxx:331
 AliTRDtransform.cxx:332
 AliTRDtransform.cxx:333
 AliTRDtransform.cxx:334
 AliTRDtransform.cxx:335
 AliTRDtransform.cxx:336
 AliTRDtransform.cxx:337