Subversion Repositories f9daq

Rev

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

Rev 70 Rev 71
Line 383... Line 383...
383
// vrne 0 ce ni presecisca; 1 ce se je lomil
383
// vrne 0 ce ni presecisca; 1 ce se je lomil
384
// 2 ce se je odbil; -2 ce se je absorbiral
384
// 2 ce se je odbil; -2 ce se je absorbiral
385
int CSurface::PropagateRay(CRay in, CRay *out, TVector3 *intersection)
385
int CSurface::PropagateRay(CRay in, CRay *out, TVector3 *intersection)
386
{
386
{
387
  if (dbg) printf("--- CSurface::PropagateRay ---\n");
387
  if (dbg) printf("--- CSurface::PropagateRay ---\n");
388
  double cosTi, cosTt, p_ref;
388
  double cosTi; // incident ray angle
-
 
389
  double cosTt; // transmited ray angle
389
  TVector3 intersect, transmit;
390
  TVector3 intersect, transmit;
390
 
391
 
391
        if( !(GetIntersection(&intersect, in) == 1) )
392
        if( !(GetIntersection(&intersect, in) == 1) )
392
                return 0;
393
                return 0;
393
       
394
       
Line 434... Line 435...
434
                a_te = cosAf;
435
                a_te = cosAf;
435
                a_tm = TMath::Sqrt(1 - cosAf*cosAf);
436
                a_tm = TMath::Sqrt(1 - cosAf*cosAf);
436
                if(dbg) printf("  a_te = %lf, a_tm = %lf\n", a_te, a_tm);
437
                if(dbg) printf("  a_te = %lf, a_tm = %lf\n", a_te, a_tm);
437
        }
438
        }
438
        // ----------------------------------------------------------------------------
439
        // ----------------------------------------------------------------------------
-
 
440
       
-
 
441
        // reflection probability
-
 
442
        double p_ref = rand.Uniform(0.0, 1.0);
439
       
443
       
440
        if(type == SURF_TOTAL) type = SURF_REFRA;
444
        if(type == SURF_TOTAL) type = SURF_REFRA;
