ATLAS Offline Software
Loading...
Searching...
No Matches
StripStereoAnnulusDesign.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "Identifier/Identifier.h"
8
9#include <stdexcept>
10#include <algorithm> // For upper_bound
11#include <iterator> // for std::distance()
12#include <cmath>
13
14namespace InDetDD {
16 const SiDetectorDesign::Axis &thicknessDirection,
17 const double &thickness,
18 const int &readoutSide,
19 const InDetDD::CarrierType &carrier,
20 const int &nRows,
21 const std::vector<int> &nStrips,
22 const std::vector<double> &pitch,
23 const std::vector<double> &stripStartRadius,
24 const std::vector<double> &stripEndRadius,
25 const double &stereoAngle,
26 const double &centreR,
27 const double &waferCentreR,
28 const bool &usePC,
29 InDetDD::DetectorType detectorType) :
30 SCT_ModuleSideDesign(thickness, false, false, true, 1, 0, 0, 0, false, carrier,
31 readoutSide, stripDirection, thicknessDirection),
32 m_nRows(nRows),
33 m_nStrips(nStrips),
35 m_stripStartRadius(stripStartRadius),
36 m_stripEndRadius(stripEndRadius),
37 m_stereo(stereoAngle),
38 m_R(centreR),
39 m_waferCentreR(waferCentreR),//if not specified in constructor, wafer centre assumed to simply be element centre
40 m_lengthBF(2. * waferCentreR * std::sin(stereoAngle*0.5)),// Eq. 5 p. 7
45 m_usePC(usePC)
46{
47
48 m_detectorType = detectorType;
49
50 if (nRows < 0) {
51 throw std::runtime_error(
52 "ERROR: StripStereoAnnulusDesign called with negative number of rows");
53 }
54
55 if (pitch.size() != (unsigned) nRows) {
56 throw std::runtime_error(
57 "ERROR: StripStereoAnnulusDesign called with insufficiant pitch values for no. of rows");
58 }
59
60 if (stripStartRadius.size() != (unsigned) nRows) {
61 throw std::runtime_error(
62 "ERROR: StripStereoAnnulusDesign called with insufficiant strip start-positions for no. of rows");
63 }
64
65 if (stripEndRadius.size() != (unsigned) nRows) {
66 throw std::runtime_error(
67 "ERROR: StripStereoAnnulusDesign called with insufficiant strip end-positions for no. of rows");
68 }
69
70 int startStrip = 0;
71 for (int r = 0; r < nRows; ++r) {
72 m_firstStrip.push_back(startStrip);
73 startStrip += m_nStrips[r];
74 }
75 int totalStrips = startStrip;
76 m_firstStrip.push_back(totalStrips); // Add one more as total number of strips, so you can safely use row + 1 in a loop
77
78 m_scheme.setCells(totalStrips);
79 m_scheme.setDiodes(totalStrips);
80
81
82 double phi = m_nStrips[0] * m_pitch[0];
83
84 if (m_usePC) {
85 // Maths for calculating PC bounds is based off
86 // Trk::AnnulusBoundsPC::fromCartesian() and detailed at
87 // https://hep.ph.liv.ac.uk/~jsmith/dropbox/AnnulusBoundsPC_Constructor_Maths.pdf.
88 // This will later form some kind of INT Note or report or similar
89 // internal documentation,
90 Amg::Vector2D origin(m_R * (1.0 - std::cos(m_stereo)),
91 m_R * std::sin(-m_stereo));
92 m_bounds = std::make_unique<Trk::AnnulusBoundsPC>(
94 m_stripEndRadius.back(),
95 phi * -0.5,
96 phi * 0.5,
97 origin,
98 0));
99 } else {
100 m_bounds = std::make_unique<Trk::AnnulusBounds>(
102 m_stripEndRadius.back(),
104 phi,
105 m_stereo));
106 }
107}
108
110 const SiDetectorDesign::Axis &thicknessDirection,
111 const double &thickness,
112 const int &readoutSide,
113 const InDetDD::CarrierType &carrier,
114 const int &nRows,
115 const std::vector<int> &nStrips,
116 const std::vector<double> &pitch,
117 const std::vector<double> &stripStartRadius,
118 const std::vector<double> &stripEndRadius,
119 const double &stereoAngle,
120 const double &centreR,
121 const bool &usePC,
122 InDetDD::DetectorType detectorType):
123 StripStereoAnnulusDesign(stripDirection,thicknessDirection,thickness,readoutSide,carrier,nRows,nStrips,
124 pitch,stripStartRadius,stripEndRadius,stereoAngle,centreR,centreR,usePC,detectorType){
125//assuming here that centreR==waferCentreR
126}
127
129 if (m_usePC) return beamToStripPC(pos);
130
131 const double x_beam = pos.xEta();
132 const double y_beam = pos.xPhi();
133
134 // Transform to strip frame SF (eq. 36 in ver G, combined with eq. 2 since we are in beam frame)
135 //
136 // x_strip cos(-m_stereo) -sin(-m_stereo) x-R R
137 // ( ) = [ ]( ) + ( )
138 // y_strip sin(-m_stereo) cos(-m_stereo) y 0
139 const double x_strip = m_cosNegStereo * (x_beam - m_waferCentreR) - m_sinNegStereo * y_beam + m_waferCentreR;
140 const double y_strip = m_sinNegStereo * (x_beam - m_waferCentreR) + m_cosNegStereo * y_beam;
141
142 return {x_strip, y_strip};
143}
144
146 const double phi_beam = pos.xPhi();
147 const double rad_beam = pos.xEta();
148
149 // Convert to cart and use cartesian transform
150 const double x_beam = rad_beam * std::cos(phi_beam);
151 const double y_beam = rad_beam * std::sin(phi_beam);
152
153 // Transform to strip frame SF (eq. 36 in ver G, combined with eq. 2 since we are in beam frame)
154 //
155 // x_strip cos(-m_stereo) -sin(-m_stereo) x-R R
156 // ( ) = [ ]( ) + ( )
157 // y_strip sin(-m_stereo) cos(-m_stereo) y 0
158 const double x_strip = m_cosNegStereo * (x_beam - m_waferCentreR) - m_sinNegStereo * y_beam + m_waferCentreR;
159 const double y_strip = m_sinNegStereo * (x_beam - m_waferCentreR) + m_cosNegStereo * y_beam;
160
161 const double phi_strip = std::atan2(y_strip, x_strip);
162 const double rad_strip = std::hypot(x_strip, y_strip);
163
164 return {rad_strip, phi_strip};
165}
166
176 const double phi_beam = pos.xPhi();
177 const double rad_beam = pos.xEta();
178
179 // Exclusively-polar transform:
180 // Trig which can be precalculated in the future
181 const double stereo_2 = m_stereo*0.5;
182 const double cosStereo_2 = std::cos(stereo_2);
183 const double sin_plus_stereo_2 = std::sin(stereo_2);
184
185 // calculation for strip-frame radius uses cosine law - see ATL-COM-ITK-2021-048
186 const double rad_conv = 2.0*m_waferCentreR*std::abs(sin_plus_stereo_2);
187 const double rad_strip = std::sqrt( std::pow(rad_beam,2.0) + std::pow(rad_conv,2.0) + 2.0*rad_beam*rad_conv*cosStereo_2);
188
189 // calculation for strip-frame angle uses sine law - see ATL-COM-ITK-2021-048
190 const double phi_strip = M_PI_2 - stereo_2 - std::asin((rad_beam*std::sin(M_PI + phi_beam - stereo_2))/rad_strip);
191
192 return {rad_strip, phi_strip};
193}
194
196 if (m_usePC) return stripToBeamPC(pos);
197
198 const double x_strip = pos.xEta();
199 const double y_strip = pos.xPhi();
200
201 // Transform to beam frame (eq. 36 in ver G, combined with eq. 2 since we are in strip frame)
202 //
203 // x_beam cos(m_stereo) -sin(m_stereo) x-R R
204 // ( ) = [ ]( ) + ( )
205 // y_beam sin(m_stereo) cos(m_stereo) y 0
206 const double x_beam = m_cosStereo * (x_strip - m_waferCentreR) - m_sinStereo * y_strip + m_waferCentreR;
207 const double y_beam = m_sinStereo * (x_strip - m_waferCentreR) + m_cosStereo * y_strip;
208
209 return {x_beam, y_beam};
210}
211
213 const double phi_strip = pos.xPhi();
214 const double rad_strip = pos.xEta();
215
216 // Convert to cart and use previous transform
217 const double x_strip = rad_strip * std::cos(phi_strip);
218 const double y_strip = rad_strip * std::sin(phi_strip);
219
220 // Transform to beam frame (eq. 36 in ver G, combined with eq. 2 since we are in strip frame)
221 //
222 // x_beam cos(m_stereo) -sin(m_stereo) x-R R
223 // ( ) = [ ]( ) + ( )
224 // y_beam sin(m_stereo) cos(m_stereo) y 0
225 const double x_beam = m_cosStereo * (x_strip - m_waferCentreR) - m_sinStereo * y_strip + m_waferCentreR;
226 const double y_beam = m_sinStereo * (x_strip - m_waferCentreR) + m_cosStereo * y_strip;
227
228 const double phi_beam = std::atan2(y_beam, x_beam);
229 const double rad_beam = std::hypot(x_beam, y_beam);
230
231 return {rad_beam, phi_beam};
232}
233
243 const double phi_strip = pos.xPhi();
244 const double rad_strip = pos.xEta();
245
246 // Exclusively-polar transform:
247 // Trig which can be precalculated in the future
248 const double stereo_2 = m_stereo*0.5;
249 const double sin_plus_stereo_2 = std::sin(stereo_2);
250
251 // calculation for beam-frame radius uses cosine law - see ATL-COM-ITK-2021-048
252 const double rad_conv = 2.0*m_waferCentreR*std::abs(sin_plus_stereo_2);
253 const double rad_beam = std::sqrt( std::pow(rad_strip,2.0) + std::pow(rad_conv,2.0) + 2.0*rad_strip*rad_conv*std::cos(M_PI_2 - stereo_2 - phi_strip));
254
255 // calculation for beam-frame angle uses sine law - see ATL-COM-ITK-2021-048
256 const double phi_beam = stereo_2 - M_PI_2 + std::asin((rad_strip*std::sin(M_PI_2 - stereo_2 - phi_strip))/rad_beam);
257
258 return {rad_beam, phi_beam};
259}
260
261
265
266double StripStereoAnnulusDesign::sinStripAngleReco(double phiCoord, double etaCoord) const {
267//
268// Transform to strip frame SF (eq. 36 in ver G, combined with eq. 2 since we are in beam frame)
269//
270 SiLocalPosition pos_strip = beamToStrip({etaCoord, phiCoord});
271
272 double phi_strip = (m_usePC) ? pos_strip.xPhi() : std::atan2(pos_strip.xPhi(), pos_strip.xEta());
273
274 // The minus sign below is because this routine is called by tracking software, which swaps x and y, then measures angles from y
275 // to x
276 return -std::sin(phi_strip + m_stereo);
277}
278
287std::pair<int,int> StripStereoAnnulusDesign::getStripRow(SiCellId cellId) const {
288 int strip1D = cellId.phiIndex();
289 int rowNum = row(strip1D);
290 int strip2D = strip1D - m_firstStrip[rowNum];
291 return {strip2D,rowNum};
292}
293
295
296 return m_firstStrip[row] + strip;
297}
298
299void StripStereoAnnulusDesign::neighboursOfCell(const SiCellId &cellId, std::vector<SiCellId> &neighbours) const {
300
301
302 neighbours.clear();
303
304 if (!cellId.isValid()) {
305 return;
306 }
307
308 auto [strip, row] = getStripRow(cellId);
309 int stripM = strip - 1;
310 int stripP = strip + 1;
311
312 if (stripM >= m_firstStrip[row]) {
313 neighbours.emplace_back(stripM);
314 }
315 if (stripP < m_firstStrip[row] + m_nStrips[row]) {
316 neighbours.emplace_back(stripP);
317 }
318
319}
320
327 return *(m_bounds); // Equivalent but more explicit than *m_bounds -
328 // gets the normal pointer from the unique then dereferences it.
329}
330
332//
333// Find the row
334//
335 double rad_beam = (m_usePC) ? pos.xEta() : pos.r();
336 if (rad_beam < m_stripStartRadius[0] || rad_beam >= m_stripEndRadius.back()) {
337 return {}; // return an invalid id
338 }
339
340 std::vector<double>::const_iterator endPtr = upper_bound(m_stripStartRadius.begin(), m_stripStartRadius.end(), rad_beam);
341 int row = distance(m_stripStartRadius.begin(), endPtr) - 1;
342 // Following should never happen, check is done on r above
344 return {}; // return an invalid id
345 }
346
347 // Transform to strip frame SF (eq. 36 in ver G, combined with eq. 2 since we are in beam frame)
348 SiLocalPosition pos_strip = beamToStrip(pos);
349 double phi_strip = (m_usePC) ? pos_strip.xPhi() : std::atan2(pos_strip.xPhi(), pos_strip.xEta());
350 int strip = std::floor(phi_strip / m_pitch[row]) + m_nStrips[row] *0.5;
351 if (strip < 0) { // Outside
352 return {}; // return an invalid id
353 }
354 if (strip >= m_nStrips[row]) { // Outside
355 return {}; // return an invalid id
356 }
357
358 int strip1D = strip1Dim(strip, row);
359 return {strip1D, 0};
360}
361
363 auto [strip, row] = getStripRow(cellId);
364 double r = (m_stripEndRadius[row] + m_stripStartRadius[row])*0.5;
365
366 // Modified StripPosAtR?
367 // get phi of strip in the strip system
368 double phi_strip = (strip - m_nStrips[row] / 2. + 0.5) * m_pitch[row];
369
370 double b = -2. * m_lengthBF * std::sin(m_stereo/2. + phi_strip);
371 double c = m_lengthBF * m_lengthBF - r * r;
372 // this is the radius in the strip system
373 double rad_strip = (-b + std::sqrt(b * b - 4. * c))/2.;
374
375 if (m_usePC) return stripToBeam({rad_strip,phi_strip});
376 else {
377 //else use cart
378 double x_strip = rad_strip * std::cos(phi_strip);
379 double y_strip = rad_strip * std::sin(phi_strip);
380 //Return strip pos not beam pos?
381 return stripToBeam({x_strip, y_strip});
382 }
383}
384
386
387 double phi_strip = (strip - m_nStrips[row]*0.5 + 0.5) * m_pitch[row];
388
389 double b = -2. * m_lengthBF * std::sin(m_stereo*0.5 + phi_strip);
390 double c = m_lengthBF * m_lengthBF - r * r;
391 double rad_strip = (-b + std::sqrt(b * b - 4. * c))*0.5;
392
393 if (m_usePC) return stripToBeam({rad_strip,phi_strip});
394
395 double x_strip = rad_strip * std::cos(phi_strip);
396 double y_strip = rad_strip * std::sin(phi_strip);
397
398 return stripToBeam({x_strip, y_strip});
399}
400
402//
403// Return the average centre-position of the first and last strips.
404//
405
406 SiLocalPosition startPos = localPositionOfCell(cellId); // Should automatically detect PC Usage
407
408 if (clusterSize <= 1) {
409 return startPos;
410 }
411
412 auto [strip, row] = getStripRow(cellId);
413 int stripEnd = strip + clusterSize - 1;
414 SiCellId endId = strip1Dim(stripEnd, row);
415 SiLocalPosition endPos = localPositionOfCell(endId); // Should automatically detect PC Usage
416
417 return (startPos + endPos)*0.5;
418}
419
429
430 auto [strip, row] = getStripRow(cellId);
431 // this is the radius in the module / radial system
432 double r = (m_stripEndRadius[row] + m_stripStartRadius[row])*0.5;
433
434 // get phi of strip in the strip system
435 double phiPrime = (strip - m_nStrips[row]*0.5 + 0.5) * m_pitch[row];
436
437 double b = -2. * m_lengthBF * std::sin(m_stereo*0.5 + phiPrime);
438 double c = m_lengthBF * m_lengthBF - r * r;
439 // this is the radius in the strip systems
440 double rPrime = (-b + std::sqrt(b * b - 4. * c))*0.5;
441
442 // flip this, since coordinate system is defined the other way round
443 double phi = -1*phiPrime;
444
445 // xEta => r, xPhi = phi
446 return SiLocalPosition(rPrime, phi);
447}
448
459 SiLocalPosition startPos = localPositionOfCellPC(cellId);
460
461 if (clusterSize <= 1) {
462 return startPos;
463 }
464
465 auto [strip, row] = getStripRow(cellId);
466 int stripEnd = strip + clusterSize - 1;
467 SiCellId endId = strip1Dim(stripEnd, row);
469
470 return (startPos + endPos)*0.5;
471}
472
474 SiLocalPosition pos_strip = beamToStrip(pos);
475 // beamToStrip returns (r, phi) when using PC, (x, y) otherwise
476 double rPrime = (m_usePC) ? pos_strip.xEta() : pos_strip.r();
477 double phiPrime = (m_usePC) ? pos_strip.xPhi() : pos_strip.phi();
478
479 // flip phi, like in localPositionOfCellPC
480 return SiLocalPosition(rPrime, -phiPrime);
481}
482
484std::pair<SiLocalPosition, SiLocalPosition> StripStereoAnnulusDesign::endsOfStrip(SiLocalPosition const &pos) const {
485
486 SiCellId cellId = cellIdOfPosition(pos);
487
488 auto [strip, row] = getStripRow(cellId);
489
491
493
494 return std::pair<SiLocalPosition, SiLocalPosition>(innerEnd, outerEnd);
495}
496
497bool StripStereoAnnulusDesign::inActiveArea(SiLocalPosition const &pos, bool /*checkBondGap*/) const {
498
499 SiCellId id = cellIdOfPosition(pos);
500 bool inside = id.isValid();
501
502 return inside;
503}
504
505// Used in surfaceChargesGenerator
507
508
509 // Get stripframe phi of pos
510 SiLocalPosition pos_stripframe = beamToStrip(pos);
511 double pos_phi_stripframe = (m_usePC) ? pos_stripframe.xPhi() : std::atan2(pos_stripframe.xPhi(),pos_stripframe.xEta());
512
513 // Get stripframe phi of strip
514 SiCellId cellId = cellIdOfPosition(pos);
515 SiLocalPosition stripPos_beamframe = localPositionOfCell(cellId);
516 SiLocalPosition stripPos_stripframe = beamToStrip(stripPos_beamframe);
517 double strip_phi_stripframe = (m_usePC) ? stripPos_stripframe.xPhi() : std::atan2(stripPos_stripframe.xPhi(),stripPos_stripframe.xEta());
518
519 auto [strip, row] = getStripRow(cellId);
520 return std::abs(pos_phi_stripframe - strip_phi_stripframe) / m_pitch[row];
521}
522
525 throw std::runtime_error("Call to StripStereoAnnulusDesign::parameters; not yet implemented");
526}
527
528// Used in VP1 graphics. DEPRECATED.
530// throw std::runtime_error("Deprecated positionFromStrip called.");
531 return localPositionOfCell(cellId);
532}
533
534// DEPRECATED but pure virtual in base class; which row?? - assume row 0.
536 return localPositionOfCell(SiCellId(stripNumber, 0));
537}
538
541// returns an invalid id.
543
544 if (!cellId.isValid()) {
545 return {}; // Invalid
546 }
547 int row = cellId.etaIndex();
548 int strip = cellId.phiIndex();
549 if (strip < 0 || row < 0 || row >= m_nRows || strip >= m_nStrips[row]) {
550 return {}; // Invalid
551 }
552 return cellId;
553}
554
556// Return the total length of all strips, i.e. the active area length.
557 return m_stripEndRadius.back() - m_stripStartRadius[0];
558}
559
561// Return approximate width between the two central rows
562float middleRow = m_stripStartRadius.size() * 0.5 - 1;
563if (middleRow < 0) {
564 //single-row version
565 return 2. * tan((m_pitch[0] * m_nStrips[0])*0.5) * ((m_stripStartRadius[0] + m_stripEndRadius[0])*0.5);
566 }
567else return 2. * tan((m_pitch[middleRow] * m_nStrips[middleRow]) * 0.5) * m_stripEndRadius[middleRow];
568
569}
570
572 return 2. * tan((m_pitch[0] * m_nStrips[0]) * 0.5 ) * m_stripStartRadius[0];
573}
574
576 return 2. * tan((m_pitch.back() * m_nStrips.back()) * 0.5) * m_stripEndRadius.back();
577}
578
580// Return average strip length
581 return length() / m_stripStartRadius.size();
582}
583
584HepGeom::Vector3D<double> StripStereoAnnulusDesign::phiMeasureSegment(const SiLocalPosition & /*position*/)
585const {
586 throw std::runtime_error("Call to phiMeasureSegment, DEPRECATED, not implemented.");
587}
588
589void StripStereoAnnulusDesign::distanceToDetectorEdge(SiLocalPosition const & pos, double & etaDist, double & phiDist) const {
590 // For eta, we use the Strip frame. This is centred at the beamline, x along eta, y along phi, z along depth
591 // Happens to coincide with SiLocalPosition; no transform needed.
592 double rInner = m_stripStartRadius[0];
593 double rOuter = m_stripEndRadius[m_nRows - 1];
594
595 double rad_beam = (m_usePC) ? pos.xEta() : std::hypot(pos.xEta(), pos.xPhi());
596
597 if (rad_beam < rInner)
598 etaDist = rad_beam - rInner;
599 else if (rad_beam > rOuter)
600 etaDist = rOuter - rad_beam;
601 else
602 etaDist = std::min(rOuter - rad_beam, rad_beam - rInner);
603
604 // For phi, we use the Strip frame. Transform to Strip-frame:
605 SiLocalPosition pos_strip = beamToStrip(pos);
606
607 // Put these into polar coordinates
608 double rad_strip = (m_usePC) ? pos_strip.xEta() : std::hypot(pos_strip.xEta(), pos_strip.xPhi());
609 double phi_strip = (m_usePC) ? pos_strip.xPhi() : std::atan2(pos_strip.xPhi(), pos_strip.xEta());
610
611 double phiAngleMax = m_pitch[0] * m_nStrips[0]*0.5;
612 double phiAngleMin = -phiAngleMax;
613
614 if (phi_strip < phiAngleMin)
615 phiDist = rad_strip * (phi_strip - phiAngleMin);
616 else if (phi_strip > phiAngleMax)
617 phiDist = rad_strip * (phiAngleMax - phi_strip);
618 else
619 phiDist = rad_strip * std::min(phiAngleMax - phi_strip, phi_strip - phiAngleMin);
620}
621
627
629{
631 std::pair<SiLocalPosition, SiLocalPosition> end = endsOfStrip(lpoc);
632 double dx = end.second.xEta() - end.first.xEta();
633 double dy = end.second.xPhi() - end.first.xPhi();
634 return std::sqrt(dx * dx + dy * dy);
635}
636
637
638} // namespace InDetDD
639
#define M_PI
Scalar phi() const
phi method
if(pathvar)
double thickness() const
Method which returns thickness of the silicon wafer.
int readoutSide() const
ReadoutSide.
SCT_ModuleSideDesign(const double thickness, const bool phiSymmetric, const bool etaSymmetric, const bool depthSymmetric, const int crystals, const int diodes, const int cells, const int shift, const bool swapStripReadout, InDetDD::CarrierType carrierType, int readoutSide)
Constructor with parameters: local axis corresponding to eta direction local axis corresponding to ph...
Identifier for the strip or pixel cell.
Definition SiCellId.h:29
int phiIndex() const
Get phi index. Equivalent to strip().
Definition SiCellId.h:122
bool isValid() const
Test if its in a valid state.
Definition SiCellId.h:136
int etaIndex() const
Get eta index.
Definition SiCellId.h:114
Class to handle the position of the centre and the width of a diode or a cluster of diodes Version 1....
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
double r() const
Cylindrical coordinate r:
double phi() const
Cylindrical coordinate phi:
double xPhi() const
position along phi direction:
double xEta() const
position along eta direction:
std::unique_ptr< Trk::SurfaceBounds > m_bounds
SiLocalPosition beamToStripPC(const SiLocalPosition &pos) const
virtual int strip1Dim(int strip, int row) const override
only relevant for SCT.
virtual void neighboursOfCell(const SiCellId &cellId, std::vector< SiCellId > &neighbours) const override
Get the neighbouring diodes of a given diode: Cell for which the neighbours must be found List of cel...
virtual bool inActiveArea(const SiLocalPosition &chargePos, bool checkBondGap=true) const override
check if the position is in active area
SiLocalPosition stripToBeamPC(const SiLocalPosition &pos) const
virtual double maxWidth() const override
Method to calculate maximum width of a module.
const std::vector< double > m_stripStartRadius
StripStereoAnnulusDesign(const SiDetectorDesign::Axis &stripDirection, const SiDetectorDesign::Axis &thicknessDirection, const double &thickness, const int &readoutSide, const InDetDD::CarrierType &carrier, const int &nRows, const std::vector< int > &nStrips, const std::vector< double > &pitch, const std::vector< double > &stripStart, const std::vector< double > &stripEnd, const double &stereoAngle, const double &centreR, const bool &usePC, InDetDD::DetectorType detectorType=InDetDD::Undefined)
SiLocalPosition stripPosAtR(int strip, int row, double r) const
virtual int row(int stripId1Dim) const override
virtual double width() const override
Method to calculate average width of a module.
virtual DetectorShape shape() const override
Shape of element.
virtual SiLocalPosition localPositionOfCluster(const SiCellId &cellId, int clusterSize) const override
virtual double scaledDistanceToNearestDiode(const SiLocalPosition &chargePos) const override
give distance to the nearest diode in units of pitch, from 0.0 to 0.5, this method should be fast as ...
virtual double sinStripAngleReco(double phiCoord, double etaCoord) const override
Give strip angle in the reco frame.
SiLocalPosition beamToStripPCpolar(const SiLocalPosition &pos) const
Version of StripStereoAnnulusDesign::beamToStripPC transform based exclusively in a polar system.
virtual SiCellId cellIdInRange(const SiCellId &) const override
DEPRECATED: only used in a stupid example (2014) Check if cell is in range.
SiLocalPosition stripToBeamPCpolar(const SiLocalPosition &pos) const
Version of StripStereoAnnulusDesign::stripToBeamPC transform based exclusively in a polar system.
virtual SiLocalPosition localPositionOfCell(const SiCellId &cellId) const override
id -> position
virtual std::pair< SiLocalPosition, SiLocalPosition > endsOfStrip(const SiLocalPosition &position) const override
Give end points of the strip that covers the given position.
SiLocalPosition beamToStrip(const SiLocalPosition &pos) const
SiLocalPosition localPositionPC(const SiLocalPosition &pos) const
virtual HepGeom::Vector3D< double > phiMeasureSegment(const SiLocalPosition &position) const override
Helper method for stereo angle computation, DEPRECATED.
double pitch(const SiCellId &cellId) const
SiLocalPosition localPositionOfCellPC(const SiCellId &cellId) const
This is for debugging only.
double stripLength(const SiCellId &cellId) const
std::pair< int, int > getStripRow(SiCellId cellId) const final
Get the strip and row number of the cell.
virtual const Trk::SurfaceBounds & bounds() const override
Get a reference to the module bounds object.
virtual void distanceToDetectorEdge(const SiLocalPosition &localPosition, double &etaDist, double &phiDist) const override
Returns distance to nearest detector active edge +ve = inside -ve = outside.
virtual SiCellId cellIdOfPosition(const SiLocalPosition &localPos) const override
position -> id
SiLocalPosition stripToBeam(const SiLocalPosition &pos) const
virtual Amg::Vector3D sensorCenter() const override
Return the centre of a sensor in the local reference frame.
const std::vector< double > m_stripEndRadius
SiLocalPosition localPositionOfClusterPC(const SiCellId &cellId, int clusterSize) const
This is for debugging only.
virtual double etaPitch() const override
SiLocalPosition positionFromStrip(const SiCellId &cellId) const
virtual double length() const override
Method to calculate length of a module.
virtual SiDiodesParameters parameters(const SiCellId &cellId) const override
Return strip width, centre, length etc. Hard to find if this is used or not.
virtual int strip(int stripId1Dim) const override
virtual double minWidth() const override
Method to calculate minimum width of a module.
Class that implements the asymmetric shape of the ITk strip endcap modules.
Bounds for a annulus-like, planar Surface.
Abstract base class for surface bounds to be specified.
int r
Definition globals.cxx:22
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
Message Stream Member.
STL namespace.