CMS 3D CMS Logo

Public Member Functions | Private Types | Private Member Functions | Private Attributes | Static Private Attributes

KFTrajectoryFitter Class Reference

#include <KFTrajectoryFitter.h>

Inheritance diagram for KFTrajectoryFitter:
TrajectoryFitter KFSplittingFitter

List of all members.

Public Member Functions

virtual KFTrajectoryFitterclone () const
const MeasurementEstimatorestimator () const
virtual std::vector< Trajectoryfit (const TrajectorySeed &aSeed, const RecHitContainer &hits) const
virtual std::vector< Trajectoryfit (const Trajectory &aTraj) const
virtual std::vector< Trajectoryfit (const TrajectorySeed &aSeed, const RecHitContainer &hits, const TSOS &firstPredTsos) const
 KFTrajectoryFitter (const Propagator &aPropagator, const TrajectoryStateUpdator &aUpdator, const MeasurementEstimator &aEstimator, int minHits=3, const DetLayerGeometry *detLayerGeometry=0)
 KFTrajectoryFitter (const Propagator *aPropagator, const TrajectoryStateUpdator *aUpdator, const MeasurementEstimator *aEstimator, int minHits=3, const DetLayerGeometry *detLayerGeometry=0)
const Propagatorpropagator () const
const TrajectoryStateUpdatorupdator () const
 ~KFTrajectoryFitter ()

Private Types

typedef FreeTrajectoryState FTS
typedef TrajectoryMeasurement TM
typedef TrajectoryStateOnSurface TSOS

Private Member Functions

 KFTrajectoryFitter (KFTrajectoryFitter const &)

Private Attributes

int minHits_
bool owner
const MeasurementEstimatortheEstimator
const DetLayerGeometrytheGeometry
const PropagatorthePropagator
const TrajectoryStateUpdatortheUpdator

Static Private Attributes

static const DetLayerGeometry dummyGeometry

Detailed Description

A Kalman track fit that splits matched RecHits into individual components before fitting them. Ported from ORCA

Date:
2007/05/09 14:17:57
Revision:
1.6
Author:
todorov, cerati

A Standard Kalman fit. Ported from ORCA

Date:
2011/01/06 17:04:16
Revision:
1.13
Author:
todorov, cerati

Definition at line 22 of file KFTrajectoryFitter.h.


Member Typedef Documentation

Reimplemented in KFSplittingFitter.

Definition at line 27 of file KFTrajectoryFitter.h.

Reimplemented in KFSplittingFitter.

Definition at line 28 of file KFTrajectoryFitter.h.

Reimplemented in KFSplittingFitter.

Definition at line 26 of file KFTrajectoryFitter.h.


Constructor & Destructor Documentation

KFTrajectoryFitter::KFTrajectoryFitter ( const Propagator aPropagator,
const TrajectoryStateUpdator aUpdator,
const MeasurementEstimator aEstimator,
int  minHits = 3,
const DetLayerGeometry detLayerGeometry = 0 
) [inline]

Definition at line 34 of file KFTrajectoryFitter.h.

References dummyGeometry, and theGeometry.

Referenced by clone().

                                                                 :
    thePropagator(aPropagator.clone()),
    theUpdator(aUpdator.clone()),
    theEstimator(aEstimator.clone()),
    theGeometry(detLayerGeometry),
    minHits_(minHits),
    owner(true){ 
    if(!theGeometry) theGeometry = &dummyGeometry;
    // FIXME. Why this first constructor is needed? who is using it? Can it be removed?
    // it is uses in many many places
    }
KFTrajectoryFitter::KFTrajectoryFitter ( const Propagator aPropagator,
const TrajectoryStateUpdator aUpdator,
const MeasurementEstimator aEstimator,
int  minHits = 3,
const DetLayerGeometry detLayerGeometry = 0 
) [inline]

Definition at line 51 of file KFTrajectoryFitter.h.

References dummyGeometry, and theGeometry.

                                                                 : 
    thePropagator(aPropagator),
    theUpdator(aUpdator),
    theEstimator(aEstimator),
    theGeometry(detLayerGeometry),
    minHits_(minHits),
    owner(false){
      if(!theGeometry) theGeometry = &dummyGeometry;
    }
KFTrajectoryFitter::~KFTrajectoryFitter ( ) [inline]

Definition at line 65 of file KFTrajectoryFitter.h.

