00001 #ifndef RecoMuon_GlobalTrackingTools_GlobalTrajectoryBuilderBase_H
00002 #define RecoMuon_GlobalTrackingTools_GlobalTrajectoryBuilderBase_H
00003
00025 #include "FWCore/Framework/interface/ESHandle.h"
00026 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00027 #include "RecoMuon/TrackingTools/interface/MuonTrajectoryBuilder.h"
00028 #include "RecoMuon/TransientTrackingRecHit/interface/MuonTransientTrackingRecHit.h"
00029
00030 class RectangularEtaPhiTrackingRegion;
00031 class TrajectoryStateOnSurface;
00032 class GlobalMuonTrackMatcher;
00033 class MuonDetLayerMeasurements;
00034 class MuonServiceProxy;
00035 class Trajectory;
00036 class TrackTransformer;
00037 class TrajectoryFitter;
00038 class MuonTrackingRegionBuilder;
00039 class TransientTrackingRecHitBuilder;
00040
00041 namespace edm {class ParameterSet; class Event;}
00042 namespace reco {class TransientTrack;}
00043
00044
00045
00046
00047
00048 class GlobalTrajectoryBuilderBase : public MuonTrajectoryBuilder {
00049
00050 public:
00051
00052 typedef TransientTrackingRecHit::RecHitContainer RecHitContainer;
00053 typedef TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer;
00054 typedef TransientTrackingRecHit::RecHitPointer RecHitPointer;
00055 typedef TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer;
00056
00057 typedef MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer;
00058 typedef MuonTransientTrackingRecHit::ConstMuonRecHitPointer ConstMuonRecHitPointer;
00059 typedef MuonTransientTrackingRecHit::MuonRecHitContainer MuonRecHitContainer;
00060 typedef MuonTransientTrackingRecHit::ConstMuonRecHitContainer ConstMuonRecHitContainer;
00061
00062 typedef std::vector<Trajectory> TC;
00063 typedef TC::const_iterator TI;
00064
00065 public:
00066
00068 GlobalTrajectoryBuilderBase(const edm::ParameterSet&, const MuonServiceProxy*);
00069
00071 virtual ~GlobalTrajectoryBuilderBase();
00072
00074 MuonTrajectoryBuilder::TrajectoryContainer trajectories(const TrajectorySeed&) { return MuonTrajectoryBuilder::TrajectoryContainer(); }
00075
00077 virtual void setEvent(const edm::Event&);
00078
00079 protected:
00080
00081 enum RefitDirection{inToOut,outToIn,undetermined};
00082
00084 MuonTrajectoryBuilder::CandidateContainer build(const TrackCand&,
00085 MuonTrajectoryBuilder::CandidateContainer&) const;
00086
00088 virtual std::vector<TrackCand> makeTkCandCollection(const TrackCand&) = 0;
00089
00091 std::vector<TrackCand> chooseRegionalTrackerTracks(const TrackCand&,
00092 const std::vector<TrackCand>&);
00093
00095 RectangularEtaPhiTrackingRegion defineRegionOfInterest(const reco::TrackRef&) const;
00096
00098 void checkMuonHits(const reco::Track&,
00099 ConstRecHitContainer&,
00100 ConstRecHitContainer&,
00101 std::vector<int>&) const;
00102
00104 ConstRecHitContainer selectMuonHits(const Trajectory&,
00105 const std::vector<int>&) const;
00106
00108 ConstRecHitContainer selectTrackerHits(const ConstRecHitContainer&) const;
00109
00111 const Trajectory* chooseTrajectory(const std::vector<Trajectory*>&, int) const;
00112
00114 double trackProbability(const Trajectory&) const;
00115
00117 void printHits(const ConstRecHitContainer&) const;
00118
00120 void addTraj(TrackCand&);
00121
00123 RefitDirection checkRecHitsOrdering(const ConstRecHitContainer&) const;
00124
00126 std::vector<Trajectory> refitTrajectory(const Trajectory&) const;
00127
00129 std::vector<Trajectory> glbTrajectory(const TrajectorySeed& seed,
00130 const ConstRecHitContainer& trackerhits,
00131 const ConstRecHitContainer& muonhits,
00132 const TrajectoryStateOnSurface& firstPredTsos) const;
00133
00135 GlobalMuonTrackMatcher* trackMatcher() const { return theTrackMatcher; }
00136
00138 const MuonServiceProxy* service() const { return theService; }
00139
00140 TransientTrackingRecHit::ConstRecHitContainer
00141 getTransientRecHits(const reco::TransientTrack& track) const;
00142
00144 struct RadiusComparatorInOut{
00145 bool operator()(const TransientTrackingRecHit::ConstRecHitPointer &a,
00146 const TransientTrackingRecHit::ConstRecHitPointer &b) const{
00147 return a->det()->surface().position().perp() < b->det()->surface().position().perp();
00148 }
00149 };
00150
00152 struct ZedComparatorInOut{
00153 bool operator()( const TransientTrackingRecHit::ConstRecHitPointer &a,
00154 const TransientTrackingRecHit::ConstRecHitPointer &b) const{
00155 return fabs(a->globalPosition().z()) < fabs(b->globalPosition().z());
00156 }
00157 };
00158
00160 struct ComparatorInOut{
00161 bool operator()(const TransientTrackingRecHit::ConstRecHitPointer &a,
00162 const TransientTrackingRecHit::ConstRecHitPointer &b) const{
00163 bool barrel_a = ( a->det()->subDetector() == GeomDetEnumerators::DT ||
00164 a->det()->subDetector() == GeomDetEnumerators::RPCBarrel );
00165
00166 bool barrel_b = ( b->det()->subDetector() == GeomDetEnumerators::DT ||
00167 b->det()->subDetector() == GeomDetEnumerators::RPCBarrel );
00168
00169
00170 if ( barrel_a && barrel_b ) return a->globalPosition().perp() < b->globalPosition().perp();
00171 else if ( !barrel_a && !barrel_b ) return fabs(a->globalPosition().z()) < fabs(b->globalPosition().z());
00172 else if ( barrel_a && !barrel_b ) return true;
00173 else if ( !barrel_a && barrel_b ) return false;
00174 }
00175 };
00176
00177 protected:
00178
00179 std::string theCategory;
00180 bool theTkTrajsAvailableFlag;
00181 float thePtCut;
00182
00183 private:
00184
00185 GlobalMuonTrackMatcher* theTrackMatcher;
00186 MuonDetLayerMeasurements* theLayerMeasurements;
00187 TrackTransformer* theTrackTransformer;
00188 MuonTrackingRegionBuilder* theRegionBuilder;
00189 const MuonServiceProxy* theService;
00190 edm::ESHandle<TrajectoryFitter> theKFFitter;
00191
00192 unsigned long long theCacheId_TRH;
00193 bool theRPCInTheFit;
00194
00195 int theMuonHitsOption;
00196 float theProbCut;
00197 int theHitThreshold;
00198 float theDTChi2Cut;
00199 float theCSCChi2Cut;
00200 float theRPCChi2Cut;
00201 std::string theKFFitterName;
00202 std::string theTrackerPropagatorName;
00203
00204 const edm::Event* theEvent;
00205
00206 std::string theTrackerRecHitBuilderName;
00207 edm::ESHandle<TransientTrackingRecHitBuilder> theTrackerRecHitBuilder;
00208
00209 std::string theMuonRecHitBuilderName;
00210 edm::ESHandle<TransientTrackingRecHitBuilder> theMuonRecHitBuilder;
00211
00212 };
00213 #endif