ROOT logo
#include <stdio.h>

#include "TMath.h"

#include "AliTRDltuParam.h"

// definition of geometry constants
Float_t AliTRDltuParam::fgZrow[6][5] = {
  {301, 177, 53, -57, -181},
  {301, 177, 53, -57, -181},
  {315, 184, 53, -57, -188},
  {329, 191, 53, -57, -195},
  {343, 198, 53, -57, -202},
  {347, 200, 53, -57, -204}};
Float_t AliTRDltuParam::fgX[6] =
  {300.65, 313.25, 325.85, 338.45, 351.05, 363.65};
Float_t AliTRDltuParam::fgTiltingAngle[6] =
  {-2., 2., -2., 2., -2., 2.};
Int_t   AliTRDltuParam::fgDyMax =  63;
Int_t   AliTRDltuParam::fgDyMin = -64;
Float_t AliTRDltuParam::fgBinDy = 140e-4;
Float_t AliTRDltuParam::fgWidthPad[6] =
  {0.635, 0.665, 0.695, 0.725, 0.755, 0.785};
Float_t AliTRDltuParam::fgLengthInnerPadC1[6] =
  {7.5, 7.5, 8.0, 8.5, 9.0, 9.0};
Float_t AliTRDltuParam::fgLengthOuterPadC1[6] =
  {7.5, 7.5, 7.5, 7.5, 7.5, 8.5};
Float_t AliTRDltuParam::fgLengthInnerPadC0 = 9.0;
Float_t AliTRDltuParam::fgLengthOuterPadC0 = 8.0;
Float_t AliTRDltuParam::fgScalePad = 256. * 32.;
Float_t AliTRDltuParam::fgDriftLength = 3.;

AliTRDltuParam::AliTRDltuParam() :
  TObject(),
  fMagField(0.),
  fOmegaTau(0.),
  fPtMin(0.1),
  fNtimebins(20 << 5),
  fScaleQ0(0),
  fScaleQ1(0),
  fPidTracklengthCorr(kFALSE),
  fTiltCorr(kFALSE),
  fPidGainCorr(kFALSE)
{
  // default constructor
}

AliTRDltuParam::~AliTRDltuParam()
{
  // destructor
}

Int_t AliTRDltuParam::GetDyCorrection(Int_t det, Int_t rob, Int_t mcm) const
{
  // calculate the correction of the deflection
  // i.e. Lorentz angle and tilt correction (if active)

  Int_t layer = det % 6;

  Float_t dyTilt = ( fgDriftLength * TMath::Tan(fgTiltingAngle[layer] * TMath::Pi()/180.) *
  		     GetLocalZ(det, rob, mcm) / fgX[layer] );

  // calculate Lorentz correction
  Float_t dyCorr = - fOmegaTau * fgDriftLength;

  if(fTiltCorr)
    dyCorr += dyTilt; // add tilt correction

  return (int) TMath::Nint(dyCorr * fgScalePad / fgWidthPad[layer]);
}

