00001 #include "RecoTracker/TrackProducer/interface/TrackProducerAlgorithm.h"
00002
00003 #include "DataFormats/Common/interface/OrphanHandle.h"
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005
00006 #include "MagneticField/Engine/interface/MagneticField.h"
00007 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
00008
00009 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
00010 #include "DataFormats/TrackCandidate/interface/TrackCandidate.h"
00011 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
00012
00013 #include "TrackingTools/TrackFitters/interface/TrajectoryFitter.h"
00014 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00015 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00016 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
00017 #include "RecoTracker/TransientTrackingRecHit/interface/TkTransientTrackingRecHitBuilder.h"
00018 #include "TrackingTools/PatternTools/interface/TransverseImpactPointExtrapolator.h"
00019 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00020 #include "RecoTracker/TrackProducer/interface/TrackingRecHitLessFromGlobalPosition.h"
00021
00022 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
00023 #include "FWCore/Utilities/interface/Exception.h"
00024
00025 #include "RecoTracker/TransientTrackingRecHit/interface/TRecHit2DPosConstraint.h"
00026 #include "RecoTracker/TransientTrackingRecHit/interface/TRecHit1DMomConstraint.h"
00027
00028 #include "DataFormats/GeometryCommonDetAlgo/interface/ErrorFrameTransformer.h"
00029 #include "TrackingTools/TrackFitters/interface/RecHitSorter.h"
00030 #include "DataFormats/TrackReco/interface/TrackBase.h"
00031
00032 namespace {
00033 #ifdef STAT_TSB
00034 struct StatCount {
00035 long long totTrack=0;
00036 long long totLoop=0;
00037 long long totGsfTrack=0;
00038 long long totFound=0;
00039 long long totLost=0;
00040 long long totAlgo[12];
00041 void track(int l) {
00042 if (l>0) ++totLoop; else ++totTrack;
00043 }
00044 void hits(int f, int l) { totFound+=f; totLost+=l;}
00045 void gsf() {++totGsfTrack;}
00046 void algo(int a) { if (a>=0 && a<12) ++totAlgo[a];}
00047
00048
00049 void print() const {
00050 std::cout << "TrackProducer stat\nTrack/Loop/Gsf/FoundHits/LostHits/algos "
00051 << totTrack <<'/'<< totLoop <<'/'<< totGsfTrack <<'/'<< totFound <<'/'<< totLost;
00052 for (auto a : totAlgo) std::cout << '/'<< a;
00053 std::cout << std::endl;
00054 }
00055 StatCount() {}
00056 ~StatCount() { print();}
00057 };
00058
00059 #else
00060 struct StatCount {
00061 void track(int){}
00062 void hits(int, int){}
00063 void gsf(){}
00064 void algo(int){}
00065 };
00066 #endif
00067
00068 StatCount statCount;
00069
00070 }
00071
00072
00073
00074
00075 template <> bool
00076 TrackProducerAlgorithm<reco::Track>::buildTrack (const TrajectoryFitter * theFitter,
00077 const Propagator * thePropagator,
00078 AlgoProductCollection& algoResults,
00079 TransientTrackingRecHit::RecHitContainer& hits,
00080 TrajectoryStateOnSurface& theTSOS,
00081 const TrajectorySeed& seed,
00082 float ndof,
00083 const reco::BeamSpot& bs,
00084 SeedRef seedRef,
00085 int qualityMask,signed char nLoops)
00086 {
00087
00088 reco::Track * theTrack;
00089 Trajectory * theTraj;
00090 PropagationDirection seedDir = seed.direction();
00091
00092
00093 Trajectory && trajTmp = theFitter->fitOne(seed, hits, theTSOS,(nLoops>0) ? TrajectoryFitter::looper : TrajectoryFitter::standard);
00094 if unlikely(!trajTmp.isValid()) return false;
00095
00096
00097
00098 theTraj = new Trajectory(std::move(trajTmp));
00099 theTraj->setSeedRef(seedRef);
00100
00101 statCount.hits(theTraj->foundHits(),theTraj->lostHits());
00102 statCount.algo(int(algo_));
00103
00104
00105
00106
00107
00108
00109
00110
00111 ndof = 0;
00112 for (auto const & tm : theTraj->measurements()) {
00113 auto const & h = tm.recHitR();
00114 if (h.isValid()) ndof = ndof + float(h.dimension())*h.weight();
00115 }
00116
00117 ndof -= 5.f;
00118 if unlikely(std::abs(theTSOS.magneticField()->nominalValue())<DBL_MIN) ++ndof;
00119
00120
00121
00122
00123
00124 TrajectoryStateOnSurface stateForProjectionToBeamLineOnSurface;
00125 if (geometricInnerState_) {
00126 stateForProjectionToBeamLineOnSurface = theTraj->closestMeasurement(GlobalPoint(bs.x0(),bs.y0(),bs.z0())).updatedState();
00127 } else {
00128 if (theTraj->direction() == alongMomentum) {
00129 stateForProjectionToBeamLineOnSurface = theTraj->firstMeasurement().updatedState();
00130 } else {
00131 stateForProjectionToBeamLineOnSurface = theTraj->lastMeasurement().updatedState();
00132 }
00133 }
00134
00135 if unlikely(!stateForProjectionToBeamLineOnSurface.isValid()){
00136 edm::LogError("CannotPropagateToBeamLine")<<"the state on the closest measurement isnot valid. skipping track.";
00137 delete theTraj;
00138 return false;
00139 }
00140 const FreeTrajectoryState & stateForProjectionToBeamLine=*stateForProjectionToBeamLineOnSurface.freeState();
00141
00142 LogDebug("TrackProducer") << "stateForProjectionToBeamLine=" << stateForProjectionToBeamLine;
00143
00144 TSCBLBuilderNoMaterial tscblBuilder;
00145 TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(stateForProjectionToBeamLine,bs);
00146
00147 if unlikely(!tscbl.isValid()) {
00148 delete theTraj;
00149 return false;
00150 }
00151
00152 GlobalPoint v = tscbl.trackStateAtPCA().position();
00153 math::XYZPoint pos( v.x(), v.y(), v.z() );
00154 GlobalVector p = tscbl.trackStateAtPCA().momentum();
00155 math::XYZVector mom( p.x(), p.y(), p.z() );
00156
00157 LogDebug("TrackProducer") << "pos=" << v << " mom=" << p << " pt=" << p.perp() << " mag=" << p.mag();
00158
00159 theTrack = new reco::Track(theTraj->chiSquared(),
00160 int(ndof),
00161 pos, mom, tscbl.trackStateAtPCA().charge(),
00162 tscbl.trackStateAtPCA().curvilinearError(),
00163 algo_);
00164
00165 theTrack->setQualityMask(qualityMask);
00166 theTrack->setNLoops(nLoops);
00167
00168 LogDebug("TrackProducer") << "theTrack->pt()=" << theTrack->pt();
00169
00170 LogDebug("TrackProducer") <<"track done\n";
00171
00172 AlgoProduct aProduct(theTraj,std::make_pair(theTrack,seedDir));
00173 algoResults.push_back(aProduct);
00174
00175 statCount.track(nLoops);
00176
00177 return true;
00178 }
00179
00180 template <> bool
00181 TrackProducerAlgorithm<reco::GsfTrack>::buildTrack (const TrajectoryFitter * theFitter,
00182 const Propagator * thePropagator,
00183 AlgoProductCollection& algoResults,
00184 TransientTrackingRecHit::RecHitContainer& hits,
00185 TrajectoryStateOnSurface& theTSOS,
00186 const TrajectorySeed& seed,
00187 float ndof,
00188 const reco::BeamSpot& bs,
00189 SeedRef seedRef,
00190 int qualityMask,signed char nLoops)
00191 {
00192
00193 reco::GsfTrack * theTrack;
00194 Trajectory * theTraj;
00195 PropagationDirection seedDir = seed.direction();
00196
00197 Trajectory && trajTmp = theFitter->fitOne(seed, hits, theTSOS,(nLoops>0) ? TrajectoryFitter::looper: TrajectoryFitter::standard);
00198 if unlikely(!trajTmp.isValid()) return false;
00199
00200
00201 theTraj = new Trajectory( std::move(trajTmp) );
00202 theTraj->setSeedRef(seedRef);
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 ndof = 0;
00231 for (auto const & tm : theTraj->measurements()) {
00232 auto const & h = tm.recHitR();
00233 if (h.isValid()) ndof = ndof + h.dimension()*h.weight();
00234 }
00235
00236 ndof = ndof - 5;
00237 if unlikely(std::abs(theTSOS.magneticField()->nominalValue())<DBL_MIN) ++ndof;
00238
00239
00240
00241
00242
00243 TrajectoryStateOnSurface stateForProjectionToBeamLineOnSurface;
00244 if (geometricInnerState_) {
00245 stateForProjectionToBeamLineOnSurface = theTraj->closestMeasurement(GlobalPoint(bs.x0(),bs.y0(),bs.z0())).updatedState();
00246 } else {
00247 if (theTraj->direction() == alongMomentum) {
00248 stateForProjectionToBeamLineOnSurface = theTraj->firstMeasurement().updatedState();
00249 } else {
00250 stateForProjectionToBeamLineOnSurface = theTraj->lastMeasurement().updatedState();
00251 }
00252 }
00253
00254 if unlikely(!stateForProjectionToBeamLineOnSurface.isValid()){
00255 edm::LogError("CannotPropagateToBeamLine")<<"the state on the closest measurement isnot valid. skipping track.";
00256 delete theTraj;
00257 return false;
00258 }
00259
00260 const FreeTrajectoryState & stateForProjectionToBeamLine=*stateForProjectionToBeamLineOnSurface.freeState();
00261
00262 LogDebug("GsfTrackProducer") << "stateForProjectionToBeamLine=" << stateForProjectionToBeamLine;
00263
00264 TSCBLBuilderNoMaterial tscblBuilder;
00265 TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(stateForProjectionToBeamLine,bs);
00266
00267 if unlikely(tscbl.isValid()==false) {
00268 delete theTraj;
00269 return false;
00270 }
00271
00272 GlobalPoint v = tscbl.trackStateAtPCA().position();
00273 math::XYZPoint pos( v.x(), v.y(), v.z() );
00274 GlobalVector p = tscbl.trackStateAtPCA().momentum();
00275 math::XYZVector mom( p.x(), p.y(), p.z() );
00276
00277 LogDebug("GsfTrackProducer") << "pos=" << v << " mom=" << p << " pt=" << p.perp() << " mag=" << p.mag();
00278
00279 theTrack = new reco::GsfTrack(theTraj->chiSquared(),
00280 int(ndof),
00281
00282
00283
00284 pos, mom, tscbl.trackStateAtPCA().charge(), tscbl.trackStateAtPCA().curvilinearError());
00285 theTrack->setAlgorithm(algo_);
00286
00287 LogDebug("GsfTrackProducer") <<"track done\n";
00288
00289 AlgoProduct aProduct(theTraj,std::make_pair(theTrack,seedDir));
00290 LogDebug("GsfTrackProducer") <<"track done1\n";
00291 algoResults.push_back(aProduct);
00292 LogDebug("GsfTrackProducer") <<"track done2\n";
00293
00294 statCount.gsf();
00295 return true;
00296 }