Subversion Repositories f9daq

Rev

Rev 73 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 73 Rev 84
Line 94... Line 94...
94
 
94
 
95
      if(!only2d) {
95
      if(!only2d) {
96
          RTCanvas *cdata = new RTCanvas((char*)"Data", sbuff, 350, 0, 950, 950);
96
          RTCanvas *cdata = new RTCanvas((char*)"Data", sbuff, 350, 0, 950, 950);
97
          cdata->Divide(3,3);
97
          cdata->Divide(3,3);
98
          int cpc = 1;
98
          int cpc = 1;
-
 
99
          cdata->cd(cpc++);
99
          cdata->cd(cpc++); (detector->histoPlate)->Draw("COLZ");
100
          TH2F* generated = detector->GetGenerated();
-
 
101
          int nGenerated = generated->GetEntries();
-
 
102
          int minimum = generated->GetBinContent(generated->GetMinimumBin());
-
 
103
          int maximum = generated->GetBinContent(generated->GetMaximumBin());
-
 
104
          generated->GetZaxis()->SetRangeUser(0, 1.05*maximum);
-
 
105
          double variation = (maximum-minimum)/(double)nGenerated;
-
 
106
          printf("Statistical variation (max-min)/all = %f perc. \n", variation*100);
-
 
107
          generated->SetTitle("Generated");
-
 
108
          generated->Draw("colz");
100
          cdata->cd(cpc++); ((detector->GetLG())->GetHIn())->Draw("COLZ");
109
          cdata->cd(cpc++); //((detector->GetLG())->GetHIn())->Draw("COLZ");
-
 
110
          TH2F* histoPlate = detector->GetHPlate();
-
 
111
          histoPlate->Draw("COLZ");
101
          cdata->cd(cpc++); //((detector->GetLG())->GetHOut())->Draw("COLZ");
112
          cdata->cd(cpc++); //((detector->GetLG())->GetHOut())->Draw("COLZ");
-
 
113
          TH2F* histoGlass = (detector->GetHGlass());
102
          (detector->GetHGlass())->Draw("COLZ");
114
          histoGlass->Draw("COLZ");
103
 
115
 
-
 
116
          cdata->cd(cpc++);
104
          cdata->cd(cpc++); (detector->GetHActive())->Draw("COLZ");
117
          TH2F* histoActive = (detector->GetHActive());
-
 
118
          histoActive->Draw("COLZ");
-
 
119
          cdata->cd(cpc++);
105
          cdata->cd(cpc++); (detector->GetHLaser())->Draw("COLZ");
120
          TH2F* histoLaser = (detector->GetHLaser());
-
 
121
          histoLaser->Draw("COLZ");
-
 
122
          cdata->cd(cpc++);
106
          cdata->cd(cpc++); (detector->GetHDetector())->Draw("COLZ");
123
          TH2F* histoDetector = (detector->GetHDetector());
-
 
124
          histoDetector->Draw("COLZ");
107
 
125
 
-
 
126
          cdata->cd(cpc++);
108
          cdata->cd(cpc++); ((detector->GetLG())->GetHFate())->Draw();
127
          TH1F* fate=((detector->GetLG())->GetHFate());
-
 
128
          fate->Draw();
-
 
129
          cdata->cd(cpc++);
109
          cdata->cd(cpc++); ((detector->GetLG())->GetHNOdb_all())->Draw();
130
          TH1F* reflections = ((detector->GetLG())->GetHNOdb_all());
-
 
131
          reflections->Draw();
-
 
132
          cdata->cd(cpc++);
110
          cdata->cd(cpc++); ((detector->GetLG())->GetHNOdb_exit())->Draw();
133
          TH1F *reflectedExit = ((detector->GetLG())->GetHNOdb_exit());
-
 
134
          reflectedExit->Draw();
111
      }else{
135
      }else{
112
          RTCanvas *cdata = new RTCanvas((char*)"Data", sbuff, 350, 0, 500, 500);
136
          RTCanvas *cdata = new RTCanvas((char*)"Data", sbuff, 350, 0, 500, 500);
113
          cdata->cd(0); (detector->GetHLaser())->Draw("COLZ");
137
          cdata->cd(0); (detector->GetHLaser())->Draw("COLZ");
114
          cdata->SaveAs("cdata.gif");
138
          cdata->SaveAs("cdata.gif");
115
      }
139
      }
