ATLAS Offline Software
Loading...
Searching...
No Matches
Station.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
8#include "GaudiKernel/SystemOfUnits.h"
10#include "MuonGeoModel/MYSQL.h"
14
15#include <algorithm>
16#include <cassert>
17#include <iostream>
18#include <limits>
19#include <utility>
20
21namespace MuonGM {
22
23 Station::Station(MYSQL& mysql, std::string s) :
24 AthMessaging("MuonGeoModel.Station"),
27 m_name(std::move(s)),
28 m_hasMdts (false)
29 {
30 mysql.StoreStation(this);
31 }
32
34 AthMessaging("MuonGeoModel.Station"),
37 m_name("unknown"),
38 m_hasMdts (false)
39 { }
40
41
43 if (FindAlignPos(p.zindex, p.phiindex) != m_alignpositions.end() && p.jobindex == 0) {
44 ATH_MSG_WARNING(" this alignposition already exists !!!");
45 ATH_MSG_WARNING(" for station named " << m_name << " setting alignposition at z,phi, key " <<
46 p.zindex << " " << p.phiindex << " " << p.zindex * 100 + p.phiindex <<
47 " and jobIndex = 0");
48 assert(0);
49 }
50
51 int key = p.zindex * 100 + p.phiindex;
52 m_alignpositions.insert(std::pair<int, AlignPos>(key, p));
53 }
54
55 AlignPosIterator Station::getFirstAlignPosInRange(int iz, int iphi, AlignPosIterator &lastAlignPosInRange) const {
56 int key = iz * 100 + iphi;
57 std::pair<AlignPosIterator, AlignPosIterator> ppp = m_alignpositions.equal_range(key);
58 lastAlignPosInRange = ppp.second;
59 return ppp.first;
60 }
61
62 AlignPosIterator Station::FindAlignPos(int iz, int iphi) const {
63 // imt - probably needs to be different key for align pos
64 int key = iz * 100 + iphi;
65 // std::cout<<" looking for align pos. with key "<<key<<std::endl;
66 return m_alignpositions.find(key);
67 }
68
69 int Station::CountAlignPos(int iz, int iphi) const {
70 // imt - probably needs to be different key for align pos
71 int key = iz * 100 + iphi;
72 // std::cout<<" looking for align pos. with key "<<key<<std::endl;
73 return m_alignpositions.count(key);
74 }
75
78
79 void Station::SetComponent(Component *c) { m_components.emplace_back(c); }
80
81 void Station::SetCutout(Cutout *c) { m_cutouts.emplace_back(c); }
82
83 Component *Station::GetComponent(int i) const { return m_components[i].get(); }
84
85 Cutout *Station::GetCutout(int i) const { return m_cutouts[i].get(); }
86
88 if (FindPosition(p.zindex, p.phiindex) != end()) {
89 ATH_MSG_WARNING(" this position already exists !!!");
90 ATH_MSG_WARNING(" for station named " << m_name << " setting position at z,phi, key " <<
91 p.zindex << " " << p.phiindex << " " << p.zindex * 100 + p.phiindex);
92 assert(0);
93 } else {
94 p.isAssigned = true;
95 m_positions[p.zindex * 100 + p.phiindex] = p;
96 }
97 }
98
99 PositionIterator Station::FindPosition(int iz, int iphi) const {
100 int key = iz * 100 + iphi;
101 return m_positions.find(key);
102 }
103
104 int Station::Npositions() const { return m_positions.size(); }
105
106 PositionIterator Station::begin() const { return m_positions.begin(); }
107
108 PositionIterator Station::end() const { return m_positions.end(); }
109
110 const std::string& Station::GetName() const { return m_name; }
111
112 double Station::GetThickness(const MYSQL& mysql) const {
113 double thick = 0;
114 if (m_name[0] == 'T') {
115 for (unsigned int i = 0; i < m_components.size(); i++) {
116 TgcComponent *t = dynamic_cast<TgcComponent*>(m_components[i].get());
117 if (not t){
118 ATH_MSG_ERROR("Dynamic cast to TgcComponent failed");
119 continue;
120 }
121 thick = thick > t->GetThickness(mysql) + t->posz ? thick : t->GetThickness(mysql) + t->posz;
122 }
123 } else {
124 double zstart = std::numeric_limits<double>::max();
125
126 for (unsigned int i = 0; i < m_components.size(); i++) {
127 StandardComponent* s = dynamic_cast<StandardComponent*>(m_components[i].get());
128 if (not s){
129 ATH_MSG_ERROR("Dynamic cast to StandardComponent failed");
130 continue;
131 }
132 thick = thick > s->GetThickness(mysql) + s->posz ? thick : s->GetThickness(mysql) + s->posz;
133 if (i == 0 || s->posz < zstart)
134 zstart = s->posz;
135
136 ATH_MSG_VERBOSE("Station " << m_name << " calculating Thinkness = " << thick << " and zstart = " << zstart);
137 }
138
139 if (std::abs(zstart) > 0.001) {
140 thick = thick - zstart;
142 ATH_MSG_VERBOSE("Station " << m_name << " redefining Thinkness = " << thick <<
143 " because zstart = " << zstart <<
144 "; then amdbOrigine_along_thickness = " << m_amdbOrigine_along_thickness);
145 }
146 }
147
148 return thick;
149 }
150
152 return 0.;
153 }
154
156 return 0.;
157
158 }
159
160 double Station::GetLength() const {
161 double len = 0;
162 if (m_name[0] == 'T') {
163 double innerrad = std::numeric_limits<double>::max();
164 double outerrad = 0.;
165
166 for (unsigned int i = 0; i < m_components.size(); i++) {
167 TgcComponent *tg = dynamic_cast<TgcComponent*>(m_components[i].get());
168
169 if (tg->posy < innerrad) {
170 innerrad = tg->posy;
171 }
172
173 if (tg->posy + tg->dy > outerrad) {
174 outerrad = tg->posy + tg->dy;
175 }
176 }
177
178 len = outerrad - innerrad;
179 } else {
180 double ystart = 999999.;
181
182 for (unsigned int i = 0; i < m_components.size(); i++) {
183 StandardComponent* sc = dynamic_cast<StandardComponent*>(m_components[i].get());
184 if (not sc){
185 ATH_MSG_ERROR("Dynamic cast to StandardComponent failed at line "<<__LINE__);
186 continue;
187 }
188 ATH_MSG_VERBOSE("Station " << m_name << " *** comp " << i << " named " <<
189 sc->name << " posy " << sc->posy << " dy " << sc->dy << " len " << len <<
190 " ystart " << ystart);
191 if ((sc->dy + sc->posy) > len)
192 len = sc->dy + sc->posy;
193 if (i == 0 || sc->posy < ystart)
194 ystart = sc->posy;
195 ATH_MSG_VERBOSE(" now len = " << len << " ystart = " << ystart);
196 }
197
198 if (std::abs(ystart) > 0.001) {
199 len = len - ystart;
201
202 ATH_MSG_VERBOSE("Station " << m_name << " redefining len = " << len << " because ystart = " << ystart);
203 }
204 }
205
206 return len;
207 }
208
209 double Station::getYMin() const {
210 if (m_name[0] != 'T') {
211 double ystart = std::numeric_limits<double>::max();
212
213 for (unsigned int i = 0; i < m_components.size(); i++) {
214 StandardComponent* sc = dynamic_cast<StandardComponent*>(m_components[i].get());
215 if (not sc){
216 ATH_MSG_ERROR("Dynamic cast to StandardComponent failed at line "<<__LINE__);
217 continue;
218 }
219 if (i == 0 || sc->posy < ystart)
220 ystart = sc->posy;
221 }
222 return ystart;
223 }
224 return 0.;
225 }
226
227 double Station::GetWidth1() const {
228 double maxdxmin = std::numeric_limits<double>::lowest();
229 double ymin = getYMin();
230 double w = 0;
231 for (unsigned int i = 0; i < m_components.size(); i++) {
232 std::string_view n = std::string_view(m_components[i]->name).substr(0, 3);
233 if (n == "TGC") {
234 double dw = 20.;
235 std::string_view typetgc = std::string_view(m_components[i]->name).substr(3, 2);
236 // in case of station containing one module
237 if (typetgc == "01" || typetgc == "06" || typetgc == "12" || typetgc == "18" || typetgc == "19" || typetgc == "20" || typetgc == "21") {
238 dw = 0.;
239 }
240
241 if (w == 0) {
242 w = m_components[i]->dx1 + dw;
243 } else {
244 if (w > m_components[i]->dx1 + dw) {
245 w = m_components[i]->dx1 + dw;
246 }
247 }
248 } else {
249 double dxmin = 0.;
250 if (std::abs(m_components[i]->dy) < 1.e-10) {
251 dxmin = m_components[i]->dx1;
252 } else {
253 double num = (m_components[i]->dx2 - m_components[i]->dx1) / 2.;
254 double tantheta = num != 0 ? num / m_components[i]->dy : 0;
255 auto *sc = dynamic_cast<StandardComponent*>(m_components[i].get());
256 if (not sc){
257 ATH_MSG_ERROR("Dynamic cast to StandardComponent failed at line "<<__LINE__);
258 continue;
259 }
260 double y = sc->posy;
261 dxmin = m_components[i]->dx1 + 2. * tantheta * (ymin - y);
262 }
263
264 if (maxdxmin < dxmin && (n.substr(0, 2) != "LB" || m_name[0] == 'B'))
265 maxdxmin = dxmin;
266 }
267 }
268
269 if (m_name.substr(0, 1) == "T")
270 return w;
271 else
272 return maxdxmin;
273 }
274
275 double Station::GetWidth2() const {
276 // double ymin= -getAmdbOrigine_along_length();
277 double ymax = getYMin() + GetLength();
278 double maxdxmax = std::numeric_limits<double>::lowest();
279 double w = 0;
280
281 for (unsigned int i = 0; i < m_components.size(); i++) {
282 if (w < m_components[i]->dx2) {
283 w = m_components[i]->dx2;
284 }
285
286 std::string_view n = std::string_view(m_components[i]->name).substr(0, 3);
287 if (n == "TGC") {
288 double dw = 20.;
289 std::string_view typetgc = std::string_view(m_components[i]->name).substr(3, 2);
290 // in case of one station containing one module
291 if (typetgc == "01" || typetgc == "06" || typetgc == "12" || typetgc == "18" || typetgc == "19" || typetgc == "20" || typetgc == "21") {
292 dw = 0.;
293 }
294 w += dw;
295 } else {
296 double dxmax = 0.;
297 if (std::abs(m_components[i]->dy) < 1.e-10)
298 dxmax = m_components[i]->dx2;
299 else {
300 double num = (m_components[i]->dx2 - m_components[i]->dx1) / 2.;
301 double tantheta = num != 0 ? num / m_components[i]->dy : 0;
302 auto *sc = dynamic_cast<StandardComponent*>(m_components[i].get());
303 if (not sc){
304 ATH_MSG_ERROR("Dynamic cast to StandardComponent failed at line "<<__LINE__);
305 continue;
306 }
307 double y = sc->posy;
308 dxmax = m_components[i]->dx1 + 2. * tantheta * (ymax - y);
309 }
310
311 if (maxdxmax < dxmax)
312 maxdxmax = dxmax;
313 }
314 }
315
316 if (m_name.compare(0, 1, "T") == 0)
317 return w;
318 else
319 return maxdxmax;
320 }
321
322 int Station::GetNrOfComponents() const { return m_components.size(); }
323
324 int Station::GetNrOfCutouts() const { return m_cutouts.size(); }
325
326 std::ostream &operator<<(std::ostream &os, const Station &s) {
327 os << "Station m_name: " << s.m_name << " " << s.m_components.size() << std::endl;
328 for (unsigned int i = 0; i < s.m_components.size(); i++)
329 os << "\t" << s.m_components[i].get() << std::endl;
330
332 for (k = s.begin(); k != s.end(); ++k)
333 os << "\t\t" << (*k).second << std::endl;
334
336 for (ak = s.abegin(); ak != s.aend(); ++ak)
337 os << "\t\t" << (*ak).second << std::endl;
338
339 os << "--------------------------------------------------" << std::endl;
340 return os;
341 }
342
343 double Station::mdtHalfPitch(const MYSQL& mysql) const {
344 const MDT *mdtobj = dynamic_cast<const MDT*>(mysql.GetATechnology("MDT0"));
345 if (not mdtobj){
346 ATH_MSG_ERROR("Dynamic cast to MDT failed at line "<<__LINE__);
347 return 0.;
348 }
349 double mdthalfpitch = 0.5 * (mdtobj->pitch);
350
351 if (hasMdts()) {
352
353 for (int icomp = 0; icomp < GetNrOfComponents(); ++icomp) {
354 const Component *c = GetComponent(icomp);
355 if (c->name.compare(0, 3, "MDT") != 0)
356 continue;
357 const MDT *mdtobj = dynamic_cast<const MDT*>(mysql.GetATechnology(c->name));
358 if (!mdtobj) {
359 ATH_MSG_ERROR("Cannot find MDT definition for component " << c->name);
360 continue;
361 }
362 mdthalfpitch = 0.5 * (mdtobj->pitch);
363 ATH_MSG_DEBUG("Setting halfpitch " << mdthalfpitch << " for station " << m_name);
364 break;
365 }
366 }
367 return mdthalfpitch;
368 }
369
370 // this is really needed
371 GeoTrf::Transform3D Station::native_to_tsz_frame(const MYSQL& mysql, const Position &p) const {
372 int amdbVersion = mysql.getNovaReadVersion();
373
374 if (amdbVersion > 0 && amdbVersion < 7 && m_name[0] != 'B') {
375 ATH_MSG_DEBUG("For AMDB version " << amdbVersion << " a left-handed chamber coordinate system was used "
376 << " for endcap side A so be very careful.");
377 }
378
379 // first apply here the mirror symmetry: (we, in fact, apply a rotation)
380 GeoTrf::Transform3D mirrsym = GeoTrf::Transform3D::Identity();
381 if (p.isMirrored) {
382 if (m_name[0] == 'B') {
383 mirrsym = GeoTrf::RotateX3D(180. * Gaudi::Units::deg);
384 }
385 }
386
387 // define the translation to position the chamber in the tzs frame
388 GeoTrf::Translate3D AMDBorgTranslation(0, 0, 0);
389 if ((m_name[0] == 'B' || p.isBarrelLike) && p.zindex < 0 && (!p.isMirrored) && hasMdts()) {
390 double halfpitch = mdtHalfPitch(mysql);
391 AMDBorgTranslation = GeoTrf::Translate3D(GetThickness(mysql) / 2. - getAmdbOrigine_along_thickness(mysql), 0., GetLength() / 2. - (getAmdbOrigine_along_length() + halfpitch));
392
393 ATH_MSG_VERBOSE(" GetThickness / getAmdbO_thick / GetLength() / getAmdbO_length " <<
394 GetThickness(mysql) << " " << getAmdbOrigine_along_thickness(mysql) << " " <<
395 GetLength() << " " << getAmdbOrigine_along_length() + halfpitch);
396 } else {
397 if (m_name[0] == 'T') {
398 AMDBorgTranslation = GeoTrf::Translate3D(GetThickness(mysql) / 2. - getAmdbOrigine_along_thickness(mysql), 0.,
399 GetLength() / 2. - getAmdbOrigine_along_length() + static_cast<TgcComponent *>(GetComponent(0))->posy);
400 } else {
401 AMDBorgTranslation = GeoTrf::Translate3D(GetThickness(mysql) / 2. - getAmdbOrigine_along_thickness(mysql), 0., GetLength() / 2. - getAmdbOrigine_along_length());
402 }
403
404 ATH_MSG_VERBOSE(" GetThickness / getAmdbO_thick / GetLength() / getAmdbO_length " <<
405 GetThickness(mysql) << " " << getAmdbOrigine_along_thickness(mysql) << " " <<
407 }
408
409 // // define the rotations by alpha, beta, gamma
410 // GeoTrf::Rotate3D ralpha = GeoTrf::RotateX3D(p.alpha*Gaudi::Units::deg);
411 // GeoTrf::Rotate3D rbeta = GeoTrf::RotateZ3D(p.beta*Gaudi::Units::deg);
412 // GeoTrf::Rotate3D rgamma;
413 // rgamma = GeoTrf::RotateY3D(p.gamma*Gaudi::Units::deg);
414 // log<<MSG::VERBOSE<<" gamma is not changing sign - original "<<p.gamma<<" new one "<<p.gamma<<endmsg;
415 // log<<MSG::VERBOSE<<" alpha / beta "<<p.alpha<<" "<<p.beta<<endmsg;
416
417 // // apply all transform in sequence
418 // // GeoTrf::Transform3D to_tsz = rgamma*rbeta*ralpha*AMDBorgTranslation*mirrsym; // works for barrel and barrel-like
419 // // imt: tested for CTB2004, seems to work for all amdb versions...
420 // GeoTrf::Transform3D to_tsz = rgamma*rbeta*ralpha*AMDBorgTranslation*mirrsym;
421 GeoTrf::Transform3D to_tsz = AMDBorgTranslation * mirrsym;
422
423 return to_tsz;
424 }
425
426 GeoTrf::Transform3D Station::tsz_to_native_frame(const MYSQL& mysql,
427 const Position &p) const { return (native_to_tsz_frame(mysql, p)).inverse(); }
428
429 // this is really needed
430 GeoTrf::Transform3D Station::tsz_to_global_frame(const MYSQL& mysql,
431 const Position &p) const {
432 GeoTrf::Transform3D nominalTransf = GeoTrf::Transform3D::Identity();
433
434 GeoTrf::Vector3D vec;
435 double RAD;
436
437 if (m_name[0] == 'T') {
438 RAD = p.radius;
439 } else {
440 RAD = p.radius;
441 }
442
443 vec.x() = RAD * cos(p.phi * Gaudi::Units::deg);
444 vec.x() = vec.x() - p.shift * sin((p.phi) * Gaudi::Units::deg);
445 vec.y() = RAD * sin(p.phi * Gaudi::Units::deg);
446 vec.y() = vec.y() + p.shift * cos((p.phi) * Gaudi::Units::deg);
447
448 if (p.isMirrored) {
449 if ((p.isBarrelLike) || (m_name[0] == 'B')) {
450 // correct the z location (=-p.z-m_length) for possible m_amdbOrigine_along_length
451 vec.z() = p.z + getAmdbOrigine_along_length();
452 } else {
453 vec.z() = p.z + GetThickness(mysql); // re-establish the amdb z location (with a - sign)
454 }
455 } else {
456 if ((p.isBarrelLike) || (m_name[0] == 'B' && p.zindex < 0 && hasMdts())) {
457 double halfpitch = mdtHalfPitch(mysql);
458 vec.z() = p.z + halfpitch;
459 } else {
460 vec.z() = p.z;
461 }
462 }
463
464 ATH_MSG_VERBOSE(" translation according to " << vec.x() << " " << vec.y() << " " << vec.z());
465
466 // // define the rotations by alpha, beta, gamma
467 GeoTrf::RotateX3D ralpha(p.alpha * Gaudi::Units::deg);
468 GeoTrf::RotateZ3D rbeta(p.beta * Gaudi::Units::deg);
469 GeoTrf::RotateY3D rgamma(p.gamma * Gaudi::Units::deg);
470
471 ATH_MSG_VERBOSE(" gamma is not changing sign - original " << p.gamma << " new one " << p.gamma <<
472 " alpha / beta " << p.alpha << " " << p.beta);
473
474 // // apply all transform in sequence
475 // // GeoTrf::Transform3D to_tsz = rgamma*rbeta*ralpha*AMDBorgTranslation*mirrsym;
476 // works for barrel and barrel-like
477 // // imt: tested for CTB2004, seems to work for all amdb versions...
478 GeoTrf::Transform3D abgRot = rgamma * rbeta * ralpha;
479
480 if (m_name[0] == 'B' || p.isBarrelLike) {
481 // here all Barrel chambers
482 nominalTransf = GeoTrf::RotateZ3D(p.phi * Gaudi::Units::deg);
483 } else {
484 // replace this with the folowing lines 8/06/2006 SS because, EC not mirrored chambers have anyway to be rotated
485 // by 180deg around z to mov ecoherently their local reference frame and the tube-layer numbering
486 // if ( p.z>=0 || ( p.z<0 && !(p.isMirrored) ) ){
487 // nominalTransf = GeoTrf::Transform3D(GeoTrf::RotateY3D(-90*Gaudi::Units::deg)*
488 // GeoTrf::RotateX3D(p.phi*Gaudi::Units::deg-180*Gaudi::Units::deg));
489 // }
490 // else if (p.z<0 && p.isMirrored){
491 // nominalTransf = GeoTrf::Transform3D(GeoTrf::RotateY3D(-90*Gaudi::Units::deg)*
492 // GeoTrf::RotateX3D(p.phi*Gaudi::Units::deg-180*Gaudi::Units::deg)*
493 // GeoTrf::RotateZ3D(180*Gaudi::Units::deg));
494 // }
495 if (p.z >= 0) {
496 nominalTransf = GeoTrf::Transform3D(GeoTrf::RotateY3D(-90 * Gaudi::Units::deg) * GeoTrf::RotateX3D(p.phi * Gaudi::Units::deg - 180 * Gaudi::Units::deg));
497 } else if (p.z < 0) {
498 nominalTransf = GeoTrf::Transform3D(GeoTrf::RotateY3D(-90 * Gaudi::Units::deg) * GeoTrf::RotateX3D(p.phi * Gaudi::Units::deg - 180 * Gaudi::Units::deg) *
499 GeoTrf::RotateZ3D(180 * Gaudi::Units::deg));
500 } else {
501 ATH_MSG_WARNING("Problem here p.z, mirrored " << p.z << " " << p.isMirrored);
502 }
503 }
504
505 return GeoTrf::Translate3D(vec.x(), vec.y(), vec.z()) * nominalTransf * abgRot;
506 }
507
508 GeoTrf::Transform3D Station::global_to_tsz_frame(const MYSQL& mysql,
509 const Position &p) const { return (tsz_to_global_frame(mysql, p)).inverse(); }
510
511 GeoTrf::Transform3D Station::getNominalTransform(const MYSQL& mysql,
512 const Position &p) const { return tsz_to_global_frame(mysql, p) * native_to_tsz_frame(mysql, p); }
513
514 GeoTrf::Transform3D Station::getAlignedTransform(const MYSQL& mysql,
515 const AlignPos &ap, const Position &p) const {
516 return tsz_to_global_frame(mysql, p) * getDeltaTransform_tszFrame(mysql, ap) * native_to_tsz_frame(mysql, p);
517 }
518
519 GeoTrf::Transform3D Station::getDeltaTransform_tszFrame(const MYSQL& mysql,
520 const AlignPos &ap) const {
521 if (ap.tras != 0 || ap.trat != 0 || ap.traz != 0 || ap.rots != 0 || ap.rott != 0 || ap.rotz != 0) {
522 ATH_MSG_VERBOSE("Setting corrections. For station " << m_name << " corrections sent are "
523 << ap.tras << " " << ap.traz << " " << ap.trat << " " << ap.rots << " "
524 << ap.rotz << " " << ap.rott << " isBarrel=" << ap.isBarrel
525 << " length=" << GetLength() << " m_thickness=" << GetThickness(mysql));
526 }
527
528 GeoTrf::RotateX3D rott(ap.rott);
529 GeoTrf::RotateZ3D rotz(ap.rotz);
530 GeoTrf::RotateY3D rots(ap.rots);
531 GeoTrf::Transform3D trans = GeoTrf::TranslateY3D(ap.tras) * GeoTrf::TranslateZ3D(ap.traz) * GeoTrf::TranslateX3D(ap.trat);
532
533 GeoTrf::Transform3D delta = trans * rots * rotz * rott;
534
535 if (msgLvl(MSG::VERBOSE)) {
536 msg() << MSG::VERBOSE << " delta transform in the tsz frame --------------" << endmsg
537 << delta(0, 0) << " " << delta(0, 1) << " " << delta(0, 2) << " " << delta(0, 3) << " " << endmsg
538 << delta(1, 0) << " " << delta(1, 1) << " " << delta(1, 2) << " " << delta(1, 3) << " " << endmsg
539 << delta(2, 0) << " " << delta(2, 1) << " " << delta(2, 2) << " " << delta(2, 3) << " " << endmsg;
540 }
541
542 // our delta transform must be applied in the tsz frame:
543 return delta;
544 }
545
546 GeoTrf::Transform3D Station::getDeltaTransform(const MYSQL& mysql,
547 const AlignPos &ap, const Position &p) const {
548 // GM applies Delta transform like transform*delta
549 GeoTrf::Transform3D deltaGM = tsz_to_native_frame(mysql, p) * getDeltaTransform_tszFrame(mysql, ap) * native_to_tsz_frame(mysql, p);
550 return deltaGM;
551 }
552
557
559 GetThickness(mysql);
561 }
562
563} // namespace MuonGM
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::vector< size_t > vec
static Double_t sc
#define y
MsgStream & msg() const
The standard message stream.
bool msgLvl(const MSG::Level lvl) const
Test the output level.
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
void StoreStation(Station *s)
Definition MYSQL.cxx:136
const Technology * GetATechnology(const std::string &name) const
Definition MYSQL.cxx:162
int getNovaReadVersion() const
Definition MYSQL.cxx:260
double GetExtraTopThickness() const
Definition Station.cxx:151
std::vector< std::unique_ptr< Component > > m_components
Definition Station.h:99
GeoTrf::Transform3D native_to_tsz_frame(const MYSQL &mysql, const Position &p) const
Definition Station.cxx:371
int CountAlignPos(int iz, int iphi) const
Definition Station.cxx:69
GeoTrf::Transform3D global_to_tsz_frame(const MYSQL &mysql, const Position &p) const
Definition Station.cxx:508
const std::string & GetName() const
Definition Station.cxx:110
double getAmdbOrigine_along_length() const
Definition Station.cxx:553
int GetNrOfComponents() const
Definition Station.cxx:322
void SetAlignPos(const AlignPos &p)
Definition Station.cxx:42
GeoTrf::Transform3D getDeltaTransform_tszFrame(const MYSQL &mysql, const AlignPos &ap) const
Definition Station.cxx:519
void SetCutout(Cutout *c)
Definition Station.cxx:81
AlignPosIterator abegin() const
Definition Station.cxx:76
AlignPosIterator FindAlignPos(int iz, int iphi) const
Definition Station.cxx:62
int GetNrOfCutouts() const
Definition Station.cxx:324
std::string m_name
Definition Station.h:97
AlignPosIterator aend() const
Definition Station.cxx:77
double GetWidth1() const
Definition Station.cxx:227
PositionIterator FindPosition(int iz, int iphi) const
Definition Station.cxx:99
AlignPosIterator getFirstAlignPosInRange(int iz, int iphi, AlignPosIterator &lastAlignPosInRange) const
Definition Station.cxx:55
std::atomic< double > m_amdbOrigine_along_length
Definition Station.h:95
PositionIterator end() const
Definition Station.cxx:108
void SetPosition(Position p)
Definition Station.cxx:87
AlignPosMap m_alignpositions
Definition Station.h:102
GeoTrf::Transform3D getDeltaTransform(const MYSQL &mysql, const AlignPos &ap, const Position &p) const
Definition Station.cxx:546
GeoTrf::Transform3D getNominalTransform(const MYSQL &mysql, const Position &p) const
Definition Station.cxx:511
double GetThickness(const MYSQL &mysql) const
Definition Station.cxx:112
PositionMap m_positions
Definition Station.h:101
void SetComponent(Component *c)
Definition Station.cxx:79
GeoTrf::Transform3D tsz_to_global_frame(const MYSQL &mysql, const Position &p) const
Definition Station.cxx:430
bool hasMdts() const
Definition Station.h:88
double GetLength() const
Definition Station.cxx:160
GeoTrf::Transform3D tsz_to_native_frame(const MYSQL &mysql, const Position &p) const
Definition Station.cxx:426
int Npositions() const
Definition Station.cxx:104
double getAmdbOrigine_along_thickness(const MYSQL &mysql) const
Definition Station.cxx:558
PositionIterator begin() const
Definition Station.cxx:106
double getYMin() const
Definition Station.cxx:209
GeoTrf::Transform3D getAlignedTransform(const MYSQL &mysql, const AlignPos &ap, const Position &p) const
Definition Station.cxx:514
Component * GetComponent(int i) const
Definition Station.cxx:83
double GetWidth2() const
Definition Station.cxx:275
double GetExtraBottomThickness() const
Definition Station.cxx:155
std::vector< std::unique_ptr< Cutout > > m_cutouts
Definition Station.h:100
Cutout * GetCutout(int i) const
Definition Station.cxx:85
std::atomic< double > m_amdbOrigine_along_thickness
Definition Station.h:96
double mdtHalfPitch(const MYSQL &mysql) const
Definition Station.cxx:343
singleton-like access to IMessageSvc via open function and helper
double ymin
Definition listroot.cxx:63
double ymax
Definition listroot.cxx:64
Ensure that the Athena extensions are properly loaded.
Definition GeoMuonHits.h:27
std::multimap< int, AlignPos, std::less< int > >::const_iterator AlignPosIterator
Definition Station.h:38
std::map< int, Position, std::less< int > >::const_iterator PositionIterator
Definition Station.h:37
std::ostream & operator<<(std::ostream &os, const AlignPos &p)
Definition AlignPos.cxx:8
STL namespace.