source: trunk/examples/novice/gemc/src/bst_strip.cc @ 1309

Last change on this file since 1309 was 807, checked in by garnier, 16 years ago

update

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