CMS 3D CMS Logo

Public Member Functions | Private Member Functions

EnergyLossUpdator Class Reference

#include <EnergyLossUpdator.h>

Inheritance diagram for EnergyLossUpdator:
MaterialEffectsUpdator

List of all members.

Public Member Functions

virtual EnergyLossUpdatorclone () const
 EnergyLossUpdator (double mass)

Private Member Functions

virtual void compute (const TrajectoryStateOnSurface &, const PropagationDirection) const dso_internal
void computeBetheBloch (const LocalVector &, const MediumProperties &) const dso_internal
void computeElectrons (const LocalVector &, const MediumProperties &, const PropagationDirection) const dso_internal

Detailed Description

Energy loss according to Bethe-Bloch + special treatment for electrons. Adds effects from energy loss according to Bethe-Bloch formula without density effect. Assumes silicon as material. For electrons energy loss due to radiation added according to formulae by Bethe & Heitler. Ported from ORCA.

Definition at line 20 of file EnergyLossUpdator.h.


Constructor & Destructor Documentation

EnergyLossUpdator::EnergyLossUpdator ( double  mass) [inline]

Definition at line 28 of file EnergyLossUpdator.h.

Referenced by clone().


Member Function Documentation

virtual EnergyLossUpdator* EnergyLossUpdator::clone ( void  ) const [inline, virtual]

Implements MaterialEffectsUpdator.

Definition at line 23 of file EnergyLossUpdator.h.

References EnergyLossUpdator().

                                           {
    return new EnergyLossUpdator(*this);
  }
void EnergyLossUpdator::compute ( const TrajectoryStateOnSurface TSoS,
const PropagationDirection  propDir 
) const [private, virtual]

Implements MaterialEffectsUpdator.

Definition at line 9 of file EnergyLossUpdator.cc.

References alongMomentum, computeBetheBloch(), computeElectrons(), TrajectoryStateOnSurface::localMomentum(), MaterialEffectsUpdator::mass(), Surface::mediumProperties(), TrajectoryStateOnSurface::surface(), MaterialEffectsUpdator::theDeltaCov, and MaterialEffectsUpdator::theDeltaP.

{
  //
  // Get surface
  //
  const Surface& surface = TSoS.surface();
  //
  // Initialise dP and the update to the covariance matrix
  //
  theDeltaP = 0.;
  theDeltaCov(0,0) = 0.;
  //
  // Now get information on medium
  //
  if (surface.mediumProperties()) {
    //
    // Bethe-Bloch
    //
    if ( mass()>0.001 )
      computeBetheBloch(TSoS.localMomentum(),*surface.mediumProperties());
    //
    // Special treatment for electrons (currently rather crude
    // distinction using mass)
    //
    else
      computeElectrons(TSoS.localMomentum(),*surface.mediumProperties(),
                       propDir);
    if (propDir != alongMomentum) theDeltaP *= -1.;
  }
}
void EnergyLossUpdator::computeBetheBloch ( const LocalVector localP,
const MediumProperties materialConstants 
) const [private]

Definition at line 44 of file EnergyLossUpdator.cc.

References beta, alignCSCRings::e, funct::log(), m, PV3DBase< T, PVType, FrameType >::mag(), MaterialEffectsUpdator::mass(), AlCaHLTBitMon_ParallelJobs::p, mathSSE::sqrt(), MaterialEffectsUpdator::theDeltaCov, MaterialEffectsUpdator::theDeltaP, MediumProperties::xi(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by compute().

                                                                                       {
  //
  // calculate absolute momentum and correction to path length from angle 
  // of incidence
  //
  double p = localP.mag();
  double xf = fabs(p/localP.z());
  // constants
  const double m = mass();            // use mass hypothesis from constructor

  const double emass = 0.511e-3;
  const double poti = 16.e-9 * 10.75; // = 16 eV * Z**0.9, for Si Z=14
  const double eplasma = 28.816e-9 * sqrt(2.33*0.498); // 28.816 eV * sqrt(rho*(Z/A)) for Si
  const double delta0 = 2*log(eplasma/poti) - 1.;

  // calculate general physics things
  double e     = sqrt(p*p + m*m);
  double beta  = p/e;
  double gamma = e/m;
  double eta2  = beta*gamma; eta2 *= eta2;
  //  double lnEta2 = log(eta2);
  double ratio = emass/m;
  double emax  = 2.*emass*eta2/(1. + 2.*ratio*gamma + ratio*ratio);
  // double delta = delta0 + lnEta2;

  // calculate the mean and sigma of energy loss
  // xi = d[g/cm2] * 0.307075MeV/(g/cm2) * Z/A * 1/2
  double xi = materialConstants.xi()*xf; xi /= (beta*beta);

//   double dEdx = xi*(log(2.*emass*eta2*emax/(poti*poti)) - 2.*(beta*beta));
  //double dEdx = xi*(log(2.*emass*emax/(poti*poti))+lnEta2 - 2.*(beta*beta) - delta);

  double dEdx = xi*(log(2.*emass*emax/(poti*poti)) - 2.*(beta*beta) - delta0);
  double dEdx2 = xi*emax*(1.-0.5*(beta*beta));
  double dP    = dEdx/beta;
  double sigp2 = dEdx2*e*e/(p*p*p*p*p*p);
  theDeltaP += -dP;
  theDeltaCov(0,0) += sigp2;
}
void EnergyLossUpdator::computeElectrons ( const LocalVector localP,
const MediumProperties materialConstants,
const PropagationDirection  propDir 
) const [private]

Definition at line 88 of file EnergyLossUpdator.cc.

References funct::exp(), f, funct::log(), PV3DBase< T, PVType, FrameType >::mag(), oppositeToMomentum, AlCaHLTBitMon_ParallelJobs::p, MediumProperties::radLen(), MaterialEffectsUpdator::theDeltaCov, MaterialEffectsUpdator::theDeltaP, PV3DBase< T, PVType, FrameType >::z(), and z.

Referenced by compute().

                                                                               {
  //
  // calculate absolute momentum and correction to path length from angle 
  // of incidence
  //
  double p = localP.mag();
  double normalisedPath = fabs(p/localP.z())*materialConstants.radLen();
  //
  // Energy loss and variance according to Bethe and Heitler, see also
  // Comp. Phys. Comm. 79 (1994) 157. 
  //
  double z = exp(-normalisedPath);
  double varz = exp(-normalisedPath*log(3.)/log(2.))- 
                z*z;
                // exp(-2*normalisedPath);

  if ( propDir==oppositeToMomentum ) {
    //
    // for backward propagation: delta(1/p) is linear in z=p_outside/p_inside
    // convert to obtain equivalent delta(p). Sign of deltaP is corrected
    // in method compute -> deltaP<0 at this place!!!
    //
    theDeltaP += -p*(1/z-1);
    theDeltaCov(0,0) += varz/(p*p);
  }
  else {        
    //
    // for forward propagation: calculate in p (linear in 1/z=p_inside/p_outside),
    // then convert sig(p) to sig(1/p). 
    //
    theDeltaP += p*(z-1);
    //    double f = 1/p/z/z;
    // patch to ensure consistency between for- and backward propagation
    double f = 1./(p*z);
    theDeltaCov(0,0) += f*f*varz;
  }
}