ATLAS Offline Software
NswPatternFinder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "NswPatternFinder.h"
7 #include <cmath>
8 
9 // --------------------------------------------------------------------------------
10 // --------------------------------------------------------------------------------
11 
13  const std::string& name,
14  const IInterface* parent):
16 {
17 }
18 
19 // --------------------------------------------------------------------------------
20 // --------------------------------------------------------------------------------
21 
23  std::vector<StgcHitData>& stgcHits,
24  std::vector<MmHitData>& mmHits,
25  TrigL2MuonSA::TrackPattern& trackPattern) const
26 {
27 
28  ATH_MSG_DEBUG("Start NSW Pattern Finder");
29 
30  trackPattern.mmSegment.clear();
31  trackPattern.stgcSegment.clear();
32 
33  // const int chamber = xAOD::L2MuonParameters::Chamber::EndcapInner; // NSW is located at endcap inner station
34 
35  ATH_CHECK( outlierMm(muonRoad, trackPattern, mmHits) );
36  ATH_CHECK( outlierStgc(muonRoad, trackPattern, stgcHits) );
37 
38  ATH_MSG_DEBUG("nr of MM hits in segment=" << trackPattern.mmSegment.size());
39  ATH_MSG_DEBUG("nr of sTGC hits in segment=" << trackPattern.stgcSegment.size());
40 
41  return StatusCode::SUCCESS;
42 }
43 
44 // --------------------------------------------------------------------------------
45 // --------------------------------------------------------------------------------
46 
47 double TrigL2MuonSA::NswPatternFinder::calc_residualR(const double aw,const double bw,const double x,const double y) const
48 {
49  const double ZERO_LIMIT = 1e-4;
50  if( std::abs(aw) < ZERO_LIMIT ) return y-bw;
51  double ia = 1/aw;
52  double iaq = ia*ia;
53  double dz = x - (y-bw)*ia;
54  return dz/std::sqrt(1.+iaq);
55 }
56 
57 double TrigL2MuonSA::NswPatternFinder::calc_dPhi(const double hitphi, const double roadphi) const
58 {
59 
60  double dphi = std::abs(hitphi - roadphi);
61  if( dphi > M_PI*2 ) dphi = dphi - M_PI*2;
62  if( dphi > M_PI ) dphi = M_PI*2 - dphi;
63 
64  return dphi;
65 }
66 
67 
69 {
70  TrigL2MuonSA::MmHits mmSegment;
71  mmSegment.clear();
72 
73  const int chamber = xAOD::L2MuonParameters::Chamber::EndcapInner; // NSW is located at endcap inner station
74 
75  const double aw = muonRoad.aw[chamber][0];
76  const double bw = muonRoad.bw[chamber][0];
77  const double roadphi = muonRoad.phi[chamber][0];
78 
79  double z = -1;
80  double r = -1;
81  double phi = -1;
82  double residualR = -1;
83  double residualPhi = -1;
84  unsigned int i_layer = 999;
85  double rWidth = -1;
86 
87  for(unsigned int i_hit=0; i_hit<mmHits.size(); i_hit++) {
88 
89  z = mmHits[i_hit].z;
90  r = mmHits[i_hit].r;
91  phi = mmHits[i_hit].phi;
92  i_layer = mmHits[i_hit].layerNumber;
93  residualR = calc_residualR(aw,bw,z,r);
94  residualPhi = calc_dPhi(phi, roadphi);
95  mmHits[i_hit].ResidualR = residualR;
96  mmHits[i_hit].ResidualPhi = residualPhi;
97  rWidth = muonRoad.rWidth[chamber][i_layer];
98 
99  ATH_MSG_DEBUG("Mm .../z/r/aw/bw/residualR/residualPhi/rWidth="
100  << z << "/" << r << "/" << aw << "/" << bw << "/" << residualR << "/" << residualPhi << "/" << rWidth);
101 
102  if( std::abs(residualR) > rWidth ) { // outside Road
103  mmHits[i_hit].isOutlier = 2;
104  continue;
105  }
106 
107  mmSegment.push_back(mmHits[i_hit]);
108  }
109 
110  trackPattern.mmSegment = mmSegment;
111 
112  return StatusCode::SUCCESS;
113 }
114 
116 {
117  TrigL2MuonSA::StgcHits stgcSegment;
118  stgcSegment.clear();
119 
120  const int chamber = xAOD::L2MuonParameters::Chamber::EndcapInner; // NSW is located at endcap inner station
121 
122  const double aw = muonRoad.aw[chamber][0];
123  const double bw = muonRoad.bw[chamber][0];
124  const double roadphi = muonRoad.phi[chamber][0];
125 
126  double z = -1;
127  double r = -1;
128  double phi = -1;
129  double residualR = -1;
130  double residualPhi = -1;
131  unsigned int i_layer = 999;
132  double rWidth = -1;
133  const double phiWidth = 0.1;
134  int channelType = -1;
135 
136  for(unsigned int i_hit=0; i_hit<stgcHits.size(); i_hit++) {
137 
138  z = stgcHits[i_hit].z;
139  r = stgcHits[i_hit].r;
140  phi = stgcHits[i_hit].phi;
141  i_layer = stgcHits[i_hit].layerNumber;
142  channelType = stgcHits[i_hit].channelType;
143 
144  residualR = calc_residualR(aw,bw,z,r);
145  residualPhi = calc_dPhi(phi, roadphi);
146 
147  stgcHits[i_hit].ResidualR = residualR;
148  stgcHits[i_hit].ResidualPhi = residualPhi;
149 
150  if(channelType==0) { // pad
151  rWidth = muonRoad.rWidth[chamber][i_layer];
152 
153  ATH_MSG_DEBUG("Stgc pad .../z/r/aw/bw/residualR/residualPhi/rWidth="
154  << z << "/" << r << "/" << aw << "/" << bw << "/" << residualR << "/" << residualPhi << "/" << rWidth);
155 
156 
157  if( std::abs(residualPhi) > phiWidth ) { // outside Road
158  stgcHits[i_hit].isOutlier = 3;
159  continue;
160  }
161  if( std::abs(residualR) > rWidth ) { // outside Road
162  stgcHits[i_hit].isOutlier = 2;
163  continue;
164  }
165 
166  }
167  else if(channelType==1) { // strip
168  rWidth = muonRoad.rWidth[chamber][i_layer];
169 
170  ATH_MSG_DEBUG("Stgc strip .../z/r/aw/bw/residualR/residualPhi/rWidth="
171  << z << "/" << r << "/" << aw << "/" << bw << "/" << residualR << "/" << residualPhi << "/" << rWidth);
172 
173  if( std::abs(residualR) > rWidth ) { // outside Road
174  stgcHits[i_hit].isOutlier = 2;
175  continue;
176  }
177 
178  }
179  else if(channelType==2) { // wire
180  ATH_MSG_DEBUG("Stgc wire .../z/r/aw/bw/residualR/residualPhi/rWidth="
181  << z << "/" << r << "/" << aw << "/" << bw << "/" << residualR << "/" << residualPhi << "/" << rWidth);
182 
183  if( std::abs(residualPhi) > phiWidth ) { // outside Road
184  stgcHits[i_hit].isOutlier = 3;
185  continue;
186  }
187 
188  }
189 
190 
191  stgcSegment.push_back(stgcHits[i_hit]);
192  }
193 
194  trackPattern.stgcSegment = stgcSegment;
195 
196  return StatusCode::SUCCESS;
197 }
beamspotman.r
def r
Definition: beamspotman.py:676
TrigL2MuonSA::TrackPattern::stgcSegment
TrigL2MuonSA::StgcHits stgcSegment
Definition: TrackData.h:59
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
calibdata.chamber
chamber
Definition: calibdata.py:32
TrigL2MuonSA::TrackPattern::mmSegment
TrigL2MuonSA::MmHits mmSegment
Definition: TrackData.h:58
TrigL2MuonSA::NswPatternFinder::findPatterns
StatusCode findPatterns(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::StgcHits &stgcHits, TrigL2MuonSA::MmHits &mmHits, TrigL2MuonSA::TrackPattern &trackPattern) const
Definition: NswPatternFinder.cxx:22
TrigL2MuonSA::MuonRoad::bw
double bw[N_STATION][N_SECTOR]
Definition: MuonRoad.h:82
M_PI
#define M_PI
Definition: ActiveFraction.h:11
TrigL2MuonSA::NswPatternFinder::calc_residualR
double calc_residualR(const double aw, const double bw, const double x, const double y) const
Definition: NswPatternFinder.cxx:47
TrigL2MuonSA::NswPatternFinder::outlierStgc
StatusCode outlierStgc(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::TrackPattern &trackPattern, TrigL2MuonSA::StgcHits &stgcHits) const
Definition: NswPatternFinder.cxx:115
x
#define x
TrigL2MuonSA::MuonRoad::aw
double aw[N_STATION][N_SECTOR]
Definition: MuonRoad.h:81
TrigL2MuonSA::TrackPattern
Definition: TrackData.h:16
NswPatternFinder.h
TrigL2MuonSA::MuonRoad
Definition: MuonRoad.h:20
z
#define z
TrigL2MuonSA::NswPatternFinder::outlierMm
StatusCode outlierMm(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::TrackPattern &trackPattern, TrigL2MuonSA::MmHits &mmHits) const
Definition: NswPatternFinder.cxx:68
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TrigL2MuonSA::NswPatternFinder::calc_dPhi
double calc_dPhi(const double hitphi, const double roadphi) const
Definition: NswPatternFinder.cxx:57
ZERO_LIMIT
const float ZERO_LIMIT
Definition: VP1TriggerHandleL2.cxx:37
TrigL2MuonSA::MuonRoad::phi
double phi[N_STATION][N_SECTOR]
Definition: MuonRoad.h:83
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
TrigMuonDefs.h
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
TrigL2MuonSA::MmHits
std::vector< MmHitData > MmHits
Definition: MmData.h:47
y
#define y
TrigL2MuonSA::MuonRoad::rWidth
double rWidth[N_STATION][N_LAYER]
Definition: MuonRoad.h:84
xAOD::L2MuonParameters::EndcapInner
@ EndcapInner
Inner station in the endcap spectrometer.
Definition: TrigMuonDefs.h:19
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
TrigL2MuonSA::StgcHits
std::vector< StgcHitData > StgcHits
Definition: StgcData.h:49
xAOD::phiWidth
phiWidth
Definition: RingSetConf_v1.cxx:612
AthAlgTool
Definition: AthAlgTool.h:26
TrigL2MuonSA::NswPatternFinder::NswPatternFinder
NswPatternFinder(const std::string &type, const std::string &name, const IInterface *parent)
Definition: NswPatternFinder.cxx:12