00001 #include "TrackingTools/TrackFitters/interface/KFTrajectoryFitter.h"
00002 #include "TrackingTools/TrackFitters/interface/TrajectoryStateWithArbitraryError.h"
00003 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
00004 #include "FWCore/Utilities/interface/Exception.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00007 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00008 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00009 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00010 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00011 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00012 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
00013 #include "DataFormats/MuonDetId/interface/DTWireId.h"
00014 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00015 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
00016
00017 KFTrajectoryFitter::~KFTrajectoryFitter() {
00018
00019 delete thePropagator;
00020 delete theUpdator;
00021 delete theEstimator;
00022
00023 }
00024
00025
00026 std::vector<Trajectory> KFTrajectoryFitter::fit(const Trajectory& aTraj) const {
00027
00028 if(aTraj.empty()) return std::vector<Trajectory>();
00029
00030 TM firstTM = aTraj.firstMeasurement();
00031 TSOS firstTsos = TrajectoryStateWithArbitraryError()(firstTM.updatedState());
00032
00033 return fit(aTraj.seed(), aTraj.recHits(), firstTsos);
00034 }
00035
00036 std::vector<Trajectory> KFTrajectoryFitter::fit(const TrajectorySeed& aSeed,
00037 const RecHitContainer& hits) const{
00038
00039 throw cms::Exception("TrackFitters",
00040 "KFTrajectoryFitter::fit(TrajectorySeed, <TransientTrackingRecHit>) not implemented");
00041
00042 return std::vector<Trajectory>();
00043 }
00044
00045 std::vector<Trajectory> KFTrajectoryFitter::fit(const TrajectorySeed& aSeed,
00046 const RecHitContainer& hits,
00047 const TSOS& firstPredTsos) const
00048 {
00049 if(hits.empty()) return std::vector<Trajectory>();
00050
00051 if (aSeed.direction() == alongMomentum) {
00052 thePropagator->setPropagationDirection(alongMomentum);
00053 } else if (aSeed.direction() == oppositeToMomentum){
00054 thePropagator->setPropagationDirection(oppositeToMomentum);
00055 } else {
00056 throw cms::Exception("KFTrajectoryFitter","TrajectorySeed::direction() requested but not set");
00057 }
00058
00059 LogDebug("TrackFitters")
00060 <<" +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
00061 <<" KFTrajectoryFitter::fit starting with " << hits.size() <<" HITS";
00062
00063 for (unsigned int j=0;j<hits.size();j++) {
00064 if (hits[j]->det())
00065 LogTrace("TrackFitters") << "hit #:" << j+1 << " rawId=" << hits[j]->det()->geographicalId().rawId()
00066 << " validity=" << hits[j]->isValid();
00067 else
00068 LogTrace("TrackFitters") << "hit #:" << j+1 << " Hit with no Det information";
00069 }
00070 LogTrace("TrackFitters") << " INITIAL STATE "<< firstPredTsos;
00071
00072 std::vector<Trajectory> ret(1, Trajectory(aSeed, thePropagator->propagationDirection()));
00073 Trajectory & myTraj = ret.front();
00074 myTraj.reserve(hits.size());
00075
00076 TSOS predTsos(firstPredTsos);
00077 TSOS currTsos;
00078
00079 int hitcounter = 1;
00080 for(RecHitContainer::const_iterator ihit = hits.begin(); ihit != hits.end(); ++ihit, ++hitcounter) {
00081
00082 const TransientTrackingRecHit & hit = (**ihit);
00083
00084 if (hit.isValid() == false && hit.surface() == 0) {
00085 LogDebug("TrackFitters")<< " Error: invalid hit with no GeomDet attached .... skipping";
00086 continue;
00087 }
00088
00089 if (hit.isValid()) {
00090 LogTrace("TrackFitters")
00091 << " ----------------- HIT #" << hitcounter << " (VALID)-----------------------\n"
00092 << " HIT IS AT R " << hit.globalPosition().perp() << "\n"
00093 << " HIT IS AT Z " << hit.globalPosition().z() << "\n"
00094 << " HIT IS AT Phi " << hit.globalPosition().phi() << "\n"
00095 << " HIT IS AT Loc " << hit.localPosition() << "\n"
00096 << " WITH LocError " << hit.localPositionError() << "\n"
00097 << " HIT IS AT Glo " << hit.globalPosition() << "\n"
00098 << "SURFACE POSITION" << "\n"
00099 << hit.surface()->position()<<"\n"
00100 << "SURFACE ROTATION" << "\n"
00101 << hit.surface()->rotation();
00102
00103 DetId hitId = hit.geographicalId();
00104
00105 LogTrace("TrackFitters") << " hit det=" << hitId.rawId();
00106
00107 if(hitId.det() == DetId::Tracker) {
00108 if (hitId.subdetId() == StripSubdetector::TIB )
00109 LogTrace("TrackFitters") << " I am TIB " << TIBDetId(hitId).layer();
00110 else if (hitId.subdetId() == StripSubdetector::TOB )
00111 LogTrace("TrackFitters") << " I am TOB " << TOBDetId(hitId).layer();
00112 else if (hitId.subdetId() == StripSubdetector::TEC )
00113 LogTrace("TrackFitters") << " I am TEC " << TECDetId(hitId).wheel();
00114 else if (hitId.subdetId() == StripSubdetector::TID )
00115 LogTrace("TrackFitters") << " I am TID " << TIDDetId(hitId).wheel();
00116 else if (hitId.subdetId() == StripSubdetector::TID )
00117 LogTrace("TrackFitters") << " I am TID " << TIDDetId(hitId).wheel();
00118 else if (hitId.subdetId() == (int) PixelSubdetector::PixelBarrel )
00119 LogTrace("TrackFitters") << " I am PixBar " << PXBDetId(hitId).layer();
00120 else if (hitId.subdetId() == (int) PixelSubdetector::PixelEndcap )
00121 LogTrace("TrackFitters") << " I am PixFwd " << PXFDetId(hitId).disk();
00122 else
00123 LogTrace("TrackFitters") << " UNKNOWN TRACKER HIT TYPE ";
00124 }
00125 else if(hitId.det() == DetId::Muon) {
00126 if(hitId.subdetId() == MuonSubdetId::DT)
00127 LogTrace("TrackFitters") << " I am DT " << DTWireId(hitId);
00128 else if (hitId.subdetId() == MuonSubdetId::CSC )
00129 LogTrace("TrackFitters") << " I am CSC " << CSCDetId(hitId);
00130 else if (hitId.subdetId() == MuonSubdetId::RPC )
00131 LogTrace("TrackFitters") << " I am RPC " << RPCDetId(hitId);
00132 else
00133 LogTrace("TrackFitters") << " UNKNOWN MUON HIT TYPE ";
00134 }
00135 else
00136 LogTrace("TrackFitters") << " UNKNOWN HIT TYPE ";
00137
00138 } else {
00139 LogTrace("TrackFitters")
00140 << " ----------------- INVALID HIT #" << hitcounter << " -----------------------";
00141 }
00142
00143
00144 if ( hitcounter != 1)
00145 predTsos = thePropagator->propagate( currTsos, *(hit.surface()) );
00146
00147 if(!predTsos.isValid()) {
00148 LogDebug("TrackFitters")
00149 << "SOMETHING WRONG !" << "\n"
00150 << "KFTrajectoryFitter: predicted tsos not valid!\n"
00151 << "current TSOS: " << currTsos << "\n";
00152
00153 if(hit.surface()) LogTrace("TrackFitters") << "next Surface: " << hit.surface()->position() << "\n";
00154
00155 if( myTraj.foundHits() >= minHits_ ) {
00156 LogDebug("TrackFitters") << " breaking trajectory" << "\n";
00157 break;
00158 } else {
00159 LogDebug("TrackFitters") << " killing trajectory" << "\n";
00160 return std::vector<Trajectory>();
00161 }
00162 }
00163
00164 if(hit.isValid()) {
00165
00166 LogTrace("TrackFitters") << "THE HIT IS VALID: updating hit with predTsos";
00167 TransientTrackingRecHit::RecHitPointer preciseHit = hit.clone(predTsos);
00168
00169 if (preciseHit->isValid() == false){
00170 LogTrace("TrackFitters") << "THE Precise HIT IS NOT VALID: using currTsos = predTsos" << "\n";
00171 currTsos = predTsos;
00172 myTraj.push(TM(predTsos, *ihit ));
00173
00174 }else{
00175 LogTrace("TrackFitters") << "THE Precise HIT IS VALID: updating currTsos" << "\n";
00176 currTsos = updator()->update(predTsos, *preciseHit);
00177 myTraj.push(TM(predTsos, currTsos, preciseHit,
00178 estimator()->estimate(predTsos, *preciseHit).second));
00179
00180 }
00181 } else {
00182
00183 LogDebug("TrackFitters") << "THE HIT IS NOT VALID: using currTsos" << "\n";
00184 currTsos = predTsos;
00185 myTraj.push(TM(predTsos, *ihit));
00186 }
00187
00188 LogTrace("TrackFitters")
00189 << "predTsos !" << "\n"
00190 << predTsos << "\n"
00191 <<"currTsos !" << "\n"
00192 << currTsos;
00193 }
00194 LogDebug("TrackFitters") << "Found 1 trajectory with " << myTraj.foundHits() << " valid hits\n";
00195
00196 return ret;
00197 }
00198