File indexing completed on 2024-04-06 12:27:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include "RecoMuon/Navigation/interface/MuonNavigableLayer.h"
0018
0019
0020 #include "TrackingTools/DetLayers/interface/DetLayer.h"
0021 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
0022 #include "RecoMuon/Navigation/interface/MuonDetLayerMap.h"
0023 #include "RecoMuon/Navigation/interface/MuonEtaRange.h"
0024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0025
0026 #include <algorithm>
0027
0028 using namespace std;
0029
0030 extern float calculateEta(float r, float z) {
0031 if (z > 0)
0032 return -log((tan(atan(r / z) / 2.)));
0033 return log(-(tan(atan(r / z) / 2.)));
0034 }
0035
0036 MuonEtaRange MuonNavigableLayer::trackingRange(const FreeTrajectoryState& fts) const {
0037 float z = fts.position().z();
0038 float r = fts.position().perp();
0039 float eta;
0040 if (z > 0)
0041 eta = -log((tan(atan(r / z) / 2.)));
0042 else
0043 eta = log(-(tan(atan(r / z) / 2.)));
0044
0045 double theta = atan(r / z);
0046
0047 double spread = 5.0 * sqrt(fts.curvilinearError().matrix()(2, 2)) / fabs(sin(theta));
0048
0049
0050
0051
0052
0053
0054 double eta_max = 0;
0055
0056 if (z > 0)
0057 eta_max = calculateEta(r, z + spread);
0058 else
0059 eta_max = calculateEta(r, z - spread);
0060
0061 spread = std::min(0.07, fabs(eta_max - eta));
0062
0063 MuonEtaRange range(eta + spread, eta - spread);
0064
0065 spread = 0.07;
0066
0067
0068 if (eta > 1.0 && eta < 1.1)
0069 range = MuonEtaRange(eta + 3.0 * spread, eta - spread);
0070 if (eta < -1.0 && eta > -1.1)
0071 range = MuonEtaRange(eta + spread, eta - 3.0 * spread);
0072
0073 return range;
0074 }
0075
0076 bool MuonNavigableLayer::isInsideOut(const FreeTrajectoryState& fts) const {
0077 return (fts.position().basicVector().dot(fts.momentum().basicVector()) > 0);
0078 }