475,6 → 475,7 |
} |
out->Set(intersect, transmit); |
|
// Shift? |
pol_t = -in.GetP() + sign_n*2*cosTi*n; |
out->SetPolarization(pol_t); |
return REFLECTION; |
582,24 → 583,25 |
|
|
//================================================================================= |
Guide::Guide(TVector3 center0, DetectorParameters ¶meters) |
Guide::Guide(TVector3 center0, DetectorParameters ¶meters) : |
_d(parameters.getD()), |
_n1(parameters.getN1()), |
_n2(parameters.getN2()), |
_n3(parameters.getN3()), |
_r(c_reflectivity), |
_absorption(0), |
_A(0), |
_badCoupling(parameters.badCoupling()) |
{ |
double t; |
|
TDatime now; |
rand.SetSeed(now.Get()); |
|
center = center0; |
double b = parameters.getB(); |
double a = parameters.getA(); |
_d = parameters.getD(); |
n1 = parameters.getN1(); |
n2 = parameters.getN2(); |
// if PlateOn, then n0 = n3 (optical grease), else = n1 (air) |
//double n0 = (parameters.getPlateOn() ? parameters.getN3(): n1); |
double n0 = (parameters.getPlateOn() ? n2 : n1); |
n3 = parameters.getN3(); |
_r = c_reflectivity; |
double n0 = (parameters.getPlateOn() ? _n2 : _n1); |
int fresnel = parameters.getFresnel(); |
|
// light guide edges |
617,16 → 619,28 |
for(int i = 0; i<8; i++) vodnik_edge[i] += center; |
|
// light guide surfaces |
s_side[0] = new CSurface(SURF_REFRA, vodnik_edge, n0, n2, _r); |
s_side[0] = new CSurface(SURF_REFRA, vodnik_edge, n0, _n2, _r); |
s_side[0]->FlipN(); |
|
s_side[1] = new CSurface(SURF_REFRA, vodnik_edge[3], vodnik_edge[2], vodnik_edge[6], vodnik_edge[7], n2, n1, _r); |
s_side[2] = new CSurface(SURF_REFRA, vodnik_edge[2], vodnik_edge[1], vodnik_edge[5], vodnik_edge[6], n2, n1, _r); |
s_side[3] = new CSurface(SURF_REFRA, vodnik_edge[1], vodnik_edge[0], vodnik_edge[4], vodnik_edge[5], n2, n1, _r); |
s_side[4] = new CSurface(SURF_REFRA, vodnik_edge[0], vodnik_edge[3], vodnik_edge[7], vodnik_edge[4], n2, n1, _r); |
|
s_side[5] = new CSurface(SURF_REFRA, &vodnik_edge[4], n2, n3, _r); // n3 - ref ind at the exit, grease, air, epoxy |
s_side[1] = new CSurface(SURF_REFRA, vodnik_edge[3], vodnik_edge[2], |
vodnik_edge[6], vodnik_edge[7], _n2, _n1, _r); |
s_side[2] = new CSurface(SURF_REFRA, vodnik_edge[2], vodnik_edge[1], |
vodnik_edge[5], vodnik_edge[6], _n2, _n1, _r); |
s_side[3] = new CSurface(SURF_REFRA, vodnik_edge[1], vodnik_edge[0], |
vodnik_edge[4], vodnik_edge[5], _n2, _n1, _r); |
s_side[4] = new CSurface(SURF_REFRA, vodnik_edge[0], vodnik_edge[3], |
vodnik_edge[7], vodnik_edge[4], _n2, _n1, _r); |
// n3 - ref ind at the exit, grease, air |
s_side[5] = new CSurface(SURF_REFRA, &vodnik_edge[4], _n2, _n3, _r); |
s_side[5]->FlipN(); |
// exit surface in the case of bad coupling |
noCoupling = new CSurface(SURF_REFRA, &vodnik_edge[4], _n2, 1.0, _r); |
noCoupling->FlipN(); |
// grease = specific pattern area of coupling |
TVector3 activePosition(center); |
activePosition += TVector3(_d, 0, 0); |
TVector3 normal(1,0,0); |
grease = new CPlaneR(activePosition, normal, a/2.0); |
|
if(fresnel) for(int i=0; i<6; i++) s_side[i]->SetFresnel(1); |
|
643,20 → 657,17 |
(hfate->GetXaxis())->SetBinLabel(8, "Absorb"); |
|
hnodb_all = (TH1F*)gROOT->FindObject("hnodb_all"); if(hnodb_all) delete hnodb_all; |
hnodb_all = new TH1F("hnodb_all", "N reflected", MAX_REFLECTIONS, -0.5, MAX_REFLECTIONS-0.5); |
hnodb_all = new TH1F("hnodb_all", "", MAX_REFLECTIONS, -0.5, MAX_REFLECTIONS-0.5); |
|
hnodb_exit = (TH1F*)gROOT->FindObject("hnodb_exit"); if(hnodb_exit) delete hnodb_exit; |
hnodb_exit = new TH1F("hnodb_exit", "N reflected and exit", MAX_REFLECTIONS, -0.5, MAX_REFLECTIONS-0.5); |
hnodb_exit = new TH1F("hnodb_exit", "", MAX_REFLECTIONS, -0.5, MAX_REFLECTIONS-0.5); |
|
int nBins = nch + 1; |
hin = (TH2F*)gROOT->FindObject("hin"); if(hin) delete hin; |
hin = new TH2F("hin", "Guide entrance window", nBins, -b/2.0, +b/2.0, nBins, -b/2.0, +b/2.0); |
hin = new TH2F("hin", ";x [mm]; y[mm]", nBins, -b/2.0, +b/2.0, nBins, -b/2.0, +b/2.0); |
|
hout = (TH2F*)gROOT->FindObject("hout"); if(hout) delete hout; |
hout = new TH2F("hout", "Guide exit window", nBins, -a/2.0, +a/2.0, nBins, -a/2.0, +a/2.0); |
|
absorption = 0; |
A = 0; |
hout = new TH2F("hout", ";x [mm];y [mm]", nBins, -a/2.0, +a/2.0, nBins, -a/2.0, +a/2.0); |
} |
//----------------------------------------------------------------------------- |
// Sledi zarku skozi vodnik. Vrne: |
670,6 → 681,8 |
Fate Guide::PropagateRay(CRay in, CRay *out, int *n_points, TVector3 *points) |
{ |
if (dbg) printf("--- GUIDE::PropagateRay ---\n"); |
// ray0 - incident ray |
// ray1 - trans/refl ray |
CRay ray0; |
CRay ray1; |
TVector3 vec0, vec1; |
723,24 → 736,22 |
|
if (dbg) printf(" GUIDE: surface = %d, propagation = %d\n", inters_i, propagation); |
|
if(propagation == REFRACTION) { |
fate = refracted; |
n_odb++; |
points[n_odb] = vec1; |
ray0 = ray1; |
break; |
} // no total reflection when should be |
|
if(propagation == ABSORBED) { |
fate = noreflection; |
break; |
} //refraction due to finite reflectivity |
|
if(inters_i == 5) { // successfull exit |
if(inters_i == 5) { |
if (_badCoupling) { |
TVector3 hitVector(0,0,0); |
bool hitActive = grease->TestIntersection(&hitVector, ray0); |
if (hitActive and dbg) printf(" GUIDE: hit grease\n"); |
if (!hitActive) propagation = noCoupling->PropagateRay(ray0, &ray1, &vec1); |
} |
// check on which side the vector is? |
TVector3 ray = ray1.GetN(); |
TVector3 exitNormal = s_side[5]->GetN(); |
//printf("theta(ray) = %lf, theta(normal5) = %lf ", ray.Theta()*DEGREE, exitNormal.Theta()*DEGREE); |
//printf("phi(ray) = %lf, phi(normal5) = %lf\n", ray.Phi()*DEGREE, exitNormal.Phi()*DEGREE); |
if (dbg) printf("ray*n_5 = %lf\n", ray*exitNormal); |
if (ray*exitNormal > 0) { |
if (dbg) printf(" GUIDE: ray is backreflected from exit window.\n"); |
758,22 → 769,31 |
ray0 = ray1; |
break; |
} |
|
if(propagation == REFRACTION) { |
fate = refracted; |
n_odb++; |
points[n_odb] = vec1; |
ray0 = ray1; |
break; |
} // no total reflection when should be |
|
last_hit = inters_i; |
} |
} |
|
//--- material absorption --- |
if(absorption) { |
if(_absorption) { |
double travel = 0.0; |
printf("n_odb = %d\n", n_odb); //dbg |
if (dbg) printf("n_odb = %d\n", n_odb); |
for(int point = 0; point < n_odb-1; point++) { |
travel += (points[point] - points[point+1]).Mag(); |
printf("travel = %lf\n", travel); //dbg |
if (dbg) printf("travel = %lf\n", travel); |
} |
double T_abs = TMath::Exp(-travel/A); |
printf("T_abs = %lf\n", T_abs); //dbg |
double T_abs = TMath::Exp(-travel/_A); |
if(dbg)printf("T_abs = %lf\n", T_abs); |
double p_abs = rand.Uniform(0.0, 1.0); |
printf("p_abs = %lf\n", p_abs); //dbg |
if(dbg)printf("p_abs = %lf\n", p_abs); |
|
if(p_abs > T_abs) fate = absorbed; // absorption |
} |
876,12 → 896,6 |
center(center0), |
glass_on(parameters.getGlassOn()), |
glass_d(parameters.getGlassD()), |
//x_gap(parameters.getGap().X()), |
//y_gap(parameters.getGap().Y()), |
//z_gap(parameters.getGap().Z()), |
//glass(new CSurface), |
//glass_circle(new CPlaneR), |
//active(new CPlane4), |
col_in(2), |
col_lg(8), |
col_out(4), |
890,8 → 904,6 |
col_glass(4), |
col_active(7), |
guide_on(parameters.getGuideOn()), |
//window_R( parameters.getB() ), |
//window_d(0), |
guide(new Guide(center0, parameters)), |
plate(new Plate(parameters)), |
_plateWidth(parameters.getPlateWidth()), |
909,8 → 921,6 |
if(guide_on) x_offset = center.x(); |
else x_offset = center.x() - d; |
|
//guide = new CVodnik(center, SiPM, M, d, type_in, type_side, type_out, n1, n2, n3, reflectivity, fresnel, absorption, A); |
|
double b = parameters.getB(); |
//double n1 = parameters.getN1(); |
//double n2 = parameters.getN2(); |
937,23 → 947,28 |
glass_circle = new CPlaneR(TVector3(x_offset+d+glass_d, y_gap, z_gap), TVector3(-1.0, 0.0, 0.0), b); |
|
hglass = (TH2F*)gROOT->FindObject("hglass"); if(hglass) delete hglass; |
hglass = new TH2F("hglass", "Hits glass", |
hglass = new TH2F("hglass", "", |
nBins, y_gap - p_size, y_gap + p_size, |
nBins, z_gap - p_size, z_gap + p_size); |
|
// SiPM active surface |
p_size = parameters.getActive()/2.0; |
//cout<<"SiPM active length "<<detectorActive<<endl; |
//p_size = 1.0/2.0; |
if (dbg) cout<<"SiPM active length "<<parameters.getActive()<<endl; |
|
plane_v[0].SetXYZ(x_offset+d+x_gap, y_gap + p_size, z_gap - p_size); |
plane_v[1].SetXYZ(x_offset+d+x_gap, y_gap + p_size, z_gap + p_size); |
plane_v[2].SetXYZ(x_offset+d+x_gap, y_gap - p_size, z_gap + p_size); |
plane_v[3].SetXYZ(x_offset+d+x_gap, y_gap - p_size, z_gap - p_size); |
active = new CPlane4(plane_v); |
//active surface in case of bad coupling is circle d=a |
TVector3 activePosition(center); |
activePosition += TVector3(d + x_gap, 0, 0); |
TVector3 normal(1,0,0); |
grease = new CPlaneR(activePosition, normal, 1.0*p_size); |
|
hactive = (TH2F*)gROOT->FindObject("hactive"); if(hactive) delete hactive; |
//hactive = new TH2F("hactive", "Active area hits", nBins, y_gap - p_size, y_gap + p_size, nBins, z_gap - p_size, z_gap + p_size); |
hactive = new TH2F("hactive", "Active area hits", nBins, y_gap - p_size + offsetY, y_gap + p_size + offsetY, nBins, z_gap - p_size + offsetZ, z_gap + p_size + offsetZ); |
hactive = new TH2F("hactive", ";x [mm];y [mm]", nBins, y_gap - p_size + offsetY, y_gap + p_size + offsetY, nBins, z_gap - p_size + offsetZ, z_gap + p_size + offsetZ); |
|
p_size = b/2.0; |
//p_size = 2.5; |
995,7 → 1010,6 |
// vrne 1 ce je zadel aktvino povrsino |
// vrne <1 ce jo zgresi |
int CDetector::Propagate(CRay in, CRay *out, int draw) |
|
// Sledi zarku skozi vodnik. Vrne: |
// 0, ce zgresi vstopno ploskev MISSED |
// 1, ce zadane izstopno ploskev HIT |