CMS 3D CMS Logo

GsfMaterialEffectsUpdator.cc
Go to the documentation of this file.
2 
7 //
8 // Update of the trajectory state (implemented in base class since general for
9 // all classes returning deltaPs and deltaCovs.
10 //
11 
12 using namespace SurfaceSideDefinition;
13 
16  const PropagationDirection propDir) const {
17  //
18  // get components of input state and check if material is associated to surface
19  //
20  const Surface& surface = TSoS.surface();
21  if ( !surface.mediumProperties().isValid() ) return TSoS;
23  // single input state?
24  if (!TSoS.singleState() )
25  throw cms::Exception("LogicError") << "GsfMaterialEffectsUpdator::updateState used with MultiTSOS";
26  auto weight = TSoS.weight();
27  //
28  // Get components (will force recalculation, if necessary)
29  //
30  #if __clang__
31  std::vector<Effect> effects(size());
32  compute(TSoS,propDir,effects.data());
33  #else
34  Effect effects[size()];
35  compute(TSoS,propDir,effects);
36  #endif
37 
38  //
39  // prepare output vector
40  //
42  //
43  // loop over components
44  //
45  LogDebug("GsfMaterialEffectsUpdator") << "found " << size() << " components "
46  << " input state has weight " << TSoS.weight();
47  for ( auto const & effect : effects ) {
48  LogDebug("GsfMaterialEffectsUpdatorDETAIL") << "w, dp, sigp = "
49  << effect.weight << ", "
50  << effect.deltaP << ", "
51  << std::sqrt(effect.deltaCov[materialEffect::elos]);
52  //
53  // Update momentum. In case of failure: return invalid state.
54  // Use deltaP method to ensure update of cache, if necessary!
55  //
57  if ( !lp.updateP(effect.deltaP) )
58  return TrajectoryStateOnSurface();
59  //
60  // Update covariance matrix?
61  //
62  if ( TSoS.hasError() ) {
63  AlgebraicSymMatrix55 eloc = TSoS.localError().matrix();
64  effect.deltaCov.add(eloc);
65  result.addState(TrajectoryStateOnSurface(weight*effect.weight,
66  lp,
68  surface,
69  &(TSoS.globalParameters().magneticField()),
70  side));
71  LogDebug("GsfMaterialEffectsUpdatorDETAIL")
72  << "adding state with weight " << weight*effect.weight;
73  }
74  else {
75  result.addState(TrajectoryStateOnSurface(lp,surface,
76  &(TSoS.globalParameters().magneticField()),
77  side));
78  }
79  }
80  LogDebug("GsfMaterialEffectsUpdator")
81  << " output state has weight " << result.combinedState().weight();
82  return result.combinedState();
83 }
84 
#define LogDebug(id)
size
Write out results.
const LocalTrajectoryParameters & localParameters() const
void addState(const TrajectoryStateOnSurface)
Definition: weight.py:1
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
PropagationDirection
const T & data() const
Definition: ProxyBase11.h:54
const SurfaceType & surface() const
T sqrt(T t)
Definition: SSEVec.h:18
const AlgebraicSymMatrix55 & matrix() const
const LocalTrajectoryError & localError() const
virtual TrajectoryStateOnSurface updateState(const TrajectoryStateOnSurface &TSoS, const PropagationDirection propDir) const
const GlobalTrajectoryParameters & globalParameters() const
def compute(min, max)
const MagneticField & magneticField() const
bool isValid() const
const MediumProperties & mediumProperties() const
Definition: Surface.h:112
bool updateP(float dP)
Update of momentum by a scalar dP.