source: trunk/source/geometry/solids/Boolean/test/testG4UnionSolid.cc @ 1342

Last change on this file since 1342 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: 26.6 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
28
29#include <assert.h>
30#include <cmath>
31
32#include "globals.hh"
33#include "geomdefs.hh"
34
35#include "ApproxEqual.hh"
36
37#include "G4ThreeVector.hh"
38#include "G4RotationMatrix.hh"
39#include "G4AffineTransform.hh"
40#include "G4VoxelLimits.hh"
41
42#include "G4Box.hh"
43#include "G4Cons.hh"
44#include "G4Para.hh"
45#include "G4Sphere.hh"
46#include "G4Torus.hh"
47#include "G4Trap.hh"
48#include "G4Trd.hh"
49#include "G4Tubs.hh"
50
51#include "G4UnionSolid.hh"
52// #include "G4DisplacedSolid.hh"
53
54///////////////////////////////////////////////////////////////////
55//
56// Dave's auxiliary function
57
58const G4String OutputInside(const EInside a)
59{
60        switch(a) 
61        {
62                case kInside:  return "Inside"; 
63                case kOutside: return "Outside";
64                case kSurface: return "Surface";
65        }
66        return "????";
67}
68
69
70int main()
71{
72    G4ThreeVector pzero(0,0,0);
73    G4ThreeVector ponxside(20,0,0),ponyside(0,30,0),ponzside(0,0,40),
74                   ponb2x(10,0,0),ponb2y(0,10,0),ponb2z(0,0,10),
75                   ponb2mx(-10,0,0),ponb2my(0,-10,0),ponb2mz(0,0,-10);
76    G4ThreeVector ponmxside(-20,0,0),ponmyside(0,-30,0),ponmzside(0,0,-40);
77    G4ThreeVector ponzsidey(0,25,40),ponmzsidey(0,25,-40),
78                  ponb2zy(0,5,10),ponb2mzy(0,5,-10) ;
79
80    G4ThreeVector pbigx(100,0,0),pbigy(0,100,0),pbigz(0,0,100);
81    G4ThreeVector pbigmx(-100,0,0),pbigmy(0,-100,0),pbigmz(0,0,-100);
82
83    G4ThreeVector vx(1,0,0),vy(0,1,0),vz(0,0,1);
84    G4ThreeVector vmx(-1,0,0),vmy(0,-1,0),vmz(0,0,-1);
85    G4ThreeVector vxy(1/std::sqrt(2.0),1/std::sqrt(2.0),0);
86    G4ThreeVector vmxy(-1/std::sqrt(2.0),1/std::sqrt(2.0),0);
87    G4ThreeVector vmxmy(-1/std::sqrt(2.0),-1/std::sqrt(2.0),0);
88    G4ThreeVector vxmy(1/std::sqrt(2.0),-1/std::sqrt(2.0),0);
89
90    G4ThreeVector vxz(1/std::sqrt(2.0),0,1/std::sqrt(2.0));
91    G4ThreeVector vxmz(1/std::sqrt(2.0),0,-1/std::sqrt(2.0));
92    G4ThreeVector vmxz(-1/std::sqrt(2.0),0,1/std::sqrt(2.0));
93    G4ThreeVector vmxmz(-1/std::sqrt(2.0),0,-1/std::sqrt(2.0));
94
95    G4double dist, vol, volCheck, diff;
96    G4ThreeVector *pNorm,norm;
97    G4bool *pgoodNorm,goodNorm,calcNorm=true;
98
99    pNorm=&norm;
100    pgoodNorm=&goodNorm;
101
102    G4RotationMatrix identity, xRot ;
103   
104// NOTE: xRot = rotation such that x axis->-x axis & y axis->-y axis
105
106    xRot.rotateZ(-pi) ;
107
108    G4Transform3D transform(xRot,G4ThreeVector(0,40,0)) ;
109
110    G4Box  b1("Test Box #1",20,30,40);
111    G4Box  b2("Test Box #2",10,10,10);
112    G4Box  b3("Test Box #3",10,20,50);
113    G4Box* b4 = new G4Box("b4",50,50,50) ;
114    G4Box* b5 = new G4Box("b5",10,10,60) ;
115
116    G4Tubs t1("Solid Tube #1",0,50,50,0,360);
117    G4Tubs t2("Hole Tube #2",45,50,50,0,360);
118    G4Tubs t3("disk",0,50,5,0,360);
119    G4Tubs t4("t4",0,45,50,0,360);
120
121    G4Cons c1("Hollow Full Tube",50,100,50,100,50,0,2*pi),
122           c2("Full Cone",0,50,0,100,50,0,2*pi) ;
123
124    G4UnionSolid b1Ub2("b1Unionb2",&b1,&b2),
125                        t1Ub2("t1Unionb2",&t1,&b2),
126                        c2Ub2("c2Unionb2",&c2,&b2);
127
128    G4UnionSolid b4Ub5("b4Ub5",b4,b5);
129
130    G4UnionSolid t2Ut4("t2Ut4",&t2,&t4);
131
132    // With placement
133
134    G4UnionSolid b1Ub3("b1Unionb3",&b1,&b3,transform);
135
136    G4UnionSolid t1Ub3("t1Unionb3",&t1,&b3,transform);
137
138    G4UnionSolid t2Ut1Trans("t2Ut1Trans",&t2,&t1,
139                                         &identity,G4ThreeVector(0,0,110));
140
141    G4UnionSolid t2Ut1Ut1("t2Ut1Ut1",&t2Ut1Trans,&t1,
142                                         &identity,G4ThreeVector(0,0,-110));
143
144    G4UnionSolid t2Ut3("t2Ut3",&t2,&t3,
145                                         &identity,G4ThreeVector(0,0,50)) ;
146
147    G4UnionSolid t2Ut3Ut3("t2Ut3Ut3",&t2Ut3,&t3,
148                                         &identity,G4ThreeVector(0,0,-50)) ;
149
150    G4UnionSolid t3Ut3("t3Ut3",&t3,&t3,
151                                         &identity,G4ThreeVector(0,0,10)) ;
152
153    G4UnionSolid t3Ut3Ut3("t3Ut3Ut3",&t3Ut3,&t3,
154                                         &identity,G4ThreeVector(0,0,-10)) ;
155
156
157    G4UnionSolid b4Ub4xtouch("b4Ub4xtouch",b4,b4,&identity,G4ThreeVector(100.,0,0));
158
159
160    G4Box * box1 = new G4Box("Box1",1092.500000,240.103374,92.000000);
161    G4Box * box2 = new G4Box("Box2",540.103374,792.500000,92.000000);
162
163    G4double L1 = 1104;
164
165    G4UnionSolid envelope("ECShapeBoxes",
166                     box1,
167                     box2,
168                     0,
169                     G4ThreeVector(-L1/2.,
170                                   L1/2.,
171                                   0.)        );
172
173    G4ThreeVector pPrePre(-301.4252442474112,903.7985455093324,3013.122572566068-2924);
174    G4ThreeVector pPre(-301.5459060972926,904.1596390942879,3014.325585765819-2924);       
175    G4ThreeVector pPos(-301.7139066520877,904.6621760944698,3016-2924);
176
177  // Vacuum Cross
178
179  G4double startPhi = 0.*deg;
180  G4double deltaPhi = 360.*deg;
181  G4double minRadius = 0.*cm;
182
183
184  //Sample changer (carbon-fiber cross)
185
186  //G4double minRadiusTUV = 3.9*cm;   // Vertical carbon fiber tube
187  //G4double maxRadiusTUV = 4.1*cm;
188  //G4double halfLengthTUV = 47.5*cm;
189  G4double maxRadiusVACTUV = 3.9*cm;
190  G4double halfLengthVACTUV = 47.5*cm;
191
192  //G4double minRadiusTUH = 2.5*cm;  // ???  Horizontal carbon fiber tube
193  //G4double maxRadiusTUH = 2.7*cm;
194  //G4double halfLengthTUH = 44.0*cm;
195  G4double maxRadiusVACTUH = 2.5*cm;
196  G4double halfLengthVACTUH = 44.0*cm;
197
198
199  G4RotationMatrix rmVacCross;
200  rmVacCross.rotateX(90.*deg);
201  G4RotationMatrix rmVACTUV;
202  rmVACTUV.rotateX(90.*deg);
203
204  G4Tubs* solidVACTUH = new G4Tubs("VACTUH",minRadius,maxRadiusVACTUH,
205                                 halfLengthVACTUH,startPhi,deltaPhi);
206
207  G4Tubs* solidVACTUV = new G4Tubs("VACTUV",minRadius,maxRadiusVACTUV,
208                                 halfLengthVACTUV,startPhi,deltaPhi);
209
210  G4UnionSolid* solidVacCross = new G4UnionSolid("VacCross",solidVACTUH,solidVACTUV,
211                                                 &rmVacCross,G4ThreeVector());
212
213
214  // check cubic volume
215
216  vol = b1Ub2.GetCubicVolume();
217  volCheck = 8.*20.*30.*40.;
218  //  G4cout<<"vol = "<<vol<<"; volCheck = "<<volCheck<<G4endl;
219  assert(ApproxEqual(vol,volCheck));
220
221
222  // t2Ut4.SetCubVolStatistics(10000000);
223  vol = t2Ut4.GetCubicVolume();
224  volCheck = 2.*pi*50.*50.*50.;
225  diff = std::abs(vol-volCheck)/volCheck;
226  G4cout<<"vol = "<<vol<<"; volCheck = "<<volCheck<<"; rel. diff = "<<diff<<G4endl;
227  //  assert(ApproxEqual(vol,volCheck));
228
229
230
231// Check Inside
232    EInside side = solidVacCross->Inside(G4ThreeVector( 2.3391096733692156,
233                                     1.1325145357709736,
234                                     -0.85000000000000009));
235    G4cout<<"solidVacCross->Inside(G4ThreeVector( 2.3391... = "
236          <<OutputInside(side)<<G4endl;
237
238    side = envelope.Inside(pPrePre);
239    G4cout<<"envelope.Inside(pPrePre) = "<<OutputInside(side)<<G4endl;
240
241    side = envelope.Inside(pPre);
242    G4cout<<"envelope.Inside(pPre) = "<<OutputInside(side)<<G4endl;
243
244    side = envelope.Inside(pPos);
245    G4cout<<"envelope.Inside(pPos) = "<<OutputInside(side)<<G4endl;
246
247    side = b4Ub4xtouch.Inside(G4ThreeVector(50.,0,0));
248    G4cout<<"b4Ub4xtouch.Inside(G4ThreeVector(50.,0,0)) = "<<OutputInside(side)<<G4endl;
249
250    side = b4Ub4xtouch.Inside(G4ThreeVector(50.,50.,0));
251    G4cout<<"b4Ub4xtouch.Inside(G4ThreeVector(50.,50.,0)) = "<<OutputInside(side)<<G4endl;
252
253
254
255
256
257    assert(b1Ub2.Inside(pzero)==kInside);
258    assert(b1Ub2.Inside(pbigz)==kOutside);
259    assert(b1Ub2.Inside(ponxside)==kSurface);
260    assert(b1Ub2.Inside(ponyside)==kSurface);
261    assert(b1Ub2.Inside(ponzside)==kSurface);
262
263    assert(t1Ub2.Inside(pzero)==kInside);
264    assert(t1Ub2.Inside(pbigz)==kOutside);
265    assert(t1Ub2.Inside(ponb2x)==kInside);
266    assert(t1Ub2.Inside(ponb2y)==kInside);
267    assert(t1Ub2.Inside(ponb2z)==kInside);
268
269    assert(c2Ub2.Inside(pzero)==kInside);
270    assert(c2Ub2.Inside(pbigz)==kOutside);
271    assert(c2Ub2.Inside(ponb2x)==kInside);
272    assert(c2Ub2.Inside(ponb2y)==kInside);
273    assert(c2Ub2.Inside(ponb2z)==kInside);
274
275    // With placement
276
277    assert(t1Ub3.Inside(pzero)==kInside);
278    assert(t1Ub3.Inside(G4ThreeVector(0,60,0))==kSurface);
279    assert(t1Ub3.Inside(G4ThreeVector(50,0,0))==kSurface);
280    assert(t1Ub3.Inside(G4ThreeVector(0,65,0))==kOutside);
281    assert(t1Ub3.Inside(G4ThreeVector(0,50,0))==kInside);
282
283
284// Check Surface Normal
285
286    G4ThreeVector normal;
287
288    normal=b1Ub2.SurfaceNormal(ponxside);
289    assert(ApproxEqual(normal,G4ThreeVector(1,0,0)));
290
291    normal=b1Ub2.SurfaceNormal(ponmxside);
292    assert(ApproxEqual(normal,G4ThreeVector(-1,0,0)));
293
294    normal=b1Ub2.SurfaceNormal(ponyside);
295    assert(ApproxEqual(normal,G4ThreeVector(0,1,0)));
296
297    normal=b1Ub2.SurfaceNormal(ponmyside);
298    assert(ApproxEqual(normal,G4ThreeVector(0,-1,0)));
299
300    normal=b1Ub2.SurfaceNormal(ponzside);
301    assert(ApproxEqual(normal,G4ThreeVector(0,0,1)));
302
303    normal=b1Ub2.SurfaceNormal(ponmzside);
304    assert(ApproxEqual(normal,G4ThreeVector(0,0,-1)));
305
306    // Wirh placemenet
307
308    normal=t1Ub3.SurfaceNormal(G4ThreeVector(0,60,0));
309    assert(ApproxEqual(normal,G4ThreeVector(0,1,0)));
310
311    normal=t1Ub3.SurfaceNormal(G4ThreeVector(10,55,0));
312    assert(ApproxEqual(normal,G4ThreeVector(1,0,0)));
313
314    normal=t1Ub3.SurfaceNormal(G4ThreeVector(-10,55,0));
315    assert(ApproxEqual(normal,G4ThreeVector(-1,0,0)));
316
317    normal=t1Ub3.SurfaceNormal(G4ThreeVector(50.0/std::sqrt(2.0),50.0/std::sqrt(2.0),0));
318    assert(ApproxEqual(normal,vxy));
319
320
321// DistanceToOut(P)
322
323    dist=b1Ub2.DistanceToOut(pzero);
324    assert(ApproxEqual(dist,20));
325
326    dist=b1Ub2.DistanceToOut(vx);
327    assert(ApproxEqual(dist,19));
328
329    // With placement
330
331    dist=t1Ub3.DistanceToOut(pzero);
332    assert(ApproxEqual(dist,50));
333 
334    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,55,0));
335    assert(ApproxEqual(dist,5));
336 
337    dist=t1Ub3.DistanceToOut(G4ThreeVector(45,0,0));
338    assert(ApproxEqual(dist,5));
339 
340    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,45,0));
341    assert(ApproxEqual(dist,10));
342 
343    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,-45,0));
344    assert(ApproxEqual(dist,5));
345
346 
347// DistanceToOut(P,V)
348
349    dist=b4Ub5.DistanceToOut(G4ThreeVector(50,0,0),vmx,
350                             calcNorm,pgoodNorm,pNorm);
351    assert(ApproxEqual(dist,100));
352    //    G4cout<<"(100) b4Ub5.DistanceToOut(G4ThreeVector(50,0,0),vmx) = "
353    //          <<dist<<G4endl ;
354
355    dist=b4Ub5.DistanceToOut(G4ThreeVector(-10,0,-60),vxz,
356                             calcNorm,pgoodNorm,pNorm);
357    assert(ApproxEqual(dist,84.8528));
358    //  G4cout<<"(84.85) b4Ub5.DistanceToOut(G4ThreeVector(-10,0,-60),vxz) = "
359    //        <<dist<<G4endl ;
360
361
362    dist=b1Ub2.DistanceToOut(pzero,vx,calcNorm,pgoodNorm,pNorm);
363    assert(ApproxEqual(dist,20)&&ApproxEqual(*pNorm,vx)); // &&*pgoodNorm);
364
365    dist=b1Ub2.DistanceToOut(pzero,vmx,calcNorm,pgoodNorm,pNorm);
366    assert(ApproxEqual(dist,20)&&ApproxEqual(norm,vmx)); // &&*pgoodNorm);
367
368    dist=b1Ub2.DistanceToOut(pzero,vy,calcNorm,pgoodNorm,pNorm);
369    assert(ApproxEqual(dist,30)&&ApproxEqual(norm,vy)); // &&*pgoodNorm);
370
371    dist=b1Ub2.DistanceToOut(pzero,vmy,calcNorm,pgoodNorm,pNorm);
372    assert(ApproxEqual(dist,30)&&ApproxEqual(norm,vmy)); // &&*pgoodNorm);
373
374    dist=b1Ub2.DistanceToOut(pzero,vz,calcNorm,pgoodNorm,pNorm);
375    assert(ApproxEqual(dist,40)&&ApproxEqual(norm,vz)); // &&*pgoodNorm);
376
377    dist=b1Ub2.DistanceToOut(pzero,vmz,calcNorm,pgoodNorm,pNorm);
378    assert(ApproxEqual(dist,40)&&ApproxEqual(norm,vmz)); // &&*pgoodNorm);
379
380    dist=b1Ub2.DistanceToOut(pzero,vxy,calcNorm,pgoodNorm,pNorm);
381    assert(ApproxEqual(dist,std::sqrt(800.))); // &&*pgoodNorm);
382
383    dist=b1Ub2.DistanceToOut(ponb2x,vx,calcNorm,pgoodNorm,pNorm);
384    assert(ApproxEqual(dist,10)&&ApproxEqual(*pNorm,vx)); // &&*pgoodNorm);
385
386    dist=b1Ub2.DistanceToOut(ponb2x,vmx,calcNorm,pgoodNorm,pNorm);
387    assert(ApproxEqual(dist,30)&&ApproxEqual(*pNorm,vmx)); // &&*pgoodNorm);
388
389    dist=b1.DistanceToOut(ponxside,vy,calcNorm,pgoodNorm,pNorm);
390//  G4cout<<"b1.DistanceToOut(ponxside,vy) = "<<dist<<G4endl;
391//  assert(ApproxEqual(dist,0)&&ApproxEqual(*pNorm,vy)); // &&*pgoodNorm);
392
393    dist=b1Ub2.DistanceToOut(ponb2mx,vmx,calcNorm,pgoodNorm,pNorm);
394    assert(ApproxEqual(dist,10)&&ApproxEqual(norm,vmx)); //&&*pgoodNorm);
395
396    dist=b1Ub2.DistanceToOut(ponb2y,vy,calcNorm,pgoodNorm,pNorm);
397    assert(ApproxEqual(dist,20)&&ApproxEqual(norm,vy)); // &&*pgoodNorm);
398
399    dist=b1Ub2.DistanceToOut(ponb2my,vmy,calcNorm,pgoodNorm,pNorm);
400    assert(ApproxEqual(dist,20)&&ApproxEqual(norm,vmy)) ; // &&*pgoodNorm);
401
402    dist=b1Ub2.DistanceToOut(ponb2z,vz,calcNorm,pgoodNorm,pNorm);
403    assert(ApproxEqual(dist,30)&&ApproxEqual(norm,vz)) ; // &&*pgoodNorm);
404
405    dist=b1Ub2.DistanceToOut(ponb2mz,vmz,calcNorm,pgoodNorm,pNorm);
406    assert(ApproxEqual(dist,30)&&ApproxEqual(norm,vmz)) ; // &&*pgoodNorm);
407
408    // With placement
409
410    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,55,0),vmy,
411                             calcNorm,pgoodNorm,pNorm);
412    assert(ApproxEqual(dist,105)&&ApproxEqual(norm,vmy)); // &&*pgoodNorm);
413
414    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,55,0),vy,
415                             calcNorm,pgoodNorm,pNorm);
416    assert(ApproxEqual(dist,5)&&ApproxEqual(norm,vy)); // &&*pgoodNorm);
417
418    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,55,0),vx,
419                             calcNorm,pgoodNorm,pNorm);
420    assert(ApproxEqual(dist,10)&&ApproxEqual(norm,vx)); // &&*pgoodNorm);
421
422    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,55,0),vmx,
423                             calcNorm,pgoodNorm,pNorm);
424    assert(ApproxEqual(dist,10)&&ApproxEqual(norm,vmx)); // &&*pgoodNorm);
425
426    dist=t1Ub3.DistanceToOut(G4ThreeVector(0,55,0),vz,
427                             calcNorm,pgoodNorm,pNorm);
428    assert(ApproxEqual(dist,50)&&ApproxEqual(norm,vz)); // &&*pgoodNorm);
429
430    dist=t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,0),vmx,
431                             calcNorm,pgoodNorm,pNorm);
432    assert(ApproxEqual(dist,5));
433    // G4cout<<"(5) t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,0),vmx) = "
434    //       <<dist<<G4endl ;
435
436    dist=t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,0),vx,
437                             calcNorm,pgoodNorm,pNorm);
438    assert(ApproxEqual(dist,0));
439    //   G4cout<<"(0) t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,0),vx) = "
440    //         <<dist<<G4endl ;
441
442    dist=t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,70),vmx,
443                             calcNorm,pgoodNorm,pNorm);
444    assert(ApproxEqual(dist,100));
445    //   G4cout<<"(100) t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,70),vmx) = "
446    //         <<dist<<G4endl ;
447
448    dist=t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,70),vx,
449                             calcNorm,pgoodNorm,pNorm);
450    assert(ApproxEqual(dist,0));
451    //   G4cout<<"(0) t2Ut1Ut1.DistanceToOut(G4ThreeVector(50,0,70),vx) = "
452    //         <<dist<<G4endl ;
453
454    dist=t2Ut1Ut1.DistanceToOut(G4ThreeVector(0,0,60),vmz,
455                             calcNorm,pgoodNorm,pNorm);
456    assert(ApproxEqual(dist,0));
457    //   G4cout<<"(0) t2Ut1Ut1.DistanceToOut(G4ThreeVector(0,0,60),vmz) = "
458    //         <<dist<<G4endl ;
459
460    dist=t2Ut1Ut1.DistanceToOut(G4ThreeVector(0,0,60),vz,
461                             calcNorm,pgoodNorm,pNorm);
462    assert(ApproxEqual(dist,100));
463    //  G4cout<<"(100) t2Ut1Ut1.DistanceToOut(G4ThreeVector(0,0,60),vz) = "
464    //        <<dist<<G4endl ;
465
466    dist=t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-48),vxmz,
467                             calcNorm,pgoodNorm,pNorm);
468    assert(ApproxEqual(dist,9.89949));
469    //  G4cout<<"(9.89) t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-48),vxmz) = "
470    //        <<dist<<G4endl ;
471
472    dist=t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-50),vxz,
473                             calcNorm,pgoodNorm,pNorm);
474    assert(ApproxEqual(dist,7.07107));
475    //  G4cout<<"(7.07) t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-50),vxz) = "
476    //        <<dist<<G4endl ;
477
478    dist=t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-50),vxmz,
479                             calcNorm,pgoodNorm,pNorm);
480    assert(ApproxEqual(dist,7.07107));
481    // G4cout<<"(7.07) t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-50),vxmz) = "
482    //       <<dist<<G4endl ;
483
484    dist=t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-52),vxmz,
485                             calcNorm,pgoodNorm,pNorm);
486    assert(ApproxEqual(dist,4.24264));
487    // G4cout<<"(4.24) t2Ut3Ut3.DistanceToOut(G4ThreeVector(-50,0,-52),vxmz) = "
488    //       <<dist<<G4endl ;
489
490    dist=t3Ut3Ut3.DistanceToOut(G4ThreeVector(0,0,-15),vz,
491                             calcNorm,pgoodNorm,pNorm);
492    assert(ApproxEqual(dist,30));
493    //  G4cout<<"(30) t3Ut3Ut3.DistanceToOut(G4ThreeVector(0,0,-15),vz) = "
494    //        <<dist<<G4endl ;
495
496    dist=t2Ut4.DistanceToOut(G4ThreeVector(-50,0,0),vx,
497                             calcNorm,pgoodNorm,pNorm);
498    assert(ApproxEqual(dist,100));
499    // G4cout<<"(100) t2Ut4.DistanceToOut(G4ThreeVector(-50,0,0),vx) = "
500    //       <<dist<<G4endl ;
501
502    dist=t2Ut4.DistanceToOut(G4ThreeVector(-15,-45,0),vx,
503                             calcNorm,pgoodNorm,pNorm);
504    assert(ApproxEqual(dist,36.7945));
505    // G4cout<<"(36.8) t2Ut4.DistanceToOut(G4ThreeVector(-15,-45,0),vx) = "
506    //    <<dist<<G4endl ;
507
508    dist=t2Ut4.DistanceToOut(G4ThreeVector(0,-45,0),vx,
509                             calcNorm,pgoodNorm,pNorm);
510    assert(ApproxEqual(dist,21.7945));
511
512    // G4cout<<"(21.8) t2Ut4.DistanceToOut(G4ThreeVector(0,-45,0),vx) = "
513    //      <<dist<<G4endl ;
514
515   const G4double dx=15.3125;
516   const G4double dy=100;
517   const G4double dz=3.75;
518   const G4double theta=0.283794;
519
520   const G4double radius=2;
521   const G4double length=200; // cm
522
523   // Building solid
524
525   G4Para* para=new G4Para("Para",dx*cm,dy*cm,dz*cm,0,theta,0);
526   G4Tubs* tube = new G4Tubs("Tube",0.0,radius*cm*0.99, length*cm/2.0, 0.0, 2*M_PI);
527
528   G4ThreeVector transv(-164.062,0,-17.5); // mm
529   G4Transform3D trans1=G4Translate3D(transv*mm)*G4RotateX3D(M_PI/2);
530
531   G4VSolid* solid=new G4UnionSolid("solid",para,tube,trans1);
532
533   // Checking points
534   G4ThreeVector point1(-142.188*mm,0,-0.5*mm); // mm
535   G4ThreeVector point2(-142.188*mm,0,-1*mm); // mm
536   G4ThreeVector direction(-1,0,0);
537
538 if (solid->Inside(point1)==kInside) {
539   //  G4cout<<"Test point "<<point1<<" is inside. That's right!"<<G4endl;
540   }
541   else {
542     //  G4cout<<"Test point "<<point1<<" is not inside. That's wrong!"<<G4endl;
543   }
544
545   dist=solid->DistanceToOut(point1,direction);
546
547   //  G4cout<<"Distance is "<<dist<<G4endl;
548
549   if (solid->Inside(point2)==kInside) {
550     //  G4cout<<"Test point "<<point2<<" is inside. That's right!"<<G4endl;
551   }
552   else {
553     //  G4cout<<"Test point "<<point2<<" is not inside. That's wrong!"<<G4endl;
554   }
555
556   // dist=solid->DistanceToOut(point2,direction);
557
558   //  G4cout<<"Distance is "<<dist<<G4endl;
559
560
561
562
563// DistanceToIn(P)
564
565    dist=b1Ub2.DistanceToIn(pbigx);
566    assert(ApproxEqual(dist,80));
567    //   G4cout<<"b1Ub2.DistanceToIn(pbigx) = "<<dist<<G4endl ;
568    //   G4cout<<"b1.DistanceToIn(pbigx) = "<<b1.DistanceToIn(pbigx)<<G4endl ;
569    //   G4cout<<"b2.DistanceToIn(pbigx) = "<<b2.DistanceToIn(pbigx)<<G4endl ;
570
571    dist=b1Ub2.DistanceToIn(ponxside);
572    assert(ApproxEqual(dist,0));
573
574    dist=b1Ub2.DistanceToIn(ponxside);
575    assert(ApproxEqual(dist,0));
576
577    dist=b1Ub2.DistanceToIn(pbigmy);
578    assert(ApproxEqual(dist,70));
579
580    dist=b1Ub2.DistanceToIn(pbigz);
581    assert(ApproxEqual(dist,60));
582
583    dist=b1Ub2.DistanceToIn(pbigmz);
584    assert(ApproxEqual(dist,60));
585
586    // With placement
587
588    dist=t1Ub3.DistanceToIn(pbigmz);
589    assert(ApproxEqual(dist,50));
590
591    dist=t1Ub3.DistanceToIn(pbigy);
592    assert(ApproxEqual(dist,40));
593
594    dist=t1Ub3.DistanceToIn(G4ThreeVector(0,65,0));
595    assert(ApproxEqual(dist,5));
596
597    dist=t1Ub3.DistanceToIn(G4ThreeVector(0,60,0));
598    assert(ApproxEqual(dist,0));
599
600
601// DistanceToIn(P,V)
602
603    dist=b1Ub2.DistanceToIn(pbigx,vmx);
604    assert(ApproxEqual(dist,80));
605
606    dist=b1Ub2.DistanceToIn(pbigmx,vx);
607    assert(ApproxEqual(dist,80));
608
609    dist=b1Ub2.DistanceToIn(pbigy,vmy);
610    assert(ApproxEqual(dist,70));
611
612    dist=b1Ub2.DistanceToIn(pbigmy,vy);
613    assert(ApproxEqual(dist,70));
614
615    dist=b1Ub2.DistanceToIn(pbigz,vmz);
616    assert(ApproxEqual(dist,60));
617
618    dist=b1Ub2.DistanceToIn(pbigmz,vz);
619    assert(ApproxEqual(dist,60));
620
621    dist=b1Ub2.DistanceToIn(pbigx,vxy);
622    assert(ApproxEqual(dist,kInfinity));
623
624    dist=b1Ub2.DistanceToIn(pbigmx,vxy);
625    assert(ApproxEqual(dist,kInfinity));
626
627
628    // With placement
629
630    dist=t1Ub3.DistanceToIn(pbigx,vmx);
631    assert(ApproxEqual(dist,50));
632
633    dist=t1Ub3.DistanceToIn(pbigy,vmy);
634    assert(ApproxEqual(dist,40));
635
636    dist=t1Ub3.DistanceToIn(pbigmy,vy);
637    assert(ApproxEqual(dist,50));
638
639    dist=t1Ub3.DistanceToIn(pbigmx,vx);
640    assert(ApproxEqual(dist,50));
641
642    dist=t2Ut1Trans.DistanceToIn(pzero,vx);
643    //  G4cout<<"t2Ut1Trans.DistanceToIn(pzero,vx) = "<<dist<<G4endl ;
644    assert(ApproxEqual(dist,45));
645
646    dist=t2Ut1Trans.DistanceToIn(pzero,vz);
647    //   G4cout<<"t2Ut1Trans.DistanceToIn(pzero,vz) = "<<dist<<G4endl ;
648    assert(ApproxEqual(dist,60));
649
650    dist=t2Ut1Trans.DistanceToIn(pzero,vmz);
651    //   G4cout<<"t2Ut1Trans.DistanceToIn(pzero,vmz) = "<<dist<<G4endl ;
652    assert(ApproxEqual(dist,kInfinity));
653
654    dist=t2Ut1Trans.DistanceToIn(G4ThreeVector(0,0,55),vx);
655    //   G4cout<<"t2Ut1Trans.DistanceToIn(G4ThreeVector(0,0,55),vx) = "
656    //         <<dist<<G4endl ;
657    assert(ApproxEqual(dist,kInfinity));
658
659    dist=t2Ut1Ut1.DistanceToIn(pzero,vmz);
660    //  G4cout<<"t2Ut1Ut1.DistanceToIn(pzero,vmz) = "<<dist<<G4endl ;
661    assert(ApproxEqual(dist,60));
662
663
664    G4cout<<"Tracking functions are OK"<<G4endl ;
665
666
667// CalculateExtent
668
669    G4VoxelLimits limit;                // Unlimited
670    G4RotationMatrix noRot;
671    G4AffineTransform origin;
672    G4double min,max;
673
674    assert(b1.CalculateExtent(kXAxis,limit,origin,min,max));
675    assert(ApproxEqual(min,-20)&&ApproxEqual(max,20));
676
677    assert(b1.CalculateExtent(kYAxis,limit,origin,min,max));
678    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
679
680    assert(b1.CalculateExtent(kZAxis,limit,origin,min,max));
681    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
682
683    assert(b1Ub3.CalculateExtent(kXAxis,limit,origin,min,max));
684    assert(ApproxEqual(min,-20)&&ApproxEqual(max,20));
685
686    assert(b1Ub3.CalculateExtent(kYAxis,limit,origin,min,max));
687    assert(ApproxEqual(min,-30)&&ApproxEqual(max,60));
688
689    assert(b1Ub3.CalculateExtent(kZAxis,limit,origin,min,max));
690    assert(ApproxEqual(min,-50)&&ApproxEqual(max,50));
691
692    G4ThreeVector pmxmymz(-100,-110,-120);
693    G4AffineTransform tPosOnly(pmxmymz);
694
695    assert(b1.CalculateExtent(kXAxis,limit,tPosOnly,min,max));
696    assert(ApproxEqual(min,-120)&&ApproxEqual(max,-80));
697
698    assert(b1.CalculateExtent(kYAxis,limit,tPosOnly,min,max));
699    assert(ApproxEqual(min,-140)&&ApproxEqual(max,-80));
700
701    assert(b1.CalculateExtent(kZAxis,limit,tPosOnly,min,max));
702    assert(ApproxEqual(min,-160)&&ApproxEqual(max,-80));
703
704    G4RotationMatrix r90Z;
705    r90Z.rotateZ(pi/2);
706    G4AffineTransform tRotZ(r90Z,pzero);
707
708    assert(b1.CalculateExtent(kXAxis,limit,tRotZ,min,max));
709    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
710
711    assert(b1.CalculateExtent(kYAxis,limit,tRotZ,min,max));
712    assert(ApproxEqual(min,-20)&&ApproxEqual(max,20));
713
714    assert(b1.CalculateExtent(kZAxis,limit,tRotZ,min,max));
715    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
716
717// Check that clipped away
718
719    G4VoxelLimits xClip;
720    xClip.AddLimit(kXAxis,-100,-50);
721
722    assert(!b1.CalculateExtent(kXAxis,xClip,origin,min,max));
723
724// Assert clipped to volume
725
726    G4VoxelLimits allClip;
727    allClip.AddLimit(kXAxis,-5,+5);
728    allClip.AddLimit(kYAxis,-5,+5);
729    allClip.AddLimit(kZAxis,-5,+5);
730
731    G4RotationMatrix genRot;
732    genRot.rotateX(pi/6);
733    genRot.rotateY(pi/6);
734    genRot.rotateZ(pi/6);
735    G4AffineTransform tGen(genRot,vx);
736
737    assert(b1.CalculateExtent(kXAxis,allClip,tGen,min,max));
738    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
739
740    assert(b1.CalculateExtent(kYAxis,allClip,tGen,min,max));
741    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
742
743    assert(b1.CalculateExtent(kZAxis,allClip,tGen,min,max));
744    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
745
746    G4VoxelLimits buggyClip2;
747    buggyClip2.AddLimit(kXAxis,5,15);
748
749    assert(b1.CalculateExtent(kXAxis,buggyClip2,origin,min,max));
750    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
751
752    assert(b1.CalculateExtent(kYAxis,buggyClip2,origin,min,max));
753    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
754
755    assert(b1.CalculateExtent(kZAxis,buggyClip2,origin,min,max));
756    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
757
758    buggyClip2.AddLimit(kYAxis,5,15);
759
760    assert(b1.CalculateExtent(kXAxis,buggyClip2,origin,min,max));
761    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
762
763    assert(b1.CalculateExtent(kYAxis,buggyClip2,origin,min,max));
764    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
765
766    assert(b1.CalculateExtent(kZAxis,buggyClip2,origin,min,max));
767    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
768
769    G4VoxelLimits buggyClip1;
770    buggyClip1.AddLimit(kXAxis,-5,+5);
771
772    assert(b1.CalculateExtent(kXAxis,buggyClip1,origin,min,max));
773    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
774
775    assert(b1.CalculateExtent(kYAxis,buggyClip1,origin,min,max));
776    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
777
778    assert(b1.CalculateExtent(kZAxis,buggyClip1,origin,min,max));
779    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
780
781    buggyClip1.AddLimit(kYAxis,-5,+5);
782
783    assert(b1.CalculateExtent(kXAxis,buggyClip1,origin,min,max));
784    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
785
786    assert(b1.CalculateExtent(kYAxis,buggyClip1,origin,min,max));
787    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
788
789    assert(b1.CalculateExtent(kZAxis,buggyClip1,origin,min,max));
790    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
791
792    G4cout<<"CalculateExtent is OK"<<G4endl ;
793
794
795  return 0 ;
796}
Note: See TracBrowser for help on using the repository browser.