CMS 3D CMS Logo

Public Member Functions | Protected Member Functions | Protected Attributes | Private Attributes

BaseParticlePropagator Class Reference

#include <BaseParticlePropagator.h>

Inheritance diagram for BaseParticlePropagator:
RawParticle ParticlePropagator

List of all members.

Public Member Functions

bool backPropagate ()
 BaseParticlePropagator (const RawParticle &myPart, double r, double z, double B)
 BaseParticlePropagator ()
 Default c'tor.
 BaseParticlePropagator (const RawParticle &myPart, double r, double z, double B, double t)
double getMagneticField () const
 Get the magnetic field.
int getSuccess () const
 Has propagation been performed and was barrel or endcap reached ?
bool hasDecayed () const
 Has the particle decayed while propagated ?
double helixCentreDistToAxis (double xC, double yC) const
double helixCentreDistToAxis () const
 The distance between the cylinder and the helix axes.
double helixCentrePhi () const
 The azimuth if the vector joining the cylinder and the helix axes.
double helixCentrePhi (double xC, double yC) const
double helixCentreX () const
 The x coordinate of the helix axis.
double helixCentreX (double radius, double phi) const
double helixCentreY () const
 The y coordinate of the helix axis.
double helixCentreY (double radius, double phi) const
double helixRadius () const
 The helix Radius.
double helixRadius (double pT) const
double helixStartPhi () const
 The azimuth of the momentum at the vertex.
void increaseRCyl (double delta)
 Just an internal trick.
void init ()
 Initialize internal switches and quantities.
bool inside () const
 Is the vertex inside the cylinder ? (stricly inside : true)
bool inside (double rPos2) const
bool onBarrel () const
 Is the vertex already on the cylinder barrel ?
bool onBarrel (double rPos2) const
bool onEndcap () const
 Is the vertex already on the cylinder endcap ?
bool onEndcap (double rPos2) const
bool onFiducial () const
 Is the vertex on some material ?
bool onSurface () const
 Is the vertex already on the cylinder surface ?
bool onSurface (double rPos2) const
bool propagate ()
BaseParticlePropagator propagated () const
bool propagateToBeamCylinder (const XYZTLorentzVector &v, double radius=0.)
bool propagateToClosestApproach (double x0=0., double y0=0, bool first=true)
bool propagateToEcal (bool first=true)
bool propagateToEcalEntrance (bool first=true)
bool propagateToHcalEntrance (bool first=true)
bool propagateToHcalExit (bool first=true)
bool propagateToHOLayer (bool first=true)
bool propagateToNominalVertex (const XYZTLorentzVector &hit2=XYZTLorentzVector(0., 0., 0., 0.))
bool propagateToPreshowerLayer1 (bool first=true)
bool propagateToPreshowerLayer2 (bool first=true)
bool propagateToVFcalEntrance (bool first=true)
void resetDebug ()
void setDebug ()
 Set the debug leve;.
void setMagneticField (double b)
 Set the magnetic field.
void setPropagationConditions (double r, double z, bool firstLoop=true)
 Set the propagation characteristics (rCyl, zCyl and first loop only)
void setProperDecayTime (double t)
 Set the proper decay time.
double xyImpactParameter (double x0=0., double y0=0.) const
 Transverse impact parameter.
double zImpactParameter (double x0=0, double y0=0.) const
 Longitudinal impact parameter.

Protected Member Functions

double c_light () const
 The speed of light in mm/ns (!) without clhep (yeaaahhh!)

Protected Attributes

bool fiducial
 The particle traverses some real material.
int success
 0:propagation still be done, 1:reached 'barrel', 2:reached 'endcaps'

Private Attributes

double bField
 Magnetic field in the cylinder, oriented along the Z axis.
bool debug
 The debug level.
bool decayed
 The particle decayed while propagated !
bool firstLoop
 Do only the first half-loop.
int propDir
 The propagation direction.
double properDecayTime
 The proper decay time of the particle.
double properTime
 The proper time of the particle.
double rCyl
 Simulated particle that is to be resp has been propagated.
double rCyl2
double zCyl
 Half-height of the cylinder (centred at 0,0,0) to which propagation is done.

Detailed Description

This class is aimed at propagating charged and neutral particles (yet under the form of a RawParticle) from a given vertex to a cylinder, defined by a radius rCyl and a length 2*zCyl, centered in (0,0,0) and whose axis is parallel to the B field (B is oriented along z, by definition of the z axis).

The main method

bool propagate()

returns true if an intersection between the propagated RawParticle and the cylinder is found. The location of the intersection is given by the value of success:

* success = 2 : an intersection is found forward in the cylinder endcaps. The RawParticle vertex and momentum are overwritten by the values at this intersection.

* success = 1 : an intersection is found forward in the cylinder barrel. The RawParticle vertex and momentum are overwritten by the values at this intersection.

* success =-2 : an intersection is found backward in the cylinder endcaps. The RawParticle vertex and momentum are NOT overwritten by the values at this intersection.

* success =-1 : an intersection is found backward in the cylinder barrel. The RawParticle vertex and momentum are NOT overwritten by the values at this intersection.

* success = 0 : No intersection is found after half a loop (only possible if firstLoop=true). The vertex and momentum are overwritten by the values after this half loop.

The method

propagated()

returns a new RawParticle with the propagated coordinates, if overwriting is not considered an advantage by the user.

Particles can be propagated backward with the method

backPropagate()

Member functions

o propagateToPreshowerLayer1(), o propagateToPreshowerLayer2(), o propagateToEcalEntrance(), o propagateToHcalEntrance(), o propagateToHcalExit(), o propagateToClosestApproach(),

only need a momentum, a vertex and an electric charge to operate. Radii, half-lengths and default B field (4T) are set therein by default.

As of today, no average loss of energy (dE/dx, Brems) is considered in the propagation. No uncertainty (multiple scattering, dE/dx, Brems) is yet implemented.

Author:
Patrick Janot $Date : 19-Aug-2002, with subsequent modification for FAMOS
Version:
15-Dec-2003

Definition at line 82 of file BaseParticlePropagator.h.


Constructor & Destructor Documentation

BaseParticlePropagator::BaseParticlePropagator ( )

Default c'tor.

Definition at line 4 of file BaseParticlePropagator.cc.

                                               :
  RawParticle(), rCyl(0.), rCyl2(0.), zCyl(0.), bField(0), properDecayTime(1E99)
{;}
BaseParticlePropagator::BaseParticlePropagator ( const RawParticle myPart,
double  r,
double  z,
double  B 
)

