CMS 3D CMS Logo

SteppingHelixPropagator Class Reference

Propagator implementation using steps along a helix. More...

#include <TrackPropagation/SteppingHelixPropagator/interface/SteppingHelixPropagator.h>

Inheritance diagram for SteppingHelixPropagator:

Propagator

List of all members.

Public Types

enum  DestType {
  RADIUS_DT = 0, Z_DT, PLANE_DT, CONE_DT,
  CYLINDER_DT, PATHL_DT, POINT_PCA_DT, LINE_PCA_DT,
  UNDEFINED_DT
}
enum  Fancy {
  HEL_AS_F = 0, HEL_ALL_F, POL_1_F, POL_2_F,
  POL_M_F
}
enum  Pars { RADIUS_P = 0, Z_P = 0, PATHL_P = 0 }
typedef Hep3Vector Point
typedef
SteppingHelixStateInfo::Result 
Result
typedef SteppingHelixStateInfo StateInfo
typedef Hep3Vector Vector

Public Member Functions

void applyRadX0Correction (bool applyRadX0Correction)
 Apply radLength correction (1+0.036*ln(radX0+1)) to covariance matrix +1 is added for IR-safety Should be done with care: it's easy to make the end-point result dependent on the intermediate stop points.
virtual SteppingHelixPropagatorclone () const
virtual const MagneticFieldmagneticField () const
const SteppingHelixStateInfopropagate (const SteppingHelixStateInfo &ftsStart, const GlobalPoint &pDest1, const GlobalPoint &pDest2) const
 Propagate to PCA to a line (given by 2 points) given a starting point.
const SteppingHelixStateInfopropagate (const SteppingHelixStateInfo &ftsStart, const GlobalPoint &pDest) const
 Propagate to PCA to point given a starting point.
const SteppingHelixStateInfopropagate (const SteppingHelixStateInfo &ftsStart, const Cylinder &cDest) const
 Propagate to Cylinder given a starting point (a Cylinder is assumed to be positioned at 0,0,0).
const SteppingHelixStateInfopropagate (const SteppingHelixStateInfo &ftsStart, const Plane &pDest) const
const SteppingHelixStateInfopropagate (const SteppingHelixStateInfo &ftsStart, const Surface &sDest) const
 Propagate to Plane given a starting point.
virtual FreeTrajectoryState propagate (const FreeTrajectoryState &ftsStart, const reco::BeamSpot &beamSpot) const
 Propagate to PCA to a line determined by BeamSpot position and slope given a starting point.
virtual FreeTrajectoryState propagate (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest1, const GlobalPoint &pDest2) const
 Propagate to PCA to a line (given by 2 points) given a starting point.
virtual FreeTrajectoryState propagate (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest) const
 Propagate to PCA to point given a starting point.
virtual TrajectoryStateOnSurface propagate (const FreeTrajectoryState &ftsStart, const Cylinder &cDest) const
 Propagate to Cylinder given a starting point (a Cylinder is assumed to be positioned at 0,0,0).
virtual TrajectoryStateOnSurface propagate (const FreeTrajectoryState &ftsStart, const Plane &pDest) const
 Propagate to Plane given a starting point.
virtual std::pair
< FreeTrajectoryState, double > 
propagateWithPath (const FreeTrajectoryState &ftsStart, const reco::BeamSpot &beamSpot) const
 Propagate to PCA to a line (given by beamSpot position and slope) given a starting point.
virtual std::pair
< FreeTrajectoryState, double > 
propagateWithPath (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest1, const GlobalPoint &pDest2) const
 Propagate to PCA to a line (given by 2 points) given a starting point.
virtual std::pair
< FreeTrajectoryState, double > 
propagateWithPath (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest) const
 Propagate to PCA to point given a starting point.
virtual std::pair
< TrajectoryStateOnSurface,
double > 
propagateWithPath (const FreeTrajectoryState &ftsStart, const Cylinder &cDest) const
 Propagate to Cylinder given a starting point: return final TrajectoryState and path length from start to this point.
virtual std::pair
< TrajectoryStateOnSurface,
double > 
propagateWithPath (const FreeTrajectoryState &ftsStart, const Plane &pDest) const
 Propagate to Plane given a starting point: return final TrajectoryState and path length from start to this point.
void setDebug (bool debug)
 Switch debug printouts (to cout) .. very verbose.
void setEndcapShiftsInZPosNeg (double valPos, double valNeg)
 set shifts in Z for endcap pieces (includes EE, HE, ME, YE)
void setMaterialMode (bool noMaterial)
 Switch for material effects mode: no material effects if true.
void setNoErrorPropagation (bool noErrorPropagation)
 Force no error propagation.
void setReturnTangentPlane (bool val)
 flag to return tangent plane for non-plane input
void setSendLogWarning (bool val)
 flag to send LogWarning on failures
void setUseInTeslaFromMagField (bool val)
 force getting field value from MagneticField, not the geometric one
void setUseIsYokeFlag (bool val)
 (temporary?) flag to identify if the volume is yoke based on MagVolume internals works if useMatVolumes_ is also true
void setUseMagVolumes (bool val)
 Switch to using MagneticField Volumes .. as in VolumeBasedMagneticField.
void setUseMatVolumes (bool val)
 Switch to using Material Volumes .. internally defined for now.
void setUseTuningForL2Speed (bool val)
 will use bigger steps ~tuned for good-enough L2/Standalone reco use this in hope of a speed-up
void setVBFPointer (const VolumeBasedMagneticField *val)
 set VolumBasedField pointer allows to have geometry description in uniformField scenario only important/relevant in the barrel region
 SteppingHelixPropagator (const MagneticField *field, PropagationDirection dir=alongMomentum)
 SteppingHelixPropagator ()
 Constructors.
 ~SteppingHelixPropagator ()
 Destructor.

Protected Types

typedef
SteppingHelixStateInfo::VolumeBounds 
MatBounds

Protected Member Functions

int cIndex_ (int ind) const
 (Internals) circular index for array of transients
double getDeDx (const SteppingHelixPropagator::StateInfo &sv, double &dEdXPrime, double &radX0, MatBounds &rzLims) const
 estimate average (in fact smth. close to MPV and median) energy loss per unit path length
void getNextState (const SteppingHelixPropagator::StateInfo &svPrevious, SteppingHelixPropagator::StateInfo &svNext, double dP, const SteppingHelixPropagator::Vector &tau, const SteppingHelixPropagator::Vector &drVec, double dS, double dX0, const AlgebraicMatrix66 &dCov) const
 (Internals) compute transients for current point (increments step counter).
bool isYokeVolume (const MagVolume *vol) const
 check if it's a yoke/iron based on this MagVol internals
void loadState (SteppingHelixPropagator::StateInfo &svCurrent, const SteppingHelixPropagator::Vector &p3, const SteppingHelixPropagator::Point &r3, int charge, const AlgebraicSymMatrix66 &cov, PropagationDirection dir) const
 (Internals) compute transient values for initial point (resets step counter).
bool makeAtomStep (SteppingHelixPropagator::StateInfo &svCurrent, SteppingHelixPropagator::StateInfo &svNext, double dS, PropagationDirection dir, SteppingHelixPropagator::Fancy fancy) const
 main stepping function: compute next state vector after a step of length dS
Result propagate (SteppingHelixPropagator::DestType type, const double pars[6], double epsilon=1e-3) const
 propagate: chose stop point by type argument propagate to fixed radius [ r = sqrt(x**2+y**2) ] with precision epsilon propagate to plane by [x0,y0,z0, n_x, n_y, n_z] parameters
Result refToDest (DestType dest, const SteppingHelixPropagator::StateInfo &sv, const double pars[6], double &dist, double &tanDist, PropagationDirection &refDirection, double fastSkipDist=1e12) const
 (Internals) determine distance and direction from the current position to the plane
Result refToMagVolume (const SteppingHelixPropagator::StateInfo &sv, PropagationDirection dir, double &dist, double &tanDist, double fastSkipDist=1e12, bool expectNewMagVolume=false) const
 (Internals) determine distance and direction from the current position to the boundary of current mag volume
Result refToMatVolume (const SteppingHelixPropagator::StateInfo &sv, PropagationDirection dir, double &dist, double &tanDist, double fastSkipDist=1e12) const
void setIState (const SteppingHelixStateInfo &sStart) const
 (Internals) Init starting point
void setRep (SteppingHelixPropagator::Basis &rep, const SteppingHelixPropagator::Vector &tau) const
 Set/compute basis vectors for local coordinates at current step (called by incrementState).

Private Types

typedef std::pair
< FreeTrajectoryState, double > 
FtsPP
typedef std::pair
< TrajectoryStateOnSurface,
double > 
TsosPP

Private Attributes

bool applyRadX0Correction_
AlgebraicMatrix66 covRot_
AlgebraicMatrix66 dCTransform_
bool debug_
double defaultStep_
double ecShiftNeg_
double ecShiftPos_
const MagneticFieldfield_
StateInfo invalidState_
bool noErrorPropagation_
bool noMaterialMode_
int nPoints_
bool returnTangentPlane_
bool sendLogWarning_
StateInfo svBuf_ [MAX_POINTS+1]
const AlgebraicSymMatrix66 unit66_
bool useInTeslaFromMagField_
bool useIsYokeFlag_
bool useMagVolumes_
bool useMatVolumes_
bool useTuningForL2Speed_
const VolumeBasedMagneticFieldvbField_

Static Private Attributes

static const int MAX_POINTS = 50
static const int MAX_STEPS = 10000

Classes

struct  Basis


Detailed Description

Propagator implementation using steps along a helix.

Minimal geometry navigation. Material effects (multiple scattering and energy loss) are based on tuning to MC and (eventually) data.

Date
2008/07/31 19:27:59
Revision
1.26
Author:
Vyacheslav Krutelyov (slava77)
Minimal geometry navigation. Material effects (multiple scattering and energy loss) are based on tuning to MC and (eventually) data. Implementation file contents follow.

Date
2008/12/04 00:27:02
Revision
1.60
Author:
Vyacheslav Krutelyov (slava77)

Definition at line 44 of file SteppingHelixPropagator.h.


Member Typedef Documentation

typedef std::pair<FreeTrajectoryState, double> SteppingHelixPropagator::FtsPP [private]

Definition at line 267 of file SteppingHelixPropagator.h.

typedef SteppingHelixStateInfo::VolumeBounds SteppingHelixPropagator::MatBounds [protected]

Definition at line 200 of file SteppingHelixPropagator.h.

typedef Hep3Vector SteppingHelixPropagator::Point

Definition at line 47 of file SteppingHelixPropagator.h.

typedef SteppingHelixStateInfo::Result SteppingHelixPropagator::Result

Definition at line 50 of file SteppingHelixPropagator.h.

typedef SteppingHelixStateInfo SteppingHelixPropagator::StateInfo

Definition at line 49 of file SteppingHelixPropagator.h.

typedef std::pair<TrajectoryStateOnSurface, double> SteppingHelixPropagator::TsosPP [private]

Definition at line 266 of file SteppingHelixPropagator.h.

typedef Hep3Vector SteppingHelixPropagator::Vector

Definition at line 46 of file SteppingHelixPropagator.h.


Member Enumeration Documentation

enum SteppingHelixPropagator::DestType

Enumerator:
RADIUS_DT 
Z_DT 
PLANE_DT 
CONE_DT 
CYLINDER_DT 
PATHL_DT 
POINT_PCA_DT 
LINE_PCA_DT 
UNDEFINED_DT 

Definition at line 64 of file SteppingHelixPropagator.h.

00064                 {
00065     RADIUS_DT=0,
00066     Z_DT,
00067     PLANE_DT,
00068     CONE_DT,
00069     CYLINDER_DT,
00070     PATHL_DT,
00071     POINT_PCA_DT,
00072     LINE_PCA_DT,
00073     UNDEFINED_DT
00074   };

enum SteppingHelixPropagator::Fancy

Enumerator:
HEL_AS_F 
HEL_ALL_F 
POL_1_F 
POL_2_F 
POL_M_F 

Definition at line 76 of file SteppingHelixPropagator.h.

00076              {
00077     HEL_AS_F=0, //simple analytical helix, eloss at end of step
00078     HEL_ALL_F,  //analytical helix with linear eloss
00079     POL_1_F, //1st order approximation, straight line
00080     POL_2_F,//2nd order
00081     POL_M_F //highest available
00082   };

enum SteppingHelixPropagator::Pars

Enumerator:
RADIUS_P 
Z_P 
PATHL_P 

Definition at line 58 of file SteppingHelixPropagator.h.

00058             {
00059     RADIUS_P=0,
00060     Z_P = 0,
00061     PATHL_P = 0
00062   };


Constructor & Destructor Documentation

SteppingHelixPropagator::SteppingHelixPropagator (  ) 

Constructors.

Definition at line 41 of file SteppingHelixPropagator.cc.

References field_.

Referenced by clone().

00041                                                  :
00042   Propagator(anyDirection)
00043 {
00044   field_ = 0;
00045 }

SteppingHelixPropagator::SteppingHelixPropagator ( const MagneticField field,
PropagationDirection  dir = alongMomentum 
)

Definition at line 47 of file SteppingHelixPropagator.cc.

References applyRadX0Correction_, SteppingHelixStateInfo::cov, covRot_, dCTransform_, debug_, defaultStep_, ecShiftNeg_, ecShiftPos_, field_, SteppingHelixStateInfo::hasErrorPropagated_, i, SteppingHelixStateInfo::isComplete, SteppingHelixStateInfo::isValid_, SteppingHelixStateInfo::matDCov, MAX_POINTS, noErrorPropagation_, noMaterialMode_, returnTangentPlane_, sendLogWarning_, svBuf_, unit66_, useInTeslaFromMagField_, useIsYokeFlag_, useMagVolumes_, useMatVolumes_, useTuningForL2Speed_, and vbField_.

00048                                                                           :
00049   Propagator(dir),
00050   unit66_(AlgebraicMatrixID())
00051 {
00052   field_ = field;
00053   vbField_ = dynamic_cast<const VolumeBasedMagneticField*>(field_);
00054   covRot_ = AlgebraicMatrix66();
00055   dCTransform_ = unit66_;
00056   debug_ = false;
00057   noMaterialMode_ = false;
00058   noErrorPropagation_ = false;
00059   applyRadX0Correction_ = true;
00060   useMagVolumes_ = true;
00061   useIsYokeFlag_ = true;
00062   useMatVolumes_ = true;
00063   useInTeslaFromMagField_ = false; //overrides behavior only if true
00064   returnTangentPlane_ = true;
00065   sendLogWarning_ = false;
00066   useTuningForL2Speed_ = false;
00067   for (int i = 0; i <= MAX_POINTS; i++){
00068     svBuf_[i].cov = AlgebraicSymMatrix66();
00069     svBuf_[i].matDCov = AlgebraicSymMatrix66();
00070     svBuf_[i].isComplete = true;
00071     svBuf_[i].isValid_ = true;
00072     svBuf_[i].hasErrorPropagated_ = !noErrorPropagation_;
00073   }
00074   defaultStep_ = 5.;
00075 
00076   ecShiftPos_ = 0;
00077   ecShiftNeg_ = 0;
00078 
00079 }

SteppingHelixPropagator::~SteppingHelixPropagator (  )  [inline]

Destructor.

Definition at line 91 of file SteppingHelixPropagator.h.

00091 {}


Member Function Documentation

void SteppingHelixPropagator::applyRadX0Correction ( bool  applyRadX0Correction  )  [inline]

Apply radLength correction (1+0.036*ln(radX0+1)) to covariance matrix +1 is added for IR-safety Should be done with care: it's easy to make the end-point result dependent on the intermediate stop points.

Definition at line 164 of file SteppingHelixPropagator.h.

References applyRadX0Correction_.

Referenced by TrackDetectorAssociator::init(), HTrackAssociator::init(), SteppingHelixPropagatorESProducer::produce(), and AlCaHOCalibProducer::produce().

int SteppingHelixPropagator::cIndex_ ( int  ind  )  const [protected]

(Internals) circular index for array of transients

Definition at line 1489 of file SteppingHelixPropagator.cc.

References MAX_POINTS, and HLT_VtxMuL3::result.

Referenced by propagate(), and setIState().

01489                                                  {
01490   int result = ind%MAX_POINTS;  
01491   if (ind != 0 && result == 0){
01492     result = MAX_POINTS;
01493   }
01494   return result;
01495 }

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

Implements Propagator.

Definition at line 88 of file SteppingHelixPropagator.h.

References SteppingHelixPropagator().

00088 {return new SteppingHelixPropagator(*this);}

double SteppingHelixPropagator::getDeDx ( const SteppingHelixPropagator::StateInfo sv,
double &  dEdXPrime,
double &  radX0,
MatBounds rzLims 
) const [protected]

estimate average (in fact smth. close to MPV and median) energy loss per unit path length

Definition at line 1140 of file SteppingHelixPropagator.cc.

References SteppingHelixStateInfo::bf, e, e3, e4, ecShiftNeg_, ecShiftPos_, funct::exp(), SteppingHelixStateInfo::isYokeVol, funct::log(), SteppingHelixStateInfo::magVol, noMaterialMode_, SteppingHelixStateInfo::p3, funct::pow(), SteppingHelixStateInfo::r3, funct::sin(), funct::sqrt(), useIsYokeFlag_, and useMagVolumes_.

Referenced by getNextState(), loadState(), and makeAtomStep().

