LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
trkf::PropYZPlane Class Reference

#include "PropYZPlane.h"

Inheritance diagram for trkf::PropYZPlane:
trkf::Propagator

Public Types

enum  PropDirection { FORWARD, BACKWARD, UNKNOWN }
 Propagation direction enum. More...
 

Public Member Functions

 PropYZPlane (double tcut, bool doDedx)
 Constructor. More...
 
virtual ~PropYZPlane ()
 Destructor. More...
 
Propagatorclone () const
 Clone method. More...
 
boost::optional< double > short_vec_prop (KTrack &trk, const std::shared_ptr< const Surface > &surf, Propagator::PropDirection dir, bool doDedx, TrackMatrix *prop_matrix=0, TrackError *noise_matrix=0) const
 Propagate without error. More...
 
virtual boost::optional< double > origin_vec_prop (KTrack &trk, const std::shared_ptr< const Surface > &porient, TrackMatrix *prop_matrix=0) const
 Propagate without error to surface whose origin parameters coincide with track position. More...
 
double getTcut () const
 
bool getDoDedx () const
 
const std::shared_ptr< const Interactor > & getInteractor () const
 
boost::optional< double > vec_prop (KTrack &trk, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, TrackMatrix *prop_matrix=0, TrackError *noise_matrix=0) const
 Propagate without error (long distance). More...
 
boost::optional< double > lin_prop (KTrack &trk, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, KTrack *ref=0, TrackMatrix *prop_matrix=0, TrackError *noise_matrix=0) const
 Linearized propagate without error. More...
 
boost::optional< double > err_prop (KETrack &tre, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, KTrack *ref=0, TrackMatrix *prop_matrix=0) const
 Propagate with error, but without noise. More...
 
boost::optional< double > noise_prop (KETrack &tre, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, KTrack *ref=0) const
 Propagate with error and noise. More...
 
boost::optional< double > dedx_prop (double pinv, double mass, double s, double *deriv=0) const
 Method to calculate updated momentum due to dE/dx. More...
 

Private Member Functions

bool transformYZLine (double phi1, double phi2, TrackVector &vec, Surface::TrackDirection &dir, TrackMatrix *prop_matrix) const
 Transform yz line -> yz plane. More...
 
bool transformYZPlane (double phi1, double phi2, TrackVector &vec, Surface::TrackDirection &dir, TrackMatrix *prop_matrix) const
 Transform yz plane -> yz plane. More...
 
bool transformXYZPlane (double theta1, double phi1, double phi2, TrackVector &vec, Surface::TrackDirection &dir, TrackMatrix *prop_matrix) const
 Transform xyz plane -> yz plane. More...
 

Detailed Description

Definition at line 20 of file PropYZPlane.h.

Member Enumeration Documentation

Propagation direction enum.

Enumerator
FORWARD 
BACKWARD 
UNKNOWN 

Definition at line 92 of file Propagator.h.

Constructor & Destructor Documentation

trkf::PropYZPlane::PropYZPlane ( double  tcut,
bool  doDedx 
)

Constructor.

Constructor.

Arguments.

tcut - Delta ray energy cutoff for calculating dE/dx. doDedx - dE/dx enable flag.

Definition at line 28 of file PropYZPlane.cxx.

Referenced by clone().

28  :
29  Propagator(tcut, doDedx, (tcut >= 0. ?
30  std::shared_ptr<const Interactor>(new InteractPlane(tcut)) :
31  std::shared_ptr<const Interactor>()))
32  {}
Propagator(double tcut, bool doDedx, const std::shared_ptr< const Interactor > &interactor)
Constructor.
Definition: Propagator.cxx:25
trkf::PropYZPlane::~PropYZPlane ( )
virtual

Destructor.

Definition at line 35 of file PropYZPlane.cxx.

36  {}

Member Function Documentation

Propagator* trkf::PropYZPlane::clone ( ) const
inlinevirtual

Clone method.

Implements trkf::Propagator.

Definition at line 33 of file PropYZPlane.h.

References dir, origin_vec_prop(), PropYZPlane(), short_vec_prop(), transformXYZPlane(), transformYZLine(), and transformYZPlane().

33 {return new PropYZPlane(*this);}
PropYZPlane(double tcut, bool doDedx)
Constructor.
Definition: PropYZPlane.cxx:28
boost::optional< double > trkf::Propagator::dedx_prop ( double  pinv,
double  mass,
double  s,
double *  deriv = 0 
) const
inherited

Method to calculate updated momentum due to dE/dx.

Method to calculate updated momentum due to dE/dx.

Arguments:

pinv - Initial inverse momentum (units c/GeV). mass - Particle mass (GeV/c^2). s - Path distance. deriv - Pointer to store derivative d(pinv2)/d(pinv1) if nonzero.

Returns: Final inverse momentum (pinv2) + success flag.

Failure is returned in case of range out.

Inverse momentum can be signed (q/p). Returned inverse momentum has the same sign as the input.

In this method, we are solving the differential equation in terms of energy.

dE/dx = -f(E)

where f(E) is the stopping power returned by method LArProperties::Eloss.

We expect that this method will be called exclusively for short distance propagation. The differential equation is solved using the midpoint method using a single step, which requires two evaluations of f(E).

dE = -s*f(E1) E2 = E1 - s*f(E1 + 0.5*dE)

The derivative is calculated assuming E2 = E1 + constant, giving

d(pinv2)/d(pinv1) = pinv2^3 E2 / (pinv1^3 E1).

Definition at line 459 of file Propagator.cxx.

References trkf::Propagator::fTcut.

Referenced by trkf::Propagator::getInteractor(), short_vec_prop(), trkf::PropYZLine::short_vec_prop(), and trkf::PropXYZPlane::short_vec_prop().

461  {
462  // For infinite initial momentum, return with success status,
463  // still infinite momentum.
464 
465  if(pinv == 0.)
466  return boost::optional<double>(true, 0.);
467 
468  // Set the default return value to be uninitialized with value 0.
469 
470  boost::optional<double> result(false, 0.);
471 
472  // Get LAr service.
473 
474  auto const * detprop = lar::providerFrom<detinfo::DetectorPropertiesService>();
475 
476  // Calculate final energy.
477 
478  double p1 = 1./std::abs(pinv);
479  double e1 = std::hypot(p1, mass);
480  double de = -0.001 * s * detprop->Eloss(p1, mass, fTcut);
481  double emid = e1 + 0.5 * de;
482  if(emid > mass) {
483  double pmid = std::sqrt(emid*emid - mass*mass);
484  double e2 = e1 - 0.001 * s * detprop->Eloss(pmid, mass, fTcut);
485  if(e2 > mass) {
486  double p2 = std::sqrt(e2*e2 - mass*mass);
487  double pinv2 = 1./p2;
488  if(pinv < 0.)
489  pinv2 = -pinv2;
490 
491  // Calculation was successful, update result.
492 
493  result = boost::optional<double>(true, pinv2);
494 
495  // Also calculate derivative, if requested.
496 
497  if(deriv != 0)
498  *deriv = pinv2*pinv2*pinv2 * e2 / (pinv*pinv*pinv * e1);
499  }
500  }
501 
502  // Done.
503 
504  return result;
505  }
Float_t s
Definition: plot.C:23
double fTcut
Maximum delta ray energy for dE/dx.
Definition: Propagator.h:163
boost::optional< double > trkf::Propagator::err_prop ( KETrack tre,
const std::shared_ptr< const Surface > &  psurf,
PropDirection  dir,
bool  doDedx,
KTrack ref = 0,
TrackMatrix prop_matrix = 0 
) const
inherited