Constructors taking as arguments a RawParticle, as well as the radius, half-height and magnetic field defining the cylinder for which propagation is to be performed, and optionally, the proper decay time

Definition at line 15 of file BaseParticlePropagator.cc.

References init().

                                                                 :
  RawParticle(myPart), rCyl(R), rCyl2(R*R), zCyl(Z), bField(B), properDecayTime(1E99) 
{
  init();
}
BaseParticlePropagator::BaseParticlePropagator ( const RawParticle myPart,
double  r,
double  z,
double  B,
double  t 
)

Definition at line 8 of file BaseParticlePropagator.cc.

References init().

                                                                            :
  RawParticle(myPart), rCyl(R), rCyl2(R*R), zCyl(Z), bField(B), properDecayTime(t) 
{
  init();
}

Member Function Documentation

bool BaseParticlePropagator::backPropagate ( )

Update the current instance, after the back-propagation of the particle to the surface of the cylinder

Definition at line 320 of file BaseParticlePropagator.cc.

References RawParticle::charge(), run_regression::done, propagate(), propDir, and RawParticle::setCharge().

Referenced by propagated(), and propagateToClosestApproach().

                                      {

  // Backpropagate
  SetXYZT(-Px(),-Py(),-Pz(),E());
  setCharge(-charge());
  propDir = -1;
  bool done = propagate();
  SetXYZT(-Px(),-Py(),-Pz(),E());
  setCharge(-charge());
  propDir = +1;

  return done;
}
double BaseParticlePropagator::c_light ( ) const [inline, protected]

The speed of light in mm/ns (!) without clhep (yeaaahhh!)

Definition at line 153 of file BaseParticlePropagator.h.

Referenced by helixRadius(), and propagateToBeamCylinder().

{ return 299.792458; }
double BaseParticlePropagator::getMagneticField ( ) const [inline]

Get the magnetic field.

Definition at line 303 of file BaseParticlePropagator.h.

References bField.

Referenced by TrajectoryManager::createPSimHits(), and ConvBremSeedProducer::produce().

{  return bField; }
int BaseParticlePropagator::getSuccess ( ) const [inline]
bool BaseParticlePropagator::hasDecayed ( ) const [inline]

Has the particle decayed while propagated ?

Definition at line 294 of file BaseParticlePropagator.h.

References decayed.

Referenced by ParticlePropagator::propagateToBoundSurface(), and TrajectoryManager::propagateToCalorimeters().

{ return decayed; }
double BaseParticlePropagator::helixCentreDistToAxis ( ) const [inline]

The distance between the cylinder and the helix axes.

Definition at line 229 of file BaseParticlePropagator.h.

References helixCentreX(), helixCentreY(), and mathSSE::sqrt().

Referenced by propagate(), propagateToBeamCylinder(), propagateToClosestApproach(), and xyImpactParameter().

                                              { 
    // The distance between the cylinder and the helix axes
    double xC = helixCentreX();
    double yC = helixCentreY();
    return std::sqrt( xC*xC + yC*yC );
  }
double BaseParticlePropagator::helixCentreDistToAxis ( double  xC,
double  yC 
) const [inline]

Definition at line 236 of file BaseParticlePropagator.h.

References mathSSE::sqrt().

                                                                  { 
    // Faster version of helixCentreDistToAxis
    return std::sqrt( xC*xC + yC*yC );
  }
double BaseParticlePropagator::helixCentrePhi ( double  xC,
double  yC 
) const [inline]

Definition at line 249 of file BaseParticlePropagator.h.

                                                           { 
    // Faster version of helixCentrePhi() 
    return xC == 0.0 && yC == 0.0 ? 0.0 : std::atan2(yC,xC);
  }
double BaseParticlePropagator::helixCentrePhi ( ) const [inline]

The azimuth if the vector joining the cylinder and the helix axes.

Definition at line 242 of file BaseParticlePropagator.h.

References helixCentreX(), and helixCentreY().

Referenced by propagate().

                                       { 
    // The azimuth if the vector joining the cylinder and the helix axes
    double xC = helixCentreX();
    double yC = helixCentreY();
    return xC == 0.0 && yC == 0.0 ? 0.0 : std::atan2(yC,xC);
  }
double BaseParticlePropagator::helixCentreX ( double  radius,
double  phi 
) const [inline]

Definition at line 212 of file BaseParticlePropagator.h.

References funct::sin(), and RawParticle::X().

                                                              { 
    // Fast version of helixCentreX()
    return X() - radius * std::sin (phi);
  }
double BaseParticlePropagator::helixCentreX ( ) const [inline]

The x coordinate of the helix axis.

Definition at line 207 of file BaseParticlePropagator.h.

References helixRadius(), helixStartPhi(), funct::sin(), and RawParticle::X().

Referenced by helixCentreDistToAxis(), helixCentrePhi(), propagate(), propagateToBeamCylinder(), propagateToClosestApproach(), and xyImpactParameter().

                                     { 
    // The x coordinate of the helix axis
    return X() - helixRadius() * std::sin ( helixStartPhi() );
  }
double BaseParticlePropagator::helixCentreY ( ) const [inline]

The y coordinate of the helix axis.

Definition at line 218 of file BaseParticlePropagator.h.

References funct::cos(), helixRadius(), helixStartPhi(), and RawParticle::Y().

Referenced by helixCentreDistToAxis(), helixCentrePhi(), propagate(), propagateToBeamCylinder(), propagateToClosestApproach(), and xyImpactParameter().

                                     { 
    // The y coordinate of the helix axis
    return Y() + helixRadius() * std::cos ( helixStartPhi() );
}
double BaseParticlePropagator::helixCentreY ( double  radius,
double  phi 
) const [inline]

Definition at line 223 of file BaseParticlePropagator.h.

References funct::cos(), and RawParticle::Y().

                                                              { 
    // Fast version of helixCentreX()
    return Y() + radius * std::cos (phi);
  }
double BaseParticlePropagator::helixRadius ( ) const [inline]

The helix Radius.

Definition at line 183 of file BaseParticlePropagator.h.

References bField, c_light(), RawParticle::charge(), alignCSCRings::e, and reco::tau::disc::Pt().

Referenced by helixCentreX(), helixCentreY(), propagate(), propagateToClosestApproach(), propagateToNominalVertex(), and xyImpactParameter().

                                    { 
    // The helix Radius
    //
    // The helix' Radius sign accounts for the orientation of the magnetic field 
    // (+ = along z axis) and the sign of the electric charge of the particle. 
    // It signs the rotation of the (charged) particle around the z axis: 
    // Positive means anti-clockwise, negative means clockwise rotation.
    //
    // The radius is returned in cm to match the units in RawParticle.
    return charge() == 0 ? 0.0 : - Pt() / ( c_light() * 1e-5 * bField * charge() );
  }
