]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDltuParam.cxx
- add protection against invalid sector/stack information in on-line track matching
[u/mrichter/AliRoot.git] / TRD / AliTRDltuParam.cxx
index bf4e46348c69a50ddf1984b655e99d85d93a6a9a..4ab469801d139e8bf02f525cc26a10a05e9570a9 100644 (file)
@@ -18,7 +18,7 @@ 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-6;
+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] =
@@ -39,14 +39,15 @@ AliTRDltuParam::AliTRDltuParam() :
   fScaleQ0(0),
   fScaleQ1(0),
   fPidTracklengthCorr(kFALSE),
-  fTiltCorr(kFALSE)
+  fTiltCorr(kFALSE),
+  fPidGainCorr(kFALSE)
 {
-
+  // default constructor
 }
 
 AliTRDltuParam::~AliTRDltuParam()
 {
-
+  // destructor
 }
 
 Int_t AliTRDltuParam::GetDyCorrection(Int_t det, Int_t rob, Int_t mcm) const
@@ -56,7 +57,7 @@ Int_t AliTRDltuParam::GetDyCorrection(Int_t det, Int_t rob, Int_t mcm) const
 
   Int_t layer = det % 6;
 
-  Float_t dyTilt = ( fgDriftLength * TMath::Tan(fgTiltingAngle[layer]) *
+  Float_t dyTilt = ( fgDriftLength * TMath::Tan(fgTiltingAngle[layer] * TMath::Pi()/180.) *
                     GetLocalZ(det, rob, mcm) / fgX[layer] );
 
   // calculate Lorentz correction
@@ -76,40 +77,62 @@ void AliTRDltuParam::GetDyRange(Int_t det, Int_t rob, Int_t mcm, Int_t ch,
   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
-    (e * TMath::Abs(fMagField) / fPtMin);   // 1/R
+  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.;
 
-  if (maxDeflTemp < 1.) {
+  Float_t phi = GetPhi(det, rob, mcm, ch);
+  if (maxDeflTemp < TMath::Cos(phi)) {
     maxDeflAngle = TMath::ASin(maxDeflTemp);
 
     Float_t dyMin = ( fgDriftLength *
-                     tan(GetPhi(det, rob, mcm, ch) - maxDeflAngle) );
+                     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(GetPhi(det, rob, mcm, ch) + maxDeflAngle) );
+                     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]\n", dyMinInt, dyMaxInt);
+    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]);
@@ -122,31 +145,42 @@ Float_t AliTRDltuParam::GetElongation(Int_t det, Int_t rob, Int_t mcm, Int_t ch)
 }
 
 void AliTRDltuParam::GetCorrectionFactors(Int_t det, Int_t rob, Int_t mcm, Int_t ch,
-                                         UInt_t &cor0, UInt_t &cor1) const
+                                         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 = Int_t ((1.0*fScaleQ0* (1./GetElongation(det, rob, mcm, ch)) ));
-    cor1 = Int_t ((1.0*fScaleQ1* (1./GetElongation(det, rob, mcm, ch)) ));
+    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 = fScaleQ0;
-    cor1 = fScaleQ1;
+    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
@@ -155,6 +189,8 @@ Float_t AliTRDltuParam::GetLocalY(Int_t det, Int_t rob, Int_t mcm, Int_t ch) con
 
 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;
@@ -179,17 +215,23 @@ Float_t AliTRDltuParam::GetLocalZ(Int_t det, Int_t rob, Int_t mcm) const
 
 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) );