01142                                                                 {
01143   radX0 = 1.e24;
01144   dEdXPrime = 0.;
01145   rzLims = MatBounds();
01146   if (noMaterialMode_) return 0;
01147 
01148   double dEdx = 0.;
01149 
01150   double lR = sv.r3.perp();
01151   double lZ = fabs(sv.r3.z());
01152 
01153   //assume "Iron" .. seems to be quite the same for brass/iron/PbW04
01154   //good for Fe within 3% for 0.2 GeV to 10PeV
01155   double p0 = sv.p3.mag();
01156 
01157   //0.065 (PDG) --> 0.044 to better match with MPV
01158   double dEdX_mat = -(11.4 + 0.96*fabs(log(p0*2.8)) + 0.033*p0*(1.0 - pow(p0, -0.33)) )*1e-3; 
01159   //in GeV/cm .. 0.8 to get closer to the median or MPV
01160   double dEdX_HCal = 0.95*dEdX_mat; //extracted from sim
01161   double dEdX_ECal = 0.45*dEdX_mat;
01162   double dEdX_coil = 0.35*dEdX_mat; //extracted from sim .. closer to 40% in fact
01163   double dEdX_Fe =   dEdX_mat;
01164   double dEdX_MCh =  0.053*dEdX_mat; //chambers on average
01165   double dEdX_Trk =  0.0114*dEdX_mat;
01166   double dEdX_Air =  2E-4*dEdX_mat;
01167   double dEdX_Vac =  0.0;
01168 
01169   double radX0_HCal = 1.44/0.8; //guessing
01170   double radX0_ECal = 0.89/0.7;
01171   double radX0_coil = 4.; //
01172   double radX0_Fe =   1.76;
01173   double radX0_MCh =  1e3; //
01174   double radX0_Trk =  320.;
01175   double radX0_Air =  3.e4;
01176   double radX0_Vac =  3.e9; //"big" number for vacuum
01177 
01178 
01179   //not all the boundaries are set below: this will be a default
01180   if (! (lR < 380 && lZ < 785)){
01181     if (lZ > 785 ) rzLims = MatBounds(0, 1e4, 785, 1e4);
01182     if (lZ < 785 ) rzLims = MatBounds(380, 1e4, 0, 785);
01183   }
01184 
01185   //this def makes sense assuming we don't jump into endcap volume from the other z-side in one step
01186   //also, it is a positive shift only (at least for now): can't move ec further into the detector
01187   double ecShift = sv.r3.z() > 0 ? fabs(ecShiftPos_) : fabs(ecShiftNeg_); 
01188 
01189   //this should roughly figure out where things are 
01190   //(numbers taken from Fig1.1.2 TDR and from geom xmls)
01191   if (lR < 2.9){ //inside beampipe
01192     dEdx = dEdX_Vac; radX0 = radX0_Vac;
01193     rzLims = MatBounds(0, 2.9, 0, 1E4);
01194   }
01195   else if (lR < 129){
01196     if (lZ < 294){ 
01197       rzLims = MatBounds(2.9, 129, 0, 294); //tracker boundaries
01198       dEdx = dEdX_Trk; radX0 = radX0_Trk; 
01199       //somewhat empirical formula that ~ matches the average if going from 0,0,0
01200       //assuming "uniform" tracker material
01201       //doesn't really track material layer to layer
01202       double lEtaDet = fabs(sv.r3.eta());
01203       double scaleRadX = lEtaDet > 1.5 ? 0.7724 : sin(2.*atan(exp(-0.5*lEtaDet)));
01204       scaleRadX *= scaleRadX;
01205       if (lEtaDet > 2 && lZ > 20) scaleRadX *= (lEtaDet-1.);
01206       if (lEtaDet > 2.5 && lZ > 20) scaleRadX *= (lEtaDet-1.);
01207       radX0 *= scaleRadX;
01208     }
01209     //endcap part begins here
01210     else if ( lZ < 294 + ecShift ){
01211       //gap in front of EE here, piece inside 2.9<R<129
01212       rzLims = MatBounds(2.9, 129, 294, 294 + ecShift); 
01213       dEdx = dEdX_Air; radX0 = radX0_Air;
01214     }
01215     else if (lZ < 372 + ecShift){ 
01216       rzLims = MatBounds(2.9, 129, 294 + ecShift, 372 + ecShift); //EE here, piece inside 2.9<R<129
01217       dEdx = dEdX_ECal; radX0 = radX0_ECal; 
01218     }//EE averaged out over a larger space
01219     else if (lZ < 398 + ecShift){
01220       rzLims = MatBounds(2.9, 129, 372 + ecShift, 398 + ecShift); //whatever goes behind EE 2.9<R<129 is air up to Z=398
01221       dEdx = dEdX_HCal*0.05; radX0 = radX0_Air; 
01222     }//betw EE and HE
01223     else if (lZ < 555 + ecShift){ 
01224       rzLims = MatBounds(2.9, 129, 398 + ecShift, 555 + ecShift); //HE piece 2.9<R<129; 
01225       dEdx = dEdX_HCal*0.96; radX0 = radX0_HCal/0.96; 
01226     } //HE calor abit less dense
01227     else {
01228       //      rzLims = MatBounds(2.9, 129, 555, 785);
01229       // set the boundaries first: they serve as stop-points here
01230       // the material is set below
01231       if (lZ < 568  + ecShift) rzLims = MatBounds(2.9, 129, 555 + ecShift, 568 + ecShift); //a piece of HE support R<129, 555<Z<568
01232       else if (lZ < 625 + ecShift){
01233         if (lR < 85 + ecShift) rzLims = MatBounds(2.9, 85, 568 + ecShift, 625 + ecShift); 
01234         else rzLims = MatBounds(85, 129, 568 + ecShift, 625 + ecShift);
01235       } else if (lZ < 785 + ecShift) rzLims = MatBounds(2.9, 129, 625 + ecShift, 785 + ecShift);
01236       else if (lZ < 1500 + ecShift)  rzLims = MatBounds(2.9, 129, 785 + ecShift, 1500 + ecShift);
01237       else rzLims = MatBounds(2.9, 129, 1500 + ecShift, 1E4);
01238 
01239       //iron .. don't care about no material in front of HF (too forward)
01240       if (! (lZ > 568 + ecShift && lZ < 625 + ecShift && lR > 85 ) // HE support 
01241           && ! (lZ > 785 + ecShift && lZ < 850 + ecShift && lR > 118)) {dEdx = dEdX_Fe; radX0 = radX0_Fe; }
01242       else  { dEdx = dEdX_MCh; radX0 = radX0_MCh; } //ME at eta > 2.2
01243     }
01244   }
01245   else if (lR < 287){
01246     if (lZ < 372 + ecShift && lR < 177){ // 129<<R<177
01247       if (lZ < 304) rzLims = MatBounds(129, 177, 0, 304); //EB  129<<R<177 0<Z<304
01248       else if (lZ < 343){ // 129<<R<177 304<Z<343
01249         if (lR < 135 ) rzLims = MatBounds(129, 135, 304, 343);// tk piece 129<<R<135 304<Z<343
01250         else if (lR < 172 ){ //
01251           if (lZ < 311 ) rzLims = MatBounds(135, 172, 304, 311);
01252           else rzLims = MatBounds(135, 172, 311, 343);
01253         } else {
01254           if (lZ < 328) rzLims = MatBounds(172, 177, 304, 328);
01255           else rzLims = MatBounds(172, 177, 328, 343);
01256         }
01257       }
01258       else if ( lZ < 343 + ecShift){
01259         rzLims = MatBounds(129, 177, 343, 343 + ecShift); //gap
01260       }
01261       else {
01262         if (lR < 156 ) rzLims = MatBounds(129, 156, 343 + ecShift, 372 + ecShift);
01263         else if ( (lZ - 343 - ecShift) > (lR - 156)*1.38 ) 
01264           rzLims = MatBounds(156, 177, 127.72 + ecShift, 372 + ecShift, atan(1.38), 0);
01265         else rzLims = MatBounds(156, 177, 343 + ecShift, 127.72 + ecShift, 0, atan(1.38));
01266       }
01267 
01268       if (!(lR > 135 && lZ <343 + ecShift && lZ > 304 )
01269           && ! (lR > 156 && lZ < 372 + ecShift  && lZ > 343 + ecShift  && ((lZ-343. - ecShift )< (lR-156.)*1.38)))
01270         {
01271           //the crystals are the same length, but they are not 100% of material
01272           double cosThetaEquiv = 0.8/sqrt(1.+lZ*lZ/lR/lR) + 0.2;
01273           if (lZ > 343) cosThetaEquiv = 1.;
01274           dEdx = dEdX_ECal*cosThetaEquiv; radX0 = radX0_ECal/cosThetaEquiv; 
01275         } //EB
01276       else { 
01277         if ( (lZ > 304 && lZ < 328 && lR < 177 && lR > 135) 
01278              && ! (lZ > 311 && lR < 172) ) {dEdx = dEdX_Fe; radX0 = radX0_Fe; } //Tk_Support
01279         else if ( lZ > 343 && lZ < 343 + ecShift) { dEdx = dEdX_Air; radX0 = radX0_Air; }
01280         else {dEdx = dEdX_ECal*0.2; radX0 = radX0_Air;} //cables go here <-- will be abit too dense for ecShift > 0
01281       }
01282     }
01283     else if (lZ < 554 + ecShift){ // 129<R<177 372<Z<554  AND 177<R<287 0<Z<554
01284       if (lR < 177){ //  129<R<177 372<Z<554
01285         if ( lZ > 372 + ecShift && lZ < 398 + ecShift )rzLims = MatBounds(129, 177, 372 + ecShift, 398 + ecShift); // EE 129<R<177 372<Z<398
01286         else if (lZ < 548 + ecShift) rzLims = MatBounds(129, 177, 398 + ecShift, 548 + ecShift); // HE 129<R<177 398<Z<548
01287         else rzLims = MatBounds(129, 177, 548 + ecShift, 554 + ecShift); // HE gap 129<R<177 548<Z<554
01288       }
01289       else if (lR < 193){ // 177<R<193 0<Z<554
01290         if ((lZ - 307) < (lR - 177.)*1.739) rzLims = MatBounds(177, 193, 0, -0.803, 0, atan(1.739));
01291         else if ( lZ < 389)  rzLims = MatBounds(177, 193, -0.803, 389, atan(1.739), 0.);
01292         else if ( lZ < 389 + ecShift)  rzLims = MatBounds(177, 193, 389, 389 + ecShift); // air insert
01293         else if ( lZ < 548 + ecShift ) rzLims = MatBounds(177, 193, 389 + ecShift, 548 + ecShift);// HE 177<R<193 389<Z<548
01294         else rzLims = MatBounds(177, 193, 548 + ecShift, 554 + ecShift); // HE gap 177<R<193 548<Z<554
01295       }
01296       else if (lR < 264){ // 193<R<264 0<Z<554
01297         double anApex = 375.7278 - 193./1.327; // 230.28695599096
01298         if ( (lZ - 375.7278) < (lR - 193.)/1.327) rzLims = MatBounds(193, 264, 0, anApex, 0, atan(1./1.327)); //HB
01299         else if ( (lZ - 392.7278 ) < (lR - 193.)/1.327) 
01300           rzLims = MatBounds(193, 264, anApex, anApex+17., atan(1./1.327), atan(1./1.327)); // HB-HE gap
01301         else if ( (lZ - 392.7278 - ecShift ) < (lR - 193.)/1.327) 
01302           rzLims = MatBounds(193, 264, anApex+17., anApex+17. + ecShift, atan(1./1.327), atan(1./1.327)); // HB-HE gap air insert
01303         // HE (372,193)-(517,193)-(517,264)-(417.8,264)
01304         else if ( lZ < 517 + ecShift ) rzLims = MatBounds(193, 264, anApex+17. + ecShift, 517 + ecShift, atan(1./1.327), 0);
01305         else if (lZ < 548 + ecShift){ // HE+gap 193<R<264 517<Z<548
01306           if (lR < 246 ) rzLims = MatBounds(193, 246, 517 + ecShift, 548 + ecShift); // HE 193<R<246 517<Z<548
01307           else rzLims = MatBounds(246, 264, 517 + ecShift, 548 + ecShift); // HE gap 246<R<264 517<Z<548
01308         } 
01309         else rzLims = MatBounds(193, 264, 548 + ecShift, 554 + ecShift); // HE gap  193<R<246 548<Z<554
01310       }
01311       else if ( lR < 275){ // 264<R<275 0<Z<554
01312         if (lZ < 433) rzLims = MatBounds(264, 275, 0, 433); //HB
01313         else if (lZ < 554 ) rzLims = MatBounds(264, 275, 433, 554); // HE gap 264<R<275 433<Z<554
01314         else rzLims = MatBounds(264, 275, 554, 554 + ecShift); // HE gap 264<R<275 554<Z<554 air insert
01315       }
01316       else { // 275<R<287 0<Z<554
01317         if (lZ < 402) rzLims = MatBounds(275, 287, 0, 402);// HB 275<R<287 0<Z<402
01318         else if (lZ < 554) rzLims = MatBounds(275, 287, 402, 554);//  //HE gap 275<R<287 402<Z<554
01319         else rzLims = MatBounds(275, 287, 554, 554 + ecShift); //HE gap 275<R<287 554<Z<554 air insert
01320       }
01321 
01322       if ((lZ < 433 || lR < 264) && (lZ < 402 || lR < 275) && (lZ < 517 + ecShift || lR < 246) //notches
01323           //I should've made HE and HF different .. now need to shorten HE to match
01324           && lZ < 548 + ecShift
01325           && ! (lZ < 389 + ecShift && lZ > 335 && lR < 193 ) //not a gap EB-EE 129<R<193
01326           && ! (lZ > 307 && lZ < 335 && lR < 193 && ((lZ - 307) > (lR - 177.)*1.739)) //not a gap 
01327           && ! (lR < 177 && lZ < 398 + ecShift) //under the HE nose
01328           && ! (lR < 264 && lR > 193 && fabs(441.5+0.5*ecShift - lZ + (lR - 269.)/1.327) < (8.5 + ecShift*0.5)) ) //not a gap
01329         { dEdx = dEdX_HCal; radX0 = radX0_HCal; //hcal
01330         }
01331       else if( (lR < 193 && lZ > 389 && lZ < 389 + ecShift ) || (lR > 264 && lR < 287 && lZ > 554 && lZ < 554 + ecShift)
01332                ||(lR < 264 && lR > 193 && fabs(441.5+8.5+0.5*ecShift - lZ + (lR - 269.)/1.327) < ecShift*0.5) )  {
01333         dEdx = dEdX_Air; radX0 = radX0_Air; 
01334       }
01335       else {dEdx = dEdX_HCal*0.05; radX0 = radX0_Air; }//endcap gap
01336     }
01337     //the rest is a tube of endcap volume  129<R<251 554<Z<largeValue
01338     else if (lZ < 564 + ecShift){ // 129<R<287  554<Z<564
01339       if (lR < 251) {
01340         rzLims = MatBounds(129, 251, 554 + ecShift, 564 + ecShift);  // HE support 129<R<251  554<Z<564    
01341         dEdx = dEdX_Fe; radX0 = radX0_Fe; 
01342       }//HE support
01343       else { 
01344         rzLims = MatBounds(251, 287, 554 + ecShift, 564 + ecShift); //HE/ME gap 251<R<287  554<Z<564    
01345         dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01346       }
01347     }
01348     else if (lZ < 625 + ecShift){ // ME/1/1 129<R<287  564<Z<625
01349       rzLims = MatBounds(129, 287, 564 + ecShift, 625 + ecShift);      
01350       dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01351     }
01352     else if (lZ < 785 + ecShift){ //129<R<287  625<Z<785
01353       if (lR < 275) rzLims = MatBounds(129, 275, 625 + ecShift, 785 + ecShift); //YE/1 129<R<275 625<Z<785
01354       else { // 275<R<287  625<Z<785
01355         if (lZ < 720 + ecShift) rzLims = MatBounds(275, 287, 625 + ecShift, 720 + ecShift); // ME/1/2 275<R<287  625<Z<720
01356         else rzLims = MatBounds(275, 287, 720 + ecShift, 785 + ecShift); // YE/1 275<R<287  720<Z<785
01357       }
01358       if (! (lR > 275 && lZ < 720 + ecShift)) { dEdx = dEdX_Fe; radX0 = radX0_Fe; }//iron
01359       else { dEdx = dEdX_MCh; radX0 = radX0_MCh; }
01360     }
01361     else if (lZ < 850 + ecShift){
01362       rzLims = MatBounds(129, 287, 785 + ecShift, 850 + ecShift);
01363       dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01364     }
01365     else if (lZ < 910 + ecShift){
01366       rzLims = MatBounds(129, 287, 850 + ecShift, 910 + ecShift);
01367       dEdx = dEdX_Fe; radX0 = radX0_Fe; 
01368     }//iron
01369     else if (lZ < 975 + ecShift){
01370       rzLims = MatBounds(129, 287, 910 + ecShift, 975 + ecShift);
01371       dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01372     }
01373     else if (lZ < 1000 + ecShift){
01374       rzLims = MatBounds(129, 287, 975 + ecShift, 1000 + ecShift);
01375       dEdx = dEdX_Fe; radX0 = radX0_Fe; 
01376     }//iron
01377     else if (lZ < 1063 + ecShift){
01378       rzLims = MatBounds(129, 287, 1000 + ecShift, 1063 + ecShift);
01379       dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01380     }
01381     else if ( lZ < 1073 + ecShift){
01382       rzLims = MatBounds(129, 287, 1063 + ecShift, 1073 + ecShift);
01383       dEdx = dEdX_Fe; radX0 = radX0_Fe; 
01384     }
01385     else if (lZ < 1E4 )  { 
01386       rzLims = MatBounds(129, 287, 1073 + ecShift, 1E4);
01387       dEdx = dEdX_Air; radX0 = radX0_Air;
01388     }
01389     else { 
01390       
01391       dEdx = dEdX_Air; radX0 = radX0_Air;
01392     }
01393   }
01394   else if (lR <380 && lZ < 667){
01395     if (lZ < 630){
01396       if (lR < 315) rzLims = MatBounds(287, 315, 0, 630); 
01397       else if (lR < 341 ) rzLims = MatBounds(315, 341, 0, 630); //b-field ~linear rapid fall here
01398       else rzLims = MatBounds(341, 380, 0, 630);      
01399     } else rzLims = MatBounds(287, 380, 630, 667);  
01400 
01401     if (lZ < 630) { dEdx = dEdX_coil; radX0 = radX0_coil; }//a guess for the solenoid average
01402     else {dEdx = dEdX_Air; radX0 = radX0_Air; }//endcap gap
01403   }
01404   else {
01405     if (lZ < 667) {
01406       if (lR < 850){
01407         bool isIron = false;
01408         //sanity check in addition to flags
01409         if (useIsYokeFlag_ && useMagVolumes_ && sv.magVol != 0){
01410           isIron = sv.isYokeVol;
01411         } else {
01412           double bMag = sv.bf.mag();
01413           isIron = (bMag > 0.75 && ! (lZ > 500 && lR <500 && bMag < 1.15)
01414                     && ! (lZ < 450 && lR > 420 && bMag < 1.15 ) );
01415         }
01416         //tell the material stepper where mat bounds are
01417         rzLims = MatBounds(380, 850, 0, 667);
01418         if (isIron) { dEdx = dEdX_Fe; radX0 = radX0_Fe; }//iron
01419         else { dEdx = dEdX_MCh; radX0 = radX0_MCh; }
01420       } else {
01421         rzLims = MatBounds(850, 1E4, 0, 667);
01422         dEdx = dEdX_Air; radX0 = radX0_Air; 
01423       }
01424     } 
01425     else if (lR > 750 ){
01426       rzLims = MatBounds(750, 1E4, 667, 1E4);
01427       dEdx = dEdX_Air; radX0 = radX0_Air; 
01428     }
01429     else if (lZ < 667 + ecShift){
01430       rzLims = MatBounds(287, 750, 667, 667 + ecShift);
01431       dEdx = dEdX_Air; radX0 = radX0_Air;       
01432     }
01433     //the rest is endcap piece with 287<R<750 Z>667
01434     else if (lZ < 724 + ecShift){
01435       if (lR < 380 ) rzLims = MatBounds(287, 380, 667 + ecShift, 724 + ecShift); 
01436       else rzLims = MatBounds(380, 750, 667 + ecShift, 724 + ecShift); 
01437       dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01438     }
01439     else if (lZ < 785 + ecShift){
01440       if (lR < 380 ) rzLims = MatBounds(287, 380, 724 + ecShift, 785 + ecShift); 
01441       else rzLims = MatBounds(380, 750, 724 + ecShift, 785 + ecShift); 
01442       dEdx = dEdX_Fe; radX0 = radX0_Fe; 
01443     }//iron
01444     else if (lZ < 850 + ecShift){
01445       rzLims = MatBounds(287, 750, 785 + ecShift, 850 + ecShift); 
01446       dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01447     }
01448     else if (lZ < 910 + ecShift){
01449       rzLims = MatBounds(287, 750, 850 + ecShift, 910 + ecShift); 
01450       dEdx = dEdX_Fe; radX0 = radX0_Fe; 
01451     }//iron
01452     else if (lZ < 975 + ecShift){
01453       rzLims = MatBounds(287, 750, 910 + ecShift, 975 + ecShift); 
01454       dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01455     }
01456     else if (lZ < 1000 + ecShift){
01457       rzLims = MatBounds(287, 750, 975 + ecShift, 1000 + ecShift); 
01458       dEdx = dEdX_Fe; radX0 = radX0_Fe; 
01459     }//iron
01460     else if (lZ < 1063 + ecShift){
01461       if (lR < 360){
01462         rzLims = MatBounds(287, 360, 1000 + ecShift, 1063 + ecShift);
01463         dEdx = dEdX_MCh; radX0 = radX0_MCh; 
01464       } 
01465       //put empty air where me4/2 should be (future)
01466       else {
01467         rzLims = MatBounds(360, 750, 1000 + ecShift, 1063 + ecShift);
01468         dEdx = dEdX_Air; radX0 = radX0_Air;
01469       }
01470     }
01471     else if ( lZ < 1073 + ecShift){
01472       rzLims = MatBounds(287, 750, 1063 + ecShift, 1073 + ecShift);
01473       //this plate does not exist: air
01474       dEdx = dEdX_Air; radX0 = radX0_Air; 
01475     }
01476     else if (lZ < 1E4 )  { 
01477       rzLims = MatBounds(287, 750, 1073 + ecShift, 1E4);
01478       dEdx = dEdX_Air; radX0 = radX0_Air;
01479     }
01480     else {dEdx = dEdX_Air; radX0 = radX0_Air; }//air
01481   }
01482   
01483   dEdXPrime = dEdx == 0 ? 0 : -dEdx/dEdX_mat*(0.96/p0 + 0.033 - 0.022*pow(p0, -0.33))*1e-3; //== d(dEdX)/dp
01484 
01485   return dEdx;
01486 }

