GEMC  1.8
Geant4 Monte-Carlo Framework
str_strip.cc
Go to the documentation of this file.
1 // %%%%%%%%%%%%%
2 // gemc headers
3 // %%%%%%%%%%%%%
4 #include "str_strip.h"
5 
6 #include <iostream>
7 #include <cmath>
8 #include <cstdlib>
9 
11 {
12  // all dimensions are in mm
13 
14  Pi = 3.14159265358;
15  interlayer = 2.75; // distance between 2 layers of a superlayer
16 
17  alpha = 3.0*Pi/180.0; // max angle of the strips
18  pitch = 0.150; // pitch of the strips
19 
20  // number of sectors for each layer
21  Nsector.push_back(1); Nsector.push_back(1);
22  Nsector.push_back(1); Nsector.push_back(1);
23  Nsector.push_back(1); Nsector.push_back(1);
24 // Nsector.push_back(24); Nsector.push_back(24);
25 
26  // number of cards by sector for each layer
27  Ncards.push_back(2); Ncards.push_back(2);
28  Ncards.push_back(2); Ncards.push_back(2);
29  Ncards.push_back(2); Ncards.push_back(2);
30 // Ncards.push_back(3); Ncards.push_back(3);
31 
32  // z of the upstream part of the layer (start of the silicon)
33  Z0.push_back(-131.854); Z0.push_back(-131.854);
34  Z0.push_back(-92.329); Z0.push_back(-92.329);
35  Z0.push_back(-165.11); Z0.push_back(-165.11);
36 // Z0.push_back(-164.775); Z0.push_back(-164.775);
37 
38  // radii of layers
39  R.push_back(50.699); R.push_back(R[0]+interlayer);
40  R.push_back(78.375); R.push_back(R[2]+interlayer);
41  R.push_back(105.574); R.push_back(R[4]+interlayer);
42 // R.push_back(161.25); R.push_back(R[6]+interlayer);
43 
44  // mid angle of the sector
45  MidTile.push_back(0); MidTile.push_back(0);
46  MidTile.push_back(0); MidTile.push_back(0);
47  MidTile.push_back(Pi/16); MidTile.push_back(Pi/16);
48 // MidTile.push_back(0); MidTile.push_back(0);
49 
50  DZ_inLength = 0.934; // size of the band of dead zones all around in the length of the card
51  DZ_inWidth = 0.934; // size of the band of dead zones all around in the width of the card
52  CardLength = 111.625; // length of 1 card
53  CardWidth = 41.7; // width 1 card
54 
55  // Number of strips
56  NstripsZ = (int) floor((CardWidth-2.0*DZ_inLength-(CardLength-2*DZ_inWidth)*tan(alpha))*cos(alpha)/pitch);
57  Nstrips = (int) floor((CardWidth-2.0*DZ_inLength)/pitch);
58 
59 }
60 
61 
62 void str_strip::FindCard(int layer, double Z)
63 {
64  if(Z>Z0[layer] && Z<Z0[layer]+Ncards[layer]*CardLength)
65  {
66  // get the card index
67  nCard = (int) floor((Z-Z0[layer])/CardLength);
68 
69  // redefine z to the global coordinate on the first card.
70  // If it's the middle card z becomes the distance to the right edge.
71  if((nCard%2)==0) z = Z - nCard*CardLength;
72  if((nCard%2)==1) z = Z0[layer] + (nCard+1)*CardLength - Z + Z0[layer];
73 
74  // now hit is in the 1st card of the tile! let's check it
75  if(z<Z0[layer] || z>Z0[layer]+CardLength)
76  {
77  cout << " Warning: z not within first card. This should never happen! z = " << z << ", card = " << nCard << endl;
78  exit(0);
79  }
80  }
81 }
82 
83 
84 int str_strip::FindStripZ(int layer, int sector, double X, double Y)
85 {
86  x = X;
87  y = Y;
88 
89  double mindist = 999.; // min distance between the points and strips
90  double dist = 999.; // distance to current strip
91  int ClosestStrip = -1; // number of the closest strip
92 
93  int IsOK = 0;
94  const int MAXNSTRIP = 1024;
95  if(NstripsZ > MAXNSTRIP)
96  {
97  cout << " Warning: number of strips > 1024. Exiting. " << endl;
98  exit(0);
99  }
100 
101  double Px[MAXNSTRIP], Py[MAXNSTRIP], Pz[MAXNSTRIP];
102  double Pxp[MAXNSTRIP], Pyp[MAXNSTRIP], Pzp[MAXNSTRIP];
103 
104 
105  for(int k=0; k<NstripsZ; k++)
106  {
107  Px[k] = (R[layer]/cos(0.5*(CardWidth/R[layer])))*cos(MidTile[layer] +
108  2.0*sector*Pi/Nsector[layer] + 0.5*CardWidth/R[layer]) + DZ_inLength*sin(MidTile[layer] +
109  2.0*sector*Pi/Nsector[layer]) + (pitch*k/cos(alpha))*sin(MidTile[layer] +
110  2.0*sector*Pi/Nsector[layer]);
111  Py[k] = (R[layer]/cos(0.5*(CardWidth/R[layer])))*sin(MidTile[layer] +
112  2.0*sector*Pi/Nsector[layer] + 0.5*CardWidth/R[layer]) - DZ_inLength*cos(MidTile[layer] +
113  2.0*sector*Pi/Nsector[layer]) - (pitch*k/cos(alpha))*cos(MidTile[layer] +
114  2.0*sector*Pi/Nsector[layer]);
115  Pz[k] = Z0[layer]+DZ_inWidth;
116 
117 
118  Pxp[k] = (R[layer]/cos(0.5*(CardWidth/R[layer])))*cos(MidTile[layer]
119  + 2.0*sector*Pi/Nsector[layer] - 0.5*CardWidth/R[layer])-DZ_inLength*sin(MidTile[layer]
120  + 2.0*sector*Pi/Nsector[layer]) - (pitch*k/cos(alpha))*sin(MidTile[layer]
121  + 2.0*sector*Pi/Nsector[layer]);
122  Pyp[k] = (R[layer]/cos(0.5*(CardWidth/R[layer])))*sin(MidTile[layer]
123  + 2.0*sector*Pi/Nsector[layer] - 0.5*CardWidth/R[layer])+DZ_inLength*cos(MidTile[layer]
124  + 2.0*sector*Pi/Nsector[layer]) + (pitch*k/cos(alpha))*cos(MidTile[layer]
125  + 2.0*sector*Pi/Nsector[layer]);
126  Pzp[k] = Z0[layer]+DZ_inWidth;
127 
128  // W layer
129  if((layer%2)==0)
130  {
131  dist = fabs( - sin(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(alpha)*x
132  + cos(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(alpha)*y
133  + sin(alpha)*z
134  + sin(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(alpha)*Px[k]
135  - cos(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(alpha)*Py[k]
136  - sin(alpha)*Pz[k]);
137 
138  if(dist<mindist)
139  {
140  mindist = dist;
141  ClosestStrip = k;
142  }
143  }
144 
145  // V layer
146  if((layer%2)==1)
147  {
148  dist = fabs( - sin(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(-alpha)*x
149  + cos(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(-alpha)*y
150  + sin(-alpha)*z
151  + sin(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(-alpha)*Pxp[k]
152  - cos(MidTile[layer] + sector*2.0*Pi/Nsector[layer])*cos(-alpha)*Pyp[k]
153  - sin(-alpha)*Pzp[k]);
154 
155  if(dist<mindist)
156  {
157  mindist = dist;
158  ClosestStrip = k;
159  }
160  }
161  }
162  if(mindist<pitch/2. && z>Z0[layer]+DZ_inWidth && z<Z0[layer]+CardLength-DZ_inWidth) IsOK = 1;
163  else IsOK = 0;
164 
165  if(IsOK) return ClosestStrip;
166  else return -1;
167 }
168 
169 
170 int str_strip::FindStrip(int layer, int sector, double X, double Y, double Z)
171 {
172  x = X;
173  y = Y;
174  z = Z;
175 
176  double mindist = 999.; // min distance between the points and strips
177  double dist = 999.; // distance to current strip
178  int ClosestStrip = -1; // number of the closest strip
179  int IsOK = 0;
180  const int MAXNSTRIP = 1024;
181 
182  if(Nstrips > MAXNSTRIP)
183  {
184  cout << " Warning: number of strips > 1024. Exiting. " << endl;
185  exit(0);
186  }
187 
188  double Px[MAXNSTRIP], Py[MAXNSTRIP], Pz[MAXNSTRIP];
189  double Pxp[MAXNSTRIP], Pyp[MAXNSTRIP], Pzp[MAXNSTRIP];
190  double alpha_k;
191 
192  // particle is in the z-acceptance
193  if(z>Z0[layer]+DZ_inWidth && z<Z0[layer]+Ncards[layer]*CardLength-DZ_inWidth)
194  {
195 
196  for(int k=0; k<Nstrips; k++)
197  {
198  alpha_k = k/((float)(Nstrips-1))*alpha;
199  Px[k] = (R[layer]/cos(atan(0.5*(CardWidth/R[layer]))))*cos(MidTile[layer] +
200  2.0*sector*Pi/Nsector[layer]+atan(0.5*CardWidth/R[layer]))+DZ_inLength*sin(MidTile[layer] +
201  2.0*sector*Pi/Nsector[layer])+(pitch*k)*sin(MidTile[layer]+sector*2.0*Pi/Nsector[layer]);
202  Py[k] = (R[layer]/cos(atan(0.5*(CardWidth/R[layer]))))*sin(MidTile[layer] +
203  2.0*sector*Pi/Nsector[layer]+atan(0.5*CardWidth/R[layer]))-DZ_inLength*cos(MidTile[layer] +
204  2.0*sector*Pi/Nsector[layer])-(pitch*k)*cos(MidTile[layer]+sector*2.*Pi/Nsector[layer]);
205  Pz[k] = Z0[layer]+DZ_inWidth;
206 
207  Pxp[k] = (R[layer]/cos(atan(0.5*(CardWidth/R[layer]))))*cos(MidTile[layer] +
208  2.0*sector*Pi/Nsector[layer]-atan(0.5*CardWidth/R[layer]))-DZ_inLength*sin(MidTile[layer] +
209  2.0*sector*Pi/Nsector[layer])-(pitch*k)*sin(MidTile[layer]+sector*2.*Pi/Nsector[layer]);
210  Pyp[k] = (R[layer]/cos(atan(0.5*(CardWidth/R[layer]))))*sin(MidTile[layer] +
211  2.0*sector*Pi/Nsector[layer]-atan(0.5*CardWidth/R[layer]))+DZ_inLength*cos(MidTile[layer] +
212  2.0*sector*Pi/Nsector[layer])+(pitch*k)*cos(MidTile[layer]+sector*2.*Pi/Nsector[layer]);
213  Pzp[k] = Z0[layer]+DZ_inWidth;
214 
215  if((layer%2)==0)
216  {
217  dist = fabs(-sin(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(alpha_k)*x +
218  cos(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(alpha_k)*y +
219  sin(alpha_k)*z +
220  sin(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(alpha_k)*Px[k] -
221  cos(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(alpha_k)*Py[k] -
222  sin(alpha_k)*Pz[k]);
223  if(dist<mindist)
224  {
225  mindist = dist;
226  ClosestStrip = k; // record strip number
227  }
228  }
229 
230  if((layer%2)==1)
231  {
232  dist = fabs(-sin(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(-alpha_k)*x +
233  cos(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(-alpha_k)*y +
234  sin(-alpha_k)*z +
235  sin(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(-alpha_k)*Pxp[k] -
236  cos(MidTile[layer]+sector*2.0*Pi/Nsector[layer])*cos(-alpha_k)*Pyp[k] -
237  sin(-alpha_k)*Pzp[k]);
238  if(dist<mindist)
239  {
240  mindist = dist;
241  ClosestStrip = k; // record strip number
242  }
243  }
244  }
245  if(mindist < (pitch+(Ncards[layer]*CardLength-2.*DZ_inWidth)*alpha/(Nstrips-1)*(1.+tan(alpha)*tan(alpha)))/2. &&
246  z>Z0[layer]+DZ_inWidth &&
247  z<Z0[layer]+Ncards[layer]*CardLength-DZ_inWidth &&
248  sqrt(x*x+y*y)<R[layer]/cos(atan((0.5*CardWidth-DZ_inLength)/R[layer]))) IsOK = 1;
249  else IsOK = 0;
250  }
251  else
252  {
253  // particle not in the z-acceptance
254  IsOK = 0;
255  ClosestStrip = -1;
256  }
257 
258  if(IsOK) return ClosestStrip;
259  else return -1;
260 
261 }
262 
263 
int nCard
Definition: str_strip.h:25
vector< int > Ncards
Definition: str_strip.h:13
double CardLength
Definition: str_strip.h:20
double DZ_inLength
Definition: str_strip.h:18
double y
Definition: str_strip.h:26
vector< double > Z0
Definition: str_strip.h:14
double z
Definition: str_strip.h:26
double CardWidth
Definition: str_strip.h:21
int FindStripZ(int layer, int sector, double x, double y)
Definition: str_strip.cc:84
double DZ_inWidth
Definition: str_strip.h:19
double alpha
Definition: str_strip.h:7
vector< double > R
Definition: str_strip.h:15
double pitch
Definition: str_strip.h:8
vector< int > Nsector
Definition: str_strip.h:12
void fill_infos()
Definition: str_strip.cc:10
double x
Definition: str_strip.h:26
int NstripsZ
Definition: str_strip.h:22
double Pi
Definition: str_strip.h:9
vector< double > MidTile
Definition: str_strip.h:16
int Nstrips
Definition: str_strip.h:23
int FindStrip(int layer, int sector, double x, double y, double z)
Definition: str_strip.cc:170
void FindCard(int layer, double z)
Definition: str_strip.cc:62
double interlayer
Definition: str_strip.h:11