double BaseParticlePropagator::helixRadius ( double  pT) const [inline]

Definition at line 195 of file BaseParticlePropagator.h.

References bField, c_light(), RawParticle::charge(), and alignCSCRings::e.

                                             { 
    // a faster version of helixRadius, once Perp() has been computed
    return charge() == 0 ? 0.0 : - pT / ( c_light() * 1e-5 * bField * charge() );
  }
double BaseParticlePropagator::helixStartPhi ( ) const [inline]

The azimuth of the momentum at the vertex.

Definition at line 201 of file BaseParticlePropagator.h.

Referenced by helixCentreX(), helixCentreY(), propagate(), propagateToClosestApproach(), and xyImpactParameter().

                                      { 
    // The azimuth of the momentum at the vertex
    return Px() == 0.0 && Py() == 0.0 ? 0.0 : std::atan2(Py(),Px());
  }
void BaseParticlePropagator::increaseRCyl ( double  delta) [inline]

Just an internal trick.

Definition at line 171 of file BaseParticlePropagator.h.

References delta, rCyl, and rCyl2.

void BaseParticlePropagator::init ( void  )

Initialize internal switches and quantities.

Reimplemented from RawParticle.

Definition at line 23 of file BaseParticlePropagator.cc.

References debug, decayed, fiducial, firstLoop, propDir, properTime, and success.

Referenced by BaseParticlePropagator().

                             {
  
  // The status of the propagation
  success = 0;
  // Propagate only for the first half-loop
  firstLoop = true;
  //
  fiducial = true;
  // The particle has not yet decayed
  decayed = false;
  // The proper time is set to zero
  properTime = 0.;
  // The propagation direction is along the momentum
  propDir = 1;
  //
  debug = false;

}
bool BaseParticlePropagator::inside ( ) const [inline]

Is the vertex inside the cylinder ? (stricly inside : true)

Definition at line 255 of file BaseParticlePropagator.h.

References RawParticle::R2(), rCyl, rCyl2, RawParticle::Z(), and zCyl.

Referenced by propagate().

                             {
    return (R2()<rCyl2-0.00001*rCyl && fabs(Z())<zCyl-0.00001);}
bool BaseParticlePropagator::inside ( double  rPos2) const [inline]

Definition at line 258 of file BaseParticlePropagator.h.

References rCyl, rCyl2, RawParticle::Z(), and zCyl.

                                         {
    return (rPos2<rCyl2-0.00001*rCyl && fabs(Z())<zCyl-0.00001);}
bool BaseParticlePropagator::onBarrel ( ) const [inline]

Is the vertex already on the cylinder barrel ?

Definition at line 272 of file BaseParticlePropagator.h.

References RawParticle::R2(), rCyl, rCyl2, RawParticle::Z(), and zCyl.

Referenced by onSurface(), and propagate().

                               {
    double rPos2 = R2();
    return ( fabs(rPos2-rCyl2) < 0.00001*rCyl && fabs(Z()) <= zCyl );
  }
bool BaseParticlePropagator::onBarrel ( double  rPos2) const [inline]

Definition at line 277 of file BaseParticlePropagator.h.

References rCyl, rCyl2, RawParticle::Z(), and zCyl.

                                           {
    return ( fabs(rPos2-rCyl2) < 0.00001*rCyl && fabs(Z()) <= zCyl );
  }
bool BaseParticlePropagator::onEndcap ( double  rPos2) const [inline]

Definition at line 286 of file BaseParticlePropagator.h.

References rCyl2, RawParticle::Z(), and zCyl.

                                           {
    return ( fabs(fabs(Z())-zCyl) < 0.00001 && rPos2 <= rCyl2 ); 
  }
bool BaseParticlePropagator::onEndcap ( ) const [inline]

Is the vertex already on the cylinder endcap ?

Definition at line 282 of file BaseParticlePropagator.h.

References RawParticle::R2(), rCyl2, RawParticle::Z(), and zCyl.

Referenced by onSurface(), and propagate().

                               {
    return ( fabs(fabs(Z())-zCyl) < 0.00001 && R2() <= rCyl2 ); 
  }
bool BaseParticlePropagator::onFiducial ( ) const [inline]

Is the vertex on some material ?

Definition at line 291 of file BaseParticlePropagator.h.

References fiducial.

Referenced by TrajectoryManager::propagateToLayer().

{ return fiducial; }
bool BaseParticlePropagator::onSurface ( double  rPos2) const [inline]

Definition at line 267 of file BaseParticlePropagator.h.

References onBarrel(), and onEndcap().

                                            {
    return ( onBarrel(rPos2) || onEndcap(rPos2) ); 
  }
bool BaseParticlePropagator::onSurface ( ) const [inline]

Is the vertex already on the cylinder surface ?

Definition at line 263 of file BaseParticlePropagator.h.

References onBarrel(), and onEndcap().

Referenced by propagate().

                                {
    return ( onBarrel() || onEndcap() ); 
  }
bool BaseParticlePropagator::propagate ( )

Update the current instance, after the propagation of the particle to the surface of the cylinder

Definition at line 43 of file BaseParticlePropagator.cc.

References bField, RawParticle::charge(), funct::cos(), decayed, delta, SiPixelRawToDigiRegional_cfi::deltaPhi, firstLoop, helixCentreDistToAxis(), helixCentrePhi(), helixCentreX(), helixCentreY(), helixRadius(), helixStartPhi(), inside(), M_PI, RawParticle::mass(), min, onBarrel(), onEndcap(), onSurface(), propDir, properDecayTime, properTime, reco::tau::disc::Pt(), RawParticle::R2(), CosmicsPD_Skims::radius, rCyl, rCyl2, RawParticle::setVertex(), funct::sin(), mathSSE::sqrt(), success, RawParticle::T(), RawParticle::X(), RawParticle::Y(), RawParticle::Z(), and zCyl.