void SteppingHelixPropagator::getNextState ( const SteppingHelixPropagator::StateInfo svPrevious,
SteppingHelixPropagator::StateInfo svNext,
double  dP,
const SteppingHelixPropagator::Vector tau,
const SteppingHelixPropagator::Vector drVec,
double  dS,
double  dX0,
const AlgebraicMatrix66 dCov 
) const [protected]

(Internals) compute transients for current point (increments step counter).

Called by makeAtomStep

Definition at line 735 of file SteppingHelixPropagator.cc.

References SteppingHelixStateInfo::bf, SteppingHelixStateInfo::cov, debug_, SteppingHelixStateInfo::dEdx, SteppingHelixStateInfo::dEdXPrime, SteppingHelixStateInfo::dir, e, lat::endl(), field_, VolumeBasedMagneticField::findVolume(), getDeDx(), SteppingHelixStateInfo::hasErrorPropagated_, MagVolume::inTesla(), MagneticField::inTesla(), SteppingHelixStateInfo::isYokeVol, isYokeVolume(), VolumeBasedMagneticField::isZSymmetric(), LogTrace, SteppingHelixStateInfo::magVol, SteppingHelixStateInfo::matDCov, SteppingHelixStateInfo::p3, SteppingHelixStateInfo::path(), SteppingHelixStateInfo::path_, SteppingHelixStateInfo::q, SteppingHelixStateInfo::r3, SteppingHelixStateInfo::radPath(), SteppingHelixStateInfo::radPath_, SteppingHelixStateInfo::radX0, SteppingHelixStateInfo::rzLims, tmp, useInTeslaFromMagField_, useIsYokeFlag_, useMagVolumes_, and vbField_.

Referenced by makeAtomStep().

00739                                                                                         {
00740   static const std::string metname = "SteppingHelixPropagator";
00741   svNext.q = svPrevious.q;
00742   svNext.dir = dS > 0.0 ? 1.: -1.; 
00743   svNext.p3 = tau;  svNext.p3*=(svPrevious.p3.mag() - svNext.dir*fabs(dP));
00744 
00745   svNext.r3 = svPrevious.r3; svNext.r3 += drVec;
00746 
00747   svNext.path_ = svPrevious.path() + dS;
00748   svNext.radPath_ = svPrevious.radPath() + dX0;
00749 
00750   GlobalPoint gPointNegZ(svNext.r3.x(), svNext.r3.y(), -fabs(svNext.r3.z()));
00751   GlobalPoint gPointNorZ(svNext.r3.x(), svNext.r3.y(), svNext.r3.z());
00752 
00753   GlobalVector bf; 
00754 
00755   if (useMagVolumes_){
00756     if (vbField_ != 0){
00757        if (vbField_->isZSymmetric()){
00758          svNext.magVol = vbField_->findVolume(gPointNegZ);
00759        } else {
00760          svNext.magVol = vbField_->findVolume(gPointNorZ);
00761        }
00762       if (useIsYokeFlag_){
00763         double curRad = svNext.r3.perp();
00764         if (curRad > 380 && curRad < 850 && fabs(svNext.r3.z()) < 667){
00765           svNext.isYokeVol = isYokeVolume(svNext.magVol);
00766         } else {
00767           svNext.isYokeVol = false;
00768         }
00769       }
00770     } else {
00771       LogTrace(metname)<<"Failed to cast into VolumeBasedMagneticField"<<std::endl;
00772       svNext.magVol = 0;
00773     }
00774     if (debug_){
00775       LogTrace(metname)<<"Got volume at "<<svNext.magVol<<std::endl;
00776     }
00777   }
00778 
00779   if (useMagVolumes_ && svNext.magVol != 0 && ! useInTeslaFromMagField_){
00780     if (vbField_->isZSymmetric()){
00781       bf = svNext.magVol->inTesla(gPointNegZ);
00782     } else {
00783       bf = svNext.magVol->inTesla(gPointNorZ);
00784     }
00785     if (svNext.r3.z() > 0  && vbField_->isZSymmetric() ){
00786       svNext.bf.set(-bf.x(), -bf.y(), bf.z());
00787     } else {
00788       svNext.bf.set(bf.x(), bf.y(), bf.z());
00789     }
00790   } else {
00791     GlobalPoint gPoint(svNext.r3.x(), svNext.r3.y(), svNext.r3.z());
00792     bf = field_->inTesla(gPoint);
00793     svNext.bf.set(bf.x(), bf.y(), bf.z());
00794   }
00795   if (svNext.bf.mag() < 1e-6) svNext.bf.set(0., 0., 1e-6);
00796   
00797   
00798   double dEdXPrime = 0;
00799   double dEdx = 0;
00800   double radX0 = 0;
00801   MatBounds rzLims;
00802   dEdx = getDeDx(svNext, dEdXPrime, radX0, rzLims);
00803   svNext.dEdx = dEdx;    svNext.dEdXPrime = dEdXPrime;
00804   svNext.radX0 = radX0;
00805   svNext.rzLims = rzLims;
00806 
00807   //update Emat only if it's valid
00808   svNext.hasErrorPropagated_ = svPrevious.hasErrorPropagated_;
00809   if (svPrevious.hasErrorPropagated_){
00810     //    svNext.cov = ROOT::Math::Similarity(dCovTransform, svPrevious.cov);
00811     AlgebraicMatrix66 tmp = dCovTransform*svPrevious.cov;
00812     ROOT::Math::AssignSym::Evaluate(svNext.cov, tmp*ROOT::Math::Transpose(dCovTransform));
00813 
00814     svNext.cov += svPrevious.matDCov;
00815   } else {
00816     //could skip dragging along the unprop. cov later .. now
00817     // svNext.cov = svPrevious.cov;
00818   }
00819 
00820   if (debug_){
00821     LogTrace(metname)<<"Now at  path: "<<svNext.path()<<" radPath: "<<svNext.radPath()
00822                      <<" p3 "<<" pt: "<<svNext.p3.perp()<<" phi: "<<svNext.p3.phi()
00823                      <<" eta: "<<svNext.p3.eta()
00824                      <<" "<<svNext.p3
00825                      <<" r3: "<<svNext.r3
00826                      <<" dPhi: "<<acos(svNext.p3.unit().dot(svPrevious.p3.unit()))
00827                      <<" bField: "<<svNext.bf.mag()
00828                      <<" dedx: "<<svNext.dEdx
00829                      <<std::endl;
00830     LogTrace(metname)<<"New Covariance "<<svNext.cov<<std::endl;
00831     LogTrace(metname)<<"Transf by dCovTransform "<<dCovTransform<<std::endl;
00832   }
00833 }

bool SteppingHelixPropagator::isYokeVolume ( const MagVolume vol  )  const [protected]

check if it's a yoke/iron based on this MagVol internals

Definition at line 2067 of file SteppingHelixPropagator.cc.

References debug_, MFGrid::dimensions(), lat::endl(), LogTrace, MFGrid::nodeValue(), GloballyPositioned< T >::position(), MagVolume::provider(), and HLT_VtxMuL3::result.

Referenced by getNextState(), and loadState().

02067                                                                      {
02068   static const std::string metname = "SteppingHelixPropagator";
02069   if (vol == 0) return false;
02070   const MFGrid* mGrid = reinterpret_cast<const MFGrid*>(vol->provider());
02071   std::vector<int> dims(mGrid->dimensions());
02072   
02073   LocalVector lVCen(mGrid->nodeValue(dims[0]/2, dims[1]/2, dims[2]/2));
02074   LocalVector lVZLeft(mGrid->nodeValue(dims[0]/2, dims[1]/2, dims[2]/5));
02075   LocalVector lVZRight(mGrid->nodeValue(dims[0]/2, dims[1]/2, (dims[2]*4)/5));
02076 
02077   double mag2VCen = lVCen.mag2();
02078   double mag2VZLeft = lVZLeft.mag2();
02079   double mag2VZRight = lVZRight.mag2();
02080 
02081   bool result = false;
02082   if (mag2VCen > 0.6 && mag2VZLeft > 0.6 && mag2VZRight > 0.6){
02083     if (debug_) LogTrace(metname)<<"Volume is magnetic, located at "<<vol->position()<<std::endl;    
02084     result = true;
02085   } else {
02086     if (debug_) LogTrace(metname)<<"Volume is not magnetic, located at "<<vol->position()<<std::endl;
02087   }
02088 
02089   return result;
02090 }

void SteppingHelixPropagator::loadState ( SteppingHelixPropagator::StateInfo svCurrent,
const SteppingHelixPropagator::Vector p3,
const SteppingHelixPropagator::Point r3,
int  charge,
const AlgebraicSymMatrix66 cov,
PropagationDirection  dir 
) const [protected]

(Internals) compute transient values for initial point (resets step counter).

Called by setIState

Definition at line 646 of file SteppingHelixPropagator.cc.

References alongMomentum, SteppingHelixStateInfo::bf, SteppingHelixStateInfo::cov, debug_, SteppingHelixStateInfo::dEdx, SteppingHelixStateInfo::dEdXPrime, SteppingHelixStateInfo::dir, e, lat::endl(), field_, VolumeBasedMagneticField::findVolume(), getDeDx(), MagVolume::inTesla(), MagneticField::inTesla(), SteppingHelixStateInfo::isComplete, SteppingHelixStateInfo::isValid_, SteppingHelixStateInfo::isYokeVol, isYokeVolume(), VolumeBasedMagneticField::isZSymmetric(), LogTrace, SteppingHelixStateInfo::magVol, SteppingHelixStateInfo::p3, SteppingHelixStateInfo::path(), SteppingHelixStateInfo::path_, SteppingHelixStateInfo::q, SteppingHelixStateInfo::r3, SteppingHelixStateInfo::radPath(), SteppingHelixStateInfo::radPath_, SteppingHelixStateInfo::radX0, SteppingHelixStateInfo::rzLims, useInTeslaFromMagField_, useIsYokeFlag_, useMagVolumes_, and vbField_.

Referenced by setIState().

00649                                                                                                         {
00650   static const std::string metname = "SteppingHelixPropagator";
00651 
00652   svCurrent.q = charge;
00653   svCurrent.p3 = p3;
00654   svCurrent.r3 = r3;
00655   svCurrent.dir = dir == alongMomentum ? 1.: -1.;
00656 
00657   svCurrent.path_ = 0; // this could've held the initial path
00658   svCurrent.radPath_ = 0;
00659 
00660   GlobalPoint gPointNegZ(svCurrent.r3.x(), svCurrent.r3.y(), -fabs(svCurrent.r3.z()));
00661   GlobalPoint gPointNorZ(svCurrent.r3.x(), svCurrent.r3.y(), svCurrent.r3.z());
00662 
00663   GlobalVector bf;
00664   // = field_->inTesla(gPoint);
00665   if (useMagVolumes_){
00666     if (vbField_ ){
00667       if (vbField_->isZSymmetric()){
00668         svCurrent.magVol = vbField_->findVolume(gPointNegZ);
00669       } else {
00670         svCurrent.magVol = vbField_->findVolume(gPointNorZ);
00671       }
00672       if (useIsYokeFlag_){
00673         double curRad = svCurrent.r3.perp();
00674         if (curRad > 380 && curRad < 850 && fabs(svCurrent.r3.z()) < 667){
00675           svCurrent.isYokeVol = isYokeVolume(svCurrent.magVol);
00676         } else {
00677           svCurrent.isYokeVol = false;
00678         }
00679       }
00680     } else {
00681       edm::LogWarning(metname)<<"Failed to cast into VolumeBasedMagneticField: fall back to the default behavior"<<std::endl;
00682       svCurrent.magVol = 0;
00683     }
00684     if (debug_){
00685       LogTrace(metname)<<"Got volume at "<<svCurrent.magVol<<std::endl;
00686     }
00687   }
00688   
00689   if (useMagVolumes_ && svCurrent.magVol != 0 && ! useInTeslaFromMagField_){
00690     if (vbField_->isZSymmetric()){
00691       bf = svCurrent.magVol->inTesla(gPointNegZ);
00692     } else {
00693       bf = svCurrent.magVol->inTesla(gPointNorZ);
00694     }
00695     if (r3.z() > 0 && vbField_->isZSymmetric() ){
00696       svCurrent.bf.set(-bf.x(), -bf.y(), bf.z());
00697     } else {
00698       svCurrent.bf.set(bf.x(), bf.y(), bf.z());
00699     }
00700   } else {
00701     GlobalPoint gPoint(r3.x(), r3.y(), r3.z());
00702     bf = field_->inTesla(gPoint);
00703     svCurrent.bf.set(bf.x(), bf.y(), bf.z());
00704   }
00705   if (svCurrent.bf.mag() < 1e-6) svCurrent.bf.set(0., 0., 1e-6);
00706 
00707 
00708 
00709   double dEdXPrime = 0;
00710   double dEdx = 0;
00711   double radX0 = 0;
00712   MatBounds rzLims;
00713   dEdx = getDeDx(svCurrent, dEdXPrime, radX0, rzLims);
00714   svCurrent.dEdx = dEdx;    svCurrent.dEdXPrime = dEdXPrime;
00715   svCurrent.radX0 = radX0;
00716   svCurrent.rzLims = rzLims;
00717 
00718   svCurrent.cov =cov;
00719 
00720   svCurrent.isComplete = true;
00721   svCurrent.isValid_ = true;
00722 
00723   if (debug_){
00724     LogTrace(metname)<<"Loaded at  path: "<<svCurrent.path()<<" radPath: "<<svCurrent.radPath()
00725                      <<" p3 "<<" pt: "<<svCurrent.p3.perp()<<" phi: "<<svCurrent.p3.phi()
00726                      <<" eta: "<<svCurrent.p3.eta()
00727                      <<" "<<svCurrent.p3
00728                      <<" r3: "<<svCurrent.r3
00729                      <<" bField: "<<svCurrent.bf.mag()
00730                      <<std::endl;
00731     LogTrace(metname)<<"Input Covariance in Global RF "<<cov<<std::endl;
00732   }
00733 }

virtual const MagneticField* SteppingHelixPropagator::magneticField (  )  const [inline, virtual]

Implements Propagator.

Definition at line 93 of file SteppingHelixPropagator.h.

References field_.

00093 { return field_;}

bool SteppingHelixPropagator::makeAtomStep ( SteppingHelixPropagator::StateInfo svCurrent,
SteppingHelixPropagator::StateInfo svNext,
double  dS,
PropagationDirection  dir,
SteppingHelixPropagator::Fancy  fancy 
) const [protected]

main stepping function: compute next state vector after a step of length dS

Definition at line 843 of file SteppingHelixPropagator.cc.

References alongMomentum, applyRadX0Correction_, SteppingHelixStateInfo::bf, funct::cos(), dCTransform_, debug_, SteppingHelixStateInfo::dEdx, SteppingHelixStateInfo::dEdXPrime, e, lat::endl(), field_, getDeDx(), getNextState(), SteppingHelixStateInfo::hasErrorPropagated_, HEL_ALL_F, HEL_AS_F, MagVolume::inTesla(), MagneticField::inTesla(), SteppingHelixStateInfo::isYokeVol, VolumeBasedMagneticField::isZSymmetric(), funct::log(), LogTrace, SteppingHelixPropagator::Basis::lX, SteppingHelixPropagator::Basis::lY, SteppingHelixPropagator::Basis::lZ, PV3DBase< T, PVType, FrameType >::mag(), SteppingHelixStateInfo::magVol, SteppingHelixStateInfo::matDCov, oppositeToMomentum, SteppingHelixStateInfo::p3, SteppingHelixStateInfo::path(), phi, SteppingHelixStateInfo::q, SteppingHelixStateInfo::r3, SteppingHelixStateInfo::radPath(), SteppingHelixStateInfo::radX0, setRep(), funct::sin(), funct::sqrt(), metsig::tau, unit66_, useInTeslaFromMagField_, useMagVolumes_, vbField_, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by propagate().

