1 | // %%%%%%%%%%%%% |
---|
2 | // gemc headers |
---|
3 | // %%%%%%%%%%%%% |
---|
4 | #include "fst_strip.h" |
---|
5 | |
---|
6 | #include <iostream> |
---|
7 | #include <cmath> |
---|
8 | |
---|
9 | void fst_strip::fill_infos() |
---|
10 | { |
---|
11 | // all dimensions are in mm |
---|
12 | |
---|
13 | Pi = 3.14159265358; |
---|
14 | interlayer = 2.75; // distance between 2 layers of a superlayer |
---|
15 | intersuperlayer = 15.0; // distance between 2 superlayers |
---|
16 | Nsector=15; // number of sectors for each layer |
---|
17 | |
---|
18 | alpha = (360.0/Nsector/2.0)*Pi/180.0; // angle of the strips |
---|
19 | pitch = 0.150; // pitch of the strips |
---|
20 | |
---|
21 | |
---|
22 | DZ = 0.934; // size of the band of dead zones |
---|
23 | Rmin = 19.029; // inner radius of disks |
---|
24 | Rmax = (Rmin+45.419+123.552); // outer radius of disks |
---|
25 | Z_1stlayer = 238.065; // z position of the 1st layer |
---|
26 | |
---|
27 | // z of the upstream part of the layer |
---|
28 | Z0.push_back(Z_1stlayer); |
---|
29 | Z0.push_back(Z0[0]+interlayer); |
---|
30 | Z0.push_back(Z_1stlayer+intersuperlayer); |
---|
31 | Z0.push_back(Z0[2]+interlayer); |
---|
32 | Z0.push_back(Z_1stlayer+2.*intersuperlayer); |
---|
33 | Z0.push_back(Z0[4]+interlayer); |
---|
34 | |
---|
35 | |
---|
36 | // mid angle of the sector |
---|
37 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
38 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
39 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
40 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
41 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
42 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
43 | |
---|
44 | // Number of strips |
---|
45 | Nstrips = (int) floor((2.*Rmax*tan(alpha)-2.*DZ)/pitch); |
---|
46 | |
---|
47 | } |
---|
48 | |
---|
49 | |
---|
50 | |
---|
51 | |
---|
52 | |
---|
53 | int fst_strip::FindStrip(int layer, int sector, double x, double y, double z) |
---|
54 | { |
---|
55 | // 1st define phi of the hit point |
---|
56 | double phi; |
---|
57 | if(x>0 && y>=0) phi = atan(y/x); |
---|
58 | else if(x>0 && y<0) phi = 2.*Pi+atan(y/x); |
---|
59 | else if(x<0) phi = Pi+atan(y/x); |
---|
60 | else if(x==0 && y>0) phi = Pi/2.; |
---|
61 | else if(x==0 && y<0) phi = 3.*Pi/2.; |
---|
62 | else phi = 0; // x = y = 0, phi not defined |
---|
63 | |
---|
64 | // now find the tile number |
---|
65 | int ti=0; |
---|
66 | double theta_tmp=0; |
---|
67 | for(int t=0; t<Nsector; t++) |
---|
68 | { |
---|
69 | theta_tmp = MidTile[layer]+2.*t*Pi/Nsector; |
---|
70 | if(theta_tmp>2.*Pi) theta_tmp = theta_tmp - 2.*Pi; |
---|
71 | if(theta_tmp<0) theta_tmp = theta_tmp + 2.*Pi; |
---|
72 | if(fabs(phi-theta_tmp)<Pi/Nsector || fabs(2.*Pi-fabs(phi-theta_tmp))<Pi/Nsector) ti=t; // gives tile # |
---|
73 | } |
---|
74 | |
---|
75 | double thetaij = MidTile[layer]+2.*ti*Pi/Nsector; |
---|
76 | int ClosestStrip=0; |
---|
77 | if(layer%2==0) |
---|
78 | ClosestStrip = (int) (floor( (-DZ+x*(cos(thetaij)*tan(alpha)+sin(thetaij))+y*(sin(thetaij)*tan(alpha)-cos(thetaij)))/pitch) + |
---|
79 | floor(2.0*((-DZ+x*(cos(thetaij)*tan(alpha)+sin(thetaij)) + y*(sin(thetaij)*tan(alpha)-cos(thetaij)))/pitch - |
---|
80 | floor((-DZ+x*(cos(thetaij)*tan(alpha)+sin(thetaij)) + y*(sin(thetaij)*tan(alpha)-cos(thetaij)))/pitch)))); |
---|
81 | |
---|
82 | if(layer%2==1) |
---|
83 | ClosestStrip = (int) (floor( (-DZ+x*(cos(thetaij)*tan(alpha)-sin(thetaij))+y*(sin(thetaij)*tan(alpha)+cos(thetaij)))/pitch) + |
---|
84 | floor(2.0*((-DZ+x*(cos(thetaij)*tan(alpha)-sin(thetaij))+y*(sin(thetaij)*tan(alpha)+cos(thetaij)))/pitch - |
---|
85 | floor((-DZ+x*(cos(thetaij)*tan(alpha)-sin(thetaij))+y*(sin(thetaij)*tan(alpha)+cos(thetaij)))/pitch)))); |
---|
86 | |
---|
87 | int IsOK=1; |
---|
88 | |
---|
89 | // now check if the position is in the acceptance of the detector: |
---|
90 | if(ClosestStrip<0 || ClosestStrip>Nstrips) IsOK = 0; |
---|
91 | if(x*cos(thetaij)+y*sin(thetaij)< Rmin || x*cos(thetaij)+y*sin(thetaij)>Rmax) |
---|
92 | { |
---|
93 | // cout << " Outside Acceptance " << endl; |
---|
94 | IsOK = 0; |
---|
95 | } |
---|
96 | |
---|
97 | if(IsOK) return ClosestStrip; |
---|
98 | else return -1; |
---|
99 | |
---|
100 | |
---|
101 | } |
---|
102 | |
---|
103 | |
---|
104 | |
---|
105 | |
---|
106 | |
---|
107 | |
---|
108 | |
---|
109 | |
---|
110 | |
---|
111 | |
---|
112 | |
---|