source: trunk/source/geometry/solids/CSG/test/testG4Sphere.cc@ 1323

Last change on this file since 1323 was 1316, checked in by garnier, 15 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 47.1 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26
27// $Id: testG4Sphere.cc,v 1.29 2009/05/14 13:22:44 tnikitin Exp $
28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
29//
30// G4Sphere Test File
31//
32// o Basic asserts on each function +
33// awkward cases for tracking / geom algorithms
34//
35// o Add tests on dicovering bugs in G4Sphere.cc...
36//
37// History:
38// 28.03.95 P.Kent Initial version
39// 20.10.96 V.Grichine Final modifications to commit
40
41#include "G4ios.hh"
42#include <assert.h>
43#include <cmath>
44#include "globals.hh"
45#include "geomdefs.hh"
46
47#include "ApproxEqual.hh"
48#include "G4GeometryTolerance.hh"
49
50#include "G4ThreeVector.hh"
51#include "G4RotationMatrix.hh"
52#include "G4AffineTransform.hh"
53#include "G4VoxelLimits.hh"
54#include "G4Sphere.hh"
55#include "Randomize.hh"
56
57//const G4double kApproxEqualTolerance = kCarTolerance;
58
59// Return true if the double check is approximately equal to target
60//
61// Process:
62//
63// Return true is difference < kApproxEqualTolerance
64
65//G4bool ApproxEqual(const G4double check,const G4double target)
66//{
67// return (std::fabs(check-target)<kApproxEqualTolerance) ? true : false ;
68//}
69
70// Return true if the 3vector check is approximately equal to target
71//G4bool ApproxEqual(const G4ThreeVector& check, const G4ThreeVector& target)
72//{
73// return (ApproxEqual(check.x(),target.x())&&
74// ApproxEqual(check.y(),target.y())&&
75// ApproxEqual(check.z(),target.z()))? true : false;
76//}
77
78///////////////////////////////////////////////////////////////////
79//
80// Dave's auxiliary function
81
82const G4String OutputInside(const EInside a)
83{
84 switch(a)
85 {
86 case kInside: return "Inside";
87 case kOutside: return "Outside";
88 case kSurface: return "Surface";
89 }
90 return "????";
91}
92
93
94
95int main(void)
96{
97 G4double kAngTolerance = G4GeometryTolerance::GetInstance()->GetAngularTolerance();
98
99 G4int i, iMax;
100 G4double Dist, vol, volCheck;
101 G4double phi, cosTheta, sinTheta, rMax, rRand, zP;
102
103 G4ThreeVector pzero(0,0,0),px(30,0,0),py(0,30,0),pz(0,0,30);
104 G4ThreeVector pmx(-30,0,0),pmy(0,-30,0),pmz(0,0,-30);
105 G4ThreeVector pbigx(100,0,0),pbigy(0,100,0),pbigz(0,0,100);
106 G4ThreeVector pbigmx(-100,0,0),pbigmy(0,-100,0),pbigmz(0,0,-100);
107
108 G4ThreeVector ponrmin1(45,0,0),ponrmax1(50,0,0),ponzmax(0,0,50),
109 ponrmin2(45/std::sqrt(2.),45/std::sqrt(2.),0),
110 ponrmin3(0,0,-45),ponrminJ(0,0,-300),ponrmaxJ(0,0,-500),
111 ponrmax2(50/std::sqrt(2.),50/std::sqrt(2.),0);
112 G4ThreeVector ponphi1(48/std::sqrt(2.),-48/std::sqrt(2.),0),
113 ponphi2(48/std::sqrt(2.),48/std::sqrt(2.),0),
114 pInPhi(48*0.866,-24,0),
115 pOverPhi(-48/std::sqrt(2.),48/std::sqrt(2.),0);
116 G4ThreeVector pontheta1(0,48*std::sin(pi/4),48*std::cos(pi/4)),
117 pontheta2(0,48*std::sin(pi/4),-48*std::cos(pi/4));
118
119 G4ThreeVector ptestphi1(-100,-45/std::sqrt(2.),0),
120 ptestphi2(-100,45/std::sqrt(2.),0);
121
122 G4ThreeVector ptesttheta1(0,48/std::sqrt(2.),100),
123 ptesttheta2(0,48/std::sqrt(2.),-100);
124
125 // Directions
126
127 G4ThreeVector vx(1,0,0),vy(0,1,0),vz(0,0,1);
128 G4ThreeVector vmx(-1,0,0),vmy(0,-1,0),vmz(0,0,-1);
129 G4ThreeVector vxy(1/std::sqrt(2.),1/std::sqrt(2.),0),vmxmy(-1/std::sqrt(2.),-1/std::sqrt(2.),0);
130 G4ThreeVector vxmy(1/std::sqrt(2.),-1/std::sqrt(2.),0),vmxy(-1/std::sqrt(2.),1/std::sqrt(2.),0);
131 G4ThreeVector vxmz(1/std::sqrt(2.),0.,-1/std::sqrt(2.)),vymz(0.,1/std::sqrt(2.),-1/std::sqrt(2.));
132 G4ThreeVector vmxmz(-1/std::sqrt(2.),0.,-1/std::sqrt(2.)),vmxz(-1/std::sqrt(2.),0.,1/std::sqrt(2.));
133
134 G4ThreeVector v345exit1(-0.8,0.6,0),v345exit2(0.8,0.6,0),
135 v345exit3(0.6,0.8,0);
136
137
138
139
140
141 G4ThreeVector pRand, vRand, norm, *pNorm;
142 G4bool *pgoodNorm,goodNorm,calcNorm=true;
143
144 pNorm=&norm;
145 pgoodNorm=&goodNorm;
146
147 G4Sphere s1("Solid G4Sphere",0,50,0,twopi,0,pi);
148 G4Sphere sn1("sn1",0,50,halfpi,3.*halfpi,0,pi);
149
150 // Theta sections
151
152 G4Sphere sn11("sn11",0,50,0,twopi,0.,halfpi);
153 G4Sphere sn12("sn12",0,50,0,twopi,0.,0.25*pi);
154 G4Sphere sn13("sn13",0,50,0,twopi,0.75*pi,0.25*pi);
155 G4Sphere sn14("sn14",0,50,0,twopi,0.25*pi,0.75*pi);
156 G4Sphere sn15("sn15",0,50,0,twopi,89.*deg,91.*deg);
157 G4Sphere sn16("sn16",0,50,0,twopi,0.*deg,89.*deg);
158 G4Sphere sn17("sn17",0,50,0,twopi,91.*deg,89.*deg);
159
160 G4Sphere s2("Spherical Shell",45,50,0,twopi,0,pi);
161 G4Sphere sn2("sn2",45,50,halfpi,halfpi,0,pi);
162 G4Sphere sn22("sn22",0,50,halfpi,halfpi,0,pi);
163
164
165
166 G4Sphere s3("Band (theta segment)",45,50,0,twopi,pi/4,halfpi);
167 G4Sphere s32("Band (theta segment2)",45,50,0,twopi,0,pi/4);
168 G4Sphere s33("Band (theta segment1)",45,50,0,twopi,pi*3/4,pi/4);
169 G4Sphere s34("Band (theta segment)",4,50,0,twopi,pi/4,halfpi);
170 G4Sphere s4("Band (phi segment)",45,50,-pi/4,halfpi,0,twopi);
171 // G4cout<<"s4.fSPhi = "<<s4.GetSPhi()<<G4endl;
172 G4Sphere s41("Band (phi segment)",5,50,-pi,3.*pi/2.,0,twopi);
173 G4Sphere s42("Band (phi segment)",5,50,-pi/2,3.*pi/2.,0,twopi);
174 G4Sphere s5("Patch (phi/theta seg)",45,50,-pi/4,halfpi,pi/4,halfpi);
175
176 G4Sphere s6("John example",300,500,0,5.76,0,pi) ;
177 G4Sphere s7("sphere7",1400.,1550.,0.022321428571428572,0.014642857142857141,
178 1.5631177553663251,0.014642857142857141 );
179 G4Sphere s8("sphere",278.746*mm, 280.0*mm, 0.0*degree, 360.0*degree,
180 0.0*degree, 90.0*degree);
181
182 G4Sphere b216("b216", 1400.0, 1550.0,
183 0.022321428571428572,
184 0.014642857142857141,
185 1.578117755366325,
186 0.014642857142867141);
187
188
189
190 G4Sphere s9("s9",0*mm,410*mm,0*degree,360*degree,90*degree,90*degree);
191
192 G4Sphere b402("b402", 475*mm, 480*mm,
193 0*degree,360*degree,17.8*degree,144.4*degree);
194
195 G4Sphere b1046("b1046", 4750*km, 4800*km,
196 0*degree,360*degree,0*degree,90*degree);
197
198
199
200G4ThreeVector p402(471.7356120367253*mm, 51.95081450791341*mm, 5.938043020529463*mm);
201G4ThreeVector v402(-0.519985502840818, 0.2521089719986221, 0.8161226274728446);
202
203
204
205G4ThreeVector p216(1549.9518578505142,1.2195415370970153,-12.155289555510985),
206 v216(-0.61254821852534425,-0.51164551429243466,-0.60249775741147549);
207
208
209G4ThreeVector s9p(384.8213314370455*mm,
210 134.264386151667*mm,
211 -44.56026800002064*mm);
212
213G4ThreeVector s9v(-0.6542770611918751,
214 -0.0695116921641141,
215 -0.7530535517814154);
216
217 G4Sphere s10("s10",0*mm,0.018*mm,0*degree,360*degree,0*degree,180*degree);
218
219 G4ThreeVector s10p(0.01160957408065766*mm,
220 0.01308205826682229*mm,0.004293345210644617*mm);
221
222 G4Sphere s11("s11",5000000.*mm,
223 3700000000.*mm,
224 0*degree,360*degree,0*degree,180*degree);
225
226 // G4ThreeVector ps11(-1184000000.*mm,-3477212676.843337059*mm,-444000000.*mm);
227
228 // G4ThreeVector ps11( -3339032195.112830162*mm, -1480000000*mm, -592000000*mm );
229
230 G4ThreeVector ps11( -3072559844.81995153427124*mm, -1924000000*mm, -740000000*mm );
231
232 G4Sphere sAlex("sAlex",500.*mm,
233 501.*mm,
234 0*degree,360*degree,0*degree,180*degree);
235
236 G4ThreeVector psAlex(-360.4617031263808*mm,
237 -158.1198807105035*mm,308.326878333183*mm);
238
239 G4ThreeVector vsAlex(-0.7360912456240805,-0.4955800202572754,0.4610532741813497 );
240
241
242 G4Sphere sLHCB("sLHCB",8600*mm, 8606*mm,
243 -1.699135525184141*degree,
244 3.398271050368263*degree,88.52855940538514*degree,2.942881189229715*degree );
245
246 G4ThreeVector pLHCB(8600.242072535835,-255.1193517702246,-69.0010277128286);
247
248
249
250 G4Sphere b658("b658", 209.6*mm, 211.2658*mm,
251 0.0*degree, 360*degree, 0.0*degree, 90*degree);
252
253
254 G4ThreeVector p658(-35.69953348982516*mm, 198.3183279249958, 56.30959457033987 );
255 G4ThreeVector v658(-.2346058124516908,-0.9450502890785083,0.2276841318065671);
256
257
258 G4Sphere spAroundX("SpAroundX", 10.*mm, 1000.*mm, -1.0*degree,
259 2.0*degree,
260 0.*degree, 180.0*degree );
261
262 G4double radOne = 100.0*mm;
263 G4double angle = -1.0*degree - 0.25*kAngTolerance;
264 G4ThreeVector ptPhiMinus= G4ThreeVector( radOne*std::cos(angle) ,
265 radOne*std::sin(angle),
266 0.0 );
267
268 // spheres for theta cone intersections
269
270 G4Sphere s13("Band (theta segment)",5,50,0,twopi,pi/6.,halfpi);
271 G4Sphere s14("Band (theta segment)",5,50,0,twopi,pi/3.,halfpi);
272
273
274 // b. 830
275
276 G4double mainInnerRadius = 21.45 * cm ;
277 G4double mainOuterRadius = 85.0 * cm ;
278 G4double minTheta = 18.0 * degree ;
279
280
281
282
283 G4Sphere sb830( "mainSp",
284 mainInnerRadius,
285 mainOuterRadius,
286 0.0, M_PI*2,
287 minTheta,
288 M_PI - 2*minTheta);
289
290
291G4ThreeVector pb830(81.61117212,-27.77179755,196.4143423);
292 G4ThreeVector vb830(0.1644697995,0.18507236,0.9688642354);
293
294#ifdef NDEBUG
295 G4Exception("FAIL: *** Assertions must be compiled in! ***");
296#endif
297
298 G4cout.precision(20);
299
300 //////////////// Check name /////////////////////////
301
302 assert(s1.GetName()=="Solid G4Sphere");
303
304 // check cubic volume
305
306 vol = s1.GetCubicVolume();
307 volCheck = 4*pi*125000/3;
308
309 assert( ApproxEqual(vol,volCheck));
310
311 assert(ApproxEqual(s1.GetCubicVolume(),4*pi*125000/3));
312
313
314 // Some user application cases
315
316 Dist = s4.DistanceToOut(ponrmin3,vmz,calcNorm,pgoodNorm,pNorm) ;
317 // G4cout<<"s4.DistanceToOut(ponrmin3,vmz,calcNorm,pgoodNorm,pNorm) = "<<Dist
318 // <<G4endl ;
319 Dist = s6.DistanceToOut(ponrminJ,vmz,calcNorm,pgoodNorm,pNorm) ;
320 // G4cout<<"s6.DistanceToOut(ponrminJ,vmz,calcNorm,pgoodNorm,pNorm) = "<<Dist
321 // <<G4endl ;
322 Dist = s6.DistanceToOut(ponrmaxJ,vmz,calcNorm,pgoodNorm,pNorm) ;
323 // G4cout<<"s6.DistanceToOut(ponrmaxJ,vmz,calcNorm,pgoodNorm,pNorm) = "<<Dist
324 // <<G4endl ;
325
326 Dist = s7.DistanceToOut(G4ThreeVector(1399.984667238032,
327 5.9396696802500299,
328 -2.7661927818688308),
329 G4ThreeVector(0.50965504781062942,
330 -0.80958849145715217,
331 0.29123565499656401),
332 calcNorm,pgoodNorm,pNorm) ;
333 // G4cout<<"s7.DistanceToOut(shereP,sphereV,calcNorm,pgoodNorm,pNorm) = "<<Dist
334 // <<G4endl ;
335
336 Dist = s7.DistanceToIn(G4ThreeVector(1399.984667238032,
337 5.9396696802500299,
338 -2.7661927818688308),
339 G4ThreeVector(0.50965504781062942,
340 -0.80958849145715217,
341 0.29123565499656401)) ;
342 // G4cout<<"s7.DistanceToIn(shereP,sphereV,calcNorm,pgoodNorm,pNorm) = "<<Dist
343 // <<G4endl ;
344
345
346
347// Check G4Sphere::Inside
348
349 EInside inside = s7.Inside(G4ThreeVector(1399.984667238032,
350 5.9396696802500299,
351 -2.7661927818688308) ) ;
352 // G4cout<<"s7.Inside(G4ThreeVector(1399.98466 ... = "
353 // <<OutputInside(inside)<<G4endl ;
354
355 inside = s8.Inside(G4ThreeVector(-249.5020724528353*mm,
356 26.81253142743162*mm,
357 114.8988524453591*mm ) ) ;
358 // G4cout<<"s8.Inside(G4ThreeVector(-249.5020 ... = "<<OutputInside(inside)<<G4endl ;
359 inside = b216.Inside(p216);
360 // G4cout<<"b216.Inside(p216) = "<<OutputInside(inside)<<G4endl ;
361 inside = s1.Inside(pz);
362 // G4cout<<"s1.Inside(pz) = "<<OutputInside(inside)<<G4endl ;
363
364 inside = s9.Inside(s9p);
365 // G4cout<<"s9.Inside(s9p) = "<<OutputInside(inside)<<G4endl ;
366
367 inside = b402.Inside(p402);
368 // G4cout<<"p402.Inside(p402) = "<<OutputInside(inside)<<G4endl ;
369
370 inside = s10.Inside(s10p);
371 // G4cout<<"s10.Inside(s10p) = "<<OutputInside(inside)<<G4endl ;
372 // G4cout<<"p radius = "<<s10p.mag()<<G4endl ;
373
374 inside = s11.Inside(ps11);
375 // G4cout<<"s11.Inside(ps11) = "<<OutputInside(inside)<<G4endl ;
376 // G4cout<<"ps11.mag() = "<<ps11.mag()<<G4endl ;
377
378 inside = sLHCB.Inside(pLHCB);
379 // G4cout<<"sLHCB.Inside(pLHCB) = "<<OutputInside(inside)<<G4endl ;
380 // G4cout<<"pLHCB.mag() = "<<pLHCB.mag()<<G4endl ;
381
382 inside = spAroundX.Inside(ptPhiMinus);
383 // G4cout<<"spAroundX.Inside(ptPhiMinus) = "<<OutputInside(inside)<<G4endl ;
384 inside = b658.Inside(p658);
385 G4cout<<"b658.Inside(p658) = "<<OutputInside(inside)<<G4endl ;
386
387 assert(s1.Inside(pzero)==kInside);
388 // assert(s1.Inside(pz)==kInside);
389 assert(s2.Inside(pzero)==kOutside);
390 assert(s2.Inside(ponrmin2)==kSurface);
391 assert(s2.Inside(ponrmax2)==kSurface);
392 assert(s3.Inside(pontheta1)==kSurface);
393 assert(s3.Inside(pontheta2)==kSurface);
394 assert(s4.Inside(ponphi1)==kSurface);
395 assert(s4.Inside(ponphi1)==kSurface);
396 assert(s4.Inside(pOverPhi)==kOutside);
397 assert(s4.Inside(pInPhi)==kInside);
398 assert(s5.Inside(pbigz)==kOutside);
399
400 assert(s41.Inside(pmx)==kSurface);
401 assert(s42.Inside(pmx)==kSurface);
402
403// Checking G4Sphere::SurfaceNormal
404 G4double p2=1./std::sqrt(2.),p3=1./std::sqrt(3.);
405
406
407 norm=sn1.SurfaceNormal(G4ThreeVector(0.,0.,50.));
408 assert(ApproxEqual(norm,G4ThreeVector(p3,p3,p3)));
409 norm=sn1.SurfaceNormal(G4ThreeVector(0.,0.,0.));
410 assert(ApproxEqual(norm,G4ThreeVector(p2,p2,0.)));
411
412 norm=sn11.SurfaceNormal(G4ThreeVector(0.,0.,0.));
413 assert(ApproxEqual(norm,G4ThreeVector(0.,0.,-1.)));
414 norm=sn12.SurfaceNormal(G4ThreeVector(0.,0.,0.));
415 assert(ApproxEqual(norm,G4ThreeVector(0.,0.,-1.)));
416 norm=sn13.SurfaceNormal(G4ThreeVector(0.,0.,0.));
417 assert(ApproxEqual(norm,G4ThreeVector(0.,0.,1.)));
418
419 norm=sn2.SurfaceNormal(G4ThreeVector(-45.,0.,0.));
420 assert(ApproxEqual(norm,G4ThreeVector(p2,-p2,0.)));
421
422
423
424 norm=s1.SurfaceNormal(ponrmax1);
425 assert(ApproxEqual(norm,vx));
426
427// Checking G4Sphere::DistanceToOut(P)
428 Dist=s1.DistanceToOut(pzero);
429 assert(ApproxEqual(Dist,50));
430 Dist=s1.DistanceToOut(ponrmax1);
431 assert(ApproxEqual(Dist,0));
432
433// Checking G4Sphere::DistanceToOut(p,v)
434
435
436 Dist=s1.DistanceToOut(pz,vz,calcNorm,pgoodNorm,pNorm);
437 // G4cout<<"Dist=s1.DistanceToOut(pz,vz) = "<<Dist<<G4endl;
438 assert(ApproxEqual(Dist,20.));
439
440 Dist=s1.DistanceToOut(ponrmax1,vx,calcNorm,pgoodNorm,pNorm);
441 *pNorm=pNorm->unit();
442 assert(ApproxEqual(Dist,0)&&*pgoodNorm&&ApproxEqual(*pNorm,vx));
443
444 Dist=s2.DistanceToOut(ponrmin1,vx,calcNorm,pgoodNorm,pNorm);
445 *pNorm=pNorm->unit();
446 assert(ApproxEqual(Dist,5)&&*pgoodNorm&&ApproxEqual(*pNorm,vx));
447
448 Dist=s2.DistanceToOut(ponrmax2,vx,calcNorm,pgoodNorm,pNorm);
449 assert(ApproxEqual(Dist,0)&&*pgoodNorm&&ApproxEqual(*pNorm,vxy));
450
451 Dist=s1.DistanceToOut(pzero,vx,calcNorm,pgoodNorm,pNorm);
452 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vx)&&*pgoodNorm);
453 Dist=s1.DistanceToOut(pzero,vmx,calcNorm,pgoodNorm,pNorm);
454 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmx)&&*pgoodNorm);
455 Dist=s1.DistanceToOut(pzero,vy,calcNorm,pgoodNorm,pNorm);
456 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vy)&&*pgoodNorm);
457 Dist=s1.DistanceToOut(pzero,vmy,calcNorm,pgoodNorm,pNorm);
458 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmy)&&*pgoodNorm);
459 Dist=s1.DistanceToOut(pzero,vz,calcNorm,pgoodNorm,pNorm);
460 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vz)&&*pgoodNorm);
461 Dist=s1.DistanceToOut(pzero,vmz,calcNorm,pgoodNorm,pNorm);
462 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmz)&&*pgoodNorm);
463 Dist=s1.DistanceToOut(pzero,vxy,calcNorm,pgoodNorm,pNorm);
464 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vxy)&&*pgoodNorm);
465
466 Dist=s4.DistanceToOut(ponphi1,vx,calcNorm,pgoodNorm,pNorm);
467 //assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vmxmy)&&*pgoodNorm);
468 Dist=s4.DistanceToOut(ponphi2,vx,calcNorm,pgoodNorm,pNorm);
469 // assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vmxy)&&*pgoodNorm);
470 Dist=s3.DistanceToOut(pontheta1,vz,calcNorm,pgoodNorm,pNorm);
471 // assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vy)&&*pgoodNorm);
472 Dist=s32.DistanceToOut(pontheta1,vmz,calcNorm,pgoodNorm,pNorm);
473 //assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vmy)&&*pgoodNorm);
474 Dist=s32.DistanceToOut(pontheta1,vz,calcNorm,pgoodNorm,pNorm);
475 //assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vz)&&*pgoodNorm);
476 Dist=s1.DistanceToOut(pzero,vmz,calcNorm,pgoodNorm,pNorm);
477 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmz)&&*pgoodNorm);
478 Dist=s1.DistanceToOut(pzero,vxy,calcNorm,pgoodNorm,pNorm);
479 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vxy)&&*pgoodNorm);
480
481
482 Dist=s2.DistanceToOut(ponrmin1,vxy,calcNorm,pgoodNorm,pNorm);
483 // G4cout<<"Dist=s2.DistanceToOut(pormin1,vxy) = "<<Dist<<G4endl;
484
485 Dist=s2.DistanceToOut(ponrmax1,vmx,calcNorm,pgoodNorm,pNorm);
486 // G4cout<<"Dist=s2.DistanceToOut(ponxside,vmx) = "<<Dist<<G4endl;
487 Dist=s2.DistanceToOut(ponrmax1,vmxmy,calcNorm,pgoodNorm,pNorm);
488 // G4cout<<"Dist=s2.DistanceToOut(ponxside,vmxmy) = "<<Dist<<G4endl;
489 Dist=s2.DistanceToOut(ponrmax1,vz,calcNorm,pgoodNorm,pNorm);
490 // G4cout<<"Dist=s2.DistanceToOut(ponxside,vz) = "<<Dist<<G4endl;
491
492 // Dist=s2.DistanceToOut(pbigx,vx,calcNorm,pgoodNorm,pNorm);
493 // G4cout<<"Dist=s2.DistanceToOut(pbigx,vx) = "<<Dist<<G4endl;
494 // Dist=s2.DistanceToOut(pbigx,vxy,calcNorm,pgoodNorm,pNorm);
495 // G4cout<<"Dist=s2.DistanceToOut(pbigx,vxy) = "<<Dist<<G4endl;
496 // Dist=s2.DistanceToOut(pbigx,vz,calcNorm,pgoodNorm,pNorm);
497 // G4cout<<"Dist=s2.DistanceToOut(pbigx,vz) = "<<Dist<<G4endl;
498 //Test Distance for phi section
499 Dist=sn22.DistanceToOut(G4ThreeVector(0.,49.,0.),vmy,calcNorm,pgoodNorm,pNorm);
500 assert(ApproxEqual(Dist,49.));
501 Dist=sn22.DistanceToOut(G4ThreeVector(-45.,0.,0.),vx,calcNorm,pgoodNorm,pNorm);
502 assert(ApproxEqual(Dist,45.));
503 G4cout<<"Dist from Center ="<<sn22.DistanceToOut(G4ThreeVector(0.,49.,0),G4ThreeVector(0,-1,0))<<G4endl;
504 G4cout<<"Dist from Center ="<<sn22.DistanceToOut(G4ThreeVector(-45.,0.,0),G4ThreeVector(1,0,0))<<G4endl;
505
506 //
507 Dist=b216.DistanceToOut(p216,v216,calcNorm,pgoodNorm,pNorm);
508
509 // G4cout<<"b216.DistanceToOut(p216,v216,... = "<<Dist<<G4endl;
510
511 // call from outside
512 // Dist=sAlex.DistanceToOut(psAlex,vsAlex,calcNorm,pgoodNorm,pNorm);
513 // G4cout<<"sAlex.DistanceToOut(psAlex,vsAlex,... = "<<Dist<<G4endl;
514
515
516 // Dist=s9.DistanceToIn(s9p,s9v);
517 // G4cout<<"s9.DistanceToIn(s9p,s9v,... = "<<Dist<<G4endl;
518 Dist=s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vz,calcNorm,pgoodNorm,pNorm);
519 // G4cout<<"s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vz... = "<<Dist<<G4endl;
520 assert(ApproxEqual(Dist,34.641016151377549));
521
522 Dist=s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
523 // G4cout<<"s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz... = "<<Dist<<G4endl;
524 assert(ApproxEqual(Dist,11.547005383792508));
525
526 Dist=s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vz,calcNorm,pgoodNorm,pNorm);
527 // G4cout<<"s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vz... = "<<Dist<<G4endl;
528 assert(ApproxEqual(Dist,11.547005383792508));
529
530 Dist=s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
531 // G4cout<<"s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz... = "<<Dist<<G4endl;
532 assert(ApproxEqual(Dist,34.641016151377549));
533
534 Dist=sb830.DistanceToOut(pb830,vb830,calcNorm,pgoodNorm,pNorm);
535 G4cout<<"sb830.DistanceToOut(pb830,vb830... = "<<Dist<<G4endl;
536 inside = sb830.Inside(pb830+Dist*vb830);
537 G4cout<<"sb830.Inside(pb830+Dist*vb830) = "<<OutputInside(inside)<<G4endl ;
538
539 Dist=sn11.DistanceToOut( G4ThreeVector(0.,0.,20.), vmz, calcNorm, pgoodNorm, pNorm);
540 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(0.,0.,20.),vmz... = "<<Dist<<G4endl;
541 assert(ApproxEqual(Dist,20.));
542
543 Dist=sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
544 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz... = "<<Dist<<G4endl;
545 assert(ApproxEqual(Dist,0.));
546
547 Dist=sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vz,calcNorm,pgoodNorm,pNorm);
548 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz... = "<<Dist<<G4endl;
549 assert(ApproxEqual(Dist,50.));
550
551 Dist=sn11.DistanceToOut(G4ThreeVector(10.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
552 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(10.,0.,0.),vmz... = "<<Dist<<G4endl;
553 assert(ApproxEqual(Dist,0.));
554
555 Dist=sn12.DistanceToOut(G4ThreeVector(0.,0.,20.),vxmz,calcNorm,pgoodNorm,pNorm);
556 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(0.,0.,20.),vxmz... = "<<Dist<<G4endl;
557 assert(ApproxEqual(Dist,20./std::sqrt(2.)));
558
559 Dist=sn12.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
560 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz... = "<<Dist<<G4endl;
561 assert(ApproxEqual(Dist,0.));
562
563 Dist=sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vz,calcNorm,pgoodNorm,pNorm);
564 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vz... = "<<Dist<<G4endl;
565 assert(ApproxEqual(Dist,38.989794855663561179));
566
567
568 Dist=sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vmz,calcNorm,pgoodNorm,pNorm);
569 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vmz... = "<<Dist<<G4endl;
570 assert(ApproxEqual(Dist,0.));
571
572
573 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vz,calcNorm,pgoodNorm,pNorm);
574 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vz... = "<<Dist<<G4endl;
575 assert(ApproxEqual(Dist,0.));
576
577
578 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vz,calcNorm,pgoodNorm,pNorm);
579 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vz... = "<<Dist<<G4endl;
580 assert(ApproxEqual(Dist,5.));
581
582
583 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vmxz,calcNorm,pgoodNorm,pNorm);
584 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vmxz... = "<<Dist<<G4endl;
585 assert(ApproxEqual(Dist,3.5355339059327381968));
586
587 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vmxz,calcNorm,pgoodNorm,pNorm);
588 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vmxz... = "<<Dist<<G4endl;
589 assert(ApproxEqual(Dist,0.));
590
591
592
593 iMax = 10000;
594 rMax = 49.;
595 zP = -1.;
596
597 for( i = 0; i < iMax; i++)
598 {
599 rRand = rMax*G4UniformRand();
600 phi = twopi*G4UniformRand();
601 pRand = G4ThreeVector( rRand*std::cos(phi), rRand*std::sin(phi), zP);
602
603 cosTheta = 0.99*G4UniformRand();
604
605 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
606 phi = twopi*G4UniformRand();
607 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
608
609 Dist = sn15.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
610
611 if( Dist*cosTheta > -2.*zP )
612 {
613 G4cout<<"sn15.DistanceToOut(pRand,vRand,..., i = "<<i<<G4endl;
614 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
615 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
616 break;
617 }
618 }
619 pRand = G4ThreeVector( -9.3576454272980740257, 10.436745988128407703, -1.);
620 vRand = G4ThreeVector( -0.064906521070262901407, 0.35249758429187183495, 0.93355910181999202102);
621 Dist = sn15.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
622 // G4cout<<"sn15.DistanceToOut(pRand,vRand... = "<<Dist<<G4endl;
623 assert(ApproxEqual(Dist,1.3409673565670394701));
624
625
626 zP = 1.;
627
628 for( i = 0; i < iMax; i++)
629 {
630 rRand = rMax*G4UniformRand();
631 phi = twopi*G4UniformRand();
632 pRand = G4ThreeVector( rRand*std::cos(phi), rRand*std::sin(phi), zP);
633
634 cosTheta = -0.99*G4UniformRand();
635
636 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
637 phi = twopi*G4UniformRand();
638 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
639
640 Dist = sn16.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
641
642 if( -Dist*cosTheta > 2.*zP )
643 {
644 G4cout<<"sn16.DistanceToOut(pRand,vRand,..., i = "<<i<<G4endl;
645 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
646 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
647 break;
648 }
649 }
650
651
652
653 pRand = G4ThreeVector( -18.872396210750576273, 11.573660000258405134, 1);
654 vRand = G4ThreeVector( -0.85674495247509219187, -0.51247617288646407641, -0.057933225631713866632);
655 Dist = sn16.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
656 // G4cout<<"sn16.DistanceToOut(pRand,vRand... = "<<Dist<<G4endl;
657 assert(ApproxEqual(Dist,8.9849541128705734394));
658
659
660
661 zP = -2.;
662
663 for( i = 0; i < iMax; i++)
664 {
665 rRand = rMax*G4UniformRand();
666 phi = twopi*G4UniformRand();
667
668 pRand = G4ThreeVector( rRand*std::cos(phi)*std::sin(91.*deg),
669 rRand*std::sin(phi)*std::sin(91.*deg),
670 rRand*std::cos(91.*deg));
671
672 cosTheta = std::cos( 180.*deg-89.*deg*G4UniformRand() );
673
674 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
675 phi = twopi*G4UniformRand();
676 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
677
678 Dist = sn17.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
679
680 if( -Dist*cosTheta > 50. )
681 {
682 G4cout<<"sn17.DistanceToOut(pRand,vRand,..., i = "<<i<<G4endl;
683 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
684 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
685 break;
686 }
687 }
688
689 pRand = G4ThreeVector(16.20075504802145, -22.42917454903122, -41.6469406430184);
690 vRand = G4ThreeVector( -0.280469198715188, 0.4463870649961534, 0.8497503261406731 );
691 norm = sn17.SurfaceNormal(pRand);
692 G4cout<<"norm = sn17.SurfaceNormal(pRand) = "<<norm.x()<<", "<<norm.y()<<", "<<norm.z()<<G4endl;
693 inside = sn17.Inside(pRand);
694 G4cout<<"sn17.Inside(pRand) = "<<OutputInside(inside)<<G4endl ;
695 Dist = sn17.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
696 G4cout<<"sn17.DistanceToOut(pRand,vRand,...) = "<<Dist<<G4endl;
697 // assert(ApproxEqual(Dist,8.9849541128705734394));
698
699 pRand = G4ThreeVector(2.469342694407535, -0.5746362009323557, -0.04425421860130281);
700 vRand = G4ThreeVector( -0.2513630044708909, 0.4396138160169732, -0.8622971255607673);
701 norm = sn17.SurfaceNormal(pRand);
702 G4cout<<"norm = sn17.SurfaceNormal(pRand) = "<<norm.x()<<", "<<norm.y()<<", "<<norm.z()<<G4endl;
703 inside = sn17.Inside(pRand);
704 G4cout<<"sn17.Inside(pRand) = "<<OutputInside(inside)<<G4endl ;
705 Dist = sn17.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
706 G4cout<<"sn17.DistanceToOut(pRand,vRand,...) = "<<Dist<<G4endl;
707 Dist = sn17.DistanceToIn(pRand,vRand);
708 G4cout<<"sn17.DistanceToIn(pRand,vRand) = "<<Dist<<G4endl;
709 // assert(ApproxEqual(Dist,8.9849541128705734394));
710
711
712
713
714// Checking G4Sphere::DistanceToIn(P)
715
716 Dist=s2.DistanceToIn(pzero);
717 assert(ApproxEqual(Dist,45));
718 Dist=s1.DistanceToIn(ponrmax1);
719 assert(ApproxEqual(Dist,0));
720
721// Checking G4Sphere::DistanceToIn(P,V)
722
723
724 zP = 3.;
725
726 for( i = 0; i < iMax; i++)
727 {
728 rRand = 0.5*rMax*G4UniformRand();
729 phi = twopi*G4UniformRand();
730 pRand = G4ThreeVector( rRand*std::cos(phi), rRand*std::sin(phi), zP);
731
732 cosTheta = std::cos( 180.*deg - 78.*deg*G4UniformRand() );
733 cosTheta = -0.99; // std::cos( 180.*deg - 78.*deg*G4UniformRand() );
734
735 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
736 phi = twopi*G4UniformRand();
737 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
738
739 Dist = sn17.DistanceToIn(pRand,vRand);
740
741 if( -Dist*cosTheta > 2.*zP )
742 {
743 G4cout<<"sn17.DistanceToIn(pRand,vRand), i = "<<i<<G4endl;
744 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
745 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
746 break;
747 }
748 }
749
750
751
752 pRand = G4ThreeVector( -10.276604989981144911, -4.7072500741022338389, 1);
753 vRand = G4ThreeVector( -0.28873162920537848164, 0.51647890054938394577, -0.80615357816219324061);
754 Dist = sn17.DistanceToIn(pRand,vRand);
755 G4cout<<"sn17.DistanceToIn(pRand,vRand) = "<<Dist<<G4endl;
756 // assert(ApproxEqual(Dist,8.9849541128705734394));
757
758
759
760
761 Dist=s1.DistanceToIn(ponzmax,vz);
762 G4cout<<"s1.DistanceToIn(ponzmax,vz) = "<<Dist<<G4endl;
763 Dist=s1.DistanceToIn(pbigy,vy);
764 assert(Dist==kInfinity);
765 Dist=s1.DistanceToIn(pbigy,vmy);
766 assert(ApproxEqual(Dist,50));
767
768 Dist=s2.DistanceToIn(pzero,vy);
769 G4cout<<"s2.DistanceToIn(pzero,vx) = "<<Dist<<G4endl;
770 assert(ApproxEqual(Dist,45));
771 Dist=s2.DistanceToIn(pzero,vmy);
772 assert(ApproxEqual(Dist,45));
773 Dist=s2.DistanceToIn(ponrmin1,vx);
774 // G4cout<<"s2.DistanceToIn(ponmin1,vx) = "<<Dist<<G4endl;
775 assert(Dist==0);
776 Dist=s2.DistanceToIn(ponrmin1,vmx);
777 assert(ApproxEqual(Dist,90));
778
779 Dist=s2.DistanceToIn(ponrmin2,vx);
780 assert(Dist==0);
781 Dist=s2.DistanceToIn(ponrmin2,vmx);
782 assert(ApproxEqual(Dist,90/std::sqrt(2.)));
783
784
785 Dist=s3.DistanceToIn(ptesttheta1,vmz);
786 // G4cout<<"s3.DistanceToIn(ptesttheta1,vmz) = "<<Dist<<G4endl;
787 assert(ApproxEqual(Dist,100-48/std::sqrt(2.)));
788 Dist=s3.DistanceToIn(pontheta1,vz);
789 // G4cout<<"s3.DistanceToIn(pontheta1,vz) = "<<Dist<<G4endl;
790 assert(Dist==kInfinity);
791 Dist=s3.DistanceToIn(pontheta1,vmz);
792 assert(Dist==0);
793 Dist=s3.DistanceToIn(pontheta2,vz);
794 // G4cout<<"s3.DistanceToIn(pontheta2,vz) = "<<Dist<<G4endl;
795 assert(Dist==0);
796 Dist=s3.DistanceToIn(pontheta2,vmz);
797 assert(Dist==kInfinity);
798 Dist=s32.DistanceToIn(pontheta1,vz);
799 // G4cout<<"s32.DistanceToIn(pontheta1,vz) = "<<Dist<<G4endl;
800 assert(Dist==0);
801 Dist=s32.DistanceToIn(pontheta1,vmz);
802 // G4cout<<"s32.DistanceToIn(pontheta1,vmz) = "<<Dist<<G4endl;
803 assert(Dist==kInfinity);
804 Dist=s33.DistanceToIn(pontheta2,vz);
805 // G4cout<<"s33.DistanceToIn(pontheta2,vz) = "<<Dist<<G4endl;
806 assert(Dist==kInfinity);
807 Dist=s33.DistanceToIn(pontheta2,vmz);
808 // G4cout<<"s33.DistanceToIn(pontheta2,vmz) = "<<Dist<<G4endl;
809 assert(Dist==0);
810
811 Dist=s4.DistanceToIn(pbigy,vmy);
812 assert(Dist==kInfinity);
813 Dist=s4.DistanceToIn(pbigz,vmz);
814 assert(ApproxEqual(Dist,50));
815 Dist=s4.DistanceToIn(pzero,vy);
816 assert(Dist==kInfinity);
817 Dist=s4.DistanceToIn(pzero,vx);
818 assert(ApproxEqual(Dist,45));
819
820 Dist=s4.DistanceToIn(ptestphi1,vx);
821 assert(ApproxEqual(Dist,100+45/std::sqrt(2.)));
822 Dist=s4.DistanceToIn(ponphi1,vmxmy);
823 assert(Dist==kInfinity);
824 Dist=s4.DistanceToIn(ponphi1,vxy);
825 // G4cout<<"s4.DistanceToIn(ponphi1,vxy) = "<<Dist<<G4endl;
826 assert(ApproxEqual(Dist,0));
827
828 Dist=s4.DistanceToIn(ptestphi2,vx);
829 assert(ApproxEqual(Dist,100+45/std::sqrt(2.)));
830 Dist=s4.DistanceToIn(ponphi2,vmxy);
831 assert(Dist==kInfinity);
832 Dist=s4.DistanceToIn(ponphi2,vxmy);
833 // G4cout<<"s4.DistanceToIn(ponphi2,vxmy) = "<<Dist<<G4endl;
834 assert(ApproxEqual(Dist,0));
835
836 Dist=s3.DistanceToIn(pzero,vx);
837 assert(ApproxEqual(Dist,45));
838 Dist=s3.DistanceToIn(ptesttheta1,vmz);
839 assert(ApproxEqual(Dist,100-48/std::sqrt(2.)));
840 Dist=b216.DistanceToIn(p216,v216);
841 // G4cout<<"b216.DistanceToIn(p216,v216) = "<<Dist<<G4endl;
842
843 Dist=b658.DistanceToIn(pzero,vz);
844 G4cout<<"b658.DistanceToIn(pzero,vz) = "<<Dist<<G4endl;
845
846
847
848 Dist=s13.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz);
849 // G4cout<<"s13.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz... = "<<Dist<<G4endl;
850 assert(ApproxEqual(Dist,58.452994616207498));
851
852 Dist=s13.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz);
853 // G4cout<<"s13.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz... = "<<Dist<<G4endl;
854 assert(ApproxEqual(Dist,35.358983848622451));
855
856
857 Dist=s14.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz);
858 // G4cout<<"s14.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz... = "<<Dist<<G4endl;
859 assert(ApproxEqual(Dist,35.358983848622451));
860
861 Dist=s14.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz);
862 // G4cout<<"s14.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz... = "<<Dist<<G4endl;
863 assert(ApproxEqual(Dist,58.452994616207498));
864
865 Dist=b1046.DistanceToIn(G4ThreeVector(0.,0.,4800*km),vmz);
866 G4cout<<"b1046.DistanceToIn(G4ThreeVector(0.,0.,4800*km),vmz... = "<<Dist<<G4endl;
867 // assert(ApproxEqual(Dist,0.));
868
869
870
871
872
873 ///////////////////////////////////////////////////////////////////////////
874
875
876// CalculateExtent
877 G4VoxelLimits limit; // Unlimited
878 G4RotationMatrix noRot;
879 G4AffineTransform origin;
880 G4double min,max;
881 assert(s1.CalculateExtent(kXAxis,limit,origin,min,max));
882 assert(min<=-50&&max>=50);
883 assert(s1.CalculateExtent(kYAxis,limit,origin,min,max));
884 assert(min<=-50&&max>=50);
885 assert(s1.CalculateExtent(kZAxis,limit,origin,min,max));
886 assert(min<=-50&&max>=50);
887
888 assert(s2.CalculateExtent(kXAxis,limit,origin,min,max));
889 assert(min<=-50&&max>=50);
890 assert(s2.CalculateExtent(kYAxis,limit,origin,min,max));
891 assert(min<=-50&&max>=50);
892 assert(s2.CalculateExtent(kZAxis,limit,origin,min,max));
893 assert(min<=-50&&max>=50);
894
895 assert(s3.CalculateExtent(kXAxis,limit,origin,min,max));
896 assert(min<=-50&&max>=50);
897 assert(s3.CalculateExtent(kYAxis,limit,origin,min,max));
898 assert(min<=-50&&max>=50);
899 assert(s3.CalculateExtent(kZAxis,limit,origin,min,max));
900 assert(min<=-50/std::sqrt(2.)&&max>=50/std::sqrt(2.));
901
902 G4ThreeVector pmxmymz(-100,-110,-120);
903 G4AffineTransform tPosOnly(pmxmymz);
904 assert(s1.CalculateExtent(kXAxis,limit,tPosOnly,min,max));
905 assert(min<=-150&&max>=-50);
906 assert(s1.CalculateExtent(kYAxis,limit,tPosOnly,min,max));
907 assert(min<=-160&&max>=-60);
908 assert(s1.CalculateExtent(kZAxis,limit,tPosOnly,min,max));
909 assert(min<=-170&&max>=-70);
910
911 assert(s3.CalculateExtent(kXAxis,limit,tPosOnly,min,max));
912 assert(min<=-150&&max>=-50);
913 assert(s3.CalculateExtent(kYAxis,limit,tPosOnly,min,max));
914 assert(min<=-160&&max>=-60);
915 assert(s3.CalculateExtent(kZAxis,limit,tPosOnly,min,max));
916 assert(min<=-170+50/std::sqrt(2.)&&max>=-70-50/std::sqrt(2.));
917
918 G4RotationMatrix r90Z;
919 r90Z.rotateZ(halfpi);
920 G4AffineTransform tRotZ(r90Z,pzero);
921 assert(s1.CalculateExtent(kXAxis,limit,tRotZ,min,max));
922 assert(min<=-50&&max>=50);
923 assert(s1.CalculateExtent(kYAxis,limit,tRotZ,min,max));
924 assert(min<=-50&&max>=50);
925 assert(s1.CalculateExtent(kZAxis,limit,tRotZ,min,max));
926 assert(min<=-50&&max>=50);
927
928 assert(s2.CalculateExtent(kXAxis,limit,tRotZ,min,max));
929 assert(min<=-50&&max>=50);
930 assert(s2.CalculateExtent(kYAxis,limit,tRotZ,min,max));
931 assert(min<=-50&&max>=50);
932 assert(s2.CalculateExtent(kZAxis,limit,tRotZ,min,max));
933 assert(min<=-50&&max>=50);
934
935 assert(s3.CalculateExtent(kXAxis,limit,tRotZ,min,max));
936 assert(min<=-50&&max>=50);
937 assert(s3.CalculateExtent(kYAxis,limit,tRotZ,min,max));
938 assert(min<=-50&&max>=50);
939 assert(s3.CalculateExtent(kZAxis,limit,tRotZ,min,max));
940 assert(min<=-50/std::sqrt(2.)&&max>=50/std::sqrt(2.));
941
942// Check that clipped away
943 G4VoxelLimits xClip;
944 xClip.AddLimit(kXAxis,-100,-60);
945 assert(!s1.CalculateExtent(kXAxis,xClip,origin,min,max));
946
947// Assert clipped to volume
948 G4VoxelLimits allClip;
949 allClip.AddLimit(kXAxis,-5,+5);
950 allClip.AddLimit(kYAxis,-5,+5);
951 allClip.AddLimit(kZAxis,-5,+5);
952 G4RotationMatrix genRot;
953 genRot.rotateX(pi/6);
954 genRot.rotateY(pi/6);
955 genRot.rotateZ(pi/6);
956 G4AffineTransform tGen(genRot,vx);
957 assert(s1.CalculateExtent(kXAxis,allClip,tGen,min,max));
958 assert(min<=-5&&max>=5);
959 assert(s1.CalculateExtent(kYAxis,allClip,tGen,min,max));
960 assert(min<=-5&&max>=5);
961 assert(s1.CalculateExtent(kZAxis,allClip,tGen,min,max));
962 assert(min<=-5&&max>=5);
963
964 assert(s2.CalculateExtent(kXAxis,allClip,tGen,min,max));
965 assert(min<=-5&&max>=5);
966 assert(s2.CalculateExtent(kYAxis,allClip,tGen,min,max));
967 assert(min<=-5&&max>=5);
968 assert(s2.CalculateExtent(kZAxis,allClip,tGen,min,max));
969 assert(min<=-5&&max>=5);
970
971 s34.CalculateExtent(kXAxis,allClip,tGen,min,max);
972 // G4cout<<"s34.CalculateExtent(kXAxis,allClip,tGen,min,max)"<<G4endl ;
973 // G4cout<<"min = "<<min<<" max = "<<max<<G4endl ;
974
975 s34.CalculateExtent(kYAxis,allClip,tGen,min,max);
976 // G4cout<<"s3.CalculateExtent(kYAxis,allClip,tGen,min,max)"<<G4endl ;
977 // G4cout<<"min = "<<min<<" max = "<<max<<G4endl ;
978
979 s34.CalculateExtent(kZAxis,allClip,tGen,min,max);
980 // G4cout<<"s34.CalculateExtent(kZAxis,allClip,tGen,min,max)"<<G4endl ;
981 // G4cout<<"min = "<<min<<" max = "<<max<<G4endl ;
982 assert(s34.CalculateExtent(kXAxis,allClip,tGen,min,max));
983 assert(min<=-5&&max>=5);
984 assert(s34.CalculateExtent(kYAxis,allClip,tGen,min,max));
985 assert(min<=-5&&max>=5);
986 assert(s34.CalculateExtent(kZAxis,allClip,tGen,min,max));
987 assert(min<=-5&&max>=5);
988
989// Test z clipping ok
990 for (G4double zTest=-100;zTest<100;zTest+=9)
991 {
992 G4VoxelLimits zTestClip;
993 zTestClip.AddLimit(kZAxis,-kInfinity,zTest);
994 if (zTest<-50)
995 {
996 assert(!s1.CalculateExtent(kZAxis,zTestClip,origin,min,max));
997 assert(!s2.CalculateExtent(kZAxis,zTestClip,origin,min,max));
998 }
999 else
1000 {
1001 assert(s1.CalculateExtent(kZAxis,zTestClip,origin,min,max));
1002 assert(s2.CalculateExtent(kZAxis,zTestClip,origin,min,max));
1003 G4double testMin=-50;
1004 G4double testMax=(zTest<50) ? zTest : 50;
1005 assert (ApproxEqual(min,testMin)
1006 &&ApproxEqual(max,testMax));
1007 }
1008 }
1009
1010// Test y clipping ok
1011 for (G4double xTest=-100;xTest<100;xTest+=9)
1012 {
1013 G4VoxelLimits xTestClip;
1014 xTestClip.AddLimit(kXAxis,-kInfinity,xTest);
1015 if (xTest<-50)
1016 {
1017 assert(!s1.CalculateExtent(kYAxis,xTestClip,origin,min,max));
1018 }
1019 else
1020 {
1021 assert(s1.CalculateExtent(kYAxis,xTestClip,origin,min,max));
1022// Calc max y coordinate
1023 G4double testMax=(xTest<0) ? std::sqrt(50*50-xTest*xTest) : 50;
1024 assert (ApproxEqual(min,-testMax)
1025 &&ApproxEqual(max,testMax));
1026 }
1027 }
1028
1029// Test x clipping ok
1030 for (G4double yTest=-100;yTest<100;yTest+=9)
1031 {
1032 G4VoxelLimits yTestClip;
1033 yTestClip.AddLimit(kYAxis,-kInfinity,yTest);
1034 if (yTest<-50)
1035 {
1036 assert(!s1.CalculateExtent(kXAxis,yTestClip,origin,min,max));
1037 }
1038 else
1039 {
1040 assert(s1.CalculateExtent(kXAxis,yTestClip,origin,min,max));
1041// Calc max y coordinate
1042 G4double testMax=(yTest<0) ? std::sqrt(50*50-yTest*yTest) : 50;
1043 assert (ApproxEqual(min,-testMax)
1044 &&ApproxEqual(max,testMax));
1045 }
1046 }
1047
1048 G4bool checkPoint( const G4Sphere& pSph, G4ThreeVector origin,
1049 G4double d, G4ThreeVector dir, EInside exp);
1050
1051 G4Sphere SpAroundX("SpAroundX", 10.*mm, 1000.*mm, -1.0*degree, 2.0*degree, 0.*degree, 180.0*degree );
1052
1053 G4double sinOneDeg = std::sin( 1.0 * degree );
1054 radOne = 100.0 * mm;
1055
1056 G4ThreeVector ptPhiSurfExct= G4ThreeVector( radOne * std::cos( -1.0 * degree ) ,
1057 - radOne * sinOneDeg,
1058 0.0 );
1059 G4cout << " Starting from point " << ptPhiSurfExct << G4endl;
1060 G4cout << " using direction " << vy << G4endl;
1061 checkPoint( SpAroundX, ptPhiSurfExct, -radOne * kAngTolerance * 1.5,
1062 vy, kOutside);
1063 checkPoint( SpAroundX, ptPhiSurfExct, -radOne * kAngTolerance * 0.49,
1064 vy, kSurface);
1065 checkPoint( SpAroundX, ptPhiSurfExct, -radOne * kAngTolerance * 0.25,
1066 vy, kSurface);
1067 checkPoint( SpAroundX, ptPhiSurfExct, 0.0,
1068 vy, kSurface);
1069 checkPoint( SpAroundX, ptPhiSurfExct, radOne * kAngTolerance * 0.25,
1070 vy, kSurface);
1071 checkPoint( SpAroundX, ptPhiSurfExct, radOne * kAngTolerance * 0.49,
1072 vy, kSurface);
1073 checkPoint( SpAroundX, ptPhiSurfExct, radOne * kAngTolerance * 1.5,
1074 vy, kInside);
1075
1076 // Try one that has a 'deep' negative phi section
1077 // --> Vlad. Grichine test case, 30 Oct 2003
1078 //
1079 G4cout << G4endl << G4endl << "" << G4endl;
1080 G4cout << "========================================================= " << G4endl;
1081
1082 G4Sphere SphDeepNeg("DeepNegPhiSphere", 10.*mm, 1000.*mm,
1083 -270.0*degree, 280.0*degree, // start Phi, delta Phi
1084 0.*degree, 180.0*degree ); // start Theta, delta Theta
1085 G4double phiPoint = 160.0 * degree;
1086 G4ThreeVector StartPt( radOne * std::cos(phiPoint), radOne * std::sin(phiPoint), 0.0);
1087 G4cout << "For sphere " << SphDeepNeg.GetName() << G4endl;
1088 G4cout << " Starting from point " << ptPhiSurfExct << G4endl;
1089
1090 checkPoint( SphDeepNeg, StartPt, 0.0, vy, kInside);
1091
1092 // Try the edges
1093 G4ThreeVector NegEdgePt( radOne * std::cos(-270.0*degree), radOne * std::sin(-270.0*degree), 0.0);
1094 G4ThreeVector PosEdgePt( radOne * std::cos(10.0*degree), radOne * std::sin(10.0*degree), 0.0);
1095
1096 G4cout << "--------------------------------------------------------" << G4endl;
1097 G4cout << " New point " << NegEdgePt << " should be at Neg edge of -270.0 degrees " << G4endl;
1098 checkPoint( SphDeepNeg, NegEdgePt, 0.0, -vx, kSurface);
1099 checkPoint( SphDeepNeg, NegEdgePt, radOne*kAngTolerance * 0.25, -vx, kSurface);
1100 checkPoint( SphDeepNeg, NegEdgePt, -radOne*kAngTolerance * 0.25, -vx, kSurface);
1101 checkPoint( SphDeepNeg, NegEdgePt, radOne*kAngTolerance * 1.25, -vx, kInside);
1102 checkPoint( SphDeepNeg, NegEdgePt, -radOne*kAngTolerance * 1.25, -vx, kOutside);
1103
1104 G4cout << "--------------------------------------------------------" << G4endl;
1105 G4cout << " New point " << PosEdgePt << " should be at Pos edge of +10.0 degrees " << G4endl;
1106 checkPoint( SphDeepNeg, PosEdgePt, 0.0, -vy, kSurface);
1107 checkPoint( SphDeepNeg, PosEdgePt, radOne*kAngTolerance * 0.25, -vy, kSurface);
1108 checkPoint( SphDeepNeg, PosEdgePt, -radOne*kAngTolerance * 0.25, -vy, kSurface);
1109 checkPoint( SphDeepNeg, PosEdgePt, -radOne*kAngTolerance * 1.25, -vy, kOutside);
1110 checkPoint( SphDeepNeg, PosEdgePt, radOne*kAngTolerance * 1.25, -vy, kInside);
1111
1112
1113
1114 // G4double sTheta = 135*degree, pxt = -10., pyt = 10.;
1115
1116 // G4cout<<"sTheta = "<<sTheta/degree<<" degree"<<G4endl;
1117 // G4cout<<"std::tan(sTheta) = "<<std::tan(sTheta)<<G4endl;
1118 // G4cout<<"std::sin(sTheta) = "<<std::sin(sTheta)<<G4endl;
1119 // G4cout<<"std::atan(sTheta) = "<<std::atan(sTheta)/degree<<G4endl;
1120 // G4cout<<"std::atan2(pyt,pxt) = pyt/pxt = "<<std::atan2(pyt,pxt)/degree<<G4endl;
1121
1122 return 0;
1123}
1124
1125// Given the sphere 'rSphere', a point 'origin'
1126// --> --> -->
1127// the function below checks that the point pnew=( origin + dist * direction )
1128// - the point (p+dist*dir) is located in the part of the solid given by 'expectedInResult'
1129// - and that from there, the DistanceToIn along 'dir' is not negative or Infinite
1130//
1131// Use cases expected:
1132// - 'origin' is on/near a surface and 'direction' is pointing towards the inside of the solid
1133
1134G4bool
1135checkPoint( const G4Sphere &rSphere,
1136 G4ThreeVector origin,
1137 G4double dist,
1138 G4ThreeVector direction,
1139 EInside expectedInResult)
1140{
1141 G4int verbose = 0;
1142
1143 G4ThreeVector newPoint;
1144 G4double distIn=-1.0, distOut=-1.0;
1145
1146 newPoint = origin + dist * direction;
1147
1148 G4int oldPrecision= G4cout.precision(10);
1149 // G4cout << " --- Sphere " << rSphere.GetName() << "" << G4endl;
1150 if( verbose > 0 ) {
1151 G4cout << G4endl;
1152 if (verbose > 2 ) G4cout << " Sphere " << rSphere.GetName();
1153 G4cout.precision(10);
1154 if (verbose > 1 ) G4cout << " dir= " << direction;
1155 G4cout << " dist= " << dist;
1156 }
1157
1158 EInside inSphere= rSphere.Inside( newPoint ) ;
1159 /*======*/
1160 G4cout.precision(15);
1161 // G4cout << " NewPoint " << newPoint << " is "
1162 G4bool goodIn= (inSphere == expectedInResult) ;
1163 if ( !goodIn ) {
1164 G4cout << " ************ Unexpected Result for Inside *************** " << G4endl;
1165 }
1166 if ( verbose || !goodIn ) {
1167 G4cout << " New point "
1168 << " is " << OutputInside( inSphere )
1169 << " vs " << OutputInside( expectedInResult )
1170 << " expected." << G4endl ;
1171 }
1172
1173 G4bool goodDistIn = true;
1174
1175 distIn = rSphere.DistanceToIn( newPoint, direction );
1176 /*===========*/
1177 if ( verbose ) G4cout << " DistToIn (p, dir) = " << distIn << G4endl;
1178 if( (inSphere == kOutside)
1179 && (distIn < 0.0 ) // Cannot use 0.5*kCarTolerance for Angular tolerance!!
1180 ){
1181 G4cout << " ********** Unexpected Result for DistanceToIn from outside ********* " << G4endl;
1182 // G4cout << " It should be " << G4endl;
1183 goodDistIn = false;
1184 }
1185 if( (inSphere == kSurface )
1186 && ( (distIn < 0.0) || (distIn >= kInfinity ))
1187 ){
1188 G4cout << " ********** Unexpected Result for DistanceToIn on surface ********* " << G4endl;
1189 // if ( (distIn != 0.0) )
1190 // - Can check that the return value must be 0.0
1191 // But in general case the direction can be away from the solid,
1192 // and then a finite or kInfinity answer is correct
1193 // --> must check the direction against the normal
1194 // in order to perform this check in general case.
1195
1196 goodDistIn = false;
1197 }
1198 if ( verbose || !goodDistIn ) {
1199 G4cout << " DistToIn (p, dir) = " << distIn << G4endl;
1200 }
1201
1202 G4bool good= (goodIn && goodDistIn);
1203 if ( !good ){
1204 // There was an error -- document the use case!
1205 G4cout << " --- Sphere " << rSphere.GetName() << "" << G4endl;
1206 G4cout << " Origin= " << origin << G4endl;
1207 G4cout << " Direction= " << direction << G4endl;
1208 G4cout << " dist= " << dist;
1209 G4cout << " Actual-point= " << newPoint << G4endl;
1210 }
1211
1212 distOut = rSphere.DistanceToOut( newPoint, direction );
1213 /*=============*/
1214 if ( verbose ) G4cout << " DistToOut (p, dir) = " << distOut << G4endl;
1215
1216 G4cout.precision(oldPrecision);
1217
1218 return good;
1219}
1220
Note: See TracBrowser for help on using the repository browser.