00847                                                                                     {
00848   static const std::string metname = "SteppingHelixPropagator";
00849   if (debug_){
00850     LogTrace(metname)<<"Make atom step "<<svCurrent.path()<<" with step "<<dS<<" in direction "<<dir<<std::endl;
00851   }
00852 
00853   double dP = 0;
00854   Vector tau = svCurrent.p3; tau *= 1./tau.mag();
00855   Vector tauNext(tau);
00856   Vector drVec;
00857 
00858   dS = dir == alongMomentum ? fabs(dS) : -fabs(dS);
00859 
00860 
00861   double radX0 = 1e24;
00862 
00863   switch (fancy){
00864   case HEL_AS_F:
00865   case HEL_ALL_F:{
00866     double p0 = svCurrent.p3.mag();
00867     double b0 = svCurrent.bf.mag();
00868 
00869     //get to the mid-point first
00870     double phi = 0.0029979*svCurrent.q*b0/p0*dS/2.;
00871     bool phiSmall = fabs(phi) < 3e-8;
00872 
00873     double cosPhi = cos(phi);
00874     double sinPhi = sin(phi);
00875 
00876     double oneLessCosPhi = 1.-cosPhi;
00877     double oneLessCosPhiOPhi = oneLessCosPhi/phi;
00878     double sinPhiOPhi = sinPhi/phi;
00879     double phiLessSinPhiOPhi = 1 - sinPhiOPhi;
00880     if (phiSmall){
00881       oneLessCosPhi = 0.5*phi*phi;//*(1.- phi*phi/12.);
00882       oneLessCosPhiOPhi = 0.5*phi;//*(1.- phi*phi/12.);
00883       sinPhiOPhi = 1. - phi*phi/6.;
00884       phiLessSinPhiOPhi = phi*phi/6.;//*(1. - phi*phi/20.);
00885     }
00886 
00887     Vector bHat = svCurrent.bf; bHat *= 1./bHat.mag();
00888     Vector btVec(bHat.cross(tau));
00889     Vector bbtVec(bHat.cross(btVec));
00890 
00891     //don't need it here    tauNext = tau + bbtVec*oneLessCosPhi - btVec*sinPhi;
00892     drVec = tau; drVec += bbtVec*phiLessSinPhiOPhi; drVec -= btVec*oneLessCosPhiOPhi;
00893     drVec *= dS/2.;
00894 
00895     double dEdx = svCurrent.dEdx;
00896     double dEdXPrime = svCurrent.dEdXPrime;
00897     radX0 = svCurrent.radX0;
00898     dP = dEdx*dS;
00899 
00900     //improve with above values:
00901     drVec += svCurrent.r3;
00902     GlobalVector bfGV;
00903     Vector bf; //(bfGV.x(), bfGV.y(), bfGV.z());
00904     // = svCurrent.magVol->inTesla(GlobalPoint(drVec.x(), drVec.y(), -fabs(drVec.z())));
00905     if (useMagVolumes_ && svCurrent.magVol != 0 && ! useInTeslaFromMagField_){
00906       // this negative-z business will break at some point
00907       if (vbField_->isZSymmetric()){
00908         bfGV = svCurrent.magVol->inTesla(GlobalPoint(drVec.x(), drVec.y(), -fabs(drVec.z())));
00909       } else {
00910         bfGV = svCurrent.magVol->inTesla(GlobalPoint(drVec.x(), drVec.y(), drVec.z()));
00911       }
00912       if (drVec.z() > 0 && vbField_->isZSymmetric()){
00913         bf.set(-bfGV.x(), -bfGV.y(), bfGV.z());
00914       } else {
00915         bf.set(bfGV.x(), bfGV.y(), bfGV.z());
00916       }
00917     } else {
00918       bfGV = field_->inTesla(GlobalPoint(drVec.x(), drVec.y(), drVec.z()));
00919       bf.set(bfGV.x(), bfGV.y(), bfGV.z());
00920     }
00921     b0 = bf.mag();
00922     if (b0 < 1e-6) {
00923       b0 = 1e-6;
00924       bf.set(0., 0., 1e-6);
00925     }
00926     if (debug_){
00927       LogTrace(metname)<<"Improved b "<<b0
00928                        <<" at r3 "<<drVec<<std::endl;
00929     }
00930 
00931     if (fabs((b0-svCurrent.bf.mag())*dS) > 1){
00932       //missed the mag volume boundary?
00933       if (debug_){
00934         LogTrace(metname)<<"Large bf*dS change "<<fabs((b0-svCurrent.bf.mag())*dS)
00935                          <<" --> recalc dedx"<<std::endl;
00936       }
00937       svNext.r3 = drVec;
00938       svNext.bf = bf;
00939       svNext.p3 = svCurrent.p3;
00940       svNext.isYokeVol = svCurrent.isYokeVol;
00941       MatBounds rzTmp;
00942       dEdx = getDeDx(svNext, dEdXPrime, radX0, rzTmp);
00943       dP = dEdx*dS;      
00944       if (debug_){
00945         LogTrace(metname)<<"New dEdX= "<<dEdx
00946                          <<" dP= "<<dP
00947                          <<" for p0 "<<p0<<std::endl;
00948       }
00949     }
00950     //p0 is mid-way and b0 from mid-point
00951     p0 += dP/2.; p0 = p0 < 1e-2 ? 1e-2 : p0;
00952 
00953     phi = 0.0029979*svCurrent.q*b0/p0*dS;
00954     phiSmall = fabs(phi) < 3e-8;
00955 
00956     if (phiSmall){
00957       sinPhi = phi;
00958       cosPhi = 1. -phi*phi/2;
00959       oneLessCosPhi = 0.5*phi*phi;//*(1.- phi*phi/12.); //<-- ~below double-precision for phi<3e-8
00960       oneLessCosPhiOPhi = 0.5*phi;//*(1.- phi*phi/12.);
00961       sinPhiOPhi = 1. - phi*phi/6.;
00962       phiLessSinPhiOPhi = phi*phi/6.;//*(1. - phi*phi/20.);
00963     }else {
00964       cosPhi = cos(phi); 
00965       sinPhi = sin(phi);
00966       oneLessCosPhi = 1.-cosPhi;
00967       oneLessCosPhiOPhi = oneLessCosPhi/phi;
00968       sinPhiOPhi = sinPhi/phi;
00969       phiLessSinPhiOPhi = 1. - sinPhiOPhi;
00970     }
00971 
00972     bHat = bf; bHat *= 1./bHat.mag();
00973     btVec = bHat.cross(tau);
00974     bbtVec = bHat.cross(btVec);
00975 
00976     tauNext = tau; tauNext += bbtVec*oneLessCosPhi; tauNext -= btVec*sinPhi;
00977     drVec = tau; drVec += bbtVec*phiLessSinPhiOPhi; drVec -= btVec*oneLessCosPhiOPhi;
00978     drVec *= dS;
00979     
00980     
00981     if (svCurrent.hasErrorPropagated_){
00982       double theta02 = 14.e-3/p0*sqrt(fabs(dS)/radX0); // .. drop log term (this is non-additive)
00983       theta02 *=theta02;
00984       if (applyRadX0Correction_){
00985         // this provides the integrand for theta^2
00986         // if summed up along the path, should result in 
00987         // theta_total^2 = Int_0^x0{ f(x)dX} = (13.6/p0)^2*x0*(1+0.036*ln(x0+1))
00988         // x0+1 above is to make the result infrared safe.
00989         double x0 = fabs(svCurrent.radPath());
00990         double dX0 = fabs(dS)/radX0;
00991         double alphaX0 = 13.6e-3/p0; alphaX0 *= alphaX0;
00992         double betaX0 = 0.038;
00993         theta02 = dX0*alphaX0*(1+betaX0*log(x0+1))*(1 + betaX0*log(x0+1) + 2.*betaX0*x0/(x0+1) );
00994       }
00995       
00996       double epsilonP0 = 1.+ dP/p0;
00997       double omegaP0 = -dP/p0 + dS*dEdXPrime;      
00998       
00999 
01000       double dsp = dS/p0;
01001 
01002       Vector tbtVec(tau.cross(btVec));
01003 
01004       dCTransform_ = unit66_;
01005       //make everything in global
01006       //case I: no "spatial" derivatives |--> dCtr({1,2,3,4,5,6}{1,2,3}) = 0    
01007       dCTransform_(0,3) = dsp*(bHat.x()*tbtVec.x() 
01008                                + cosPhi*tau.x()*bbtVec.x()
01009                                + ((1.-bHat.x()*bHat.x()) + phi*tau.x()*btVec.x())*sinPhiOPhi);
01010 
01011       dCTransform_(0,4) = dsp*(bHat.z()*oneLessCosPhiOPhi + bHat.x()*tbtVec.y()
01012                                + cosPhi*tau.y()*bbtVec.x() 
01013                                + (-bHat.x()*bHat.y() + phi*tau.y()*btVec.x())*sinPhiOPhi);
01014       dCTransform_(0,5) = dsp*(-bHat.y()*oneLessCosPhiOPhi + bHat.x()*tbtVec.z()
01015                                + cosPhi*tau.z()*bbtVec.x()
01016                                + (-bHat.x()*bHat.z() + phi*tau.z()*btVec.x())*sinPhiOPhi);
01017 
01018       dCTransform_(1,3) = dsp*(-bHat.z()*oneLessCosPhiOPhi + bHat.y()*tbtVec.x()
01019                                + cosPhi*tau.x()*bbtVec.y()
01020                                + (-bHat.x()*bHat.y() + phi*tau.x()*btVec.y())*sinPhiOPhi);
01021       dCTransform_(1,4) = dsp*(bHat.y()*tbtVec.y() 
01022                                + cosPhi*tau.y()*bbtVec.y()
01023                                + ((1.-bHat.y()*bHat.y()) + phi*tau.y()*btVec.y())*sinPhiOPhi);
01024       dCTransform_(1,5) = dsp*(bHat.x()*oneLessCosPhiOPhi + bHat.y()*tbtVec.z()
01025                                + cosPhi*tau.z()*bbtVec.y() 
01026                                + (-bHat.y()*bHat.z() + phi*tau.z()*btVec.y())*sinPhiOPhi);
01027 
01028       dCTransform_(2,3) = dsp*(bHat.y()*oneLessCosPhiOPhi + bHat.z()*tbtVec.x()
01029                                + cosPhi*tau.x()*bbtVec.z() 
01030                                + (-bHat.x()*bHat.z() + phi*tau.x()*btVec.z())*sinPhiOPhi);
01031       dCTransform_(2,4) = dsp*(-bHat.x()*oneLessCosPhiOPhi + bHat.z()*tbtVec.y()
01032                                + cosPhi*tau.y()*bbtVec.z()
01033                                + (-bHat.y()*bHat.z() + phi*tau.y()*btVec.z())*sinPhiOPhi);
01034       dCTransform_(2,5) = dsp*(bHat.z()*tbtVec.z() 
01035                                + cosPhi*tau.z()*bbtVec.z()
01036                                + ((1.-bHat.z()*bHat.z()) + phi*tau.z()*btVec.z())*sinPhiOPhi);
01037 
01038 
01039       dCTransform_(3,3) = epsilonP0*(1. - oneLessCosPhi*(1.-bHat.x()*bHat.x())
01040                                      + phi*tau.x()*(cosPhi*btVec.x() - sinPhi*bbtVec.x()))
01041         + omegaP0*tau.x()*tauNext.x();
01042       dCTransform_(3,4) = epsilonP0*(bHat.x()*bHat.y()*oneLessCosPhi + bHat.z()*sinPhi
01043                                      + phi*tau.y()*(cosPhi*btVec.x() - sinPhi*bbtVec.x()))
01044         + omegaP0*tau.y()*tauNext.x();
01045       dCTransform_(3,5) = epsilonP0*(bHat.x()*bHat.z()*oneLessCosPhi - bHat.y()*sinPhi
01046                                      + phi*tau.z()*(cosPhi*btVec.x() - sinPhi*bbtVec.x()))
01047         + omegaP0*tau.z()*tauNext.x();
01048 
01049       dCTransform_(4,3) = epsilonP0*(bHat.x()*bHat.y()*oneLessCosPhi - bHat.z()*sinPhi
01050                                      + phi*tau.x()*(cosPhi*btVec.y() - sinPhi*bbtVec.y()))
01051         + omegaP0*tau.x()*tauNext.y();
01052       dCTransform_(4,4) = epsilonP0*(1. - oneLessCosPhi*(1.-bHat.y()*bHat.y())
01053                                      + phi*tau.y()*(cosPhi*btVec.y() - sinPhi*bbtVec.y()))
01054         + omegaP0*tau.y()*tauNext.y();
01055       dCTransform_(4,5) = epsilonP0*(bHat.y()*bHat.z()*oneLessCosPhi + bHat.x()*sinPhi
01056                                      + phi*tau.z()*(cosPhi*btVec.y() - sinPhi*bbtVec.y()))
01057         + omegaP0*tau.z()*tauNext.y();
01058     
01059       dCTransform_(5,3) = epsilonP0*(bHat.x()*bHat.z()*oneLessCosPhi + bHat.y()*sinPhi
01060                                      + phi*tau.x()*(cosPhi*btVec.z() - sinPhi*bbtVec.z()))
01061         + omegaP0*tau.x()*tauNext.z();
01062       dCTransform_(5,4) = epsilonP0*(bHat.y()*bHat.z()*oneLessCosPhi - bHat.x()*sinPhi
01063                                      + phi*tau.y()*(cosPhi*btVec.z() - sinPhi*bbtVec.z()))
01064         + omegaP0*tau.y()*tauNext.z();
01065       dCTransform_(5,5) = epsilonP0*(1. - oneLessCosPhi*(1.-bHat.z()*bHat.z())
01066                                      + phi*tau.z()*(cosPhi*btVec.z() - sinPhi*bbtVec.z()))
01067         + omegaP0*tau.z()*tauNext.z();
01068     
01069 
01070       Basis rep; setRep(rep, tauNext);
01071       //mind the sign of dS and dP (dS*dP < 0 allways)
01072       //covariance should grow no matter which direction you propagate
01073       //==> take abs values.
01074       //reset not needed: fill all below  svCurrent.matDCov *= 0.;
01075       double mulRR = theta02*dS*dS/3.;
01076       double mulRP = theta02*fabs(dS)*p0/2.;
01077       double mulPP = theta02*p0*p0;
01078       double losPP = dP*dP*1.6/fabs(dS)*(1.0 + p0*1e-3);
01079       //another guess .. makes sense for 1 cm steps 2./dS == 2 [cm] / dS [cm] at low pt
01080       //double it by 1TeV
01081       //not gaussian anyways
01082       // derived from the fact that sigma_p/eLoss ~ 0.08 after ~ 200 steps
01083 
01084       //symmetric RR part
01085       svCurrent.matDCov(0,0) = mulRR*(rep.lY.x()*rep.lY.x() + rep.lZ.x()*rep.lZ.x());
01086       svCurrent.matDCov(0,1) = mulRR*(rep.lY.x()*rep.lY.y() + rep.lZ.x()*rep.lZ.y());
01087       svCurrent.matDCov(0,2) = mulRR*(rep.lY.x()*rep.lY.z() + rep.lZ.x()*rep.lZ.z());
01088       svCurrent.matDCov(1,1) = mulRR*(rep.lY.y()*rep.lY.y() + rep.lZ.y()*rep.lZ.y());
01089       svCurrent.matDCov(1,2) = mulRR*(rep.lY.y()*rep.lY.z() + rep.lZ.y()*rep.lZ.z());
01090       svCurrent.matDCov(2,2) = mulRR*(rep.lY.z()*rep.lY.z() + rep.lZ.z()*rep.lZ.z());
01091 
01092       //symmetric PP part
01093       svCurrent.matDCov(3,3) = mulPP*(rep.lY.x()*rep.lY.x() + rep.lZ.x()*rep.lZ.x())
01094         + losPP*rep.lX.x()*rep.lX.x();
01095       svCurrent.matDCov(3,4) = mulPP*(rep.lY.x()*rep.lY.y() + rep.lZ.x()*rep.lZ.y())
01096         + losPP*rep.lX.x()*rep.lX.y();
01097       svCurrent.matDCov(3,5) = mulPP*(rep.lY.x()*rep.lY.z() + rep.lZ.x()*rep.lZ.z())
01098         + losPP*rep.lX.x()*rep.lX.z();
01099       svCurrent.matDCov(4,4) = mulPP*(rep.lY.y()*rep.lY.y() + rep.lZ.y()*rep.lZ.y())
01100         + losPP*rep.lX.y()*rep.lX.y();
01101       svCurrent.matDCov(4,5) = mulPP*(rep.lY.y()*rep.lY.z() + rep.lZ.y()*rep.lZ.z())
01102         + losPP*rep.lX.y()*rep.lX.z();
01103       svCurrent.matDCov(5,5) = mulPP*(rep.lY.z()*rep.lY.z() + rep.lZ.z()*rep.lZ.z())
01104         + losPP*rep.lX.z()*rep.lX.z();
01105 
01106       //still symmetric but fill 9 elements
01107       svCurrent.matDCov(0,3) = mulRP*(rep.lY.x()*rep.lY.x() + rep.lZ.x()*rep.lZ.x());
01108       svCurrent.matDCov(0,4) = mulRP*(rep.lY.x()*rep.lY.y() + rep.lZ.x()*rep.lZ.y());
01109       svCurrent.matDCov(0,5) = mulRP*(rep.lY.x()*rep.lY.z() + rep.lZ.x()*rep.lZ.z());
01110       svCurrent.matDCov(1,3) = mulRP*(rep.lY.x()*rep.lY.y() + rep.lZ.x()*rep.lZ.y());
01111       svCurrent.matDCov(1,4) = mulRP*(rep.lY.y()*rep.lY.y() + rep.lZ.y()*rep.lZ.y());
01112       svCurrent.matDCov(1,5) = mulRP*(rep.lY.y()*rep.lY.z() + rep.lZ.y()*rep.lZ.z());
01113       svCurrent.matDCov(2,3) = mulRP*(rep.lY.x()*rep.lY.z() + rep.lZ.x()*rep.lZ.z());
01114       svCurrent.matDCov(2,4) = mulRP*(rep.lY.y()*rep.lY.z() + rep.lZ.y()*rep.lZ.z());
01115       svCurrent.matDCov(2,5) = mulRP*(rep.lY.z()*rep.lY.z() + rep.lZ.z()*rep.lZ.z());
01116       
01117     }
01118     break;
01119   }
01120     //   case POL_1_F:
01121     //   case POL_2_F:
01122     //   case POL_M_F:
01123     //     break;
01124   default:
01125     break;
01126   }
01127 
01128   double pMag = svCurrent.p3.mag();
01129 
01130   if (dir == oppositeToMomentum) dP = fabs(dP);
01131   else if( dP < 0) { //the case of negative dP
01132     dP = -dP > pMag ? -pMag+1e-5 : dP;
01133   }
01134   
01135   getNextState(svCurrent, svNext, dP, tauNext, drVec, dS, dS/radX0,
01136                dCTransform_);
01137   return true;
01138 }

