50 double maxOpenAngle = atan(radius / distance);
52 if (absorbCoeff > 0) {
53 func =
new TF1(
"SolidAttenuationFunc",
54 "((x==0)*1 + (x>0)*(1-exp(-[1]*(([2]-[3]*sin(x))/sin(x)))))*"
55 "ROOT::Math::legendre([0], cos(x)) * sin(x)",
57 func->SetParameter(2, radius);
58 func->SetParameter(3, distance);
59 func->SetParameter(1, absorbCoeff);
61 func =
new TF1(
"SolidAttenuationFunc",
"ROOT::Math::legendre([0], cos(x)) * sin(x)", 0, maxOpenAngle);
64 func->SetParameter(0, 0);
66 J0 = func->Integral(0, maxOpenAngle);
68 this->Qk.push_back(1.);
69 for (
int ik = 1; ik <= kmax; ++ik) {
70 func->SetParameter(0, ik);
71 this->Qk.push_back(func->Integral(0, maxOpenAngle) / J0);
89 this->Qk.push_back(1.);
95 for (
int k=1; k<=kmax; ++k) {
106 B[0] = std::atan2(inner_radius, distance+length);
107 B[1] = std::atan2(inner_radius, distance);
108 B[2] = std::atan2(outer_radius, distance+length);
109 B[3] = std::atan2(outer_radius, distance);
110 for(
int n=0; n<2; n++) {
112 if(k==0 && N==2)
break;
113 int KA = int(k) * (2 - int(N)) + 1;
114 for(
int j=0; j<3; j++) {
117 double YU = B[j + 1];
118 double DL = (YU - YL) / 100.;
119 for(
int m=0; m<101; m++) {
122 double XM = YL + DL * (M - 1);
126 EX = TAU * ( inner_radius - (distance + length) * std::tan(XM) ) / std::sin(XM);
129 EX = -TAU * length / std::cos(XM);
132 EX = TAU * ( distance * std::tan(XM) - outer_radius) / std::sin(XM);
135 F[m] = std::sin(XM) * (1. - std::exp(EX));
136 if(J==1) F[m] *= std::exp(-TAU * ( inner_radius / std::sin(XM) - distance / std::cos(XM)));
137 F[m] *= ROOT::Math::legendre(KA-1, std::cos(XM));
144 this->Qk.push_back(Qk);