Propagate with error, but without noise.

Propagate with error, but without noise (i.e. reversibly).

Arguments:

tre - Track to propagate. psurf - Destination surface. dir - Propagation direction (FORWARD, BACKWARD, or UNKNOWN). doDedx - dE/dx enable/disable flag. ref - Reference track (for linearized propagation). Can be null. prop_matrix - Return propagation matrix if not null.

Returned value: propagation distance + success flag.

Definition at line 354 of file Propagator.cxx.

References trkf::KETrack::getError(), trkf::Propagator::lin_prop(), and trkf::KETrack::setError().

Referenced by trkf::KGTrack::fillTrack(), trkf::KalmanFilterAlg::fitMomentumMS(), trkf::Propagator::getInteractor(), and trkf::KHit< N >::predict().

360  {
361  // Propagate without error, get propagation matrix.
362 
363  TrackMatrix prop_temp;
364  if(prop_matrix == 0)
365  prop_matrix = &prop_temp;
366  boost::optional<double> result = lin_prop(tre, psurf, dir, doDedx, ref, prop_matrix, 0);
367 
368  // If propagation succeeded, update track error matrix.
369 
370  if(!!result) {
371  TrackMatrix temp = prod(tre.getError(), trans(*prop_matrix));
372  TrackMatrix temp2 = prod(*prop_matrix, temp);
373  TrackError newerr = ublas::symmetric_adaptor<TrackMatrix>(temp2);
374  tre.setError(newerr);
375  }
376 
377  // Done.
378 
379  return result;
380  }
KSymMatrix< 5 >::type TrackError
Track error matrix, dimension 5x5.
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
boost::optional< double > lin_prop(KTrack &trk, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, KTrack *ref=0, TrackMatrix *prop_matrix=0, TrackError *noise_matrix=0) const
Linearized propagate without error.
Definition: Propagator.cxx:258
bool trkf::Propagator::getDoDedx ( ) const
inlineinherited

Definition at line 103 of file Propagator.h.

References trkf::Propagator::fDoDedx.

Referenced by trkf::PropXYZPlane::short_vec_prop(), short_vec_prop(), trkf::PropYZLine::short_vec_prop(), and trkf::Propagator::vec_prop().

103 {return fDoDedx;}
bool fDoDedx
Energy loss enable flag.
Definition: Propagator.h:164
const std::shared_ptr<const Interactor>& trkf::Propagator::getInteractor ( ) const
inlineinherited
double trkf::Propagator::getTcut ( ) const
inlineinherited

Definition at line 102 of file Propagator.h.

References trkf::Propagator::fTcut.

102 {return fTcut;}
double fTcut
Maximum delta ray energy for dE/dx.
Definition: Propagator.h:163
boost::optional< double > trkf::Propagator::lin_prop ( KTrack trk,
const std::shared_ptr< const Surface > &  psurf,
PropDirection  dir,
bool  doDedx,
KTrack ref = 0,
TrackMatrix prop_matrix = 0,
TrackError noise_matrix = 0 
) const
inherited

Linearized propagate without error.

Linearized propagate without error.

Arguments:

trk - Track to propagate. psurf - Destination surface. dir - Propagation direction (FORWARD, BACKWARD, or UNKNOWN). doDedx - dE/dx enable/disable flag. ref - Reference track (for linearized propagation). Can be null. prop_matrix - Return propagation matrix if not null. noise_matrix - Return noise matrix if not null.

Returned value: Propagation distance & success flag.

If the reference track is null, this method simply calls vec_prop.

Definition at line 258 of file Propagator.cxx.

References trkf::KTrack::getDirection(), trkf::KTrack::getSurface(), trkf::KTrack::getVector(), trkf::KTrack::isValid(), trkf::KTrack::setDirection(), trkf::KTrack::setSurface(), trkf::KTrack::setVector(), and trkf::Propagator::vec_prop().

Referenced by trkf::Propagator::err_prop(), trkf::Propagator::getInteractor(), and trkf::Propagator::noise_prop().

265  {
266  // Default result.
267 
268  boost::optional<double> result;
269 
270  if(ref == 0)
271  result = vec_prop(trk, psurf, dir, doDedx, prop_matrix, noise_matrix);
272  else {
273 
274  // A reference track has been provided.
275 
276  // It is an error (throw exception) if the reference track and
277  // the track to be propagted are not on the same surface.
278 
279  if(!trk.getSurface()->isEqual(*(ref->getSurface())))
280  throw cet::exception("Propagator") <<
281  "Input track and reference track not on same surface.\n";
282 
283  // Remember the starting track and reference track.
284 
285  KTrack trk0(trk);
286  KTrack ref0(*ref);
287 
288  // Propagate the reference track. Make sure we calculate the
289  // propagation matrix.
290 
291  TrackMatrix prop_temp;
292  if(prop_matrix == 0)
293  prop_matrix = &prop_temp;
294 
295  // Do the propgation. The returned result will be the result of
296  // this propagatrion.
297 
298  result = vec_prop(*ref, psurf, dir, doDedx, prop_matrix, noise_matrix);
299  if(!!result) {
300 
301  // Propagation of reference track succeeded. Update the track
302  // state vector and surface of the track to be propagated.
303 
304  TrackVector diff = trk.getSurface()->getDiff(trk.getVector(), ref0.getVector());
305  TrackVector newvec = ref->getVector() + prod(*prop_matrix, diff);
306 
307  // Store updated state vector and surface.
308 
309  trk.setVector(newvec);
310  trk.setSurface(psurf);
311  trk.setDirection(ref->getDirection());
312  if (!trk.getSurface()->isEqual(*(ref->getSurface())))
313  throw cet::exception("Propagator") << __func__ << ": surface mismatch";
314 
315  // Final validity check. In case of failure, restore the track
316  // and reference track to their starting values.
317 
318  if(!trk.isValid()) {
319  result = boost::optional<double>(false, 0.);
320  trk = trk0;
321  *ref = ref0;
322  }
323  }
324  else {
325 
326  // Propagation failed.
327  // Restore the reference track to its starting value, so that we ensure
328  // the reference track and the actual track remain on the same surface.
329 
330  trk = trk0;
331  *ref = ref0;
332  }
333  }
334 
335  // Done.
336 
337  return result;
338  }
KVector< 5 >::type TrackVector
Track state vector, dimension 5.
boost::optional< double > vec_prop(KTrack &trk, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, TrackMatrix *prop_matrix=0, TrackError *noise_matrix=0) const
Propagate without error (long distance).
Definition: Propagator.cxx:52
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
boost::optional< double > trkf::Propagator::noise_prop ( KETrack tre,
const std::shared_ptr< const Surface > &  psurf,
PropDirection  dir,
bool  doDedx,
KTrack ref = 0 
) const
inherited

