00001 #include "TrackingTools/TrackFitters/interface/KFTrajectorySmoother.h"
00002 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
00003 #include "TrackingTools/TrackFitters/interface/TrajectoryStateWithArbitraryError.h"
00004 #include "TrackingTools/TrackFitters/interface/TrajectoryStateCombiner.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 KFTrajectorySmoother::~KFTrajectorySmoother() {
00018
00019 delete thePropagator;
00020 delete theUpdator;
00021 delete theEstimator;
00022
00023 }
00024
00025 std::vector<Trajectory>
00026 KFTrajectorySmoother::trajectories(const Trajectory& aTraj) const {
00027
00028
00029
00030 if ( aTraj.direction() == alongMomentum) {
00031 thePropagator->setPropagationDirection(oppositeToMomentum);
00032 } else {
00033 thePropagator->setPropagationDirection(alongMomentum);
00034 }
00035
00036 std::vector<Trajectory> ret(1, Trajectory(aTraj.seed(), thePropagator->propagationDirection()));
00037 Trajectory & myTraj = ret.front();
00038
00039
00040 if(aTraj.empty()) { ret.clear(); return ret; }
00041
00042
00043 const std::vector<TM> & avtm = aTraj.measurements();
00044 LogDebug("TrackFitters") << "KFTrajectorySmoother::trajectories starting with " << avtm.size() << " HITS\n";
00045
00046 myTraj.reserve(avtm.size());
00047
00048 for (unsigned int j=0;j<avtm.size();j++) {
00049 if (avtm[j].recHit()->det())
00050 LogTrace("TrackFitters") << "hit #:" << j+1 << " rawId=" << avtm[j].recHit()->det()->geographicalId().rawId()
00051 << " validity=" << avtm[j].recHit()->isValid();
00052 else
00053 LogTrace("TrackFitters") << "hit #:" << j+1 << " Hit with no Det information";
00054 }
00055
00056 TSOS predTsos = avtm.back().forwardPredictedState();
00057 predTsos.rescaleError(theErrorRescaling);
00058 TSOS currTsos;
00059
00060 TrajectoryStateCombiner combiner;
00061
00062 unsigned int hitcounter = avtm.size();
00063 for(std::vector<TM>::const_reverse_iterator itm = avtm.rbegin(); itm != (avtm.rend()); ++itm,--hitcounter) {
00064
00065 TransientTrackingRecHit::ConstRecHitPointer hit = itm->recHit();
00066
00067
00068 if ( hit->surface()==0 ) {
00069 LogDebug("TrackFitters")<< " Error: invalid hit with no GeomDet attached .... skipping";
00070 continue;
00071 }
00072
00073 if (hitcounter != avtm.size())
00074 predTsos = thePropagator->propagate( currTsos, *(hit->surface()) );
00075
00076 if(!predTsos.isValid()) {
00077 LogDebug("TrackFitters") << "KFTrajectorySmoother: predicted tsos not valid!";
00078 if( myTraj.foundHits() >= minHits_ ) {
00079 LogDebug("TrackFitters") << " breaking trajectory" << "\n";
00080 } else {
00081 LogDebug("TrackFitters") << " killing trajectory" << "\n";
00082 ret.clear();
00083 }
00084 break;
00085 }
00086
00087 if(hit->isValid()) {
00088 LogDebug("TrackFitters")
00089 << "----------------- HIT #" << hitcounter << " (VALID)-----------------------\n"
00090 << "HIT IS AT R " << hit->globalPosition().perp() << "\n"
00091 << "HIT IS AT Z " << hit->globalPosition().z() << "\n"
00092 << "HIT IS AT Phi " << hit->globalPosition().phi() << "\n"
00093 << "HIT IS AT Loc " << hit->localPosition() << "\n"
00094 << "WITH LocError " << hit->localPositionError() << "\n"
00095 << "HIT IS AT Glo " << hit->globalPosition() << "\n"
00096 << "SURFACE POSITION: " << hit->surface()->position() << "\n"
00097 << "SURFACE ROTATION: " << hit->surface()->rotation() << "\n"
00098 << "hit geographicalId=" << hit->geographicalId().rawId();
00099
00100 DetId hitId = hit->geographicalId();
00101
00102 if(hitId.det() == DetId::Tracker) {
00103 if (hitId.subdetId() == StripSubdetector::TIB )
00104 LogTrace("TrackFitters") << " I am TIB " << TIBDetId(hitId).layer();
00105 else if (hitId.subdetId() == StripSubdetector::TOB )
00106 LogTrace("TrackFitters") << " I am TOB " << TOBDetId(hitId).layer();
00107 else if (hitId.subdetId() == StripSubdetector::TEC )
00108 LogTrace("TrackFitters") << " I am TEC " << TECDetId(hitId).wheel();
00109 else if (hitId.subdetId() == StripSubdetector::TID )
00110 LogTrace("TrackFitters") << " I am TID " << TIDDetId(hitId).wheel();
00111 else if (hitId.subdetId() == StripSubdetector::TID )
00112 LogTrace("TrackFitters") << " I am TID " << TIDDetId(hitId).wheel();
00113 else if (hitId.subdetId() == (int) PixelSubdetector::PixelBarrel )
00114 LogTrace("TrackFitters") << " I am PixBar " << PXBDetId(hitId).layer();
00115 else if (hitId.subdetId() == (int) PixelSubdetector::PixelEndcap )
00116 LogTrace("TrackFitters") << " I am PixFwd " << PXFDetId(hitId).disk();
00117 else
00118 LogTrace("TrackFitters") << " UNKNOWN TRACKER HIT TYPE ";
00119 }
00120 else if(hitId.det() == DetId::Muon) {
00121 if(hitId.subdetId() == MuonSubdetId::DT)
00122 LogTrace("TrackFitters") << " I am DT " << DTWireId(hitId);
00123 else if (hitId.subdetId() == MuonSubdetId::CSC )
00124 LogTrace("TrackFitters") << " I am CSC " << CSCDetId(hitId);
00125 else if (hitId.subdetId() == MuonSubdetId::RPC )
00126 LogTrace("TrackFitters") << " I am RPC " << RPCDetId(hitId);
00127 else
00128 LogTrace("TrackFitters") << " UNKNOWN MUON HIT TYPE ";
00129 }
00130 else
00131 LogTrace("TrackFitters") << " UNKNOWN HIT TYPE ";
00132
00133 TSOS combTsos,smooTsos;
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 if (hitcounter == avtm.size()) combTsos = itm->forwardPredictedState();
00145 else if (hitcounter == 1) combTsos = predTsos;
00146 else combTsos = combiner(predTsos, itm->forwardPredictedState());
00147 if(!combTsos.isValid()) {
00148 LogDebug("TrackFitters") <<
00149 "KFTrajectorySmoother: combined tsos not valid!\n" <<
00150 "pred Tsos pos: " << predTsos.globalPosition() << "\n" <<
00151 "pred Tsos mom: " << predTsos.globalMomentum() << "\n" <<
00152 "TrackingRecHit: " << hit->surface()->toGlobal(hit->localPosition()) << "\n" ;
00153 if( myTraj.foundHits() >= minHits_ ) {
00154 LogDebug("TrackFitters") << " breaking trajectory" << "\n";
00155 } else {
00156 LogDebug("TrackFitters") << " killing trajectory" << "\n";
00157 ret.clear();
00158 }
00159 break;
00160 }
00161
00162 TransientTrackingRecHit::RecHitPointer preciseHit = hit->clone(combTsos);
00163
00164 if (preciseHit->isValid() == false){
00165 LogTrace("TrackFitters") << "THE Precise HIT IS NOT VALID: using currTsos = predTsos" << "\n";
00166 currTsos = predTsos;
00167 myTraj.push(TM(predTsos, hit ));
00168 }else{
00169 LogTrace("TrackFitters") << "THE Precise HIT IS VALID: updating currTsos" << "\n";
00170
00171
00172 currTsos = updator()->update(predTsos, *preciseHit);
00173
00174
00175 if (hitcounter == avtm.size()) smooTsos = itm->updatedState();
00176 else if (hitcounter == 1) smooTsos = currTsos;
00177 else smooTsos = combiner(itm->forwardPredictedState(), currTsos);
00178
00179 if(!smooTsos.isValid()) {
00180 LogDebug("TrackFitters") << "KFTrajectorySmoother: smoothed tsos not valid!";
00181 if( myTraj.foundHits() >= minHits_ ) {
00182 LogDebug("TrackFitters") << " breaking trajectory" << "\n";
00183 } else {
00184 LogDebug("TrackFitters") << " killing trajectory" << "\n";
00185 ret.clear();
00186 }
00187 break;
00188 }
00189
00190 double estimate;
00191 if (hitcounter != avtm.size()) estimate = estimator()->estimate(combTsos, *preciseHit ).second;
00192 else estimate = itm->estimate();
00193
00194 LogTrace("TrackFitters")
00195 << "predTsos !" << "\n"
00196 << predTsos << "\n"
00197 << "currTsos !" << "\n"
00198 << currTsos << "\n"
00199 << "smooTsos !" << "\n"
00200 << smooTsos << "\n"
00201 << "smoothing estimate (with combTSOS)=" << estimate << "\n"
00202 << "filtering estimate=" << itm->estimate() << "\n";
00203
00204 myTraj.push(TM(itm->forwardPredictedState(),
00205 predTsos,
00206 smooTsos,
00207 preciseHit,
00208 estimate),
00209 estimator()->estimate(predTsos,*preciseHit).second);
00210
00211 }
00212 } else {
00213 LogDebug("TrackFitters")
00214 << "----------------- HIT #" << hitcounter << " (INVALID)-----------------------";
00215
00216
00217 currTsos = predTsos;
00218 TSOS combTsos;
00219 if (hitcounter == avtm.size()) combTsos = itm->forwardPredictedState();
00220 else if (hitcounter == 1) combTsos = predTsos;
00221 else combTsos = combiner(predTsos, itm->forwardPredictedState());
00222
00223 if(!combTsos.isValid()) {
00224 LogDebug("TrackFitters") <<
00225 "KFTrajectorySmoother: combined tsos not valid!";
00226 ret.clear(); break;
00227 }
00228
00229 myTraj.push(TM(itm->forwardPredictedState(),
00230 predTsos,
00231 combTsos,
00232 hit));
00233 }
00234 }
00235
00236 return ret;
00237
00238 }