13 std::cout <<
"LArFanSections at " <<
this << std::endl
14 <<
"Amin = " <<
Amin <<
", Amax = " <<
Amax
16 <<
"Bmin = " <<
Bmin <<
", Bmax = " <<
Bmax << std::endl
17 <<
"xmin = " <<
xmin <<
", xmax = " <<
xmax
18 <<
"Cflat2 = " <<
Cflat2 << std::endl;
22 G4double ri1, G4double ri2, G4double ro1, G4double ro2,
23 G4double Xmax, G4double z1, G4double z2
25 :
Amin ((ri2 - ri1) / (z2 - z1)),
26 Amax ((ro2 - ro1) / (z2 - z1)),
42 G4double &t1, G4double
A, G4double B, G4double
C, G4bool out
48 const G4double D = B*B -
A*
C;
49 LWSDBG(8, std::cout <<
"check D=" << D <<
" out=" << out << std::endl);
50 if(D < 0.)
return false;
54 LWSDBG(8, std::cout <<
"Case A=B=0" << std::endl);
58 LWSDBG(8, std::cout <<
"t1=" << t1 <<
" - only one solution" << std::endl);
61 const G4double D1 = sqrt(D);
62 const G4double inv_A = 1.0 /
A;
63 t1 = (-B + D1) * inv_A;
64 t2 = (-B - D1) * inv_A;
65 LWSDBG(8, std::cout <<
"t1=" << t1 <<
" t2=" << t2 << std::endl);
104 const G4ThreeVector &p,
const G4ThreeVector &v,
105 G4ThreeVector &q)
const
107 LWSDBG(7, std::cout <<
"fcl" << std::endl);
108 const G4double
A = v.perp2() -
m_fs->Amin2*v.z()*v.z();
109 const G4double B = p.x()*v.x() + p.y()*v.y()
110 -
m_fs->Amin2*p.z()*v.z() -
m_fs->ABmin*v.z();
111 const G4double
C = p.perp2() -
m_fs->Amin2*p.z()*p.z()
112 - 2.*
m_fs->ABmin*p.z() -
m_fs->Bmin2;
115 const G4double out_dist =
m_fs->Amin*p.z() +
m_fs->Bmin - p.perp();
116 LWSDBG(8, std::cout <<
"fcl out_dist(p)=" << out_dist <<
" Tolerance=" <<
s_Tolerance << std::endl);
117 const G4bool out = out_dist >= 0.0;
119 const G4double zz1 = p.z() + v.z() * t1;
121 LWSDBG(8, std::cout <<
"fcl out on Z " << zz1 << std::endl);
124 const G4double xx1 = p.x() + v.x() * t1;
125 if(xx1 < m_fs->
xmin || xx1 >
m_fs->xmax){
126 LWSDBG(8, std::cout <<
"fcl out on X " << xx1 << std::endl);
137 const G4double xx2 = p.x() + v.x() * t1 * 0.5;
138 const G4double yy2 = p.y() + v.y() * t1 * 0.5;
139 const G4double dev = fabs(sqrt(xx2 *xx2 + yy2*yy2)
140 -
m_fs->Amin*(p.z() + zz1)*0.5
143 LWSDBG(8, std::cout <<
"fcl on the surface" << std::endl);
146 LWSDBG(8, std::cout <<
"fcl out = in" << std::endl);
152 q.setY(p.y() + v.y() * t1);
154 LWSDBG(8, std::cout <<
"fcl got " << t1 << std::endl);
157 LWSDBG(8, std::cout <<
"fcl no intersection" << std::endl);
166 const G4ThreeVector &p,
const G4ThreeVector &v,
167 G4ThreeVector &q)
const
169 LWSDBG(7, std::cout <<
"fcu" << std::endl);
170 G4double
A = v.perp2();
171 G4double B = p.x()*v.x() + p.y()*v.y();
172 G4double
C = p.perp2();
175 const G4double &Af =
A, &Bf = B;
176 const G4double Cf =
C -
m_fs->Cflat2;
179 if(
check_D(b1, Af, Bf, Cf, Cf >= 0.)){
180 const G4double zz1 = p.z() + v.z() * b1;
182 const G4double xx1 = p.x() + v.x() * b1;
183 if(xx1 < m_fs->
xmin || xx1 >
m_fs->xmax)
return false;
185 q.setY(p.y() + v.y() * b1);
190 LWSDBG(8, std::cout <<
"fcu no cyl intersection" << std::endl);
193 A -=
m_fs->Amax2*v.z()*v.z();
194 B -=
m_fs->Amax2*p.z()*v.z() +
m_fs->ABmax*v.z();
195 C -=
m_fs->Amax2*p.z()*p.z() + 2.*
m_fs->ABmax*p.z() +
m_fs->Bmax2;
198 const G4bool out =
m_fs->Amax*p.z() +
m_fs->Bmax <= p.perp();
200 const G4double zz1 = p.z() + v.z() * t1;
201 LWSDBG(8, std::cout <<
"fcu z = " << zz1 <<
", lim: (" <<
m_Zsect.front() <<
", " <<
m_Zmid <<
")" << std::endl);
203 const G4double xx1 = p.x() + v.x() * t1;
204 LWSDBG(8, std::cout <<
"fcu x = " << xx1 <<
", lim: (" <<
m_fs->xmin <<
", " <<
m_fs->xmax <<
")" << std::endl);
205 if(xx1 < m_fs->
xmin || xx1 >
m_fs->xmax)
return false;
207 q.setY(p.y() + v.y() * t1);
211 LWSDBG(8, std::cout <<
"fcu no cone intersection" << std::endl);
217 const G4ThreeVector &p,
const G4ThreeVector &v,
218 G4ThreeVector &q)
const
220 LWSDBG(6, std::cout <<
"in fep p" << MSG_VECTOR(p)<<
", v"<< MSG_VECTOR(v) <<
", q" << MSG_VECTOR(q) << std::endl);
228 LWSDBG(6, std::cout <<
"after fs_cross_lower q" << MSG_VECTOR(q) << std::endl);
230 LWSDBG(6, std::cout <<
"after fs_cross_upper q" << MSG_VECTOR(q) << std::endl);
234 if(v.x() > 0.) d = (
m_fs->xmax - p.x()) / v.x();
235 else if(v.x() < 0.) d = (
m_fs->xmin - p.x()) / v.x();
241 dz = (
m_Zsect.back() - p.z()) / v.z();
243 }
else if(v.z() < 0.){
244 dz = (
m_Zsect.front() - p.z()) / v.z();
254 LWSDBG(7, std::cout <<
"fep side " << d <<
" " <<
result <<
" q" << MSG_VECTOR(q) << std::endl);
255 const G4double out_distlower =
m_fs->Amin*q.z() +
m_fs->Bmin - q.perp();
256 LWSDBG(7, std::cout <<
"fep out_distlower(q)=" << out_distlower <<
" Tolerance=" <<
s_Tolerance << std::endl);
257 if (out_distlower >= 0.0) {
269 const G4double out_distupper =
m_fs->Amax*q.z() +
m_fs->Bmax - q.perp();
270 LWSDBG(7, std::cout <<
"fep out_distupper(q)=" << out_distupper <<
" Tolerance=" <<
s_Tolerance << std::endl);
271 if (out_distupper <= 0.0) {
277 assert((q - p).
mag() < kInfinity);
Scalar mag() const
mag method
LArFanSections(G4double ri1, G4double ri2, G4double ro1, G4double ro2, G4double Xmax, G4double z1, G4double z2)
G4bool fs_cross_lower(const G4ThreeVector &p, const G4ThreeVector &v, G4ThreeVector &q) const
static const G4double s_Tolerance
std::vector< G4double > m_Zsect
FanBoundExit_t find_exit_point(const G4ThreeVector &p, const G4ThreeVector &v, G4ThreeVector &q) const
G4bool fs_cross_upper(const G4ThreeVector &p, const G4ThreeVector &v, G4ThreeVector &q) const
G4bool check_D(G4double &b, G4double A, G4double B, G4double C, G4bool) const
hold the test vectors and ease the comparison