Line 177... Line 201...
177
//-----------------------------------------------------------------------------
201
//-----------------------------------------------------------------------------
178
 
202
 
179
//-----------------------------------------------------------------------------
203
//-----------------------------------------------------------------------------
180
// en zarek
204
// en zarek
181
double Single(CDetector *detector, DetectorParameters& parameters,
205
double Single(CDetector *detector, DetectorParameters& parameters,
182
TVector3 hit = TVector3(0.0, 0.0, 0.0), double theta = 0.0, double phi = 0.0)
206
    TVector3 hit = TVector3(0.0, 0.0, 0.0), double theta = 0.0, double phi = 0.0)
183
{
207
{
184
  theta = Pi()*theta/180.0;
208
  theta = Pi()*theta/180.0;
185
  if(theta < 1e-6) theta = 1e-6;
209
  if(theta < 1e-6) theta = 1e-6;
186
  phi = phi*Pi()/180.0;
210
  phi = phi*Pi()/180.0;
187
  if(phi < 1e-6) phi = 1e-6;
211
  if(phi < 1e-6) phi = 1e-6;
Line 192... Line 216...
192
  if(show_3d) detector->Draw(draw_width);
216
  if(show_3d) detector->Draw(draw_width);
193
 
217
 
194
  CRay *ray0 = new CRay(hit.x() - offset, hit.y(), hit.z(),
218
  CRay *ray0 = new CRay(hit.x() - offset, hit.y(), hit.z(),
195
      TMath::Cos(theta), TMath::Sin(theta)*TMath::Sin(phi),
219
      TMath::Cos(theta), TMath::Sin(theta)*TMath::Sin(phi),
196
      TMath::Sin(theta)*TMath::Cos(phi));
220
      TMath::Sin(theta)*TMath::Cos(phi));
197
  // Set z-polarization == vertical
221
  // Set y-polarization == vertical
-
 
222
  TVector3 k(ray0->GetK());
198
  TVector3 polarization(0,0,1);
223
  TVector3 polarization(k.Orthogonal());
199
  polarization.RotateY(-theta);
224
  polarization.Unit();
200
  polarization.RotateZ(phi);
225
  polarization.Rotate(phi, k);
201
  if (polarization.Dot(ray0->GetK()) > 1e-5) printf("ERROR: pol not perep\n");
226
  if (polarization.Dot(ray0->GetK()) > 1e-2) printf("ERROR: pol not perep\n");
202
  ray0->setPolarization(polarization);
227
  ray0->setPolarization(polarization);
203
  CRay *ray1 = new CRay;
228
  CRay ray1;
204
 
229
 
205
  detector->Propagate(*ray0, ray1, show_3d);
230
  detector->Propagate(*ray0, ray1, show_3d);
206
 
231
 
207
  CRay *incidentPolarization = new CRay;
232
  CRay *incidentPolarization = new CRay;
208
  incidentPolarization->SetColor(kGreen);
233
  incidentPolarization->SetColor(kGreen);
209
  TVector3 drawPosition = ray0->GetR();
234
  TVector3 drawPosition = ray0->GetR();
210
  drawPosition.SetX(drawPosition.X() - 5);
235
  drawPosition.SetX(drawPosition.X() - 5);
211
  incidentPolarization->Set(drawPosition, polarization);
236
  incidentPolarization->Set(drawPosition, polarization);
212
  incidentPolarization->DrawS(drawPosition.X(), 1);
237
  incidentPolarization->DrawS(drawPosition.X(), 1);
213
 
238
 
214
  TVector3 outPolarization = ray1->GetP();
239
  TVector3 outPolarization = ray1.GetP();
215
  drawPosition = ray1->GetR();
240
  drawPosition = ray1.GetR();
216
  drawPosition.SetX(drawPosition.X() + 5);
241
  drawPosition.SetX(drawPosition.X() + 5);
217
  CRay* rayPol = new CRay(drawPosition, outPolarization);
242
  CRay* rayPol = new CRay(drawPosition, outPolarization);
218
  rayPol->SetColor(kBlack);
243
  rayPol->SetColor(kBlack);
219
  rayPol->DrawS(drawPosition.X(), 1);
244
  rayPol->DrawS(drawPosition.X(), 1);
220
 
245
 
221
  delete ray0;
246
  delete ray0;
222
  delete ray1;
247
  //delete ray1;
223
 
248
 
224
  return (detector->GetHActive())->GetEntries() / (double)(1);
249
  return (detector->GetHActive())->GetEntries() / (double)(1);
225
}
250
}
226
//-----------------------------------------------------------------------------
251
//-----------------------------------------------------------------------------
227
// zarki, razporejeni v mrezi
252
// zarki, razporejeni v mrezi
228
double Grid(CDetector *detector, DetectorParameters& parameters,
253
double Grid(CDetector *detector, DetectorParameters& parameters,
229
int NN = 10, double theta = 0.0)
254
    int NN = 10, double theta = 0.0)