Referenced by PFTrackTransformer::addPointsAndBrems(), backPropagate(), ConvBremSeedProducer::produce(), propagated(), ParticlePropagator::propagateToBoundSurface(), propagateToEcal(), propagateToEcalEntrance(), propagateToHcalEntrance(), propagateToHcalExit(), propagateToHOLayer(), FastPixelHitMatcher::propagateToLayer(), propagateToPreshowerLayer1(), propagateToPreshowerLayer2(), and propagateToVFcalEntrance().

                                  { 


  //
  // Check that the particle is not already on the cylinder surface
  //
  double rPos2 = R2();

  if ( onBarrel(rPos2) ) { 
    success = 1;
    return true;
  }
  //
  if ( onEndcap(rPos2) ) { 
    success = 2;
    return true;
  }
  //
  // Treat neutral particles (or no magnetic field) first 
  //
  if ( fabs(charge()) < 1E-12 || bField < 1E-12 ) {

    //
    // First check that the particle crosses the cylinder
    //
    double pT2 = Perp2();
    //    double pT2 = pT*pT;
    //    double b2 = rCyl * pT;
    double b2 = rCyl2 * pT2;
    double ac = fabs ( X()*Py() - Y()*Px() );
    double ac2 = ac*ac;
    //
    // The particle never crosses (or never crossed) the cylinder
    //
    //    if ( ac > b2 ) return false;
    if ( ac2 > b2 ) return false;

    //    double delta  = std::sqrt(b2*b2 - ac*ac);
    double delta  = std::sqrt(b2 - ac2);
    double tplus  = -( X()*Px()+Y()*Py() ) + delta;
    double tminus = -( X()*Px()+Y()*Py() ) - delta;
    //
    // Find the first (time-wise) intersection point with the cylinder
    //

    double solution = tminus < 0 ? tplus/pT2 : tminus/pT2;
    if ( solution < 0. ) return false;
    //
    // Check that the particle does (did) not exit from the endcaps first.
    //
    double zProp = Z() + Pz() * solution;
    if ( fabs(zProp) > zCyl ) {
      tplus  = ( zCyl - Z() ) / Pz();
      tminus = (-zCyl - Z() ) / Pz();
      solution = tminus < 0 ? tplus : tminus;
      if ( solution < 0. ) return false;
      zProp = Z() + Pz() * solution;
      success = 2;
    }
    else {
      success = 1;
    }

    //
    // Check the decay time
    //
    double delTime = propDir * mass() * solution;
    double factor = 1.;
    properTime += delTime;
    if ( properTime > properDecayTime ) {
      factor = 1.-(properTime-properDecayTime)/delTime;
      properTime = properDecayTime;
      decayed = true;
    }

    //
    // Compute the coordinates of the RawParticle after propagation
    //
    double xProp = X() + Px() * solution * factor;
    double yProp = Y() + Py() * solution * factor;
           zProp = Z() + Pz() * solution * factor;
    double tProp = T() + E()  * solution * factor;

    //
    // Last check : Although propagated to the endcaps, R could still be
    // larger than rCyl because the cylinder was too short...
    //
    if ( success == 2 && xProp*xProp+yProp*yProp > rCyl2 ) { 
      success = -1;
      return true;
    }

    //
    // ... and update the particle with its propagated coordinates
    //
    setVertex( XYZTLorentzVector(xProp,yProp,zProp,tProp) );
    
    return true;
  }
  //
  // Treat charged particles with magnetic field next.
  //
  else {
    //
    // First check that the particle can cross the cylinder
    //
    double pT = Pt();
    double radius = helixRadius(pT);
    double phi0 = helixStartPhi();
    double xC = helixCentreX(radius,phi0);
    double yC = helixCentreY(radius,phi0);
    double dist = helixCentreDistToAxis(xC,yC);
    //
    // The helix either is outside or includes the cylinder -> no intersection
    //
    if ( fabs ( fabs(radius) - dist ) > rCyl ) return false;
    //
    // The particle is already away from the endcaps, and will never come back
    // Could be back-propagated, so warn the user that it is so.
    // 
    if ( Z() * Pz() > zCyl * fabs(Pz()) ) { 
      success = -2;
      return true;
    }

    double pZ = Pz();
    double phiProp, zProp;
    //
    // Does the helix cross the cylinder barrel ? If not, do the first half-loop
    //
    double rProp = std::min(fabs(radius)+dist-0.000001, rCyl);

    // Check for rounding errors in the ArcSin.
    double sinPhiProp = 
      (rProp*rProp-radius*radius-dist*dist)/( 2.*dist*radius);
    
    //
    double deltaPhi = 1E99;

    // Taylor development up to third order for large momenta 
    if ( 1.-fabs(sinPhiProp) < 1E-9 ) { 

      double cphi0 = std::cos(phi0);
      double sphi0 = std::sin(phi0);
      double r0 = (X()*cphi0 + Y()*sphi0)/radius;
      double q0 = (X()*sphi0 - Y()*cphi0)/radius;
      double rcyl2 = (rCyl2 - X()*X() - Y()*Y())/(radius*radius);
      double delta = r0*r0 + rcyl2*(1.-q0);

      // This is a solution of a second order equation, assuming phi = phi0 + epsilon
      // and epsilon is small. 
      deltaPhi = radius > 0 ? 
        ( -r0 + std::sqrt(delta ) ) / (1.-q0) :   
        ( -r0 - std::sqrt(delta ) ) / (1.-q0); 
      
    }

    // Use complete calculation otherwise, or if the delta phi is large anyway.
    if ( fabs(deltaPhi) > 1E-3 ) { 

    //    phiProp =  fabs(sinPhiProp) < 0.99999999  ? 
    //      std::asin(sinPhiProp) : M_PI/2. * sinPhiProp;
      phiProp =  std::asin(sinPhiProp);

      //
      // Compute phi after propagation (two solutions, but the asin definition
      // (between -pi/2 and +pi/2) takes care of the wrong one.
      //
      phiProp = helixCentrePhi(xC,yC) + 
        ( inside(rPos2) || onSurface(rPos2) ? phiProp : M_PI-phiProp ); 
      
      //
      // Solve the obvious two-pi ambiguities: more than one turn!
      //
      if ( fabs(phiProp - phi0) > 2.*M_PI )
        phiProp += ( phiProp > phi0 ? -2.*M_PI : +2.*M_PI );
      
      //
      // Check that the phi difference has the right sign, according to Q*B
      // (Another two pi ambuiguity, slightly more subtle)
      //
      if ( (phiProp-phi0)*radius < 0.0 )
        radius > 0.0 ? phiProp += 2 * M_PI : phiProp -= 2 * M_PI;
      
    } else { 

      // Use Taylor
      phiProp = phi0 + deltaPhi;

    }

    //
    // Check that the particle does not exit from the endcaps first.
    //
    zProp = Z() + ( phiProp - phi0 ) * pZ * radius / pT ;
    if ( fabs(zProp) > zCyl ) {

      zProp = zCyl * fabs(pZ)/pZ;
      phiProp = phi0 + (zProp - Z()) / radius * pT / pZ;
      success = 2;

    } else {

      //
      // If the particle does not cross the barrel, either process the
      // first-half loop only or propagate all the way down to the endcaps
      //
      if ( rProp < rCyl ) {

        if ( firstLoop || fabs(pZ)/pT < 1E-10 ) {

          success = 0;

        } else {

          zProp = zCyl * fabs(pZ)/pZ;
          phiProp = phi0 + (zProp - Z()) / radius * pT / pZ;
          success = 2;

        }
      //
      // The particle crossed the barrel 
      // 
      } else {

        success = 1;

      }
    }
    //
    // Compute the coordinates of the RawParticle after propagation
    //
    //
    // Check the decay time
    //
    double delTime = propDir * (phiProp-phi0)*radius*mass() / pT;
    double factor = 1.;
    properTime += delTime;
    if ( properTime > properDecayTime ) {
      factor = 1.-(properTime-properDecayTime)/delTime;
      properTime = properDecayTime;
      decayed = true;
    }

    zProp = Z() + (zProp-Z())*factor;

    phiProp = phi0 + (phiProp-phi0)*factor;

    double sProp = std::sin(phiProp);
    double cProp = std::cos(phiProp);
    double xProp = xC + radius * sProp;
    double yProp = yC - radius * cProp;
    double tProp = T() + (phiProp-phi0)*radius*E()/pT;
    double pxProp = pT * cProp;
    double pyProp = pT * sProp;

    //
    // Last check : Although propagated to the endcaps, R could still be
    // larger than rCyl because the cylinder was too short...
    //
    if ( success == 2 && xProp*xProp+yProp*yProp > rCyl2 ) { 
      success = -1;
      return true;
    }
    //
    // ... and update the particle vertex and momentum
    //
    setVertex( XYZTLorentzVector(xProp,yProp,zProp,tProp) );
    SetXYZT(pxProp,pyProp,pZ,E());
    //    SetPx(pxProp);
    //    SetPy(pyProp);
    return true;
 
  }
}
BaseParticlePropagator BaseParticlePropagator::propagated ( ) const