Propagate with error and noise.

Propagate with error and noise.

Arguments:

tre - Track to propagate. psurf - Destination surface. dir - Propagation direction (FORWARD, BACKWARD, or UNKNOWN). doDedx - dE/dx enable/disable flag. ref - Reference track (for linearized propagation). Can be null.

Returned value: propagation distance + success flag.

Definition at line 394 of file Propagator.cxx.

References trkf::KETrack::getError(), trkf::Propagator::lin_prop(), and trkf::KETrack::setError().

Referenced by trkf::KalmanFilterAlg::buildTrack(), trkf::KalmanFilterAlg::extendTrack(), trkf::KalmanFilterAlg::fitMomentumMS(), trkf::Propagator::getInteractor(), trkf::KalmanFilterAlg::smoothTrack(), and trkf::KalmanFilterAlg::updateMomentum().

399  {
400  // Propagate without error, get propagation matrix and noise matrix.
401 
402  TrackMatrix prop_matrix;
403  TrackError noise_matrix;
404  boost::optional<double> result = lin_prop(tre, psurf, dir, doDedx, ref,
405  &prop_matrix, &noise_matrix);
406 
407  // If propagation succeeded, update track error matrix.
408 
409  if(!!result) {
410  TrackMatrix temp = prod(tre.getError(), trans(prop_matrix));
411  TrackMatrix temp2 = prod(prop_matrix, temp);
412  TrackError newerr = ublas::symmetric_adaptor<TrackMatrix>(temp2);
413  newerr += noise_matrix;
414  tre.setError(newerr);
415  }
416 
417  // Done.
418 
419  return result;
420  }
KSymMatrix< 5 >::type TrackError
Track error matrix, dimension 5x5.
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
boost::optional< double > lin_prop(KTrack &trk, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, KTrack *ref=0, TrackMatrix *prop_matrix=0, TrackError *noise_matrix=0) const
Linearized propagate without error.
Definition: Propagator.cxx:258
boost::optional< double > trkf::PropYZPlane::origin_vec_prop ( KTrack trk,
const std::shared_ptr< const Surface > &  porient,
TrackMatrix prop_matrix = 0 
) const
virtual

Propagate without error to surface whose origin parameters coincide with track position.

Propagate without error to dynamically generated origin surface. Optionally return propagation matrix.

Arguments:

trk - Track to propagate. porient - Orientation surface. prop_matrix - Pointer to optional propagation matrix.

Returned value: propagation distance + success flag.

Propagation distance is always zero after successful propagation.

Implements trkf::Propagator.

Definition at line 265 of file PropYZPlane.cxx.

References dir, trkf::KTrack::getDirection(), trkf::KTrack::getPosition(), trkf::KTrack::getSurface(), trkf::KTrack::getVector(), trkf::KTrack::isValid(), trkf::SurfYZPlane::phi(), trkf::KTrack::setDirection(), trkf::KTrack::setSurface(), trkf::KTrack::setVector(), transformXYZPlane(), transformYZLine(), and transformYZPlane().

Referenced by clone(), trkf::PropAny::origin_vec_prop(), and short_vec_prop().

268  {
269  // Set the default return value to be unitialized with value 0.
270 
271  boost::optional<double> result(false, 0.);
272 
273  // Remember starting track.
274 
275  KTrack trk0(trk);
276 
277  // Get initial track parameters and direction.
278  // Note the initial track can be on any type of surface.
279 
280  TrackVector vec = trk.getVector(); // Modifiable copy.
281  if(vec.size() != 5)
282  throw cet::exception("PropYZPlane")
283  << "Track state vector has wrong size" << vec.size() << "\n";
284  Surface::TrackDirection dir = trk.getDirection();
285 
286  // Get track position.
287 
288  double xyz[3];
289  trk.getPosition(xyz);
290  double x02 = xyz[0];
291  double y02 = xyz[1];
292  double z02 = xyz[2];
293 
294  // Generate the origin surface, which will be the destination surface.
295  // Return failure if orientation surface is the wrong type.
296 
297  const SurfYZPlane* orient = dynamic_cast<const SurfYZPlane*>(&*porient);
298  if(orient == 0)
299  return result;
300  double phi2 = orient->phi();
301  std::shared_ptr<const Surface> porigin(new SurfYZPlane(x02, y02, z02, phi2));
302 
303  // Test initial surface types.
304 
305  if(const SurfYZLine* from = dynamic_cast<const SurfYZLine*>(&*trk.getSurface())) {
306 
307  // Initial surface is SurfYZLine.
308  // Get surface paramters.
309 
310  double phi1 = from->phi();
311 
312  // Transform track to origin surface.
313 
314  bool ok = transformYZLine(phi1, phi2, vec, dir, prop_matrix);
315  result = boost::optional<double>(ok, 0.);
316  if(!ok)
317  return result;
318  }
319  else if(const SurfYZPlane* from = dynamic_cast<const SurfYZPlane*>(&*trk.getSurface())) {
320 
321  // Initial surface is SurfYZPlane.
322  // Get surface paramters.
323 
324  double phi1 = from->phi();
325 
326  // Transform track to origin surface.
327 
328  bool ok = transformYZPlane(phi1, phi2, vec, dir, prop_matrix);
329  result = boost::optional<double>(ok, 0.);
330  if(!ok)
331  return result;
332  }
333  else if(const SurfXYZPlane* from = dynamic_cast<const SurfXYZPlane*>(&*trk.getSurface())) {
334 
335  // Initial surface is SurfXYZPlane.
336  // Get surface paramters.
337 
338  double theta1 = from->theta();
339  double phi1 = from->phi();
340 
341  // Transform track to origin surface.
342 
343  bool ok = transformXYZPlane(theta1, phi1, phi2, vec, dir, prop_matrix);
344  result = boost::optional<double>(ok, 0.);
345  if(!ok)
346  return result;
347  }
348 
349  // Update track.
350 
351  trk.setSurface(porigin);
352  trk.setVector(vec);
353  trk.setDirection(dir);
354 
355  // Final validity check.
356 
357  if(!trk.isValid()) {
358  trk = trk0;
359  result = boost::optional<double>(false, 0.);
360  }
361 
362  // Done.
363 
364  return result;
365  }
TrackDirection
Track direction enum.
Definition: Surface.h:56
bool transformXYZPlane(double theta1, double phi1, double phi2, TrackVector &vec, Surface::TrackDirection &dir, TrackMatrix *prop_matrix) const
Transform xyz plane -> yz plane.
bool transformYZPlane(double phi1, double phi2, TrackVector &vec, Surface::TrackDirection &dir, TrackMatrix *prop_matrix) const
Transform yz plane -> yz plane.
KVector< 5 >::type TrackVector
Track state vector, dimension 5.
bool transformYZLine(double phi1, double phi2, TrackVector &vec, Surface::TrackDirection &dir, TrackMatrix *prop_matrix) const
Transform yz line -> yz plane.
TDirectory * dir
Definition: macro.C:5
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
boost::optional< double > trkf::PropYZPlane::short_vec_prop ( KTrack trk,
const std::shared_ptr< const Surface > &  psurf,
Propagator::PropDirection  dir,
bool  doDedx,
TrackMatrix prop_matrix = 0,
TrackError noise_matrix = 0 
) const
virtual

