Rev 54 | Rev 72 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 54 | Rev 70 | ||
---|---|---|---|
Line 7... | Line 7... | ||
7 | 7 | ||
8 | //extern int show_3d; |
8 | //extern int show_3d; |
9 | //extern int show_data; |
9 | //extern int show_data; |
10 | 10 | ||
11 | // Set the simulation parameters |
11 | // Set the simulation parameters |
12 | void |
12 | void showVisual(int b) {show_3d = b;} |
13 | void |
13 | void showData(int b) {show_data = b;} |
14 | 14 | ||
15 | // Set the initial detector parameters (a, b, d, activeDetector, n1, n2, n3, gap) |
15 | // Set the initial detector parameters (a, b, d, activeDetector, n1, n2, n3, gap) |
16 | DetectorParameters parameters(3.0, 5.0, 3.0, 3.0, 1, 1.53, 1. |
16 | DetectorParameters parameters(3.0, 5.0, 3.0, 3.0, 1, 1.53, 1.46, TVector3(0.3, 0, 0)); |
- | 17 | // Print the detector parameters |
|
- | 18 | void getParameters(); |
|
17 | 19 | ||
18 | //void SetLGType(int in = 1, int side = 1, int out = 0) |
20 | //void SetLGType(int in = 1, int side = 1, int out = 0) |
19 | //{detector->SetLGType(in, side, out);} |
21 | //{detector->SetLGType(in, side, out);} |
20 | 22 | ||
21 | void |
23 | void setLG(double SiPM0 = 3.0, double b0 = 5.0, double d0 = 3.0, double n1 = 1.0, double n2 = 1.53, double n3 = 1.46) |
22 | { parameters.setGuide(SiPM0, b0, |
24 | { parameters.setGuide(SiPM0, b0, d0); |
- | 25 | parameters.setIndices(n1, n2, n3); } |
|
23 | 26 | ||
24 | void |
27 | void setGap(double x_gap0 = 0.3, double y_gap0 = 0.0, double z_gap0 = 0.0) |
25 | { parameters.setGap(x_gap0, y_gap0, z_gap0); } |
28 | { parameters.setGap(x_gap0, y_gap0, z_gap0); } |
26 | 29 | ||
27 | void |
30 | void setGlass(double glassOn, double glassD) |
28 | { parameters.setGlass(glassOn, glassD); }; |
31 | { parameters.setGlass(glassOn, glassD); }; |
29 | 32 | ||
30 | void |
33 | void setPlate(int plateOn = 1, double plateWidth = 1) |
31 | { parameters.setPlate(plateOn, plateWidth); } |
34 | { parameters.setPlate(plateOn, plateWidth); } |
32 | 35 | ||
33 | void |
36 | void setFresnel(int fresnel = 1) { parameters.setFresnel(fresnel); } |
- | 37 | ||
- | 38 | // Refractive Indices |
|
- | 39 | // n1 - around light guide - air |
|
- | 40 | // n2 - light guide (plate) material - k9 glass |
|
- | 41 | // n3 - the material at the exit - optical grease, epoxy, air, etc. |
|
- | 42 | void setIndices(double n1, double n2, double n3) {parameters.setIndices(n1, n2, n3);} |
|
34 | 43 | ||
35 | int save_ary = 0; |
44 | int save_ary = 0; |
36 | //------------------------------------------------------------------------------------------ |
45 | //------------------------------------------------------------------------------------------ |
37 | void Help() |
46 | void Help() |
38 | { |
47 | { |
Line 105... | Line 114... | ||
105 | 114 | ||
106 | TVector3 p_pol0(0.0, 0.0, 1.0); |
115 | TVector3 p_pol0(0.0, 0.0, 1.0); |
107 | void SetPol(double x, double y, double z) |
116 | void SetPol(double x, double y, double z) |
108 | {p_pol0.SetXYZ(x,y,z);} |
117 | {p_pol0.SetXYZ(x,y,z);} |
109 | 118 | ||
- | 119 | // Test function |
|
- | 120 | // creates an optical boundary surface |
|
- | 121 | // shows the propagation of light ray |
|
- | 122 | // and polarization state of the incident ray (green) |
|
- | 123 | // and surface normal (blue) |
|
110 | void PolTest(double theta = 0.0) |
124 | void PolTest(double theta = 0.0) |
111 | { |
125 | { |
112 | int p_type = 1; |
126 | int p_type = 1; |
113 | double p_n1 = |
127 | double p_n1 = parameters.getN1(); |
114 | double p_n2 = |
128 | double p_n2 = parameters.getN2(); |
115 | theta = 3.141593*theta/180.0; if(theta < 1e-6) theta = 1e-6; |
129 | theta = 3.141593*theta/180.0; if(theta < 1e-6) theta = 1e-6; |
116 | TVector3 p_pol; |
130 | TVector3 p_pol; |
117 | 131 | ||
118 | Init(); |
132 | Init(); |
119 | 133 | ||
Line 128... | Line 142... | ||
128 | #define SURF_REFLE 2 |
142 | #define SURF_REFLE 2 |
129 | #define SURF_TOTAL 3 |
143 | #define SURF_TOTAL 3 |
130 | #define SURF_IMPER 4 |
144 | #define SURF_IMPER 4 |
131 | */ |
145 | */ |
132 | CSurface *surf = new CSurface(p_type, vodnik_edge, p_n1, p_n2, 0.96); //surf->FlipN(); |
146 | CSurface *surf = new CSurface(p_type, vodnik_edge, p_n1, p_n2, 0.96); //surf->FlipN(); |
133 | surf->SetFresnel( |
147 | surf->SetFresnel(1); |
134 | surf->Draw(); |
148 | surf->Draw(); |
135 | 149 | ||
136 | CRay *ray = new CRay(cx, 0.0, 0.0, TMath::Cos(theta), 0.0, TMath::Sin(theta)); |
150 | CRay *ray = new CRay(cx, 0.0, 0.0, TMath::Cos(theta), 0.0, TMath::Sin(theta)); |
137 | ray->SetColor( |
151 | ray->SetColor(kBlack); |
138 | //p_pol = rotatey(p_pol0, -theta); |
152 | //p_pol = rotatey(p_pol0, -theta); |
139 | p_pol = p_pol0; p_pol.RotateY(-theta); |
153 | p_pol = p_pol0; p_pol.RotateY(-theta); |
140 | //printf("p_pol = "); printv(p_pol); |
154 | //printf("p_pol = "); printv(p_pol); |
141 | ray->SetPolarization(p_pol); |
155 | ray->SetPolarization(p_pol); |
142 | 156 | ||
143 | ray->DrawS(cx, -5.0); |
157 | ray->DrawS(cx, -5.0); |
144 | 158 | ||
145 | CRay *out = new CRay; out->SetColor( |
159 | CRay *out = new CRay; out->SetColor(kRed); |
146 | TVector3 *inters = new TVector3; |
160 | TVector3 *inters = new TVector3; |
147 |
|
161 | surf->PropagateRay(*ray, out, inters); |
148 |
|
162 | //if(fate == 1) out->DrawS(cx, 5.0); |
- | 163 | out->DrawS(cx, 5.0); |
|
149 | 164 | ||
- | 165 | CRay *incidentPolarization = new CRay; |
|
150 |
|
166 | incidentPolarization->SetColor(kGreen); |
151 |
|
167 | incidentPolarization->Set(ray->GetR(), p_pol); |
152 |
|
168 | incidentPolarization->DrawS(cx, 1.0); |
153 | 169 | ||
- | 170 | CRay *surfaceNormal = new CRay; |
|
154 |
|
171 | surfaceNormal->SetColor(kBlue); |
155 |
|
172 | surfaceNormal->Set(ray->GetR(), surf->GetN()); |
156 |
|
173 | surfaceNormal->DrawS(cx, 1.0); |
157 | } |
174 | } |
158 | 175 | ||
159 | void ptt() |
176 | void ptt() |
160 | { |
177 | { |
161 | for(double th = 0.0; th < 91.0; th += 5.0) { |
178 | for(double th = 0.0; th < 91.0; th += 5.0) { |
Line 190... | Line 207... | ||
190 | // Propagate NN rays genarated under the same angle theta, phi with random spacing and statistics |
207 | // Propagate NN rays genarated under the same angle theta, phi with random spacing and statistics |
191 | void LGR(int NN = 1e4, double theta = 0.0, double phi = 0.0) |
208 | void LGR(int NN = 1e4, double theta = 0.0, double phi = 0.0) |
192 | { |
209 | { |
193 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
210 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
194 | Init(); |
211 | Init(); |
195 | double izkoristek = RandYZ(detector, parameters, NN, theta, |
212 | double izkoristek = RandYZ(detector, parameters, NN, theta, phi, 30); |
196 | //printf("izkoristek = %.3lf\n", izkoristek); |
213 | //printf("izkoristek = %.3lf\n", izkoristek); |
197 | PrintGuideHead(); PrintGuideStat(izkoristek); |
214 | PrintGuideHead(); PrintGuideStat(izkoristek); |
198 | DrawData(detector, parameters, theta, izkoristek); |
215 | DrawData(detector, parameters, theta, izkoristek); |
199 | } |
216 | } |
200 | //------------------------------------------------------------------------------------------ |
217 | //------------------------------------------------------------------------------------------ |
Line 202... | Line 219... | ||
202 | void LGI(int NN = 1e4, double theta = 30.0, int nnrays = 30, int showr = 0) |
219 | void LGI(int NN = 1e4, double theta = 30.0, int nnrays = 30, int showr = 0) |
203 | { |
220 | { |
204 | Init(); |
221 | Init(); |
205 | CDetector *detector = new CDetector(CENTER, parameters); |
222 | CDetector *detector = new CDetector(CENTER, parameters); |
206 | //CDetector detector = new CDetector(); |
223 | //CDetector detector = new CDetector(); |
207 | double izkoristek = RandIso(detector, parameters, NN, theta, nnrays, showr); |
224 | double izkoristek = RandIso(detector, parameters, NN, 0.0, theta, nnrays, showr); |
208 | //printf("izkoristek = %.3lf\n", izkoristek); |
225 | //printf("izkoristek = %.3lf\n", izkoristek); |
- | 226 | PrintGuideHead(); |
|
209 |
|
227 | PrintGuideStat(izkoristek); |
210 | DrawData(detector, parameters, theta, izkoristek); |
228 | DrawData(detector, parameters, theta, izkoristek); |
211 | //TCanvas *canvasDetector = new TCanvas("canvasDetector","canvasDetector",500,500); |
229 | //TCanvas *canvasDetector = new TCanvas("canvasDetector","canvasDetector",500,500); |
212 | //canvasDetector->cd(); |
230 | //canvasDetector->cd(); |
213 | //detector->Draw(); |
231 | //detector->Draw(); |
214 | } |
232 | } |
215 | 233 | ||
- | 234 | void LGB(int NN = 1e4, double phiMin=-19.4, double phiMax=19.4, int nnrays = 30, int showr = 0) |
|
- | 235 | { |
|
- | 236 | Init(); |
|
- | 237 | CDetector *detector = new CDetector(CENTER, parameters); |
|
- | 238 | //CDetector detector = new CDetector(); |
|
- | 239 | double izkoristek = beamtest(detector, parameters, NN, 18.5, phiMin, phiMax, nnrays, showr); |
|
- | 240 | //printf("izkoristek = %.3lf\n", izkoristek); |
|
- | 241 | PrintGuideHead(); |
|
- | 242 | PrintGuideStat(izkoristek); |
|
- | 243 | DrawData(detector, parameters, 18.5, izkoristek); |
|
- | 244 | //TCanvas *canvasDetector = new TCanvas("canvasDetector","canvasDetector",500,500); |
|
- | 245 | //canvasDetector->cd(); |
|
- | 246 | //detector->Draw(); |
|
- | 247 | } |
|
216 | 248 | ||
217 | 249 | ||
218 | //------------------------------------------------------------------------------------------ |
250 | //------------------------------------------------------------------------------------------ |
219 | void LGI_gap(int NN = 1e4, double min = 0.0, double max = 2.0, const int steps = 10, double theta = 30.0) |
251 | void LGI_gap(int NN = 1e4, double min = 0.0, double max = 2.0, const int steps = 10, double theta = 30.0) |
220 | { |
252 | { |
221 | int tmp3d = show_3d, tmpdata = show_data; |
253 | int tmp3d = show_3d, tmpdata = show_data; |
222 | double step[steps], acc[steps]; |
254 | double step[steps], acc[steps]; |
223 | 255 | ||
224 | show_3d = 0; show_data = 0; |
256 | show_3d = 0; show_data = 0; |
225 | 257 | ||
226 | //printf(" x_gap | acceptance \n"); |
258 | //printf(" x_gap | acceptance \n"); |
227 | PrintGuideHead(); |
259 | PrintGuideHead(); |
228 | for(int i=0; i<=steps; i++) { |
260 | for(int i=0; i<=steps; i++) { |
229 | step[i] = min + i*(max - min)/(double)steps; |
261 | step[i] = min + i*(max - min)/(double)steps; |
230 | parameters.setGap(step[i], 0.0, 0.0); |
262 | parameters.setGap(step[i], 0.0, 0.0); |
231 | CDetector *detector = new CDetector(CENTER, parameters); |
263 | CDetector *detector = new CDetector(CENTER, parameters); |
232 | Init(); |
264 | Init(); |
233 | acc[i] = RandIso(detector, parameters, NN, theta); |
265 | acc[i] = RandIso(detector, parameters, NN, 0, theta); |
234 | //printf("%6.2lf |%6.1lf\n", step[i], acc[i]*100.0); |
266 | //printf("%6.2lf |%6.1lf\n", step[i], acc[i]*100.0); |
235 | PrintGuideStat(acc[i]); |
267 | PrintGuideStat(acc[i]); |
236 | } |
268 | } |
237 | 269 | ||
238 | //char sbuff[256]; |
270 | //char sbuff[256]; |
239 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
271 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
240 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
272 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
241 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
273 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
242 | 274 | ||
243 | DrawAcc(steps+1, step, acc, (char*)"; x_gap;Acceptance", min, max); |
275 | DrawAcc(steps+1, step, acc, (char*)"; x_gap;Acceptance", min, max); |
244 | 276 | ||
245 | show_3d = tmp3d; show_data = tmpdata; |
277 | show_3d = tmp3d; show_data = tmpdata; |
246 | } |
278 | } |
247 | //------------------------------------------------------------------------------------------ |
279 | //------------------------------------------------------------------------------------------ |
- | 280 | ||
- | 281 | void LGR_th(int NN = 1e4, double min = 0.0, double max = 30.0, const int steps = 15, double phi = 0) |
|
- | 282 | { |
|
- | 283 | //int tmp3d = show_3d, tmpdata = show_data; |
|
- | 284 | double show_rays = 10; |
|
- | 285 | double step[steps], acc[steps]; |
|
- | 286 | ||
- | 287 | //show_3d = 0; show_data = 0; |
|
- | 288 | ||
- | 289 | //printf(" theta | acceptance \n"); |
|
- | 290 | PrintGuideHead(); |
|
- | 291 | for(int i=0; i<=steps; i++) { |
|
- | 292 | Init(); |
|
- | 293 | step[i] = min + i*(max - min)/(double)steps; |
|
- | 294 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
|
- | 295 | acc[i] = RandYZ(detector, parameters, NN, step[i], phi, show_rays); |
|
- | 296 | //printf("%6.1lf |%6.1lf\n", step[i], acc[i]*100.0); |
|
- | 297 | PrintGuideStat(acc[i]); |
|
- | 298 | delete detector; |
|
- | 299 | } |
|
- | 300 | ||
- | 301 | //char sbuff[256]; |
|
- | 302 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap = (%.1lf, %.1lf, %.1lf)", |
|
- | 303 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
|
- | 304 | // (detector->GetVGap()).x(), (detector->GetVGap()).y(), (detector->GetVGap()).z()); |
|
- | 305 | ||
- | 306 | DrawAcc(steps+1, step, acc, (char*)"; #theta [deg];Acceptance", min, max); |
|
- | 307 | ||
- | 308 | //show_3d = tmp3d; show_data = tmpdata; |
|
- | 309 | } |
|
- | 310 | ||
248 | 311 | ||
249 | //------------------------------------------------------------------------------------------ |
312 | //------------------------------------------------------------------------------------------ |
250 |
|
313 | //void LGR_th(int NN = 1e4, double min = 0.0, double max = 30.0, const int steps = 15, double phi = 0) |
- | 314 | void LGI_th(int NN = 1e4, double min = 0.0, double max = 30.0, const int steps = 15) |
|
251 | { |
315 | { |
252 |
|
316 | //int tmp3d = show_3d, tmpdata = show_data; |
253 | double step[steps], acc[steps]; |
317 | double step[steps], acc[steps]; |
254 | 318 | ||
255 | show_3d |
319 | //show_3d = 0; show_data = 0; |
256 | 320 | ||
257 | //printf(" theta | acceptance \n"); |
321 | //printf(" theta | acceptance \n"); |
258 | PrintGuideHead(); |
322 | PrintGuideHead(); |
259 | for(int i=0; i<=steps; i++) { |
323 | for(int i=0; i<=steps; i++) { |
260 | Init(); |
324 | Init(); |
261 | step[i] = min + i*(max - min)/(double)steps; |
325 | step[i] = min + i*(max - min)/(double)steps; |
262 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
326 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
263 | acc |
327 | //acc[i] = RandYZ(detector, parameters, NN, step[i], phi, 30); |
- | 328 | acc[i] = RandIso(detector, parameters, NN, 0, step[i], 30, show_3d); |
|
264 | //printf("%6.1lf |%6.1lf\n", step[i], acc[i]*100.0); |
329 | //printf("%6.1lf |%6.1lf\n", step[i], acc[i]*100.0); |
265 | PrintGuideStat(acc[i]); |
330 | PrintGuideStat(acc[i]); |
266 |
|
331 | delete detector; |
267 | } |
332 | } |
268 | 333 | ||
269 | //char sbuff[256]; |
334 | //char sbuff[256]; |
270 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap = (%.1lf, %.1lf, %.1lf)", |
335 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap = (%.1lf, %.1lf, %.1lf)", |
271 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
336 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
272 | // (detector->GetVGap()).x(), (detector->GetVGap()).y(), (detector->GetVGap()).z()); |
337 | // (detector->GetVGap()).x(), (detector->GetVGap()).y(), (detector->GetVGap()).z()); |
273 | 338 | ||
274 | DrawAcc(steps+1, step, acc, (char*)"; #theta [deg];Acceptance", min, max); |
339 | DrawAcc(steps+1, step, acc, (char*)"; #theta [deg];Acceptance", min, max); |
275 | 340 | ||
276 | show_3d |
341 | //show_3d = tmp3d; show_data = tmpdata; |
277 | } |
342 | } |
278 | //------------------------------------------------------------------------------------------ |
343 | //------------------------------------------------------------------------------------------ |
- | 344 | ||
- | 345 | void LGR_phi(int NN = 1e4, double maxTheta = 10.0, double maxPhi = 10.0, int steps = 10) |
|
- | 346 | { |
|
- | 347 | int tmp3d = show_3d, tmpdata = show_data; |
|
- | 348 | show_3d = 1; show_data = 0; |
|
- | 349 | //PrintGuideHead(); |
|
- | 350 | TH2F *hAcceptance = new TH2F("hAcceptance","Acceptance;#theta;#phi", steps, 0, maxTheta, steps, 0, maxPhi); |
|
- | 351 | double min = 0.0; |
|
- | 352 | printf("\nWait, this takes a while "); |
|
- | 353 | for(int i=0; i<=steps; i++) { |
|
- | 354 | double theta = min + i*(maxTheta - min) / (double)steps; |
|
- | 355 | for (int j=0; j<=steps; j++) { |
|
- | 356 | Init(); |
|
- | 357 | double phi = min + j*(maxPhi - min) / (double)steps; |
|
- | 358 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
|
- | 359 | double acc = RandYZ(detector, parameters, NN, theta, phi, 30); |
|
- | 360 | //PrintGuideStat(acc); |
|
- | 361 | hAcceptance->Fill(i, j, acc); |
|
- | 362 | //printf("Acc: %f ", acc); |
|
- | 363 | delete detector; |
|
- | 364 | } |
|
- | 365 | printf("."); |
|
- | 366 | } |
|
- | 367 | printf("\n"); |
|
- | 368 | //DrawAcc(steps+1, step, acc, (char*)"; #theta [deg];Acceptance", min, max); |
|
- | 369 | show_3d = tmp3d; show_data = tmpdata; |
|
- | 370 | TCanvas *cp = new TCanvas("Acceptance", "Acceptance", 0, 0, 1000, 1000); |
|
- | 371 | cp->cd(); |
|
- | 372 | hAcceptance->Draw("COLZ"); |
|
- | 373 | } |
|
279 | 374 | ||
280 | // a vs. d |
375 | // a vs. d |
281 | void LGI_ad(int NN = 1e4, double min = 2.5, double max = 3.5, double minD = 1, double maxD = 6, const int steps = 10, double theta = 30.0) |
376 | void LGI_ad(int NN = 1e4, double min = 2.5, double max = 3.5, double minD = 1, double maxD = 6, const int steps = 10, double theta = 30.0) |
282 | { |
377 | { |
283 | int tmp3d = show_3d; |
- | |
284 | int tmpdata = show_data; |
- | |
285 | //char sbuff[256]; |
378 | //char sbuff[256]; |
286 | 379 | ||
287 | show_3d |
380 | //show_3d = 0; // don't show simulations |
288 | show_data |
381 | //show_data = 1; |
289 | 382 | ||
290 | //double d = detector->GetD(); |
383 | //double d = detector->GetD(); |
291 | const double b = parameters.getB(); // upper side of LG |
384 | const double b = parameters.getB(); // upper side of LG |
292 | //const double SiPM = 3.0; // the length of the detector itself |
385 | //const double SiPM = 3.0; // the length of the detector itself |
293 | //double reflectivity = detector->guide->getR(); |
386 | //double reflectivity = detector->guide->getR(); |
294 | 387 | ||
295 | TH2F *hAcceptance = new TH2F("hAcceptance","Acceptance",steps-1,minD,maxD,steps-1,min,max); |
388 | TH2F *hAcceptance = new TH2F("hAcceptance","Acceptance",steps-1,minD,maxD,steps-1,min,max); |
296 | 389 | ||
297 | // Use the Fresnel eq. instead of fixed reflectivity 96% |
390 | // Use the Fresnel eq. instead of fixed reflectivity 96% |
298 | //detector->SetFresnel(1); |
391 | //detector->SetFresnel(1); |
299 | 392 | ||
300 |
|
393 | //printf(" d | a | Acceptance\n"); |
- | 394 | getParameters(); |
|
- | 395 | printf("Wait, this takes a while "); |
|
301 | for(int i=0; i<steps; i++) { |
396 | for(int i=0; i<steps; i++) { |
302 | const double d = hAcceptance->GetXaxis()->GetBinCenter(i); |
397 | const double d = hAcceptance->GetXaxis()->GetBinCenter(i); |
303 | for(int j=0; j<steps; j++) { |
398 | for(int j=0; j<steps; j++) { |
- | 399 | Init(); |
|
304 | const double a = hAcceptance->GetYaxis()->GetBinCenter(j); |
400 | const double a = hAcceptance->GetYaxis()->GetBinCenter(j); |
305 |
|
401 | //const double M = b/a; |
306 | parameters.setGuide(a, |
402 | parameters.setGuide(a, b, d); |
307 | CDetector *detector = new CDetector(CENTER, parameters); |
403 | CDetector *detector = new CDetector(CENTER, parameters); |
308 | //detector->guide->setLG(y, M, x); |
404 | //detector->guide->setLG(y, M, x); |
309 | //Init(); exclude simulation |
405 | //Init(); exclude simulation |
310 | double acceptance = RandIso(detector, parameters, NN, |
406 | double acceptance = RandIso(detector, parameters, NN, 0, theta, 30, show_3d); |
311 | //double acceptance = Grid(NN, theta); |
407 | //double acceptance = Grid(NN, theta); |
312 | //double acceptance = -1.0; |
408 | //double acceptance = -1.0; |
313 | hAcceptance->Fill(d, a, acceptance); |
409 | hAcceptance->Fill(d, a, acceptance); |
314 | //printf("%.2lf | %.2lf | ", |
410 | //printf("%.2lf | %.2lf | ", d, a); |
315 | //PrintGuideStat( |
411 | //PrintGuideStat(acceptance); |
316 | delete detector; //works fine, 50x50 grid takes ~4MB of RAM |
412 | delete detector; //works fine, 50x50 grid takes ~4MB of RAM |
317 | } |
413 | } |
- | 414 | printf("."); |
|
318 | } |
415 | } |
- | 416 | printf("\n"); |
|
319 | 417 | ||
320 | 418 | ||
321 | 419 | ||
322 | TCanvas *cp = new TCanvas("Acceptance", "Acceptance", 0, 0, |
420 | TCanvas *cp = new TCanvas("Acceptance", "Acceptance", 0, 0, 1200, 1200); |
- | 421 | cp->cd(); |
|
323 | TVirtualPad |
422 | //TVirtualPad *pacc = cp->cd(0); |
324 | 423 | ||
- | 424 | /* |
|
325 | pacc->SetRightMargin(0.10); |
425 | pacc->SetRightMargin(0.10); |
326 | pacc->SetLeftMargin(0.10); |
426 | pacc->SetLeftMargin(0.10); |
327 | pacc->SetTopMargin(0.10); |
427 | pacc->SetTopMargin(0.10); |
- | 428 | pacc->SetBottomMargin(0.10); |
|
- | 429 | */ |
|
328 | 430 | ||
329 | TFile *file = new TFile("acceptance.root","RECREATE"); |
431 | TFile *file = new TFile("acceptance.root","RECREATE"); |
330 | hAcceptance->Write(); |
432 | hAcceptance->Write(); |
331 | file->Close(); |
433 | file->Close(); |
332 | //delete file; |
434 | //delete file; |
Line 334... | Line 436... | ||
334 | //hAcceptance->SetContour(100); |
436 | //hAcceptance->SetContour(100); |
335 | //gStyle->SetPalette(1,0); |
437 | //gStyle->SetPalette(1,0); |
336 | hAcceptance->SetTitle(";d [mm];a [mm]"); |
438 | hAcceptance->SetTitle(";d [mm];a [mm]"); |
337 | hAcceptance->GetXaxis()->SetRangeUser(minD,maxD); |
439 | hAcceptance->GetXaxis()->SetRangeUser(minD,maxD); |
338 | hAcceptance->Draw("COLZ"); |
440 | hAcceptance->Draw("COLZ"); |
- | 441 | char filename[128]; |
|
- | 442 | sprintf(filename,"LGI_ad%d.C", steps); |
|
- | 443 | cp->SaveAs(filename); |
|
339 | 444 | ||
340 | show_3d = tmp3d; show_data = tmpdata; |
- | |
341 | } |
445 | } |
342 | 446 | ||
343 | //------------------------------------------------------------------------------------------ |
447 | //------------------------------------------------------------------------------------------ |
344 | // collection efficiency vs length |
448 | // collection efficiency vs length |
345 | // a changes, b rests the same, d changes |
449 | // a changes, b rests the same, d changes |
Line 362... | Line 466... | ||
362 | 466 | ||
363 | PrintGuideHead(); |
467 | PrintGuideHead(); |
364 | for(int i=0; i<=steps; i++) { |
468 | for(int i=0; i<=steps; i++) { |
365 | step[i] = min + i*(max - min)/(double)steps; |
469 | step[i] = min + i*(max - min)/(double)steps; |
366 | sipm_d = M0 - 2.0*step[i]*0.199819;//tan 11.3 deg |
470 | sipm_d = M0 - 2.0*step[i]*0.199819;//tan 11.3 deg |
367 | parameters.setGuide(sipm_d, M0 |
471 | parameters.setGuide(sipm_d, M0*sipm_d, step[i]); |
368 | //printf("sipm = %lf, M = %lf, d = %lf\n", detector->GetSiPM(), detector->GetM(), step[i]); |
472 | //printf("sipm = %lf, M = %lf, d = %lf\n", detector->GetSiPM(), detector->GetM(), step[i]); |
369 | printf("%.1lf | %.2lf | ", step[i], sipm_d); |
473 | printf("%.1lf | %.2lf | ", step[i], sipm_d); |
370 | Init(); |
474 | Init(); |
371 | acc[i] = RandIso(detector, parameters, NN, theta); |
475 | acc[i] = RandIso(detector, parameters, NN, 0, theta); |
372 | PrintGuideStat(acc[i]); |
476 | PrintGuideStat(acc[i]); |
373 | sprintf(sbuff, "d%2d.gif", i); |
477 | sprintf(sbuff, "d%2d.gif", i); |
374 | //c3dview->SaveAs(sbuff); |
478 | //c3dview->SaveAs(sbuff); |
375 | } |
479 | } |
376 | 480 | ||
377 | 481 | ||
378 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
482 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
379 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
483 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
380 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
484 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
381 | 485 | ||
382 | //DrawAcc(steps+1, step, acc, sbuff, (char*)"; d;Acceptance", min, max); |
486 | //DrawAcc(steps+1, step, acc, sbuff, (char*)"; d;Acceptance", min, max); |
383 | 487 | ||
384 | TCanvas *cp = new TCanvas("Acceptance", "Acceptance", 0, 0, 640, 480); |
488 | TCanvas *cp = new TCanvas("Acceptance", "Acceptance", 0, 0, 640, 480); |
385 | TVirtualPad *pacc = cp->cd(0); |
489 | TVirtualPad *pacc = cp->cd(0); |
386 | 490 | ||
387 | pacc->SetRightMargin(0.05); |
491 | pacc->SetRightMargin(0.05); |
388 | pacc->SetLeftMargin(0.13); |
492 | pacc->SetLeftMargin(0.13); |
Line 416... | Line 520... | ||
416 | // Use Fresnel equations |
520 | // Use Fresnel equations |
417 | //detector->SetFresnel(1); |
521 | //detector->SetFresnel(1); |
418 | 522 | ||
419 | // Set glass (n=1.5) at the exit |
523 | // Set glass (n=1.5) at the exit |
420 | //detector->SetGlass(1,0); |
524 | //detector->SetGlass(1,0); |
421 | 525 | ||
422 | PrintGuideHead(); |
526 | PrintGuideHead(); |
423 | for(int i=0; i<=steps; i++) { |
527 | for(int i=0; i<=steps; i++) { |
424 | step[i] = min + i*(max - min)/(double)steps; |
528 | step[i] = min + i*(max - min)/(double)steps; |
- | 529 | //parameters.setGuide(a, magnif, step[i]); |
|
425 | parameters.setGuide(a, magnif, step[i]); |
530 | parameters.setGuide(a, magnif, step[i]); |
426 | CDetector *detector = new CDetector(CENTER, parameters); |
531 | CDetector *detector = new CDetector(CENTER, parameters); |
427 | //printf("sipm = %lf, M = %lf, d = %lf\n", detector->GetSiPM(), detector->GetM(), step[i]); |
532 | //printf("sipm = %lf, M = %lf, d = %lf\n", detector->GetSiPM(), detector->GetM(), step[i]); |
428 | printf("%.1lf | ", step[i]); |
533 | printf("%.1lf | ", step[i]); |
429 | Init(); |
534 | Init(); |
430 | acc[i] = RandIso(detector, parameters, NN, theta); |
535 | acc[i] = RandIso(detector, parameters, NN, 0, theta); |
431 | PrintGuideStat(acc[i]); |
536 | PrintGuideStat(acc[i]); |
432 | delete detector; |
537 | delete detector; |
433 | } |
538 | } |
434 | 539 | ||
435 | //char sbuff[256]; |
540 | //char sbuff[256]; |
436 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
541 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
437 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
542 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
438 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
543 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
439 | 544 | ||
440 | DrawAcc(steps+1, step, acc, (char*)"; d [mm];Acceptance", min, max); |
545 | DrawAcc(steps+1, step, acc, (char*)"; d [mm];Acceptance", min, max); |
441 | 546 | ||
442 | show_3d = tmp3d; show_data = tmpdata; |
547 | show_3d = tmp3d; show_data = tmpdata; |
443 | } |
548 | } |
444 | //------------------------------------------------------------------------------------------ |
549 | //------------------------------------------------------------------------------------------ |
445 | // Magnification optimization. a and d are fixed, M and b change in steps |
550 | // Magnification optimization. a and d are fixed, M and b change in steps |
446 | void LGI_M(int NN = 1e4, double min = 1.0, double max = 3.0, const int steps = 30, double theta = 30.0) |
551 | void LGI_M(int NN = 1e4, double min = 1.0, double max = 3.0, const int steps = 30, double theta = 30.0) |
447 | { |
552 | { |
448 | int tmp3d = show_3d, tmpdata = show_data; |
553 | int tmp3d = show_3d, tmpdata = show_data; |
449 | double step[steps], acc[steps]; |
554 | double step[steps], acc[steps]; |
450 | 555 | ||
451 | const double a = parameters.getA(); |
556 | const double a = parameters.getA(); |
452 | const double d = parameters.getD(); |
557 | const double d = parameters.getD(); |
453 | 558 | ||
454 | show_3d = 0; show_data = 0; |
559 | show_3d = 0; show_data = 0; |
455 | 560 | ||
456 | PrintGuideHead(); |
561 | PrintGuideHead(); |
457 | for(int i=0; i<=steps; i++) { |
562 | for(int i=0; i<=steps; i++) { |
458 | step[i] = min + i*(max - min)/(double)steps; |
563 | step[i] = min + i*(max - min)/(double)steps; |
- | 564 | //parameters.setGuide(a, step[i], d); |
|
459 | parameters.setGuide(a, step[i], d); |
565 | parameters.setGuide(a, a*step[i], d); |
460 | CDetector *detector = new CDetector(CENTER, parameters); |
566 | CDetector *detector = new CDetector(CENTER, parameters); |
461 | Init(); |
567 | Init(); |
462 | acc[i] = RandIso(detector, parameters, NN, theta); |
568 | acc[i] = RandIso(detector, parameters, NN, 0, theta); |
463 | PrintGuideStat(acc[i]); |
569 | PrintGuideStat(acc[i]); |
464 | } |
570 | } |
465 | 571 | ||
466 | //char sbuff[256]; |
572 | //char sbuff[256]; |
467 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
573 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
468 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
574 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
469 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
575 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
470 | 576 | ||
471 | DrawAcc(steps+1, step, acc, (char*)"; M;Acceptance", min, max); |
577 | DrawAcc(steps+1, step, acc, (char*)"; M;Acceptance", min, max); |
472 | 578 | ||
473 | show_3d = tmp3d; show_data = tmpdata; |
579 | show_3d = tmp3d; show_data = tmpdata; |
474 | } |
580 | } |
- | 581 | ||
475 | //------------------------------------------------------------------------------------------ |
582 | //------------------------------------------------------------------------------------------ |
476 | 583 | ||
- | 584 | void getParameters() |
|
- | 585 | { |
|
- | 586 | printf("LIGHT GUIDE\n" |
|
- | 587 | " b=%f mm, d=%f mm, a=%f mm\n", parameters.getB(), parameters.getD(), parameters.getA()); |
|
- | 588 | printf("MATERIAL REFRACITVE INDICES\n" |
|
- | 589 | " n1=%f, n2=%f, n3=%f\n", parameters.getN1(), parameters.getN2(), parameters.getN3()); |
|
- | 590 | printf("PLATE\n" |
|
- | 591 | " ON: %d, width=%f mm\nUSES FRESNEL EQUATIONS: %d\n", parameters.getPlateOn(), parameters.getPlateWidth(), parameters.getFresnel()); |
|
- | 592 | return; |
|
- | 593 | } |
|
- | 594 |