Return a new instance, corresponding to the particle propagated to the surface of the cylinder

Reimplemented in ParticlePropagator.

Definition at line 335 of file BaseParticlePropagator.cc.

References backPropagate(), firstLoop, propagate(), and success.

Referenced by ParticlePropagator::propagated().

                                         {
  // Copy the input particle in a new instance
  BaseParticlePropagator myPropPart(*this);
  // Allow for many loops
  myPropPart.firstLoop=false;
  // Propagate the particle ! 
  myPropPart.propagate();
  // Back propagate if the forward propagation was not a success
  if (myPropPart.success < 0 )
    myPropPart.backPropagate();
  // Return the new instance
  return myPropPart;
}
bool BaseParticlePropagator::propagateToBeamCylinder ( const XYZTLorentzVector v,
double  radius = 0. 
)

Definition at line 630 of file BaseParticlePropagator.cc.

References a, b, bField, trackerHits::c, c_light(), RawParticle::charge(), funct::cos(), gather_cfg::cout, alignCSCRings::e, helixCentreDistToAxis(), helixCentreX(), helixCentreY(), i, propagateToClosestApproach(), reco::tau::disc::Pt(), RawParticle::r(), RawParticle::r2(), CosmicsPD_Skims::radius, RawParticle::setCharge(), funct::sin(), mathSSE::sqrt(), RawParticle::X(), RawParticle::Y(), and RawParticle::Z().

Referenced by TrajectorySeedProducer::compatibleWithBeamAxis().

{

  // For neutral (or BField = 0, simply check that the track passes through the cylinder
  if ( charge() == 0. || bField == 0.) 
    return fabs( Px() * Y() - Py() * X() ) / Pt() < radius; 

  // Now go to the charged particles

  // A few needed intermediate variables (to make the code understandable)
  // The inner cylinder
  double r = radius;
  double r2 = r*r;
  double r4 = r2*r2;
  // The two hits
  double dx = X()-v.X();
  double dy = Y()-v.Y();
  double dz = Z()-v.Z();
  double Sxy = X()*v.X() + Y()*v.Y();
  double Dxy = Y()*v.X() - X()*v.Y();
  double Dxy2 = Dxy*Dxy;
  double Sxy2 = Sxy*Sxy;
  double SDxy = dx*dx + dy*dy;
  double SSDxy = std::sqrt(SDxy);
  double ATxy = std::atan2(dy,dx);
  // The coefficients of the second order equation for the trajectory radius
  double a = r2 - Dxy2/SDxy;
  double b = r * (r2 - Sxy);
  double c = r4 - 2.*Sxy*r2 + Sxy2 + Dxy2;

  // Here are the four possible solutions for
  // 1) The trajectory radius
  std::vector<double> helixRs(4,static_cast<double>(0.));
  helixRs[0] = (b - std::sqrt(b*b - a*c))/(2.*a); 
  helixRs[1] = (b + std::sqrt(b*b - a*c))/(2.*a); 
  helixRs[2] = -helixRs[0]; 
  helixRs[3] = -helixRs[1]; 
  // 2) The azimuthal direction at the second point
  std::vector<double> helixPhis(4,static_cast<double>(0.));
  helixPhis[0] = std::asin ( SSDxy/(2.*helixRs[0]) );
  helixPhis[1] = std::asin ( SSDxy/(2.*helixRs[1]) );
  helixPhis[2] = -helixPhis[0];
  helixPhis[3] = -helixPhis[1];
  // Only two solutions are valid though
  double solution1=0.;
  double solution2=0.;
  double phi1=0.;
  double phi2=0.;
  // Loop over the four possibilities
  for ( unsigned int i=0; i<4; ++i ) {
    helixPhis[i] = ATxy + helixPhis[i];
    // The centre of the helix
    double xC = helixCentreX(helixRs[i],helixPhis[i]);
    double yC = helixCentreY(helixRs[i],helixPhis[i]);
    // The distance of that centre to the origin
    double dist = helixCentreDistToAxis(xC, yC);
    /*
    std::cout << "Solution "<< i << " = " << helixRs[i] << " accepted ? " 
              << fabs(fabs(helixRs[i]) - dist ) << " - " << radius << " = " 
              << fabs(fabs(helixRs[i]) - dist ) - fabs(radius) << " " 
              << ( fabs( fabs(fabs(helixRs[i]) - dist) -fabs(radius) ) < 1e-6)  << std::endl;
    */
    // Check that the propagation will lead to a trajectroy tangent to the inner cylinder
    if ( fabs( fabs(fabs(helixRs[i]) - dist) -fabs(radius) ) < 1e-6 ) { 
      // Fill first solution
      if ( solution1 == 0. ) { 
        solution1 = helixRs[i];
        phi1 = helixPhis[i];
      // Fill second solution (ordered)
      } else if ( solution2 == 0. ) {
        if ( helixRs[i] < solution1 ) {
          solution2 = solution1;
          solution1 = helixRs[i];
          phi2 = phi1;
          phi1 = helixPhis[i];
        } else {
          solution2 = helixRs[i];
          phi2 = helixPhis[i];
        }
      // Must not happen! 
      } else { 
        std::cout << "warning !!! More than two solutions for this track !!! " << std::endl;
      }
    }
  }

  // Find the largest possible pT compatible with coming from within the inne cylinder
  double pT = 0.;
  double helixPhi = 0.;
  double helixR = 0.;
  // This should not happen
  if ( solution1*solution2 == 0. ) { 
    std::cout << "warning !!! Less than two solution for this track! " 
              << solution1 << " " << solution2 << std::endl;
    return false;
  // If the two solutions have opposite sign, it means that pT = infinity is a possibility.
  } else if ( solution1*solution2 < 0. ) { 
    pT = 1000.;
    double norm = pT/SSDxy;
    setCharge(+1.);
    SetXYZT(dx*norm,dy*norm,dz*norm,0.);
    SetE(std::sqrt(Vect().Mag2()));
  // Otherwise take the solution that gives the largest transverse momentum 
  } else { 
    if (solution1<0.) { 
      helixR   = solution1;
      helixPhi = phi1;
      setCharge(+1.);
    } else {
      helixR = solution2;
      helixPhi = phi2;
      setCharge(-1.);
    }
    pT = fabs(helixR) * 1e-5 * c_light() *bField;
    double norm = pT/SSDxy;
    SetXYZT(pT*std::cos(helixPhi),pT*std::sin(helixPhi),dz*norm,0.);
    SetE(std::sqrt(Vect().Mag2()));      
  }
    
  // Propagate to closest approach to get the Z value (a bit of an overkill)
  return propagateToClosestApproach();
  
}
bool BaseParticlePropagator::propagateToClosestApproach ( double  x0 = 0.,
double  y0 = 0,
bool  first = true 
)