Propagate without error.

Propagate without error. Optionally return propagation matrix and noise matrix.

Arguments:

trk - Track to propagate. psurf - Destination surface. dir - Propagation direction (FORWARD, BACKWARD, or UNKNOWN). doDedx - dE/dx enable/disable flag. prop_matrix - Pointer to optional propagation matrix. noise_matrix - Pointer to optional noise matrix.

Returned value: propagation distance + success flag.

Implements trkf::Propagator.

Definition at line 53 of file PropYZPlane.cxx.

References trkf::Surface::BACKWARD, trkf::Propagator::BACKWARD, trkf::Propagator::dedx_prop(), trkf::Propagator::FORWARD, trkf::KTrack::getDirection(), trkf::Propagator::getDoDedx(), trkf::Propagator::getInteractor(), trkf::KTrack::getPosition(), trkf::KTrack::getVector(), trkf::KTrack::Mass(), origin_vec_prop(), trkf::SurfYZPlane::phi(), s, trkf::KTrack::setSurface(), trkf::KTrack::setVector(), trkf::Surface::UNKNOWN, trkf::Propagator::UNKNOWN, trkf::SurfYZPlane::x0(), trkf::SurfYZPlane::y0(), and trkf::SurfYZPlane::z0().

Referenced by clone(), and trkf::PropAny::short_vec_prop().

59  {
60  // Set the default return value to be unitialized with value 0.
61 
62  boost::optional<double> result(false, 0.);
63 
64  // Get destination surface and surface parameters.
65  // Return failure if wrong surface type.
66 
67  const SurfYZPlane* to = dynamic_cast<const SurfYZPlane*>(&*psurf);
68  if(to == 0)
69  return result;
70  double x02 = to->x0();
71  double y02 = to->y0();
72  double z02 = to->z0();
73  double phi2 = to->phi();
74 
75  // Remember starting track.
76 
77  KTrack trk0(trk);
78 
79  // Get track position.
80 
81  double xyz[3];
82  trk.getPosition(xyz);
83  double x01 = xyz[0];
84  double y01 = xyz[1];
85  double z01 = xyz[2];
86 
87  // Propagate to origin surface.
88 
89  TrackMatrix local_prop_matrix;
90  TrackMatrix* plocal_prop_matrix = (prop_matrix==0 ? 0 : &local_prop_matrix);
91  boost::optional<double> result1 = origin_vec_prop(trk, psurf, plocal_prop_matrix);
92  if(!result1)
93  return result1;
94 
95  // Get the intermediate track state vector and track parameters.
96 
97  const TrackVector& vec = trk.getVector();
98  if(vec.size() != 5)
99  throw cet::exception("PropYZPlane")
100  << "Track state vector has wrong size" << vec.size() << "\n";
101  double u1 = vec(0);
102  double v1 = vec(1);
103  double dudw1 = vec(2);
104  double dvdw1 = vec(3);
105  double pinv = vec(4);
106  Surface::TrackDirection dir1 = trk.getDirection();
107 
108  // Make sure intermediate track has a valid direction.
109 
110  if(dir1 == Surface::UNKNOWN) {
111  trk = trk0;
112  return result;
113  }
114 
115  // Calculate transcendental functions.
116 
117  double sinphi2 = std::sin(phi2);
118  double cosphi2 = std::cos(phi2);
119 
120  // Calculate initial position in the destination coordinate
121  // system.
122 
123  double u2 = x01 - x02 + u1;
124  double v2 = (y01 - y02) * cosphi2 + (z01 - z02) * sinphi2 + v1;
125  double w2 = -(y01 - y02) * sinphi2 + (z01 - z02) * cosphi2;
126 
127  // Calculate position at destination surface (propagate distance -w2).
128 
129  double u2p = u2 - w2 * dudw1;
130  double v2p = v2 - w2 * dvdw1;
131 
132  // Calculate the signed propagation distance.
133 
134  double s = -w2 * std::sqrt(1. + dudw1*dudw1 + dvdw1*dvdw1);
135  if(dir1 == Surface::BACKWARD)
136  s = -s;
137 
138  // Check if propagation was in the right direction.
139  // (Compare sign of s with requested direction).
140 
141  bool sok = (dir == Propagator::UNKNOWN ||
142  (dir == Propagator::FORWARD && s >= 0.) ||
143  (dir == Propagator::BACKWARD && s <= 0.));
144 
145  // If wrong direction, return failure without updating the track
146  // or propagation matrix.
147 
148  if(!sok) {
149  trk = trk0;
150  return result;
151  }
152 
153  // Find final momentum.
154 
155  double deriv = 1.;
156  boost::optional<double> pinv2(true, pinv);
157  if(getDoDedx() && doDedx && s != 0.) {
158  double* pderiv = (prop_matrix != 0 ? &deriv : 0);
159  pinv2 = dedx_prop(pinv, trk.Mass(), s, pderiv);
160  }
161 
162  // Return failure in case of range out.
163 
164  if(!pinv2) {
165  trk = trk0;
166  return result;
167  }
168 
169  // Update default result to success and store propagation distance.
170 
171  result = boost::optional<double>(true, s);
172 
173  // Update propagation matrix (if requested).
174 
175  if(prop_matrix != 0) {
176  TrackMatrix pm;
177  pm.resize(vec.size(), vec.size(), false);
178 
179  // Calculate partial derivatives.
180 
181  pm(0,0) = 1.; // du2/du1
182  pm(1,0) = 0.; // dv2/du1
183  pm(2,0) = 0.; // d(dudw2)/du1
184  pm(3,0) = 0.; // d(dvdw2)/du1
185  pm(4,0) = 0.; // d(pinv2)/du1
186 
187  pm(0,1) = 0.; // du2/dv1
188  pm(1,1) = 1.; // dv2/dv1
189  pm(2,1) = 0.; // d(dudw2)/dv1
190  pm(3,1) = 0.; // d(dvdw2)/dv1
191  pm(4,1) = 0.; // d(pinv2)/dv1
192 
193  pm(0,2) = -w2; // du2/d(dudw1);
194  pm(1,2) = 0.; // dv2/d(dudw1);
195  pm(2,2) = 1.; // d(dudw2)/d(dudw1);
196  pm(3,2) = 0.; // d(dvdw2)/d(dudw1);
197  pm(4,2) = 0.; // d(pinv2)/d(dudw1);
198 
199  pm(0,3) = 0.; // du2/d(dvdw1);
200  pm(1,3) = -w2; // dv2/d(dvdw1);
201  pm(2,3) = 0.; // d(dudw2)/d(dvdw1);
202  pm(3,3) = 1.; // d(dvdw2)/d(dvdw1);
203  pm(4,3) = 0.; // d(pinv2)/d(dvdw1);
204 
205  pm(0,4) = 0.; // du2/d(pinv1);
206  pm(1,4) = 0.; // dv2/d(pinv1);
207  pm(2,4) = 0.; // d(dudw2)/d(pinv1);
208  pm(3,4) = 0.; // d(dvdw2)/d(pinv1);
209  pm(4,4) = deriv; // d(pinv2)/d(pinv1);
210 
211  // Compose the final propagation matrix from zero-distance propagation and
212  // parallel surface propagation.
213 
214  *prop_matrix = prod(pm, *plocal_prop_matrix);
215  }
216 
217  // Update noise matrix (if requested).
218 
219  if(noise_matrix != 0) {
220  noise_matrix->resize(vec.size(), vec.size(), false);
221  if(getInteractor().get() != 0) {
222  bool ok = getInteractor()->noise(trk, s, *noise_matrix);
223  if(!ok) {
224  trk = trk0;
225  return boost::optional<double>(false, 0.);
226  }
227  }
228  else
229  noise_matrix->clear();
230  }
231 
232  // Construct track vector at destination surface.
233 
234  TrackVector vec2(vec.size());
235  vec2(0) = u2p;
236  vec2(1) = v2p;
237  vec2(2) = dudw1;
238  vec2(3) = dvdw1;
239  vec2(4) = *pinv2;
240 
241  // Update track.
242 
243  trk.setSurface(psurf);
244  trk.setVector(vec2);
245 
246  // Done.
247 
248  return result;
249  }
Float_t s
Definition: plot.C:23
TrackDirection
Track direction enum.
Definition: Surface.h:56
boost::optional< double > dedx_prop(double pinv, double mass, double s, double *deriv=0) const
Method to calculate updated momentum due to dE/dx.
Definition: Propagator.cxx:459
const std::shared_ptr< const Interactor > & getInteractor() const
Definition: Propagator.h:104
KVector< 5 >::type TrackVector
Track state vector, dimension 5.
bool getDoDedx() const
Definition: Propagator.h:103
virtual boost::optional< double > origin_vec_prop(KTrack &trk, const std::shared_ptr< const Surface > &porient, TrackMatrix *prop_matrix=0) const
Propagate without error to surface whose origin parameters coincide with track position.
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
bool trkf::PropYZPlane::transformXYZPlane ( double  theta1,
double  phi1,
double  phi2,
TrackVector vec,
Surface::TrackDirection dir,
TrackMatrix prop_matrix 
) const
private

