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

Last change on this file since 1353 was 1347, checked in by garnier, 15 years ago

geant4 tag 9.4

File size: 47.4 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.30 2010/03/24 09:50:03 grichine Exp $
28// GEANT4 tag $Name: geant4-09-04-ref-00 $
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 EInside inside;
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
295 G4Sphere s18_03_10("s18_03_10", 47*mm, 48*mm, 0*deg, 200*deg, 80*deg, 100*deg);
296 G4ThreeVector p18_03_10(43.37539710867407*mm, 16.12036885157033*mm, -8.224548565698871*mm);
297 G4ThreeVector v18_03_10(-0.4161958548132512, 0.6603942936714858, -0.6250283092167956);
298
299 inside = s18_03_10.Inside(p18_03_10) ;
300 G4cout<<"s18_03_10.Inside(p18_03_10 ... = "<<OutputInside(inside)<<G4endl ;
301
302
303
304#ifdef NDEBUG
305 G4Exception("FAIL: *** Assertions must be compiled in! ***");
306#endif
307
308 G4cout.precision(20);
309
310 //////////////// Check name /////////////////////////
311
312 assert(s1.GetName()=="Solid G4Sphere");
313
314 // check cubic volume
315
316 vol = s1.GetCubicVolume();
317 volCheck = 4*pi*125000/3;
318
319 assert( ApproxEqual(vol,volCheck));
320
321 assert(ApproxEqual(s1.GetCubicVolume(),4*pi*125000/3));
322
323
324 // Some user application cases
325
326 Dist = s4.DistanceToOut(ponrmin3,vmz,calcNorm,pgoodNorm,pNorm) ;
327 // G4cout<<"s4.DistanceToOut(ponrmin3,vmz,calcNorm,pgoodNorm,pNorm) = "<<Dist
328 // <<G4endl ;
329 Dist = s6.DistanceToOut(ponrminJ,vmz,calcNorm,pgoodNorm,pNorm) ;
330 // G4cout<<"s6.DistanceToOut(ponrminJ,vmz,calcNorm,pgoodNorm,pNorm) = "<<Dist
331 // <<G4endl ;
332 Dist = s6.DistanceToOut(ponrmaxJ,vmz,calcNorm,pgoodNorm,pNorm) ;
333 // G4cout<<"s6.DistanceToOut(ponrmaxJ,vmz,calcNorm,pgoodNorm,pNorm) = "<<Dist
334 // <<G4endl ;
335
336 Dist = s7.DistanceToOut(G4ThreeVector(1399.984667238032,
337 5.9396696802500299,
338 -2.7661927818688308),
339 G4ThreeVector(0.50965504781062942,
340 -0.80958849145715217,
341 0.29123565499656401),
342 calcNorm,pgoodNorm,pNorm) ;
343 // G4cout<<"s7.DistanceToOut(shereP,sphereV,calcNorm,pgoodNorm,pNorm) = "<<Dist
344 // <<G4endl ;
345
346 Dist = s7.DistanceToIn(G4ThreeVector(1399.984667238032,
347 5.9396696802500299,
348 -2.7661927818688308),
349 G4ThreeVector(0.50965504781062942,
350 -0.80958849145715217,
351 0.29123565499656401)) ;
352 // G4cout<<"s7.DistanceToIn(shereP,sphereV,calcNorm,pgoodNorm,pNorm) = "<<Dist
353 // <<G4endl ;
354
355
356
357// Check G4Sphere::Inside
358
359 inside = s7.Inside(G4ThreeVector(1399.984667238032,
360 5.9396696802500299,
361 -2.7661927818688308) ) ;
362 // G4cout<<"s7.Inside(G4ThreeVector(1399.98466 ... = "
363 // <<OutputInside(inside)<<G4endl ;
364
365 inside = s8.Inside(G4ThreeVector(-249.5020724528353*mm,
366 26.81253142743162*mm,
367 114.8988524453591*mm ) ) ;
368 // G4cout<<"s8.Inside(G4ThreeVector(-249.5020 ... = "<<OutputInside(inside)<<G4endl ;
369 inside = b216.Inside(p216);
370 // G4cout<<"b216.Inside(p216) = "<<OutputInside(inside)<<G4endl ;
371 inside = s1.Inside(pz);
372 // G4cout<<"s1.Inside(pz) = "<<OutputInside(inside)<<G4endl ;
373
374 inside = s9.Inside(s9p);
375 // G4cout<<"s9.Inside(s9p) = "<<OutputInside(inside)<<G4endl ;
376
377 inside = b402.Inside(p402);
378 // G4cout<<"p402.Inside(p402) = "<<OutputInside(inside)<<G4endl ;
379
380 inside = s10.Inside(s10p);
381 // G4cout<<"s10.Inside(s10p) = "<<OutputInside(inside)<<G4endl ;
382 // G4cout<<"p radius = "<<s10p.mag()<<G4endl ;
383
384 inside = s11.Inside(ps11);
385 // G4cout<<"s11.Inside(ps11) = "<<OutputInside(inside)<<G4endl ;
386 // G4cout<<"ps11.mag() = "<<ps11.mag()<<G4endl ;
387
388 inside = sLHCB.Inside(pLHCB);
389 // G4cout<<"sLHCB.Inside(pLHCB) = "<<OutputInside(inside)<<G4endl ;
390 // G4cout<<"pLHCB.mag() = "<<pLHCB.mag()<<G4endl ;
391
392 inside = spAroundX.Inside(ptPhiMinus);
393 // G4cout<<"spAroundX.Inside(ptPhiMinus) = "<<OutputInside(inside)<<G4endl ;
394 inside = b658.Inside(p658);
395 G4cout<<"b658.Inside(p658) = "<<OutputInside(inside)<<G4endl ;
396
397 assert(s1.Inside(pzero)==kInside);
398 // assert(s1.Inside(pz)==kInside);
399 assert(s2.Inside(pzero)==kOutside);
400 assert(s2.Inside(ponrmin2)==kSurface);
401 assert(s2.Inside(ponrmax2)==kSurface);
402 assert(s3.Inside(pontheta1)==kSurface);
403 assert(s3.Inside(pontheta2)==kSurface);
404 assert(s4.Inside(ponphi1)==kSurface);
405 assert(s4.Inside(ponphi1)==kSurface);
406 assert(s4.Inside(pOverPhi)==kOutside);
407 assert(s4.Inside(pInPhi)==kInside);
408 assert(s5.Inside(pbigz)==kOutside);
409
410 assert(s41.Inside(pmx)==kSurface);
411 assert(s42.Inside(pmx)==kSurface);
412
413// Checking G4Sphere::SurfaceNormal
414 G4double p2=1./std::sqrt(2.),p3=1./std::sqrt(3.);
415
416
417 norm=sn1.SurfaceNormal(G4ThreeVector(0.,0.,50.));
418 assert(ApproxEqual(norm,G4ThreeVector(p3,p3,p3)));
419 norm=sn1.SurfaceNormal(G4ThreeVector(0.,0.,0.));
420 assert(ApproxEqual(norm,G4ThreeVector(p2,p2,0.)));
421
422 norm=sn11.SurfaceNormal(G4ThreeVector(0.,0.,0.));
423 assert(ApproxEqual(norm,G4ThreeVector(0.,0.,-1.)));
424 norm=sn12.SurfaceNormal(G4ThreeVector(0.,0.,0.));
425 assert(ApproxEqual(norm,G4ThreeVector(0.,0.,-1.)));
426 norm=sn13.SurfaceNormal(G4ThreeVector(0.,0.,0.));
427 assert(ApproxEqual(norm,G4ThreeVector(0.,0.,1.)));
428
429 norm=sn2.SurfaceNormal(G4ThreeVector(-45.,0.,0.));
430 assert(ApproxEqual(norm,G4ThreeVector(p2,-p2,0.)));
431
432
433
434 norm=s1.SurfaceNormal(ponrmax1);
435 assert(ApproxEqual(norm,vx));
436
437// Checking G4Sphere::DistanceToOut(P)
438 Dist=s1.DistanceToOut(pzero);
439 assert(ApproxEqual(Dist,50));
440 Dist=s1.DistanceToOut(ponrmax1);
441 assert(ApproxEqual(Dist,0));
442
443// Checking G4Sphere::DistanceToOut(p,v)
444
445
446 Dist=s1.DistanceToOut(pz,vz,calcNorm,pgoodNorm,pNorm);
447 // G4cout<<"Dist=s1.DistanceToOut(pz,vz) = "<<Dist<<G4endl;
448 assert(ApproxEqual(Dist,20.));
449
450 Dist=s1.DistanceToOut(ponrmax1,vx,calcNorm,pgoodNorm,pNorm);
451 *pNorm=pNorm->unit();
452 assert(ApproxEqual(Dist,0)&&*pgoodNorm&&ApproxEqual(*pNorm,vx));
453
454 Dist=s2.DistanceToOut(ponrmin1,vx,calcNorm,pgoodNorm,pNorm);
455 *pNorm=pNorm->unit();
456 assert(ApproxEqual(Dist,5)&&*pgoodNorm&&ApproxEqual(*pNorm,vx));
457
458 Dist=s2.DistanceToOut(ponrmax2,vx,calcNorm,pgoodNorm,pNorm);
459 assert(ApproxEqual(Dist,0)&&*pgoodNorm&&ApproxEqual(*pNorm,vxy));
460
461 Dist=s1.DistanceToOut(pzero,vx,calcNorm,pgoodNorm,pNorm);
462 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vx)&&*pgoodNorm);
463 Dist=s1.DistanceToOut(pzero,vmx,calcNorm,pgoodNorm,pNorm);
464 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmx)&&*pgoodNorm);
465 Dist=s1.DistanceToOut(pzero,vy,calcNorm,pgoodNorm,pNorm);
466 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vy)&&*pgoodNorm);
467 Dist=s1.DistanceToOut(pzero,vmy,calcNorm,pgoodNorm,pNorm);
468 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmy)&&*pgoodNorm);
469 Dist=s1.DistanceToOut(pzero,vz,calcNorm,pgoodNorm,pNorm);
470 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vz)&&*pgoodNorm);
471 Dist=s1.DistanceToOut(pzero,vmz,calcNorm,pgoodNorm,pNorm);
472 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmz)&&*pgoodNorm);
473 Dist=s1.DistanceToOut(pzero,vxy,calcNorm,pgoodNorm,pNorm);
474 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vxy)&&*pgoodNorm);
475
476 Dist=s4.DistanceToOut(ponphi1,vx,calcNorm,pgoodNorm,pNorm);
477 //assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vmxmy)&&*pgoodNorm);
478 Dist=s4.DistanceToOut(ponphi2,vx,calcNorm,pgoodNorm,pNorm);
479 // assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vmxy)&&*pgoodNorm);
480 Dist=s3.DistanceToOut(pontheta1,vz,calcNorm,pgoodNorm,pNorm);
481 // assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vy)&&*pgoodNorm);
482 Dist=s32.DistanceToOut(pontheta1,vmz,calcNorm,pgoodNorm,pNorm);
483 //assert(ApproxEqual(Dist,0)&&ApproxEqual(pNorm->unit(),vmy)&&*pgoodNorm);
484 Dist=s32.DistanceToOut(pontheta1,vz,calcNorm,pgoodNorm,pNorm);
485 //assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vz)&&*pgoodNorm);
486 Dist=s1.DistanceToOut(pzero,vmz,calcNorm,pgoodNorm,pNorm);
487 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vmz)&&*pgoodNorm);
488 Dist=s1.DistanceToOut(pzero,vxy,calcNorm,pgoodNorm,pNorm);
489 assert(ApproxEqual(Dist,50)&&ApproxEqual(pNorm->unit(),vxy)&&*pgoodNorm);
490
491
492 Dist=s2.DistanceToOut(ponrmin1,vxy,calcNorm,pgoodNorm,pNorm);
493 // G4cout<<"Dist=s2.DistanceToOut(pormin1,vxy) = "<<Dist<<G4endl;
494
495 Dist=s2.DistanceToOut(ponrmax1,vmx,calcNorm,pgoodNorm,pNorm);
496 // G4cout<<"Dist=s2.DistanceToOut(ponxside,vmx) = "<<Dist<<G4endl;
497 Dist=s2.DistanceToOut(ponrmax1,vmxmy,calcNorm,pgoodNorm,pNorm);
498 // G4cout<<"Dist=s2.DistanceToOut(ponxside,vmxmy) = "<<Dist<<G4endl;
499 Dist=s2.DistanceToOut(ponrmax1,vz,calcNorm,pgoodNorm,pNorm);
500 // G4cout<<"Dist=s2.DistanceToOut(ponxside,vz) = "<<Dist<<G4endl;
501
502 // Dist=s2.DistanceToOut(pbigx,vx,calcNorm,pgoodNorm,pNorm);
503 // G4cout<<"Dist=s2.DistanceToOut(pbigx,vx) = "<<Dist<<G4endl;
504 // Dist=s2.DistanceToOut(pbigx,vxy,calcNorm,pgoodNorm,pNorm);
505 // G4cout<<"Dist=s2.DistanceToOut(pbigx,vxy) = "<<Dist<<G4endl;
506 // Dist=s2.DistanceToOut(pbigx,vz,calcNorm,pgoodNorm,pNorm);
507 // G4cout<<"Dist=s2.DistanceToOut(pbigx,vz) = "<<Dist<<G4endl;
508 //Test Distance for phi section
509 Dist=sn22.DistanceToOut(G4ThreeVector(0.,49.,0.),vmy,calcNorm,pgoodNorm,pNorm);
510 assert(ApproxEqual(Dist,49.));
511 Dist=sn22.DistanceToOut(G4ThreeVector(-45.,0.,0.),vx,calcNorm,pgoodNorm,pNorm);
512 assert(ApproxEqual(Dist,45.));
513G4cout<<"Dist from Center ="<<sn22.DistanceToOut(G4ThreeVector(0.,49.,0),G4ThreeVector(0,-1,0))<<G4endl;
514G4cout<<"Dist from Center ="<<sn22.DistanceToOut(G4ThreeVector(-45.,0.,0),G4ThreeVector(1,0,0))<<G4endl;
515
516 //
517 Dist=b216.DistanceToOut(p216,v216,calcNorm,pgoodNorm,pNorm);
518
519 // G4cout<<"b216.DistanceToOut(p216,v216,... = "<<Dist<<G4endl;
520
521 // call from outside
522 // Dist=sAlex.DistanceToOut(psAlex,vsAlex,calcNorm,pgoodNorm,pNorm);
523 // G4cout<<"sAlex.DistanceToOut(psAlex,vsAlex,... = "<<Dist<<G4endl;
524
525
526 // Dist=s9.DistanceToIn(s9p,s9v);
527 // G4cout<<"s9.DistanceToIn(s9p,s9v,... = "<<Dist<<G4endl;
528 Dist=s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vz,calcNorm,pgoodNorm,pNorm);
529 // G4cout<<"s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vz... = "<<Dist<<G4endl;
530 assert(ApproxEqual(Dist,34.641016151377549));
531
532 Dist=s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
533 // G4cout<<"s13.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz... = "<<Dist<<G4endl;
534 assert(ApproxEqual(Dist,11.547005383792508));
535
536 Dist=s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vz,calcNorm,pgoodNorm,pNorm);
537 // G4cout<<"s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vz... = "<<Dist<<G4endl;
538 assert(ApproxEqual(Dist,11.547005383792508));
539
540 Dist=s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
541 // G4cout<<"s14.DistanceToOut(G4ThreeVector(20.,0.,0.),vmz... = "<<Dist<<G4endl;
542 assert(ApproxEqual(Dist,34.641016151377549));
543
544 Dist=sb830.DistanceToOut(pb830,vb830,calcNorm,pgoodNorm,pNorm);
545 G4cout<<"sb830.DistanceToOut(pb830,vb830... = "<<Dist<<G4endl;
546 inside = sb830.Inside(pb830+Dist*vb830);
547 G4cout<<"sb830.Inside(pb830+Dist*vb830) = "<<OutputInside(inside)<<G4endl ;
548
549 Dist=sn11.DistanceToOut( G4ThreeVector(0.,0.,20.), vmz, calcNorm, pgoodNorm, pNorm);
550 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(0.,0.,20.),vmz... = "<<Dist<<G4endl;
551 assert(ApproxEqual(Dist,20.));
552
553 Dist=sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
554 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz... = "<<Dist<<G4endl;
555 assert(ApproxEqual(Dist,0.));
556
557 Dist=sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vz,calcNorm,pgoodNorm,pNorm);
558 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz... = "<<Dist<<G4endl;
559 assert(ApproxEqual(Dist,50.));
560
561 Dist=sn11.DistanceToOut(G4ThreeVector(10.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
562 // G4cout<<"sn11.DistanceToOut(G4ThreeVector(10.,0.,0.),vmz... = "<<Dist<<G4endl;
563 assert(ApproxEqual(Dist,0.));
564
565 Dist=sn12.DistanceToOut(G4ThreeVector(0.,0.,20.),vxmz,calcNorm,pgoodNorm,pNorm);
566 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(0.,0.,20.),vxmz... = "<<Dist<<G4endl;
567 assert(ApproxEqual(Dist,20./std::sqrt(2.)));
568
569 Dist=sn12.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz,calcNorm,pgoodNorm,pNorm);
570 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(0.,0.,0.),vmz... = "<<Dist<<G4endl;
571 assert(ApproxEqual(Dist,0.));
572
573 Dist=sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vz,calcNorm,pgoodNorm,pNorm);
574 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vz... = "<<Dist<<G4endl;
575 assert(ApproxEqual(Dist,38.989794855663561179));
576
577
578 Dist=sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vmz,calcNorm,pgoodNorm,pNorm);
579 // G4cout<<"sn12.DistanceToOut(G4ThreeVector(10.,0.,10.),vmz... = "<<Dist<<G4endl;
580 assert(ApproxEqual(Dist,0.));
581
582
583 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vz,calcNorm,pgoodNorm,pNorm);
584 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vz... = "<<Dist<<G4endl;
585 assert(ApproxEqual(Dist,0.));
586
587
588 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vz,calcNorm,pgoodNorm,pNorm);
589 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vz... = "<<Dist<<G4endl;
590 assert(ApproxEqual(Dist,5.));
591
592
593 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vmxz,calcNorm,pgoodNorm,pNorm);
594 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,5.),vmxz... = "<<Dist<<G4endl;
595 assert(ApproxEqual(Dist,3.5355339059327381968));
596
597 Dist=sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vmxz,calcNorm,pgoodNorm,pNorm);
598 // G4cout<<"sn14.DistanceToOut(G4ThreeVector(10.,0.,10.),vmxz... = "<<Dist<<G4endl;
599 assert(ApproxEqual(Dist,0.));
600
601
602
603 iMax = 10000;
604 rMax = 49.;
605 zP = -1.;
606
607 for( i = 0; i < iMax; i++)
608 {
609 rRand = rMax*G4UniformRand();
610 phi = twopi*G4UniformRand();
611 pRand = G4ThreeVector( rRand*std::cos(phi), rRand*std::sin(phi), zP);
612
613 cosTheta = 0.99*G4UniformRand();
614
615 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
616 phi = twopi*G4UniformRand();
617 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
618
619 Dist = sn15.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
620
621 if( Dist*cosTheta > -2.*zP )
622 {
623 G4cout<<"sn15.DistanceToOut(pRand,vRand,..., i = "<<i<<G4endl;
624 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
625 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
626 break;
627 }
628 }
629 pRand = G4ThreeVector( -9.3576454272980740257, 10.436745988128407703, -1.);
630 vRand = G4ThreeVector( -0.064906521070262901407, 0.35249758429187183495, 0.93355910181999202102);
631 Dist = sn15.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
632 // G4cout<<"sn15.DistanceToOut(pRand,vRand... = "<<Dist<<G4endl;
633 assert(ApproxEqual(Dist,1.3409673565670394701));
634
635
636 zP = 1.;
637
638 for( i = 0; i < iMax; i++)
639 {
640 rRand = rMax*G4UniformRand();
641 phi = twopi*G4UniformRand();
642 pRand = G4ThreeVector( rRand*std::cos(phi), rRand*std::sin(phi), zP);
643
644 cosTheta = -0.99*G4UniformRand();
645
646 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
647 phi = twopi*G4UniformRand();
648 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
649
650 Dist = sn16.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
651
652 if( -Dist*cosTheta > 2.*zP )
653 {
654 G4cout<<"sn16.DistanceToOut(pRand,vRand,..., i = "<<i<<G4endl;
655 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
656 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
657 break;
658 }
659 }
660
661
662
663 pRand = G4ThreeVector( -18.872396210750576273, 11.573660000258405134, 1);
664 vRand = G4ThreeVector( -0.85674495247509219187, -0.51247617288646407641, -0.057933225631713866632);
665 Dist = sn16.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
666 // G4cout<<"sn16.DistanceToOut(pRand,vRand... = "<<Dist<<G4endl;
667 assert(ApproxEqual(Dist,8.9849541128705734394));
668
669
670
671 zP = -2.;
672
673 for( i = 0; i < iMax; i++)
674 {
675 rRand = rMax*G4UniformRand();
676 phi = twopi*G4UniformRand();
677
678 pRand = G4ThreeVector( rRand*std::cos(phi)*std::sin(91.*deg),
679 rRand*std::sin(phi)*std::sin(91.*deg),
680 rRand*std::cos(91.*deg));
681
682 cosTheta = std::cos( 180.*deg-89.*deg*G4UniformRand() );
683
684 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
685 phi = twopi*G4UniformRand();
686 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
687
688 Dist = sn17.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
689
690 if( -Dist*cosTheta > 50. )
691 {
692 G4cout<<"sn17.DistanceToOut(pRand,vRand,..., i = "<<i<<G4endl;
693 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
694 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
695 break;
696 }
697 }
698
699 pRand = G4ThreeVector(16.20075504802145, -22.42917454903122, -41.6469406430184);
700 vRand = G4ThreeVector( -0.280469198715188, 0.4463870649961534, 0.8497503261406731 );
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 // assert(ApproxEqual(Dist,8.9849541128705734394));
708
709 pRand = G4ThreeVector(2.469342694407535, -0.5746362009323557, -0.04425421860130281);
710 vRand = G4ThreeVector( -0.2513630044708909, 0.4396138160169732, -0.8622971255607673);
711 norm = sn17.SurfaceNormal(pRand);
712 G4cout<<"norm = sn17.SurfaceNormal(pRand) = "<<norm.x()<<", "<<norm.y()<<", "<<norm.z()<<G4endl;
713 inside = sn17.Inside(pRand);
714 G4cout<<"sn17.Inside(pRand) = "<<OutputInside(inside)<<G4endl ;
715 Dist = sn17.DistanceToOut(pRand,vRand,calcNorm,pgoodNorm,pNorm);
716 G4cout<<"sn17.DistanceToOut(pRand,vRand,...) = "<<Dist<<G4endl;
717 Dist = sn17.DistanceToIn(pRand,vRand);
718 G4cout<<"sn17.DistanceToIn(pRand,vRand) = "<<Dist<<G4endl;
719 // assert(ApproxEqual(Dist,8.9849541128705734394));
720
721
722
723
724// Checking G4Sphere::DistanceToIn(P)
725
726 Dist=s2.DistanceToIn(pzero);
727 assert(ApproxEqual(Dist,45));
728 Dist=s1.DistanceToIn(ponrmax1);
729 assert(ApproxEqual(Dist,0));
730
731// Checking G4Sphere::DistanceToIn(P,V)
732
733
734 zP = 3.;
735
736 for( i = 0; i < iMax; i++)
737 {
738 rRand = 0.5*rMax*G4UniformRand();
739 phi = twopi*G4UniformRand();
740 pRand = G4ThreeVector( rRand*std::cos(phi), rRand*std::sin(phi), zP);
741
742 cosTheta = std::cos( 180.*deg - 78.*deg*G4UniformRand() );
743 cosTheta = -0.99; // std::cos( 180.*deg - 78.*deg*G4UniformRand() );
744
745 sinTheta = std::sqrt((1.-cosTheta)*(1.+cosTheta));
746 phi = twopi*G4UniformRand();
747 vRand = G4ThreeVector( sinTheta*std::cos(phi), sinTheta*std::sin(phi), cosTheta);
748
749 Dist = sn17.DistanceToIn(pRand,vRand);
750
751 if( -Dist*cosTheta > 2.*zP )
752 {
753 G4cout<<"sn17.DistanceToIn(pRand,vRand), i = "<<i<<G4endl;
754 G4cout<<pRand.x()<<", "<<pRand.y()<<", "<<pRand.z()<<G4endl;
755 G4cout<<vRand.x()<<", "<<vRand.y()<<", "<<vRand.z()<<G4endl;
756 break;
757 }
758 }
759
760
761
762 pRand = G4ThreeVector( -10.276604989981144911, -4.7072500741022338389, 1);
763 vRand = G4ThreeVector( -0.28873162920537848164, 0.51647890054938394577, -0.80615357816219324061);
764 Dist = sn17.DistanceToIn(pRand,vRand);
765 G4cout<<"sn17.DistanceToIn(pRand,vRand) = "<<Dist<<G4endl;
766 // assert(ApproxEqual(Dist,8.9849541128705734394));
767
768
769
770
771 Dist=s1.DistanceToIn(ponzmax,vz);
772 G4cout<<"s1.DistanceToIn(ponzmax,vz) = "<<Dist<<G4endl;
773 Dist=s1.DistanceToIn(pbigy,vy);
774 assert(Dist==kInfinity);
775 Dist=s1.DistanceToIn(pbigy,vmy);
776 assert(ApproxEqual(Dist,50));
777
778 Dist=s2.DistanceToIn(pzero,vy);
779 G4cout<<"s2.DistanceToIn(pzero,vx) = "<<Dist<<G4endl;
780 assert(ApproxEqual(Dist,45));
781 Dist=s2.DistanceToIn(pzero,vmy);
782 assert(ApproxEqual(Dist,45));
783 Dist=s2.DistanceToIn(ponrmin1,vx);
784 // G4cout<<"s2.DistanceToIn(ponmin1,vx) = "<<Dist<<G4endl;
785 assert(Dist==0);
786 Dist=s2.DistanceToIn(ponrmin1,vmx);
787 assert(ApproxEqual(Dist,90));
788
789 Dist=s2.DistanceToIn(ponrmin2,vx);
790 assert(Dist==0);
791 Dist=s2.DistanceToIn(ponrmin2,vmx);
792 assert(ApproxEqual(Dist,90/std::sqrt(2.)));
793
794
795 Dist=s3.DistanceToIn(ptesttheta1,vmz);
796 // G4cout<<"s3.DistanceToIn(ptesttheta1,vmz) = "<<Dist<<G4endl;
797 assert(ApproxEqual(Dist,100-48/std::sqrt(2.)));
798 Dist=s3.DistanceToIn(pontheta1,vz);
799 // G4cout<<"s3.DistanceToIn(pontheta1,vz) = "<<Dist<<G4endl;
800 assert(Dist==kInfinity);
801 Dist=s3.DistanceToIn(pontheta1,vmz);
802 assert(Dist==0);
803 Dist=s3.DistanceToIn(pontheta2,vz);
804 // G4cout<<"s3.DistanceToIn(pontheta2,vz) = "<<Dist<<G4endl;
805 assert(Dist==0);
806 Dist=s3.DistanceToIn(pontheta2,vmz);
807 assert(Dist==kInfinity);
808 Dist=s32.DistanceToIn(pontheta1,vz);
809 // G4cout<<"s32.DistanceToIn(pontheta1,vz) = "<<Dist<<G4endl;
810 assert(Dist==0);
811 Dist=s32.DistanceToIn(pontheta1,vmz);
812 // G4cout<<"s32.DistanceToIn(pontheta1,vmz) = "<<Dist<<G4endl;
813 assert(Dist==kInfinity);
814 Dist=s33.DistanceToIn(pontheta2,vz);
815 // G4cout<<"s33.DistanceToIn(pontheta2,vz) = "<<Dist<<G4endl;
816 assert(Dist==kInfinity);
817 Dist=s33.DistanceToIn(pontheta2,vmz);
818 // G4cout<<"s33.DistanceToIn(pontheta2,vmz) = "<<Dist<<G4endl;
819 assert(Dist==0);
820
821 Dist=s4.DistanceToIn(pbigy,vmy);
822 assert(Dist==kInfinity);
823 Dist=s4.DistanceToIn(pbigz,vmz);
824 assert(ApproxEqual(Dist,50));
825 Dist=s4.DistanceToIn(pzero,vy);
826 assert(Dist==kInfinity);
827 Dist=s4.DistanceToIn(pzero,vx);
828 assert(ApproxEqual(Dist,45));
829
830 Dist=s4.DistanceToIn(ptestphi1,vx);
831 assert(ApproxEqual(Dist,100+45/std::sqrt(2.)));
832 Dist=s4.DistanceToIn(ponphi1,vmxmy);
833 assert(Dist==kInfinity);
834 Dist=s4.DistanceToIn(ponphi1,vxy);
835 // G4cout<<"s4.DistanceToIn(ponphi1,vxy) = "<<Dist<<G4endl;
836 assert(ApproxEqual(Dist,0));
837
838 Dist=s4.DistanceToIn(ptestphi2,vx);
839 assert(ApproxEqual(Dist,100+45/std::sqrt(2.)));
840 Dist=s4.DistanceToIn(ponphi2,vmxy);
841 assert(Dist==kInfinity);
842 Dist=s4.DistanceToIn(ponphi2,vxmy);
843 // G4cout<<"s4.DistanceToIn(ponphi2,vxmy) = "<<Dist<<G4endl;
844 assert(ApproxEqual(Dist,0));
845
846 Dist=s3.DistanceToIn(pzero,vx);
847 assert(ApproxEqual(Dist,45));
848 Dist=s3.DistanceToIn(ptesttheta1,vmz);
849 assert(ApproxEqual(Dist,100-48/std::sqrt(2.)));
850 Dist=b216.DistanceToIn(p216,v216);
851 // G4cout<<"b216.DistanceToIn(p216,v216) = "<<Dist<<G4endl;
852
853 Dist=b658.DistanceToIn(pzero,vz);
854 G4cout<<"b658.DistanceToIn(pzero,vz) = "<<Dist<<G4endl;
855
856
857
858 Dist=s13.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz);
859 // G4cout<<"s13.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz... = "<<Dist<<G4endl;
860 assert(ApproxEqual(Dist,58.452994616207498));
861
862 Dist=s13.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz);
863 // G4cout<<"s13.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz... = "<<Dist<<G4endl;
864 assert(ApproxEqual(Dist,35.358983848622451));
865
866
867 Dist=s14.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz);
868 // G4cout<<"s14.DistanceToIn(G4ThreeVector(20.,0.,-70.),vz... = "<<Dist<<G4endl;
869 assert(ApproxEqual(Dist,35.358983848622451));
870
871 Dist=s14.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz);
872 // G4cout<<"s14.DistanceToIn(G4ThreeVector(20.,0.,70.),vmz... = "<<Dist<<G4endl;
873 assert(ApproxEqual(Dist,58.452994616207498));
874
875 Dist=b1046.DistanceToIn(G4ThreeVector(0.,0.,4800*km),vmz);
876 G4cout<<"b1046.DistanceToIn(G4ThreeVector(0.,0.,4800*km),vmz... = "<<Dist<<G4endl;
877 // assert(ApproxEqual(Dist,0.));
878
879
880
881
882
883 ///////////////////////////////////////////////////////////////////////////
884
885
886// CalculateExtent
887 G4VoxelLimits limit; // Unlimited
888 G4RotationMatrix noRot;
889 G4AffineTransform origin;
890 G4double min,max;
891 assert(s1.CalculateExtent(kXAxis,limit,origin,min,max));
892 assert(min<=-50&&max>=50);
893 assert(s1.CalculateExtent(kYAxis,limit,origin,min,max));
894 assert(min<=-50&&max>=50);
895 assert(s1.CalculateExtent(kZAxis,limit,origin,min,max));
896 assert(min<=-50&&max>=50);
897
898 assert(s2.CalculateExtent(kXAxis,limit,origin,min,max));
899 assert(min<=-50&&max>=50);
900 assert(s2.CalculateExtent(kYAxis,limit,origin,min,max));
901 assert(min<=-50&&max>=50);
902 assert(s2.CalculateExtent(kZAxis,limit,origin,min,max));
903 assert(min<=-50&&max>=50);
904
905 assert(s3.CalculateExtent(kXAxis,limit,origin,min,max));
906 assert(min<=-50&&max>=50);
907 assert(s3.CalculateExtent(kYAxis,limit,origin,min,max));
908 assert(min<=-50&&max>=50);
909 assert(s3.CalculateExtent(kZAxis,limit,origin,min,max));
910 assert(min<=-50/std::sqrt(2.)&&max>=50/std::sqrt(2.));
911
912 G4ThreeVector pmxmymz(-100,-110,-120);
913 G4AffineTransform tPosOnly(pmxmymz);
914 assert(s1.CalculateExtent(kXAxis,limit,tPosOnly,min,max));
915 assert(min<=-150&&max>=-50);
916 assert(s1.CalculateExtent(kYAxis,limit,tPosOnly,min,max));
917 assert(min<=-160&&max>=-60);
918 assert(s1.CalculateExtent(kZAxis,limit,tPosOnly,min,max));
919 assert(min<=-170&&max>=-70);
920
921 assert(s3.CalculateExtent(kXAxis,limit,tPosOnly,min,max));
922 assert(min<=-150&&max>=-50);
923 assert(s3.CalculateExtent(kYAxis,limit,tPosOnly,min,max));
924 assert(min<=-160&&max>=-60);
925 assert(s3.CalculateExtent(kZAxis,limit,tPosOnly,min,max));
926 assert(min<=-170+50/std::sqrt(2.)&&max>=-70-50/std::sqrt(2.));
927
928 G4RotationMatrix r90Z;
929 r90Z.rotateZ(halfpi);
930 G4AffineTransform tRotZ(r90Z,pzero);
931 assert(s1.CalculateExtent(kXAxis,limit,tRotZ,min,max));
932 assert(min<=-50&&max>=50);
933 assert(s1.CalculateExtent(kYAxis,limit,tRotZ,min,max));
934 assert(min<=-50&&max>=50);
935 assert(s1.CalculateExtent(kZAxis,limit,tRotZ,min,max));
936 assert(min<=-50&&max>=50);
937
938 assert(s2.CalculateExtent(kXAxis,limit,tRotZ,min,max));
939 assert(min<=-50&&max>=50);
940 assert(s2.CalculateExtent(kYAxis,limit,tRotZ,min,max));
941 assert(min<=-50&&max>=50);
942 assert(s2.CalculateExtent(kZAxis,limit,tRotZ,min,max));
943 assert(min<=-50&&max>=50);
944
945 assert(s3.CalculateExtent(kXAxis,limit,tRotZ,min,max));
946 assert(min<=-50&&max>=50);
947 assert(s3.CalculateExtent(kYAxis,limit,tRotZ,min,max));
948 assert(min<=-50&&max>=50);
949 assert(s3.CalculateExtent(kZAxis,limit,tRotZ,min,max));
950 assert(min<=-50/std::sqrt(2.)&&max>=50/std::sqrt(2.));
951
952// Check that clipped away
953 G4VoxelLimits xClip;
954 xClip.AddLimit(kXAxis,-100,-60);
955 assert(!s1.CalculateExtent(kXAxis,xClip,origin,min,max));
956
957// Assert clipped to volume
958 G4VoxelLimits allClip;
959 allClip.AddLimit(kXAxis,-5,+5);
960 allClip.AddLimit(kYAxis,-5,+5);
961 allClip.AddLimit(kZAxis,-5,+5);
962 G4RotationMatrix genRot;
963 genRot.rotateX(pi/6);
964 genRot.rotateY(pi/6);
965 genRot.rotateZ(pi/6);
966 G4AffineTransform tGen(genRot,vx);
967 assert(s1.CalculateExtent(kXAxis,allClip,tGen,min,max));
968 assert(min<=-5&&max>=5);
969 assert(s1.CalculateExtent(kYAxis,allClip,tGen,min,max));
970 assert(min<=-5&&max>=5);
971 assert(s1.CalculateExtent(kZAxis,allClip,tGen,min,max));
972 assert(min<=-5&&max>=5);
973
974 assert(s2.CalculateExtent(kXAxis,allClip,tGen,min,max));
975 assert(min<=-5&&max>=5);
976 assert(s2.CalculateExtent(kYAxis,allClip,tGen,min,max));
977 assert(min<=-5&&max>=5);
978 assert(s2.CalculateExtent(kZAxis,allClip,tGen,min,max));
979 assert(min<=-5&&max>=5);
980
981 s34.CalculateExtent(kXAxis,allClip,tGen,min,max);
982 // G4cout<<"s34.CalculateExtent(kXAxis,allClip,tGen,min,max)"<<G4endl ;
983 // G4cout<<"min = "<<min<<" max = "<<max<<G4endl ;
984
985 s34.CalculateExtent(kYAxis,allClip,tGen,min,max);
986 // G4cout<<"s3.CalculateExtent(kYAxis,allClip,tGen,min,max)"<<G4endl ;
987 // G4cout<<"min = "<<min<<" max = "<<max<<G4endl ;
988
989 s34.CalculateExtent(kZAxis,allClip,tGen,min,max);
990 // G4cout<<"s34.CalculateExtent(kZAxis,allClip,tGen,min,max)"<<G4endl ;
991 // G4cout<<"min = "<<min<<" max = "<<max<<G4endl ;
992 assert(s34.CalculateExtent(kXAxis,allClip,tGen,min,max));
993 assert(min<=-5&&max>=5);
994 assert(s34.CalculateExtent(kYAxis,allClip,tGen,min,max));
995 assert(min<=-5&&max>=5);
996 assert(s34.CalculateExtent(kZAxis,allClip,tGen,min,max));
997 assert(min<=-5&&max>=5);
998
999// Test z clipping ok
1000 for (G4double zTest=-100;zTest<100;zTest+=9)
1001 {
1002 G4VoxelLimits zTestClip;
1003 zTestClip.AddLimit(kZAxis,-kInfinity,zTest);
1004 if (zTest<-50)
1005 {
1006 assert(!s1.CalculateExtent(kZAxis,zTestClip,origin,min,max));
1007 assert(!s2.CalculateExtent(kZAxis,zTestClip,origin,min,max));
1008 }
1009 else
1010 {
1011 assert(s1.CalculateExtent(kZAxis,zTestClip,origin,min,max));
1012 assert(s2.CalculateExtent(kZAxis,zTestClip,origin,min,max));
1013 G4double testMin=-50;
1014 G4double testMax=(zTest<50) ? zTest : 50;
1015 assert (ApproxEqual(min,testMin)
1016 &&ApproxEqual(max,testMax));
1017 }
1018 }
1019
1020// Test y clipping ok
1021 for (G4double xTest=-100;xTest<100;xTest+=9)
1022 {
1023 G4VoxelLimits xTestClip;
1024 xTestClip.AddLimit(kXAxis,-kInfinity,xTest);
1025 if (xTest<-50)
1026 {
1027 assert(!s1.CalculateExtent(kYAxis,xTestClip,origin,min,max));
1028 }
1029 else
1030 {
1031 assert(s1.CalculateExtent(kYAxis,xTestClip,origin,min,max));
1032// Calc max y coordinate
1033 G4double testMax=(xTest<0) ? std::sqrt(50*50-xTest*xTest) : 50;
1034 assert (ApproxEqual(min,-testMax)
1035 &&ApproxEqual(max,testMax));
1036 }
1037 }
1038
1039// Test x clipping ok
1040 for (G4double yTest=-100;yTest<100;yTest+=9)
1041 {
1042 G4VoxelLimits yTestClip;
1043 yTestClip.AddLimit(kYAxis,-kInfinity,yTest);
1044 if (yTest<-50)
1045 {
1046 assert(!s1.CalculateExtent(kXAxis,yTestClip,origin,min,max));
1047 }
1048 else
1049 {
1050 assert(s1.CalculateExtent(kXAxis,yTestClip,origin,min,max));
1051// Calc max y coordinate
1052 G4double testMax=(yTest<0) ? std::sqrt(50*50-yTest*yTest) : 50;
1053 assert (ApproxEqual(min,-testMax)
1054 &&ApproxEqual(max,testMax));
1055 }
1056 }
1057
1058 G4bool checkPoint( const G4Sphere& pSph, G4ThreeVector origin,
1059 G4double d, G4ThreeVector dir, EInside exp);
1060
1061 G4Sphere SpAroundX("SpAroundX", 10.*mm, 1000.*mm, -1.0*degree, 2.0*degree, 0.*degree, 180.0*degree );
1062
1063 G4double sinOneDeg = std::sin( 1.0 * degree );
1064 radOne = 100.0 * mm;
1065
1066 G4ThreeVector ptPhiSurfExct= G4ThreeVector( radOne * std::cos( -1.0 * degree ) ,
1067 - radOne * sinOneDeg,
1068 0.0 );
1069 G4cout << " Starting from point " << ptPhiSurfExct << G4endl;
1070 G4cout << " using direction " << vy << G4endl;
1071 checkPoint( SpAroundX, ptPhiSurfExct, -radOne * kAngTolerance * 1.5,
1072 vy, kOutside);
1073 checkPoint( SpAroundX, ptPhiSurfExct, -radOne * kAngTolerance * 0.49,
1074 vy, kSurface);
1075 checkPoint( SpAroundX, ptPhiSurfExct, -radOne * kAngTolerance * 0.25,
1076 vy, kSurface);
1077 checkPoint( SpAroundX, ptPhiSurfExct, 0.0,
1078 vy, kSurface);
1079 checkPoint( SpAroundX, ptPhiSurfExct, radOne * kAngTolerance * 0.25,
1080 vy, kSurface);
1081 checkPoint( SpAroundX, ptPhiSurfExct, radOne * kAngTolerance * 0.49,
1082 vy, kSurface);
1083 checkPoint( SpAroundX, ptPhiSurfExct, radOne * kAngTolerance * 1.5,
1084 vy, kInside);
1085
1086 // Try one that has a 'deep' negative phi section
1087 // --> Vlad. Grichine test case, 30 Oct 2003
1088 //
1089 G4cout << G4endl << G4endl << "" << G4endl;
1090 G4cout << "========================================================= " << G4endl;
1091
1092 G4Sphere SphDeepNeg("DeepNegPhiSphere", 10.*mm, 1000.*mm,
1093 -270.0*degree, 280.0*degree, // start Phi, delta Phi
1094 0.*degree, 180.0*degree ); // start Theta, delta Theta
1095 G4double phiPoint = 160.0 * degree;
1096 G4ThreeVector StartPt( radOne * std::cos(phiPoint), radOne * std::sin(phiPoint), 0.0);
1097 G4cout << "For sphere " << SphDeepNeg.GetName() << G4endl;
1098 G4cout << " Starting from point " << ptPhiSurfExct << G4endl;
1099
1100 checkPoint( SphDeepNeg, StartPt, 0.0, vy, kInside);
1101
1102 // Try the edges
1103 G4ThreeVector NegEdgePt( radOne * std::cos(-270.0*degree), radOne * std::sin(-270.0*degree), 0.0);
1104 G4ThreeVector PosEdgePt( radOne * std::cos(10.0*degree), radOne * std::sin(10.0*degree), 0.0);
1105
1106 G4cout << "--------------------------------------------------------" << G4endl;
1107 G4cout << " New point " << NegEdgePt << " should be at Neg edge of -270.0 degrees " << G4endl;
1108 checkPoint( SphDeepNeg, NegEdgePt, 0.0, -vx, kSurface);
1109 checkPoint( SphDeepNeg, NegEdgePt, radOne*kAngTolerance * 0.25, -vx, kSurface);
1110 checkPoint( SphDeepNeg, NegEdgePt, -radOne*kAngTolerance * 0.25, -vx, kSurface);
1111 checkPoint( SphDeepNeg, NegEdgePt, radOne*kAngTolerance * 1.25, -vx, kInside);
1112 checkPoint( SphDeepNeg, NegEdgePt, -radOne*kAngTolerance * 1.25, -vx, kOutside);
1113
1114 G4cout << "--------------------------------------------------------" << G4endl;
1115 G4cout << " New point " << PosEdgePt << " should be at Pos edge of +10.0 degrees " << G4endl;
1116 checkPoint( SphDeepNeg, PosEdgePt, 0.0, -vy, kSurface);
1117 checkPoint( SphDeepNeg, PosEdgePt, radOne*kAngTolerance * 0.25, -vy, kSurface);
1118 checkPoint( SphDeepNeg, PosEdgePt, -radOne*kAngTolerance * 0.25, -vy, kSurface);
1119 checkPoint( SphDeepNeg, PosEdgePt, -radOne*kAngTolerance * 1.25, -vy, kOutside);
1120 checkPoint( SphDeepNeg, PosEdgePt, radOne*kAngTolerance * 1.25, -vy, kInside);
1121
1122
1123
1124 // G4double sTheta = 135*degree, pxt = -10., pyt = 10.;
1125
1126 // G4cout<<"sTheta = "<<sTheta/degree<<" degree"<<G4endl;
1127 // G4cout<<"std::tan(sTheta) = "<<std::tan(sTheta)<<G4endl;
1128 // G4cout<<"std::sin(sTheta) = "<<std::sin(sTheta)<<G4endl;
1129 // G4cout<<"std::atan(sTheta) = "<<std::atan(sTheta)/degree<<G4endl;
1130 // G4cout<<"std::atan2(pyt,pxt) = pyt/pxt = "<<std::atan2(pyt,pxt)/degree<<G4endl;
1131
1132 return 0;
1133}
1134
1135// Given the sphere 'rSphere', a point 'origin'
1136// --> --> -->
1137// the function below checks that the point pnew=( origin + dist * direction )
1138// - the point (p+dist*dir) is located in the part of the solid given by 'expectedInResult'
1139// - and that from there, the DistanceToIn along 'dir' is not negative or Infinite
1140//
1141// Use cases expected:
1142// - 'origin' is on/near a surface and 'direction' is pointing towards the inside of the solid
1143
1144G4bool
1145checkPoint( const G4Sphere &rSphere,
1146 G4ThreeVector origin,
1147 G4double dist,
1148 G4ThreeVector direction,
1149 EInside expectedInResult)
1150{
1151 G4int verbose = 0;
1152
1153 G4ThreeVector newPoint;
1154 G4double distIn=-1.0, distOut=-1.0;
1155
1156 newPoint = origin + dist * direction;
1157
1158 G4int oldPrecision= G4cout.precision(10);
1159 // G4cout << " --- Sphere " << rSphere.GetName() << "" << G4endl;
1160 if( verbose > 0 ) {
1161 G4cout << G4endl;
1162 if (verbose > 2 ) G4cout << " Sphere " << rSphere.GetName();
1163 G4cout.precision(10);
1164 if (verbose > 1 ) G4cout << " dir= " << direction;
1165 G4cout << " dist= " << dist;
1166 }
1167
1168 EInside inSphere= rSphere.Inside( newPoint ) ;
1169 /*======*/
1170 G4cout.precision(15);
1171 // G4cout << " NewPoint " << newPoint << " is "
1172 G4bool goodIn= (inSphere == expectedInResult) ;
1173 if ( !goodIn ) {
1174 G4cout << " ************ Unexpected Result for Inside *************** " << G4endl;
1175 }
1176 if ( verbose || !goodIn ) {
1177 G4cout << " New point "
1178 << " is " << OutputInside( inSphere )
1179 << " vs " << OutputInside( expectedInResult )
1180 << " expected." << G4endl ;
1181 }
1182
1183 G4bool goodDistIn = true;
1184
1185 distIn = rSphere.DistanceToIn( newPoint, direction );
1186 /*===========*/
1187 if ( verbose ) G4cout << " DistToIn (p, dir) = " << distIn << G4endl;
1188 if( (inSphere == kOutside)
1189 && (distIn < 0.0 ) // Cannot use 0.5*kCarTolerance for Angular tolerance!!
1190 ){
1191 G4cout << " ********** Unexpected Result for DistanceToIn from outside ********* " << G4endl;
1192 // G4cout << " It should be " << G4endl;
1193 goodDistIn = false;
1194 }
1195 if( (inSphere == kSurface )
1196 && ( (distIn < 0.0) || (distIn >= kInfinity ))
1197 ){
1198 G4cout << " ********** Unexpected Result for DistanceToIn on surface ********* " << G4endl;
1199 // if ( (distIn != 0.0) )
1200 // - Can check that the return value must be 0.0
1201 // But in general case the direction can be away from the solid,
1202 // and then a finite or kInfinity answer is correct
1203 // --> must check the direction against the normal
1204 // in order to perform this check in general case.
1205
1206 goodDistIn = false;
1207 }
1208 if ( verbose || !goodDistIn ) {
1209 G4cout << " DistToIn (p, dir) = " << distIn << G4endl;
1210 }
1211
1212 G4bool good= (goodIn && goodDistIn);
1213 if ( !good ){
1214 // There was an error -- document the use case!
1215 G4cout << " --- Sphere " << rSphere.GetName() << "" << G4endl;
1216 G4cout << " Origin= " << origin << G4endl;
1217 G4cout << " Direction= " << direction << G4endl;
1218 G4cout << " dist= " << dist;
1219 G4cout << " Actual-point= " << newPoint << G4endl;
1220 }
1221
1222 distOut = rSphere.DistanceToOut( newPoint, direction );
1223 /*=============*/
1224 if ( verbose ) G4cout << " DistToOut (p, dir) = " << distOut << G4endl;
1225
1226 G4cout.precision(oldPrecision);
1227
1228 return good;
1229}
1230
Note: See TracBrowser for help on using the repository browser.