Update the particle after propagation to the closest approach from Z axis, to the preshower layer 1 & 2, to the ECAL entrance, to the HCAL entrance, the HCAL 2nd and 3rd layer (not coded yet), the VFCAL entrance, or any BoundSurface(disk or cylinder)

Reimplemented in ParticlePropagator.

Definition at line 358 of file BaseParticlePropagator.cc.

References backPropagate(), bField, RawParticle::charge(), run_regression::done, helixCentreDistToAxis(), helixCentreX(), helixCentreY(), helixRadius(), helixStartPhi(), RawParticle::momentum(), reco::tau::disc::Pt(), CosmicsPD_Skims::radius, setPropagationConditions(), RawParticle::setVertex(), mathSSE::sqrt(), RawParticle::vertex(), RawParticle::X(), RawParticle::Y(), and RawParticle::z().

Referenced by propagateToBeamCylinder(), and propagateToNominalVertex().

                                                                                   {

  // Pre-computed quantities
  double pT = Pt();
  double radius = helixRadius(pT);
  double phi0 = helixStartPhi();

  // The Helix centre coordinates are computed wrt to the z axis
  // Actually the z axis might be centred on 0,0: it's the beam spot position (x0,y0)!
  double xC = helixCentreX(radius,phi0);
  double yC = helixCentreY(radius,phi0);
  double distz = helixCentreDistToAxis(xC-x0,yC-y0);
  double dist0 = helixCentreDistToAxis(xC,yC);

  //
  // Propagation to point of clostest approach to z axis
  //
  double rz,r0,z;
  if ( charge() != 0.0 && bField != 0.0 ) {
    rz = fabs ( fabs(radius) - distz ) + std::sqrt(x0*x0+y0*y0) + 0.0000001;
    r0 = fabs ( fabs(radius) - dist0 ) + 0.0000001;
  } else {
    rz = fabs( Px() * (Y()-y0) - Py() * (X()-x0) ) / Pt(); 
    r0 = fabs( Px() *  Y()     - Py() *  X() ) / Pt(); 
  }

  z = 999999.;

  // Propagate to the first interesection point 
  // with cylinder of radius sqrt(x0**2+y0**2)
  setPropagationConditions(rz , z, first);
  bool done = backPropagate();

  // Unsuccessful propagation - should not happen!
  if ( !done ) return done; 

  // The z axis is (0,0) - no need to go further
  if ( fabs(rz-r0) < 1E-10 ) return done;
  double dist1 = (X()-x0)*(X()-x0) + (Y()-y0)*(Y()-y0);

  // We are already at closest approach - no need to go further
  if ( dist1 < 1E-10 ) return done;

  // Keep for later if it happens to be the right solution
  XYZTLorentzVector vertex1 = vertex();
  XYZTLorentzVector momentum1 = momentum();
  
  // Propagate to the distance of closest approach to (0,0)
  setPropagationConditions(r0 , z, first);
  done = backPropagate();
  if ( !done ) return done; 

  // Propagate to the first interesection point 
  // with cylinder of radius sqrt(x0**2+y0**2)
  setPropagationConditions(rz , z, first);
  done = backPropagate();
  if ( !done ) return done; 
  double dist2 = (X()-x0)*(X()-x0) + (Y()-y0)*(Y()-y0);

  // Keep the good solution.
  if ( dist2 > dist1 ) { 
    setVertex(vertex1);
    SetXYZT(momentum1.X(),momentum1.Y(),momentum1.Z(),momentum1.E());
    dist2 = dist1;
  }

  // Done
  return done;

}
bool BaseParticlePropagator::propagateToEcal ( bool  first = true)

Definition at line 430 of file BaseParticlePropagator.cc.

References propagate(), and setPropagationConditions().

                                                  {
  //
  // Propagation to Ecal (including preshower) after the
  // last Tracker layer
  // TODO: include proper geometry
  // Geometry taken from CMS ECAL TDR
  //
  // First propagate to global barrel / endcap cylinder 
  //  setPropagationConditions(1290. , 3045 , first);
  //  New position of the preshower as of CMSSW_1_7_X
  setPropagationConditions(129.0 , 303.353 , first);
  return propagate();

}
bool BaseParticlePropagator::propagateToEcalEntrance ( bool  first = true)