Transform xyz plane -> yz plane.

Definition at line 661 of file PropYZPlane.cxx.

References trkf::Surface::BACKWARD, trkf::Surface::FORWARD, and trkf::Surface::UNKNOWN.

Referenced by clone(), and origin_vec_prop().

665  {
666  // Calculate transcendental functions.
667 
668  double sinth1 = std::sin(theta1);
669  double costh1 = std::cos(theta1);
670 
671  double sindphi = std::sin(phi2 - phi1);
672  double cosdphi = std::cos(phi2 - phi1);
673 
674  // Get the initial track state vector and track parameters.
675 
676  double dudw1 = vec(2);
677  double dvdw1 = vec(3);
678 
679  // Make sure initial track has a valid direction.
680 
681  if(dir == Surface::UNKNOWN)
682  return false;
683 
684  // Calculate elements of rotation matrix from initial coordinate
685  // system to destination coordinte system.
686 
687  double ruu = costh1;
688  double ruw = sinth1;
689 
690  double rvu = -sinth1*sindphi;
691  double rvv = cosdphi;
692  double rvw = costh1*sindphi;
693 
694  double rwu = -sinth1*cosdphi;
695  double rwv = -sindphi;
696  double rww = costh1*cosdphi;
697 
698  // Calculate the derivative dw2/dw1;
699  // If dw2/dw1 == 0., that means the track is moving parallel
700  // to destination plane.
701  // In this case return propagation failure.
702 
703  double dw2dw1 = dudw1*rwu + dvdw1*rwv + rww;
704  if(dw2dw1 == 0.)
705  return false;
706 
707  // Calculate slope in destination plane coordinates.
708 
709  double dudw2 = (dudw1*ruu + ruw) / dw2dw1;
710  double dvdw2 = (dudw1*rvu + dvdw1*rvv + rvw) / dw2dw1;
711 
712  // Calculate direction parameter at destination surface.
713  // Direction will flip if dw2dw1 < 0.;
714 
715  switch (dir) {
716  case Surface::FORWARD:
717  dir = (dw2dw1 > 0.)? Surface::FORWARD: Surface::BACKWARD;
718  break;
719  case Surface::BACKWARD:
720  dir = (dw2dw1 > 0.)? Surface::BACKWARD: Surface::FORWARD;
721  break;
722  default:
723  throw cet::exception("PropXYZPlane")
724  << __func__ << ": unexpected direction #" << ((int) dir) << "\n";
725  } // switch
726 
727  // Update propagation matrix (if requested).
728 
729  if(prop_matrix != 0) {
730  TrackMatrix& pm = *prop_matrix;
731  pm.resize(vec.size(), vec.size(), false);
732 
733  // Calculate partial derivatives.
734 
735  pm(0,0) = ruu - dudw2*rwu; // du2/du1
736  pm(1,0) = rvu - dvdw2*rwu; // dv2/du1
737  pm(2,0) = 0.; // d(dudw2)/du1
738  pm(3,0) = 0.; // d(dvdw2)/du1
739  pm(4,0) = 0.; // d(pinv2)/du1
740 
741  pm(0,1) = -dudw2*rwv; // du2/dv1
742  pm(1,1) = rvv - dvdw2*rwv; // dv2/dv1
743  pm(2,1) = 0.; // d(dudw2)/dv1
744  pm(3,1) = 0.; // d(dvdw2)/dv1
745  pm(4,1) = 0.; // d(pinv2)/dv1
746 
747  pm(0,2) = 0.; // du2/d(dudw1);
748  pm(1,2) = 0.; // dv2/d(dudw1);
749  pm(2,2) = (ruu - dudw2*rwu) / dw2dw1; // d(dudw2)/d(dudw1);
750  pm(3,2) = (rvu - dvdw2*rwu) / dw2dw1; // d(dvdw2)/d(dudw1);
751  pm(4,2) = 0.; // d(pinv2)/d(dudw1);
752 
753  pm(0,3) = 0.; // du2/d(dvdw1);
754  pm(1,3) = 0.; // dv2/d(dvdw1);
755  pm(2,3) = -dudw2*rwv / dw2dw1; // d(dudw2)/d(dvdw1);
756  pm(3,3) = (rvv - dvdw2*rwv) / dw2dw1; // d(dvdw2)/d(dvdw1);
757  pm(4,3) = 0.; // d(pinv2)/d(dvdw1);
758 
759  pm(0,4) = 0.; // du2/d(pinv1);
760  pm(1,4) = 0.; // dv2/d(pinv1);
761  pm(2,4) = 0.; // d(dudw2)/d(pinv1);
762  pm(3,4) = 0.; // d(dvdw2)/d(pinv1);
763  pm(4,4) = 1.; // d(pinv2)/d(pinv1);
764  }
765 
766  // Update track vector.
767 
768  vec(0) = 0.;
769  vec(1) = 0.;
770  vec(2) = dudw2;
771  vec(3) = dvdw2;
772 
773  // Done (success).
774 
775  return true;
776  }
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
bool trkf::PropYZPlane::transformYZLine ( double  phi1,
double  phi2,
TrackVector vec,
Surface::TrackDirection dir,
TrackMatrix prop_matrix 
) const
private