230
{
255
{
231
  //CDetector *detector = new CDetector(center, 3, 1.666, 3, 3, 1, 1.48, 1.48);
256
  //CDetector *detector = new CDetector(center, 3, 1.666, 3, 3, 1, 1.48, 1.48);
232
  theta = Pi()*theta/180.0;
257
  theta = Pi()*theta/180.0;
233
  if(theta < 1e-6) theta = 1e-6;
258
  if(theta < 1e-6) theta = 1e-6;
234
 
259
 
235
  //detector->Init();
260
  //detector->Init();
236
  if(show_3d) detector->Draw(draw_width);
261
  if(show_3d) detector->Draw(draw_width);
237
 
262
 
238
  const double b = parameters.getB();
263
  const double b = parameters.getB();
-
 
264
  double simulated = 0;
239
 
265
 
240
  double offset = (parameters._plateOn ? parameters._plateWidth : 0);
266
  double offset = (parameters._plateOn ? parameters._plateWidth : 0);
241
 
-
 
-
 
267
  const int GRID = 100;
242
  for(int i = 0; i < NN; i++) {
268
  for(int i = 0; i < GRID; i++) {
243
      for(int j = 0; j < NN; j++) {
269
      for(int j = 0; j < GRID; j++) {
-
 
270
          for(int jk = 0; jk<NN; jk++){
244
          CRay *ray0 = new CRay(CENTER.x() - offset,
271
              CRay *ray0 = new CRay(CENTER.x() - offset,
245
              0.99*(i*b/NN + b/(2.0*NN) - b/2.0),
272
                  (i*b/GRID + b/(2.0*GRID) - b/2.0),
246
              0.99*(j*b/NN + b/(2.0*NN) - b/2.0),
273
                  (j*b/GRID + b/(2.0*GRID) - b/2.0),
247
              TMath::Cos(theta),
274
                  TMath::Cos(theta),
248
              0.0,
275
                  0.0,
249
              TMath::Sin(theta));
276
                  TMath::Sin(theta));
-
 
277
              TVector3 k(ray0->GetK());
250
          TVector3 polarization(0, 1, 0);
278
              TVector3 polarization(k.Orthogonal());
251
          polarization.RotateY(-theta);
279
              polarization.Unit();
252
          ray0->setPolarization(polarization);
280
              ray0->setPolarization(polarization);
253
          CRay *ray1 = new CRay;
281
              CRay ray1;
254
          if(i == (NN/2))
282
              if(i == (GRID/2) and jk == 0)
255
            detector->Propagate(*ray0, ray1, show_3d);
283
                detector->Propagate(*ray0, ray1, show_3d);
256
          else
284
              else
257
            detector->Propagate(*ray0, ray1, 0);
285
                detector->Propagate(*ray0, ray1, 0);
258
          delete ray0;
286
              delete ray0;
-
 
287
              simulated++;
259
          delete ray1;
288
              //delete ray1;
-
 
289
          }
260
      }
290
      }
261
 
291
 
262
  }
292
  }
263
  double acceptance = 0.0;
293
  double acceptance = 0.0;
264
  /*
294
  /*
265
        if( !(parameters.getPlateOn()) )
295
        if( !(parameters.getPlateOn()) )
266
          acceptance = (detector->GetHActive())->GetEntries() / (double)NN*NN;
296
          acceptance = (detector->GetHActive())->GetEntries() / (double)NN*NN;
267
  else
297
  else
268
    acceptance = (detector->GetHActive())->GetEntries() / (detector->GetHPlate())->GetEntries();       
298
    acceptance = (detector->GetHActive())->GetEntries() / (detector->GetHPlate())->GetEntries();       
269
   */
299
   */
270
  acceptance = (detector->GetHActive())->GetEntries() / (double)((NN)*(NN));
300
  acceptance = (detector->GetHActive())->GetEntries() / simulated;
271
  return acceptance;
301
  return acceptance;
272
}
302
}
273
//-----------------------------------------------------------------------------
303
//-----------------------------------------------------------------------------
274
// zarki z nakljucnim polozajem vpada (na vstopni pov. vodnika)
304
// zarki z nakljucnim polozajem vpada (na vstopni pov. vodnika)
275
// vsi pod kotom (theta, phi)
305
// vsi pod kotom (theta, phi)
276
double RandYZ(CDetector *detector, DetectorParameters& parameters,
306
double RandYZ(CDetector *detector, DetectorParameters& parameters,
277
int NN, double theta, double phi, int show_rays)
307
    int NN, double theta, double phi, int show_rays)