SteppingHelixPropagator::Result SteppingHelixPropagator::propagate ( SteppingHelixPropagator::DestType  type,
const double  pars[6],
double  epsilon = 1e-3 
) const [protected]

propagate: chose stop point by type argument propagate to fixed radius [ r = sqrt(x**2+y**2) ] with precision epsilon propagate to plane by [x0,y0,z0, n_x, n_y, n_z] parameters

define a fast-skip distance: should be the shortest of a possible step or distance

Definition at line 322 of file SteppingHelixPropagator.cc.

References alongMomentum, anyDirection, cIndex_(), debug_, SteppingHelixStateInfo::dEdx, defaultStep_, dir, dist(), e, e3, e6, lat::endl(), SteppingHelixStateInfo::FAULT, SteppingHelixStateInfo::field, field_, HEL_AS_F, SteppingHelixStateInfo::INACC, SteppingHelixStateInfo::isValid_, LINE_PCA_DT, LogTrace, makeAtomStep(), MAX_STEPS, nPoints_, SteppingHelixStateInfo::OK, oppositeToMomentum, SteppingHelixStateInfo::p3, PATHL_DT, PATHL_P, PLANE_DT, POINT_PCA_DT, Propagator::propagationDirection(), SteppingHelixStateInfo::r3, RADIUS_DT, RADIUS_P, SteppingHelixStateInfo::RANGEOUT, refToDest(), refToMagVolume(), refToMatVolume(), HLT_VtxMuL3::result, SteppingHelixStateInfo::ResultName, sendLogWarning_, SteppingHelixStateInfo::status_, svBuf_, SteppingHelixStateInfo::UNDEFINED, useIsYokeFlag_, useMagVolumes_, useMatVolumes_, useTuningForL2Speed_, SteppingHelixStateInfo::WRONG_VOLUME, Z_DT, and Z_P.

00323                                                                                {
00324 
00325   static const std::string metname = "SteppingHelixPropagator";
00326   StateInfo* svCurrent = &svBuf_[cIndex_(nPoints_-1)];
00327 
00328   //check if it's going to work at all
00329   double tanDist = 0;
00330   double dist = 0;
00331   PropagationDirection refDirection = anyDirection;
00332   Result result = refToDest(type, (*svCurrent), pars, dist, tanDist, refDirection);
00333 
00334   if (result != SteppingHelixStateInfo::OK || fabs(dist) > 1e6){
00335     svCurrent->status_ = result;
00336     if (fabs(dist) > 1e6) svCurrent->status_ = SteppingHelixStateInfo::INACC;
00337     svCurrent->isValid_ = false;
00338     svCurrent->field = field_;
00339     if (sendLogWarning_){
00340       edm::LogWarning(metname)<<" Failed after first refToDest check with status "
00341                               <<SteppingHelixStateInfo::ResultName[result]
00342                               <<std::endl;
00343     }
00344     return result;
00345   }
00346 
00347   result = SteppingHelixStateInfo::UNDEFINED;
00348   bool makeNextStep = true;
00349   double dStep = defaultStep_;
00350   PropagationDirection dir,oldDir;
00351   dir = propagationDirection(); 
00352   oldDir = dir;
00353   int nOsc = 0;
00354 
00355   double distMag = 1e12;
00356   double tanDistMag = 1e12;
00357 
00358   double distMat = 1e12;
00359   double tanDistMat = 1e12;
00360 
00361   double tanDistNextCheck = -0.1;//just need a negative start val
00362   double tanDistMagNextCheck = -0.1;
00363   double tanDistMatNextCheck = -0.1;
00364   double oldDStep = 0;
00365   PropagationDirection oldRefDirection = propagationDirection();
00366 
00367   Result resultToMat = SteppingHelixStateInfo::UNDEFINED;
00368   Result resultToMag = SteppingHelixStateInfo::UNDEFINED;
00369 
00370   bool isFirstStep = true;
00371   bool expectNewMagVolume = false;
00372 
00373   int loopCount = 0;
00374   while (makeNextStep){
00375     dStep = defaultStep_;
00376     svCurrent = &svBuf_[cIndex_(nPoints_-1)];
00377     double curZ = svCurrent->r3.z();
00378     double curR = svCurrent->r3.perp();
00379     if ( fabs(curZ) < 440 && curR < 260) dStep = defaultStep_*2;
00380 
00381     //more such ifs might be scattered around
00382     //even though dStep is large, it will still make stops at each volume boundary
00383     if (useTuningForL2Speed_){
00384       dStep = 100.;
00385       if (! useIsYokeFlag_ && fabs(curZ) < 667 && curR > 380 && curR < 850){
00386         dStep = 5*(1+0.2*svCurrent->p3.mag());
00387       }
00388     }
00389 
00390     //    refDirection = propagationDirection();
00391 
00392     tanDistNextCheck -= oldDStep;
00393     tanDistMagNextCheck -= oldDStep;
00394     tanDistMatNextCheck -= oldDStep;
00395     
00396     if (tanDistNextCheck < 0){
00397       //use pre-computed values if it's the first step
00398       if (! isFirstStep) refToDest(type, (*svCurrent), pars, dist, tanDist, refDirection);
00399       // constrain allowed path for a tangential approach
00400       if (fabs(tanDist/dist) > 4) tanDist *= fabs(dist/tanDist*4.);
00401 
00402       tanDistNextCheck = fabs(tanDist)*0.5 - 0.5; //need a better guess (to-do)
00403       //reasonable limit
00404       if (tanDistNextCheck >  defaultStep_*20. ) tanDistNextCheck = defaultStep_*20.;
00405       oldRefDirection = refDirection;
00406     } else {
00407       tanDist  = tanDist > 0. ? tanDist - oldDStep : tanDist + oldDStep; 
00408       refDirection = oldRefDirection;
00409       if (debug_) LogTrace(metname)<<"Skipped refToDest: guess tanDist = "<<tanDist
00410                                    <<" next check at "<<tanDistNextCheck<<std::endl;
00411     }
00413     double fastSkipDist = fabs(dist) > fabs(tanDist) ? tanDist : dist;
00414 
00415     if (propagationDirection() == anyDirection){
00416       dir = refDirection;
00417     } else {
00418       dir = propagationDirection();
00419       if (fabs(tanDist)<0.1 && refDirection != dir ){
00420         //how did it get here?  nOsc++;
00421         dir = refDirection;
00422         if (debug_) LogTrace(metname)<<"NOTE: overstepped last time: switch direction (can do it if within 1 mm)"<<std::endl;
00423       }
00424     }    
00425 
00426     if (useMagVolumes_ && ! (fabs(dist) < fabs(epsilon))){//need to know the general direction
00427       if (tanDistMagNextCheck < 0){
00428         resultToMag = refToMagVolume((*svCurrent), dir, distMag, tanDistMag, fabs(fastSkipDist), expectNewMagVolume);
00429         // constrain allowed path for a tangential approach
00430         if (fabs(tanDistMag/distMag) > 4) tanDistMag *= fabs(distMag/tanDistMag*4.);
00431 
00432         tanDistMagNextCheck = fabs(tanDistMag)*0.5-0.5; //need a better guess (to-do)
00433         //reasonable limit; "turn off" checking if bounds are further than the destination
00434         if (tanDistMagNextCheck >  defaultStep_*20. 
00435             || fabs(dist) < fabs(distMag)
00436             || resultToMag ==SteppingHelixStateInfo::INACC) 
00437           tanDistMagNextCheck  = defaultStep_*20 > fabs(fastSkipDist) ? fabs(fastSkipDist) : defaultStep_*20;;  
00438         if (resultToMag != SteppingHelixStateInfo::INACC 
00439             && resultToMag != SteppingHelixStateInfo::OK) tanDistMagNextCheck = -1;
00440       } else {
00441         //      resultToMag = SteppingHelixStateInfo::OK;
00442         tanDistMag  = tanDistMag > 0. ? tanDistMag - oldDStep : tanDistMag + oldDStep; 
00443         if (debug_) LogTrace(metname)<<"Skipped refToMag: guess tanDistMag = "<<tanDistMag
00444                                      <<" next check at "<<tanDistMagNextCheck;
00445       }
00446     }
00447 
00448     if (useMatVolumes_ && ! (fabs(dist) < fabs(epsilon))){//need to know the general direction
00449       if (tanDistMatNextCheck < 0){
00450         resultToMat = refToMatVolume((*svCurrent), dir, distMat, tanDistMat, fabs(fastSkipDist));
00451         // constrain allowed path for a tangential approach
00452         if (fabs(tanDistMat/distMat) > 4) tanDistMat *= fabs(distMat/tanDistMat*4.);
00453 
00454         tanDistMatNextCheck = fabs(tanDistMat)*0.5-0.5; //need a better guess (to-do)
00455         //reasonable limit; "turn off" checking if bounds are further than the destination
00456         if (tanDistMatNextCheck >  defaultStep_*20. 
00457             || fabs(dist) < fabs(distMat)
00458             || resultToMat ==SteppingHelixStateInfo::INACC ) 
00459           tanDistMatNextCheck = defaultStep_*20 > fabs(fastSkipDist) ? fabs(fastSkipDist) : defaultStep_*20;
00460         if (resultToMat != SteppingHelixStateInfo::INACC 
00461             && resultToMat != SteppingHelixStateInfo::OK) tanDistMatNextCheck = -1;
00462       } else {
00463         //      resultToMat = SteppingHelixStateInfo::OK;
00464         tanDistMat  = tanDistMat > 0. ? tanDistMat - oldDStep : tanDistMat + oldDStep; 
00465         if (debug_) LogTrace(metname)<<"Skipped refToMat: guess tanDistMat = "<<tanDistMat
00466                                      <<" next check at "<<tanDistMatNextCheck;
00467       }
00468     }
00469 
00470     double rDotP = svCurrent->r3.dot(svCurrent->p3);
00471     if ((fabs(curZ) > 1.5e3 || curR >800.) 
00472         && ((dir == alongMomentum && rDotP > 0) 
00473             || (dir == oppositeToMomentum && rDotP < 0) )
00474         ){
00475       dStep = fabs(tanDist) -1e-12;
00476     }
00477     double tanDistMin = fabs(tanDist);
00478     if (tanDistMin > fabs(tanDistMag)+0.05 && 
00479         (resultToMag == SteppingHelixStateInfo::OK || resultToMag == SteppingHelixStateInfo::WRONG_VOLUME)){
00480       tanDistMin = fabs(tanDistMag)+0.05;     //try to step into the next volume
00481       expectNewMagVolume = true;
00482     } else expectNewMagVolume = false;
00483 
00484     if (tanDistMin > fabs(tanDistMat)+0.05 && resultToMat == SteppingHelixStateInfo::OK){
00485       tanDistMin = fabs(tanDistMat)+0.05;     //try to step into the next volume
00486       if (expectNewMagVolume) expectNewMagVolume = false;
00487     }
00488 
00489     if (tanDistMin*fabs(svCurrent->dEdx) > 0.5*svCurrent->p3.mag()){
00490       tanDistMin = 0.5*svCurrent->p3.mag()/fabs(svCurrent->dEdx);
00491       if (expectNewMagVolume) expectNewMagVolume = false;
00492     }
00493 
00494 
00495 
00496     double tanDistMinLazy = fabs(tanDistMin);
00497     if ((type == POINT_PCA_DT || type == LINE_PCA_DT)
00498         && fabs(tanDist) < 2.*fabs(tanDistMin) ){
00499       //being lazy here; the best is to take into account the curvature
00500       tanDistMinLazy = fabs(tanDistMin)*0.5;
00501     }
00502  
00503     if (fabs(tanDistMinLazy) < dStep){
00504       dStep = fabs(tanDistMinLazy); 
00505     }
00506 
00507     //keep this path length for the next step
00508     oldDStep = dStep;
00509 
00510     if (dStep > 1e-10 && ! (fabs(dist) < fabs(epsilon))){
00511       StateInfo* svNext = &svBuf_[cIndex_(nPoints_)];
00512       makeAtomStep((*svCurrent), (*svNext), dStep, dir, HEL_AS_F);
00513 //       if (useMatVolumes_ && expectNewMagVolume 
00514 //        && svCurrent->magVol == svNext->magVol){
00515 //      double tmpDist=0;
00516 //      double tmpDistMag = 0;
00517 //      if (refToMagVolume((*svNext), dir, tmpDist, tmpDistMag, fabs(dist)) != SteppingHelixStateInfo::OK){
00518 //      //the point appears to be outside, but findVolume claims the opposite
00519 //        dStep += 0.05*fabs(tanDistMag/distMag); oldDStep = dStep; //do it again with a bigger step
00520 //        if (debug_) LogTrace(metname)
00521 //          <<"Failed to get into new mag volume: will try with new bigger step "<<dStep<<std::endl;
00522 //        makeAtomStep((*svCurrent), (*svNext), dStep, dir, HEL_AS_F);    
00523 //      }
00524 //       }
00525       nPoints_++;    svCurrent = &svBuf_[cIndex_(nPoints_-1)];
00526       if (oldDir != dir){
00527         nOsc++;
00528         tanDistNextCheck = -1;//check dist after osc
00529         tanDistMagNextCheck = -1;
00530         tanDistMatNextCheck = -1;
00531       }
00532       oldDir = dir;
00533     }
00534 
00535     if (nOsc>1 && fabs(dStep)>epsilon){
00536       if (debug_) LogTrace(metname)<<"Ooops"<<std::endl;
00537     }
00538 
00539     if (fabs(dist) < fabs(epsilon)  ) result = SteppingHelixStateInfo::OK;
00540 
00541     if ((type == POINT_PCA_DT || type == LINE_PCA_DT )
00542         && fabs(dStep) < fabs(epsilon)  ){
00543       //now check if it's not a branch point (peek ahead at 1 cm)
00544       double nextDist = 0;
00545       double nextTanDist = 0;
00546       PropagationDirection nextRefDirection = anyDirection;
00547       StateInfo* svNext = &svBuf_[cIndex_(nPoints_)];
00548       makeAtomStep((*svCurrent), (*svNext), 1., dir, HEL_AS_F);
00549       nPoints_++;     svCurrent = &svBuf_[cIndex_(nPoints_-1)];
00550       refToDest(type, (*svCurrent), pars, nextDist, nextTanDist, nextRefDirection);
00551       if ( fabs(nextDist) > fabs(dist)){
00552         nPoints_--;      svCurrent = &svBuf_[cIndex_(nPoints_-1)];
00553         result = SteppingHelixStateInfo::OK;
00554         if (debug_){
00555           LogTrace(metname)<<"Found real local minimum in PCA"<<std::endl;
00556         }
00557       } else {
00558         //keep this trial point and continue
00559         dStep = defaultStep_;
00560         if (debug_){
00561           LogTrace(metname)<<"Found branch point in PCA"<<std::endl;
00562         }
00563       }
00564     }
00565 
00566     if (nPoints_ > MAX_STEPS*1./defaultStep_  || loopCount > MAX_STEPS*100
00567         || nOsc > 6 ) result = SteppingHelixStateInfo::FAULT;
00568 
00569     if (svCurrent->p3.mag() < 0.1 ) result = SteppingHelixStateInfo::RANGEOUT;
00570 
00571     curZ = svCurrent->r3.z();
00572     curR = svCurrent->r3.perp();
00573     if ( curR > 20000 || fabs(curZ) > 20000 ) result = SteppingHelixStateInfo::INACC;
00574 
00575     makeNextStep = result == SteppingHelixStateInfo::UNDEFINED;
00576     svCurrent->status_ = result;
00577     svCurrent->isValid_ = (result == SteppingHelixStateInfo::OK || makeNextStep );
00578     svCurrent->field = field_;
00579 
00580     isFirstStep = false;
00581     loopCount++;
00582   }
00583 
00584   if (sendLogWarning_ && result != SteppingHelixStateInfo::OK){
00585     edm::LogWarning(metname)<<" Propagation failed with status "
00586                             <<SteppingHelixStateInfo::ResultName[result]
00587                             <<std::endl;
00588     if (result == SteppingHelixStateInfo::RANGEOUT)
00589       edm::LogWarning(metname)<<" Momentum at last point is too low (<0.1) p_last = "
00590                               <<svCurrent->p3.mag()
00591                               <<std::endl;
00592     if (result == SteppingHelixStateInfo::INACC)
00593       edm::LogWarning(metname)<<" Went too far: the last point is at "<<svCurrent->r3
00594                               <<std::endl;
00595     if (result == SteppingHelixStateInfo::FAULT && nOsc > 6)
00596       edm::LogWarning(metname)<<" Infinite loop condidtion detected: going in cycles. Break after 6 cycles"
00597                               <<std::endl;
00598     if (result == SteppingHelixStateInfo::FAULT && nPoints_ > MAX_STEPS*1./defaultStep_)
00599       edm::LogWarning(metname)<<" Tired to go farther. Made too many steps: more than "
00600                               <<MAX_STEPS*1./defaultStep_
00601                               <<std::endl;
00602     
00603   }
00604 
00605   if (debug_){
00606     switch (type) {
00607     case RADIUS_DT:
00608       LogTrace(metname)<<"going to radius "<<pars[RADIUS_P]<<std::endl;
00609       break;
00610     case Z_DT:
00611       LogTrace(metname)<<"going to z "<<pars[Z_P]<<std::endl;
00612       break;
00613     case PATHL_DT:
00614       LogTrace(metname)<<"going to pathL "<<pars[PATHL_P]<<std::endl;
00615       break;
00616     case PLANE_DT:
00617       {
00618         Point rPlane(pars[0], pars[1], pars[2]);
00619         Vector nPlane(pars[3], pars[4], pars[5]);
00620         LogTrace(metname)<<"going to plane r0:"<<rPlane<<" n:"<<nPlane<<std::endl;
00621       }
00622       break;
00623     case POINT_PCA_DT:
00624       {
00625         Point rDest(pars[0], pars[1], pars[2]);
00626         LogTrace(metname)<<"going to PCA to point "<<rDest<<std::endl;
00627       }
00628       break;
00629     case LINE_PCA_DT:
00630       {
00631         Point rDest1(pars[0], pars[1], pars[2]);
00632         Point rDest2(pars[3], pars[4], pars[5]);
00633         LogTrace(metname)<<"going to PCA to line "<<rDest1<<" - "<<rDest2<<std::endl;
00634       }
00635       break;
00636     default:
00637       LogTrace(metname)<<"going to NOT IMPLEMENTED"<<std::endl;
00638       break;
00639     }
00640     LogTrace(metname)<<"Made "<<nPoints_-1<<" steps and stopped at(cur step) "<<svCurrent->r3<<" nOsc "<<nOsc<<std::endl;
00641   }
00642   
00643   return result;
00644 }