Transform yz line -> yz plane.

The following methods transform the track parameters from initial surface to SurfYZPlane origin surface, and generate a propagation matrix. The first group of function parameters are the orientation surface parameters of the initial surface. The second group of function parameters are the orientation parameters of the of the destination surface. The origin parameters of the destination surface are assumed to match the position of the track.

Definition at line 369 of file PropYZPlane.cxx.

Referenced by clone(), and origin_vec_prop().

373  {
374  // Calculate surface transcendental functions.
375 
376  double sindphi = std::sin(phi2 - phi1);
377  double cosdphi = std::cos(phi2 - phi1);
378 
379  // Get the initial track parameters.
380 
381  double r1 = vec(0);
382  double phid1 = vec(2);
383  double eta1 = vec(3);
384 
385  // Calculate elements of rotation matrix from initial coordinate
386  // system to destination coordinte system.
387 
388  double rvv = cosdphi;
389  double rvw = sindphi;
390 
391  double rwv = -sindphi;
392  double rww = cosdphi;
393 
394  // Calculate track transcendental functions.
395 
396  double sinphid1 = std::sin(phid1);
397  double cosphid1 = std::cos(phid1);
398  double sh1 = 1. / std::cosh(eta1); // sech(eta1)
399  double th1 = std::tanh(eta1);
400 
401  // Calculate initial position in Cartesian coordinates.
402 
403  double u1 = -r1 * sinphid1;
404  double w1 = r1 * cosphid1;
405 
406  // Calculate direction in destination coordinate system.
407 
408  double du2 = sh1*cosphid1;
409  double dv2 = th1*cosdphi + sh1*sinphid1*sindphi;
410  double dw2 = -th1*sindphi + sh1*sinphid1*cosdphi;
411  //double duw2 = std::hypot(du2, dw2);
412 
413  // Calculate the track direction relative to the destination surface.
414  // The track direction comes from the sign of dw2 (=dw/ds).
415  // If dw2 is zero, the destionation surface is unreachable, return failure.
416 
417  if(dw2 > 0.)
418  dir = Surface::TrackDirection::FORWARD;
419  else if(dw2 < 0.)
420  dir = Surface::TrackDirection::BACKWARD;
421  else
422  return false;
423 
424  // Calculate final track slope track parameters.
425 
426  double dudw2 = du2 / dw2;
427  double dvdw2 = dv2 / dw2;
428 
429  // Update propagation matrix (if requested).
430 
431  if(prop_matrix != 0) {
432  TrackMatrix& pm = *prop_matrix;
433  pm.resize(vec.size(), vec.size(), false);
434 
435  // Calculate partial derivatives.
436 
437  // Partials of initial positions and directions wrt initial t.p.'s.
438 
439  double du1dr1 = -sinphid1;
440  double du1dphi1 = -w1;
441 
442  double dw1dr1 = cosphid1;
443  double dw1dphi1 = u1;
444 
445  double ddu1dphi1 = -sinphid1*sh1;
446  double ddu1deta1 = -cosphid1*sh1*th1;
447 
448  double ddv1deta1 = sh1*sh1;
449 
450  double ddw1dphi1 = cosphid1*sh1;
451  double ddw1deta1 = -sinphid1*sh1*th1;
452 
453  // Rotate partials to destination coordinate system.
454 
455  double du2dr1 = du1dr1;
456  double dv2dr1 = rvw*dw1dr1;
457  double dw2dr1 = rww*dw1dr1;
458 
459  double dv2dv1 = rvv;
460  double dw2dv1 = rwv;
461 
462  double du2dphi1 = du1dphi1;
463  double dv2dphi1 = rvw*dw1dphi1;
464  double dw2dphi1 = rww*dw1dphi1;
465 
466  double ddu2dphi1 = ddu1dphi1;
467  double ddv2dphi1 = rvw*ddw1dphi1;
468  double ddw2dphi1 = rww*ddw1dphi1;
469 
470  double ddu2deta1 = ddu1deta1;
471  double ddv2deta1 = rvv*ddv1deta1 + rvw*ddw1deta1;
472  double ddw2deta1 = rwv*ddv1deta1 + rww*ddw1deta1;
473 
474  // Partials of final slope t.p. wrt final position and direction.
475 
476  double ddudw2ddu2 = 1. / dw2;
477  double ddudw2ddw2 = -dudw2 / dw2;
478 
479  double ddvdw2ddv2 = 1. / dw2;
480  double ddvdw2ddw2 = -dvdw2 / dw2;
481 
482  // Partials of final slope t.p. wrt initial t.p.
483 
484  double ddudw2dphi1 = ddudw2ddu2*ddu2dphi1 + ddudw2ddw2*ddw2dphi1;
485  double ddudw2deta1 = ddudw2ddu2*ddu2deta1 + ddudw2ddw2*ddw2deta1;
486 
487  double ddvdw2dphi1 = ddvdw2ddv2*ddv2dphi1 + ddvdw2ddw2*ddw2dphi1;
488  double ddvdw2deta1 = ddvdw2ddv2*ddv2deta1 + ddvdw2ddw2*ddw2deta1;
489 
490  // We still need to calculate the corretion due to the dependence of the
491  // propagation distance on the initial track parameters. This correction is
492  // needed even though the actual propagation distance is zero.
493 
494  // This correction effects the u and v track parameters.
495 
496  // Partials of perpendicular propagation distance wrt initial t.p.
497 
498  double dstdr1 = -dw2dr1;
499  double dstdv1 = -dw2dv1;
500  double dstdphi1 = -dw2dphi1;
501 
502  // Calculate correction to u and v parameter partials wrt initial t.p. due to path length.
503 
504  du2dr1 += dstdr1 * dudw2;
505  double du2dv1 = dstdv1 * dudw2;
506  du2dphi1 += dstdphi1 * dudw2;
507 
508  dv2dr1 += dstdr1 * dvdw2;
509  dv2dv1 += dstdv1 * dvdw2;
510  dv2dphi1 += dstdphi1 * dvdw2;
511 
512  // Fill derivative matrix.
513 
514  pm(0,0) = du2dr1; // du2/dr1
515  pm(1,0) = dv2dr1; // dv2/dr1
516  pm(2,0) = 0.; // d(dudw2)/dr1
517  pm(3,0) = 0.; // d(dvdw2)/dr1
518  pm(4,0) = 0.; // d(pinv2)/dr1
519 
520  pm(0,1) = du2dv1; // du2/dv1
521  pm(1,1) = dv2dv1; // dv2/dv1
522  pm(2,1) = 0.; // d(dudw2)/dv1
523  pm(3,1) = 0.; // d(dvdw2)/dv1
524  pm(4,1) = 0.; // d(pinv2)/dv1
525 
526  pm(0,2) = du2dphi1; // du2/d(phi1);
527  pm(1,2) = dv2dphi1; // dv2/d(phi1);
528  pm(2,2) = ddudw2dphi1; // d(dudw2)/d(phi1);
529  pm(3,2) = ddvdw2dphi1; // d(dvdw2)/d(phi1);
530  pm(4,2) = 0.; // d(pinv2)/d(phi1);
531 
532  pm(0,3) = 0.; // du2/d(eta1);
533  pm(1,3) = 0.; // dv2/d(eta1);
534  pm(2,3) = ddudw2deta1; // d(dudw2)/d(eta1);
535  pm(3,3) = ddvdw2deta1; // d(dvdw2)/d(eta1);
536  pm(4,3) = 0.; // d(pinv2)/d(eta1);
537 
538  pm(0,4) = 0.; // du2/d(pinv1);
539  pm(1,4) = 0.; // dv2/d(pinv1);
540  pm(2,4) = 0.; // d(dudw2)/d(pinv1);
541  pm(3,4) = 0.; // d(dvdw2)/d(pinv1);
542  pm(4,4) = 1.; // d(pinv2)/d(pinv1);
543  }
544 
545  // Update track vector.
546 
547  vec(0) = 0.;
548  vec(1) = 0.;
549  vec(2) = dudw2;
550  vec(3) = dvdw2;
551 
552  // Done (success).
553 
554  return true;
555  }
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
bool trkf::PropYZPlane::transformYZPlane ( double  phi1,
double  phi2,
TrackVector vec,
Surface::TrackDirection dir,
TrackMatrix prop_matrix 
) const
private