Definition at line 487 of file BaseParticlePropagator.cc.

References RawParticle::cos2ThetaV(), run_regression::done, propagate(), setPropagationConditions(), and success.

Referenced by PFTrackTransformer::addPointsAndBrems(), FBaseSimEvent::fill(), ConvBremSeedProducer::GoodCluster(), GoodSeedProducer::produce(), and TrajectoryManager::propagateToCalorimeters().

                                                          {
  //
  // Propagation to ECAL entrance
  // TODO: include proper geometry
  // Geometry taken from CMS ECAL TDR
  //
  // First propagate to global barrel / endcap cylinder 
  setPropagationConditions(129.0 , 320.9,first);
  bool done = propagate();

  // Go to endcap cylinder in the "barrel cut corner" 
  // eta = 1.479 -> cos^2(theta) = 0.81230
  //  if ( done && eta > 1.479 && success == 1 ) {
  if ( done && cos2ThetaV() > 0.81230 && success == 1 ) {
    setPropagationConditions(152.6 , 320.9, first);
    done = propagate();
  }

  // We are not in the ECAL acceptance
  // eta = 3.0 -> cos^2(theta) = 0.99013
  if ( cos2ThetaV() > 0.99014 ) success = 0;

  return done;
}
bool BaseParticlePropagator::propagateToHcalEntrance ( bool  first = true)

Definition at line 513 of file BaseParticlePropagator.cc.

References RawParticle::cos2ThetaV(), run_regression::done, propagate(), propDir, setPropagationConditions(), and success.

Referenced by PFTrackTransformer::addPointsAndBrems(), FBaseSimEvent::fill(), and TrajectoryManager::propagateToCalorimeters().

                                                          {
  //
  // Propagation to HCAL entrance
  // TODO: include proper geometry
  // Geometry taken from CMSSW_3_1_X xml (Sunanda)
  //

  // First propagate to global barrel / endcap cylinder 
  setPropagationConditions(177.5 , 335.0, first);
  propDir = 0;
  bool done = propagate();
  propDir = 1;

  // If went through the bottom of HB cylinder -> re-propagate to HE surface
  if (done && success == 2) {
    setPropagationConditions(300.0, 400.458, first);
    propDir = 0;
    done = propagate();
    propDir = 1;
  }


  // out of the HB/HE acceptance
  // eta = 3.0 -> cos^2(theta) = 0.99014
  if ( done && cos2ThetaV() > 0.99014 ) success = 0;

  return done;
}
bool BaseParticlePropagator::propagateToHcalExit ( bool  first = true)

Definition at line 566 of file BaseParticlePropagator.cc.

References run_regression::done, propagate(), propDir, and setPropagationConditions().

Referenced by PFTrackTransformer::addPointsAndBrems(), and FBaseSimEvent::fill().

                                                      {
  //
  // Propagation to HCAL exit
  // TODO: include proper geometry
  // Geometry taken from CMSSW_3_1_X xml (Sunanda)
  //

  // Approximate it to a single cylinder as it is not that crucial.
  setPropagationConditions(263.9 , 554.1, first);
  //  this->rawPart().setCharge(0.0); ?? Shower Propagation ??
  propDir = 0;
  bool done = propagate();
  propDir = 1;

  return done;
}
bool BaseParticlePropagator::propagateToHOLayer ( bool  first = true)

Definition at line 584 of file BaseParticlePropagator.cc.

References abs, run_regression::done, propagate(), propDir, setPropagationConditions(), success, and RawParticle::Z().

Referenced by PFTrackTransformer::addPointsAndBrems(), and FBaseSimEvent::fill().

                                                     {
  //
  // Propagation to Layer0 of HO (Ring-0)
  // TODO: include proper geometry
  // Geometry taken from CMSSW_3_1_X xml (Sunanda)
  //

  // Approximate it to a single cylinder as it is not that crucial.
  setPropagationConditions(387.6, 1000.0, first); //Dia is the middle of HO \sqrt{384.8**2+46.2**2}
  //  setPropagationConditions(410.2, 1000.0, first); //sqrt{406.6**2+54.2**2} //for outer layer
  //  this->rawPart().setCharge(0.0); ?? Shower Propagation ??
  propDir = 0;
  bool done = propagate();
  propDir = 1;
  
  if ( done && abs(Z()) > 700.25) success = 0;
  
  return done;
}
bool BaseParticlePropagator::propagateToNominalVertex ( const XYZTLorentzVector hit2 = XYZTLorentzVector(0.,0.,0.,0.))

Reimplemented in ParticlePropagator.

Definition at line 606 of file BaseParticlePropagator.cc.

References bField, RawParticle::charge(), funct::cos(), helixRadius(), phi, propagateToClosestApproach(), funct::sin(), mathSSE::sqrt(), RawParticle::X(), and RawParticle::Y().

{


  // Not implemented for neutrals (used for electrons only)
  if ( charge() == 0. || bField == 0.) return false;

  // Define the proper pT direction to meet the point (vx,vy) in (x,y)
  double dx = X()-v.X();
  double dy = Y()-v.Y();
  double phi = std::atan2(dy,dx) + std::asin ( std::sqrt(dx*dx+dy*dy)/(2.*helixRadius()) );

  // The absolute pT (kept to the original value)
  double pT = pt();

  // Set the new pT
  SetPx(pT*std::cos(phi));
  SetPy(pT*std::sin(phi));

  return propagateToClosestApproach(v.X(),v.Y());
  
}
bool BaseParticlePropagator::propagateToPreshowerLayer1 ( bool  first = true)

Definition at line 446 of file BaseParticlePropagator.cc.

References run_regression::done, propagate(), RawParticle::R2(), setPropagationConditions(), and success.

Referenced by PFTrackTransformer::addPointsAndBrems(), FBaseSimEvent::fill(), TrajectoryManager::propagateToCalorimeters(), and GoodSeedProducer::PSforTMVA().

                                                             {
  //
  // Propagation to Preshower Layer 1
  // TODO: include proper geometry
  // Geometry taken from CMS ECAL TDR
  //
  // First propagate to global barrel / endcap cylinder 
  //  setPropagationConditions(1290., 3045 , first);
  //  New position of the preshower as of CMSSW_1_7_X
  setPropagationConditions(129.0, 303.353 , first);
  bool done = propagate();

  // Check that were are on the Layer 1 
  if ( done && (R2() > 125.0*125.0 || R2() < 45.0*45.0) ) 
    success = 0;
  
  return done;
}
bool BaseParticlePropagator::propagateToPreshowerLayer2 ( bool  first = true)