const SteppingHelixStateInfo & SteppingHelixPropagator::propagate ( const SteppingHelixStateInfo ftsStart,
const GlobalPoint pDest1,
const GlobalPoint pDest2 
) const

Propagate to PCA to a line (given by 2 points) given a starting point.

Definition at line 283 of file SteppingHelixPropagator.cc.

References cIndex_(), e, lat::endl(), invalidState_, SteppingHelixStateInfo::isValid(), LINE_PCA_DT, muonGeometry::mag(), nPoints_, pars, propagate(), sendLogWarning_, setIState(), svBuf_, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

00284                                                                                                {
00285   
00286   if ((pDest1-pDest2).mag() < 1e-10 || !sStart.isValid()){
00287     if (sendLogWarning_){
00288       if ((pDest1-pDest2).mag() < 1e-10)
00289         edm::LogWarning("SteppingHelixPropagator")<<"Can't propagate: points are too close"
00290                                                   <<std::endl;
00291       if (!sStart.isValid())
00292         edm::LogWarning("SteppingHelixPropagator")<<"Can't propagate: invalid input state"
00293                                                   <<std::endl;
00294     }
00295     return invalidState_;
00296   }
00297   setIState(sStart);
00298   
00299   double pars[6] = {pDest1.x(), pDest1.y(), pDest1.z(),
00300                     pDest2.x(), pDest2.y(), pDest2.z()};
00301   
00302   propagate(LINE_PCA_DT, pars);
00303   
00304   return svBuf_[cIndex_(nPoints_-1)];
00305 }

const SteppingHelixStateInfo & SteppingHelixPropagator::propagate ( const SteppingHelixStateInfo ftsStart,
const GlobalPoint pDest 
) const

Propagate to PCA to point given a starting point.

Definition at line 262 of file SteppingHelixPropagator.cc.

References cIndex_(), lat::endl(), invalidState_, SteppingHelixStateInfo::isValid(), nPoints_, pars, POINT_PCA_DT, propagate(), sendLogWarning_, setIState(), svBuf_, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

00263                                                                    {
00264   
00265   if (! sStart.isValid()){
00266     if (sendLogWarning_){
00267       edm::LogWarning("SteppingHelixPropagator")<<"Can't propagate: invalid input state"
00268                                                 <<std::endl;
00269     }    
00270     return invalidState_;
00271   }
00272   setIState(sStart);
00273   
00274   double pars[6] = {pDest.x(), pDest.y(), pDest.z(), 0, 0, 0};
00275 
00276   
00277   propagate(POINT_PCA_DT, pars);
00278   
00279   return svBuf_[cIndex_(nPoints_-1)];
00280 }

const SteppingHelixStateInfo & SteppingHelixPropagator::propagate ( const SteppingHelixStateInfo ftsStart,
const Cylinder cDest 
) const

Propagate to Cylinder given a starting point (a Cylinder is assumed to be positioned at 0,0,0).

Definition at line 234 of file SteppingHelixPropagator.cc.

References cIndex_(), SteppingHelixStateInfo::dir, lat::endl(), invalidState_, SteppingHelixStateInfo::isValid(), nPoints_, pars, SteppingHelixStateInfo::path(), propagate(), Cylinder::radius(), RADIUS_DT, RADIUS_P, sendLogWarning_, setIState(), and svBuf_.

00235                                                                 {
00236   
00237   if (! sStart.isValid()){
00238     if (sendLogWarning_){
00239       edm::LogWarning("SteppingHelixPropagator")<<"Can't propagate: invalid input state"
00240                                                 <<std::endl;
00241     }    
00242     return invalidState_;
00243   }
00244   setIState(sStart);
00245   
00246   double pars[6] = {0,0,0,0,0,0};
00247   pars[RADIUS_P] = cDest.radius();
00248 
00249   
00250   propagate(RADIUS_DT, pars);
00251   
00252   //(re)set it before leaving: dir =1 (-1) if path increased (decreased) and 0 if it didn't change
00253   //need to implement this somewhere else as a separate function
00254   double lDir = 0;
00255   if (sStart.path() < svBuf_[cIndex_(nPoints_-1)].path()) lDir = 1.;
00256   if (sStart.path() > svBuf_[cIndex_(nPoints_-1)].path()) lDir = -1.;
00257   svBuf_[cIndex_(nPoints_-1)].dir = lDir;
00258   return svBuf_[cIndex_(nPoints_-1)];
00259 }

const SteppingHelixStateInfo & SteppingHelixPropagator::propagate ( const SteppingHelixStateInfo ftsStart,
const Plane pDest 
) const

Definition at line 204 of file SteppingHelixPropagator.cc.

References cIndex_(), SteppingHelixStateInfo::dir, lat::endl(), invalidState_, SteppingHelixStateInfo::isValid(), nPoints_, pars, SteppingHelixStateInfo::path(), PLANE_DT, GloballyPositioned< T >::position(), propagate(), GloballyPositioned< T >::rotation(), sendLogWarning_, setIState(), and svBuf_.

00205                                                              {
00206   
00207   if (! sStart.isValid()){
00208     if (sendLogWarning_){
00209       edm::LogWarning("SteppingHelixPropagator")<<"Can't propagate: invalid input state"
00210                                                 <<std::endl;
00211     }    
00212     return invalidState_;
00213   }
00214   setIState(sStart);
00215   
00216   GlobalPoint rPlane = pDest.position();
00217   GlobalVector nPlane(pDest.rotation().zx(), pDest.rotation().zy(), pDest.rotation().zz());
00218 
00219   double pars[6] = { pDest.position().x(), pDest.position().y(), pDest.position().z(),
00220                      pDest.rotation().zx(), pDest.rotation().zy(), pDest.rotation().zz() };
00221   
00222   propagate(PLANE_DT, pars);
00223   
00224   //(re)set it before leaving: dir =1 (-1) if path increased (decreased) and 0 if it didn't change
00225   //need to implement this somewhere else as a separate function
00226   double lDir = 0;
00227   if (sStart.path() < svBuf_[cIndex_(nPoints_-1)].path()) lDir = 1.;
00228   if (sStart.path() > svBuf_[cIndex_(nPoints_-1)].path()) lDir = -1.;
00229   svBuf_[cIndex_(nPoints_-1)].dir = lDir;
00230   return svBuf_[cIndex_(nPoints_-1)];
00231 }

const SteppingHelixStateInfo & SteppingHelixPropagator::propagate ( const SteppingHelixStateInfo ftsStart,
const Surface sDest 
) const

Propagate to Plane given a starting point.

Definition at line 182 of file SteppingHelixPropagator.cc.

References lat::endl(), invalidState_, SteppingHelixStateInfo::isValid(), propagate(), and sendLogWarning_.

00183                                                                {
00184   
00185   if (! sStart.isValid()){
00186     if (sendLogWarning_){
00187       edm::LogWarning("SteppingHelixPropagator")<<"Can't propagate: invalid input state"
00188                                                 <<std::endl;
00189     }
00190     return invalidState_;
00191   }
00192 
00193   const Plane* pDest = dynamic_cast<const Plane*>(&sDest);
00194   if (pDest != 0) return propagate(sStart, *pDest);
00195 
00196   const Cylinder* cDest = dynamic_cast<const Cylinder*>(&sDest);
00197   if (cDest != 0) return propagate(sStart, *cDest);
00198 
00199   throw PropagationException("The surface is neither Cylinder nor Plane");
00200 
00201 }

FreeTrajectoryState SteppingHelixPropagator::propagate ( const FreeTrajectoryState ftsStart,
const reco::BeamSpot beamSpot 
) const [virtual]

Propagate to PCA to a line determined by BeamSpot position and slope given a starting point.

Reimplemented from Propagator.

Definition at line 106 of file SteppingHelixPropagator.cc.

References propagateWithPath().

00108 {
00109   return propagateWithPath(ftsStart, beamSpot).first;
00110 }

FreeTrajectoryState SteppingHelixPropagator::propagate ( const FreeTrajectoryState ftsStart,
const GlobalPoint pDest1,
const GlobalPoint pDest2 
) const [virtual]

Propagate to PCA to a line (given by 2 points) given a starting point.

Definition at line 99 of file SteppingHelixPropagator.cc.

References propagateWithPath().

00101 {
00102   return propagateWithPath(ftsStart, pDest1, pDest2).first;
00103 }

FreeTrajectoryState SteppingHelixPropagator::propagate ( const FreeTrajectoryState ftsStart,
const GlobalPoint pDest 
) const [virtual]

Propagate to PCA to point given a starting point.

Definition at line 93 of file SteppingHelixPropagator.cc.

References propagateWithPath().

00094 {
00095   return propagateWithPath(ftsStart, pDest).first;
00096 }

TrajectoryStateOnSurface SteppingHelixPropagator::propagate ( const FreeTrajectoryState ftsStart,
const Cylinder cDest 
) const [virtual]

Propagate to Cylinder given a starting point (a Cylinder is assumed to be positioned at 0,0,0).

Implements Propagator.

Definition at line 87 of file SteppingHelixPropagator.cc.

References propagateWithPath().

00088 {
00089   return propagateWithPath(ftsStart, cDest).first;
00090 }

TrajectoryStateOnSurface SteppingHelixPropagator::propagate ( const FreeTrajectoryState ftsStart,
const Plane pDest 
) const [virtual]

Propagate to Plane given a starting point.

Implements Propagator.

Definition at line 82 of file SteppingHelixPropagator.cc.

References propagateWithPath().

Referenced by AlCaHOCalibProducer::produce(), propagate(), propagateWithPath(), VisMuon::refitTrack(), and VisEventSetupService::refitTrack().

00082                                                                                                 {
00083   return propagateWithPath(ftsStart, pDest).first;
00084 }

std::pair< FreeTrajectoryState, double > SteppingHelixPropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const reco::BeamSpot beamSpot 
) const [virtual]

Propagate to PCA to a line (given by beamSpot position and slope) given a starting point.

Definition at line 172 of file SteppingHelixPropagator.cc.

References reco::BeamSpot::dxdz(), reco::BeamSpot::dydz(), e3, propagateWithPath(), reco::BeamSpot::x0(), reco::BeamSpot::y0(), and reco::BeamSpot::z0().

00173                                                                                {
00174   GlobalPoint pDest1(beamSpot.x0(), beamSpot.y0(), beamSpot.z0());
00175   GlobalPoint pDest2(pDest1.x() + beamSpot.dxdz()*1e3, 
00176                      pDest1.y() + beamSpot.dydz()*1e3,
00177                      pDest1.z() + 1e3);
00178   return propagateWithPath(ftsStart, pDest1, pDest2);
00179 }

std::pair< FreeTrajectoryState, double > SteppingHelixPropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const GlobalPoint pDest1,
const GlobalPoint pDest2 
) const [virtual]

Propagate to PCA to a line (given by 2 points) given a starting point.

Reimplemented from Propagator.

Definition at line 150 of file SteppingHelixPropagator.cc.

References e, lat::endl(), SteppingHelixStateInfo::getFreeState(), muonGeometry::mag(), SteppingHelixStateInfo::path(), propagate(), sendLogWarning_, setIState(), and svBuf_.

00151                                                                                                        {
00152 
00153   if ((pDest1-pDest2).mag() < 1e-10){
00154     if (sendLogWarning_){
00155       edm::LogWarning("SteppingHelixPropagator")<<"Can't propagate: the points should be at a bigger distance"
00156                                                 <<std::endl;
00157     }
00158     return FtsPP();
00159   }
00160   setIState(SteppingHelixStateInfo(ftsStart));
00161   
00162   const StateInfo& svCurrent = propagate(svBuf_[0], pDest1, pDest2);
00163 
00164   FreeTrajectoryState ftsDest;
00165   svCurrent.getFreeState(ftsDest);
00166 
00167   return FtsPP(ftsDest, svCurrent.path());
00168 }

std::pair< FreeTrajectoryState, double > SteppingHelixPropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const GlobalPoint pDest 
) const [virtual]

Propagate to PCA to point given a starting point.

Definition at line 137 of file SteppingHelixPropagator.cc.

References SteppingHelixStateInfo::getFreeState(), SteppingHelixStateInfo::path(), propagate(), setIState(), and svBuf_.

00138                                                                            {
00139   setIState(SteppingHelixStateInfo(ftsStart));
00140 
00141   const StateInfo& svCurrent = propagate(svBuf_[0], pDest);
00142 
00143   FreeTrajectoryState ftsDest;
00144   svCurrent.getFreeState(ftsDest);
00145 
00146   return FtsPP(ftsDest, svCurrent.path());
00147 }

std::pair< TrajectoryStateOnSurface, double > SteppingHelixPropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const Cylinder cDest 
) const [virtual]

Propagate to Cylinder given a starting point: return final TrajectoryState and path length from start to this point.

Implements Propagator.

Definition at line 125 of file SteppingHelixPropagator.cc.

References SteppingHelixStateInfo::getStateOnSurface(), SteppingHelixStateInfo::path(), propagate(), returnTangentPlane_, setIState(), and svBuf_.

00126                                                                         {
00127 
00128   setIState(SteppingHelixStateInfo(ftsStart));
00129 
00130   const StateInfo& svCurrent = propagate(svBuf_[0], cDest);
00131 
00132   return TsosPP(svCurrent.getStateOnSurface(cDest, returnTangentPlane_), svCurrent.path());
00133 }

std::pair< TrajectoryStateOnSurface, double > SteppingHelixPropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const Plane pDest 
) const [virtual]

Propagate to Plane given a starting point: return final TrajectoryState and path length from start to this point.

Implements Propagator.

Definition at line 114 of file SteppingHelixPropagator.cc.

References SteppingHelixStateInfo::getStateOnSurface(), SteppingHelixStateInfo::path(), propagate(), setIState(), and svBuf_.

Referenced by PropagateToCal::propagate(), propagate(), MuonUpdatorAtVertex::propagate(), and propagateWithPath().

00115                                                                      {
00116 
00117   setIState(SteppingHelixStateInfo(ftsStart));
00118 
00119   const StateInfo& svCurrent = propagate(svBuf_[0], pDest);
00120 
00121   return TsosPP(svCurrent.getStateOnSurface(pDest), svCurrent.path());
00122 }

SteppingHelixPropagator::Result SteppingHelixPropagator::refToDest ( SteppingHelixPropagator::DestType  dest,
const SteppingHelixPropagator::StateInfo sv,
const double  pars[6],
double &  dist,
double &  tanDist,
PropagationDirection refDirection,
double  fastSkipDist = 1e12 
) const [protected]

(Internals) determine distance and direction from the current position to the plane

Definition at line 1498 of file SteppingHelixPropagator.cc.

References alongMomentum, anyDirection, SteppingHelixStateInfo::bf, CONE_DT, funct::cos(), debug_, dot(), e, e4, lat::endl(), i, SteppingHelixStateInfo::INACC, LINE_PCA_DT, LogTrace, muonGeometry::mag(), norm, SteppingHelixStateInfo::NOT_IMPLEMENTED, SteppingHelixStateInfo::OK, oppositeToMomentum, SteppingHelixStateInfo::p3, SteppingHelixStateInfo::path(), PATHL_DT, PATHL_P, Geom::pi(), PLANE_DT, POINT_PCA_DT, SteppingHelixStateInfo::q, SteppingHelixStateInfo::r3, RADIUS_DT, RADIUS_P, HLT_VtxMuL3::result, funct::sin(), funct::sqrt(), theta, Z_DT, and Z_P.

Referenced by propagate(), refToMagVolume(), and refToMatVolume().

01503                                                              {
01504   static const std::string metname = "SteppingHelixPropagator";
01505   Result result = SteppingHelixStateInfo::NOT_IMPLEMENTED;
01506   double curZ = sv.r3.z();
01507   double curR = sv.r3.perp();
01508 
01509   switch (dest){
01510   case RADIUS_DT:
01511     {
01512       double cosDPhiPR = cos((sv.r3.deltaPhi(sv.p3)));
01513       dist = pars[RADIUS_P] - curR;
01514       refDirection = dist*cosDPhiPR > 0 ?
01515         alongMomentum : oppositeToMomentum;
01516       if (fabs(dist) > fastSkipDist){
01517         result = SteppingHelixStateInfo::INACC;
01518         break;
01519       }
01520       tanDist = dist/sv.p3.perp()*sv.p3.mag();      
01521       result = SteppingHelixStateInfo::OK;
01522     }
01523     break;
01524   case Z_DT:
01525     {
01526       dist = pars[Z_P] - curZ;
01527       refDirection = sv.p3.z()*dist > 0. ?
01528         alongMomentum : oppositeToMomentum;
01529       if (fabs(dist) > fastSkipDist){
01530         result = SteppingHelixStateInfo::INACC;
01531         break;
01532       }
01533       tanDist = dist/sv.p3.z()*sv.p3.mag();
01534       result = SteppingHelixStateInfo::OK;
01535     }
01536     break;
01537   case PLANE_DT:
01538     {
01539       Point rPlane(pars[0], pars[1], pars[2]);
01540       Vector nPlane(pars[3], pars[4], pars[5]);
01541       
01542       double dRDotN = (sv.r3 - rPlane).dot(nPlane);
01543       
01544       dist = fabs(dRDotN);
01545       double p0 = sv.p3.mag();
01546       double tN = sv.p3.dot(nPlane)/p0;
01547       refDirection = tN*dRDotN < 0. ?
01548         alongMomentum : oppositeToMomentum;
01549       if (fabs(dist) > fastSkipDist){
01550         result = SteppingHelixStateInfo::INACC;
01551         break;
01552       }
01553       double b0 = sv.bf.mag();
01554       if (fabs(tN)>1e-24) tanDist = -dRDotN/tN;
01555       if (fabs(tanDist) > 1e4) tanDist = 1e4;
01556       if (b0>1.5e-6){
01557         double kVal = 0.0029979*sv.q/p0*b0;
01558         double aVal = tanDist*kVal;
01559         Vector lVec = sv.bf.cross(sv.p3); lVec *= 1./b0/p0;
01560         double bVal = lVec.dot(nPlane)/tN;
01561         if (fabs(aVal*bVal)< 0.3){
01562           double cVal = - sv.bf.cross(lVec).dot(nPlane)/b0/tN; //1- bHat_n*bHat_tau/tau_n;
01563           double tanDCorr = bVal/2. + (bVal*bVal/2. + cVal/6)*aVal; 
01564           tanDCorr *= aVal;
01565           //+ (-bVal/24. + 0.625*bVal*bVal*bVal + 5./12.*bVal*cVal)*aVal*aVal*aVal
01566           if (debug_) LogTrace(metname)<<tanDist<<" vs "<<tanDist*(1.+tanDCorr)<<" corr "<<tanDist*tanDCorr<<std::endl;
01567           tanDist *= (1.+tanDCorr);
01568         } else {
01569           if (debug_) LogTrace(metname)<<"ABVal "<< fabs(aVal*bVal)
01570                                        <<" = "<<aVal<<" * "<<bVal<<" too large:: will not converge"<<std::endl;
01571         }
01572       }
01573       result = SteppingHelixStateInfo::OK;
01574     }
01575     break;
01576   case CONE_DT:
01577     {
01578       //assumes the cone axis/vertex is along z
01579       Point cVertex(pars[0], pars[1], pars[2]);
01580       Vector relV3 = sv.r3 - cVertex;
01581       double theta(pars[3]);
01582       if (cVertex.perp() < 1e-5){
01583         double sinDTheta = sin(theta-relV3.theta());
01584         double cosDTheta = cos(theta-relV3.theta());
01585         bool isInside = sin(theta) > sin(relV3.theta()) 
01586           && cos(theta)*cos(relV3.theta()) > 0;
01587         dist = isInside || cosDTheta > 0 ? 
01588           relV3.mag()*sinDTheta : relV3.mag();
01589         double normPhi = isInside ? 
01590           Geom::pi() + relV3.phi() : relV3.phi();
01591         double normTheta = theta > Geom::pi()/2. ?
01592           ( isInside ? 1.5*Geom::pi()  - theta : theta - Geom::pi()/2. )
01593           : ( isInside ? Geom::pi()/2. - theta : theta + Geom::pi()/2 );
01594         //this is a normVector from the cone to the point
01595         Vector norm; norm.setRThetaPhi(fabs(dist), normTheta, normPhi);
01596         double sineConeP = sin(theta - sv.p3.theta());
01597 
01598         double sinSolid = norm.dot(sv.p3)/fabs(dist)/sv.p3.mag();
01599         tanDist = fabs(sinSolid) > fabs(sineConeP) ? dist/fabs(sinSolid) : dist/fabs(sineConeP);
01600 
01601 
01602         refDirection = sinSolid > 0 ?
01603           oppositeToMomentum : alongMomentum;
01604         if (debug_){
01605           LogTrace(metname)<<"Cone pars: theta "<<theta
01606                            <<" normTheta "<<norm.theta()
01607                            <<" p3Theta "<<sv.p3.theta()
01608                            <<" sinD: "<< sineConeP
01609                            <<" sinSolid "<<sinSolid;
01610         }
01611         if (fabs(dist) > fastSkipDist){
01612           result = SteppingHelixStateInfo::INACC;
01613           break;
01614         }
01615         if (debug_){
01616           LogTrace(metname)<<"refToDest:toCone the point is "
01617                            <<(isInside? "in" : "out")<<"side the cone"
01618                            <<std::endl;
01619         }
01620       }
01621       result = SteppingHelixStateInfo::OK;
01622     }
01623     break;
01624     //   case CYLINDER_DT:
01625     //     break;
01626   case PATHL_DT:
01627     {
01628       double curS = fabs(sv.path());
01629       dist = pars[PATHL_P] - curS;
01630       refDirection = pars[PATHL_P] > 0 ? 
01631         alongMomentum : oppositeToMomentum;
01632       if (fabs(dist) > fastSkipDist){
01633         result = SteppingHelixStateInfo::INACC;
01634         break;
01635       }
01636       tanDist = dist;
01637       result = SteppingHelixStateInfo::OK;
01638     }
01639     break;
01640   case POINT_PCA_DT:
01641     {
01642       Point pDest(pars[0], pars[1], pars[2]);
01643       dist = (sv.r3 - pDest).mag()+ 1e-24;//add a small number to avoid 1/0
01644       tanDist = (sv.r3.dot(sv.p3) - pDest.dot(sv.p3))/sv.p3.mag();
01645       //account for bending in magnetic field (quite approximate)
01646       double b0 = sv.bf.mag();
01647       if (b0>1.5e-6){
01648         double p0 = sv.p3.mag();
01649         double kVal = 0.0029979*sv.q/p0*b0;
01650         double aVal = fabs(dist*kVal);
01651         tanDist *= 1./(1.+ aVal);
01652         if (debug_) LogTrace(metname)<<"corrected by aVal "<<aVal<<" to "<<tanDist;
01653       }
01654       refDirection = tanDist < 0 ?
01655         alongMomentum : oppositeToMomentum;
01656       result = SteppingHelixStateInfo::OK;
01657     }
01658     break;
01659   case LINE_PCA_DT:
01660     {
01661       Point rLine(pars[0], pars[1], pars[2]);
01662       Vector dLine(pars[3], pars[4], pars[5]);
01663       dLine = (dLine - rLine);
01664       dLine *= 1./dLine.mag(); if (debug_) LogTrace(metname)<<"dLine "<<dLine;
01665 
01666       Vector dR = sv.r3 - rLine;
01667       Vector dRPerp = dR - dLine*(dR.dot(dLine)); if (debug_) LogTrace(metname)<<"dRperp "<<dRPerp;
01668       dist = dRPerp.mag() + 1e-24;//add a small number to avoid 1/0
01669       tanDist = dRPerp.dot(sv.p3)/sv.p3.mag();
01670       //angle wrt line
01671       double cosAlpha = dLine.dot(sv.p3)/sv.p3.mag();
01672       tanDist *= fabs(1./sqrt(fabs(1.-cosAlpha*cosAlpha)+1e-96));
01673       //correct for dPhi in magnetic field: this isn't made quite right here 
01674       //(the angle between the line and the trajectory plane is neglected .. conservative)
01675       double b0 = sv.bf.mag();
01676       if (b0>1.5e-6){
01677         double p0 = sv.p3.mag();
01678         double kVal = 0.0029979*sv.q/p0*b0;
01679         double aVal = fabs(dist*kVal);
01680         tanDist *= 1./(1.+ aVal);
01681         if (debug_) LogTrace(metname)<<"corrected by aVal "<<aVal<<" to "<<tanDist;
01682       }
01683       refDirection = tanDist < 0 ?
01684         alongMomentum : oppositeToMomentum;
01685       result = SteppingHelixStateInfo::OK;
01686     }
01687     break;
01688   default:
01689     {
01690       //some large number
01691       dist = 1e12;
01692       tanDist = 1e12;
01693       refDirection = anyDirection;
01694       result = SteppingHelixStateInfo::NOT_IMPLEMENTED;
01695     }
01696     break;
01697   }
01698 
01699   double tanDistConstrained = tanDist;
01700   if (fabs(tanDist/dist) > 4) tanDistConstrained *= fabs(dist/tanDist*4.);
01701 
01702   if (debug_){
01703     LogTrace(metname)<<"refToDest input: dest"<<dest<<" pars[]: ";
01704     for (int i = 0; i < 6; i++){
01705       LogTrace(metname)<<", "<<i<<" "<<pars[i];
01706     }
01707     LogTrace(metname)<<std::endl;
01708     LogTrace(metname)<<"refToDest output: "
01709                      <<"\t dist" << dist
01710                      <<"\t tanDist "<< tanDist      
01711                      <<"\t tanDistConstr "<< tanDistConstrained      
01712                      <<"\t refDirection "<< refDirection
01713                      <<std::endl;
01714   }
01715   tanDist = tanDistConstrained;
01716 
01717   return result;
01718 }

SteppingHelixPropagator::Result SteppingHelixPropagator::refToMagVolume ( const SteppingHelixPropagator::StateInfo sv,
PropagationDirection  dir,
double &  dist,
double &  tanDist,
double  fastSkipDist = 1e12,
bool  expectNewMagVolume = false 
) const [protected]

(Internals) determine distance and direction from the current position to the boundary of current mag volume

Definition at line 1721 of file SteppingHelixPropagator.cc.

References alongMomentum, CONE_DT, debug_, lat::endl(), MagVolume::faces(), i, SteppingHelixStateInfo::INACC, MagVolume::inside(), VolumeBasedMagneticField::isZSymmetric(), j, LogTrace, SteppingHelixStateInfo::magVol, DDSolidShapesName::name(), SteppingHelixStateInfo::NOT_IMPLEMENTED, SteppingHelixStateInfo::OK, Cone::openingAngle(), SteppingHelixStateInfo::p3, pars, Geom::pi(), PLANE_DT, GloballyPositioned< T >::position(), SteppingHelixStateInfo::r3, Cylinder::radius(), RADIUS_DT, RADIUS_P, refToDest(), HLT_VtxMuL3::result, GloballyPositioned< T >::rotation(), MagVolume::shapeType(), SteppingHelixStateInfo::UNDEFINED, UNDEFINED_DT, vbField_, Cone::vertex(), SteppingHelixStateInfo::WRONG_VOLUME, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by propagate().

01724                                                                                            {
01725 
01726   static const std::string metname = "SteppingHelixPropagator";
01727   Result result = SteppingHelixStateInfo::NOT_IMPLEMENTED;
01728   const MagVolume* cVol = sv.magVol;
01729 
01730   if (cVol == 0) return result;
01731   const std::vector<VolumeSide>& cVolFaces(cVol->faces());
01732 
01733   double distToFace[6] = {0,0,0,0,0,0};
01734   double tanDistToFace[6] = {0,0,0,0,0,0};
01735   PropagationDirection refDirectionToFace[6];
01736   Result resultToFace[6];
01737   int iFDest = -1;
01738   int iDistMin = -1;
01739   
01740   uint iFDestSorted[6] = {0,0,0,0,0,0};
01741   uint nDestSorted =0;
01742   uint nearParallels = 0;
01743 
01744   if (debug_){
01745     LogTrace(metname)<<"Trying volume "<<DDSolidShapesName::name(cVol->shapeType())
01746                      <<" with "<<cVolFaces.size()<<" faces"<<std::endl;
01747   }
01748 
01749   for (uint iFace = 0; iFace < cVolFaces.size(); iFace++){
01750     if (iFace > 5){
01751       LogTrace(metname)<<"Too many faces"<<std::endl;
01752     }
01753     if (debug_){
01754       LogTrace(metname)<<"Start with face "<<iFace<<std::endl;
01755     }
01756 //     const Plane* cPlane = dynamic_cast<const Plane*>(&cVolFaces[iFace].surface());
01757 //     const Cylinder* cCyl = dynamic_cast<const Cylinder*>(&cVolFaces[iFace].surface());
01758 //     const Cone* cCone = dynamic_cast<const Cone*>(&cVolFaces[iFace].surface());
01759     const Surface* cPlane = 0; //only need to know the loc->glob transform
01760     const Cylinder* cCyl = 0;
01761     const Cone* cCone = 0;
01762     if (typeid(cVolFaces[iFace].surface()) == typeid(const Plane&)){
01763       cPlane = &cVolFaces[iFace].surface();
01764     } else if (typeid(cVolFaces[iFace].surface()) == typeid(const Cylinder&)){
01765       cCyl = dynamic_cast<const Cylinder*>(&cVolFaces[iFace].surface());
01766     } else if (typeid(cVolFaces[iFace].surface()) == typeid(const Cone&)){
01767       cCone = dynamic_cast<const Cone*>(&cVolFaces[iFace].surface());
01768     } else {
01769       edm::LogWarning(metname)<<"Could not cast a volume side surface to a known type"<<std::endl;
01770     }
01771     
01772     if (debug_){
01773       if (cPlane!=0) LogTrace(metname)<<"The face is a plane at "<<cPlane<<std::endl;
01774       if (cCyl!=0) LogTrace(metname)<<"The face is a cylinder at "<<cCyl<<std::endl;
01775     }
01776 
01777     double pars[6] = {0,0,0,0,0,0};
01778     DestType dType = UNDEFINED_DT;
01779     if (cPlane != 0){
01780       GlobalPoint rPlane = cPlane->position();
01781       // = cPlane->toGlobal(LocalVector(0,0,1.)); nPlane = nPlane.unit();
01782       GlobalVector nPlane(cPlane->rotation().zx(), cPlane->rotation().zy(), cPlane->rotation().zz());
01783       
01784       if (sv.r3.z() < 0 || !vbField_->isZSymmetric() ){
01785         pars[0] = rPlane.x(); pars[1] = rPlane.y(); pars[2] = rPlane.z();
01786         pars[3] = nPlane.x(); pars[4] = nPlane.y(); pars[5] = nPlane.z();
01787       } else {
01788         pars[0] = rPlane.x(); pars[1] = rPlane.y(); pars[2] = -rPlane.z();
01789         pars[3] = nPlane.x(); pars[4] = nPlane.y(); pars[5] = -nPlane.z();
01790       }
01791       dType = PLANE_DT;
01792     } else if (cCyl != 0){
01793       if (debug_){
01794         LogTrace(metname)<<"Cylinder at "<<cCyl->position()
01795                          <<" rorated by "<<cCyl->rotation()
01796                          <<std::endl;
01797       }
01798       pars[RADIUS_P] = cCyl->radius();
01799       dType = RADIUS_DT;
01800     } else if (cCone != 0){
01801       if (debug_){
01802         LogTrace(metname)<<"Cone at "<<cCone->position()
01803                          <<" rorated by "<<cCone->rotation()
01804                          <<" vertex at "<<cCone->vertex()
01805                          <<" angle of "<<cCone->openingAngle()
01806                          <<std::endl;
01807       }
01808       if (sv.r3.z() < 0 || !vbField_->isZSymmetric()){
01809         pars[0] = cCone->vertex().x(); pars[1] = cCone->vertex().y(); 
01810         pars[2] = cCone->vertex().z();
01811         pars[3] = cCone->openingAngle();
01812       } else {
01813         pars[0] = cCone->vertex().x(); pars[1] = cCone->vertex().y(); 
01814         pars[2] = -cCone->vertex().z();
01815         pars[3] = Geom::pi() - cCone->openingAngle();
01816       }
01817       dType = CONE_DT;
01818     } else {
01819       LogTrace(metname)<<"Unknown surface"<<std::endl;
01820       resultToFace[iFace] = SteppingHelixStateInfo::UNDEFINED;
01821       continue;
01822     }
01823     resultToFace[iFace] = 
01824       refToDest(dType, sv, pars, 
01825                 distToFace[iFace], tanDistToFace[iFace], refDirectionToFace[iFace], fastSkipDist);    
01826     
01827     
01828     if (resultToFace[iFace] != SteppingHelixStateInfo::OK){
01829       if (resultToFace[iFace] == SteppingHelixStateInfo::INACC) result = SteppingHelixStateInfo::INACC;
01830     }
01831 
01832 
01833       
01834     //keep those in right direction for later use
01835     if (resultToFace[iFace] == SteppingHelixStateInfo::OK){
01836       bool isNearParallel = fabs(distToFace[iFace]/tanDistToFace[iFace]/tanDistToFace[iFace]) < 0.1/sv.p3.mag()
01837         && fabs(distToFace[iFace]/tanDistToFace[iFace]) < 0.05;
01838       if (refDirectionToFace[iFace] == dir || isNearParallel){
01839         if (isNearParallel) nearParallels++;
01840         iFDestSorted[nDestSorted] = iFace;
01841         nDestSorted++;
01842       }
01843     }
01844     
01845     //pick a shortest distance here (right dir only for now)
01846     if (refDirectionToFace[iFace] == dir){
01847       if (iDistMin == -1) iDistMin = iFace;
01848       else if (fabs(distToFace[iFace]) < fabs(distToFace[iDistMin])) iDistMin = iFace;
01849     }
01850     if (debug_) 
01851       LogTrace(metname)<<cVol<<" "<<iFace<<" "
01852                        <<tanDistToFace[iFace]<<" "<<distToFace[iFace]<<" "<<refDirectionToFace[iFace]<<" "<<dir<<std::endl;
01853     
01854   }
01855   
01856   for (uint i = 0;i<nDestSorted; ++i){
01857     uint iMax = nDestSorted-i-1;
01858     for (uint j=0;j<nDestSorted-i; ++j){
01859       if (fabs(tanDistToFace[iFDestSorted[j]]) > fabs(tanDistToFace[iFDestSorted[iMax]]) ){
01860         iMax = j;
01861       }
01862     }
01863     uint iTmp = iFDestSorted[nDestSorted-i-1];
01864     iFDestSorted[nDestSorted-i-1] = iFDestSorted[iMax];
01865     iFDestSorted[iMax] = iTmp;
01866   }
01867 
01868   if (debug_){
01869     for (uint i=0;i<nDestSorted;++i){
01870       LogTrace(metname)<<cVol<<" "<<i<<" "<<iFDestSorted[i]<<" "<<tanDistToFace[iFDestSorted[i]]<<std::endl;
01871     }
01872   }
01873 
01874   //now go from the shortest to the largest distance hoping to get a point in the volume.
01875   //other than in case of a near-parallel travel this should stop after the first try
01876   for (uint i=0; i<nDestSorted;++i){
01877     iFDest = iFDestSorted[i];
01878 
01879     double sign = dir == alongMomentum ? 1. : -1.;
01880     Point gPointEst(sv.r3);
01881     Vector lDelta(sv.p3); lDelta *= 1./sv.p3.mag()*sign*fabs(distToFace[iFDest]);
01882     gPointEst += lDelta;
01883     if (debug_){
01884       LogTrace(metname)<<"Linear est point "<<gPointEst
01885                        <<" for iFace "<<iFDest<<std::endl;
01886     }
01887     GlobalPoint gPointEstNegZ(gPointEst.x(), gPointEst.y(), -fabs(gPointEst.z()));
01888     GlobalPoint gPointEstNorZ(gPointEst.x(), gPointEst.y(), gPointEst.z() );
01889     if (  (vbField_->isZSymmetric() && cVol->inside(gPointEstNegZ))
01890           || ( !vbField_->isZSymmetric() && cVol->inside(gPointEstNorZ) )  ){
01891       if (debug_){
01892         LogTrace(metname)<<"The point is inside the volume"<<std::endl;
01893       }
01894       
01895       result = SteppingHelixStateInfo::OK;
01896       dist = distToFace[iFDest];
01897       tanDist = tanDistToFace[iFDest];
01898       if (debug_){
01899         LogTrace(metname)<<"Got a point near closest boundary -- face "<<iFDest<<std::endl;
01900       }
01901       break;
01902     }
01903   }
01904   
01905   if (result != SteppingHelixStateInfo::OK && expectNewMagVolume){
01906     double sign = dir == alongMomentum ? 1. : -1.;
01907 
01908     //check if it's a wrong volume situation
01909     if (nDestSorted-nearParallels > 0 ) result = SteppingHelixStateInfo::WRONG_VOLUME;
01910     else {
01911       //get here if all faces in the corr direction were skipped
01912       Point gPointEst(sv.r3);
01913       double lDist = fabs(distToFace[iDistMin]);
01914       if (lDist > fastSkipDist) lDist = fastSkipDist;
01915       Vector lDelta(sv.p3); lDelta *= 1./sv.p3.mag()*sign*lDist;
01916       gPointEst += lDelta;
01917       if (debug_){
01918         LogTrace(metname)<<"Linear est point to shortest dist "<<gPointEst
01919                          <<" for iFace "<<iDistMin<<" at distance "<<lDist*sign<<std::endl;
01920       }
01921       GlobalPoint gPointEstNegZ(gPointEst.x(), gPointEst.y(), -fabs(gPointEst.z()));
01922       GlobalPoint gPointEstNorZ(gPointEst.x(), gPointEst.y(), gPointEst.z() );
01923       if (  (vbField_->isZSymmetric() && cVol->inside(gPointEstNegZ))
01924           || ( !vbField_->isZSymmetric() && cVol->inside(gPointEstNorZ) ) ){
01925         if (debug_){
01926           LogTrace(metname)<<"The point is inside the volume"<<std::endl;
01927         }
01928         
01929       }else {
01930         result = SteppingHelixStateInfo::WRONG_VOLUME;
01931       }
01932     }
01933     
01934     if (result == SteppingHelixStateInfo::WRONG_VOLUME){
01935       dist = sign*0.05;
01936       tanDist = dist*1.01;
01937       if( debug_){
01938         LogTrace(metname)<<"Wrong volume located: return small dist, tandist"<<std::endl;
01939       }
01940     }
01941   }
01942 
01943   if (result == SteppingHelixStateInfo::INACC){
01944     if (debug_) LogTrace(metname)<<"All faces are too far"<<std::endl;
01945   } else if (result == SteppingHelixStateInfo::WRONG_VOLUME){
01946     if (debug_) LogTrace(metname)<<"Appear to be in a wrong volume"<<std::endl;
01947   } else if (result != SteppingHelixStateInfo::OK){
01948     if (debug_) LogTrace(metname)<<"Something else went wrong"<<std::endl;
01949   }
01950 
01951   
01952   return result;
01953 }