278
{
308
{
279
  //CDetector *detector = new CDetector(center, 3, 1.666, 3, 3, 1, 1.48, 1.48);
309
  //CDetector *detector = new CDetector(center, 3, 1.666, 3, 3, 1, 1.48, 1.48);
280
  theta = theta*3.14159265358979312/180.0;
310
  theta = theta*3.14159265358979312/180.0;
281
  if(theta < MARGIN) theta = MARGIN;
311
  if(theta < MARGIN) theta = MARGIN;
282
  phi = phi*3.14159265358979312/180.0;
312
  phi = phi*3.14159265358979312/180.0;
283
  if(phi < MARGIN) phi = MARGIN;
313
  if(phi < MARGIN) phi = MARGIN;
284
 
314
 
285
  TDatime now;
315
  TDatime now;
286
  TRandom rand;
316
  TRandom2 rand;
287
  rand.SetSeed(now.Get());
317
  rand.SetSeed(now.Get());
288
 
318
 
289
  //detector->Init();
319
  //detector->Init();
290
  if(show_3d) detector->Draw(draw_width);
320
  if(show_3d) detector->Draw(draw_width);
291
 
321
 
292
  double SiPM = parameters.getA();
-
 
293
  double    M = parameters.getM();
322
  double b = parameters.getB();
294
  double offset = (parameters._plateOn ? parameters._plateWidth : 0);
323
  double offset = (parameters._plateOn ? parameters._plateWidth : 0);
295
 
324
 
296
  for(int i = 0; i < NN; i++) {
325
  for(int i = 0; i < NN; i++) {
297
 
326
 
298
      double rx = CENTER.x() - offset;
327
      double rx = CENTER.x() - offset;
299
      double ry = rand.Uniform(-M*SiPM/2.0, M*SiPM/2.0);
328
      double ry = rand.Uniform(-b/2.0, b/2.0);
300
      double rz = rand.Uniform(-M*SiPM/2.0, M*SiPM/2.0);
329
      double rz = rand.Uniform(-b/2.0, b/2.0);
301
 
330
 
302
      double rl = TMath::Cos(theta);
331
      double rl = TMath::Cos(theta);
303
      double rm = TMath::Sin(theta)*TMath::Sin(phi);
332
      double rm = TMath::Sin(theta)*TMath::Sin(phi);
304
      double rn = TMath::Sin(theta)*TMath::Cos(phi);
333
      double rn = TMath::Sin(theta)*TMath::Cos(phi);
305
 
334
 
306
      CRay *ray0 = new CRay(rx, ry, rz, rl, rm, rn);
335
      CRay *ray0 = new CRay(rx, ry, rz, rl, rm, rn);
-
 
336
      TVector3 k(ray0->GetK());
307
      TVector3 polarization(0, 0, 1);
337
      TVector3 polarization(k.Orthogonal());
308
      polarization.RotateY(-theta);
338
      polarization.Unit();
309
      polarization.RotateZ(phi);
339
      polarization.Rotate(phi, k);
310
      ray0->setPolarization(polarization);
340
      ray0->setPolarization(polarization);
311
      CRay *ray1 = new CRay;
341
      CRay ray1;
312
 
342
 
313
      if(i < show_rays)
343
      if(i < show_rays)
314
        detector->Propagate(*ray0, ray1, show_3d);
344
        detector->Propagate(*ray0, ray1, show_3d);
315
      else
345
      else
316
        detector->Propagate(*ray0, ray1, 0);
346
        detector->Propagate(*ray0, ray1, 0);
317
      delete ray1;
347
      //delete ray1;
318
      delete ray0;
348
      delete ray0;
319
  }
349
  }
320
 
350
 
321
  double acceptance = 0.0;
351
  double acceptance = 0.0;
322
  /*
352
  /*
Line 334... Line 364...
334
// NN - number of rays to be simulated with angles theta distributed uniformly
364
// NN - number of rays to be simulated with angles theta distributed uniformly
335
//      in cos theta and phi uniformly:
365
//      in cos theta and phi uniformly:
336
//      theta [0, theta]
366
//      theta [0, theta]
337
//      phi [0,360]
367
//      phi [0,360]
338
double RandIso(CDetector *detector, DetectorParameters& parameters,
368
double RandIso(CDetector *detector, DetectorParameters& parameters,
339
int NN = 1e3, double thetaMin=0.0, double theta = 30.0, int show_rays = 30, int show_rand = 0)
369
    int NN = 1e3, double thetaMin=0.0, double thetaMax = 30.0, int show_rays = 30, int show_rand = 0)
340
{
370
{
341
  //CDetector *detector = new CDetector(center, 3, 1.666, 3, 3, 1, 1.48, 1.48);
371
  //CDetector *detector = new CDetector(center, 3, 1.666, 3, 3, 1, 1.48, 1.48);
342
  double pi = 3.14159265358979312;
372
  double pi = 3.14159265358979312;
-
 
373
  thetaMax = thetaMax*pi/180.0;
343
  theta = theta*3.14159265358979312/180.0;
374
  thetaMin = thetaMin*pi/180.0;
-
 
375
  if(thetaMin < MARGIN) thetaMin = MARGIN;
344
  if(theta < MARGIN) theta = MARGIN;
376
  if(thetaMax < MARGIN) thetaMax = MARGIN;
345
 
377
 
346
  TDatime now;
378
  TDatime now;
347
  TRandom rand;
379
  TRandom2 rand;
348
  rand.SetSeed(now.Get());
380
  rand.SetSeed(now.Get());
349
  double rx, ry, rz, rl, rm, rn;
-
 
350
  double rphi, rtheta;
-
 
351
  //double theta_min_rad = TMath::Power(TMath::Cos(theta), 2);
381
  //double theta_min_rad = TMath::Power(TMath::Cos(theta), 2);
352
  double theta_min_rad = TMath::Cos(theta);
382
  double theta_min_rad = TMath::Cos(thetaMax);
353
  double theta_max_rad = TMath::Cos(thetaMin);
383
  double theta_max_rad = TMath::Cos(thetaMin);
354
 
384
 
355
  TH1F *hphi, *htheta, *hcostheta, *hl, *hm, *hn;
385
  TH1F *hphi, *htheta, *hcostheta, *hl, *hm, *hn;
356
  hphi = (TH1F*)gROOT->FindObject("hphi"); if(hphi) delete hphi;
386
  hphi = (TH1F*)gROOT->FindObject("hphi"); if(hphi) delete hphi;
357
  hphi = new TH1F("hphi", "hphi", 100, 0.0, 2.0*pi);
387
  hphi = new TH1F("hphi", "hphi", 100, 0.0, 2.0*pi);
Line 368... Line 398...
368
 
398
 
369
 
399
 
370
  //detector->Init();
400
  //detector->Init();
371
  if (show_3d) detector->Draw(draw_width);
401
  if (show_3d) detector->Draw(draw_width);
372
 
402
 
373
  double SiPM = parameters.getA();
-
 
374
  double M = parameters.getM();
403
  double b = parameters.getB();
375
  double offset = (parameters._plateOn ? parameters._plateWidth : 0);
404
  double offset = (parameters._plateOn ? parameters._plateWidth : 0);
376
 
-
 
377
  for(int i = 0; i < NN; i++) {
-
 
378
 
405
 
-
 
406
  for(int i = 0; i < NN; i++) {
-
 
407
 
379
      rx = CENTER.x() - offset;
408
      double rx = CENTER.x() - offset;
380
      ry = rand.Uniform(-M*SiPM/2.0, M*SiPM/2.0);
409
      double ry = rand.Uniform(-b/2.0, b/2.0);
381
      rz = rand.Uniform(-M*SiPM/2.0, M*SiPM/2.0);
410
      double rz = rand.Uniform(-b/2.0, b/2.0);
382
 
411
 
383
      rphi = rand.Uniform(0.0, 2.0*pi);
412
      double phi = rand.Uniform(0.0, 2.0*pi);
384
      //double theta_max_rad = TMath::Cos(17.0*pi/180.0);
413
      //double theta_max_rad = TMath::Cos(17.0*pi/180.0);
385
      //rtheta = TMath::ACos((rand.Uniform(theta_min_rad, 1.0)));
414
      //rtheta = TMath::ACos((rand.Uniform(theta_min_rad, 1.0)));
386
      rtheta = TMath::ACos((rand.Uniform(theta_min_rad, theta_max_rad)));
415
      double theta = TMath::ACos((rand.Uniform(theta_min_rad, theta_max_rad)));
387
 
416
 
388
      rl = TMath::Cos(rtheta);
417
      double rl = TMath::Cos(theta);
389
      rm = TMath::Sin(rtheta)*TMath::Sin(rphi);
418
      double rm = TMath::Sin(theta)*TMath::Sin(phi);
390
      rn = TMath::Sin(rtheta)*TMath::Cos(rphi);
419
      double rn = TMath::Sin(theta)*TMath::Cos(phi);
391
 
420
 
392
      if(show_rand) {
421
      if(show_rand) {
393
          htheta->Fill(rtheta);
422
          htheta->Fill(theta);
394
          hcostheta->Fill( TMath::Cos(rtheta) );
423
          hcostheta->Fill( TMath::Cos(theta) );
395
          hphi->Fill(rphi);
424
          hphi->Fill(phi);
-
 
425
          hl->Fill(rl);
-
 
426
          hm->Fill(rm);
396
          hl->Fill(rl); hm->Fill(rm); hn->Fill(rn);
427
          hn->Fill(rn);
397
      }
428
      }
398
 
429
 
399
      CRay *ray0 = new CRay(rx, ry, rz, rl, rm, rn);
430
      CRay *ray0 = new CRay(rx, ry, rz, rl, rm, rn);
-
 
431
      TVector3 k(ray0->GetK());
-
 
432
      TVector3 polarization(k.Orthogonal());
-
 
433
      polarization.Unit();
-
 
434
      polarization.Rotate(phi, k);
-
 
435
      ray0->setPolarization(polarization);
400
      CRay *ray1 = new CRay;
436
      CRay ray1;
401
 
437
 
402
      if(i < show_rays) {
438
      if(i < show_rays) {
403
          detector->Propagate(*ray0, ray1, show_3d);
439
          detector->Propagate(*ray0, ray1, show_3d);
404
      }
440
      }
405
      else {
441
      else {
406
          detector->Propagate(*ray0, ray1, 0);
442
          detector->Propagate(*ray0, ray1, 0);
407
      }
443
      }
408
 
444
 
-
 
445
      //delete ray1;
409
      delete ray0;
446
      delete ray0;
410
      delete ray1;
-
 
411
  }
447
  }
412
 
448
 
413
  if(show_rand) {
449
  if(show_rand) {
414
      TCanvas *c2rand = (TCanvas*)gROOT->FindObject("c2rand");
450
      TCanvas *c2rand = (TCanvas*)gROOT->FindObject("c2rand");
415
      if(!c2rand) c2rand = new TCanvas("c2rand", "Random", 750, 550, 700, 700);
451
      if(!c2rand) c2rand = new TCanvas("c2rand", "Random", 750, 550, 700, 700);
Line 436... Line 472...
436
}
472
}
437
 
473
 
438
// Beamtest distribution
474
// Beamtest distribution
439
// with fixed theta and phi in interval phiMin, phiMax
475
// with fixed theta and phi in interval phiMin, phiMax
440
double beamtest(CDetector *detector, DetectorParameters& parameters,
476
double beamtest(CDetector *detector, DetectorParameters& parameters,
441
int NN, double theta, double phiMin, double phiMax, int show_rays, int show_rand)
477
    int NN, double theta, double phiMin, double phiMax, int show_rays, int show_rand)
442
{
478
{
443
  double pi = 3.14159265358979312;
479
  double pi = 3.14159265358979312;
444
  theta *= pi/180.0;
480
  theta *= pi/180.0;
445
  if(theta < MARGIN) theta = MARGIN;
481
  if(theta < MARGIN) theta = MARGIN;
446
  phiMin *= pi/180.0;
482
  phiMin *= pi/180.0;
447
  phiMax *= pi/180.0;
483
  phiMax *= pi/180.0;
448
 
484
 
449
  TDatime now;
485
  TDatime now;
450
  TRandom rand;
486
  TRandom2 rand;
451
  rand.SetSeed(now.Get());
487
  rand.SetSeed(now.Get());
452
  double rx, ry, rz, rl, rm, rn;
488
  double rx, ry, rz, rl, rm, rn;
453
  double rphi;
489
  double phi;
454
 
490
 
455
  TH1F *hphi, *htheta, *hcostheta, *hl, *hm, *hn;
491
  TH1F *hphi, *htheta, *hcostheta, *hl, *hm, *hn;
456
  hphi = (TH1F*)gROOT->FindObject("hphi"); if(hphi) delete hphi;
492
  hphi = (TH1F*)gROOT->FindObject("hphi"); if(hphi) delete hphi;
457
  hphi = new TH1F("hphi", "hphi", 100, -pi, pi);
493
  hphi = new TH1F("hphi", "hphi", 100, -pi, pi);
458
  htheta = (TH1F*)gROOT->FindObject("htheta"); if(htheta) delete htheta;
494
  htheta = (TH1F*)gROOT->FindObject("htheta"); if(htheta) delete htheta;
Line 476... Line 512...
476
 
512
 
477
      rx = CENTER.x() - offset;
513
      rx = CENTER.x() - offset;
478
      ry = rand.Uniform(-b/2.0, b/2.0);
514
      ry = rand.Uniform(-b/2.0, b/2.0);
479
      rz = rand.Uniform(-b/2.0, b/2.0);
515
      rz = rand.Uniform(-b/2.0, b/2.0);
480
 
516
 
481
      rphi = rand.Uniform(phiMin, phiMax);
517
      phi = rand.Uniform(phiMin, phiMax);
482
      //double theta_max_rad = TMath::Cos(17.0*pi/180.0);
518
      //double theta_max_rad = TMath::Cos(17.0*pi/180.0);
483
      //rtheta = TMath::ACos((rand.Uniform(theta_min_rad, 1.0)));
519
      //rtheta = TMath::ACos((rand.Uniform(theta_min_rad, 1.0)));
484
      //rtheta = TMath::ACos((rand.Uniform(theta_min_rad, theta_max_rad)));
520
      //rtheta = TMath::ACos((rand.Uniform(theta_min_rad, theta_max_rad)));
485
 
521
 
486
      rl = TMath::Cos(theta);
522
      rl = TMath::Cos(theta);
487
      rm = TMath::Sin(theta)*TMath::Sin(rphi);
523
      rm = TMath::Sin(theta)*TMath::Sin(phi);
488
      rn = TMath::Sin(theta)*TMath::Cos(rphi);
524
      rn = TMath::Sin(theta)*TMath::Cos(phi);
489
 
525
 
490
      if(show_rand) {
526
      if(show_rand) {
491
          //htheta->Fill(rtheta);
527
          //htheta->Fill(rtheta);
492
          //hcostheta->Fill( TMath::Cos(rtheta) );
528
          //hcostheta->Fill( TMath::Cos(rtheta) );
493
          hphi->Fill(rphi);
529
          hphi->Fill(phi);
494
          hl->Fill(rl);
530
          hl->Fill(rl);
495
          hm->Fill(rm);
531
          hm->Fill(rm);
496
          hn->Fill(rn);
532
          hn->Fill(rn);
497
      }
533
      }
498
 
534
 
499
      CRay *ray0 = new CRay(rx, ry, rz, rl, rm, rn);
535
      CRay *ray0 = new CRay(rx, ry, rz, rl, rm, rn);
500
      // inital polarizaton
536
      // inital polarizaton
-
 
537
      TVector3 k(ray0->GetK());
501
      TVector3 polarization(0, 0, 1);
538
      TVector3 polarization(k.Orthogonal());
502
      polarization.RotateY(-theta);
539
      polarization.Unit();
503
      polarization.RotateX(rphi);
540
      polarization.Rotate(phi, k);
504
      ray0->setPolarization(polarization);
541
      ray0->setPolarization(polarization);
505
      CRay *ray1 = new CRay;
542
      CRay ray1;
506
 
543
 
507
      if(i < show_rays) {
544
      if(i < show_rays) {
508
          detector->Propagate(*ray0, ray1, show_3d);
545
          detector->Propagate(*ray0, ray1, show_3d);
509
      }
546
      }
510
      else {
547
      else {
511
          detector->Propagate(*ray0, ray1, 0);
548
          detector->Propagate(*ray0, ray1, 0);
512
      }
549
      }
513
 
550
 
-
 
551
      //delete ray1;
514
      delete ray0;
552
      delete ray0;
515
      delete ray1;
-
 
516
  }
553
  }
517
 
554
 
518
  if(show_rand) {
555
  if(show_rand) {
519
      TCanvas *c2rand = (TCanvas*)gROOT->FindObject("c2rand");
556
      TCanvas *c2rand = (TCanvas*)gROOT->FindObject("c2rand");
520
      if(!c2rand) c2rand = new TCanvas("c2rand", "Random", 750, 550, 700, 700);
557
      if(!c2rand) c2rand = new TCanvas("c2rand", "Random", 750, 550, 700, 700);