The GEANT parameterization of the Bethe-Bloch formula is now a function of STEER...
authorbelikov <belikov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 8 Dec 2008 10:34:43 +0000 (10:34 +0000)
committerbelikov <belikov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 8 Dec 2008 10:34:43 +0000 (10:34 +0000)
STEER/AliExternalTrackParam.cxx
STEER/AliExternalTrackParam.h
STEER/AliMathBase.cxx
STEER/AliMathBase.h

index 8bfe7d6..a039b92 100644 (file)
 // Origin: I.Belikov, CERN, Jouri.Belikov@cern.ch                            //
 ///////////////////////////////////////////////////////////////////////////////
 #include <TMatrixDSym.h>
+#include <TPolyMarker3D.h>
+#include <TVector3.h>
+
 #include "AliExternalTrackParam.h"
+#include "AliMathBase.h"
 #include "AliVVertex.h"
-#include "TPolyMarker3D.h"
-#include "TVector3.h"
 #include "AliLog.h"
 
 ClassImp(AliExternalTrackParam)
@@ -359,7 +361,7 @@ Bool_t AliExternalTrackParam::CorrectForMeanMaterial
 
   //Energy losses************************
   if ((xTimesRho != 0.) && (beta2 < 1.)) {
-     Double_t dE=Bethe(beta2)*xTimesRho;
+     Double_t dE=Bethe(p/mass)*xTimesRho;
      Double_t e=TMath::Sqrt(p2 + mass*mass);
      if ( TMath::Abs(dE) > 0.3*e ) return kFALSE; //30% energy loss is too much!
      fP4*=(1.- e/p2*dE);
@@ -416,7 +418,7 @@ Bool_t AliExternalTrackParam::CorrectForMaterial
   //Energy losses************************
   if (x0!=0. && beta2<1) {
      d*=x0;
-     Double_t dE=Bethe(beta2)*d;
+     Double_t dE=Bethe(p/mass)*d;
      Double_t e=TMath::Sqrt(p2 + mass*mass);
      if ( TMath::Abs(dE) > 0.3*e ) return kFALSE; //30% energy loss is too much!
      fP4*=(1.- e/p2*dE);
@@ -431,18 +433,32 @@ Bool_t AliExternalTrackParam::CorrectForMaterial
   return kTRUE;
 }
 
-Double_t ApproximateBetheBloch(Double_t beta2) {
+Double_t AliExternalTrackParam::BetheBlochSolid(Double_t bg) {
   //------------------------------------------------------------------
-  // This is an approximation of the Bethe-Bloch formula with 
-  // the density effect taken into account at beta*gamma > 3.5
-  // (the approximation is reasonable only for solid materials) 
+  // This is an approximation of the Bethe-Bloch formula, 
+  // reasonable for solid materials. 
+  // All the parameters are, in fact, for Si.
+  // The returned value is in [GeV]
   //------------------------------------------------------------------
-  if (beta2 >= 1) return kVeryBig;
 
-  if (beta2/(1-beta2)>3.5*3.5)
-     return 0.153e-3/beta2*(log(3.5*5940)+0.5*log(beta2/(1-beta2)) - beta2);
+  return AliMathBase::BetheBlochGeant(bg);
+}
 
-  return 0.153e-3/beta2*(log(5940*beta2/(1-beta2)) - beta2);
+Double_t AliExternalTrackParam::BetheBlochGas(Double_t bg) {
+  //------------------------------------------------------------------
+  // This is an approximation of the Bethe-Bloch formula, 
+  // reasonable for gas materials.
+  // All the parameters are, in fact, for Ne.
+  // The returned value is in [GeV]
+  //------------------------------------------------------------------
+
+  const Double_t rho = 0.9e-3;
+  const Double_t x0  = 2.;
+  const Double_t x1  = 4.;
+  const Double_t mI  = 140.e-9;
+  const Double_t mZA = 0.49555;
+
+  return AliMathBase::BetheBlochGeant(bg,rho,x0,x1,mI,mZA);
 }
 
 Bool_t AliExternalTrackParam::Rotate(Double_t alpha) {
@@ -1475,4 +1491,3 @@ Int_t AliExternalTrackParam::GetIndex(Int_t i, Int_t j) const {
 
   return min+(max+1)*max/2;
 }
-
index 5830da7..dc44232 100644 (file)
@@ -25,8 +25,6 @@
 const Double_t kVeryBig=1./kAlmost0;
 const Double_t kMostProbablePt=0.35;
 
-Double_t ApproximateBetheBloch(Double_t);
-
 class AliVVertex;
 class TPolyMarker3D; 
 
@@ -126,7 +124,11 @@ class AliExternalTrackParam: public AliVTrack {
   Double_t GetLinearD(Double_t xv, Double_t yv) const; 
   Bool_t CorrectForMeanMaterial(Double_t xOverX0, Double_t xTimesRho, 
         Double_t mass,  Bool_t anglecorr=kFALSE,
-       Double_t (*f)(Double_t)=ApproximateBetheBloch);
+       Double_t (*f)(Double_t)=AliExternalTrackParam::BetheBlochSolid);
+
+  static Double_t BetheBlochSolid(Double_t bg);
+  static Double_t BetheBlochGas(Double_t bg);
+
   Double_t GetPredictedChi2(Double_t p[2],Double_t cov[3]) const;
 
   Double_t 
@@ -166,7 +168,7 @@ class AliExternalTrackParam: public AliVTrack {
 
   //Deprecated
   Bool_t CorrectForMaterial(Double_t d, Double_t x0, Double_t mass,
-                           Double_t (*f)(Double_t)=ApproximateBetheBloch);
+        Double_t (*f)(Double_t)=AliExternalTrackParam::BetheBlochSolid);
 
   Bool_t GetDistance(AliExternalTrackParam *param2, Double_t x, Double_t dist[3], Double_t b);
   Int_t GetIndex(Int_t i, Int_t j) const;
index 2509074..03e2b41 100644 (file)
@@ -759,7 +759,13 @@ Double_t AliMathBase::BetheBlochAleph(Double_t bg,
          Double_t kp4,
          Double_t kp5) {
   //
-  // This is the ALEPH parameterisation of the Bethe-Bloch formula
+  // This is the empirical ALEPH parameterization of the Bethe-Bloch formula.
+  // It is normalized to 1 at the minimum.
+  //
+  // bg - beta*gamma
+  // 
+  // The default values for the kp* parameters are for ALICE TPC.
+  // The returned value is in MIP units
   //
 
   Double_t beta = bg/TMath::Sqrt(1.+ bg*bg);
@@ -771,3 +777,48 @@ Double_t AliMathBase::BetheBlochAleph(Double_t bg,
   
   return (kp2-aa-bb)*kp1/aa;
 }
+
+Double_t AliMathBase::BetheBlochGeant(Double_t bg,
+         Double_t kp0,
+         Double_t kp1,
+         Double_t kp2,
+         Double_t kp3,
+         Double_t kp4) {
+  //
+  // This is the parameterization of the Bethe-Bloch formula inspired by Geant.
+  //
+  // bg  - beta*gamma
+  // kp0 - density [g/cm^3]
+  // kp1 - density effect first junction point
+  // kp2 - density effect second junction point
+  // kp3 - mean excitation energy [GeV]
+  // kp4 - mean Z/A
+  //
+  // The default values for the kp* parameters are for silicon. 
+  // The returned value is in [GeV/(g/cm^2)].
+  // 
+
+  const Double_t mK  = 0.307075e-3; // [GeV*cm^2/g]
+  const Double_t me  = 0.511e-3;    // [GeV/c^2]
+  const Double_t rho = kp0;
+  const Double_t x0  = kp1*2.303;
+  const Double_t x1  = kp2*2.303;
+  const Double_t mI  = kp3;
+  const Double_t mZA = kp4;
+  const Double_t bg2 = bg*bg;
+  const Double_t maxT= 2*me*bg2;    // neglecting the electron mass
+  
+  //*** Density effect
+  Double_t d2=0.; 
+  const Double_t x=TMath::Log(bg);
+  const Double_t lhwI=TMath::Log(28.816*1e-9*TMath::Sqrt(rho*mZA)/mI);
+  if (x > x1) {
+    d2 = lhwI + x - 0.5;
+  } else if (x > x0) {
+    const Double_t r=(x1-x)/(x1-x0);
+    d2 = lhwI + x - 0.5 + (0.5 - lhwI - x0)*r*r*r;
+  }
+
+  return mK*mZA*(1+bg2)/bg2*
+         (0.5*TMath::Log(2*me*bg2*maxT/(mI*mI)) - bg2/(1+bg2) - d2);
+}
index 3b16daa..7fb2d40 100644 (file)
@@ -50,6 +50,13 @@ class AliMathBase : public TObject
                                   Double_t kp4=1.8631,
                                   Double_t kp5=1.9479
                                  );
+  static Double_t BetheBlochGeant(Double_t bg,
+                                  Double_t kp0=2.33,
+                                  Double_t kp1=0.20,
+                                  Double_t kp2=3.00,
+                                  Double_t kp3=173e-9,
+                                  Double_t kp4=0.49848
+                                 );
     
  ClassDef(AliMathBase,0) // Various mathematical tools for physics analysis - which are not included in ROOT TMath