Go to the documentation of this file.00001 #include "TrackingTools/MaterialEffects/interface/EnergyLossUpdator.h"
00002 #include "DataFormats/GeometrySurface/interface/MediumProperties.h"
00003
00004
00005
00006
00007
00008
00009 void EnergyLossUpdator::compute (const TrajectoryStateOnSurface& TSoS,
00010 const PropagationDirection propDir) const
00011 {
00012
00013
00014
00015 const Surface& surface = TSoS.surface();
00016
00017
00018
00019 theDeltaP = 0.;
00020 theDeltaCov(0,0) = 0.;
00021
00022
00023
00024 if (surface.mediumProperties()) {
00025
00026
00027
00028 if ( mass()>0.001 )
00029 computeBetheBloch(TSoS.localMomentum(),*surface.mediumProperties());
00030
00031
00032
00033
00034 else
00035 computeElectrons(TSoS.localMomentum(),*surface.mediumProperties(),
00036 propDir);
00037 if (propDir != alongMomentum) theDeltaP *= -1.;
00038 }
00039 }
00040
00041
00042
00043 void
00044 EnergyLossUpdator::computeBetheBloch (const LocalVector& localP,
00045 const MediumProperties& materialConstants) const {
00046
00047
00048
00049
00050 double p = localP.mag();
00051 double xf = fabs(p/localP.z());
00052
00053 const double m = mass();
00054
00055 const double emass = 0.511e-3;
00056 const double poti = 16.e-9 * 10.75;
00057 const double eplasma = 28.816e-9 * sqrt(2.33*0.498);
00058 const double delta0 = 2*log(eplasma/poti) - 1.;
00059
00060
00061 double e = sqrt(p*p + m*m);
00062 double beta = p/e;
00063 double gamma = e/m;
00064 double eta2 = beta*gamma; eta2 *= eta2;
00065
00066 double ratio = emass/m;
00067 double emax = 2.*emass*eta2/(1. + 2.*ratio*gamma + ratio*ratio);
00068
00069
00070
00071
00072 double xi = materialConstants.xi()*xf; xi /= (beta*beta);
00073
00074
00075
00076
00077 double dEdx = xi*(log(2.*emass*emax/(poti*poti)) - 2.*(beta*beta) - delta0);
00078 double dEdx2 = xi*emax*(1.-0.5*(beta*beta));
00079 double dP = dEdx/beta;
00080 double sigp2 = dEdx2*e*e/(p*p*p*p*p*p);
00081 theDeltaP += -dP;
00082 theDeltaCov(0,0) += sigp2;
00083 }
00084
00085
00086
00087 void
00088 EnergyLossUpdator::computeElectrons (const LocalVector& localP,
00089 const MediumProperties& materialConstants,
00090 const PropagationDirection propDir) const {
00091
00092
00093
00094
00095 double p = localP.mag();
00096 double normalisedPath = fabs(p/localP.z())*materialConstants.radLen();
00097
00098
00099
00100
00101 double z = exp(-normalisedPath);
00102 double varz = exp(-normalisedPath*log(3.)/log(2.))-
00103 z*z;
00104
00105
00106 if ( propDir==oppositeToMomentum ) {
00107
00108
00109
00110
00111
00112 theDeltaP += -p*(1/z-1);
00113 theDeltaCov(0,0) += varz/(p*p);
00114 }
00115 else {
00116
00117
00118
00119
00120 theDeltaP += p*(z-1);
00121
00122
00123 double f = 1./(p*z);
00124 theDeltaCov(0,0) += f*f*varz;
00125 }
00126 }