ATLAS Offline Software
Loading...
Searching...
No Matches
SiDetElementsRoadUtils_xk.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include <cmath>
7
9// Output parameters: P[ 0] - radius centre of wafer
10// P[ 1] - z centre of wafer
11// P[ 2] - azimuthal angle centra of wifer
12// P[ 3] - min. distance to surface
13// P[ 4] - azimythal angle normal to surface
14// P[ 5] - sin(P[4])
15// P[ 6] - cos(P[4])
16// P[ 7] - sin(Polar angle)
17// P[ 8] - cos(Polar abgle)
18// P[ 9] - min. radius
19// P[10] - max. radius
20// P[11] - min. z
21// P[12] - max z
22// P[13] - min. azimythal angle
23// P[14] - max. azimuthal angle
24// P[15] - tilt angle
25// P[16] - min. dist to surface in XY-plane
26// P[17] - Tilt angle
27// P[18] - first local coordinate of wafer
28// P[19] - second local coordinate of wafer
29// P[20],P[21] - vector to -F boundary
30// P[22],P[23] - vector to +ZR boundary
31// P[24],P[25] - vector to +F boundary
32// P[26],P[27] - vector to -ZR boundary
33// P[28] - thikness of the detector element
34// P[29] - Ax of Phi exis
35// P[30] - Ay of Phi exis
36// P[31] - Ax of Eta exis
37// P[32] - Ay of Eta exis
39
40namespace InDet {
43 {
44 const double pi2=2.*M_PI, pi= M_PI;
45
46 double Sl = .5*Si.design().length ();
47 double Swmax = .5*Si.design().maxWidth();
48 double Swmin = .5*Si.design().minWidth();
49
50 // Thickness of the waver
51 //
52 P[28] = Si.design().thickness();
53 Amg::Vector3D C = Si.center(); double x0=C.x(), y0=C.y(), z0=C.z();
54 Amg::Vector3D AT = Si.normal ();
55 Amg::Vector3D AF = Si.phiAxis();
56 Amg::Vector3D AE = Si.etaAxis();
57
58 double A[3]={AT.x(),AT.y(),AT.z()};
59
60 P[ 0] = sqrt(x0*x0+y0*y0);
61 P[ 1] = z0;
62 P[ 2] = atan2(y0,x0);
63 P[ 3] = A[0]*x0+A[1]*y0+A[2]*z0;
64 if(P[3]<0.) {P[3]*=-1.; A[0]*=-1.; A[1]*=-1.; A[2]*=-1.;}
65 P[ 7] = sqrt(A[0]*A[0]+A[1]*A[1]);
66
67 if(P[7] >.000001) P[4]=atan2(A[1],A[0]); else P[4]=P[2];
68 sincos(P[4],&P[5],&P[6]);
69 P[ 8] = A[2];
70
71 if( fabs(P[7]) <= .000001) {
72
73 P[3] = fabs(P[1]);
74 if(P[8] > 0.) P[8] = 1.; else P[8] = -1.;
75 P[7] = 0.;
76 }
77
78 double x[4],y[4],z[4];
79
80 x[0] = x0+AF.x()*Swmax+AE.x()*Sl;
81 y[0] = y0+AF.y()*Swmax+AE.y()*Sl;
82 z[0] = z0+AF.z()*Swmax+AE.z()*Sl;
83
84 x[1] = x0+AF.x()*Swmin-AE.x()*Sl;
85 y[1] = y0+AF.y()*Swmin-AE.y()*Sl;
86 z[1] = z0+AF.z()*Swmin-AE.z()*Sl;
87
88 x[2] = x0-AF.x()*Swmin-AE.x()*Sl;
89 y[2] = y0-AF.y()*Swmin-AE.y()*Sl;
90 z[2] = z0-AF.z()*Swmin-AE.z()*Sl;
91
92 x[3] = x0-AF.x()*Swmax+AE.x()*Sl;
93 y[3] = y0-AF.y()*Swmax+AE.y()*Sl;
94 z[3] = z0-AF.z()*Swmax+AE.z()*Sl;
95
96 double rmin= 10000., rmax=-10000.;
97 double zmin= 10000., zmax=-10000.;
98 double fmin= 10000., fmax=-10000.;
99 for(int i=0; i!=4; ++i) {
100 double r = sqrt(x[i]*x[i]+y[i]*y[i]);
101 double f = atan2(y[i],x[i])-P[2]; if(f<-pi) f+=pi2; else if(f>pi) f-=pi2;
102 double zf= z[i];
103 if(r <rmin) rmin= r;
104 if(r >rmax) rmax= r;
105 if(zf<zmin) zmin=zf;
106 if(zf>zmax) zmax=zf;
107 if(f <fmin) fmin= f;
108 if(f >fmax) fmax= f;
109 }
110 P[ 9] = rmin;
111 P[10] = rmax;
112 P[11] = zmin;
113 P[12] = zmax;
114 P[13] = P[2]+fmin;
115 P[14] = P[2]+fmax;
116 P[15] = P[4]-P[2]; if(P[15]<-pi) P[15]+=pi2; else if(P[15]>pi) P[15]-=pi2;
117 P[16] = A[0]*x0+A[1]*y0;
118 P[17] = atan2(AE.y(),AE.x());
119 P[17] = P[17]-P[2]; if(P[17]<-pi) P[17]+=pi2; else if(P[17]>pi) P[17]-=pi2;
120
121 // Calculation shape parameters
122 //
123 P[18] = y0*P[6]-x0*P[5]; // F center
124 P[19] = P[8]*(x0*P[6]+y0*P[5])-P[7]*z0; // ZR center
125 P[20] = +10000.; // -F
126 P[21] = 0. ; //
127 P[22] = 0. ; // +ZR
128 P[23] = -10000.; //
129 P[24] = -10000.; // +F
130 P[25] = 0. ; //
131 P[26] = 0. ; // -ZR
132 P[27] = +10000.; //
133 //
134 for(int i=0; i!=4; ++i) {
135
136 int k1 = i;
137 int k2 = i+1; if(k2>3) k2=0;
138 double x1 = y[k1]*P[6]-x[k1]*P[5] -P[18];
139 double y1 = P[8]*(x[k1]*P[6]+y[k1]*P[5])-P[7]*z[k1]-P[19];
140 double x2 = y[k2]*P[6]-x[k2]*P[5] -P[18];
141 double y2 = P[8]*(x[k2]*P[6]+y[k2]*P[5])-P[7]*z[k2]-P[19];
142 double d = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
143 double ax =-(y2-y1)*(y1*x2-x1*y2)/d;
144 double ay = (x2-x1)*(y1*x2-x1*y2)/d;
145 if(ax<P[20]) {P[20]=ax; P[21]=ay;}
146 if(ax>P[24]) {P[24]=ax; P[25]=ay;}
147 if(ay<P[27]) {P[26]=ax; P[27]=ay;}
148 if(ay>P[23]) {P[22]=ax; P[23]=ay;}
149 }
150
151 // Directions Phi and Eta in local system coordinates
152 //
153 P[29] = AF.y()*P[6]-AF.x()*P[5];
154 P[30] = P[8]*(AF.x()*P[6]+AF.y()*P[5])-P[7]*AF.z();
155 P[31] = AE.y()*P[6]-AE.x()*P[5];
156 P[32] = P[8]*(AE.x()*P[6]+AE.y()*P[5])-P[7]*AE.z();
157 }
158
159 }
160}
#define M_PI
static Double_t P(Double_t *tt, Double_t *par)
#define pi
#define y
#define x
#define z
double thickness() const
Method which returns thickness of the silicon wafer.
virtual double maxWidth() const =0
Method to calculate maximum width of a module.
virtual double minWidth() const =0
Method to calculate minimum width of a module.
virtual double length() const =0
Method to calculate length of a module.
Class to hold geometrical description of a silicon detector element.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
virtual const Amg::Vector3D & normal() const override final
Get reconstruction local normal axes in global frame.
virtual const Amg::Vector3D & center() const override final
Center in global coordinates.
int r
Definition globals.cxx:22
struct color C
Eigen::Matrix< double, 3, 1 > Vector3D
void detElementInformation(const InDetDD::SiDetectorElement &Si, double *P)
Primary Vertex Finder.
hold the test vectors and ease the comparison