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