source: trunk/source/geometry/solids/test/testSolidComparisons.cc@ 1355

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

geant4 tag 9.4

File size: 14.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: testSolidComparisons.cc,v 1.6 2007/05/18 11:06:34 gcosmo Exp $
28// GEANT4 tag $Name: geant4-09-04-ref-00 $
29//
30//
31// --------------------------------------------------------------
32//
33// Test for comparison of solids of different type but similar topology
34// Returns 0 if there no inconsistencies in the answers provided by the
35// compared solids.
36//
37// Author: Dionysios Anninos
38//
39// --------------------------------------------------------------
40#include <assert.h>
41#include <cmath>
42
43#include "globals.hh"
44#include "geomdefs.hh"
45#include "G4GeometryTolerance.hh"
46
47#include "G4ThreeVector.hh"
48#include "G4TwoVector.hh"
49
50#include "G4Tubs.hh"
51#include "G4Ellipsoid.hh"
52#include "G4EllipticalTube.hh"
53#include "G4Orb.hh"
54#include "G4Sphere.hh"
55#include "G4Box.hh"
56#include "G4Trap.hh"
57#include "G4ExtrudedSolid.hh"
58
59#include "Randomize.hh"
60
61#include "G4RotationMatrix.hh"
62#include "G4AffineTransform.hh"
63#include "G4VoxelLimits.hh"
64
65using namespace CLHEP;
66
67void logErrors(G4double x, G4double y, G4double z,
68 G4double vx, G4double vy, G4double vz, G4double dist)
69{
70 G4cout <<"The point ("<<x<<","<<y<<","<<z<<")"<<G4endl
71 <<"In the direction ("<<vx<<","<<vy<<","<<vz<<")"<<G4endl
72 <<"Gives a difference of "<<dist<<"cm !"<<G4endl;
73}
74
75G4bool compareEllipsoidtoOrb(G4int N)
76{
77
78 G4bool what = true;
79 G4int i=0, n=0;
80 G4ThreeVector pin, pout, dir;
81 G4double xin, yin, zin, xout, yout, zout, dist1, dist2, dist;
82
83 G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
84
85 // construct the ellipsoid and Orb with the same dimensions
86
87 G4Ellipsoid t1("Solid Ellipsoid #1",
88 20*cm, // xSemiAxis
89 20*cm, // ySemiAxis
90 20*cm) ; // zSemiAxis
91
92
93 G4Orb t2("Solid Orb #1", 20*cm) ;
94
95 for(i=0; i<N; i++)
96 {
97 xout = RandFlat::shoot(25.0*cm,300.0*cm);
98 yout = RandFlat::shoot(25.0*cm,300.0*cm);
99 zout = RandFlat::shoot(25.0*cm,300.0*cm);
100
101 xin = RandFlat::shoot(-10.0*cm,10.0*cm);
102 yin = RandFlat::shoot(-10.0*cm,10.0*cm);
103 zin = RandFlat::shoot(-10.0*cm,10.0*cm);
104
105 pin = G4ThreeVector(xin, yin, zin );
106 pout = G4ThreeVector(xout, yout, zout);
107
108 dir = pin - pout;
109 dir /= dir.mag();
110
111 dist1 = t1.DistanceToIn(pout,dir) ;
112 dist2 = t2.DistanceToIn(pout,dir) ;
113
114 if(dist1 != kInfinity && dist2 !=kInfinity)
115 {
116 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
117 {
118 what = false;
119 dist = std::fabs(dist1 - dist2);
120 logErrors( pout.x(), pout.y(), pout.z(),
121 dir.x() , dir.y() , dir.z() , dist);
122 n++;
123 }
124 }
125
126 dist1 = t1.DistanceToOut(pin,dir);
127 dist2 = t2.DistanceToOut(pin,dir);
128
129 if(dist1 != kInfinity && dist2 !=kInfinity)
130 {
131 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
132 {
133 what = false;
134 dist = std::fabs(dist1 - dist2);
135 logErrors( pin.x(), pin.y(), pin.z(),
136 dir.x(), dir.y(), dir.z(), dist);
137 n++;
138 }
139 }
140 }
141
142 G4cout <<"The number of inconsistencies when comparing Ellipsoid to Orb were: "<<n<<"."<<G4endl;
143 return what;
144}
145
146G4bool compareEllipsoidtoSphere(G4int N)
147{
148
149 G4bool what = true;
150 G4int i=0,n=0;
151 G4ThreeVector pin, pout, dir;
152 G4double xin, yin, zin, xout, yout, zout, dist1, dist2, dist;
153
154 G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
155
156 // construct the ellipsoid and sphere with the same dimensions
157
158 G4Ellipsoid t1("Solid Ellipsoid #1",
159 20*cm, // xSemiAxis
160 20*cm, // ySemiAxis
161 20*cm) ; // zSemiAxis
162
163
164 G4Sphere t2("Solid Sphere #1",
165 0*cm,
166 20*cm,
167 0*rad, 2*pi*rad,
168 0*rad, 2*pi*rad) ;
169
170 for(i=0; i<N; i++)
171 {
172 xout = RandFlat::shoot(25.0*cm,300.0*cm);
173 yout = RandFlat::shoot(25.0*cm,300.0*cm);
174 zout = RandFlat::shoot(25.0*cm,300.0*cm);
175
176 xin = RandFlat::shoot(-10.0*cm,10.0*cm);
177 yin = RandFlat::shoot(-10.0*cm,10.0*cm);
178 zin = RandFlat::shoot(-10.0*cm,10.0*cm);
179
180 pin = G4ThreeVector(xin, yin, zin);
181 pout = G4ThreeVector(xout, yout, zout);
182
183 dir = pin - pout;
184 dir /= dir.mag();
185
186 dist1 = t1.DistanceToIn(pout,dir) ;
187 dist2 = t2.DistanceToIn(pout,dir) ;
188
189 if(dist1 != kInfinity && dist2 != kInfinity)
190 {
191 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
192 {
193 what = false;
194 dist = std::fabs(dist1 - dist2);
195 logErrors(pout.x(), pout.y(), pout.z(),
196 dir.x() , dir.y() , dir.z() , dist);
197 n++;
198 }
199 }
200
201 dist1 = t1.DistanceToOut(pin,dir);
202 dist2 = t2.DistanceToOut(pin,dir);
203
204 if(dist1 != kInfinity && dist2 !=kInfinity)
205 {
206 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
207 {
208 what = false;
209 dist = std::fabs(dist1 - dist2);
210 logErrors( pin.x(), pin.y(), pin.z(),
211 dir.x(), dir.y(), dir.z(), dist);
212 n++;
213 }
214 }
215 }
216
217 G4cout <<"The number of inconsistencies when comparing Ellipsoid to Sphere were: "<<n<<"."<<G4endl;
218 return what;
219}
220
221G4bool compareEllipticalTubetoTubs(G4int N)
222{
223
224 G4bool what = true;
225 G4int i=0,n=0;
226 G4ThreeVector pin, pout, dir;
227 G4double xin, yin, zin, xout, yout, zout, dist1, dist2,dist;
228
229 G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
230
231 // construct the tube and elliptical tube with the same dimensions
232
233 G4EllipticalTube t1("Solid EllipticalTube #1",
234 20*cm, // xSemiAxis
235 20*cm, // ySemiAxis
236 20*cm) ; // zHeight
237
238
239 G4Tubs t2("Solid Tubs #1",
240 0*cm,
241 20*cm,
242 20*cm,
243 0., twopi);
244
245 for(i=0; i<N; i++)
246 {
247 xout = RandFlat::shoot(25.0*cm,300.0*cm);
248 yout = RandFlat::shoot(25.0*cm,300.0*cm);
249 zout = RandFlat::shoot(25.0*cm,300.0*cm);
250
251 xin = RandFlat::shoot(-19.0*cm,19.0*cm);
252 yin = RandFlat::shoot(-1.0*cm , 1.0*cm)*std::sqrt(361.*cm*cm-sqr(xin));
253 zin = RandFlat::shoot(-19.0*cm,19.0*cm);
254
255 pin = G4ThreeVector(xin, yin, zin);
256 pout = G4ThreeVector(xout, yout, zout);
257
258 dir = pin - pout;
259 dir /= dir.mag();
260
261 dist1 = t1.DistanceToIn(pout,dir) ;
262 dist2 = t2.DistanceToIn(pout,dir) ;
263
264 if(dist1 != kInfinity && dist2 != kInfinity)
265 {
266 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
267 {
268 what = false;
269 dist = std::fabs(dist1 - dist2);
270 logErrors(pout.x(), pout.y(), pout.z(),
271 dir.x() , dir.y() , dir.z() , dist);
272 n++;
273 }
274 }
275
276// dist1 = t1.DistanceToOut(pin,dir);
277// dist2 = t2.DistanceToOut(pin,dir);
278
279// if(dist1 != kInfinity && dist2 !=kInfinity)
280// {
281// if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
282// {
283// what = false;
284// dist = std::fabs(dist1 - dist2);
285// logErrors(pin.x(), pin.y(), pin.z(),
286// dir.x(), dir.y(), dir.z(), dist);
287// n++;
288// }
289// }
290 }
291
292 G4cout <<"The number of inconsistencies when comparing EllipticalTube to Tubs were: "<<n<<"."<<G4endl;
293 return what;
294}
295
296G4bool compareBoxtoTrap(G4int N)
297{
298
299 G4bool what = true;
300 G4int i=0,n=0;
301 G4ThreeVector pin, pout, dir;
302 G4double xin, yin, zin, xout, yout, zout, dist1, dist2, dist;
303
304 G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
305
306 G4ThreeVector pt[8] = { G4ThreeVector(-20*cm,-20*cm,-20*cm ),
307 G4ThreeVector( 20*cm,-20*cm,-20*cm ),
308 G4ThreeVector(-20*cm, 20*cm,-20*cm ),
309 G4ThreeVector( 20*cm, 20*cm,-20*cm ),
310 G4ThreeVector(-20*cm,-20*cm, 20*cm ),
311 G4ThreeVector( 20*cm,-20*cm, 20*cm ),
312 G4ThreeVector(-20*cm, 20*cm, 20*cm ),
313 G4ThreeVector( 20*cm, 20*cm, 20*cm ) };
314
315 // construct the Trap and Box with the same dimensions
316
317 G4Trap t1("Solid Trap #1",
318 pt) ;
319
320
321 G4Box t2("Solid Box #1",
322 20*cm,
323 20*cm,
324 20*cm);
325
326 for(i=0; i<N; i++)
327 {
328 xout = RandFlat::shoot(25.0*cm,300.0*cm);
329 yout = RandFlat::shoot(25.0*cm,300.0*cm);
330 zout = RandFlat::shoot(25.0*cm,300.0*cm);
331
332 xin = RandFlat::shoot(-10.0*cm,10.0*cm);
333 yin = RandFlat::shoot(-10.0*cm,10.0*cm);
334 zin = RandFlat::shoot(-10.0*cm,10.0*cm);
335
336 pin = G4ThreeVector(xin, yin, zin);
337 pout = G4ThreeVector(xout, yout, zout);
338
339 dir = pin - pout;
340 dir /= dir.mag();
341
342 dist1 = t1.DistanceToIn(pout,dir) ;
343 dist2 = t2.DistanceToIn(pout,dir) ;
344
345 if(dist1 != kInfinity && dist2 !=kInfinity)
346 {
347 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
348 {
349 what = false;
350 dist = std::fabs(dist1 - dist2);
351 logErrors(pout.x(),pout.y(),pout.z(),
352 dir.x(), dir.y(), dir.z(), dist);
353 n++;
354 }
355 }
356
357 dist1 = t1.DistanceToOut(pin,dir);
358 dist2 = t2.DistanceToOut(pin,dir);
359
360 if(dist1 != kInfinity && dist2 !=kInfinity)
361 {
362 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
363 {
364 what = false;
365 dist = std::fabs(dist1 - dist2);
366 logErrors(pin.x(), pin.y(), pin.z(),
367 dir.x(), dir.y(), dir.z(), dist);
368 n++;
369 }
370 }
371 }
372
373 G4cout <<"The number of inconsistencies when comparing Box to Trap were: "<<n<<"."<<G4endl;
374 return what;
375}
376
377G4bool compareSpheretoOrb(G4int N)
378{
379
380 G4bool what = true;
381 G4int i=0,n=0;
382 G4ThreeVector pin, pout, dir;
383 G4double xin, yin, zin, xout, yout, zout, dist1, dist2,dist;
384
385 G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
386
387 // construct the ellipsoid and sphere with the same dimensions
388
389 G4Orb t1("Solid Orb #1",
390 20*cm) ;
391
392 G4Sphere t2("Solid Sphere #1",
393 0*cm,
394 20*cm,
395 0*deg, 2*pi*rad,
396 0*rad, 2*pi*rad) ;
397
398 for(i=0; i<N; i++)
399 {
400 xout = RandFlat::shoot(25.0*cm,300.0*cm);
401 yout = RandFlat::shoot(25.0*cm,300.0*cm);
402 zout = RandFlat::shoot(25.0*cm,300.0*cm);
403
404 xin = RandFlat::shoot(-10.0*cm,10.0*cm);
405 yin = RandFlat::shoot(-10.0*cm,10.0*cm);
406 zin = RandFlat::shoot(-10.0*cm,10.0*cm);
407
408 pin = G4ThreeVector(xin, yin, zin);
409 pout = G4ThreeVector(xout, yout, zout);
410
411 dir = pin - pout;
412 dir /= dir.mag();
413
414 dist1 = t1.DistanceToIn(pout,dir) ;
415 dist2 = t2.DistanceToIn(pout,dir) ;
416
417 if(dist1 != kInfinity && dist2 != kInfinity)
418 {
419 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
420 {
421 what = false;
422 dist = std::fabs(dist1 - dist2);
423 logErrors(pout.x(),pout.y(), pout.z(),
424 dir.x() ,dir.y() , dir.z() ,dist);
425 n++;
426 }
427 }
428
429 dist1 = t1.DistanceToOut(pin,dir);
430 dist2 = t2.DistanceToOut(pin,dir);
431
432 if(dist1 != kInfinity && dist2 !=kInfinity)
433 {
434 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
435 {
436 what = false;
437 dist = std::fabs(dist1 - dist2);
438 logErrors(pin.x(), pin.y(), pin.z(),
439 dir.x(), dir.y(), dir.z(), dist);
440 n++;
441 }
442 }
443 }
444 G4cout <<"The number of inconsistencies when comparing Sphere to Orb were: "<<n<<"."<<G4endl;
445 return what;
446}
447
448G4bool compareBoxtoExtruded(G4int N)
449{
450
451 G4bool what = true;
452 G4int i=0,n=0;
453 G4ThreeVector pin, pout, dir;
454 G4double xin, yin, zin, xout, yout, zout, dist1, dist2, dist;
455
456 G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
457
458 // construct the Extruded-Solid and Box with the same dimensions
459
460 std::vector<G4TwoVector> polygon;
461 polygon.push_back(G4TwoVector(-1.0*cm,-0.5*cm));
462 polygon.push_back(G4TwoVector(-1.0*cm, 0.5*cm));
463 polygon.push_back(G4TwoVector( 1.0*cm, 0.5*cm));
464 polygon.push_back(G4TwoVector( 1.0*cm,-0.5*cm));
465
466 G4ExtrudedSolid t1("Solid Xtru #1", polygon, 3.0*cm,
467 G4TwoVector(), 1.0, G4TwoVector(), 1.0);
468
469 G4Box t2("Solid Box #2",
470 1.0*cm,
471 0.5*cm,
472 3.0*cm);
473
474 for(i=0; i<N; i++)
475 {
476 xout = RandFlat::shoot(5.0*cm,20.0*cm);
477 yout = RandFlat::shoot(5.0*cm,20.0*cm);
478 zout = RandFlat::shoot(5.0*cm,20.0*cm);
479
480 xin = RandFlat::shoot(-0.9*cm,0.9*cm);
481 yin = RandFlat::shoot(-0.4*cm,0.4*cm);
482 zin = RandFlat::shoot(-2.9*cm,2.9*cm);
483
484 pin = G4ThreeVector(xin, yin, zin);
485 pout = G4ThreeVector(xout, yout, zout);
486
487 dir = pin - pout;
488 dir /= dir.mag();
489
490 dist1 = t1.DistanceToIn(pout,dir) ;
491 dist2 = t2.DistanceToIn(pout,dir) ;
492
493 if(dist1 != kInfinity && dist2 !=kInfinity)
494 {
495 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
496 {
497 what = false;
498 dist = std::fabs(dist1 - dist2);
499 logErrors(pout.x(),pout.y(),pout.z(),
500 dir.x(), dir.y(), dir.z(), dist);
501 n++;
502 }
503 }
504
505 dist1 = t1.DistanceToOut(pin,dir);
506 dist2 = t2.DistanceToOut(pin,dir);
507
508 if(dist1 != kInfinity && dist2 !=kInfinity)
509 {
510 if(std::fabs(dist1 - dist2) >= 5.*kCarTolerance)
511 {
512 what = false;
513 dist = std::fabs(dist1 - dist2);
514 logErrors(pin.x(), pin.y(), pin.z(),
515 dir.x(), dir.y(), dir.z(), dist);
516 n++;
517 }
518 }
519 }
520
521 G4cout << "The number of inconsistencies when comparing Box to Extruded-Solid were: "
522 << n << "." << G4endl;
523 return what;
524}
525
526// other comparisons can be, trap with polyhedra, cube with polyhedra, tet with polyhedra
527
528int main()
529{
530
531 G4bool what;
532
533 what = compareEllipsoidtoOrb(1000);
534 what = compareEllipticalTubetoTubs(1000);
535 what = compareEllipsoidtoSphere(1000);
536 what = compareBoxtoTrap(1000);
537 what = compareSpheretoOrb(1000);
538 what = compareBoxtoExtruded(1000);
539
540
541 return 0;
542}
Note: See TracBrowser for help on using the repository browser.