Go to the documentation of this file.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
00018 const DetLayerGeometry KFTrajectoryFitter::dummyGeometry;
00019
00020 std::vector<Trajectory> KFTrajectoryFitter::fit(const Trajectory& aTraj) const {
00021
00022 if(aTraj.empty()) return std::vector<Trajectory>();
00023
00024 TM firstTM = aTraj.firstMeasurement();
00025 TSOS firstTsos = TrajectoryStateWithArbitraryError()(firstTM.updatedState());
00026
00027 return fit(aTraj.seed(), aTraj.recHits(), firstTsos);
00028 }
00029
00030 std::vector<Trajectory> KFTrajectoryFitter::fit(const TrajectorySeed& aSeed,
00031 const RecHitContainer& hits) const{
00032
00033 throw cms::Exception("TrackFitters",
00034 "KFTrajectoryFitter::fit(TrajectorySeed, <TransientTrackingRecHit>) not implemented");
00035
00036 return std::vector<Trajectory>();
00037 }
00038
00039 std::vector<Trajectory> KFTrajectoryFitter::fit(const TrajectorySeed& aSeed,
00040 const RecHitContainer& hits,
00041 const TSOS& firstPredTsos) const
00042 {
00043 if(hits.empty()) return std::vector<Trajectory>();
00044
00045
00046 if (aSeed.direction() == anyDirection)
00047 throw cms::Exception("KFTrajectoryFitter","TrajectorySeed::direction() requested but not set");
00048
00049 SetPropagationDirection setDir(*thePropagator,aSeed.direction());
00050
00051 #ifdef EDM_LM_DEBUG
00052 LogDebug("TrackFitters")
00053 <<" +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
00054 <<" KFTrajectoryFitter::fit starting with " << hits.size() <<" HITS";
00055
00056 for (unsigned int j=0;j<hits.size();j++) {
00057 if (hits[j]->det())
00058 LogTrace("TrackFitters") << "hit #:" << j+1 << " rawId=" << hits[j]->det()->geographicalId().rawId()
00059 << " validity=" << hits[j]->isValid();
00060 else
00061 LogTrace("TrackFitters") << "hit #:" << j+1 << " Hit with no Det information";
00062 }
00063 LogTrace("TrackFitters") << " INITIAL STATE "<< firstPredTsos;
00064 #endif
00065
00066 std::vector<Trajectory> ret(1, Trajectory(aSeed, thePropagator->propagationDirection()));
00067 Trajectory & myTraj = ret.front();
00068 myTraj.reserve(hits.size());
00069
00070 TSOS predTsos(firstPredTsos);
00071 TSOS currTsos;
00072
00073 int hitcounter = 1;
00074 for(RecHitContainer::const_iterator ihit = hits.begin(); ihit != hits.end(); ++ihit, ++hitcounter) {
00075
00076 const TransientTrackingRecHit & hit = (**ihit);
00077
00078 if (hit.isValid() == false && hit.surface() == 0) {
00079 LogDebug("TrackFitters")<< " Error: invalid hit with no GeomDet attached .... skipping";
00080 continue;
00081 }
00082
00083 #ifdef EDM_LM_DEBUG
00084 if (hit.isValid()) {
00085 LogTrace("TrackFitters")
00086 << " ----------------- HIT #" << hitcounter << " (VALID)-----------------------\n"
00087 << " HIT IS AT R " << hit.globalPosition().perp() << "\n"
00088 << " HIT IS AT Z " << hit.globalPosition().z() << "\n"
00089 << " HIT IS AT Phi " << hit.globalPosition().phi() << "\n"
00090 << " HIT IS AT Loc " << hit.localPosition() << "\n"
00091 << " WITH LocError " << hit.localPositionError() << "\n"
00092 << " HIT IS AT Glo " << hit.globalPosition() << "\n"
00093 << "SURFACE POSITION" << "\n"
00094 << hit.surface()->position()<<"\n"
00095 << "SURFACE ROTATION" << "\n"
00096 << hit.surface()->rotation();
00097
00098 DetId hitId = hit.geographicalId();
00099
00100 LogTrace("TrackFitters") << " hit det=" << hitId.rawId();
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 } else {
00134 LogTrace("TrackFitters")
00135 << " ----------------- INVALID HIT #" << hitcounter << " -----------------------";
00136 }
00137 #endif
00138
00139 if ( hitcounter != 1)
00140 predTsos = thePropagator->propagate( currTsos, *(hit.surface()) );
00141
00142
00143 if(!predTsos.isValid()) {
00144 LogDebug("TrackFitters")
00145 << "SOMETHING WRONG !" << "\n"
00146 << "KFTrajectoryFitter: predicted tsos not valid!\n"
00147 << "current TSOS: " << currTsos << "\n";
00148
00149 if(hit.surface()) LogTrace("TrackFitters") << "next Surface: " << hit.surface()->position() << "\n";
00150
00151 if( myTraj.foundHits() >= minHits_ ) {
00152 LogDebug("TrackFitters") << " breaking trajectory" << "\n";
00153 break;
00154 } else {
00155 LogDebug("TrackFitters") << " killing trajectory" << "\n";
00156 return std::vector<Trajectory>();
00157 }
00158 }
00159
00160 if(hit.isValid()) {
00161
00162 LogTrace("TrackFitters") << "THE HIT IS VALID: updating hit with predTsos";
00163 TransientTrackingRecHit::RecHitPointer preciseHit = hit.clone(predTsos);
00164
00165 if (preciseHit->isValid() == false){
00166 LogTrace("TrackFitters") << "THE Precise HIT IS NOT VALID: using currTsos = predTsos" << "\n";
00167 currTsos = predTsos;
00168 myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId()) ));
00169
00170 }else{
00171 LogTrace("TrackFitters") << "THE Precise HIT IS VALID: updating currTsos" << "\n";
00172 currTsos = updator()->update(predTsos, *preciseHit);
00173
00174 bool badState = (!currTsos.isValid())
00175 || (hit.geographicalId().det() == DetId::Tracker
00176 &&
00177 (std::abs(currTsos.localParameters().qbp())>100
00178 || std::abs(currTsos.localParameters().position().y()) > 1000
00179 || std::abs(currTsos.localParameters().position().x()) > 1000
00180 ) ) || std::isnan(currTsos.localParameters().qbp());
00181 if (badState){
00182 if (!currTsos.isValid()) edm::LogError("FailedUpdate")<<"updating with the hit failed. Not updating the trajectory with the hit";
00183 else if (std::isnan(currTsos.localParameters().qbp())) edm::LogError("TrajectoryNaN")<<"Trajectory has NaN";
00184 else LogTrace("FailedUpdate")<<"updated state is valid but pretty bad, skipping. currTsos "<<currTsos<<"\n predTsos "<<predTsos;
00185 myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId()) ));
00186
00187
00188 if( myTraj.foundHits() >= minHits_ ) {
00189 LogDebug("TrackFitters") << " breaking trajectory" << "\n";
00190 break;
00191 } else {
00192 LogDebug("TrackFitters") << " killing trajectory" << "\n";
00193 return std::vector<Trajectory>();
00194 }
00195 }
00196 else{
00197 if (preciseHit->det()) myTraj.push(TM(predTsos, currTsos, preciseHit,
00198 estimator()->estimate(predTsos, *preciseHit).second,
00199 theGeometry->idToLayer(preciseHit->geographicalId()) ));
00200 else myTraj.push(TM(predTsos, currTsos, preciseHit,
00201 estimator()->estimate(predTsos, *preciseHit).second));
00202 }
00203 }
00204 } else {
00205
00206 LogDebug("TrackFitters") << "THE HIT IS NOT VALID: using currTsos" << "\n";
00207 currTsos = predTsos;
00208 myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId()) ));
00209 }
00210
00211 LogTrace("TrackFitters")
00212 << "predTsos !" << "\n"
00213 << predTsos << "\n"
00214 <<"currTsos !" << "\n"
00215 << currTsos;
00216 }
00217
00218 LogDebug("TrackFitters") << "Found 1 trajectory with " << myTraj.foundHits() << " valid hits\n";
00219
00220 return ret;
00221 }
00222