References owner, theEstimator, thePropagator, and theUpdator.

                       {
    if (owner) {
      delete thePropagator;
      delete theUpdator;
      delete theEstimator;
    }
  }
KFTrajectoryFitter::KFTrajectoryFitter ( KFTrajectoryFitter const &  ) [private]

Member Function Documentation

virtual KFTrajectoryFitter* KFTrajectoryFitter::clone ( void  ) const [inline, virtual]
const MeasurementEstimator* KFTrajectoryFitter::estimator ( void  ) const [inline]

Definition at line 83 of file KFTrajectoryFitter.h.

References theEstimator.

Referenced by KFSplittingFitter::clone(), and fit().

{return theEstimator;}
std::vector< Trajectory > KFTrajectoryFitter::fit ( const TrajectorySeed aSeed,
const RecHitContainer hits,
const TSOS firstPredTsos 
) const [virtual]

Implements TrajectoryFitter.

Reimplemented in KFSplittingFitter.

Definition at line 39 of file KFTrajectoryFitter.cc.

References anyDirection, TransientTrackingRecHit::clone(), CSC(), CSCDetId, DetId::det(), TrajectorySeed::direction(), PXFDetId::disk(), GeomDetEnumerators::DT, estimator(), Trajectory::foundHits(), TrackingRecHit::geographicalId(), TransientTrackingRecHit::globalPosition(), DetLayerGeometry::idToLayer(), TrackingRecHit::isValid(), TrajectoryStateOnSurface::isValid(), j, TIBDetId::layer(), TOBDetId::layer(), PXBDetId::layer(), TrackingRecHit::localPosition(), TrackingRecHit::localPositionError(), LogDebug, LogTrace, minHits_, DetId::Muon, PV3DBase< T, PVType, FrameType >::perp(), PV3DBase< T, PVType, FrameType >::phi(), PixelSubdetector::PixelBarrel, PixelSubdetector::PixelEndcap, GloballyPositioned< T >::position(), Propagator::propagate(), Propagator::propagationDirection(), Trajectory::push(), DetId::rawId(), Trajectory::reserve(), runTheMatrix::ret, GloballyPositioned< T >::rotation(), dedefs::RPC, RPCDetId, edm::second(), DetId::subdetId(), TransientTrackingRecHit::surface(), sistripsummary::TEC, theGeometry, thePropagator, sistripsummary::TIB, sistripsummary::TID, sistripsummary::TOB, align::Tracker, TrajectoryStateUpdator::update(), updator(), TIDDetId::wheel(), TECDetId::wheel(), and PV3DBase< T, PVType, FrameType >::z().

