23 return StatusCode::SUCCESS;
39 for(
int i_station=0; i_station<6; i_station++) {
48 for(
int i_sector=0; i_sector<
N_SECTOR; i_sector++) {
50 ATH_MSG_DEBUG(
"--- chamber/sector=" << chamber <<
"/" << sector);
51 if( sector==99 )
continue;
53 float zMin {0}, zMax {0}, rMin {0}, rMax {0};
54 float tmp_zMin {0}, tmp_zMax {0}, tmp_rMin {0}, tmp_rMax {0};
55 float etaMin {0}, etaMax {0}, phiMin {0}, phiMax {0};
56 int ty1 {-1}, ty2 {-1};
59 for(
unsigned int sta_iter=0; sta_iter< muonRoad.
stationList.size(); sta_iter++){
64 int chamber_this = 99;
69 if(chamber_this == chamber && sector_this == sector ){
71 if(ty1 == -1) ty1 =
m_idHelperSvc->mdtIdHelper().stationNameIndex(name)+1;
72 else if(ty2 == -1) ty2 =
m_idHelperSvc->mdtIdHelper().stationNameIndex(name)+1;
79 tmp_zMin = (trans*OrigOfMdtInAmdbFrame).
z();
80 if(tmp_zMin < 0)
sign = -1;
81 else if(tmp_zMin > 0)
sign = 1;
82 tmp_zMax = tmp_zMin +
sign*muonStation->
Zsize();
83 if(zMin==0 || tmp_zMin < zMin) zMin = tmp_zMin;
84 if(zMax==0 || tmp_zMax > zMax) zMax = tmp_zMax;
86 tmp_rMin = (trans*OrigOfMdtInAmdbFrame).
perp();
87 tmp_rMax = tmp_rMin + muonStation->
Rsize();
88 if(rMin==0 || tmp_rMin < rMin) rMin = tmp_rMin;
89 if(rMax==0 || tmp_rMax > rMax) rMax = tmp_rMax;
96 muonRoad.
aw[chamber][i_sector],
97 muonRoad.
bw[chamber][i_sector],
102 muonRoad.
aw[chamber][i_sector],
103 muonRoad.
bw[chamber][i_sector],
108 ATH_MSG_DEBUG(
"...zMin/zMax/ty1/ty2=" << zMin <<
"/" << zMax <<
"/" << ty1 <<
"/" << ty2);
114 ATH_MSG_DEBUG(
"...etaMin/etaMax/phiMin/phiMax=" << etaMin <<
"/" << etaMax <<
"/" << phiMin <<
"/" << phiMax);
116 mdtRegion.
zMin[chamber][i_sector] = zMin;
117 mdtRegion.
zMax[chamber][i_sector] = zMax;
118 mdtRegion.
rMin[chamber][i_sector] = rMin;
119 mdtRegion.
rMax[chamber][i_sector] = rMax;
120 mdtRegion.
etaMin[chamber][i_sector] = etaMin;
121 mdtRegion.
etaMax[chamber][i_sector] = etaMax;
122 mdtRegion.
phiMin[chamber][i_sector] = phiMin;
123 mdtRegion.
phiMax[chamber][i_sector] = phiMax;
124 for(
int i_type=0; i_type<2; i_type++) {
125 int type = (i_type==0) ? ty1 : ty2;
126 if(
type == -1 )
continue;
133 for (
int i=0; i<6; i++){
135 if (i==4) muonRoad.
phi[9][j] =
phi;
136 else if (i==5) muonRoad.
phi[10][j] =
phi;
137 else muonRoad.
phi[i][j] =
phi;
141 return StatusCode::SUCCESS;
166 for(
int i_station=0; i_station<7; i_station++) {
175 for(
int i_sector=0; i_sector<2; i_sector++) {
176 int sector = sectors[i_sector];
177 ATH_MSG_DEBUG(
"--- chamber/sector=" << chamber <<
"/" << sector);
178 if( sector==99 )
continue;
201 for(
unsigned int sta_iter=0; sta_iter<muonRoad.
stationList.size(); sta_iter++){
203 int stationPhi =
m_idHelperSvc->mdtIdHelper().stationPhi(
id);
205 int chamber_this = 99;
206 int sector_this = 99;
209 ATH_MSG_DEBUG(
"name/stationPhi/isEndcap/chamber_this/sector_this=" <<
210 name <<
"/" << stationPhi <<
"/" << isEndcap <<
"/" << chamber_this <<
"/" << sector_this);
212 if(chamber_this == chamber && sector_this == sector){
227 tmp_zMin = (trans*OrigOfMdtInAmdbFrame).
z();
228 if(tmp_zMin < 0)
sign = -1;
229 else if(tmp_zMin > 0)
sign = 1;
230 tmp_zMax = tmp_zMin +
sign*muonStation->
Zsize();
232 if(sta_zMin==0 || tmp_zMin<sta_zMin) sta_zMin = tmp_zMin;
233 if(sta_zMin==0 || tmp_zMax<sta_zMin) sta_zMin = tmp_zMax;
234 if(sta_zMax==0 || tmp_zMax>sta_zMax) sta_zMax = tmp_zMax;
235 if(sta_zMax==0 || tmp_zMin>sta_zMax) sta_zMax = tmp_zMin;
237 if (chamber_this==barrel_inner){
238 tmp_rMin = (trans*OrigOfMdtInAmdbFrame).
perp()/scale;
239 tmp_rMax = tmp_rMin+muonStation->
Rsize()/scale;
240 if(rMin==0 || tmp_rMin < rMin)rMin = tmp_rMin;
241 if(rMax==0 || tmp_rMax > rMax)rMax = tmp_rMax;
244 if (chamber_this==bee){
245 tmp_rMin = (trans*OrigOfMdtInAmdbFrame).
perp()/scale;
246 tmp_rMax = tmp_rMin+muonStation->
Rsize()/scale;
247 if(rMin==0 || tmp_rMin < rMin)rMin = tmp_rMin;
248 if(rMax==0 || tmp_rMax > rMax)rMax = tmp_rMax;
254 if (chamber==endcap_middle) {
258 zMin = tgcFitResult.
tgcMid1[3];
259 zMax = tgcFitResult.
tgcMid2[3];
261 zMin = tgcFitResult.
tgcMid2[3];
262 zMax = tgcFitResult.
tgcMid1[3];
271 else if (chamber==barrel_inner || chamber==bee) {
272 float max_road = 50 ;
274 muonRoad.
aw[chamber][i_sector],
275 muonRoad.
bw[chamber][i_sector],
284 if (chamber!=barrel_inner && chamber!=bee){
286 muonRoad.
aw[chamber][i_sector],
287 muonRoad.
bw[chamber][i_sector],
299 ATH_MSG_DEBUG(
"...etaMin/etaMax/phiMin/phiMax=" << etaMin <<
"/" << etaMax <<
"/" << phiMin <<
"/" << phiMax);
301 mdtRegion.
zMin[chamber][i_sector] = zMin;
302 mdtRegion.
zMax[chamber][i_sector] = zMax;
303 mdtRegion.
rMin[chamber][i_sector] = rMin;
304 mdtRegion.
rMax[chamber][i_sector] = rMax;
305 mdtRegion.
etaMin[chamber][i_sector] = etaMin;
306 mdtRegion.
etaMax[chamber][i_sector] = etaMax;
307 mdtRegion.
phiMin[chamber][i_sector] = phiMin;
308 mdtRegion.
phiMax[chamber][i_sector] = phiMax;
309 for(
int i_type=0; i_type<2; i_type++) {
311 if(
type == -1 )
continue;
317 StatusCode
sc =
computePhi(p_roids, tgcFitResult, mdtRegion, muonRoad);
318 if (
sc.isFailure()) {
323 return StatusCode::SUCCESS;
330 int& chamber,
int& sector)
332 endcap = (name[0]==
'E' || name[0]==
'F' || (name[0]==
'B' && name[1]==
'E')) ?
true :
false;
335 if(name[2]==
'S' || name[2]==
'F' || name[2]==
'G') largeSmall = 1;
336 if (name[1]==
'E' && name[2]==
'E') largeSmall=1;
337 sector = (
phi-1)*2 + largeSmall;
347 if(name[1]==
'E' && name[2]==
'E')
356 if(name[1]==
'M' && name[2]==
'E')
358 if(name[1]==
'M' && name[2]==
'G')
368 phiMin = phiMiddle - 0.1;
369 phiMax = phiMiddle + 0.1;
370 if ( phiMin < -1.*
M_PI ) phiMin += 2.*
M_PI;
371 if ( phiMax > 1.*
M_PI ) phiMax -= 2.*
M_PI;
378 float& etaMin,
float& etaMax)
const{
382 if(rMin > 0 && rMax > 0){
383 std::array<float,4>
eta{};
386 theta = (std::abs(zMin)>0.1)? std::atan(rMin/std::abs(zMin)):
M_PI/2.;
387 eta[0] = (zMin>0.)? -std::log(std::tan(
theta/2.)) : std::log(std::tan(
theta/2.));
389 theta = (std::abs(zMax)>0.1)? std::atan(rMin/std::abs(zMax)):
M_PI/2.;
390 eta[1] = (zMax>0.)? -std::log(std::tan(
theta/2.)) : std::log(std::tan(
theta/2.));
392 theta = (std::abs(zMax)>0.1)? std::atan(rMax/std::abs(zMax)):
M_PI/2.;
393 eta[2] = (zMax>0.)? -std::log(std::tan(
theta/2.)) : std::log(std::tan(
theta/2.));
395 theta = (std::abs(zMin)>0.1)? std::atan(rMax/std::abs(zMin)):
M_PI/2.;
396 eta[3] = (zMin>0.)? -std::log(std::tan(
theta/2.)) : std::log(std::tan(
theta/2.));
398 etaMin = *std::min_element(std::begin(
eta), std::end(
eta));
399 etaMax = *std::max_element(std::begin(
eta), std::end(
eta));
401 if (etaMin > etaMax) {
413 const float rMin,
const float rMax,
float& zMin,
float& zMax)
const
426 dz = max_road*std::sqrt(1.+ia*ia);
427 z1 = (ia)? (rMin-bw)*ia : bw;
428 z2 = (ia)? (rMax-bw)*ia : bw;
430 zMin = std::min({z1-dz, z1+dz, z2-dz, z2+dz});
431 zMax = std::max({z1-dz, z1+dz, z2-dz, z2+dz});
438 const float zMax,
float& rMin,
float& rMax)
const
444 if(zMin>=99999. && zMax<=-99999.){
452 rMin = std::min({r1-road, r1+road, r2-road, r2+road});
453 rMax = std::max({r1-road, r1+road, r2-road, r2+road});
455 if(rMin<0.) rMin = 0.;
456 if(rMax<0.) rMax = 0.;
464 const double PHI_BOUNDARY = 0.2;
468 for (iHit = 0; iHit < tgcHits.size(); iHit++)
493 return StatusCode::SUCCESS;
510 for(
int i_station=0; i_station<5; i_station++) {
517 for(
int i_sector=0; i_sector<2; i_sector++) {
520 if (chamber==endcap_middle || !tgcFitResult.
isPhiDir) {
521 muonRoad.
phi[chamber][i_sector] = tgcFitResult.
phi;
525 muonRoad.
phi[chamber][i_sector] = 0.;
528 if (chamber==endcap_outer) {
530 double MiddleZ = std::abs(mdtRegion.
zMin[endcap_middle][i_sector] + mdtRegion.
zMax[endcap_middle][i_sector])/2.;
531 double MiddleR = MiddleZ*muonRoad.
aw[endcap_middle][i_sector] + muonRoad.
bw[endcap_middle][i_sector];
533 double OuterZ = std::abs(mdtRegion.
zMin[endcap_outer][i_sector] + mdtRegion.
zMax[endcap_outer][i_sector])/2.;
534 double OuterR = OuterZ*muonRoad.
aw[endcap_outer][i_sector] + muonRoad.
bw[endcap_outer][i_sector];
535 double DrOuter = std::abs(OuterR-MiddleR);
536 dz = std::sqrt((OuterZ-MiddleZ)*(OuterZ-MiddleZ) + DrOuter*DrOuter);
537 dz = (OuterZ-MiddleZ);
539 }
if (chamber==endcap_inner || chamber==barrel_inner) {
544 if(tgcFitResult.
tgcInn[2] != 0.) {
545 muonRoad.
phi[chamber][i_sector] = tgcFitResult.
tgcInn[1];
548 double InnerZ = std::abs(mdtRegion.
zMin[endcap_inner][i_sector] + mdtRegion.
zMax[endcap_inner][i_sector])/2.;
549 double InnerR = InnerZ*muonRoad.
aw[endcap_inner][i_sector] + muonRoad.
bw[endcap_inner][i_sector];
550 double DrInner = std::abs(InnerR-MiddleR);
551 dz = -std::sqrt((InnerZ-MiddleZ)*(InnerZ-MiddleZ) + DrInner*DrInner);
552 dz = -std::abs(InnerZ-MiddleZ);
555 muonRoad.
phi[chamber][i_sector] = (dz)* tgcFitResult.
dPhidZ + tgcFitResult.
phi;
556 while (muonRoad.
phi[chamber][i_sector] >
M_PI) muonRoad.
phi[chamber][i_sector] -= 2*
M_PI;
557 while (muonRoad.
phi[chamber][i_sector] <-
M_PI) muonRoad.
phi[chamber][i_sector] += 2*
M_PI;
561 muonRoad.
phi[chamber][i_sector] = p_roids->
phi();
565 return StatusCode::SUCCESS;
Scalar eta() const
pseudorapidity method
Scalar perp() const
perp method - perpendicular length
Scalar phi() const
phi method
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
static const std::vector< std::string > types
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const MuonStation * parentMuonStation() const
const Amg::Transform3D & getNominalAmdbLRSToGlobal() const
const Amg::Vector3D & getBlineFixedPointInAmdbLRS() const
virtual double phi() const override final
Methods to retrieve data members.
const_pointer_type cptr()
StatusCode prepareTgcPoints(const TrigL2MuonSA::TgcHits &tgcHits)
StatusCode computePhi(const TrigRoiDescriptor *p_roids, const TrigL2MuonSA::TgcFitResult &tgcFitResult, const TrigL2MuonSA::MdtRegion &mdtRegion, TrigL2MuonSA::MuonRoad &muonRoad) const
void find_phi_min_max(float phiMiddle, float &phiMin, float &phiMax) const
virtual StatusCode initialize() override
StatusCode getMdtRegions(const TrigRoiDescriptor *p_roids, const TrigL2MuonSA::RpcFitResult &rpcFitResult, TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::MdtRegion &mdtRegion) const
void find_barrel_road_dim(const float max_road, const float aw, const float bw, const float rMmin, const float rMax, float &zMin, float &zMax) const
static void find_station_sector(const std::string &name, int phi, bool &endcap, int &chamber, int §or)
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_muDetMgrKey
TrigL2MuonSA::TgcFit::PointArray m_tgcStripMidPoints
void find_endcap_road_dim(const float road, const float aw, const float bw, const float zMin, const float zMax, float &rMin, float &rMax) const
TrigL2MuonSA::TgcFit::PointArray m_tgcWireMidPoints
void find_eta_min_max(float zMin, float rMin, float zMax, float rMax, float &etaMin, float &etaMax) const
TrigL2MuonSA::TgcFit::PointArray m_tgcWireInnPoints
TrigL2MuonSA::TgcFit::PointArray m_tgcStripInnPoints
double phiMin[N_STATION][N_SECTOR]
double zMin[N_STATION][N_SECTOR]
double rMin[N_STATION][N_SECTOR]
double zMax[N_STATION][N_SECTOR]
double etaMax[N_STATION][N_SECTOR]
double phiMax[N_STATION][N_SECTOR]
double etaMin[N_STATION][N_SECTOR]
int chamberType[N_STATION][N_SECTOR][2]
double rMax[N_STATION][N_SECTOR]
std::vector< Identifier > stationList
double aw[N_STATION][N_SECTOR]
double MaxWidth(int i_station)
double bw[N_STATION][N_SECTOR]
double phi[N_STATION][N_SECTOR]
double rWidth[N_STATION][N_LAYER]
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
std::vector< TgcHitData > TgcHits
@ BarrelInner
Inner station in the barrel spectrometer.
@ EndcapOuter
Outer station in the endcap spectrometer.
@ BarrelMiddle
Middle station in the barrel spectrometer.
@ EndcapMiddle
Middle station in the endcap spectrometer.
@ BEE
BEE measurement point.
@ EndcapExtra
Extra station in the endcap spectrometer.
@ BarrelOuter
Outer station in the barrel spectrometer.
@ BME
BME measurement point.
@ EndcapInner
Inner station in the endcap spectrometer.