Definition at line 466 of file BaseParticlePropagator.cc.

References run_regression::done, propagate(), RawParticle::R2(), setPropagationConditions(), and success.

Referenced by PFTrackTransformer::addPointsAndBrems(), FBaseSimEvent::fill(), and TrajectoryManager::propagateToCalorimeters().

                                                             {
  //
  // Propagation to Preshower Layer 2
  // TODO: include proper geometry
  // Geometry taken from CMS ECAL TDR
  //
  // First propagate to global barrel / endcap cylinder 
  //  setPropagationConditions(1290. , 3090 , first);
  //  New position of the preshower as of CMSSW_1_7_X
  setPropagationConditions(129.0 , 307.838 , first);
  bool done = propagate();

  // Check that we are on Layer 2 
  if ( done && (R2() > 125.0*125.0 || R2() < 45.0*45.0 ) )
    success = 0;

  return done;

}
bool BaseParticlePropagator::propagateToVFcalEntrance ( bool  first = true)

Definition at line 543 of file BaseParticlePropagator.cc.

References RawParticle::cos2ThetaV(), run_regression::done, propagate(), propDir, setPropagationConditions(), and success.

Referenced by FBaseSimEvent::fill(), and TrajectoryManager::propagateToCalorimeters().

                                                           {
  //
  // Propagation to VFCAL entrance
  // TODO: include proper geometry
  // Geometry taken from DAQ TDR Chapter 13

  setPropagationConditions(400.0 , 1110.0, first);
  propDir = 0;
  bool done = propagate();
  propDir = 1;

  if (!done) success = 0;

  // We are not in the VFCAL acceptance
  // eta = 3.0  -> cos^2(theta) = 0.99014
  // eta = 5.2  -> cos^2(theta) = 0.9998755
  double c2teta = cos2ThetaV();
  if ( done && ( c2teta < 0.99014 || c2teta > 0.9998755 ) ) success = 0;

  return done;
}
void BaseParticlePropagator::resetDebug ( ) [inline]

Definition at line 307 of file BaseParticlePropagator.h.

References debug.

{ debug = false; }
void BaseParticlePropagator::setDebug ( ) [inline]

Set the debug leve;.

Definition at line 306 of file BaseParticlePropagator.h.

References debug.

{ debug = true; } 
void BaseParticlePropagator::setMagneticField ( double  b) [inline]
void BaseParticlePropagator::setPropagationConditions ( double  r,
double  z,
bool  firstLoop = true 
)
void BaseParticlePropagator::setProperDecayTime ( double  t) [inline]

Set the proper decay time.

Definition at line 168 of file BaseParticlePropagator.h.

References properDecayTime, and RawParticle::t().

Referenced by ParticlePropagator::initProperDecayTime(), and ParticlePropagator::ParticlePropagator().

double BaseParticlePropagator::xyImpactParameter ( double  x0 = 0.,
double  y0 = 0. 
) const

Transverse impact parameter.

Definition at line 755 of file BaseParticlePropagator.cc.

References bField, RawParticle::charge(), helixCentreDistToAxis(), helixCentreX(), helixCentreY(), helixRadius(), helixStartPhi(), reco::tau::disc::Pt(), CosmicsPD_Skims::radius, RawParticle::X(), and RawParticle::Y().

Referenced by TrajectorySeedProducer::produce().

                                                                    {

  double ip=0.;
  double pT = Pt();

  if ( charge() != 0.0 && bField != 0.0 ) {
    double radius = helixRadius(pT);
    double phi0 = helixStartPhi();
    
    // The Helix centre coordinates are computed wrt to the z axis
    double xC = helixCentreX(radius,phi0);
    double yC = helixCentreY(radius,phi0);
    double distz = helixCentreDistToAxis(xC-x0,yC-y0);
    ip = distz - fabs(radius);
  } else {
    ip = fabs( Px() * (Y()-y0) - Py() * (X()-x0) ) / pT; 
  }

  return ip;

}
double BaseParticlePropagator::zImpactParameter ( double  x0 = 0,
double  y0 = 0. 
) const [inline]

Longitudinal impact parameter.

Definition at line 177 of file BaseParticlePropagator.h.

References mathSSE::sqrt(), RawParticle::X(), RawParticle::Y(), and RawParticle::Z().

Referenced by TrajectorySeedProducer::produce().

                                                                  {
    // Longitudinal impact parameter
    return Z() - Pz() * std::sqrt( ((X()-x0)*(X()-x0) + (Y()-y0)*(Y()-y0) ) / Perp2());
  }

Member Data Documentation

Magnetic field in the cylinder, oriented along the Z axis.

Definition at line 140 of file BaseParticlePropagator.h.

Referenced by getMagneticField(), helixRadius(), propagate(), propagateToBeamCylinder(), propagateToClosestApproach(), propagateToNominalVertex(), setMagneticField(), and xyImpactParameter().

The debug level.

Definition at line 144 of file BaseParticlePropagator.h.

Referenced by init(), resetDebug(), and setDebug().

The particle decayed while propagated !

Definition at line 159 of file BaseParticlePropagator.h.

Referenced by hasDecayed(), init(), and propagate().

The particle traverses some real material.

Definition at line 150 of file BaseParticlePropagator.h.

Referenced by init(), onFiducial(), and ParticlePropagator::propagateToBoundSurface().

Do only the first half-loop.

Definition at line 157 of file BaseParticlePropagator.h.

Referenced by init(), propagate(), propagated(), ParticlePropagator::setPropagationConditions(), and setPropagationConditions().

The proper decay time of the particle.

Definition at line 142 of file BaseParticlePropagator.h.

Referenced by ParticlePropagator::initProperDecayTime(), propagate(), and setProperDecayTime().

The proper time of the particle.

Definition at line 161 of file BaseParticlePropagator.h.

Referenced by init(), and propagate().

double BaseParticlePropagator::rCyl [private]

Simulated particle that is to be resp has been propagated.

Radius of the cylinder (centred at 0,0,0) to which propagation is done

Definition at line 135 of file BaseParticlePropagator.h.

Referenced by increaseRCyl(), inside(), onBarrel(), propagate(), and setPropagationConditions().

double BaseParticlePropagator::zCyl [private]

Half-height of the cylinder (centred at 0,0,0) to which propagation is done.

Definition at line 138 of file BaseParticlePropagator.h.

Referenced by inside(), onBarrel(), onEndcap(), propagate(), and setPropagationConditions().