Transform yz plane -> yz plane.

Definition at line 559 of file PropYZPlane.cxx.

References trkf::Surface::BACKWARD, trkf::Surface::FORWARD, and trkf::Surface::UNKNOWN.

Referenced by clone(), and origin_vec_prop().

563  {
564  // Calculate transcendental functions.
565 
566  double sindphi = std::sin(phi2 - phi1);
567  double cosdphi = std::cos(phi2 - phi1);
568 
569  // Get the initial track parameters.
570 
571  double dudw1 = vec(2);
572  double dvdw1 = vec(3);
573 
574  // Make sure initial track has a valid direction.
575 
576  if(dir == Surface::UNKNOWN)
577  return false;
578 
579  // Calculate derivative dw2/dw1.
580  // If dw2/dw1 == 0., that means the track is moving parallel
581  // to destination plane.
582  // In this case return propagation failure.
583 
584  double dw2dw1 = cosdphi - dvdw1 * sindphi;
585  if(dw2dw1 == 0.)
586  return false;
587 
588  // Calculate slope in destrination coordiante system.
589 
590  double dudw2 = dudw1 / dw2dw1;
591  double dvdw2 = (sindphi + dvdw1 * cosdphi) / dw2dw1;
592 
593  // Calculate direction parameter at destination surface.
594  // Direction will flip if dw2dw1 < 0.;
595 
596  switch (dir) {
597  case Surface::FORWARD:
598  dir = (dw2dw1 > 0.)? Surface::FORWARD: Surface::BACKWARD;
599  break;
600  case Surface::BACKWARD:
601  dir = (dw2dw1 > 0.)? Surface::BACKWARD: Surface::FORWARD;
602  break;
603  default:
604  throw cet::exception("PropYZPlane")
605  << "unexpected direction #" << ((int) dir) << "\n";
606  } // switch
607 
608  // Update propagation matrix (if requested).
609 
610  if(prop_matrix != 0) {
611  TrackMatrix& pm = *prop_matrix;
612  pm.resize(vec.size(), vec.size(), false);
613 
614  // Calculate partial derivatives.
615 
616  pm(0,0) = 1.; // du2/du1
617  pm(1,0) = 0.; // dv2/du1
618  pm(2,0) = 0.; // d(dudw2)/du1
619  pm(3,0) = 0.; // d(dvdw2)/du1
620  pm(4,0) = 0.; // d(pinv2)/du1
621 
622  pm(0,1) = dudw2 * sindphi; // du2/dv1
623  pm(1,1) = cosdphi + dvdw2 * sindphi; // dv2/dv1
624  pm(2,1) = 0.; // d(dudw2)/dv1
625  pm(3,1) = 0.; // d(dvdw2)/dv1
626  pm(4,1) = 0.; // d(pinv2)/dv1
627 
628  pm(0,2) = 0.; // du2/d(dudw1);
629  pm(1,2) = 0.; // dv2/d(dudw1);
630  pm(2,2) = 1. / dw2dw1; // d(dudw2)/d(dudw1);
631  pm(3,2) = 0.; // d(dvdw2)/d(dudw1);
632  pm(4,2) = 0.; // d(pinv2)/d(dudw1);
633 
634  pm(0,3) = 0.; // du2/d(dvdw1);
635  pm(1,3) = 0.; // dv2/d(dvdw1);
636  pm(2,3) = dudw1 * sindphi / (dw2dw1*dw2dw1); // d(dudw2)/d(dvdw1);
637  pm(3,3) = 1. / (dw2dw1*dw2dw1); // d(dvdw2)/d(dvdw1);
638  pm(4,3) = 0.; // d(pinv2)/d(dvdw1);
639 
640  pm(0,4) = 0.; // du2/d(pinv1);
641  pm(1,4) = 0.; // dv2/d(pinv1);
642  pm(2,4) = 0.; // d(dudw2)/d(pinv1);
643  pm(3,4) = 0.; // d(dvdw2)/d(pinv1);
644  pm(4,4) = 1.; // d(pinv2)/d(pinv1);
645  }
646 
647  // Update track vector.
648 
649  vec(0) = 0.;
650  vec(1) = 0.;
651  vec(2) = dudw2;
652  vec(3) = dvdw2;
653 
654  // Done (success).
655 
656  return true;
657  }
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
boost::optional< double > trkf::Propagator::vec_prop ( KTrack trk,
const std::shared_ptr< const Surface > &  psurf,
PropDirection  dir,
bool  doDedx,
TrackMatrix prop_matrix = 0,
TrackError noise_matrix = 0 
) const
inherited

Propagate without error (long distance).

Propagate without error (long distance).

Arguments:

trk - Track to propagate. psurf - Destination surface. dir - Propagation direction (FORWARD, BACKWARD, or UNKNOWN). doDedx - dE/dx enable/disable flag. prop_matrix - Return propagation matrix if not null. noise_matrix - Return noise matrix if not null.

Returned value: Propagation distance & success flag.

This method calls virtual method short_vec_prop in steps of some maximum size.

Definition at line 52 of file Propagator.cxx.

References e, trkf::Propagator::fTcut, trkf::Propagator::getDoDedx(), trkf::KTrack::getMomentum(), trkf::KTrack::getPosition(), trkf::KTrack::getVector(), trkf::KTrack::Mass(), s, and trkf::Propagator::short_vec_prop().

Referenced by trkf::KalmanFilterAlg::fitMomentumMS(), trkf::Propagator::getInteractor(), trkf::Propagator::lin_prop(), trkf::KHitContainer::sort(), and trkf::KalmanFilterAlg::updateMomentum().