void AliTRDltuParam::GetDyRange(Int_t det, Int_t rob, Int_t mcm, Int_t ch,
				 Int_t &dyMinInt, Int_t &dyMaxInt) const
{
  // calculate the deflection range in which tracklets are accepted

  dyMinInt = fgDyMin;
  dyMaxInt = fgDyMax;

  // deflection cut is considered for |B| > 0.1 T only
  if (TMath::Abs(fMagField) < 0.1)
    return;

  Float_t e = 0.30;

  Float_t maxDeflTemp = GetPerp(det, rob, mcm, ch)/2. * // Sekante/2 (cm)
    (e * 1e-2 * TMath::Abs(fMagField) / fPtMin);   // 1/R (1/cm)

  Float_t maxDeflAngle = 0.;

  Float_t phi = GetPhi(det, rob, mcm, ch);
  if (maxDeflTemp < TMath::Cos(phi)) {
    maxDeflAngle = TMath::ASin(maxDeflTemp);

    Float_t dyMin = ( fgDriftLength *
		      TMath::Tan(phi - maxDeflAngle) );

    dyMinInt = Int_t(dyMin / fgBinDy);
    // clipping to allowed range
    if (dyMinInt < fgDyMin)
      dyMinInt = fgDyMin;
    else if (dyMinInt > fgDyMax)
      dyMinInt = fgDyMax;

    Float_t dyMax = ( fgDriftLength *
  		      TMath::Tan(phi + maxDeflAngle) );

    dyMaxInt = Int_t(dyMax / fgBinDy);
    // clipping to allowed range
    if (dyMaxInt > fgDyMax)
      dyMaxInt = fgDyMax;
    else if (dyMaxInt < fgDyMin)
      dyMaxInt = fgDyMin;
  }
  else if (maxDeflTemp < 0.) {
    // this must not happen
    printf("Inconsistent calculation of sin(alpha): %f\n", maxDeflTemp);
  }
  else {
    // TRD is not reached at the given pt threshold
    // max range
  }

  if ((dyMaxInt - dyMinInt) <= 0) {
    printf("strange dy range: [%i,%i], using max range now\n", dyMinInt, dyMaxInt);
    dyMaxInt = fgDyMax;
    dyMinInt = fgDyMin;
  }
}

Float_t AliTRDltuParam::GetElongation(Int_t det, Int_t rob, Int_t mcm, Int_t ch) const
{
  // calculate the ratio of the distance to the primary vertex and the
  // distance in x-direction for the given ADC channel

  Int_t layer = det % 6;

  Float_t elongation = TMath::Abs(GetDist(det, rob, mcm, ch) / fgX[layer]);

  // sanity check
  if(elongation<0.001) {
    elongation=1.;
  }
  return elongation;
}

void AliTRDltuParam::GetCorrectionFactors(Int_t det, Int_t rob, Int_t mcm, Int_t ch,
					  UInt_t &cor0, UInt_t &cor1, Float_t gain) const
{
  // calculate the gain correction factors for the given ADC channel

  if (fPidGainCorr==kFALSE)
    gain=1;

  if (fPidTracklengthCorr == kTRUE ) {
    cor0 = UInt_t ((1.0*fScaleQ0* (1./GetElongation(det, rob, mcm, ch))) / gain );
    cor1 = UInt_t ((1.0*fScaleQ1* (1./GetElongation(det, rob, mcm, ch))) / gain );
  }
  else {
    cor0 = UInt_t (fScaleQ0 / gain);
    cor1 = UInt_t ( fScaleQ1 / gain);
  }
}

Int_t AliTRDltuParam::GetNtimebins() const
{
  // return the number of timebins used

  return fNtimebins;
}

Float_t AliTRDltuParam::GetX(Int_t det, Int_t /* rob */, Int_t /* mcm */) const
{
  // return the distance to the beam axis in x-direction

  Int_t layer = det%6;
  return fgX[layer];
}

Float_t AliTRDltuParam::GetLocalY(Int_t det, Int_t rob, Int_t mcm, Int_t ch) const
{
  // get local y-position (r-phi) w.r.t. the chamber centre

  Int_t layer = det%6;
  // calculate the pad position as in the TRAP
  Float_t ypos = (-4 + 1 + (rob&0x1) * 4 + (mcm&0x3)) * 18 - ch - 0.5; // y position in bins of pad widths
  return ypos*fgWidthPad[layer];
}

