#include <EnergyLossUpdator.h>
Public Member Functions | |
virtual EnergyLossUpdator * | clone () 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 |
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.
EnergyLossUpdator::EnergyLossUpdator | ( | double | mass | ) | [inline] |
Definition at line 28 of file EnergyLossUpdator.h.
Referenced by clone().
: MaterialEffectsUpdator(mass) {}
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, 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; } }