58  {
59  // Default result.
60 
61  auto result = boost::make_optional<double>(false, 0.);
62 
63  // Get the inverse momentum (assumed to be track parameter four).
64 
65  double pinv = trk.getVector()(4);
66 
67  // If dE/dx is not requested, or if inverse momentum is zero, then
68  // it is safe to propagate in one step. In this case, just pass
69  // the call to short_vec_prop with unlimited distance.
70 
71  bool dedx = getDoDedx() && doDedx;
72  if(!dedx || pinv == 0.)
73  result = short_vec_prop(trk, psurf, dir, dedx, prop_matrix, noise_matrix);
74 
75  else {
76 
77  // dE/dx is requested. In this case we limit the maximum
78  // propagation distance such that the kinetic energy of the
79  // particle should not change by more thatn 10%.
80 
81  // Get LAr service.
82 
83  auto const * detprop = lar::providerFrom<detinfo::DetectorPropertiesService>();
84 
85  // Initialize propagation matrix to unit matrix (if specified).
86 
87  int nvec = trk.getVector().size();
88  if(prop_matrix)
89  *prop_matrix = ublas::identity_matrix<TrackVector::value_type>(nvec);
90 
91  // Initialize noise matrix to zero matrix (if specified).
92 
93  if(noise_matrix) {
94  noise_matrix->resize(nvec, nvec, false);
95  noise_matrix->clear();
96  }
97 
98  // Remember the starting track.
99 
100  KTrack trk0(trk);
101 
102  // Make pointer variables pointing to local versions of the
103  // propagation and noise matrices, or null if not specified.
104 
105  TrackMatrix local_prop_matrix;
106  TrackMatrix* plocal_prop_matrix = (prop_matrix==0 ? 0 : &local_prop_matrix);
107  TrackError local_noise_matrix;
108  TrackError* plocal_noise_matrix = (noise_matrix==0 ? 0 : &local_noise_matrix);
109 
110  // Cumulative propagation distance.
111 
112  double s = 0.;
113 
114  // Begin stepping loop.
115  // We put a maximum iteration count to prevent infinite loops caused by
116  // floating point pathologies. The iteration count is large enough to reach
117  // any point in the tpc using the minimum step size (for a reasonable tpc).
118 
119  bool done = false;
120  int nitmax = 10000; // Maximum number of iterations.
121  int nit = 0; // Iteration count.
122  while(!done) {
123 
124  // If the iteration count exceeds the maximum, return failure.
125 
126  ++nit;
127  if(nit > nitmax) {
128  trk = trk0;
129  result = boost::optional<double>(false, 0.);
130  return result;
131  }
132 
133  // Estimate maximum step distance according to the above
134  // stated principle.
135 
136  pinv = trk.getVector()(4);
137  double mass = trk.Mass();
138  double p = 1./std::abs(pinv);
139  double e = std::hypot(p, mass);
140  double t = p*p / (e + mass);
141  double dedx = 0.001 * detprop->Eloss(p, mass, fTcut);
142  double smax = 0.1 * t / dedx;
143  if (smax <= 0.)
144  throw cet::exception("Propagator") << __func__ << ": maximum step " << smax << "\n";
145 
146  // Always allow a step of at least 0.3 cm (about one wire spacing).
147 
148  if(smax < 0.3)
149  smax = 0.3;
150 
151  // First do a test propagation (without dE/dx and errors) to
152  // find the distance to the destination surface.
153 
154  KTrack trktest(trk);
155  boost::optional<double> dist = short_vec_prop(trktest, psurf, dir, false, 0, 0);
156 
157  // If the test propagation failed, return failure.
158 
159  if(!dist) {
160  trk = trk0;
161  return dist;
162  }
163 
164  // Generate destionation surface for this step (either final
165  // destination, or some intermediate surface).
166 
167  std::shared_ptr<const Surface> pstep;
168  if(std::abs(*dist) <= smax) {
169  done = true;
170  pstep = psurf;
171  }
172  else {
173 
174  // Generate intermediate surface.
175  // First get point where track will intersect intermediate surface.
176 
177  double xyz0[3]; // Starting point.
178  trk.getPosition(xyz0);
179  double xyz1[3]; // Destination point.
180  trktest.getPosition(xyz1);
181  double frac = smax / std::abs(*dist);
182  double xyz[3]; // Intermediate point.
183  xyz[0] = xyz0[0] + frac * (xyz1[0] - xyz0[0]);
184  xyz[1] = xyz0[1] + frac * (xyz1[1] - xyz0[1]);
185  xyz[2] = xyz0[2] + frac * (xyz1[2] - xyz0[2]);
186 
187  // Choose orientation of intermediate surface perpendicular
188  // to track.
189 
190  double mom[3];
191  trk.getMomentum(mom);
192 
193  // Make intermediate surface object.
194 
195  pstep = std::shared_ptr<const Surface>(new SurfXYZPlane(xyz[0], xyz[1], xyz[2],
196  mom[0], mom[1], mom[2]));
197  }
198 
199  // Do the actual step propagation.
200 
201  dist = short_vec_prop(trk, pstep, dir, doDedx,
202  plocal_prop_matrix, plocal_noise_matrix);
203 
204  // If the step propagation failed, return failure.
205 
206  if(!dist) {
207  trk = trk0;
208  return dist;
209  }
210 
211  // Update cumulative propagation distance.
212 
213  s += *dist;
214 
215  // Update cumulative propagation matrix (left-multiply).
216 
217  if(prop_matrix != 0) {
218  TrackMatrix temp = prod(*plocal_prop_matrix, *prop_matrix);
219  *prop_matrix = temp;
220  }
221 
222  // Update cumulative noise matrix.
223 
224  if(noise_matrix != 0) {
225  TrackMatrix temp = prod(*noise_matrix, trans(*plocal_prop_matrix));
226  TrackMatrix temp2 = prod(*plocal_prop_matrix, temp);
227  *noise_matrix = ublas::symmetric_adaptor<TrackMatrix>(temp2);
228  *noise_matrix += *plocal_noise_matrix;
229  }
230  }
231 
232  // Set the final result (distance + success).
233 
234  result = boost::optional<double>(true, s);
235  }
236 
237  // Done.
238 
239  return result;
240  }
Float_t s
Definition: plot.C:23
KSymMatrix< 5 >::type TrackError
Track error matrix, dimension 5x5.
double fTcut
Maximum delta ray energy for dE/dx.
Definition: Propagator.h:163
bool getDoDedx() const
Definition: Propagator.h:103
TDirectory * dir
Definition: macro.C:5
KMatrix< 5, 5 >::type TrackMatrix
General 5x5 matrix.
Float_t e
Definition: plot.C:34
virtual boost::optional< double > short_vec_prop(KTrack &trk, const std::shared_ptr< const Surface > &psurf, PropDirection dir, bool doDedx, TrackMatrix *prop_matrix=0, TrackError *noise_matrix=0) const =0
Propagate without error (short distance).
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33

The documentation for this class was generated from the following files: