CMS 3D CMS Logo

Public Member Functions

PropagationDirectionChooser Class Reference

#include <PropagationDirectionChooser.h>

List of all members.

Public Member Functions

PropagationDirection operator() (const FreeTrajectoryState &, const Surface &) const
PropagationDirection operator() (const FreeTrajectoryState &, const Cylinder &) const
PropagationDirection operator() (const FreeTrajectoryState &, const Plane &) const
 PropagationDirectionChooser ()
 ~PropagationDirectionChooser ()

Detailed Description

Determination of propagation direction towards a surface. Uses code from the old BidirectionalPropagator.

Definition at line 15 of file PropagationDirectionChooser.h.


Constructor & Destructor Documentation

PropagationDirectionChooser::PropagationDirectionChooser ( ) [inline]

Definition at line 18 of file PropagationDirectionChooser.h.

{}
PropagationDirectionChooser::~PropagationDirectionChooser ( ) [inline]

Definition at line 20 of file PropagationDirectionChooser.h.

{}

Member Function Documentation

PropagationDirection PropagationDirectionChooser::operator() ( const FreeTrajectoryState fts,
const Surface surface 
) const

Definition at line 14 of file PropagationDirectionChooser.cc.

{
  // understand the surface type (expect cylinder/plane)
  // unfortunately dynamic_cast on Sun is broken -- cannot deal with const
  // so here we get rid of const
  Surface* sur = (Surface*)&surface;
  const Cylinder* bc = dynamic_cast<Cylinder*>(sur);
  const Plane* bp = dynamic_cast<Plane*>(sur);
  if (bc != 0) {
    //
    // cylinder
    //
    return (*this)(fts, *bc);
  }
  else if (bp != 0) {
    //
    // plane
    //
    return (*this)(fts, *bp);
  }
  else {
    throw PropagationException("The surface is neither Cylinder nor Plane");
  }
}
PropagationDirection PropagationDirectionChooser::operator() ( const FreeTrajectoryState fts,
const Cylinder cylinder 
) const

Definition at line 87 of file PropagationDirectionChooser.cc.

References alongMomentum, anyDirection, dir, FreeTrajectoryState::momentum(), oppositeToMomentum, AlCaHLTBitMon_ParallelJobs::p, PV3DBase< T, PVType, FrameType >::perp(), FreeTrajectoryState::position(), Cylinder::radius(), Surface::toGlobal(), PV3DBase< T, PVType, FrameType >::x(), x, and PV3DBase< T, PVType, FrameType >::y().

{
  // propagation to cylinder with axis along z
  // Copied from BidirectionalPropagator.
  PropagationDirection dir = anyDirection;

  GlobalPoint sp = cylinder.toGlobal(LocalPoint(0.,0.));
  if (sp.x() != 0. || sp.y() != 0.) {
    throw PropagationException("Cannot propagate to an arbitrary cylinder");
  }

  GlobalPoint x = fts.position();
  GlobalVector p = fts.momentum();

  const double small = 1.e-4; // 1 micron distance
  double rdiff = x.perp() - cylinder.radius();
  
  if ( fabs(rdiff) < small ) { 
    // already on cylinder, choose forward as default
    dir = alongMomentum;
  } 
  else {
    int rSign = ( rdiff >= 0. ) ? 1 : -1 ;
    if ( rSign == -1 ) {
      // starting point inside cylinder 
      // propagate always in direction of momentum
      dir = alongMomentum;
    }
    else {
      // starting point outside cylinder
      // choose direction so as to approach cylinder surface
      double proj = (x.x()*p.x() + x.y()*p.y()) * rSign;
      if (proj < 0.) {
        dir = alongMomentum;
      }
      else {
        dir = oppositeToMomentum;    
      }
    }
  }
  return dir;
}
PropagationDirection PropagationDirectionChooser::operator() ( const FreeTrajectoryState fts,
const Plane plane 
) const

Definition at line 41 of file PropagationDirectionChooser.cc.

References a, alongMomentum, anyDirection, b, dir, FreeTrajectoryState::momentum(), oppositeToMomentum, AlCaHLTBitMon_ParallelJobs::p, FreeTrajectoryState::position(), Surface::toGlobal(), Vector3DBase< T, FrameTag >::unit(), v, PV3DBase< T, PVType, FrameType >::x(), x, PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

{
  // propagation towards arbitrary plane
  // need computation of intersection point between plane 
  // and track (straight line approximation) to set direction
  // Copied from BidirectionalPropagator.
  PropagationDirection dir = anyDirection;

  GlobalPoint x = fts.position();
  GlobalVector p = fts.momentum().unit();
  GlobalPoint sp = plane.toGlobal(LocalPoint(0.,0.));
  GlobalVector v = plane.toGlobal(LocalVector(1.,0.,0.));
  GlobalVector w = plane.toGlobal(LocalVector(0.,1.,0.));
  AlgebraicMatrix33 a;
  a(0,0) = v.x(); a(0,1) = w.x(); a(0,2) = -p.x();
  a(1,0) = v.y(); a(1,1) = w.y(); a(1,2) = -p.y();
  a(2,0) = v.z(); a(2,1) = w.z(); a(2,2) = -p.z();
  AlgebraicVector3 b;
  b[0] = x.x() - sp.x();
  b[1] = x.y() - sp.y();
  b[2] = x.z() - sp.z();

  int ifail = !a.Invert();
  if (ifail == 0) {
    // plane and momentum are not parallel
    b = a*b;
    // b[2] nb of steps along unit vector parallel to momentum to reach plane

    const double small = 1.e-4; // 1 micron distance
    if (fabs(b[2]) < small) { 
      // already on plane, choose forward as default
      dir = alongMomentum;
    } 
    else if (b[2] < 0.) {
      dir = oppositeToMomentum;
    }
    else {
      dir = alongMomentum;    
    }
  } 
  return dir;
}