Go to the documentation of this file.00001
00019 #include "RecoMuon/Navigation/interface/MuonNavigableLayer.h"
00020
00021
00022 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00023 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
00024 #include "RecoMuon/Navigation/interface/MuonDetLayerMap.h"
00025 #include "RecoMuon/Navigation/interface/MuonEtaRange.h"
00026 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00027
00028 #include <algorithm>
00029
00030
00031 using namespace std;
00032
00033 extern float calculateEta(float r, float z) {
00034 if ( z > 0 ) return -log((tan(atan(r/z)/2.)));
00035 return log(-(tan(atan(r/z)/2.)));
00036
00037 }
00038
00039 MuonEtaRange MuonNavigableLayer::trackingRange(const FreeTrajectoryState& fts) const
00040 {
00041 float z = fts.position().z();
00042 float r = fts.position().perp();
00043 float eta;
00044 if ( z>0 ) eta = -log((tan(atan(r/z)/2.)));
00045 else eta = log(-(tan(atan(r/z)/2.)));
00046
00047 double theta = atan(r/z);
00048
00049 double spread = 5.0*sqrt(fts.curvilinearError().matrix()(2,2))/fabs(sin(theta));
00050
00051
00052
00053
00054
00055
00056 double eta_max = 0;
00057
00058 if ( z > 0 ) eta_max = calculateEta(r, z+spread);
00059 else eta_max = calculateEta(r, z-spread);
00060
00061 spread = std::min(0.07, fabs(eta_max-eta));
00062
00063 MuonEtaRange range(eta+spread,eta-spread);
00064
00065 spread = 0.07;
00066
00067
00068 if ( eta > 1.0 && eta < 1.1 ) range = MuonEtaRange(eta+3.0*spread,eta-spread);
00069 if ( eta < -1.0 && eta > -1.1 ) range = MuonEtaRange(eta+spread,eta-3.0*spread);
00070
00071 return range;
00072 }
00073
00074 bool MuonNavigableLayer::isInsideOut(const FreeTrajectoryState& fts) const {
00075
00076 return (fts.position().basicVector().dot(fts.momentum().basicVector())>0);
00077
00078 }
00079