source: trunk/source/geometry/solids/Boolean/test/testBoolSurfaceInOut.cc @ 1316

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

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

File size: 38.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// Test File for tracking functions on a solid surface
28//
29// o Basic asserts on each function +
30//   awkward cases for tracking / geom algorithms
31//
32// o Add tests on dicovering bugs in G4Sphere.cc...
33//
34// History:
35//
36// 14.07.04 V.Grichine creation for box, orb and sphere
37// 15.02.05 V.Grichine changes for boolean solids
38
39#include "G4ios.hh"
40#include <assert.h>
41#include <cmath>
42#include "globals.hh"
43#include "geomdefs.hh"
44#include "Randomize.hh"
45
46#include "ApproxEqual.hh"
47
48#include "G4ThreeVector.hh"
49#include "G4RotationMatrix.hh"
50#include "G4AffineTransform.hh"
51#include "G4VoxelLimits.hh"
52#include "G4GeometryTolerance.hh"
53
54#include "G4Box.hh"
55#include "G4Orb.hh"
56#include "G4Tubs.hh"
57#include "G4Sphere.hh"
58#include "G4Cons.hh"
59// #include "G4Hype.hh"
60#include "G4Para.hh"
61#include "G4Torus.hh"
62#include "G4Trd.hh"
63
64#include "G4IntersectionSolid.hh"
65#include "G4UnionSolid.hh"
66#include "G4SubtractionSolid.hh"
67
68
69///////////////////////////////////////////////////////////////////////////
70//
71//
72
73
74//const G4double kApproxEqualTolerance = kCarTolerance;
75
76// Return true if the double check is approximately equal to target
77//
78// Process:
79//
80// Return true is difference < kApproxEqualTolerance
81
82//G4bool ApproxEqual(const G4double check,const G4double target)
83//{
84//    return (std::fabs(check-target)<kApproxEqualTolerance) ? true : false ;
85//}
86
87// Return true if the 3vector check is approximately equal to target
88//G4bool ApproxEqual(const G4ThreeVector& check, const G4ThreeVector& target)
89//{
90//    return (ApproxEqual(check.x(),target.x())&&
91//         ApproxEqual(check.y(),target.y())&&
92//          ApproxEqual(check.z(),target.z()))? true : false;
93//}
94
95
96
97
98///////////////////////////////////////////////////////////////////
99//
100// Dave's auxiliary function
101
102const G4String OutputInside(const EInside a)
103{
104        switch(a) 
105        {
106                case kInside:  return "Inside"; 
107                case kOutside: return "Outside";
108                case kSurface: return "Surface";
109        }
110        return "????";
111}
112
113
114/////////////////////////////////////////////////////////////////////////////
115//
116// Random unit direction vector
117
118G4ThreeVector GetRandomUnitVector()
119{
120  G4double cosTheta, sinTheta, phi, vx, vy, vz;
121
122  cosTheta = -1. + 2.*G4UniformRand();
123  if( cosTheta > 1.)  cosTheta = 1.;
124  if( cosTheta < -1.) cosTheta = -1.;
125  sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
126 
127  phi = 2*pi*G4UniformRand();
128
129  vx = sinTheta*std::cos(phi);
130  vy = sinTheta*std::sin(phi);
131  vz = cosTheta;
132
133  return G4ThreeVector(vx,vy,vz);
134}
135
136/////////////////////////////////////////////////////////////////////////////
137//
138// Random  vector on box surface
139
140G4ThreeVector GetVectorOnBox( G4Box& box )
141{
142  G4double rand, a, b, c, px, py, pz;
143  G4double part = 1./6.;
144
145  a = box.GetXHalfLength();
146  b = box.GetYHalfLength();
147  c = box.GetZHalfLength();
148 
149  rand = G4UniformRand();
150  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
151
152  if      ( rand < part )
153  {
154    px = -a - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
155    py = -b - 0.5*kCarTolerance + (2.*b + kCarTolerance)*G4UniformRand(); 
156    pz = -c - 0.5*kCarTolerance + (2.*c + kCarTolerance)*G4UniformRand(); 
157  }
158  else if ( rand < 2*part )
159  {
160    px =  a - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
161    py = -b - 0.5*kCarTolerance + (2.*b + kCarTolerance)*G4UniformRand(); 
162    pz = -c - 0.5*kCarTolerance + (2.*c + kCarTolerance)*G4UniformRand(); 
163  }
164  else if ( rand < 3*part )
165  {
166    px = -a - 0.5*kCarTolerance + (2.*a + kCarTolerance)*G4UniformRand(); 
167    py = -b - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
168    pz = -c - 0.5*kCarTolerance + (2.*c + kCarTolerance)*G4UniformRand(); 
169  }
170  else if ( rand < 4*part )
171  {
172    px = -a - 0.5*kCarTolerance + (2.*a + kCarTolerance)*G4UniformRand(); 
173    py =  b - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
174    pz = -c - 0.5*kCarTolerance + (2.*c + kCarTolerance)*G4UniformRand(); 
175  }
176  else if ( rand < 5*part )
177  {
178    px = -a - 0.5*kCarTolerance + (2.*a + kCarTolerance)*G4UniformRand(); 
179    py = -b - 0.5*kCarTolerance + (2.*b + kCarTolerance)*G4UniformRand(); 
180    pz = -c - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
181  }
182  else 
183  {
184    px = -a - 0.5*kCarTolerance + (2.*a + kCarTolerance)*G4UniformRand(); 
185    py = -b - 0.5*kCarTolerance + (2.*b + kCarTolerance)*G4UniformRand(); 
186    pz =  c - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
187  }
188
189  return G4ThreeVector(px,py,pz);
190}
191
192/////////////////////////////////////////////////////////////////////////////
193//
194// Random vector on orb surface
195
196G4ThreeVector GetVectorOnOrb(G4Orb& orb)
197{
198  G4double cosTheta, sinTheta, phi, radius, px, py, pz;
199  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
200
201  radius = orb.GetRadius();
202  radius += -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
203
204  cosTheta = -1. + 2.*G4UniformRand();
205  if( cosTheta > 1.)  cosTheta = 1.;
206  if( cosTheta < -1.) cosTheta = -1.;
207  sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
208 
209  phi = 2*pi*G4UniformRand();
210
211  px = radius*sinTheta*std::cos(phi);
212  py = radius*sinTheta*std::sin(phi);
213  pz = radius*cosTheta;
214
215  return G4ThreeVector(px,py,pz);
216}
217
218/////////////////////////////////////////////////////////////////////////////
219//
220// Random vector on sphere surface
221
222G4ThreeVector GetVectorOnSphere(G4Sphere& sphere)
223{
224  G4double cosTheta, sinTheta, phi, radius, px, py, pz;
225  G4double part = 1./6.;
226  G4double rand = G4UniformRand();
227
228  G4double pRmin  = sphere.GetInsideRadius();
229  G4double pRmax  = sphere.GetOuterRadius();
230  G4double phi1   = sphere.GetStartPhiAngle();
231  G4double phi2   = phi1 + sphere.GetDeltaPhiAngle();
232  G4double theta1 = sphere.GetStartThetaAngle();
233  G4double theta2 = theta1 + sphere.GetDeltaThetaAngle();
234  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
235  G4double kAngTolerance = G4GeometryTolerance::GetInstance()->GetAngularTolerance();
236
237  if      ( rand < part ) // Rmax
238  {
239    radius   = pRmax -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
240
241    cosTheta = std::cos(theta2+0.5*kAngTolerance) + 
242              (std::cos(theta1-0.5*kAngTolerance)-std::cos(theta2+0.5*kAngTolerance))*G4UniformRand();
243    if( cosTheta > 1.)  cosTheta = 1.;
244    if( cosTheta < -1.) cosTheta = -1.;
245    sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
246 
247    phi      = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
248  }
249  else if ( rand < 2*part )  // Rmin
250  {
251    radius   = pRmin -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
252
253    cosTheta = std::cos(theta2+0.5*kAngTolerance) + 
254              (std::cos(theta1-0.5*kAngTolerance)-std::cos(theta2+0.5*kAngTolerance))*G4UniformRand();
255    if( cosTheta > 1.)  cosTheta = 1.;
256    if( cosTheta < -1.) cosTheta = -1.;
257    sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
258 
259    phi      = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
260  }
261  else if ( rand < 3*part )  // phi1
262  {
263    radius   = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
264
265    cosTheta = std::cos(theta2+0.5*kAngTolerance) + 
266              (std::cos(theta1-0.5*kAngTolerance)-std::cos(theta2+0.5*kAngTolerance))*G4UniformRand();
267    if( cosTheta > 1.)  cosTheta = 1.;
268    if( cosTheta < -1.) cosTheta = -1.;
269    sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
270 
271    phi      = phi1 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
272  }
273  else if ( rand < 4*part )  // phi2
274  {
275    radius   = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
276
277    cosTheta = std::cos(theta2+0.5*kAngTolerance) + 
278              (std::cos(theta1-0.5*kAngTolerance)-std::cos(theta2+0.5*kAngTolerance))*G4UniformRand();
279    if( cosTheta > 1.)  cosTheta = 1.;
280    if( cosTheta < -1.) cosTheta = -1.;
281    sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
282 
283    phi      = phi2 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
284  }
285  else if ( rand < 5*part )  // theta1
286  {
287    radius   = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
288
289    cosTheta = std::cos(theta1+0.5*kAngTolerance) + 
290              (std::cos(theta1-0.5*kAngTolerance)-std::cos(theta1+0.5*kAngTolerance))*G4UniformRand();
291    if( cosTheta > 1.)  cosTheta = 1.;
292    if( cosTheta < -1.) cosTheta = -1.;
293    sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
294 
295    phi      = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
296  }
297  else // theta2
298  {
299    radius   = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
300
301    cosTheta = std::cos(theta2+0.5*kAngTolerance) + 
302              (std::cos(theta2-0.5*kAngTolerance)-std::cos(theta2+0.5*kAngTolerance))*G4UniformRand();
303    if( cosTheta > 1.)  cosTheta = 1.;
304    if( cosTheta < -1.) cosTheta = -1.;
305    sinTheta = std::sqrt( 1. - cosTheta*cosTheta );
306 
307    phi      = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
308  }
309
310  px = radius*sinTheta*std::cos(phi);
311  py = radius*sinTheta*std::sin(phi);
312  pz = radius*cosTheta;
313
314  return G4ThreeVector(px,py,pz);
315}
316
317/////////////////////////////////////////////////////////////////////////////
318//
319// Random vector on tubs surface
320
321G4ThreeVector GetVectorOnTubs(G4Tubs& tubs)
322{
323  G4double phi, radius, px, py, pz;
324  G4double part = 1./6.;
325  G4double rand = G4UniformRand();
326
327  G4double pRmin = tubs.GetInnerRadius   ();
328  G4double pRmax = tubs.GetOuterRadius   ();
329  G4double tubsZ = tubs.GetZHalfLength   ();
330  G4double phi1  = tubs.GetStartPhiAngle ();
331  G4double phi2  = phi1 + tubs.GetDeltaPhiAngle ();
332  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
333  G4double kAngTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
334
335  if      ( rand < part ) // Rmax
336  {
337    radius = pRmax -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
338    pz     = -tubsZ - 0.5*kCarTolerance + (2*tubsZ + kCarTolerance)*G4UniformRand(); 
339    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
340  }
341  else if ( rand < 2*part )  // Rmin
342  {
343    radius = pRmin -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
344    pz     = -tubsZ - 0.5*kCarTolerance + (2*tubsZ + kCarTolerance)*G4UniformRand();   
345    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
346  }
347  else if ( rand < 3*part )  // phi1
348  {
349    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
350    pz     = -tubsZ - 0.5*kCarTolerance + (2*tubsZ + kCarTolerance)*G4UniformRand();   
351    phi    = phi1 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
352  }
353  else if ( rand < 4*part )  // phi2
354  {
355    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
356    pz     = -tubsZ - 0.5*kCarTolerance + (2*tubsZ + kCarTolerance)*G4UniformRand();   
357    phi    = phi2 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
358  }
359  else if ( rand < 5*part )  // -fZ
360  {
361    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
362
363    pz     = -tubsZ - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();   
364 
365    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
366  }
367  else // fZ
368  {
369    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
370    pz     = tubsZ - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();     
371    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
372  }
373
374  px = radius*std::cos(phi);
375  py = radius*std::sin(phi);
376 
377  return G4ThreeVector(px,py,pz);
378}
379
380
381/////////////////////////////////////////////////////////////////////////////
382//
383// Random vector out of tubs surface
384
385G4ThreeVector GetVectorOutOfTubs(G4Tubs& tubs)
386{
387  G4double phi, radius, px, py, pz;
388  G4double part = 1./5.;
389  G4double rand = G4UniformRand();
390
391  G4double pRmin = tubs.GetInnerRadius   ();
392  G4double pRmax = tubs.GetOuterRadius   ();
393  G4double tubsZ = tubs.GetZHalfLength   ();
394  G4double phi1  = tubs.GetStartPhiAngle ();
395  G4double deltaPhi  = tubs.GetDeltaPhiAngle ();
396  G4double phi2  = phi1 + deltaPhi;
397  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
398
399  if      ( rand < part ) // Rmax
400  {
401    radius = pRmax +0.5*kCarTolerance + pRmax*G4UniformRand(); 
402    pz     = -2*tubsZ + (4*tubsZ)*G4UniformRand(); 
403    phi    = (2*pi)*G4UniformRand();
404  }
405  else if ( rand < 2*part )  // Rmin
406  {
407    radius = (pRmin -0.5*kCarTolerance)*G4UniformRand(); 
408    pz     = -2*tubsZ + (4*tubsZ)*G4UniformRand(); 
409    phi    = (2*pi)*G4UniformRand();
410  }
411  else if ( rand < 3*part )  // out of deltaPhi
412  {
413    radius = (2*pRmax)*G4UniformRand(); 
414    pz     = -2*tubsZ - 0.5*kCarTolerance + (4*tubsZ + kCarTolerance)*G4UniformRand();   
415    phi    = phi2 + 0.5*kCarTolerance + (2*pi - deltaPhi - kCarTolerance)*G4UniformRand();
416  }
417  else if ( rand < 4*part )  // -fZ
418  {
419    radius = (2*pRmax)*G4UniformRand(); 
420    pz     = -tubsZ - 0.5*kCarTolerance - (tubsZ)*G4UniformRand();   
421    phi    = (2*pi)*G4UniformRand(); 
422  }
423  else // fZ
424  {
425    radius = (2*pRmax)*G4UniformRand(); 
426    pz     = tubsZ + 0.5*kCarTolerance + (tubsZ)*G4UniformRand();   
427    phi    = (2*pi)*G4UniformRand(); 
428  }
429
430  px = radius*std::cos(phi);
431  py = radius*std::sin(phi);
432 
433  return G4ThreeVector(px,py,pz);
434}
435
436/////////////////////////////////////////////////////////////////////////////
437//
438// Random vector on cons surface
439
440G4ThreeVector GetVectorOnCons(G4Cons& cons)
441{
442  G4double phi, pRmin, pRmax, radius, px, py, pz;
443  G4double part = 1./6.;
444  G4double rand = G4UniformRand();
445
446  G4double pRmin1 = cons.GetInnerRadiusMinusZ   ();
447  G4double pRmax1 = cons.GetOuterRadiusMinusZ   ();
448  G4double pRmin2 = cons.GetInnerRadiusPlusZ   ();
449  G4double pRmax2 = cons.GetOuterRadiusPlusZ   ();
450  G4double consZ  = cons.GetZHalfLength   ();
451  G4double phi1   = cons.GetStartPhiAngle ();
452  G4double phi2   = phi1 + cons.GetDeltaPhiAngle ();
453  G4double tgMin  = (pRmin2 - pRmin1)/(2.*consZ);
454  G4double tgMax  = (pRmax2 - pRmax1)/(2.*consZ);
455  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
456  G4double kAngTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
457
458  if      ( rand < part ) // Rmax
459  {
460    pz     = -consZ - 0.5*kCarTolerance + (2*consZ + kCarTolerance)*G4UniformRand();
461    pRmax  = pRmax1 + tgMax*(pz+consZ); 
462    radius = pRmax -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
463    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
464  }
465  else if ( rand < 2*part )  // Rmin
466  {
467    pz     = -consZ - 0.5*kCarTolerance + (2*consZ + kCarTolerance)*G4UniformRand();   
468    pRmin  = pRmin1 + tgMin*(pz+consZ); 
469    radius = pRmin -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
470    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
471  }
472  else if ( rand < 3*part )  // phi1
473  {
474    pz     = -consZ - 0.5*kCarTolerance + (2*consZ + kCarTolerance)*G4UniformRand();   
475    pRmax  = pRmax1 + tgMax*(pz+consZ); 
476    pRmin  = pRmin1 + tgMin*(pz+consZ); 
477    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
478    phi    = phi1 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
479  }
480  else if ( rand < 4*part )  // phi2
481  {
482    pz     = -consZ - 0.5*kCarTolerance + (2*consZ + kCarTolerance)*G4UniformRand();   
483    pRmax  = pRmax1 + tgMax*(pz+consZ); 
484    pRmin  = pRmin1 + tgMin*(pz+consZ); 
485    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
486    phi    = phi2 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
487  }
488  else if ( rand < 5*part )  // -fZ
489  {
490    pz     = -consZ - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();   
491    radius = pRmin1 - 0.5*kCarTolerance + (pRmax1-pRmin1+kCarTolerance)*G4UniformRand();   
492    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
493  }
494  else // fZ
495  {
496    pz     = consZ - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();     
497    radius = pRmin2 - 0.5*kCarTolerance + (pRmax2-pRmin2+kCarTolerance)*G4UniformRand(); 
498    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
499  }
500
501  px = radius*std::cos(phi);
502  py = radius*std::sin(phi);
503 
504  return G4ThreeVector(px,py,pz);
505}
506
507/////////////////////////////////////////////////////////////////////////////
508//
509// Random vector on torus surface
510
511G4ThreeVector GetVectorOnTorus(G4Torus& torus)
512{
513  G4double phi, radius, px, py, pz;
514  G4double part = 1./4.;
515  G4double rand = G4UniformRand();
516
517  G4double pRmin = torus.GetRmin();
518  G4double pRmax = torus.GetRmax();
519  G4double pRtor = torus.GetRtor();
520  G4double phi1  = torus.GetSPhi();
521  G4double phi2  = phi1 + torus.GetDPhi ();
522  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
523  G4double kAngTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
524
525  if      ( rand < part ) // Rmax
526  {
527    radius = pRmax -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
528    pz     = -pRtor - 0.5*kCarTolerance + (2*pRtor + kCarTolerance)*G4UniformRand(); 
529    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
530  }
531  else if ( rand < 2*part )  // Rmin
532  {
533    radius = pRmin -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand(); 
534    pz     = -pRtor - 0.5*kCarTolerance + (2*pRtor + kCarTolerance)*G4UniformRand();   
535    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
536  }
537  else if ( rand < 3*part )  // phi1
538  {
539    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
540    pz     = -pRtor - 0.5*kCarTolerance + (2*pRtor + kCarTolerance)*G4UniformRand();   
541    phi    = phi1 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
542  }
543  else if ( rand < 4*part )  // phi2
544  {
545    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
546    pz     = -pRtor - 0.5*kCarTolerance + (2*pRtor + kCarTolerance)*G4UniformRand();   
547    phi    = phi2 -0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();
548  }
549  else if ( rand < 5*part )  // -fZ
550  {
551    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
552
553    pz     = -pRtor - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();   
554 
555    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
556  }
557  else // fZ
558  {
559    radius = pRmin - 0.5*kCarTolerance + (pRmax-pRmin+kCarTolerance)*G4UniformRand(); 
560    pz     = pRtor - 0.5*kCarTolerance + (kCarTolerance)*G4UniformRand();     
561    phi    = phi1 - 0.5*kAngTolerance + (phi2 - phi1 + kAngTolerance)*G4UniformRand();
562  }
563
564  px = radius*std::cos(phi);
565  py = radius*std::sin(phi);
566 
567  return G4ThreeVector(px,py,pz);
568}
569
570
571//////////////////////////////////////////////////////////////////////
572//
573// Main executable function
574
575int main(void)
576{
577  G4int i, j, iMax=1000, jMax=1000;
578  G4int iCheck = iMax/10;
579  G4double distIn, distIn1, distIn2, distOut;
580  EInside surfaceP, surfaceP1, surfaceP2;
581  G4ThreeVector norm, *pNorm;
582  G4bool *pgoodNorm, goodNorm, calcNorm=true;
583  G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
584
585  enum Esolid {kInter, kBox, kOrb, kSphere, kCons, kTubs, kTorus, kPara, kTrapezoid, kTrd};
586
587  Esolid useCase = kInter;
588
589  pNorm=&norm;
590  pgoodNorm=&goodNorm;
591
592  G4cout.precision(20);
593
594  // Boxes for test
595
596  G4Box b1("Test Box #1",20,30,40);
597  G4Box b2("Test Box #2",10,10,10);
598  G4Box box3("BABAR Box",0.14999999999999999, 
599                           24.707000000000001, 
600                           22.699999999999999) ;
601
602  // orbs for test
603
604  G4Orb  o1("Solid G4Orb",50);
605  G4Orb  o10("s10",0.018*mm);
606  // G4Orb* solidO1= new G4Orb("O1", 2.7*cm);
607
608
609  // spheres for test
610
611  //  G4Sphere s5("Patch (phi/theta seg)",45,50,-pi/4,halfpi,pi/4,halfpi);
612  //  G4Sphere s5("Patch (phi/theta seg)",45,50,-pi/4.,pi/4.,pi/4,pi/4.);
613  G4Sphere s5("Patch (phi/theta seg)",45,50,-pi/4.,pi/4.,pi/2,pi/4.);
614
615  G4Sphere s6("John example",300,500,0,5.76,0,pi) ; 
616  G4Sphere s7("sphere7",1400.,1550.,0.022321428571428572,0.014642857142857141,
617                          1.5631177553663251,0.014642857142857141    );
618  G4Sphere s8("sphere",278.746*mm, 280.0*mm, 0.0*degree, 360.0*degree,
619                                               0.0*degree, 90.0*degree);
620
621  G4Sphere b216("b216", 1400.0, 1550.0, 
622                  0.022321428571428572, 
623                  0.014642857142857141,
624                  1.578117755366325,
625                  0.014642857142867141);
626
627  G4Sphere s9("s9",0*mm,410*mm,0*degree,360*degree,90*degree,90*degree);
628
629  G4Sphere b402("b402", 475*mm, 480*mm, 
630               0*degree,360*degree,17.8*degree,144.4*degree);
631   
632
633  G4Sphere s10("s10",0*mm,0.018*mm,0*degree,360*degree,0*degree,180*degree);
634
635
636  G4Sphere s11("s11",5000000.*mm,
637                    3700000000.*mm,
638                   0*degree,360*degree,0*degree,180*degree);
639
640
641  G4Sphere sAlex("sAlex",500.*mm,
642                    501.*mm,
643                   0*degree,360*degree,0*degree,180*degree);
644
645  G4Sphere sLHCB("sLHCB",8600*mm, 8606*mm, 
646    -1.699135525184141*degree,
647    3.398271050368263*degree,88.52855940538514*degree,2.942881189229715*degree );
648
649  G4Sphere spAroundX("SpAroundX",  10.*mm, 1000.*mm, -1.0*degree, 
650                                                     2.0*degree, 
651                                        0.*degree, 180.0*degree );
652
653
654  // G4Tubs t4("Hole Sector #4",45*mm,50*mm,50*mm,halfpi,halfpi);
655  G4Tubs t4("Hole Sector #4",45*mm,50*mm,50*mm,-halfpi,halfpi);
656
657  G4Cons c4("Hollow Cut Cone",50,100,50,200,50,-pi/6,pi/3);
658  G4Cons c5("Hollow Cut Cone",25,50,75,150,50,0,3*halfpi);
659   
660  G4Torus torus1("torus1",10.,15.,20.,0.,3*halfpi);
661 
662
663
664    G4Tubs*  detTub1 = new G4Tubs("Tubs4", 0.*cm, 5.*cm, 5.*cm, 0., 359*deg);
665    G4Tubs*  detTub12 = new G4Tubs("Tubs12", 1.*cm, 5.*cm, 5.*cm, 0., 359*deg);
666    G4Tubs*  detTub2 = new G4Tubs("Tubs5", 1.*cm, 5.1*cm, 5.1*cm, 0., 359*deg);
667
668    G4IntersectionSolid*  detInt1 = new G4IntersectionSolid("inter1", 
669                                        detTub1, detTub2, 0, G4ThreeVector() );
670    G4IntersectionSolid*  detInt2 = new G4IntersectionSolid("inter2", 
671                                        detTub2, detTub1, 0, G4ThreeVector() );
672
673  // Check of some use cases shown zero-zero problems
674
675  G4ThreeVector pCheck, vCheck;
676
677  // pCheck = G4ThreeVector( 41.418613476008794, -16.893662525384702, 4.9094423552800466 );
678  // vCheck = G4ThreeVector( 0.34553222148699703, 0.91172822040596313, 0.22216916084289551 );
679  // distIn  = s5.DistanceToIn(pCheck,vCheck);
680  // distOut = s5.DistanceToOut(pCheck,vCheck,calcNorm,pgoodNorm,pNorm);
681
682  // pCheck = G4ThreeVector( 43.169180219772784, -11.564259048580507, 5.2621090605480623 );
683  // surfaceP = s5.Inside(pCheck);
684
685  pCheck = G4ThreeVector( -51.189087930597751, -17.382942686173514, -45.939946175080983 );
686  vCheck = G4ThreeVector( 0.44410267104120671, -0.88563345532911941, -0.13574314117431641 );
687  distIn  = c5.DistanceToIn(pCheck,vCheck);
688  distOut = c5.DistanceToOut(pCheck,vCheck,calcNorm,pgoodNorm,pNorm); 
689
690  pCheck = G4ThreeVector(-41.407491890396564, -31.155805955816909, -48.18046093035241 );
691  vCheck = G4ThreeVector(0.79040557001853884, -0.52472467107317944, -0.31610608100891113 );
692  distIn  = c5.DistanceToIn(pCheck,vCheck);
693  distOut = c5.DistanceToOut(pCheck,vCheck,calcNorm,pgoodNorm,pNorm); 
694
695  pCheck = G4ThreeVector(-66.68328490196707, -47.460245099793099, -18.151754141035401 );
696  vCheck = G4ThreeVector(-0.066679791594195931, 0.88577693677046576, -0.45929622650146484 );
697  distIn  = c5.DistanceToIn(pCheck,vCheck);
698  distOut = c5.DistanceToOut(pCheck,vCheck,calcNorm,pgoodNorm,pNorm); 
699
700  pCheck = G4ThreeVector( -17.140591059524617, -23.320101452294466, -49.999999999668375 ); 
701  vCheck = G4ThreeVector ( -0.69080640316788089, -0.58982688856527554, 0.41819941997528076 ); 
702  distIn  = detTub12->DistanceToIn(pCheck,vCheck);
703  distIn1  = detTub1->DistanceToIn(pCheck,vCheck);
704  distIn2  = detTub2->DistanceToIn(pCheck,vCheck);
705  G4cout<<"dTub12 = "<<distIn<<";    dTub1 = "<<distIn1<<";    dTub2 = "<<distIn2<<G4endl;
706  surfaceP   = detTub12->Inside(pCheck);
707  surfaceP1  = detTub1->Inside(pCheck);
708  surfaceP2  = detTub2->Inside(pCheck);
709  G4cout<<"insideTub12 = "<<OutputInside(surfaceP)<<";     insideTub1 = "<<OutputInside(surfaceP1)
710        <<";     insideTub2 = "<<OutputInside(surfaceP2)<<G4endl; 
711  distIn1  = detInt1->DistanceToIn(pCheck,vCheck);
712  distIn2  = detInt2->DistanceToIn(pCheck,vCheck);
713  G4cout<<"Int1 = "<<distIn1<<";        Int2 = "<<distIn2<<G4endl;
714  surfaceP1  = detInt1->Inside(pCheck);
715  surfaceP2  = detInt2->Inside(pCheck);
716  G4cout<<"insideInt1 = "<<OutputInside(surfaceP1)
717        <<";       insideInt2 = "<<OutputInside(surfaceP2)<<G4endl; 
718
719
720#ifdef NDEBUG
721    G4Exception("FAIL: *** Assertions must be compiled in! ***");
722#endif
723
724    G4ThreeVector p1, p2;
725 
726  // Check box tracking function
727
728  switch (useCase)
729  {
730    case kInter:
731    G4cout<<"Testing of all cutted G4Tubs intersection:"<<G4endl<<G4endl;
732    for( i = 0; i < iMax; i++ )
733    {
734      if(i%iCheck == 0) G4cout<<"i = "<<i<<G4endl;
735         
736      // G4ThreeVector p1 = GetVectorOnTubs(*detTub1);
737      G4ThreeVector p1 = GetVectorOutOfTubs(*detTub12);
738      G4ThreeVector p2 = GetVectorOnTubs(*detTub2);
739
740      surfaceP = detInt1->Inside(p1);
741
742      if(
743         //  surfaceP != kSurface
744           surfaceP != kOutside
745                                  )
746      {
747        // G4cout<<"p is out of surface: "<<G4endl;
748        // G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl<<G4endl;
749
750      }
751      else
752      {
753        for( j = 0; j < jMax; j++ )
754        {
755          G4ThreeVector v = GetRandomUnitVector();
756
757          distIn1  = detInt1->DistanceToIn(p1,v);
758          distIn2  = detInt2->DistanceToIn(p1,v);
759          // distOut  = detInt1->DistanceToOut(p1,v,calcNorm,pgoodNorm,pNorm);
760          // distOut = t4.DistanceToOut(p,v,calcNorm,pgoodNorm,pNorm);
761
762          //  if( distIn < kCarTolerance && distOut < kCarTolerance )
763          if( 
764             // distIn1 !=  distIn2
765             std::abs( distIn1 -  distIn2 ) > 100*kCarTolerance
766              //   distIn1 ==  distOut
767                                          )
768          {
769            G4cout<<" distIn1  != distIn2: "<<G4endl;
770            //   G4cout<<" distIn1  == distOut: "<<G4endl;
771            G4cout<<"distIn1 = "<<distIn1
772                  <<";  distIn2 = "<<distIn2<<G4endl;
773              //  <<";  distOut = "<<distOut<<G4endl;
774            G4cout<<"location p1: "<<G4endl;
775            G4cout<<"( "<<p1.x()<<", "<<p1.y()<<", "<<p1.z()<<" ); "<<G4endl;
776            G4cout<<" direction v: "<<G4endl;
777            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
778          }
779          else if(distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance)
780          {
781            /*
782            G4cout<<" distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance"<<G4endl;
783            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
784            G4cout<<"location p: "<<G4endl;
785            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
786            G4cout<<" direction v: "<<G4endl;
787            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
788            */
789          }     
790        }
791      }
792    }
793    break;
794
795    case kBox:
796    G4cout<<"Testing G4Box:"<<G4endl<<G4endl;
797    for(i=0;i<iMax;i++)
798    {
799      G4ThreeVector p = GetVectorOnBox(b1);
800   
801      surfaceP = b1.Inside(p);
802      if(surfaceP != kSurface)
803      {
804        G4cout<<"p is out of surface: "<<G4endl;
805        G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl<<G4endl;
806
807      }
808      else
809      {
810        for(j=0;j<jMax;j++)
811        {
812          G4ThreeVector v = GetRandomUnitVector();
813
814          distIn  = b1.DistanceToIn(p,v);
815          distOut = b1.DistanceToOut(p,v,calcNorm,pgoodNorm,pNorm); 
816
817          if( distIn < kCarTolerance && distOut < kCarTolerance )
818          {
819            G4cout<<" distIn < kCarTolerance && distOut < kCarTolerance"<<G4endl;
820            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
821            G4cout<<"location p: "<<G4endl;
822            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
823            G4cout<<" direction v: "<<G4endl;
824            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
825          }
826          else if(distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance)
827          {
828            G4cout<<" distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance"<<G4endl;
829            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
830            G4cout<<"location p: "<<G4endl;
831            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
832            G4cout<<" direction v: "<<G4endl;
833            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
834          }     
835        }
836      }
837    }
838    break;
839   
840    case kOrb:
841      G4cout<<"Testing G4Orb:"<<G4endl<<G4endl;
842    for(i=0;i<iMax;i++)
843    {
844      G4ThreeVector p = GetVectorOnOrb(o1);
845   
846      surfaceP = o1.Inside(p);
847      if(surfaceP != kSurface)
848      {
849        G4cout<<"p is out of surface: "<<G4endl;
850        G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl<<G4endl;
851
852      }
853      else
854      {
855        for(j=0;j<jMax;j++)
856        {
857          G4ThreeVector v = GetRandomUnitVector();
858
859          distIn  = o1.DistanceToIn(p,v);
860          distOut = o1.DistanceToOut(p,v,calcNorm,pgoodNorm,pNorm); 
861
862          if( distIn < kCarTolerance && distOut < kCarTolerance )
863          {
864            G4cout<<" distIn < kCarTolerance && distOut < kCarTolerance"<<G4endl;
865            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
866            G4cout<<"location p: "<<G4endl;
867            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
868            G4cout<<" direction v: "<<G4endl;
869            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
870          }
871          else if(distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance)
872          {
873            G4cout<<" distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance"<<G4endl;
874            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
875            G4cout<<"location p: "<<G4endl;
876            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
877            G4cout<<" direction v: "<<G4endl;
878            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
879          }     
880        }
881      }
882    }
883    break;
884
885    case kSphere:
886      G4cout<<"Testing all cutted G4Sphere:"<<G4endl<<G4endl;
887    for(i=0;i<iMax;i++)
888    {
889      if(i%iCheck == 0) G4cout<<"i = "<<i<<G4endl;
890      G4ThreeVector p = GetVectorOnSphere(s5);     
891      surfaceP = s5.Inside(p);
892      if(surfaceP != kSurface)
893      {
894        G4cout<<"p is out of surface: "<<G4endl;
895        G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl<<G4endl;
896
897      }
898      else
899      {
900        for(j=0;j<jMax;j++)
901        {
902          G4ThreeVector v = GetRandomUnitVector();
903
904          distIn  = s5.DistanceToIn(p,v);
905          distOut = s5.DistanceToOut(p,v,calcNorm,pgoodNorm,pNorm); 
906
907          //  if( distIn < kCarTolerance && distOut < kCarTolerance )
908          if( distIn == 0. && distOut == 0. )
909          {
910            G4cout<<" distIn < kCarTolerance && distOut < kCarTolerance"<<G4endl;
911            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
912            G4cout<<"location p: "<<G4endl;
913            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
914            G4cout<<" direction v: "<<G4endl;
915            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
916          }
917          else if(distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance)
918          {
919            /*
920            G4cout<<" distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance"<<G4endl;
921            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
922            G4cout<<"location p: "<<G4endl;
923            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
924            G4cout<<" direction v: "<<G4endl;
925            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
926            */
927          }     
928        }
929      }
930    }
931    break;
932
933    case kTubs:
934      G4cout<<"Testing all cutted G4Tubs:"<<G4endl<<G4endl;
935    for(i=0;i<iMax;i++)
936    {
937      if(i%iCheck == 0) G4cout<<"i = "<<i<<G4endl;
938      G4ThreeVector p = GetVectorOnTubs(t4);     
939      surfaceP = t4.Inside(p);
940      if(surfaceP != kSurface)
941      {
942        G4cout<<"p is out of surface: "<<G4endl;
943        G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl<<G4endl;
944
945      }
946      else
947      {
948        for(j=0;j<jMax;j++)
949        {
950          G4ThreeVector v = GetRandomUnitVector();
951
952          distIn  = t4.DistanceToIn(p,v);
953          distOut = t4.DistanceToOut(p,v,calcNorm,pgoodNorm,pNorm); 
954
955          //  if( distIn < kCarTolerance && distOut < kCarTolerance )
956          if( distIn == 0. && distOut == 0. )
957          {
958            G4cout<<" distIn < kCarTolerance && distOut < kCarTolerance"<<G4endl;
959            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
960            G4cout<<"location p: "<<G4endl;
961            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
962            G4cout<<" direction v: "<<G4endl;
963            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
964          }
965          else if(distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance)
966          {
967            /*
968            G4cout<<" distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance"<<G4endl;
969            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
970            G4cout<<"location p: "<<G4endl;
971            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
972            G4cout<<" direction v: "<<G4endl;
973            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
974            */
975          }     
976        }
977      }
978    }
979    break;
980
981    case kCons:
982      G4cout<<"Testing all cutted G4Cons:"<<G4endl<<G4endl;
983    for(i=0;i<iMax;i++)
984    {
985      if(i%iCheck == 0) G4cout<<"i = "<<i<<G4endl;
986      G4ThreeVector p = GetVectorOnCons(c5);     
987      surfaceP = c5.Inside(p);
988      if(surfaceP != kSurface)
989      {
990        G4cout<<"p is out of surface: "<<G4endl;
991        G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl<<G4endl;
992
993      }
994      else
995      {
996        for(j=0;j<jMax;j++)
997        {
998          G4ThreeVector v = GetRandomUnitVector();
999
1000          distIn  = c5.DistanceToIn(p,v);
1001          distOut = c5.DistanceToOut(p,v,calcNorm,pgoodNorm,pNorm); 
1002
1003          //  if( distIn < kCarTolerance && distOut < kCarTolerance )
1004          if( distIn == 0. && distOut == 0. )
1005          {
1006            G4cout<<" distIn < kCarTolerance && distOut < kCarTolerance"<<G4endl;
1007            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
1008            G4cout<<"location p: "<<G4endl;
1009            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
1010            G4cout<<" direction v: "<<G4endl;
1011            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
1012          }
1013          else if(distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance)
1014          {
1015            /*
1016            G4cout<<" distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance"<<G4endl;
1017            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
1018            G4cout<<"location p: "<<G4endl;
1019            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
1020            G4cout<<" direction v: "<<G4endl;
1021            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
1022            */
1023          }     
1024        }
1025      }
1026    }
1027    break;
1028    case kTorus:
1029      G4cout<<"Testing all cutted G4Torus:"<<G4endl<<G4endl;
1030    for(i=0;i<iMax;i++)
1031    {
1032      if(i%iCheck == 0) G4cout<<"i = "<<i<<G4endl;
1033      G4ThreeVector p = GetVectorOnTorus(torus1);     
1034      surfaceP = torus1.Inside(p);
1035      if(surfaceP != kSurface)
1036      {
1037        G4cout<<"p is out of surface: "<<G4endl;
1038        G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl<<G4endl;
1039
1040      }
1041      else
1042      {
1043        for(j=0;j<jMax;j++)
1044        {
1045          G4ThreeVector v = GetRandomUnitVector();
1046
1047          distIn  = torus1.DistanceToIn(p,v);
1048          distOut = torus1.DistanceToOut(p,v,calcNorm,pgoodNorm,pNorm); 
1049
1050          //  if( distIn < kCarTolerance && distOut < kCarTolerance )
1051          if( distIn == 0. && distOut == 0. )
1052          {
1053            G4cout<<" distIn < kCarTolerance && distOut < kCarTolerance"<<G4endl;
1054            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
1055            G4cout<<"location p: "<<G4endl;
1056            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
1057            G4cout<<" direction v: "<<G4endl;
1058            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
1059          }
1060          else if(distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance)
1061          {
1062            /*
1063            G4cout<<" distIn > 100000*kCarTolerance && distOut > 100*kCarTolerance"<<G4endl;
1064            G4cout<<"distIn = "<<distIn<<";  distOut = "<<distOut<<G4endl;
1065            G4cout<<"location p: "<<G4endl;
1066            G4cout<<"( "<<p.x()<<", "<<p.y()<<", "<<p.z()<<" ); "<<G4endl;
1067            G4cout<<" direction v: "<<G4endl;
1068            G4cout<<"( "<<v.x()<<", "<<v.y()<<", "<<v.z()<<" ); "<<G4endl<<G4endl;
1069            */
1070          }     
1071        }
1072      }
1073    }
1074    break;
1075
1076    default:
1077    break;   
1078  }
1079  return 0;
1080}
1081
Note: See TracBrowser for help on using the repository browser.