441
        switch(type){
445
        switch(type){
442
                // ----------------------------------------------------------------------------
446
                // ----------------------------------------------------------------------------
443
                // --------------- refraction from n1 to n2 -----------------------------------
447
                // --------------- refraction from n1 to n2 -----------------------------------
Line 456... Line 460...
456
                                cosTtotal = 0.0;
460
                                cosTtotal = 0.0;
457
                       
461
                       
458
                        if(dbg) printf("  cosTtotal = %lf (Ttotal = %lf)\n", cosTtotal, TMath::ACos(cosTtotal)*DEGREE);
462
                        if(dbg) printf("  cosTtotal = %lf (Ttotal = %lf)\n", cosTtotal, TMath::ACos(cosTtotal)*DEGREE);
459
                        // reflection dependance on polarization missing
463
                        // reflection dependance on polarization missing
460
                        // reflection hardcoded to 0.96
464
                        // reflection hardcoded to 0.96
461
                        p_ref = rand.Uniform(0.0, 1.0);
-
 
462
                        if (dbg) printf("   reflection probability = %f\n", p_ref);    
465
                        if (dbg) printf("   reflection probability = %f\n", p_ref);    
463
                       
466
                       
464
                        // If n1>n2 and theta>thetaCritical, total reflection
467
                        // If n1>n2 and theta>thetaCritical, total reflection
465
                        if( (cosTi < cosTtotal) && (p_ref < reflection) ) { // totalni odboj z verjetnostjo "reflection"
468
                        if(cosTi < cosTtotal) {
466
                                if(dbg) printf("  TOTAL\n");
469
                                if(dbg) printf("  TOTAL\n");
467
                                transmit = in.GetN() + sign_n*2*cosTi*n;
470
                                transmit = in.GetN() + sign_n*2*cosTi*n;
468
                               
471
                               
469
                                if(dbg) {
472
                                if(dbg) {
470
                                        cosTN = TMath::Abs(transmit.Unit() * n);
473
                                        cosTN = TMath::Abs(transmit.Unit() * n);
Line 482... Line 485...
482
                                cosTt = TMath::Sqrt(1 - TMath::Power(N1_N2(sign_n), 2)*(1 - TMath::Power(cosTi, 2)));                          
485
                                cosTt = TMath::Sqrt(1 - TMath::Power(N1_N2(sign_n), 2)*(1 - TMath::Power(cosTi, 2)));                          
483
                                if(dbg) printf("  cosTt = %lf (Tt = %lf) \n", cosTt, TMath::ACos(cosTt)*DEGREE);
486
                                if(dbg) printf("  cosTt = %lf (Tt = %lf) \n", cosTt, TMath::ACos(cosTt)*DEGREE);
484
                                                                               
487
                                                                               
485
                                transmit = N1_N2(sign_n)*in.GetN() + sign_n*(N1_N2(sign_n)*cosTi - cosTt)*n;
488
                                transmit = N1_N2(sign_n)*in.GetN() + sign_n*(N1_N2(sign_n)*cosTi - cosTt)*n;
486
                                if(dbg) {printf("  transmit.Unit() = "); printv(transmit.Unit());}
489
                                if(dbg) {printf("  transmit.Unit() = "); printv(transmit.Unit());}
487
 
-
 
488
                                if(dbg) {
490
                                if(dbg) {
489
                                        cosTN = transmit.Unit() * n;
491
                                        cosTN = transmit.Unit() * n;
490
                                        printf("  cosTN = %lf (TN = %lf) (Abs(TN) = %lf)\n", cosTN, TMath::ACos(cosTN)*DEGREE, TMath::ACos(TMath::Abs(cosTN))*DEGREE); 
492
                                        printf("  cosTN = %lf (TN = %lf) (Abs(TN) = %lf)\n", cosTN, TMath::ACos(cosTN)*DEGREE, TMath::ACos(TMath::Abs(cosTN))*DEGREE); 
-
 
493
                                }
491
                                }
494
                                 
492
                                //if(cosTi<=cosTtotal) cosTt = TMath::Sqrt(1 - TMath::Power(N1_N2(sign_n), 2)*(1 - TMath::Power(cosTi, 2)));
495
                                //if(cosTi<=cosTtotal) cosTt = TMath::Sqrt(1 - TMath::Power(N1_N2(sign_n), 2)*(1 - TMath::Power(cosTi, 2)));
493
                                //if(fresnel) {
496
                                //if(fresnel) {
494
                                        r_te = (n1*cosTi - n2*cosTt)/(n1*cosTi + n2*cosTt); // transverse
497
                                r_te = (n1*cosTi - n2*cosTt)/(n1*cosTi + n2*cosTt); // transverse
495
                                        r_tm = (n2*cosTi - n1*cosTt)/(n1*cosTt + n2*cosTi); // paralel
498
                                r_tm = (n2*cosTi - n1*cosTt)/(n1*cosTt + n2*cosTi); // paralel
496
                                       
-
 
497
                                        if(dbg) printf("  r_te = %lf, r_tm = %lf\n", r_te, r_tm);
-
 
498
                                       
499
                                       
-
 
500
                                if(dbg) printf("  r_te = %lf, r_tm = %lf\n", r_te, r_tm);
-
 
501
                                       
499
                                        // transmited polarization
502
                                // transmited polarization
500
                                        v_tm_t = -v_te.Cross(transmit);
503
                                v_tm_t = -v_te.Cross(transmit);
501
                                        v_tm_t = v_tm_t.Unit();
504
                                v_tm_t = v_tm_t.Unit();
502
                                        pol_t = a_te * (1.0 -  TMath::Abs(r_te)) * v_te  +  a_tm * (1.0 -  TMath::Abs(r_tm)) * v_tm_t;
505
                                pol_t = a_te * (1.0 -  TMath::Abs(r_te)) * v_te  +  a_tm * (1.0 -  TMath::Abs(r_tm)) * v_tm_t;
503
                                       
506
                                       
504
                                        if(dbg) {
507
                                if(dbg) {
505
                                                printf("  v_tm_t = "); printv(v_tm_t);
508
                                                printf("  v_tm_t = "); printv(v_tm_t);
506
                                                printf("  pol_t = "); printv(pol_t);
509
                                                printf("  pol_t = "); printv(pol_t);
507
                                        }
510
                                }
508
         
511
         
509
          // Fresnel coefficients
512
        // Fresnel coefficients
510
                                        R_te = TMath::Power(r_te, 2);
513
                                R_te = TMath::Power(r_te, 2);
511
                                        R_tm = TMath::Power(r_tm, 2);
514
                                R_tm = TMath::Power(r_tm, 2);
512
                                        R_f = a_te*a_te*R_te + a_tm*a_tm*R_tm;
515
                                R_f = a_te*a_te*R_te + a_tm*a_tm*R_tm;
513
                                       
516
                                       
514
                                        if (dbg) printf("  R_te = %lf, R_tm = %lf, R_f = %lf\n", R_te, R_tm, R_f);
517
                                if (dbg) printf("  R_te = %lf, R_tm = %lf, R_f = %lf\n", R_te, R_tm, R_f);
515
                                }
518
                        }
516
                                       
519
                                       
517
                                if(p_ref >= R_f) { // se lomi
520
                        if(p_ref >= R_f) { // se lomi
518
                                  if (dbg) printf("   SURFACE REFRACTED. Return.\n");
521
                                if (dbg) printf("   SURFACE REFRACTED. Return.\n");
519
                                        out->Set(intersect, transmit);
522
                                        out->Set(intersect, transmit);
520
                                        out->SetPolarization(pol_t);
523
                                        out->SetPolarization(pol_t);
521
                                        return REFRACTION;
524
                                        return REFRACTION;
522
                                } else { // se odbije
525
                                } else { // se odbije
523
                                  if (dbg) printf("   SURFACE REFLECTED. p_ref=%f, R_f=%f\n", p_ref, R_f);
526
                                  if (dbg) printf("   SURFACE REFLECTED. p_ref=%f, R_f=%f\n", p_ref, R_f);
Line 529... Line 532...
529
                                }      
532
                                }      
530
                                                       
533
                                                       
531
                        //}
534
                        //}
532
                        break;
535
                        break;
533
                       
536
                       
534
                // ----------------------------------------------------------------------------
537
                // ----------------------------------------------------------------------------
535
                // --------------- reflection at "reflection" probability ---------------------
538
                // --------------- reflection at "reflection" probability ---------------------
536
                // ----------------------------------------------------------------------------
539
                // ----------------------------------------------------------------------------
537
                case SURF_REFLE:
540
                case SURF_REFLE:
538
                        p_ref = rand.Uniform(0.0, 1.0);
541
                        p_ref = rand.Uniform(0.0, 1.0);
539
                        if(p_ref < reflection) { // se odbije
542
                        if(p_ref < reflection) { // se odbije
540
                                cosTi = in.GetN() * n;
543
                                cosTi = in.GetN() * n;
541
                                transmit = in.GetN() - 2*cosTi*n;
544
                                transmit = in.GetN() - 2*cosTi*n;
542
                                out->Set(intersect, transmit);
545
                                out->Set(intersect, transmit);
543
                                return REFLECTION; //sdhfvjhsdbfjhsdbcvjhsb
546
                                return REFLECTION; //sdhfvjhsdbfjhsdbcvjhsb
544
                        } else { // se ne odbije
547
                        } else { // se ne odbije
545
                                transmit = in.GetN();
548
                                transmit = in.GetN();
546
                                out->Set(intersect, transmit);         
549
                                out->Set(intersect, transmit);         
547
                                return ABSORBED;
550
                                return ABSORBED;
548
                        }                                              
551
                        }                                              
549
                        break;
552
                        break;
Line 712... Line 715...
712
                        if(inters_i == 0) {
715
                        if(inters_i == 0) {
713
                          fate = backreflected;
716
                          fate = backreflected;
714
                          //hfate->Fill(backreflected); 
717
                          //hfate->Fill(backreflected); 
715
                          break;
718
                          break;
716
                        } // backreflection
719
                        } // backreflection
717
                       
720
                       
718
                        // the passage is possible, test propagation                    
721
                        // the passage is possible, test propagation                    
719
                        propagation = s_side[inters_i]->PropagateRay(ray0, &ray1, &vec1);
722
                        propagation = s_side[inters_i]->PropagateRay(ray0, &ray1, &vec1);
720
                       
723
                       
721
                        if (dbg) printf("  GUIDE: surface = %d, propagation = %d\n", inters_i, propagation);
724
                        if (dbg) printf("  GUIDE: surface = %d, propagation = %d\n", inters_i, propagation);
722
                       
725
                       
Line 917... Line 920...
917
        double y_gap = parameters.getGap().Y();
920
        double y_gap = parameters.getGap().Y();
918
        double z_gap = parameters.getGap().Z();
921
        double z_gap = parameters.getGap().Z();
919
       
922
       
920
        // additional glass between at top of SiPM
923
        // additional glass between at top of SiPM
921
        // example: epoxy n=1.60
924
        // example: epoxy n=1.60
922
        double n4 = 1.60;
925
        double n4 = 1.57;
923
        TVector3 plane_v[4];
926
        TVector3 plane_v[4];
924
        int nBins = nch + 1;
927
        int nBins = nch + 1;
925
        double p_size = b/2.0;
928
        double p_size = b/2.0;
926
        plane_v[0].SetXYZ(x_offset+d+glass_d, y_gap + p_size, z_gap - p_size);
929
        plane_v[0].SetXYZ(x_offset+d+glass_d, y_gap + p_size, z_gap - p_size);
927
        plane_v[1].SetXYZ(x_offset+d+glass_d, y_gap + p_size, z_gap + p_size);
930
        plane_v[1].SetXYZ(x_offset+d+glass_d, y_gap + p_size, z_gap + p_size);
Line 1125... Line 1128...
1125
                }
1128
                }
1126
        } else {
1129
        } else {
1127
          if (dbg) printf("Detector: fate = hit or refracted");
1130
          if (dbg) printf("Detector: fate = hit or refracted");
1128
                ray1 = ray0;
1131
                ray1 = ray0;
1129
                if(draw) {
1132
                if(draw) {
-
 
1133
                  //double epoxy = parameters->getGlassD();
1130
                        if(glass_on) ray1->Draw(center.x(), center.x() /*+ window_d*/);
1134
                        if(glass_on) ray1->Draw(center.x(), center.x() + glass_d);
1131
                        else ray1->DrawS(center.x(), 10.0);
1135
                        else ray1->DrawS(center.x(), 10.0);
1132
                }
1136
                }
1133
        }
1137
        }
