CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

MultipleScatteringUpdator Class Reference

#include <MultipleScatteringUpdator.h>

Inheritance diagram for MultipleScatteringUpdator:
MaterialEffectsUpdator

List of all members.

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 MultipleScatteringUpdatorclone () const
virtual void compute (const TrajectoryStateOnSurface &, const PropagationDirection) const dso_internal

Private Attributes

double thePtMin

Detailed Description

Adds effects from multiple scattering (standard Highland formula) to a trajectory state. Uses radiation length from medium properties. Ported from ORCA.

Author:
todorov, cerati

Definition at line 15 of file MultipleScatteringUpdator.h.


Constructor & Destructor Documentation

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 26 of file MultipleScatteringUpdator.h.

Referenced by clone().

MultipleScatteringUpdator::~MultipleScatteringUpdator ( ) [inline]

destructor

Definition at line 30 of file MultipleScatteringUpdator.h.

{}

Member Function Documentation

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

Implements MaterialEffectsUpdator.

Definition at line 17 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(), AlCaHLTBitMon_ParallelJobs::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 32 of file MultipleScatteringUpdator.h.

Referenced by CombinedMaterialEffectsUpdator::compute().

                                                                                            {
    return 0.;
  }

Member Data Documentation

Definition at line 43 of file MultipleScatteringUpdator.h.

Referenced by compute().