X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDltuParam.cxx;h=4ab469801d139e8bf02f525cc26a10a05e9570a9;hb=368c671a613ba7a5017d9279144b85ae7c659ea4;hp=bf4e46348c69a50ddf1984b655e99d85d93a6a9a;hpb=918cceaaf7995cf7a84887d19a671d360298eb6a;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDltuParam.cxx b/TRD/AliTRDltuParam.cxx index bf4e46348c6..4ab469801d1 100644 --- a/TRD/AliTRDltuParam.cxx +++ b/TRD/AliTRDltuParam.cxx @@ -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) );