Rev 25 | Rev 70 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
25 | f9daq | 1 | #include "include/guide.h" |
2 | #include "src/raySimulator.cpp" |
||
3 | |||
4 | #include "TFile.h" |
||
5 | #include "TPolyMarker3D.h" |
||
6 | #include "TCanvas.h" |
||
7 | |||
8 | //extern int show_3d; |
||
9 | //extern int show_data; |
||
10 | |||
11 | // Set the simulation parameters |
||
12 | void Show3D(int b) {show_3d = b;} |
||
13 | void ShowData(int b) {show_data = b;} |
||
14 | |||
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.52, TVector3(0.3, 0, 0)); |
||
17 | |||
18 | //void SetLGType(int in = 1, int side = 1, int out = 0) |
||
19 | //{detector->SetLGType(in, side, out);} |
||
20 | |||
21 | void SetLG(double SiPM0 = 3.0, double b0 = 5.0, double d0 = 3.0, double n10 = 1.0, double n20 = 1.53, double n30 = 1.52) |
||
22 | { parameters.setGuide(SiPM0, b0, d0, n10, n20, n30); } |
||
23 | |||
24 | 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); } |
||
26 | |||
27 | void SetGlass(double glassOn, double glassD) |
||
28 | { parameters.setGlass(glassOn, glassD); }; |
||
29 | |||
30 | void SetPlate(int plateOn = 1, double plateWidth = 1) |
||
31 | { parameters.setPlate(plateOn, plateWidth); } |
||
32 | |||
33 | void SetFresnel(int fresnel = 1) { parameters.setFresnel(fresnel); } |
||
34 | |||
35 | int save_ary = 0; |
||
36 | //------------------------------------------------------------------------------------------ |
||
37 | void Help() |
||
38 | { |
||
39 | printf("void SetCenter(x, y, z)\n"); |
||
40 | printf("void SetLGType(in, side, out)\n"); |
||
41 | printf("SURF_DUMMY 0, "); |
||
42 | printf("SURF_REFRA 1, "); |
||
43 | printf("SURF_REFLE 2, "); |
||
44 | printf("SURF_TOTAL 3, "); |
||
45 | printf("SURF_IMPER 4\n"); |
||
46 | printf("void SetLG(SiPM0, M0, d0, n10, n20, n30, R0)\n"); |
||
47 | printf("void SetR(R0)\n"); |
||
48 | printf("void SetGlass(glass_on0, glass_d0)\n"); |
||
49 | printf("void SetGap(x_gap0, y_gap0, z_gap0)\n"); |
||
50 | |||
51 | printf("LGG(NN, theta)\n"); |
||
52 | printf("LGR(NN, theta, phi)\n"); |
||
53 | printf("LGI(NN, theta)\n"); |
||
54 | |||
55 | printf("LGI_gap(NN, min, max, steps, theta)\n"); |
||
56 | printf("LGR_gap(NN, min, max, steps, theta, phi)\n"); |
||
57 | printf("LGR_th(NN, min, max, steps, phi)\n"); |
||
58 | printf("LGG_th(NN, min, max, steps)\n"); |
||
59 | |||
60 | printf("LGI_ad(NN, mina, maxa, mind, maxd, steps(memory dependent), theta)"); |
||
61 | } |
||
62 | //------------------------------------------------------------------------------------------ |
||
63 | int show_in_steps = 0; |
||
64 | void SetShowInSteps(int in = 1) |
||
65 | { |
||
66 | show_in_steps = in; |
||
67 | } |
||
68 | //------------------------------------------------------------------------------------------ |
||
69 | int gs_set = 0; |
||
70 | void SetGS() |
||
71 | { |
||
72 | const UInt_t Number = 2; |
||
73 | Double_t Red[Number] = { 1.00, 0.00}; |
||
74 | Double_t Green[Number] = { 1.00, 0.00}; |
||
75 | Double_t Blue[Number] = { 1.00, 0.00}; |
||
76 | Double_t Stops[Number] = { 0.00, 1.00}; |
||
77 | |||
78 | Int_t nb=50; |
||
79 | if(!gs_set) { |
||
80 | TColor::CreateGradientColorTable(Number,Stops,Red,Green,Blue,nb); |
||
81 | gs_set = 1; |
||
82 | } |
||
83 | } |
||
84 | //------------------------------------------------------------------------------------------ |
||
85 | void Draw1(CDetector *detector, int gs = 0, double range = 0.0) |
||
86 | { |
||
87 | if(gs) SetGS(); |
||
88 | TCanvas *cdata = new TCanvas("cdata", "2dscan", 350, 0, 500, 500); |
||
89 | gStyle->SetOptTitle(0); |
||
90 | gStyle->SetOptStat(0); |
||
91 | cdata->cd(0); |
||
92 | if(range > 0.1) { |
||
93 | ((detector->GetHLaser())->GetXaxis())->SetRangeUser(-range,range); |
||
94 | ((detector->GetHLaser())->GetYaxis())->SetRangeUser(-range,range); |
||
95 | } |
||
96 | (detector->GetHLaser())->SetTitle("Hits at LG entrance; x [mm]; y [mm]"); |
||
97 | (detector->GetHLaser())->Draw("COLZ"); |
||
98 | cdata->SaveAs("2dscan.gif"); |
||
99 | //gStyle->SetOptTitle(1); |
||
100 | //gStyle->SetOptStat(1); |
||
101 | } |
||
102 | |||
103 | //------------------------------------------------------------------------------------------ |
||
104 | |||
105 | |||
106 | TVector3 p_pol0(0.0, 0.0, 1.0); |
||
107 | void SetPol(double x, double y, double z) |
||
108 | {p_pol0.SetXYZ(x,y,z);} |
||
109 | |||
110 | void PolTest(double theta = 0.0) |
||
111 | { |
||
112 | int p_type = 1; |
||
113 | double p_n1 = 1.5; |
||
114 | double p_n2 = 1.0; |
||
115 | theta = 3.141593*theta/180.0; if(theta < 1e-6) theta = 1e-6; |
||
116 | TVector3 p_pol; |
||
117 | |||
118 | Init(); |
||
119 | |||
120 | double cx = 0.0; |
||
121 | TVector3 vodnik_edge[4]; |
||
122 | double t = 3.0; |
||
123 | vodnik_edge[0].SetXYZ(cx, t,-t); vodnik_edge[1].SetXYZ(cx, t, t); |
||
124 | vodnik_edge[2].SetXYZ(cx,-t, t); vodnik_edge[3].SetXYZ(cx,-t,-t); |
||
125 | /* |
||
126 | #define SURF_DUMMY 0 |
||
127 | #define SURF_REFRA 1 |
||
128 | #define SURF_REFLE 2 |
||
129 | #define SURF_TOTAL 3 |
||
130 | #define SURF_IMPER 4 |
||
131 | */ |
||
132 | CSurface *surf = new CSurface(p_type, vodnik_edge, p_n1, p_n2, 0.96); //surf->FlipN(); |
||
133 | surf->SetFresnel(0); |
||
134 | surf->Draw(); |
||
135 | |||
136 | CRay *ray = new CRay(cx, 0.0, 0.0, TMath::Cos(theta), 0.0, TMath::Sin(theta)); |
||
137 | ray->SetColor(1); |
||
138 | //p_pol = rotatey(p_pol0, -theta); |
||
139 | p_pol = p_pol0; p_pol.RotateY(-theta); |
||
140 | //printf("p_pol = "); printv(p_pol); |
||
141 | ray->SetPolarization(p_pol); |
||
142 | |||
143 | ray->DrawS(cx, -5.0); |
||
144 | |||
145 | CRay *out = new CRay; out->SetColor(2); |
||
146 | TVector3 *inters = new TVector3; |
||
147 | int fate = surf->PropagateRay(*ray, out, inters); |
||
148 | if(fate == 1) out->DrawS(cx, 5.0); |
||
149 | |||
150 | CRay *pp = new CRay; pp->SetColor(3); |
||
151 | pp->Set(ray->GetR(), p_pol); |
||
152 | pp->DrawS(cx, 2.0); |
||
153 | |||
154 | CRay *pn = new CRay; pn->SetColor(4); |
||
155 | pn->Set(ray->GetR(), surf->GetN()); |
||
156 | pn->DrawS(cx, 3.0); |
||
157 | } |
||
158 | |||
159 | void ptt() |
||
160 | { |
||
161 | for(double th = 0.0; th < 91.0; th += 5.0) { |
||
162 | printf("%lf ", th); |
||
163 | PolTest(th); |
||
164 | } |
||
165 | } |
||
166 | //------------------------------------------------------------------------------------------ |
||
167 | // Propagate single ray and show the statistics |
||
168 | void LGS(double xh = 0.0, double yh = 0.0, double zh = 0.0, double theta = 0.0, double phi = 0.0) |
||
169 | { |
||
170 | CDetector *detector = new CDetector(CENTER, parameters); |
||
171 | Init(); |
||
172 | double izkoristek = Single(detector, parameters, TVector3(xh,yh,zh),theta, phi); |
||
173 | PrintGuideHead(); |
||
54 | f9daq | 174 | PrintGuideStat(izkoristek); |
25 | f9daq | 175 | DrawData(detector, parameters, theta, izkoristek); |
176 | } |
||
177 | //------------------------------------------------------------------------------------------ |
||
178 | // Propagate NN rays generated as grid and show the statistics |
||
179 | void LGG(int NN = 10, double theta = 0.0) |
||
180 | { |
||
181 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
||
182 | Init(); |
||
183 | double izkoristek = Grid(detector, parameters, NN, theta); |
||
184 | //printf("izkoristek = %.3lf\n", izkoristek); |
||
185 | PrintGuideHead(); |
||
54 | f9daq | 186 | PrintGuideStat(izkoristek); |
25 | f9daq | 187 | DrawData(detector, parameters, theta, izkoristek); |
188 | } |
||
189 | //------------------------------------------------------------------------------------------ |
||
190 | // 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) |
||
192 | { |
||
193 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
||
194 | Init(); |
||
195 | double izkoristek = RandYZ(detector, parameters, NN, theta, phi); |
||
196 | //printf("izkoristek = %.3lf\n", izkoristek); |
||
54 | f9daq | 197 | PrintGuideHead(); PrintGuideStat(izkoristek); |
25 | f9daq | 198 | DrawData(detector, parameters, theta, izkoristek); |
199 | } |
||
200 | //------------------------------------------------------------------------------------------ |
||
201 | // Propagate NN rays isotropically generated in solid angle theta and show the statistics |
||
202 | void LGI(int NN = 1e4, double theta = 30.0, int nnrays = 30, int showr = 0) |
||
203 | { |
||
204 | Init(); |
||
205 | CDetector *detector = new CDetector(CENTER, parameters); |
||
206 | //CDetector detector = new CDetector(); |
||
207 | double izkoristek = RandIso(detector, parameters, NN, theta, nnrays, showr); |
||
208 | //printf("izkoristek = %.3lf\n", izkoristek); |
||
54 | f9daq | 209 | PrintGuideHead(); PrintGuideStat(izkoristek); |
25 | f9daq | 210 | DrawData(detector, parameters, theta, izkoristek); |
211 | //TCanvas *canvasDetector = new TCanvas("canvasDetector","canvasDetector",500,500); |
||
212 | //canvasDetector->cd(); |
||
213 | //detector->Draw(); |
||
214 | } |
||
215 | |||
216 | |||
217 | |||
218 | //------------------------------------------------------------------------------------------ |
||
219 | void LGI_gap(int NN = 1e4, double min = 0.0, double max = 2.0, const int steps = 10, double theta = 30.0) |
||
220 | { |
||
221 | int tmp3d = show_3d, tmpdata = show_data; |
||
222 | double step[steps], acc[steps]; |
||
223 | |||
224 | show_3d = 0; show_data = 0; |
||
225 | |||
226 | //printf(" x_gap | acceptance \n"); |
||
227 | PrintGuideHead(); |
||
228 | for(int i=0; i<=steps; i++) { |
||
229 | step[i] = min + i*(max - min)/(double)steps; |
||
230 | parameters.setGap(step[i], 0.0, 0.0); |
||
231 | CDetector *detector = new CDetector(CENTER, parameters); |
||
232 | Init(); |
||
233 | acc[i] = RandIso(detector, parameters, NN, theta); |
||
234 | //printf("%6.2lf |%6.1lf\n", step[i], acc[i]*100.0); |
||
54 | f9daq | 235 | PrintGuideStat(acc[i]); |
25 | f9daq | 236 | } |
237 | |||
238 | //char sbuff[256]; |
||
239 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
||
240 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
||
241 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
||
242 | |||
243 | DrawAcc(steps+1, step, acc, (char*)"; x_gap;Acceptance", min, max); |
||
244 | |||
245 | show_3d = tmp3d; show_data = tmpdata; |
||
246 | } |
||
247 | //------------------------------------------------------------------------------------------ |
||
248 | |||
249 | //------------------------------------------------------------------------------------------ |
||
250 | void LGR_th(int NN = 1e4, double min = 0.0, double max = 30.0, const int steps = 15, double phi = 5.0) |
||
251 | { |
||
252 | int tmp3d = show_3d, tmpdata = show_data; |
||
253 | double step[steps], acc[steps]; |
||
254 | |||
255 | show_3d = 0; show_data = 0; |
||
256 | |||
257 | //printf(" theta | acceptance \n"); |
||
258 | PrintGuideHead(); |
||
259 | for(int i=0; i<=steps; i++) { |
||
260 | Init(); |
||
261 | step[i] = min + i*(max - min)/(double)steps; |
||
262 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
||
263 | acc[i] = RandYZ(detector, parameters, NN, step[i], phi); |
||
264 | //printf("%6.1lf |%6.1lf\n", step[i], acc[i]*100.0); |
||
54 | f9daq | 265 | PrintGuideStat(acc[i]); |
266 | //delete detector; |
||
25 | f9daq | 267 | } |
268 | |||
269 | //char sbuff[256]; |
||
270 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap = (%.1lf, %.1lf, %.1lf)", |
||
271 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
||
272 | // (detector->GetVGap()).x(), (detector->GetVGap()).y(), (detector->GetVGap()).z()); |
||
273 | |||
274 | DrawAcc(steps+1, step, acc, (char*)"; #theta [deg];Acceptance", min, max); |
||
275 | |||
276 | show_3d = tmp3d; show_data = tmpdata; |
||
277 | } |
||
278 | //------------------------------------------------------------------------------------------ |
||
279 | |||
280 | // 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) |
||
282 | { |
||
283 | int tmp3d = show_3d; |
||
284 | int tmpdata = show_data; |
||
285 | //char sbuff[256]; |
||
286 | |||
287 | show_3d = 0; // don't show simulations |
||
288 | show_data = 1; |
||
289 | |||
290 | //double d = detector->GetD(); |
||
291 | const double b = parameters.getB(); // upper side of LG |
||
292 | //const double SiPM = 3.0; // the length of the detector itself |
||
293 | //double reflectivity = detector->guide->getR(); |
||
294 | |||
295 | TH2F *hAcceptance = new TH2F("hAcceptance","Acceptance",steps-1,minD,maxD,steps-1,min,max); |
||
296 | |||
297 | // Use the Fresnel eq. instead of fixed reflectivity 96% |
||
298 | //detector->SetFresnel(1); |
||
299 | |||
300 | printf(" d | a | Acceptance\n"); |
||
301 | for(int i=0; i<steps; i++) { |
||
302 | const double d = hAcceptance->GetXaxis()->GetBinCenter(i); |
||
303 | for(int j=0; j<steps; j++) { |
||
304 | const double a = hAcceptance->GetYaxis()->GetBinCenter(j); |
||
305 | const double M = b/a; |
||
306 | parameters.setGuide(a, M, d); |
||
307 | CDetector *detector = new CDetector(CENTER, parameters); |
||
308 | //detector->guide->setLG(y, M, x); |
||
309 | //Init(); exclude simulation |
||
310 | double acceptance = RandIso(detector, parameters, NN, theta, 0, 0); |
||
311 | //double acceptance = Grid(NN, theta); |
||
312 | //double acceptance = -1.0; |
||
313 | hAcceptance->Fill(d, a, acceptance); |
||
314 | //printf("%.2lf | %.2lf | ", x,y); |
||
54 | f9daq | 315 | //PrintGuideStat(izkoristek); |
316 | delete detector; //works fine, 50x50 grid takes ~4MB of RAM |
||
25 | f9daq | 317 | } |
318 | } |
||
319 | |||
320 | |||
321 | |||
322 | TCanvas *cp = new TCanvas("Acceptance", "Acceptance", 0, 0, 640, 480); |
||
323 | TVirtualPad *pacc = cp->cd(0); |
||
324 | |||
325 | pacc->SetRightMargin(0.10); |
||
326 | pacc->SetLeftMargin(0.10); |
||
327 | pacc->SetTopMargin(0.10); |
||
328 | |||
329 | TFile *file = new TFile("acceptance.root","RECREATE"); |
||
330 | hAcceptance->Write(); |
||
331 | file->Close(); |
||
54 | f9daq | 332 | //delete file; |
25 | f9daq | 333 | |
334 | //hAcceptance->SetContour(100); |
||
335 | //gStyle->SetPalette(1,0); |
||
336 | hAcceptance->SetTitle(";d [mm];a [mm]"); |
||
337 | hAcceptance->GetXaxis()->SetRangeUser(minD,maxD); |
||
338 | hAcceptance->Draw("COLZ"); |
||
339 | |||
340 | show_3d = tmp3d; show_data = tmpdata; |
||
341 | } |
||
342 | |||
343 | //------------------------------------------------------------------------------------------ |
||
344 | // collection efficiency vs length |
||
345 | // a changes, b rests the same, d changes |
||
346 | // still can't use this function, it has hardcoded tan 10 deg |
||
347 | // !very stupid! |
||
348 | // new 3D graph NEEDED |
||
349 | // d vs a vs acceptance |
||
350 | void LGI_d2(int NN = 1e4, double min = 0.5, double max = 3.0, const int steps = 25, double theta = 30.0) |
||
351 | { |
||
352 | TVector3 gapGuideSiPM(0.3, 0, 0); |
||
353 | CDetector *detector = new CDetector(TVector3(-2,0,0), parameters); |
||
354 | int tmp3d = show_3d, tmpdata = show_data; |
||
355 | double step[steps], acc[steps]; |
||
356 | double sipm_d, M0; |
||
357 | char sbuff[256]; |
||
358 | |||
359 | show_3d = 1; show_data = 1; |
||
360 | |||
361 | M0 = parameters.getM(); |
||
362 | |||
363 | PrintGuideHead(); |
||
364 | for(int i=0; i<=steps; i++) { |
||
365 | step[i] = min + i*(max - min)/(double)steps; |
||
366 | sipm_d = M0 - 2.0*step[i]*0.199819;//tan 11.3 deg |
||
367 | parameters.setGuide(sipm_d, M0/sipm_d, step[i]); |
||
368 | //printf("sipm = %lf, M = %lf, d = %lf\n", detector->GetSiPM(), detector->GetM(), step[i]); |
||
369 | printf("%.1lf | %.2lf | ", step[i], sipm_d); |
||
370 | Init(); |
||
371 | acc[i] = RandIso(detector, parameters, NN, theta); |
||
54 | f9daq | 372 | PrintGuideStat(acc[i]); |
25 | f9daq | 373 | sprintf(sbuff, "d%2d.gif", i); |
374 | //c3dview->SaveAs(sbuff); |
||
375 | } |
||
376 | |||
377 | |||
378 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
||
379 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
||
380 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
||
381 | |||
382 | //DrawAcc(steps+1, step, acc, sbuff, (char*)"; d;Acceptance", min, max); |
||
383 | |||
384 | TCanvas *cp = new TCanvas("Acceptance", "Acceptance", 0, 0, 640, 480); |
||
385 | TVirtualPad *pacc = cp->cd(0); |
||
386 | |||
387 | pacc->SetRightMargin(0.05); |
||
388 | pacc->SetLeftMargin(0.13); |
||
389 | pacc->SetTopMargin(0.08); |
||
390 | |||
391 | TGraph *gacceptance = new TGraph(steps+1, step, acc); |
||
392 | gacceptance->SetTitle("; d [mm];Collection efficiency"); |
||
393 | gacceptance->SetMarkerStyle(8); |
||
394 | gacceptance->SetLineColor(12); |
||
395 | gacceptance->SetLineWidth(1); |
||
396 | (gacceptance->GetXaxis())->SetRangeUser(min, max); |
||
397 | //(gacceptance->GetYaxis())->SetRangeUser(ymin, ymax); |
||
398 | |||
399 | gacceptance->Draw("ACP"); |
||
400 | |||
401 | |||
402 | show_3d = tmp3d; show_data = tmpdata; |
||
403 | } |
||
404 | //------------------------------------------------------------------------------------------ |
||
405 | // Acceptance vs. the length |
||
406 | // The magnification ratio M rests the same all the time |
||
407 | void LGI_d(int NN = 1e4, double min = 1, double max = 6.0, const int steps = 25, double theta = 30.0) |
||
408 | { |
||
409 | int tmp3d = show_3d, tmpdata = show_data; |
||
410 | double step[steps], acc[steps]; |
||
411 | const double a = parameters.getA(); |
||
412 | const double magnif = parameters.getM(); |
||
413 | |||
414 | //show_3d = show_in_steps; show_data = 1; |
||
415 | |||
416 | // Use Fresnel equations |
||
417 | //detector->SetFresnel(1); |
||
418 | |||
419 | // Set glass (n=1.5) at the exit |
||
420 | //detector->SetGlass(1,0); |
||
421 | |||
422 | PrintGuideHead(); |
||
423 | for(int i=0; i<=steps; i++) { |
||
424 | step[i] = min + i*(max - min)/(double)steps; |
||
425 | parameters.setGuide(a, magnif, step[i]); |
||
426 | CDetector *detector = new CDetector(CENTER, parameters); |
||
427 | //printf("sipm = %lf, M = %lf, d = %lf\n", detector->GetSiPM(), detector->GetM(), step[i]); |
||
428 | printf("%.1lf | ", step[i]); |
||
429 | Init(); |
||
430 | acc[i] = RandIso(detector, parameters, NN, theta); |
||
54 | f9daq | 431 | PrintGuideStat(acc[i]); |
25 | f9daq | 432 | delete detector; |
433 | } |
||
434 | |||
435 | //char sbuff[256]; |
||
436 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
||
437 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
||
438 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
||
439 | |||
440 | DrawAcc(steps+1, step, acc, (char*)"; d [mm];Acceptance", min, max); |
||
441 | |||
442 | show_3d = tmp3d; show_data = tmpdata; |
||
443 | } |
||
444 | //------------------------------------------------------------------------------------------ |
||
445 | // 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) |
||
447 | { |
||
448 | int tmp3d = show_3d, tmpdata = show_data; |
||
449 | double step[steps], acc[steps]; |
||
450 | |||
451 | const double a = parameters.getA(); |
||
452 | const double d = parameters.getD(); |
||
453 | |||
454 | show_3d = 0; show_data = 0; |
||
455 | |||
456 | PrintGuideHead(); |
||
457 | for(int i=0; i<=steps; i++) { |
||
458 | step[i] = min + i*(max - min)/(double)steps; |
||
459 | parameters.setGuide(a, step[i], d); |
||
460 | CDetector *detector = new CDetector(CENTER, parameters); |
||
461 | Init(); |
||
462 | acc[i] = RandIso(detector, parameters, NN, theta); |
||
54 | f9daq | 463 | PrintGuideStat(acc[i]); |
25 | f9daq | 464 | } |
465 | |||
466 | //char sbuff[256]; |
||
467 | //sprintf(sbuff, "SiPM = %.1lf, M = %.1lf, d = %.1lf | gap(y,z) = (%.1lf, %.1lf) | #theta = %.1lf", |
||
468 | // detector->GetSiPM(), detector->GetM(), detector->GetD(), |
||
469 | // (detector->GetVGap()).y(), (detector->GetVGap()).z(), theta); |
||
470 | |||
471 | DrawAcc(steps+1, step, acc, (char*)"; M;Acceptance", min, max); |
||
472 | |||
473 | show_3d = tmp3d; show_data = tmpdata; |
||
474 | } |
||
475 | //------------------------------------------------------------------------------------------ |
||
476 |