{
  if(hits.empty()) return std::vector<Trajectory>();


  if (aSeed.direction() == anyDirection) 
    throw cms::Exception("KFTrajectoryFitter","TrajectorySeed::direction() requested but not set");
  
  SetPropagationDirection setDir(*thePropagator,aSeed.direction());

#ifdef EDM_LM_DEBUG
  LogDebug("TrackFitters")
    <<" +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
    <<" KFTrajectoryFitter::fit starting with " << hits.size() <<" HITS";
  
  for (unsigned int j=0;j<hits.size();j++) { 
    if (hits[j]->det()) 
      LogTrace("TrackFitters") << "hit #:" << j+1 << " rawId=" << hits[j]->det()->geographicalId().rawId() 
                               << " validity=" << hits[j]->isValid();
    else
      LogTrace("TrackFitters") << "hit #:" << j+1 << " Hit with no Det information";
  }
  LogTrace("TrackFitters") << " INITIAL STATE "<< firstPredTsos;
#endif

  std::vector<Trajectory> ret(1, Trajectory(aSeed, thePropagator->propagationDirection()));
  Trajectory & myTraj = ret.front();
  myTraj.reserve(hits.size());

  TSOS predTsos(firstPredTsos);
  TSOS currTsos;

  int hitcounter = 1;
  for(RecHitContainer::const_iterator ihit = hits.begin(); ihit != hits.end(); ++ihit, ++hitcounter) {

    const TransientTrackingRecHit & hit = (**ihit);

    if (hit.isValid() == false && hit.surface() == 0) {
      LogDebug("TrackFitters")<< " Error: invalid hit with no GeomDet attached .... skipping";
      continue;
    }

#ifdef EDM_LM_DEBUG
    if (hit.isValid()) {
      LogTrace("TrackFitters")
        << " ----------------- HIT #" << hitcounter << " (VALID)-----------------------\n"
        << "  HIT IS AT R   " << hit.globalPosition().perp() << "\n"
        << "  HIT IS AT Z   " << hit.globalPosition().z() << "\n"
        << "  HIT IS AT Phi " << hit.globalPosition().phi() << "\n"
        << "  HIT IS AT Loc " << hit.localPosition() << "\n"
        << "  WITH LocError " << hit.localPositionError() << "\n"
        << "  HIT IS AT Glo " << hit.globalPosition() << "\n"
        << "SURFACE POSITION" << "\n"
        << hit.surface()->position()<<"\n"
        << "SURFACE ROTATION" << "\n"
        << hit.surface()->rotation();
      
      DetId hitId = hit.geographicalId();

      LogTrace("TrackFitters") << " hit det=" << hitId.rawId();
      
      if(hitId.det() == DetId::Tracker) {
        if (hitId.subdetId() == StripSubdetector::TIB )  
          LogTrace("TrackFitters") << " I am TIB " << TIBDetId(hitId).layer();
        else if (hitId.subdetId() == StripSubdetector::TOB ) 
          LogTrace("TrackFitters") << " I am TOB " << TOBDetId(hitId).layer();
        else if (hitId.subdetId() == StripSubdetector::TEC ) 
          LogTrace("TrackFitters") << " I am TEC " << TECDetId(hitId).wheel();
        else if (hitId.subdetId() == StripSubdetector::TID ) 
          LogTrace("TrackFitters") << " I am TID " << TIDDetId(hitId).wheel();
        else if (hitId.subdetId() == StripSubdetector::TID ) 
          LogTrace("TrackFitters") << " I am TID " << TIDDetId(hitId).wheel();
        else if (hitId.subdetId() == (int) PixelSubdetector::PixelBarrel ) 
          LogTrace("TrackFitters") << " I am PixBar " << PXBDetId(hitId).layer();
        else if (hitId.subdetId() == (int) PixelSubdetector::PixelEndcap )
          LogTrace("TrackFitters") << " I am PixFwd " << PXFDetId(hitId).disk();
        else 
          LogTrace("TrackFitters") << " UNKNOWN TRACKER HIT TYPE ";
      }
      else if(hitId.det() == DetId::Muon) {
        if(hitId.subdetId() == MuonSubdetId::DT)
          LogTrace("TrackFitters") << " I am DT " << DTWireId(hitId);
        else if (hitId.subdetId() == MuonSubdetId::CSC )
          LogTrace("TrackFitters") << " I am CSC " << CSCDetId(hitId);
        else if (hitId.subdetId() == MuonSubdetId::RPC )
          LogTrace("TrackFitters") << " I am RPC " << RPCDetId(hitId);
        else 
          LogTrace("TrackFitters") << " UNKNOWN MUON HIT TYPE ";
      }
      else
        LogTrace("TrackFitters") << " UNKNOWN HIT TYPE ";
      
    } else {
      LogTrace("TrackFitters")
        << " ----------------- INVALID HIT #" << hitcounter << " -----------------------";      
    }
#endif    

    if ( hitcounter != 1) //no propagation needed for the first hit
      predTsos = thePropagator->propagate( currTsos, *(hit.surface()) );
    

    if(!predTsos.isValid()) {
      LogDebug("TrackFitters") 
        << "SOMETHING WRONG !" << "\n"
        << "KFTrajectoryFitter: predicted tsos not valid!\n" 
        << "current TSOS: " << currTsos << "\n";

      if(hit.surface()) LogTrace("TrackFitters") << "next Surface: " << hit.surface()->position() << "\n";

      if( myTraj.foundHits() >= minHits_ ) {
        LogDebug("TrackFitters") << " breaking trajectory" << "\n";
        break;      
      } else {        
        LogDebug("TrackFitters") << " killing trajectory" << "\n";       
        return std::vector<Trajectory>();
      }
    }
    
    if(hit.isValid()) {
      //update
      LogTrace("TrackFitters") << "THE HIT IS VALID: updating hit with predTsos";
      TransientTrackingRecHit::RecHitPointer preciseHit = hit.clone(predTsos);

      if (preciseHit->isValid() == false){
        LogTrace("TrackFitters") << "THE Precise HIT IS NOT VALID: using currTsos = predTsos" << "\n";
        currTsos = predTsos;
        myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId()) ));

      }else{
        LogTrace("TrackFitters") << "THE Precise HIT IS VALID: updating currTsos" << "\n";
        currTsos = updator()->update(predTsos, *preciseHit);
        //check for valid hits with no det (refitter with constraints)
        if (!currTsos.isValid()){
          edm::LogError("FailedUpdate")<<"updating with the hit failed. Not updating the trajectory with the hit";
          myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId())  ));
          //There is a no-fail policy here. So, it's time to give up
          //Keep the traj with invalid TSOS so that it's clear what happened
          if( myTraj.foundHits() >= minHits_ ) {
            LogDebug("TrackFitters") << " breaking trajectory" << "\n";
            break;      
          } else {        
            LogDebug("TrackFitters") << " killing trajectory" << "\n";       
            return std::vector<Trajectory>();
          }
        }
        else{
          if (preciseHit->det()) myTraj.push(TM(predTsos, currTsos, preciseHit,
                                                estimator()->estimate(predTsos, *preciseHit).second,
                                                theGeometry->idToLayer(preciseHit->geographicalId())  ));
          else myTraj.push(TM(predTsos, currTsos, preciseHit,
                              estimator()->estimate(predTsos, *preciseHit).second));
        }
      }
    } else {
      //no update
      LogDebug("TrackFitters") << "THE HIT IS NOT VALID: using currTsos" << "\n";
      currTsos = predTsos;
      myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId())  ));
    }

    LogTrace("TrackFitters")
      << "predTsos !" << "\n"
      << predTsos << "\n"
      <<"currTsos !" << "\n"
      << currTsos;
  }  

  LogDebug("TrackFitters") << "Found 1 trajectory with " << myTraj.foundHits() << " valid hits\n";
  
  return ret;
}
std::vector< Trajectory > KFTrajectoryFitter::fit ( const TrajectorySeed aSeed,
const RecHitContainer hits 
) const [virtual]