1134
               
1138
               
1135
                fate = missed; // zgresil aktivno povrsino
1139
                fate = missed; // zgresil aktivno povrsino
1136
                if(glass_on) {                 
1140
                if(glass_on) {                 
-
 
1141
                        *ray0 = *ray1;
1137
                        *ray0 = *ray1; ray1->SetColor(col_rgla);
1142
                        ray1->SetColor(col_rgla);
1138
                        fate_glass = glass->PropagateRay(*ray0, ray1, &presecisce);
1143
                        fate_glass = glass->PropagateRay(*ray0, ray1, &presecisce);
1139
                        if(fate_glass == 1) {
1144
                        if(fate_glass == REFRACTION) {
1140
                                hglass->Fill(presecisce.y(), presecisce.z());
1145
                                hglass->Fill(presecisce.y(), presecisce.z());
1141
                                if(draw) ray1->DrawS(presecisce.x(), 10.0);
1146
                                if(draw) ray1->DrawS(presecisce.x(), 10.0);
1142
                                if(active->TestIntersection(&presecisce, *ray1)) {
1147
                                //if(active->TestIntersection(&presecisce, *ray1)) { 
1143
                                        fate = hitExit;
1148
                                        //fate = hitExit;
1144
                                        hactive->Fill(offsetY + presecisce.y(), offsetZ + presecisce.z());
1149
                                        //hactive->Fill(offsetY + presecisce.y(), offsetZ + presecisce.z());
1145
                                        hlaser->Fill((in.GetR()).y(), (in.GetR()).z());
1150
                                        //hlaser->Fill((in.GetR()).y() + offsetY, (in.GetR()).z() + offsetZ);
1146
                                }
1151
                                //}
1147
                                if(detector->TestIntersection(&presecisce, *ray1))
1152
                                //if(detector->TestIntersection(&presecisce, *ray1)) 
1148
                                        hdetector->Fill(presecisce.y(), presecisce.z());
1153
                                        //hdetector->Fill(offsetY + presecisce.y(), offsetZ + presecisce.z());
1149
                        } else if(fate_glass == 2) {
1154
                        //} else if(fate_glass == REFLECTION) {
-
 
1155
                                else
1150
                                if(draw) ray1->DrawS(presecisce.x(), 10.0);
1156
                                if(draw) ray1->DrawS(presecisce.x(), 10.0);
1151
                        }
1157
                        }
1152
                } else {
1158
                        }
-
 
1159
 
1153
                  // Main test: ray and SiPM surface
1160
                  // Main test: ray and SiPM surface
1154
                        if(active->TestIntersection(&presecisce, *ray1)) {
1161
                        if(active->TestIntersection(&presecisce, *ray1)) {
1155
                                fate = hitExit;
1162
                                fate = hitExit;
1156
                                hactive->Fill(offsetY + presecisce.y(), offsetZ + presecisce.z());
1163
                                hactive->Fill(offsetY + presecisce.y(), offsetZ + presecisce.z());
1157
                                hlaser->Fill((in.GetR()).y() + offsetY, (in.GetR()).z() + offsetZ);
1164
                                hlaser->Fill((in.GetR()).y() + offsetY, (in.GetR()).z() + offsetZ);
1158
                        }
1165
                        }
1159
                        // If it is on the same plane as SiPM
1166
                        // If it is on the same plane as SiPM
1160
                        if(detector->TestIntersection(&presecisce, *ray1))
1167
                        if(detector->TestIntersection(&presecisce, *ray1))
1161
                                hdetector->Fill(offsetY + presecisce.y(), offsetZ + presecisce.z());
1168
                                hdetector->Fill(offsetY + presecisce.y(), offsetZ + presecisce.z());
1162
                }
1169
                //}
1163
        //} else {
1170
        //} else {
1164
                //if(draw) ray1->Draw(presecisce.x(), center.x()+d+window_d);
1171
                //if(draw) ray1->Draw(presecisce.x(), center.x()+d+window_d);
1165
        //}
1172
        //}
1166
                               
1173
                               
1167
        *out = *ray1;
1174
        *out = *ray1;