ATLAS Offline Software
Loading...
Searching...
No Matches
MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef MUONREADOUTGEOMETRY_STGCREADOUTELEMENT_H
6#define MUONREADOUTGEOMETRY_STGCREADOUTELEMENT_H
7
8#include <string>
9#include <utility>
10
18
19
20namespace MuonGMR4 {
22}
23
24namespace MuonGM {
29
31 public:
33
35 sTgcReadoutElement(GeoVFullPhysVol* pv,
36 const std::string& stName,
37 int zi, int fi, int mL, MuonDetectorManager* mgr);
38
41
43 virtual bool containsId(const Identifier& id) const override final;
44
47 virtual double distanceToReadout(const Amg::Vector2D& pos, const Identifier& id) const override final;
48
51 virtual int stripNumber(const Amg::Vector2D& pos, const Identifier& id) const override final;
52
55 double channelPitch(const Identifier& id) const;
56
59 virtual bool stripPosition(const Identifier& id, Amg::Vector2D& pos) const override final;
60
61 bool stripGlobalPosition(const Identifier& id, Amg::Vector3D& gpos) const;
62
64 int padNumber(const Amg::Vector2D& pos, const Identifier& id) const;
65
67 int wireNumber(const Amg::Vector2D& pos, const Identifier& id) const;
68
72 double wirePitch(int gas_gap = 1) const;
73
75 double positionFirstWire(const Identifier& id) const;
76
78 int numberOfWires(const Identifier& id) const;
79
81 bool padPosition(const Identifier& id, Amg::Vector2D& pos) const;
82
84 bool padGlobalPosition(const Identifier& id, Amg::Vector3D& gpos) const;
85
87 bool padCorners(const Identifier& id, std::array<Amg::Vector2D,4>& corners) const;
88
90 bool padGlobalCorners(const Identifier& id, std::array<Amg::Vector3D, 4>& gcorners) const;
91
95 bool isEtaZero(const Identifier& id, const Amg::Vector2D& localPosition) const;
96
98 virtual int numberOfLayers(bool) const override final;
99
101 virtual int numberOfStrips(const Identifier& layerId) const override final;
102 virtual int numberOfStrips(int, bool measuresPhi) const override final;
103
105 int numberOfPads(const Identifier& layerId) const;
106
109 int maxPadNumber(const Identifier& layerId) const;
110
115 virtual bool spacePointPosition(const Identifier& phiId, const Identifier& etaId, Amg::Vector2D& pos) const override final;
116
120 virtual bool spacePointPosition(const Identifier& phiId, const Identifier& etaId, Amg::Vector3D& pos) const override final;
121
125 void spacePointPosition(const Amg::Vector2D& phiPos, const Amg::Vector2D& etaPos, Amg::Vector2D& pos) const;
126
133 void spacePointPosition(const Identifier& layerId, double locXpos, double locYpos, Amg::Vector3D& pos) const;
134
137
139 virtual void fillCache() override final;
140
142 virtual int surfaceHash(const Identifier& id) const override final;
143
145 int surfaceHash(int gasGap, int channelType) const;
146
148 virtual int layerHash(const Identifier& id) const override;
149
151 // int layerHash( int gasGap) const; // does not fit in the scheme ( layer hash needs to follow surface hash )
152
154 virtual int boundaryHash(const Identifier& id) const override final;
155
157 virtual bool measuresPhi(const Identifier& id) const override final;
158
160 void initDesign(double thickness);
161
164
166 const MuonChannelDesign* getDesign(int gasGap, int channelType) const;
167
171
174
176 void setChamberLayer(int ml) { m_ml = ml; }
177
178 // double getSectorOpeningAngle(bool isLargeSector);
179
182 const Amg::Transform3D& getDelta() const { return m_delta; }
183 void setDelta(const ALinePar& aline);
184
186 void setBLinePar(const BLinePar& bLine);
187
189 void posOnDefChamber(Amg::Vector3D& locPosML) const;
190
191 bool has_ALines() const { return (m_ALinePar != nullptr); }
192 bool has_BLines() const { return (m_BLinePar != nullptr); }
193 const ALinePar* getALinePar() const { return m_ALinePar; }
194 const BLinePar* getBLinePar() const { return m_BLinePar; }
195 void clearALinePar();
196 void clearBLinePar() { m_BLinePar = nullptr; }
197
198 // Amdb local (szt) to global coord
199 virtual Amg::Vector3D AmdbLRSToGlobalCoords(const Amg::Vector3D& x) const override final { return AmdbLRSToGlobalTransform()*x; }
201 // Global to Amdb local (szt) coord
202 virtual Amg::Vector3D GlobalToAmdbLRSCoords(const Amg::Vector3D& x) const override final { return GlobalToAmdbLRSTransform()*x; }
203 virtual Amg::Transform3D GlobalToAmdbLRSTransform() const override final { return AmdbLRSToGlobalTransform().inverse(); }
204
205 static double triggerBandIdToRadius(bool isLarge, int triggerBand);
206
207 private:
208
209 void initDesignFromSQLite(double thickness);
210
211 void initDesignFromAGDD(double thickness);
212
214 std::array<MuonChannelDesign,4> m_phiDesign{};
215 std::array<MuonChannelDesign,4> m_etaDesign{};
216 std::array<MuonPadDesign,4> m_padDesign{};
217
218 static constexpr int m_nlayers{4};
219 int m_ml{0};
220 double m_offset{0.};
221
222 bool m_diamondShape{false};
223 const ALinePar* m_ALinePar{nullptr};
224 const BLinePar* m_BLinePar{nullptr};
225 Amg::Transform3D m_delta{Amg::Transform3D::Identity()};
226
227 // transforms (RE->layer)
228 std::array<Amg::Transform3D, 4> m_Xlg{make_array<Amg::Transform3D, 4>(Amg::Transform3D::Identity())};
229
230
231 // The radial positions of the trigger bands cannot be derived from the readout geometry, therefore hard-coding them for now
232 //Position of Band IDs for Large sectors
233 static constexpr std::array<double, 94> LBANDIDSP = {
234 10, 10, 10, 10, 10, 10, 1156.72, 1187.98, 1231.87, 1271.34, 1312.87, 1354.56, 1396.38, 1438.07,
235 1479.73, 1521.44, 1563.11, 1604.8, 1646.48, 1688.02, 1729.84, 1771.51, 1813.2, 1854.89, 1896.57, 1938.26, 1979.93, 2021.61,
236 2063.14, 2104.98, 2146.55, 2181.64, 2209.01, 2251.65, 2282.54, 2313.27, 2356.24, 2396.73, 2438.29, 2480.09, 2521.75, 2563.46,
237 2605.11, 2646.85, 2688.48, 2730.19, 2771.86, 2813.41, 2855.21, 2896.93, 2938.61, 2980.26, 3021.95, 3063.63, 3105.31, 3146.98,
238 3188.85, 3230.37, 3272.05, 3313.77, 3353.77, 3376.19, 3426.09, 3464.49, 3506.78, 3563.91, 3589.03, 3626.17, 3667.84, 3709.56,
239 3751.33, 3792.92, 3834.58, 3876.27, 3917.9, 3959.62, 4001.29, 4043.03, 4084.66, 4126.39, 4168.05, 4209.74, 4251.38, 4293.16,
240 4334.72, 4376.47, 4417.54, 4459.75, 4496.31, 4543.27, 4584.77, 4626.47, 4668.25, 4701.14
241 };
242
243 //Position of Band IDs for Small Sector
244 static constexpr std::array<double, 92> SBANDIDSP = {
245 10.0, 10.0, 958.077, 998.248, 1037.405, 1076.535, 1115.69, 1154.82, 1193.97, 1233.135, 1272.265, 1311.395,
246 1350.59, 1389.705, 1428.865, 1468.01, 1507.175, 1546.305, 1585.435, 1624.58, 1663.71, 1702.895, 1742.055,
247 1781.165, 1820.315, 1859.44, 1898.575, 1937.75, 1976.885, 2016.04, 2055.15, 2094.345, 2136.125, 2172.61,
248 2217.68, 2255.125, 2316.115, 2348.91, 2388.06, 2427.245, 2466.385, 2505.515, 2544.69, 2583.8, 2622.99,
249 2662.115, 2701.31, 2740.395, 2779.55, 2818.715, 2857.905, 2897.0, 2936.185, 2975.315, 3014.47, 3053.615,
250 3092.775, 3131.895, 3171.075, 3210.225, 3249.375, 3288.485, 3317.74, 3347.075, 3396.65, 3440.175, 3475.575,
251 3540.81, 3581.97, 3621.13, 3660.285, 3699.41, 3738.535, 3777.73, 3816.89, 3856.055, 3895.105, 3934.3, 3974.34,
252 4012.565, 4051.71, 4090.865, 4130.04, 4169.145, 4208.285, 4247.55, 4286.65, 4320.075, 4364.84, 4404.12, 4443.14, 4482.29
253 };
254
255 };
256
257 inline int sTgcReadoutElement::surfaceHash(const Identifier& id) const {
258 return surfaceHash(m_idHelper.gasGap(id), m_idHelper.channelType(id));
259 }
260
261 inline int sTgcReadoutElement::surfaceHash(int gasGap, int channelType) const {
262 return (gasGap - 1) * 3 + (2 - channelType); // assumes channelType=2 (wires), 1(strips), 0(pads)
263 }
264
265 inline int sTgcReadoutElement::layerHash(const Identifier& id) const {
266 return surfaceHash(id); // don't have a choice here : rewrite MuonClusterReadoutElement first
267 }
268
269 inline int sTgcReadoutElement::boundaryHash(const Identifier& id) const {
270 int iphi = m_idHelper.channelType(id) != sTgcIdHelper::sTgcChannelTypes::Strip; // wires and pads have locX oriented along phi
271 if (std::abs(getStationEta()) < 3) iphi += 2 * (m_idHelper.gasGap(id) - 1);
272 return iphi;
273 }
274
275 inline bool sTgcReadoutElement::measuresPhi(const Identifier& id) const {
276 return (m_idHelper.channelType(id) != sTgcIdHelper::sTgcChannelTypes::Strip);
277 }
278
280 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip) return &(m_etaDesign[m_idHelper.gasGap(id) - 1]);
281 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) return &(m_phiDesign[m_idHelper.gasGap(id) - 1]);
282 return nullptr;
283 }
284
286 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return &(m_padDesign[m_idHelper.gasGap(id) - 1]);
287 return nullptr;
288 }
289
291 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return &(m_padDesign[m_idHelper.gasGap(id) - 1]);
292 return nullptr;
293 }
294
295 inline const MuonChannelDesign* sTgcReadoutElement::getDesign(int gasGap, int channelType) const {
296 if (channelType == 1) return &(m_etaDesign[gasGap - 1]);
297 if (channelType == 2) return &(m_phiDesign[gasGap - 1]);
298 return 0;
299 }
300
301 inline const MuonPadDesign* sTgcReadoutElement::getPadDesign(int gasGap) const { return &(m_padDesign[gasGap - 1]); }
302
303 inline double sTgcReadoutElement::distanceToReadout(const Amg::Vector2D& pos, const Identifier& id) const {
304 const MuonChannelDesign* design = getDesign(id);
305 if (!design) return -10000.;
306 return design->distanceToReadout(pos);
307 }
308
309 inline int sTgcReadoutElement::stripNumber(const Amg::Vector2D& pos, const Identifier& id) const {
310 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return padNumber(pos, id);
311
312 const MuonChannelDesign* design = getDesign(id);
313 if (!design) {
314 ATH_MSG_WARNING("Cannot associate the strip number for "<<Amg::toString(pos)<<" in layer "
315 <<idHelperSvc()->toStringGasGap(id));
316 return -1;
317 }
318 return design->channelNumber(pos);
319 }
320
321 inline bool sTgcReadoutElement::stripPosition(const Identifier& id, Amg::Vector2D& pos) const {
322 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return padPosition(id, pos);
323
324 const MuonChannelDesign* design = getDesign(id);
325 if (!design) {
326 ATH_MSG_WARNING("Cannot determine the strip postion for "<<idHelperSvc()->toString(id));
327 return false;
328 }
329 return design->center(m_idHelper.channel(id), pos);
330 }
331
333 Amg::Vector2D lpos{Amg::Vector2D::Zero()};
334 if (!stripPosition(id, lpos)) return false;
335 surface(id).localToGlobal(lpos, Amg::Vector3D::Zero(), gpos);
336 return true;
337 }
338
339 inline bool sTgcReadoutElement::padPosition(const Identifier& id, Amg::Vector2D& pos) const {
340 const MuonPadDesign* design = getPadDesign(id);
341 if (!design){
342 ATH_MSG_WARNING("Cannot determine the pad position for "<<idHelperSvc()->toString(id));
343 return false;
344 }
345 int padEta = m_idHelper.padEta(id);
346 int padPhi = m_idHelper.padPhi(id);
347
348 return design->channelPosition(std::make_pair(padEta, padPhi), pos);
349 }
350
352 Amg::Vector2D lpos{Amg::Vector2D::Zero()};
353 if (!padPosition(id, lpos)) return false;
354 surface(id).localToGlobal(lpos, Amg::Vector3D::Zero(), gpos);
355 return true;
356 }
357
358 inline bool sTgcReadoutElement::padCorners(const Identifier& id, std::array<Amg::Vector2D, 4>& corners) const {
359 const MuonPadDesign* design = getPadDesign(id);
360 if (!design) {
361 ATH_MSG_WARNING("Cannot find the pad corners for "<<idHelperSvc()->toString(id));
362 return false;
363 }
364 int padEta = m_idHelper.padEta(id);
365 int padPhi = m_idHelper.padPhi(id);
366
367 return design->channelCorners(std::make_pair(padEta, padPhi), corners);
368 }
369
370 inline bool sTgcReadoutElement::padGlobalCorners(const Identifier& id, std::array<Amg::Vector3D, 4>& gcorners) const {
371 std::array<Amg::Vector2D,4> lcorners{make_array<Amg::Vector2D, 4>(Amg::Vector2D::Zero())};
372 if (!padCorners(id, lcorners)) {
373 return false;
374 }
375 for (size_t c = 0; c < lcorners.size() ; ++c) {
376 surface(id).localToGlobal(lcorners[c], Amg::Vector3D::Zero(), gcorners[c]);
377 }
378 return true;
379 }
380
381 // This function returns true if we are in the eta 0 region of QL1/QS1
382 inline bool sTgcReadoutElement::isEtaZero(const Identifier& id, const Amg::Vector2D& localPosition) const {
383 // False if not a QL1 or QS1 quadruplet
384 if (std::abs(m_idHelper.stationEta(id)) != 1) return false;
385 const MuonChannelDesign* wireDesign = (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) ?
386 getDesign(id) :
387 getDesign(m_idHelper.channelID(id,
388 m_idHelper.multilayer(id),
389 m_idHelper.gasGap(id),
391 1));
392 if (!wireDesign) {
393 ATH_MSG_WARNING("Cannot determine whether the pos "<<Amg::toString(localPosition)<<" is etaZero() for "
394 <<idHelperSvc()->toString(id));
395 return false;
396 }
397
398 // Require the x coordinate for strips, and the y coordinate for wires and pads
399 double lpos = (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip) ?
400 localPosition.x() : localPosition.y();
401 if (lpos < 0.5 * wireDesign->xSize() - wireDesign->wireCutout) return true;
402
403 return false;
404 }
405
406 inline int sTgcReadoutElement::numberOfLayers(bool) const { return m_nlayers; }
407
408 inline int sTgcReadoutElement::numberOfStrips(const Identifier& layerId) const {
409 return numberOfStrips(m_idHelper.gasGap(layerId) - 1,
410 m_idHelper.channelType(layerId) == sTgcIdHelper::sTgcChannelTypes::Wire);
411 }
412
413 inline int sTgcReadoutElement::numberOfStrips(int lay, bool measPhi) const {
414 if (lay > -1 && lay < m_nlayers) { return !measPhi ? m_etaDesign[lay].nch : m_phiDesign[lay].nGroups; }
415 return -1;
416 }
417
418 inline int sTgcReadoutElement::numberOfPads(const Identifier& layerId) const {
419 const MuonPadDesign* design = getPadDesign(layerId);
420 if (!design) {
421 ATH_MSG_WARNING("no pad design found when trying to get the number of pads "<<idHelperSvc()->toString(layerId));
422 return 0;
423 }
424 return design->nPadColumns * design->nPadH;
425 }
426
427 inline int sTgcReadoutElement::maxPadNumber(const Identifier& layerId) const {
428 const MuonPadDesign* design = getPadDesign(layerId);
429 if (!design) {
430 ATH_MSG_WARNING("no pad design found when trying to get the largest pad number "<<idHelperSvc()->toString(layerId));
431 return 0;
432 }
433 return (design->nPadColumns - 1) * m_idHelper.padEtaMax() + design->nPadH;
434 }
435
436 inline bool sTgcReadoutElement::spacePointPosition(const Identifier& phiId, const Identifier& etaId, Amg::Vector2D& pos) const {
437 Amg::Vector2D phiPos{Amg::Vector2D::Zero()}, etaPos{Amg::Vector2D::Zero()};
438 if (!stripPosition(phiId, phiPos) || !stripPosition(etaId, etaPos)) return false;
439 spacePointPosition(phiPos, etaPos, pos);
440 return true;
441 }
442
443 inline bool sTgcReadoutElement::spacePointPosition(const Identifier& phiId, const Identifier& etaId, Amg::Vector3D& pos) const {
444 Amg::Vector2D lpos{Amg::Vector2D::Zero()};
445 spacePointPosition(phiId, etaId, lpos);
446 surface(phiId).localToGlobal(lpos, pos, pos);
447 return true;
448 }
449
450 inline void sTgcReadoutElement::spacePointPosition(const Amg::Vector2D& phiPos, const Amg::Vector2D& etaPos, Amg::Vector2D& pos) const {
451 pos[0] = phiPos.x();
452 pos[1] = etaPos.x();
453 }
454
455
456 inline double sTgcReadoutElement::triggerBandIdToRadius(bool isLarge, int triggerBand) {
457 if(isLarge){
458 return LBANDIDSP[triggerBand];
459 } else {
460 return SBANDIDSP[triggerBand];
461 }
462 };
463
464} // namespace MuonGM
465
466#endif // MUONREADOUTGEOMETRY_STGCREADOUTELEMENT_H
constexpr std::array< T, N > make_array(const T &def_val)
Helper function to initialize in-place arrays with non-zero values.
Definition ArrayHelper.h:10
#define ATH_MSG_WARNING(x)
#define x
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
MuonClusterReadoutElement(GeoVFullPhysVol *pv, MuonDetectorManager *mgr, Trk::DetectorElemType detType)
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
bool padPosition(const Identifier &id, Amg::Vector2D &pos) const
pad position
const MuonPadDesign * getPadDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
virtual bool stripPosition(const Identifier &id, Amg::Vector2D &pos) const override final
strip position - should be renamed to channel position If the strip number is outside the range of va...
virtual void fillCache() override final
function to fill tracking cache
bool padCorners(const Identifier &id, std::array< Amg::Vector2D, 4 > &corners) const
pad corners
virtual bool measuresPhi(const Identifier &id) const override final
returns whether the current identifier corresponds to a phi measurement
virtual double distanceToReadout(const Amg::Vector2D &pos, const Identifier &id) const override final
distance to readout.
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
virtual int layerHash(const Identifier &id) const override
returns the hash to be used to look up the normal and center in the MuonClusterReadoutElement trackin...
virtual int numberOfStrips(const Identifier &layerId) const override final
number of strips per layer
int numberOfWires(const Identifier &id) const
Get the total number of wires (single wires) of a chamber.
double channelPitch(const Identifier &id) const
Channel pitch.
virtual int surfaceHash(const Identifier &id) const override final
returns the hash to be used to look up the surface and transform in the MuonClusterReadoutElement tra...
sTgcReadoutElement(GeoVFullPhysVol *pv, const std::string &stName, int zi, int fi, int mL, MuonDetectorManager *mgr)
constructor
const Amg::Transform3D & getDelta() const
read A-line parameters and include the chamber rotation/translation in the local-to-global (ATLAS) re...
Amg::Vector3D localToGlobalCoords(const Amg::Vector3D &locPos, Identifier id) const
simHit local (SD) To Global position - to be used by MuonGeoAdaprors only
void setBLinePar(const BLinePar &bLine)
read B-line (chamber-deformation) parameters
virtual int boundaryHash(const Identifier &id) const override final
returns the hash to be used to look up the normal and center in the MuonClusterReadoutElement trackin...
bool padGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
pad global position
void initDesign(double thickness)
initialize the design classes for this readout element
int maxPadNumber(const Identifier &layerId) const
Get largest pad number, which is different to the number of pads in a gas volume due to the pad numbe...
virtual bool spacePointPosition(const Identifier &phiId, const Identifier &etaId, Amg::Vector2D &pos) const override final
space point position for a given pair of phi and eta identifiers The LocalPosition is expressed in th...
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
bool isEtaZero(const Identifier &id, const Amg::Vector2D &localPosition) const
is eta=0 of QL1 or QS1?
double positionFirstWire(const Identifier &id) const
Get the local position of the first wire of the chamber corresponding to the identifier.
virtual bool containsId(const Identifier &id) const override final
function to be used to check whether a given Identifier is contained in the readout element
void posOnDefChamber(Amg::Vector3D &locPosML) const
transform a position (in chamber-frame coordinates) to the deformed-chamber geometry
virtual Amg::Vector3D AmdbLRSToGlobalCoords(const Amg::Vector3D &x) const override final
int wireNumber(const Amg::Vector2D &pos, const Identifier &id) const
wire number corresponding to local position
virtual int numberOfLayers(bool) const override final
number of layers in phi/eta projection
virtual int stripNumber(const Amg::Vector2D &pos, const Identifier &id) const override final
strip number corresponding to local position.
void setChamberLayer(int ml)
set methods only to be used by MuonGeoModel
int numberOfPads(const Identifier &layerId) const
Get the number of pad per layer.
bool padGlobalCorners(const Identifier &id, std::array< Amg::Vector3D, 4 > &gcorners) const
pad global corners
int padNumber(const Amg::Vector2D &pos, const Identifier &id) const
pad number corresponding to local position
virtual Amg::Vector3D GlobalToAmdbLRSCoords(const Amg::Vector3D &x) const override final
virtual const sTgcIdHelper & stgcIdHelper() const =0
access to TgcIdHelper
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const override final
Specified for PlaneSurface: LocalToGlobal method without dynamic memory allocation.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Amg::Transform3D getTranslateZ3D(const double Z)
: Returns a shift transformation along the z-axis
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
The ReadoutGeomCnvAlg converts the Run4 Readout geometry build from the GeoModelXML into the legacy M...
Ensure that the Athena extensions are properly loaded.
Definition GeoMuonHits.h:27
bool center(int channel, Amg::Vector2D &pos) const
STRIPS ONLY: Returns the center on the strip.
double distanceToReadout(const Amg::Vector2D &pos) const
distance to readout
int channelNumber(const Amg::Vector2D &pos) const
calculate local channel number, range 1=nstrips like identifiers. Returns -1 if out of range
Parameters defining the design of the readout sTGC pads.
bool channelPosition(const std::pair< int, int > &pad, Amg::Vector2D &pos) const
calculate local channel position for a given channel number
bool channelCorners(const std::pair< int, int > &pad, CornerArray &corners) const