Implements TrajectoryFitter.

Definition at line 30 of file KFTrajectoryFitter.cc.

References Exception.

                                                                                  {

  throw cms::Exception("TrackFitters", 
                       "KFTrajectoryFitter::fit(TrajectorySeed, <TransientTrackingRecHit>) not implemented"); 

  return std::vector<Trajectory>();
}
std::vector< Trajectory > KFTrajectoryFitter::fit ( const Trajectory aTraj) const [virtual]

Implements TrajectoryFitter.

Reimplemented in KFSplittingFitter.

Definition at line 20 of file KFTrajectoryFitter.cc.

References Trajectory::empty(), Trajectory::firstMeasurement(), Trajectory::recHits(), Trajectory::seed(), and TrajectoryMeasurement::updatedState().

Referenced by CRackTrajectoryBuilder::AddHit().

                                                                           {

  if(aTraj.empty()) return std::vector<Trajectory>();
 
  TM firstTM = aTraj.firstMeasurement();
  TSOS firstTsos = TrajectoryStateWithArbitraryError()(firstTM.updatedState());
  
  return fit(aTraj.seed(), aTraj.recHits(), firstTsos);
}
const Propagator* KFTrajectoryFitter::propagator ( void  ) const [inline]
const TrajectoryStateUpdator* KFTrajectoryFitter::updator ( ) const [inline]

Member Data Documentation

Definition at line 96 of file KFTrajectoryFitter.h.

Referenced by KFTrajectoryFitter().

Definition at line 101 of file KFTrajectoryFitter.h.

Referenced by clone(), and fit().

bool KFTrajectoryFitter::owner [private]

Definition at line 102 of file KFTrajectoryFitter.h.

Referenced by clone(), and ~KFTrajectoryFitter().

Definition at line 99 of file KFTrajectoryFitter.h.

Referenced by clone(), estimator(), and ~KFTrajectoryFitter().

Definition at line 100 of file KFTrajectoryFitter.h.

Referenced by clone(), fit(), and KFTrajectoryFitter().

Definition at line 97 of file KFTrajectoryFitter.h.

Referenced by clone(), fit(), propagator(), and ~KFTrajectoryFitter().

Definition at line 98 of file KFTrajectoryFitter.h.

Referenced by clone(), updator(), and ~KFTrajectoryFitter().