#include <MultipleScatteringUpdator.h>
Public Member Functions | |
virtual double | deltaP (const TrajectoryStateOnSurface &, const PropagationDirection) const |
reimplementation of deltaP (since always 0) | |
MultipleScatteringUpdator (double mass, double ptMin=-1.) | |
~MultipleScatteringUpdator () | |
destructor | |
Private Member Functions | |
virtual MultipleScatteringUpdator * | clone () const |
virtual void | compute (const TrajectoryStateOnSurface &, const PropagationDirection) const |
Private Attributes | |
double | thePtMin |
Adds effects from multiple scattering (standard Highland formula) to a trajectory state. Uses radiation length from medium properties. Ported from ORCA.
Definition at line 14 of file MultipleScatteringUpdator.h.
MultipleScatteringUpdator::MultipleScatteringUpdator | ( | double | mass, |
double | ptMin = -1. |
||
) | [inline] |
Specify assumed mass of particle for material effects. If ptMin > 0, then the rms muliple scattering angle will be calculated taking into account the uncertainty in the reconstructed track momentum. (By default, it is neglected). However, a lower limit on the possible value of the track Pt will be applied at ptMin, to avoid the rms multiple scattering becoming too big.
Definition at line 25 of file MultipleScatteringUpdator.h.
Referenced by clone().
: MaterialEffectsUpdator(mass), thePtMin(ptMin) {}
MultipleScatteringUpdator::~MultipleScatteringUpdator | ( | ) | [inline] |
virtual MultipleScatteringUpdator* MultipleScatteringUpdator::clone | ( | void | ) | const [inline, private, virtual] |
Implements MaterialEffectsUpdator.
Definition at line 16 of file MultipleScatteringUpdator.h.
References MultipleScatteringUpdator().
{ return new MultipleScatteringUpdator(*this); }
void MultipleScatteringUpdator::compute | ( | const TrajectoryStateOnSurface & | TSoS, |
const PropagationDirection | propDir | ||
) | const [private, virtual] |
Implements MaterialEffectsUpdator.
Definition at line 14 of file MultipleScatteringUpdator.cc.
References a, gather_cfg::cout, TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::localError(), TrajectoryStateOnSurface::localMomentum(), funct::log(), PV3DBase< T, PVType, FrameType >::mag2(), MaterialEffectsUpdator::mass(), LocalTrajectoryError::matrix(), Surface::mediumProperties(), L1TEmulatorMonitor_cff::p, p2, PV3DBase< T, PVType, FrameType >::perp2(), MediumProperties::radLen(), mathSSE::sqrt(), TrajectoryStateOnSurface::surface(), MaterialEffectsUpdator::theDeltaCov, thePtMin, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().
{ // // Get surface // const Surface& surface = TSoS.surface(); // // Initialise the update to the covariance matrix // (dP is constantly 0). // theDeltaCov(1,1) = 0.; theDeltaCov(1,2) = 0.; theDeltaCov(2,2) = 0.; // // Now get information on medium // if (surface.mediumProperties()) { // Momentum vector LocalVector d = TSoS.localMomentum(); double p2 = d.mag2(); d *= 1./sqrt(p2); // MediumProperties mp(0.02, .5e-4); const MediumProperties& mp = *surface.mediumProperties(); double xf = 1./fabs(d.z()); // increase of path due to angle of incidence // calculate general physics things const double amscon = 1.8496e-4; // (13.6MeV)**2 const double m2 = mass()*mass(); // use mass hypothesis from constructor double e2 = p2 + m2; double beta2 = p2/e2; // calculate the multiple scattering angle double radLen = mp.radLen()*xf; // effective rad. length double sigt2 = 0.; // sigma(alpha)**2 if (radLen > 0) { // Calculated rms scattering angle squared. double fact = 1. + 0.038*log(radLen); fact *=fact; double a = fact/(beta2*p2); sigt2 = amscon*radLen*a; if (thePtMin > 0) { #ifdef DBG_MSU std::cout<<"Original rms scattering = "<<sqrt(sigt2); #endif // Inflate estimated rms scattering angle, to take into account // that 1/p is not known precisely. AlgebraicSymMatrix55 const & covMatrix = TSoS.localError().matrix(); double error2_QoverP = covMatrix(0,0); // Formula valid for ultra-relativistic particles. // sigt2 *= (1. + p2 * error2_QoverP); // Exact formula sigt2 *= (1. + p2 * error2_QoverP * (1. + 5.*m2/e2 + 3.*m2*beta2*error2_QoverP)); #ifdef DBG_MSU std::cout<<" new = "<<sqrt(sigt2); #endif // Convert Pt constraint to P constraint, neglecting uncertainty in // track angle. double pMin2 = thePtMin*thePtMin*(p2/TSoS.globalMomentum().perp2()); // Use P constraint to calculate rms maximum scattering angle. double betaMin2 = pMin2/(pMin2 + m2); double a_max = fact/(betaMin2 * pMin2); double sigt2_max = amscon*radLen*a_max; if (sigt2 > sigt2_max) sigt2 = sigt2_max; #ifdef DBG_MSU std::cout<<" after P constraint ("<<pMin<<") = "<<sqrt(sigt2); std::cout<<" for track with 1/p="<<1/p<<"+-"<<sqrt(error2_QoverP)<<std::endl; #endif } } double sl2 = d.perp2(); double cl2 = (d.z()*d.z()); double cf2 = (d.x()*d.x())/sl2; double sf2 = (d.y()*d.y())/sl2; // Create update (transformation of independant variations // on angle in orthogonal planes to local parameters. double den = 1./(cl2*cl2); theDeltaCov(1,1) = (den*sigt2)*(sf2*cl2 + cf2); theDeltaCov(1,2) = (den*sigt2)*(d.x()*d.y() ); theDeltaCov(2,2) = (den*sigt2)*(cf2*cl2 + sf2); /* std::cout << "new " << theDeltaCov(1,1) << " " << theDeltaCov(1,2) << " " << theDeltaCov(2,2) << std::endl; oldMUcompute(TSoS,propDir, mass(), thePtMin); */ } }
virtual double MultipleScatteringUpdator::deltaP | ( | const TrajectoryStateOnSurface & | , |
const PropagationDirection | |||
) | const [inline, virtual] |
reimplementation of deltaP (since always 0)
Reimplemented from MaterialEffectsUpdator.
Definition at line 31 of file MultipleScatteringUpdator.h.
Referenced by CombinedMaterialEffectsUpdator::compute().
{
return 0.;
}
double MultipleScatteringUpdator::thePtMin [private] |
Definition at line 42 of file MultipleScatteringUpdator.h.
Referenced by compute().