SteppingHelixPropagator::Result SteppingHelixPropagator::refToMatVolume ( const SteppingHelixPropagator::StateInfo sv,
PropagationDirection  dir,
double &  dist,
double &  tanDist,
double  fastSkipDist = 1e12 
) const [protected]

Definition at line 1957 of file SteppingHelixPropagator.cc.

References alongMomentum, CONE_DT, debug_, e, lat::endl(), SteppingHelixStateInfo::INACC, LogTrace, SteppingHelixStateInfo::NOT_IMPLEMENTED, SteppingHelixStateInfo::OK, SteppingHelixStateInfo::p3, pars, Geom::pi(), PLANE_DT, SteppingHelixStateInfo::r3, RADIUS_DT, RADIUS_P, refToDest(), HLT_VtxMuL3::result, SteppingHelixStateInfo::rzLims, funct::tan(), and UNDEFINED_DT.

Referenced by propagate().

01960                                                                   {
01961 
01962   static const std::string metname = "SteppingHelixPropagator";
01963   Result result = SteppingHelixStateInfo::NOT_IMPLEMENTED;
01964 
01965   double parLim[6] = {sv.rzLims.rMin, sv.rzLims.rMax, 
01966                       sv.rzLims.zMin, sv.rzLims.zMax, 
01967                       sv.rzLims.th1, sv.rzLims.th2 };
01968 
01969   double distToFace[4] = {0,0,0,0};
01970   double tanDistToFace[4] = {0,0,0,0};
01971   PropagationDirection refDirectionToFace[4];
01972   Result resultToFace[4];
01973   int iFDest = -1;
01974   
01975   for (uint iFace = 0; iFace < 4; iFace++){
01976     if (debug_){
01977       LogTrace(metname)<<"Start with mat face "<<iFace<<std::endl;
01978     }
01979 
01980     double pars[6] = {0,0,0,0,0,0};
01981     DestType dType = UNDEFINED_DT;
01982     if (iFace > 1){
01983       if (fabs(parLim[iFace+2])< 1e-6){//plane
01984         if (sv.r3.z() < 0){
01985           pars[0] = 0; pars[1] = 0; pars[2] = -parLim[iFace];
01986           pars[3] = 0; pars[4] = 0; pars[5] = 1;
01987         } else {
01988           pars[0] = 0; pars[1] = 0; pars[2] = parLim[iFace];
01989           pars[3] = 0; pars[4] = 0; pars[5] = 1;
01990         }
01991         dType = PLANE_DT;
01992       } else {
01993         if (sv.r3.z() > 0){
01994           pars[0] = 0; pars[1] = 0; 
01995           pars[2] = parLim[iFace];
01996           pars[3] = Geom::pi()/2. - parLim[iFace+2];
01997         } else {
01998           pars[0] = 0; pars[1] = 0; 
01999           pars[2] = - parLim[iFace];
02000           pars[3] = Geom::pi()/2. + parLim[iFace+2];
02001         }
02002         dType = CONE_DT;        
02003       }
02004     } else {
02005       pars[RADIUS_P] = parLim[iFace];
02006       dType = RADIUS_DT;
02007     }
02008 
02009     resultToFace[iFace] = 
02010       refToDest(dType, sv, pars, 
02011                 distToFace[iFace], tanDistToFace[iFace], refDirectionToFace[iFace], fastSkipDist);
02012     
02013     if (resultToFace[iFace] != SteppingHelixStateInfo::OK){
02014       if (resultToFace[iFace] == SteppingHelixStateInfo::INACC) result = SteppingHelixStateInfo::INACC;
02015       continue;
02016     }
02017     if (refDirectionToFace[iFace] == dir || fabs(distToFace[iFace]/tanDistToFace[iFace]) < 2e-2){
02018       double sign = dir == alongMomentum ? 1. : -1.;
02019       Point gPointEst(sv.r3);
02020       Vector lDelta(sv.p3); lDelta *= sign*fabs(distToFace[iFace])/sv.p3.mag();
02021       gPointEst += lDelta;
02022       if (debug_){
02023         LogTrace(metname)<<"Linear est point "<<gPointEst
02024                          <<std::endl;
02025       }
02026       double lZ = fabs(gPointEst.z());
02027       double lR = gPointEst.perp();
02028       if ( (lZ - parLim[2]) > lR*tan(parLim[4]) 
02029            && (lZ - parLim[3]) < lR*tan(parLim[5])  
02030            && lR > parLim[0] && lR < parLim[1]){
02031         if (debug_){
02032           LogTrace(metname)<<"The point is inside the volume"<<std::endl;
02033         }
02034         //OK, guessed a point still inside the volume
02035         if (iFDest == -1){
02036           iFDest = iFace;
02037         } else {
02038           if (fabs(tanDistToFace[iFDest]) > fabs(tanDistToFace[iFace])){
02039             iFDest = iFace;
02040           }
02041         }
02042       } else {
02043         if (debug_){
02044           LogTrace(metname)<<"The point is NOT inside the volume"<<std::endl;
02045         }
02046       }
02047     }
02048 
02049   }
02050   if (iFDest != -1){
02051     result = SteppingHelixStateInfo::OK;
02052     dist = distToFace[iFDest];
02053     tanDist = tanDistToFace[iFDest];
02054     if (debug_){
02055       LogTrace(metname)<<"Got a point near closest boundary -- face "<<iFDest<<std::endl;
02056     }
02057   } else {
02058     if (debug_){
02059       LogTrace(metname)<<"Failed to find a dest point inside the volume"<<std::endl;
02060     }
02061   }
02062 
02063   return result;
02064 }

void SteppingHelixPropagator::setDebug ( bool  debug  )  [inline]

Switch debug printouts (to cout) .. very verbose.

Definition at line 152 of file SteppingHelixPropagator.h.

References debug_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00152 { debug_ = debug;}

void SteppingHelixPropagator::setEndcapShiftsInZPosNeg ( double  valPos,
double  valNeg 
) [inline]

set shifts in Z for endcap pieces (includes EE, HE, ME, YE)

Definition at line 195 of file SteppingHelixPropagator.h.

References ecShiftNeg_, and ecShiftPos_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00195                                                              {
00196     ecShiftPos_ = valPos; ecShiftNeg_ = valNeg;
00197   }

void SteppingHelixPropagator::setIState ( const SteppingHelixStateInfo sStart  )  const [protected]

(Internals) Init starting point

Definition at line 307 of file SteppingHelixPropagator.cc.

References cIndex_(), SteppingHelixStateInfo::cov, SteppingHelixStateInfo::hasErrorPropagated_, SteppingHelixStateInfo::isComplete, loadState(), noErrorPropagation_, nPoints_, SteppingHelixStateInfo::p3, Propagator::propagationDirection(), SteppingHelixStateInfo::q, SteppingHelixStateInfo::r3, and svBuf_.

Referenced by propagate(), and propagateWithPath().

00307                                                                                   {
00308   nPoints_ = 0;
00309   svBuf_[cIndex_(nPoints_)] = sStart; //do this anyways to have a fresh start
00310   if (sStart.isComplete ) {
00311     svBuf_[cIndex_(nPoints_)] = sStart;
00312     nPoints_++;
00313   } else {
00314     loadState(svBuf_[cIndex_(nPoints_)], sStart.p3, sStart.r3, sStart.q, sStart.cov,
00315               propagationDirection());
00316     nPoints_++;
00317   }
00318   svBuf_[cIndex_(0)].hasErrorPropagated_ = sStart.hasErrorPropagated_ & !noErrorPropagation_;
00319 }

void SteppingHelixPropagator::setMaterialMode ( bool  noMaterial  )  [inline]

Switch for material effects mode: no material effects if true.

Definition at line 155 of file SteppingHelixPropagator.h.

References noMaterialMode_.

Referenced by MuonSimHitProducer::beginRun(), TrackDetectorAssociator::init(), HTrackAssociator::init(), SteppingHelixPropagatorESProducer::produce(), AlCaHOCalibProducer::produce(), and PropagateToCal::propagate().

00155 { noMaterialMode_ = noMaterial;}

void SteppingHelixPropagator::setNoErrorPropagation ( bool  noErrorPropagation  )  [inline]

Force no error propagation.

Definition at line 158 of file SteppingHelixPropagator.h.

References noErrorPropagation_.

Referenced by SteppingHelixPropagatorESProducer::produce(), and PropagateToCal::propagate().

00158 { noErrorPropagation_ = noErrorPropagation;}

void SteppingHelixPropagator::setRep ( SteppingHelixPropagator::Basis rep,
const SteppingHelixPropagator::Vector tau 
) const [protected]

Set/compute basis vectors for local coordinates at current step (called by incrementState).

Definition at line 835 of file SteppingHelixPropagator.cc.

References SteppingHelixPropagator::Basis::lX, SteppingHelixPropagator::Basis::lY, and SteppingHelixPropagator::Basis::lZ.

Referenced by makeAtomStep().

00836                                                                                     {
00837   Vector zRep(0., 0., 1.);
00838   rep.lX = tau;
00839   rep.lY = zRep.cross(tau); rep.lY *= 1./tau.perp();
00840   rep.lZ = rep.lX.cross(rep.lY);
00841 }

void SteppingHelixPropagator::setReturnTangentPlane ( bool  val  )  [inline]

flag to return tangent plane for non-plane input

Definition at line 173 of file SteppingHelixPropagator.h.

References returnTangentPlane_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00173 { returnTangentPlane_ = val;}

void SteppingHelixPropagator::setSendLogWarning ( bool  val  )  [inline]

flag to send LogWarning on failures

Definition at line 176 of file SteppingHelixPropagator.h.

References sendLogWarning_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00176 { sendLogWarning_ = val;}

void SteppingHelixPropagator::setUseInTeslaFromMagField ( bool  val  )  [inline]

force getting field value from MagneticField, not the geometric one

Definition at line 192 of file SteppingHelixPropagator.h.

References useInTeslaFromMagField_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00192 { useInTeslaFromMagField_ = val;}

void SteppingHelixPropagator::setUseIsYokeFlag ( bool  val  )  [inline]

(temporary?) flag to identify if the volume is yoke based on MagVolume internals works if useMatVolumes_ is also true

Definition at line 180 of file SteppingHelixPropagator.h.

References useIsYokeFlag_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00180 { useIsYokeFlag_ = val;}

void SteppingHelixPropagator::setUseMagVolumes ( bool  val  )  [inline]

Switch to using MagneticField Volumes .. as in VolumeBasedMagneticField.

Definition at line 167 of file SteppingHelixPropagator.h.

References useMagVolumes_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00167 { useMagVolumes_ = val;}

void SteppingHelixPropagator::setUseMatVolumes ( bool  val  )  [inline]

Switch to using Material Volumes .. internally defined for now.

Definition at line 170 of file SteppingHelixPropagator.h.

References useMatVolumes_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00170 { useMatVolumes_ = val;}

void SteppingHelixPropagator::setUseTuningForL2Speed ( bool  val  )  [inline]

will use bigger steps ~tuned for good-enough L2/Standalone reco use this in hope of a speed-up

Definition at line 184 of file SteppingHelixPropagator.h.

References useTuningForL2Speed_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00184 { useTuningForL2Speed_ = val;}

void SteppingHelixPropagator::setVBFPointer ( const VolumeBasedMagneticField val  )  [inline]

set VolumBasedField pointer allows to have geometry description in uniformField scenario only important/relevant in the barrel region

Definition at line 189 of file SteppingHelixPropagator.h.

References vbField_.

Referenced by SteppingHelixPropagatorESProducer::produce().

00189 { vbField_ = val;}


Member Data Documentation

bool SteppingHelixPropagator::applyRadX0Correction_ [private]

Definition at line 284 of file SteppingHelixPropagator.h.

Referenced by applyRadX0Correction(), makeAtomStep(), and SteppingHelixPropagator().

AlgebraicMatrix66 SteppingHelixPropagator::covRot_ [mutable, private]

Definition at line 275 of file SteppingHelixPropagator.h.

Referenced by SteppingHelixPropagator().

AlgebraicMatrix66 SteppingHelixPropagator::dCTransform_ [mutable, private]

Definition at line 276 of file SteppingHelixPropagator.h.

Referenced by makeAtomStep(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::debug_ [private]

Definition at line 281 of file SteppingHelixPropagator.h.

Referenced by getNextState(), isYokeVolume(), loadState(), makeAtomStep(), propagate(), refToDest(), refToMagVolume(), refToMatVolume(), setDebug(), and SteppingHelixPropagator().

double SteppingHelixPropagator::defaultStep_ [private]

Definition at line 293 of file SteppingHelixPropagator.h.

Referenced by propagate(), and SteppingHelixPropagator().

double SteppingHelixPropagator::ecShiftNeg_ [private]

Definition at line 296 of file SteppingHelixPropagator.h.

Referenced by getDeDx(), setEndcapShiftsInZPosNeg(), and SteppingHelixPropagator().

double SteppingHelixPropagator::ecShiftPos_ [private]

Definition at line 295 of file SteppingHelixPropagator.h.

Referenced by getDeDx(), setEndcapShiftsInZPosNeg(), and SteppingHelixPropagator().

const MagneticField* SteppingHelixPropagator::field_ [private]

Definition at line 278 of file SteppingHelixPropagator.h.

Referenced by getNextState(), loadState(), magneticField(), makeAtomStep(), propagate(), and SteppingHelixPropagator().

StateInfo SteppingHelixPropagator::invalidState_ [private]

Definition at line 273 of file SteppingHelixPropagator.h.

Referenced by propagate().

const int SteppingHelixPropagator::MAX_POINTS = 50 [static, private]

Definition at line 269 of file SteppingHelixPropagator.h.

Referenced by cIndex_(), and SteppingHelixPropagator().

const int SteppingHelixPropagator::MAX_STEPS = 10000 [static, private]

Definition at line 268 of file SteppingHelixPropagator.h.

Referenced by propagate().

bool SteppingHelixPropagator::noErrorPropagation_ [private]

Definition at line 283 of file SteppingHelixPropagator.h.

Referenced by setIState(), setNoErrorPropagation(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::noMaterialMode_ [private]

Definition at line 282 of file SteppingHelixPropagator.h.

Referenced by getDeDx(), setMaterialMode(), and SteppingHelixPropagator().

int SteppingHelixPropagator::nPoints_ [mutable, private]

Definition at line 270 of file SteppingHelixPropagator.h.

Referenced by propagate(), and setIState().

bool SteppingHelixPropagator::returnTangentPlane_ [private]

Definition at line 289 of file SteppingHelixPropagator.h.

Referenced by propagateWithPath(), setReturnTangentPlane(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::sendLogWarning_ [private]

Definition at line 290 of file SteppingHelixPropagator.h.

Referenced by propagate(), propagateWithPath(), setSendLogWarning(), and SteppingHelixPropagator().

StateInfo SteppingHelixPropagator::svBuf_[MAX_POINTS+1] [mutable, private]

Definition at line 271 of file SteppingHelixPropagator.h.

Referenced by propagate(), propagateWithPath(), setIState(), and SteppingHelixPropagator().

const AlgebraicSymMatrix66 SteppingHelixPropagator::unit66_ [private]

Definition at line 280 of file SteppingHelixPropagator.h.

Referenced by makeAtomStep(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::useInTeslaFromMagField_ [private]

Definition at line 288 of file SteppingHelixPropagator.h.

Referenced by getNextState(), loadState(), makeAtomStep(), setUseInTeslaFromMagField(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::useIsYokeFlag_ [private]

Definition at line 286 of file SteppingHelixPropagator.h.

Referenced by getDeDx(), getNextState(), loadState(), propagate(), setUseIsYokeFlag(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::useMagVolumes_ [private]

Definition at line 285 of file SteppingHelixPropagator.h.

Referenced by getDeDx(), getNextState(), loadState(), makeAtomStep(), propagate(), setUseMagVolumes(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::useMatVolumes_ [private]

Definition at line 287 of file SteppingHelixPropagator.h.

Referenced by propagate(), setUseMatVolumes(), and SteppingHelixPropagator().

bool SteppingHelixPropagator::useTuningForL2Speed_ [private]

Definition at line 291 of file SteppingHelixPropagator.h.

Referenced by propagate(), setUseTuningForL2Speed(), and SteppingHelixPropagator().

const VolumeBasedMagneticField* SteppingHelixPropagator::vbField_ [private]

Definition at line 279 of file SteppingHelixPropagator.h.

Referenced by getNextState(), loadState(), makeAtomStep(), refToMagVolume(), setVBFPointer(), and SteppingHelixPropagator().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:32:49 2009 for CMSSW by  doxygen 1.5.4