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
474std::pair<SiLocalPosition, SiLocalPosition> StripStereoAnnulusDesign::endsOfStrip(SiLocalPosition const &pos) const {
475
476 SiCellId cellId = cellIdOfPosition(pos);
477
478 auto [strip, row] = getStripRow(cellId);
479
481
483
484 return std::pair<SiLocalPosition, SiLocalPosition>(innerEnd, outerEnd);
485}
486
487bool StripStereoAnnulusDesign::inActiveArea(SiLocalPosition const &pos, bool /*checkBondGap*/) const {
488
489 SiCellId id = cellIdOfPosition(pos);
490 bool inside = id.isValid();
491
492 return inside;
493}
494
495// Used in surfaceChargesGenerator
497
498
499 // Get stripframe phi of pos
500 SiLocalPosition pos_stripframe = beamToStrip(pos);
501 double pos_phi_stripframe = (m_usePC) ? pos_stripframe.xPhi() : std::atan2(pos_stripframe.xPhi(),pos_stripframe.xEta());
502
503 // Get stripframe phi of strip
504 SiCellId cellId = cellIdOfPosition(pos);
505 SiLocalPosition stripPos_beamframe = localPositionOfCell(cellId);
506 SiLocalPosition stripPos_stripframe = beamToStrip(stripPos_beamframe);
507 double strip_phi_stripframe = (m_usePC) ? stripPos_stripframe.xPhi() : std::atan2(stripPos_stripframe.xPhi(),stripPos_stripframe.xEta());
508
509 auto [strip, row] = getStripRow(cellId);
510 return std::abs(pos_phi_stripframe - strip_phi_stripframe) / m_pitch[row];
511}
512
515 throw std::runtime_error("Call to StripStereoAnnulusDesign::parameters; not yet implemented");
516}
517
518// Used in VP1 graphics. DEPRECATED.
520// throw std::runtime_error("Deprecated positionFromStrip called.");
521 return localPositionOfCell(cellId);
522}
523
524// DEPRECATED but pure virtual in base class; which row?? - assume row 0.
526 return localPositionOfCell(SiCellId(stripNumber, 0));
527}
528
531// returns an invalid id.
533
534 if (!cellId.isValid()) {
535 return {}; // Invalid
536 }
537 int row = cellId.etaIndex();
538 int strip = cellId.phiIndex();
539 if (strip < 0 || row < 0 || row >= m_nRows || strip >= m_nStrips[row]) {
540 return {}; // Invalid
541 }
542 return cellId;
543}
544
546// Return the total length of all strips, i.e. the active area length.
547 return m_stripEndRadius.back() - m_stripStartRadius[0];
548}
549
551// Return approximate width between the two central rows
552float middleRow = m_stripStartRadius.size() * 0.5 - 1;
553if (middleRow < 0) {
554 //single-row version
555 return 2. * tan((m_pitch[0] * m_nStrips[0])*0.5) * ((m_stripStartRadius[0] + m_stripEndRadius[0])*0.5);
556 }
557else return 2. * tan((m_pitch[middleRow] * m_nStrips[middleRow]) * 0.5) * m_stripEndRadius[middleRow];
558
559}
560
562 return 2. * tan((m_pitch[0] * m_nStrips[0]) * 0.5 ) * m_stripStartRadius[0];
563}
564
566 return 2. * tan((m_pitch.back() * m_nStrips.back()) * 0.5) * m_stripEndRadius.back();
567}
568
570// Return average strip length
571 return length() / m_stripStartRadius.size();
572}
573
574HepGeom::Vector3D<double> StripStereoAnnulusDesign::phiMeasureSegment(const SiLocalPosition & /*position*/)
575const {
576 throw std::runtime_error("Call to phiMeasureSegment, DEPRECATED, not implemented.");
577}
578
579void StripStereoAnnulusDesign::distanceToDetectorEdge(SiLocalPosition const & pos, double & etaDist, double & phiDist) const {
580 // For eta, we use the Strip frame. This is centred at the beamline, x along eta, y along phi, z along depth
581 // Happens to coincide with SiLocalPosition; no transform needed.
582 double rInner = m_stripStartRadius[0];
583 double rOuter = m_stripEndRadius[m_nRows - 1];
584
585 double rad_beam = (m_usePC) ? pos.xEta() : std::hypot(pos.xEta(), pos.xPhi());
586
587 if (rad_beam < rInner)
588 etaDist = rad_beam - rInner;
589 else if (rad_beam > rOuter)
590 etaDist = rOuter - rad_beam;
591 else
592 etaDist = std::min(rOuter - rad_beam, rad_beam - rInner);
593
594 // For phi, we use the Strip frame. Transform to Strip-frame:
595 SiLocalPosition pos_strip = beamToStrip(pos);
596
597 // Put these into polar coordinates
598 double rad_strip = (m_usePC) ? pos_strip.xEta() : std::hypot(pos_strip.xEta(), pos_strip.xPhi());
599 double phi_strip = (m_usePC) ? pos_strip.xPhi() : std::atan2(pos_strip.xPhi(), pos_strip.xEta());
600
601 double phiAngleMax = m_pitch[0] * m_nStrips[0]*0.5;
602 double phiAngleMin = -phiAngleMax;
603
604 if (phi_strip < phiAngleMin)
605 phiDist = rad_strip * (phi_strip - phiAngleMin);
606 else if (phi_strip > phiAngleMax)
607 phiDist = rad_strip * (phiAngleMax - phi_strip);
608 else
609 phiDist = rad_strip * std::min(phiAngleMax - phi_strip, phi_strip - phiAngleMin);
610}
611
617
619{
621 std::pair<SiLocalPosition, SiLocalPosition> end = endsOfStrip(lpoc);
622 double dx = end.second.xEta() - end.first.xEta();
623 double dy = end.second.xPhi() - end.first.xPhi();
624 return std::sqrt(dx * dx + dy * dy);
625}
626
627
628} // namespace InDetDD
629
#define M_PI
Scalar phi() const
phi method
if(febId1==febId2)
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 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
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.