Float_t AliTRDltuParam::GetLocalZ(Int_t det, Int_t rob, Int_t mcm) const
{
  // get local z-position w.r.t. to the chamber boundary

  Int_t stack = (det%30) / 6;
  Int_t layer = det % 6;
  Int_t row   = (rob/2) * 4 + mcm/4;

  if (stack == 2) {
    if (row == 0)
      return (fgZrow[layer][stack] - 0.5 * fgLengthOuterPadC0);
    else if (row == 11)
      return (fgZrow[layer][stack] - 1.5 * fgLengthOuterPadC0 - (row - 1) * fgLengthInnerPadC0);
    else
      return (fgZrow[layer][stack] - fgLengthOuterPadC0 - (row - 0.5) * fgLengthInnerPadC0);
  }
  else {
    if (row == 0)
      return (fgZrow[layer][stack] - 0.5 * fgLengthOuterPadC1[layer]);
    else if (row == 15)
      return (fgZrow[layer][stack] - 1.5 * fgLengthOuterPadC1[layer] - (row - 1) * fgLengthInnerPadC1[layer]);
    else
      return (fgZrow[layer][stack] - fgLengthOuterPadC1[layer] - (row - 0.5) * fgLengthInnerPadC1[layer]);
  }
}

Float_t AliTRDltuParam::GetPerp(Int_t det, Int_t rob, Int_t mcm, Int_t ch) const
{
  // get transverse distance to the beam axis

  return TMath::Sqrt(GetLocalY(det, rob, mcm, ch)*GetLocalY(det, rob, mcm, ch) +
		     GetX(det, rob, mcm)*GetX(det, rob, mcm) );
}

Float_t AliTRDltuParam::GetPhi(Int_t det, Int_t rob, Int_t mcm, Int_t ch) const
{
  // calculate the azimuthal angle for the given ADC channel

  return TMath::ATan2(GetLocalY(det, rob, mcm, ch), GetX(det, rob, mcm));
}

