CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
MultipleScatteringUpdator Class Referencefinal

#include <MultipleScatteringUpdator.h>

Inheritance diagram for MultipleScatteringUpdator:
MaterialEffectsUpdator

Public Member Functions

void compute (const TrajectoryStateOnSurface &, const PropagationDirection, Effect &effect) const override
 
 MultipleScatteringUpdator (float mass, float ptMin=-1.)
 
 ~MultipleScatteringUpdator () override
 destructor More...
 
- Public Member Functions inherited from MaterialEffectsUpdator
float mass () const
 
 MaterialEffectsUpdator (float mass)
 
virtual TrajectoryStateOnSurface updateState (const TrajectoryStateOnSurface &TSoS, const PropagationDirection propDir) const
 
virtual bool updateStateInPlace (TrajectoryStateOnSurface &TSoS, const PropagationDirection propDir) const
 
virtual ~MaterialEffectsUpdator ()
 

Private Member Functions

MultipleScatteringUpdatorclone () const override
 

Private Attributes

float thePtMin
 

Additional Inherited Members

- Public Types inherited from MaterialEffectsUpdator
typedef materialEffect::Covariance Covariance
 
typedef materialEffect::CovIndex CovIndex
 
typedef materialEffect::Effect Effect
 

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::MultipleScatteringUpdator ( float  mass,
float  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 23 of file MultipleScatteringUpdator.h.

Referenced by clone().

◆ ~MultipleScatteringUpdator()

MultipleScatteringUpdator::~MultipleScatteringUpdator ( )
inlineoverride

destructor

Definition at line 25 of file MultipleScatteringUpdator.h.

25 {}

Member Function Documentation

◆ clone()

MultipleScatteringUpdator* MultipleScatteringUpdator::clone ( void  ) const
inlineoverrideprivatevirtual

Implements MaterialEffectsUpdator.

Definition at line 16 of file MultipleScatteringUpdator.h.

References MultipleScatteringUpdator().

16 { return new MultipleScatteringUpdator(*this); }
MultipleScatteringUpdator(float mass, float ptMin=-1.)

◆ compute()

void MultipleScatteringUpdator::compute ( const TrajectoryStateOnSurface TSoS,
const PropagationDirection  propDir,
Effect effect 
) const
overridevirtual

Implements MaterialEffectsUpdator.

Definition at line 14 of file MultipleScatteringUpdator.cc.

References a, funct::abs(), GetRecoTauVFromDQM_MC_cff::cl2, ALPAKA_ACCELERATOR_NAMESPACE::brokenline::constexpr(), gather_cfg::cout, ztail::d, materialEffect::Effect::deltaCov, fact, TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::localError(), TrajectoryStateOnSurface::localMomentum(), callgraph::m2, MaterialEffectsUpdator::mass(), LocalTrajectoryError::matrix(), Surface::mediumProperties(), materialEffect::msxx, materialEffect::msxy, materialEffect::msyy, AlCaHLTBitMon_ParallelJobs::p, SiStripOfflineCRack_cfg::p2, PV3DBase< T, PVType, FrameType >::perp2(), ALCARECOTkAlMinBias_cff::pMin, MediumProperties::radLen(), fastSimProducer_cff::radLen, mathSSE::sqrt(), TrajectoryStateOnSurface::surface(), thePtMin, and UNLIKELY.

Referenced by CombinedMaterialEffectsUpdator::compute().

16  {
17  //
18  // Get surface
19  //
20  const Surface& surface = TSoS.surface();
21  //
22  //
23  // Now get information on medium
24  //
25  const MediumProperties& mp = surface.mediumProperties();
26  if UNLIKELY (mp.radLen() == 0)
27  return;
28 
29  // Momentum vector
30  LocalVector d = TSoS.localMomentum();
31  float p2 = d.mag2();
32  d *= 1.f / sqrt(p2);
33  float xf = 1.f / std::abs(d.z()); // increase of path due to angle of incidence
34  // calculate general physics things
35  constexpr float amscon = 1.8496e-4; // (13.6MeV)**2
36  const float m2 = mass() * mass(); // use mass hypothesis from constructor
37  float e2 = p2 + m2;
38  float beta2 = p2 / e2;
39  // calculate the multiple scattering angle
40  float radLen = mp.radLen() * xf; // effective rad. length
41  float sigt2 = 0.; // sigma(alpha)**2
42 
43  // Calculated rms scattering angle squared.
44  float fact = 1.f + 0.038f * unsafe_logf<2>(radLen);
45  fact *= fact;
46  float a = fact / (beta2 * p2);
47  sigt2 = amscon * radLen * a;
48 
49  if (thePtMin > 0) {
50 #ifdef DBG_MSU
51  std::cout << "Original rms scattering = " << sqrt(sigt2);
52 #endif
53  // Inflate estimated rms scattering angle, to take into account
54  // that 1/p is not known precisely.
55  AlgebraicSymMatrix55 const& covMatrix = TSoS.localError().matrix();
56  float error2_QoverP = covMatrix(0, 0);
57  // Formula valid for ultra-relativistic particles.
58  // sigt2 *= (1. + p2 * error2_QoverP);
59  // Exact formula
60  sigt2 *= 1.f + error2_QoverP * (p2 + m2 * beta2 * (5.f + 3.f * p2 * error2_QoverP));
61 #ifdef DBG_MSU
62  std::cout << " new = " << sqrt(sigt2);
63 #endif
64  // Convert Pt constraint to P constraint, neglecting uncertainty in
65  // track angle.
66  float pMin2 = thePtMin * thePtMin * (p2 / TSoS.globalMomentum().perp2());
67  // Use P constraint to calculate rms maximum scattering angle.
68  float betaMin2 = pMin2 / (pMin2 + m2);
69  float a_max = fact / (betaMin2 * pMin2);
70  float sigt2_max = amscon * radLen * a_max;
71  if (sigt2 > sigt2_max)
72  sigt2 = sigt2_max;
73 #ifdef DBG_MSU
74  std::cout << " after P constraint (" << pMin << ") = " << sqrt(sigt2);
75  std::cout << " for track with 1/p=" << 1 / p << "+-" << sqrt(error2_QoverP) << std::endl;
76 #endif
77  }
78 
79  float isl2 = 1.f / d.perp2();
80  float cl2 = (d.z() * d.z());
81  float cf2 = (d.x() * d.x()) * isl2;
82  float sf2 = (d.y() * d.y()) * isl2;
83  // Create update (transformation of independant variations
84  // on angle in orthogonal planes to local parameters.
85  float den = 1.f / (cl2 * cl2);
86  using namespace materialEffect;
87  effect.deltaCov[msxx] += (den * sigt2) * (sf2 * cl2 + cf2);
88  effect.deltaCov[msxy] += (den * sigt2) * (d.x() * d.y());
89  effect.deltaCov[msyy] += (den * sigt2) * (cf2 * cl2 + sf2);
90 
91  /*
92  std::cout << "new " << theDeltaCov(1,1) << " " << theDeltaCov(1,2) << " " << theDeltaCov(2,2) << std::endl;
93  oldMUcompute(TSoS,propDir, mass(), thePtMin);
94  */
95 }
const LocalTrajectoryError & localError() const
const SurfaceType & surface() const
T sqrt(T t)
Definition: SSEVec.h:19
float radLen() const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
d
Definition: ztail.py:151
const double fact
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
GlobalVector globalMomentum() const
T perp2() const
Definition: PV3DBase.h:68
double a
Definition: hdecay.h:121
const AlgebraicSymMatrix55 & matrix() const
const MediumProperties & mediumProperties() const
Definition: Surface.h:83
#define UNLIKELY(x)
Definition: Likely.h:21

Member Data Documentation

◆ thePtMin

float MultipleScatteringUpdator::thePtMin
private

Definition at line 31 of file MultipleScatteringUpdator.h.

Referenced by compute(), and oldMUcompute().