Go to the documentation of this file.00001 #include "RecoTracker/DebugTools/interface/GetTrackTrajInfo.h"
00002
00003 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00004 #include "RecoTracker/TkDetLayers/interface/GeometricSearchTracker.h"
00005 #include "RecoTracker/Record/interface/CkfComponentsRecord.h"
00006
00007
00008 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00009 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
00010
00011 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
00012 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00013
00014 #include "TrackingTools/KalmanUpdators/interface/Chi2MeasurementEstimator.h"
00015 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
00016
00017 #include "TrackingTools/DetLayers/interface/NavigationSchool.h"
00018 #include "RecoTracker/Record/interface/NavigationSchoolRecord.h"
00019 #include "TrackingTools/DetLayers/interface/NavigationSetter.h"
00020
00021 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
00022 #include "DataFormats/Math/interface/deltaPhi.h"
00023
00024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00025
00026 #include "FWCore/Utilities/interface/Exception.h"
00027
00028 std::vector< GetTrackTrajInfo::Result > GetTrackTrajInfo::analyze(const edm::EventSetup& iSetup, const reco::Track& track)
00029 {
00030
00031
00032 std::vector< GetTrackTrajInfo::Result > results;
00033
00034
00035 edm::ESHandle<GeometricSearchTracker> tracker;
00036 iSetup.get<TrackerRecoGeometryRecord>().get( tracker );
00037
00038
00039 edm::ESHandle<NavigationSchool> theSchool;
00040 iSetup.get<NavigationSchoolRecord>().get("SimpleNavigationSchool",theSchool);
00041 NavigationSetter junk(*theSchool);
00042
00043
00044 edm::ESHandle<MagneticField> magField;
00045 iSetup.get<IdealMagneticFieldRecord>().get(magField);
00046 AnalyticalPropagator propagator(&(*magField), alongMomentum);
00047
00048
00049
00050
00051 Chi2MeasurementEstimator estimator(30.,3.0);
00052
00053
00054 iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",trkTool_);
00055 reco::TransientTrack t_trk = trkTool_->build(track);
00056 TrajectoryStateOnSurface initTSOS = t_trk.impactPointState();
00057 LogDebug("GTTI")<<"TRACK TSOS POS: x="<<initTSOS.globalPosition().x()<<" y="<<initTSOS.globalPosition().y()<<" z="<<initTSOS.globalPosition().z();
00058
00059
00060
00061
00062
00063
00064 bool posSide = track.eta() > 0;
00065
00066
00067 const reco::HitPattern& hp = track.hitPattern();
00068
00069
00070
00071
00072 for (int i = 0; i < hp.numberOfHits(); i++) {
00073 uint32_t hit = hp.getHitPattern(i);
00074 if (hp.trackerHitFilter(hit) && hp.validHitFilter(hit)) {
00075 uint32_t subDet = hp.getSubStructure(hit);
00076 uint32_t layer = hp.getLayer(hit);
00077
00078 LogDebug("GTTI")<<" hit in subdet="<<subDet<<" layer="<<layer;
00079
00080
00081 const DetLayer* detLayer = 0;
00082 if (subDet == StripSubdetector::TIB) {
00083 detLayer = tracker->tibLayers()[layer - 1];
00084 } else if (subDet == StripSubdetector::TOB) {
00085 detLayer = tracker->tobLayers()[layer - 1];
00086 } else if (subDet == StripSubdetector::TID) {
00087 detLayer = posSide ? tracker->posTidLayers()[layer - 1] : tracker->negTidLayers()[layer - 1];
00088 } else if (subDet == StripSubdetector::TEC) {
00089 detLayer = posSide ? tracker->posTecLayers()[layer - 1] : tracker->negTecLayers()[layer - 1];
00090 } else if (subDet == PixelSubdetector::PixelBarrel) {
00091 detLayer = tracker->pixelBarrelLayers()[layer - 1];
00092 } else if (subDet == PixelSubdetector::PixelEndcap) {
00093 detLayer = posSide ? tracker->posPixelForwardLayers()[layer - 1] : tracker->negPixelForwardLayers()[layer - 1];
00094 }
00095
00096
00097 Result result;
00098 result.detLayer = detLayer;
00099
00100
00101 std::pair<bool, TrajectoryStateOnSurface> layCross = detLayer->compatible(initTSOS, propagator, estimator);
00102 if (layCross.first) {
00103 LogDebug("GTTI")<<"crossed layer at "<<" x="<<layCross.second.globalPosition().x()<<" y="<<layCross.second.globalPosition().y()<<" z="<<layCross.second.globalPosition().z();
00104
00105
00106
00107 const PropagationDirection along = alongMomentum;
00108 propagator.setPropagationDirection(along);
00109 std::vector< GeometricSearchDet::DetWithState > detWithState = detLayer->compatibleDets(initTSOS, propagator, estimator);
00110
00111 if(detWithState.size() > 0) {
00112
00113 result.valid = true;
00114 result.accurate = true;
00115 result.detTSOS = detWithState.front().second;
00116 LogDebug("GTTI")<<" Det in this layer compatible with TSOS: subdet="<<subDet<<" layer="<<layer;
00117 LogDebug("GTTI")<<" crossed sensor at x="<<result.detTSOS.globalPosition().x()<<" y="<<result.detTSOS.globalPosition().y()<<" z="<<result.detTSOS.globalPosition().z();
00118
00119 } else {
00120
00121 result.valid = true;
00122 result.accurate = false;
00123 result.detTSOS = layCross.second;
00124 LogDebug("GTTI")<<" WARNING: TSOS not compatible with any det in this layer, despite having a hit in it !";
00125 }
00126
00127 } else {
00128
00129 result.valid = false;
00130 LogDebug("GTTI")<<" WARNING: track failed to cross layer, despite having a hit in hit !";
00131 }
00132
00133 results.push_back(result);
00134 }
00135 }
00136
00137 return results;
00138 }