Float_t AliTRDltuParam::GetDist(Int_t det, Int_t rob, Int_t mcm, Int_t ch) const
{
  // calculate the distance from the origin for the given ADC channel

  return TMath::Sqrt(GetLocalY(det, rob, mcm, ch)*GetLocalY(det, rob, mcm, ch) +
		     GetX(det, rob, mcm)*GetX(det, rob, mcm) +
		     GetLocalZ(det, rob, mcm)*GetLocalZ(det, rob, mcm) );
}
 AliTRDltuParam.cxx:1
 AliTRDltuParam.cxx:2
 AliTRDltuParam.cxx:3
 AliTRDltuParam.cxx:4
 AliTRDltuParam.cxx:5
 AliTRDltuParam.cxx:6
 AliTRDltuParam.cxx:7
 AliTRDltuParam.cxx:8
 AliTRDltuParam.cxx:9
 AliTRDltuParam.cxx:10
 AliTRDltuParam.cxx:11
 AliTRDltuParam.cxx:12
 AliTRDltuParam.cxx:13
 AliTRDltuParam.cxx:14
 AliTRDltuParam.cxx:15
 AliTRDltuParam.cxx:16
 AliTRDltuParam.cxx:17
 AliTRDltuParam.cxx:18
 AliTRDltuParam.cxx:19
 AliTRDltuParam.cxx:20
 AliTRDltuParam.cxx:21
 AliTRDltuParam.cxx:22
 AliTRDltuParam.cxx:23
 AliTRDltuParam.cxx:24
 AliTRDltuParam.cxx:25
 AliTRDltuParam.cxx:26
 AliTRDltuParam.cxx:27
 AliTRDltuParam.cxx:28
 AliTRDltuParam.cxx:29
 AliTRDltuParam.cxx:30
 AliTRDltuParam.cxx:31
 AliTRDltuParam.cxx:32
 AliTRDltuParam.cxx:33
 AliTRDltuParam.cxx:34
 AliTRDltuParam.cxx:35
 AliTRDltuParam.cxx:36
 AliTRDltuParam.cxx:37
 AliTRDltuParam.cxx:38
 AliTRDltuParam.cxx:39
 AliTRDltuParam.cxx:40
 AliTRDltuParam.cxx:41
 AliTRDltuParam.cxx:42
 AliTRDltuParam.cxx:43
 AliTRDltuParam.cxx:44
 AliTRDltuParam.cxx:45
 AliTRDltuParam.cxx:46
 AliTRDltuParam.cxx:47
 AliTRDltuParam.cxx:48
 AliTRDltuParam.cxx:49
 AliTRDltuParam.cxx:50
 AliTRDltuParam.cxx:51
 AliTRDltuParam.cxx:52
 AliTRDltuParam.cxx:53
 AliTRDltuParam.cxx:54
 AliTRDltuParam.cxx:55
 AliTRDltuParam.cxx:56
 AliTRDltuParam.cxx:57
 AliTRDltuParam.cxx:58
 AliTRDltuParam.cxx:59
 AliTRDltuParam.cxx:60
 AliTRDltuParam.cxx:61
 AliTRDltuParam.cxx:62
 AliTRDltuParam.cxx:63
 AliTRDltuParam.cxx:64
 AliTRDltuParam.cxx:65
 AliTRDltuParam.cxx:66
 AliTRDltuParam.cxx:67
 AliTRDltuParam.cxx:68
 AliTRDltuParam.cxx:69
 AliTRDltuParam.cxx:70
 AliTRDltuParam.cxx:71
 AliTRDltuParam.cxx:72
 AliTRDltuParam.cxx:73
 AliTRDltuParam.cxx:74
 AliTRDltuParam.cxx:75
 AliTRDltuParam.cxx:76
 AliTRDltuParam.cxx:77
 AliTRDltuParam.cxx:78
 AliTRDltuParam.cxx:79
 AliTRDltuParam.cxx:80
 AliTRDltuParam.cxx:81
 AliTRDltuParam.cxx:82
 AliTRDltuParam.cxx:83
 AliTRDltuParam.cxx:84
 AliTRDltuParam.cxx:85
 AliTRDltuParam.cxx:86
 AliTRDltuParam.cxx:87
 AliTRDltuParam.cxx:88
 AliTRDltuParam.cxx:89
 AliTRDltuParam.cxx:90
 AliTRDltuParam.cxx:91
 AliTRDltuParam.cxx:92
 AliTRDltuParam.cxx:93
 AliTRDltuParam.cxx:94
 AliTRDltuParam.cxx:95
 AliTRDltuParam.cxx:96
 AliTRDltuParam.cxx:97
 AliTRDltuParam.cxx:98
 AliTRDltuParam.cxx:99
 AliTRDltuParam.cxx:100
 AliTRDltuParam.cxx:101
 AliTRDltuParam.cxx:102
 AliTRDltuParam.cxx:103
 AliTRDltuParam.cxx:104
 AliTRDltuParam.cxx:105
 AliTRDltuParam.cxx:106
 AliTRDltuParam.cxx:107
 AliTRDltuParam.cxx:108
 AliTRDltuParam.cxx:109
 AliTRDltuParam.cxx:110
 AliTRDltuParam.cxx:111
 AliTRDltuParam.cxx:112
 AliTRDltuParam.cxx:113
 AliTRDltuParam.cxx:114
 AliTRDltuParam.cxx:115
 AliTRDltuParam.cxx:116
 AliTRDltuParam.cxx:117
 AliTRDltuParam.cxx:118
 AliTRDltuParam.cxx:119
 AliTRDltuParam.cxx:120
 AliTRDltuParam.cxx:121
 AliTRDltuParam.cxx:122
 AliTRDltuParam.cxx:123
 AliTRDltuParam.cxx:124
 AliTRDltuParam.cxx:125
 AliTRDltuParam.cxx:126
 AliTRDltuParam.cxx:127
 AliTRDltuParam.cxx:128
 AliTRDltuParam.cxx:129
 AliTRDltuParam.cxx:130
 AliTRDltuParam.cxx:131
 AliTRDltuParam.cxx:132
 AliTRDltuParam.cxx:133
 AliTRDltuParam.cxx:134
 AliTRDltuParam.cxx:135
 AliTRDltuParam.cxx:136
 AliTRDltuParam.cxx:137
 AliTRDltuParam.cxx:138
 AliTRDltuParam.cxx:139
 AliTRDltuParam.cxx:140
 AliTRDltuParam.cxx:141
 AliTRDltuParam.cxx:142
 AliTRDltuParam.cxx:143
 AliTRDltuParam.cxx:144
 AliTRDltuParam.cxx:145
 AliTRDltuParam.cxx:146
 AliTRDltuParam.cxx:147
 AliTRDltuParam.cxx:148
 AliTRDltuParam.cxx:149
 AliTRDltuParam.cxx:150
 AliTRDltuParam.cxx:151
 AliTRDltuParam.cxx:152
 AliTRDltuParam.cxx:153
 AliTRDltuParam.cxx:154
 AliTRDltuParam.cxx:155
 AliTRDltuParam.cxx:156
 AliTRDltuParam.cxx:157
 AliTRDltuParam.cxx:158
 AliTRDltuParam.cxx:159
 AliTRDltuParam.cxx:160
 AliTRDltuParam.cxx:161
 AliTRDltuParam.cxx:162
 AliTRDltuParam.cxx:163
 AliTRDltuParam.cxx:164
 AliTRDltuParam.cxx:165
 AliTRDltuParam.cxx:166
 AliTRDltuParam.cxx:167
 AliTRDltuParam.cxx:168
 AliTRDltuParam.cxx:169
 AliTRDltuParam.cxx:170
 AliTRDltuParam.cxx:171
 AliTRDltuParam.cxx:172
 AliTRDltuParam.cxx:173
 AliTRDltuParam.cxx:174
 AliTRDltuParam.cxx:175
 AliTRDltuParam.cxx:176
 AliTRDltuParam.cxx:177
 AliTRDltuParam.cxx:178
 AliTRDltuParam.cxx:179
 AliTRDltuParam.cxx:180
 AliTRDltuParam.cxx:181
 AliTRDltuParam.cxx:182
 AliTRDltuParam.cxx:183
 AliTRDltuParam.cxx:184
 AliTRDltuParam.cxx:185
 AliTRDltuParam.cxx:186
 AliTRDltuParam.cxx:187
 AliTRDltuParam.cxx:188
 AliTRDltuParam.cxx:189
 AliTRDltuParam.cxx:190
 AliTRDltuParam.cxx:191
 AliTRDltuParam.cxx:192
 AliTRDltuParam.cxx:193
 AliTRDltuParam.cxx:194
 AliTRDltuParam.cxx:195
 AliTRDltuParam.cxx:196
 AliTRDltuParam.cxx:197
 AliTRDltuParam.cxx:198
 AliTRDltuParam.cxx:199
 AliTRDltuParam.cxx:200
 AliTRDltuParam.cxx:201
 AliTRDltuParam.cxx:202
 AliTRDltuParam.cxx:203
 AliTRDltuParam.cxx:204
 AliTRDltuParam.cxx:205
 AliTRDltuParam.cxx:206
 AliTRDltuParam.cxx:207
 AliTRDltuParam.cxx:208
 AliTRDltuParam.cxx:209
 AliTRDltuParam.cxx:210
 AliTRDltuParam.cxx:211
 AliTRDltuParam.cxx:212
 AliTRDltuParam.cxx:213
 AliTRDltuParam.cxx:214
 AliTRDltuParam.cxx:215
 AliTRDltuParam.cxx:216
 AliTRDltuParam.cxx:217
 AliTRDltuParam.cxx:218
 AliTRDltuParam.cxx:219
 AliTRDltuParam.cxx:220
 AliTRDltuParam.cxx:221
 AliTRDltuParam.cxx:222
 AliTRDltuParam.cxx:223
 AliTRDltuParam.cxx:224
 AliTRDltuParam.cxx:225
 AliTRDltuParam.cxx:226
 AliTRDltuParam.cxx:227
 AliTRDltuParam.cxx:228
 AliTRDltuParam.cxx:229
 AliTRDltuParam.cxx:230
 AliTRDltuParam.cxx:231
 AliTRDltuParam.cxx:232
 AliTRDltuParam.cxx:233
 AliTRDltuParam.cxx:234
 AliTRDltuParam.cxx:235
 AliTRDltuParam.cxx:236
 AliTRDltuParam.cxx:237
 AliTRDltuParam.cxx:238