source: trunk/source/geometry/solids/test/fred/src/FredDetectorConstruction.cc@ 1350

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

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

File size: 29.5 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// FredDetectorConstruction.cc
28//
29// Implementation of fred's detector
30//
31
32#include "FredDetectorConstruction.hh"
33#include "FredSensitive.hh"
34#include "FredSensMother.hh"
35
36#include "G4LogicalVolume.hh"
37#include "G4ThreeVector.hh"
38#include "G4PVPlacement.hh"
39#include "G4RotationMatrix.hh"
40
41#include "G4SDManager.hh"
42
43#include "G4Material.hh"
44#include "G4Box.hh"
45#include "G4Tubs.hh"
46#include "G4Orb.hh"
47#include "G4Sphere.hh"
48#include "G4Torus.hh"
49#include "G4Trap.hh"
50#include "G4Trd.hh"
51#include "G4Para.hh"
52#include "G4Cons.hh"
53#include "G4Sphere.hh"
54#include "G4BREPSolidPCone.hh"
55#include "G4Polyhedra.hh"
56#include "G4Polycone.hh"
57#include "G4Ellipsoid.hh"
58#include "G4EllipticalCone.hh"
59#include "G4EllipticalTube.hh"
60#include "G4ExtrudedSolid.hh"
61#include "G4Hype.hh"
62#include "G4QuadrangularFacet.hh"
63#include "G4Tet.hh"
64#include "G4TwistedBox.hh"
65#include "G4TwistedTrap.hh"
66#include "G4TwistedTrd.hh"
67#include "G4TwistedTubs.hh"
68
69#include "G4SubtractionSolid.hh"
70
71#include "G4Color.hh"
72#include "G4VisAttributes.hh"
73
74#include "globals.hh"
75
76#include <cmath>
77
78//
79// Constructor
80//
81FredDetectorConstruction::FredDetectorConstruction( FredMessenger *ourMessenger )
82{
83 messenger = ourMessenger;
84}
85
86FredDetectorConstruction::~FredDetectorConstruction()
87{;}
88
89
90//
91// Private methods
92//
93G4ExtrudedSolid* FredDetectorConstruction::CreateExtrudedSolid1() const
94{
95 // Extruded solid with triangular polygon
96 std::vector<G4TwoVector> polygon;
97 polygon.push_back(G4TwoVector(-30.*cm, -30.*cm));
98 polygon.push_back(G4TwoVector( 0.*cm, 30.*cm));
99 polygon.push_back(G4TwoVector( 30.*cm, -30.*cm));
100
101
102 return new G4ExtrudedSolid("test_xtru1", polygon, 30.*cm,
103 G4TwoVector(), 1.0, G4TwoVector(), 1.0);
104}
105
106G4ExtrudedSolid* FredDetectorConstruction::CreateExtrudedSolid2() const
107{
108 // Box defined as Extruded solid
109 std::vector<G4TwoVector> polygon;
110 polygon.push_back(G4TwoVector(-30.*cm, -30.*cm));
111 polygon.push_back(G4TwoVector(-30.*cm, 30.*cm));
112 polygon.push_back(G4TwoVector( 30.*cm, 30.*cm));
113 polygon.push_back(G4TwoVector( 30.*cm, -30.*cm));
114
115 return new G4ExtrudedSolid("test_xtru2", polygon, 30.*cm,
116 G4TwoVector(), 1.0, G4TwoVector(), 1.0);
117}
118
119G4ExtrudedSolid* FredDetectorConstruction::CreateExtrudedSolid3() const
120{
121 // Extruded solid with 4 z-sections
122 std::vector<G4TwoVector> polygon;
123 polygon.push_back(G4TwoVector(-30.*cm, -30.*cm));
124 polygon.push_back(G4TwoVector(-30.*cm, 30.*cm));
125 polygon.push_back(G4TwoVector( 30.*cm, 30.*cm));
126 polygon.push_back(G4TwoVector( 30.*cm, -30.*cm));
127 polygon.push_back(G4TwoVector( 15.*cm, -30.*cm));
128 polygon.push_back(G4TwoVector( 15.*cm, 15.*cm));
129 polygon.push_back(G4TwoVector(-15.*cm, 15.*cm));
130 polygon.push_back(G4TwoVector(-15.*cm, -30.*cm));
131
132 std::vector<G4ExtrudedSolid::ZSection> zsections;
133 zsections.push_back(G4ExtrudedSolid::ZSection(-40.*cm, G4TwoVector(-20.*cm, 10.*cm), 1.5));
134 zsections.push_back(G4ExtrudedSolid::ZSection( 10.*cm, G4TwoVector( 0.*cm, 0.*cm), 0.5));
135 zsections.push_back(G4ExtrudedSolid::ZSection( 15.*cm, G4TwoVector( 0.*cm, 0.*cm), 0.7));
136 zsections.push_back(G4ExtrudedSolid::ZSection( 40.*cm, G4TwoVector( 20.*cm, 20.*cm), 0.9));
137
138 return new G4ExtrudedSolid("test_xtru3", polygon, zsections);
139}
140
141G4ExtrudedSolid* FredDetectorConstruction::CreateExtrudedSolid4() const
142{
143 // Another extruded solid, where polygon decomposition was failing
144 // in Geant4 9.1
145 std::vector<G4TwoVector> polygon;
146 polygon.push_back( G4TwoVector(-20.*cm, 10.*cm) );
147 polygon.push_back( G4TwoVector(-20.*cm, 25.*cm) );
148 polygon.push_back( G4TwoVector( 10.*cm, 25.*cm) );
149 polygon.push_back( G4TwoVector( 10.*cm, -10.*cm) );
150 polygon.push_back( G4TwoVector( 20.*cm, -10.*cm) );
151 polygon.push_back( G4TwoVector( 20.*cm, -25.*cm) );
152 polygon.push_back( G4TwoVector(-10.*cm, -25.*cm) );
153 polygon.push_back( G4TwoVector(-10.*cm, 10.*cm) );
154
155 return new G4ExtrudedSolid("test_xtru3", polygon, 20.*cm,
156 G4TwoVector(), 1.0, G4TwoVector(), 1.0);
157}
158
159//
160// Construct: Build the detector
161//
162G4VPhysicalVolume* FredDetectorConstruction::Construct()
163{
164 G4VisAttributes *redStuff = new G4VisAttributes( G4Color(1,0,0) );
165
166 //
167 // Vaccuum would do fine for materials right now
168 //
169 G4Material *Vaccuum = new G4Material( "Vaccuum", 18.0, 39.95*g/mole, 1.782e-03*g/cm3 );
170
171
172 //
173 // At the moment, I want something really simple:
174 // how about a "hall" containing a single box
175 //
176
177 /*
178 MEDERNACH Emmanuel
179 Aug 2000,
180
181 BEWARE :
182 If World is too small for test then Segmentation Fault !!
183 */
184
185 G4Box *hallBox = new G4Box( "hall_box", 8*m, 8*m, 8*m );
186 G4LogicalVolume *hallLog = new G4LogicalVolume( hallBox, Vaccuum, "hall_log", 0, 0, 0 );
187 G4VPhysicalVolume *hall = new G4PVPlacement( 0, G4ThreeVector(), hallLog,
188 "hall", 0, false, 0 );
189
190 //
191 // We usually don't care much about the main volume: just
192 // make it invisible
193 //
194 hallLog->SetVisAttributes( G4VisAttributes::Invisible );
195
196 //
197 // For the test volume, we have some run-time choices:
198 //
199 G4RotationMatrix *rot = new G4RotationMatrix();
200
201 G4double startPhi = messenger->StartPhi()*deg,
202 deltaPhi = messenger->DeltaPhi()*deg;
203 G4int numSide = messenger->NumSide();
204
205 switch ( messenger->SelectedVolume() ) {
206
207 //
208 // special tests
209 //
210
211 case NATALIA: {
212 G4double z_values[3] = { -60.76*mm, -49.14*mm, 102.68*mm };
213 G4double rmin[3] = { 6.24*mm, 0*mm, 0*mm };
214 G4double rmax[3] = { 6.24*mm, 6.24*mm, 6.24*mm };
215 // Rib thickness 0.41, height 6.42
216 startPhi = -std::atan2( 0.5*0.41, 6.42 );
217 deltaPhi = -2.0*startPhi;
218 testVolume = new G4Polyhedra("natalia",
219 startPhi, deltaPhi, 1, 3, z_values, rmin, rmax );
220 }
221 break;
222
223 case VOXEL:
224 testVolume = new G4Box( "test_voxel", 1*m, 1*m, 1*m );
225 break;
226
227 //
228 // CSG solids
229 //
230
231 case BOX:
232 testVolume = new G4Box( "test_box", 1*m, 1*m, 1*m );
233 break;
234
235 case CONE:
236 testVolume = new G4Cons("test_cone",
237 1*m, 1.2*m, 0.4*m, 0.6*m, 1*m, startPhi, deltaPhi );
238 // SBT test - case c
239 // testVolume = new G4Cons("test_cone",
240 // 0.0*m, 1.0*m, 0.5*m, 1.0*m, 1*m, 0.0, 360.0*deg );
241 // SBT test - case d
242 // testVolume = new G4Cons("test_cone",
243 // 0.0*m, 1.0*m, 0.0*m, 1.0*m, 1*m, 0.0, 90.0*deg );
244 // SBT test - case e
245 // testVolume = new G4Cons("test_cone",
246 // 0.0*m, 1.0*m, 0.0*m, 1.0*m, 1*m, 20.0*deg, 181.0*deg );
247 // SBT test - case f
248 // testVolume = new G4Cons("test_cone",
249 // 0.5*m, 1.0*m, 0.7*m, 1.2*m, 1*m, 20.0*deg, 350.0*deg );
250 // SBT test - case g
251 // testVolume = new G4Cons("test_cone",
252 // 0.0*m, 0.2*m, 0.8*m, 1.0*m, 0.0001*m, 10.0*deg, 90.0*deg );
253 fprintf(stderr,"OK defining a Cone \n");
254 break;
255
256 case CONE2:
257 // try to do a cone with a 'pick'
258 testVolume = new G4Cons( "test_cone2",
259 1*m, 1.2*m, 0.0*m, 0.2*m, 1*m, startPhi, deltaPhi );
260 fprintf(stderr,"OK defining a Cone2 \n");
261 break;
262
263 case ORB:
264 testVolume = new G4Orb ("test_orb", 1.0*m);
265 fprintf(stderr,"OK defining an Orb\n");
266 break;
267
268 case PARA:
269 // SBT test case b
270 testVolume = new G4Para("test_para",
271 1.0*m, 1.0*m, 1.0*m, 30.0*deg, 0.0*deg, 0.0*deg);
272 // SBT test case c
273 // testVolume = new G4Para("test_para",
274 // 1.0*m, 1.0*m, 1.0*m, 30.0*deg, 30.0*deg, 0.0*deg);
275 // SBT test case d
276 // testVolume = new G4Para("test_para",
277 // 1.0*m, 1.0*m, 1.0*m, 30.0*deg, 30.0*deg, 30.0*deg);
278 // SBT test case e
279 // testVolume = new G4Para("test_para",
280 // 0.001*m, 1.0*m, 2.0*m, 30.0*deg, 30.0*deg, 30.0*deg);
281 fprintf(stderr,"OK defining a Para \n");
282 break;
283
284 case SPHERE:
285 testVolume = new G4Sphere ("test_sphere", 0.8*m, 1.0*m, startPhi, deltaPhi, 0.0, pi);
286 // SBT test case a
287 // testVolume = new G4Sphere ("test_sphere", 0.0*m, 1.0*m, 0.0*deg, 360.0*deg, 0.0*deg, 180.0*deg);
288 // SBT test case b
289 // testVolume = new G4Sphere ("test_sphere", 0.5*m, 1.0*m, 0.0*deg, 360.0*deg, 0.0*deg, 180.0*deg);
290 // SBT test case c
291 // testVolume = new G4Sphere ("test_sphere", 0.0*m, 1.0*m, 0.0*deg, 90.0*deg, 0.0*deg, 180.0*deg);
292 // SBT test case d
293 // testVolume = new G4Sphere ("test_sphere", 0.5*m, 1.0*m, 0.0*deg, 90.0*deg, 0.0*deg, 180.0*deg);
294 // SBT test case e
295 // testVolume = new G4Sphere ("test_sphere", 0.0*m, 1.0*m, 0.0*deg, 360.0*deg, 0.0*deg, 90.0*deg);
296 // SBT test case e
297 // testVolume = new G4Sphere ("test_sphere", 0.5*m, 1.0*m, 0.0*deg, 360.0*deg, 0.0*deg, 90.0*deg);
298 // SBT test case f
299 // testVolume = new G4Sphere ("test_sphere", 0.0*m, 1.0*m, 0.0*deg, 90.0*deg, 0.0*deg, 90.0*deg);
300 // SBT test case g
301 // testVolume = new G4Sphere ("test_sphere", 0.5*m, 1.0*m, 0.0*deg, 90.0*deg, 0.0*deg, 90.0*deg);
302 fprintf(stderr,"OK defining a Sphere \n");
303 break;
304
305 case TORUS1:
306 testVolume = new G4Torus("test_torus1",
307 0.2*m, 0.4*m, 1.2*m, startPhi, deltaPhi);
308 // SBT test case a
309 // testVolume = new G4Torus("test_torus1",
310 // 0.0*m, 0.4*m, 1.0*m, 0.0*deg, 360.0*deg);
311 // SBT test case b
312 // testVolume = new G4Torus("test_torus1",
313 // 0.2*m, 0.4*m, 1.0*m, 0.0*deg, 360.0*deg);
314 // SBT test case c
315 // testVolume = new G4Torus("test_torus1",
316 // 0.0*m, 0.4*m, 1.0*m, 0.0*deg, 90.0*deg);
317 // SBT test case d
318 // testVolume = new G4Torus("test_torus1",
319 // 0.2*m, 0.4*m, 1.0*m, 0.0*deg, 90.0*deg);
320 // SBT test case e
321 // testVolume = new G4Torus("test_torus1",
322 // 0.399*m, 0.4*m, 1.0*m, 0.0*deg, 90.0*deg);
323 fprintf(stderr,"OK defining a Torus1 \n");
324 break;
325
326 case TORUS2:
327 testVolume = new G4Torus("test_torus2",
328 0.8*m, 1.4*m, 1.8*m, startPhi, deltaPhi);
329 fprintf(stderr,"OK defining a Torus2 \n");
330 break;
331
332 case TRAP:
333 testVolume = new G4Trap ("test_trap",
334 1.0*m, 0.0, pi,
335 2.4*m,1.0*m,2.0*m, 0.0,
336 2.4*m,1.0*m,2.0*m, pi);
337 fprintf(stderr,"OK defining a Trap \n");
338 break;
339
340 case TRD:
341 testVolume = new G4Trd("test_trd",
342 0.2*m, 0.8*m, 0.8*m, 1.2*m, 4*m) ;
343 fprintf(stderr,"OK defining a Trd \n");
344 break;
345
346 case TUBS:
347 testVolume = new G4Tubs( "test_tubs", 1.0*m, 1.2*m, 1*m, startPhi, deltaPhi );
348
349 // SBT test - case c
350 // testVolume = new G4Tubs( "test_tubs", 0.0*m, 1.0*m, 1.0*m, 0.0*deg, 90.0*deg );
351 // SBT test - case e
352 // testVolume = new G4Tubs( "test_tubs", 0.00999*m, 0.01001*m, 1*m, 10.0*deg, 260.0*deg );
353 fprintf(stderr,"OK defining a Tubs \n");
354 break;
355
356 //
357 // specific solids
358 //
359
360
361 case ELLIPS:
362 testVolume = new G4Ellipsoid( "test_ellipsoid",
363 0.5*m, 0.8*m, 1.0*m, -0.4*m, 0.8*m );
364 // SBT test - case a
365 // testVolume = new G4Ellipsoid( "test_ellipsoid",
366 // 1.0*m, 1.0*m, 1.0*m, 0.0*m, 0.0*m );
367 // SBT test - case b
368 // testVolume = new G4Ellipsoid( "test_ellipsoid",
369 // 0.5*m, 0.8*m, 1.0*m, 0.0*m, 0.0*m );
370 // SBT test - case c
371 // testVolume = new G4Ellipsoid( "test_ellipsoid",
372 // 0.5*m, 0.8*m, 1.0*m, -0.4*m, 10.0*m );
373 // SBT test - case d
374 // testVolume = new G4Ellipsoid( "test_ellipsoid",
375 // 0.5*m, 0.8*m, 1.0*m, -10.0*m, 0.8*m );
376 // SBT test - case e
377 // testVolume = new G4Ellipsoid( "test_ellipsoid",
378 // 0.5*m, 0.8*m, 1.0*m, -0.4*m, 0.8*m );
379 break;
380
381 case ELCONE:
382 testVolume = new G4EllipticalCone( "test_elcone", 0.3, 0.6, 0.75*m, 0.25*m);
383 // SBT test - case a
384 // testVolume = new G4EllipticalCone( "test_elcone", 0.3, 0.3, 0.75*m, 0.25*m);
385 // SBT test - case b
386 // testVolume = new G4EllipticalCone( "test_elcone", 0.3, 0.3, 0.75*m, 0.75*m);
387 // SBT test - case c
388 // testVolume = new G4EllipticalCone( "test_elcone", 0.3, 0.6, 0.75*m, 0.25*m);
389 // SBT test - case d
390 //testVolume = new G4EllipticalCone( "test_elcone", 0.3, 0.6, 0.75*m, 0.75*m);
391 break;
392
393 case ELTUBE:
394 testVolume = new G4EllipticalTube( "test_eltube", 0.4*m, 0.8*m, 1.0*m );
395 // SBT test - case a
396 //testVolume = new G4EllipticalTube( "test_eltube", 1.0*m, 1.0*m, 1.0*m );
397 break;
398
399 case EXTRU1:
400 testVolume = CreateExtrudedSolid1();
401 break;
402
403 case EXTRU2:
404 testVolume = CreateExtrudedSolid2();
405 break;
406
407 case EXTRU3:
408 testVolume = CreateExtrudedSolid3();
409 break;
410
411 case EXTRU4:
412 testVolume = CreateExtrudedSolid4();
413 break;
414
415 case HYPE:
416 testVolume = new G4Hype("test_hype", 0.2*m, 0.3*m, 0.7*rad, 0.7*rad, 0.5*m);
417 // SBT test - case c
418 testVolume = new G4Hype("test_hype", 0.5*m, 1.0*m, 2.0*rad, 2.0*rad, 1.0*m);
419 break;
420
421 case PCON: {
422 G4double z_values[2] = { -1.0*m, 1.0*m };
423 G4double rmin[2] = { 1.0*m, 1.2*m };
424 G4double rmax[2] = { 1.2*m, 1.4*m };
425 testVolume = new G4Polycone( "test_pcon",
426 startPhi, deltaPhi, 2, z_values, rmin, rmax );
427/*
428 // SBT test case d
429 G4double rv[17] = { 0.0*m, 0.2*m, 0.3*m, 0.32*m, 0.32*m, 0.4*m, 0.4*m, 0.5*m, 0.5*m, 0.8*m,
430 0.8*m, 0.9*m, 0.9*m, 0.8*m, 0.8*m, 0.3*m, 0.0*m };
431 G4double zv[17] = { -0.5*m, -0.5*m, -1.1*m, -1.1*m, -0.4*m, -0.4*m, -1.0*m, -1.0*m, -0.4*m,
432 -1.0*m, 0.0*m, 0.0*m, 0.2*m, 0.2*m, 1.0*m, 0.0*m, 1.0 };
433 testVolume = new G4Polycone ("test_pcon4", 0.0*deg, 90.0*deg, 17, rv, zv );
434
435 // SBT test case e
436 G4double rv[17] = { 0.0*m, 0.2*m, 0.3*m, 0.32*m, 0.32*m, 0.4*m, 0.4*m, 0.5*m, 0.5*m, 0.8*m,
437 0.8*m, 0.9*m, 0.9*m, 0.8*m, 0.8*m, 0.3*m, 0.0*m };
438 G4double zv[17] = { -0.5*m, -0.5*m, -1.1*m, -1.1*m, -0.4*m, -0.4*m, -1.0*m, -1.0*m, -0.4*m,
439 -1.0*m, 0.0*m, 0.0*m, 0.2*m, 0.2*m, 1.0*m, 0.0*m, 1.0*m };
440 testVolume = new G4Polycone ("test_pcon4", -1.0*deg, 2.0*deg, 17, rv, zv );
441
442 // SBT test case f
443 G4double rv[10] = { 0.6*m, 0.6*m, 1.0*m, 1.0*m, 1.1*m, 0.9*m, 0.0*m, 0.0*m, 0.4*m, 0.5*m };
444 G4double zv[10] = { -1.0*m, 0.0*m, 0.0*m, 0.8*m, 1.0*m, 1.0*m, 0.8*m, 0.0*m, 0.0*m, -1.0*m };
445 testVolume = new G4Polycone ("test_pcon4", 10.0*deg, 250.0*deg, 10, rv, zv );
446*/
447 }
448 break;
449
450 case PCON2: {
451 G4double z_values[5] = { -1.0*m, 0.0*m, 0.0*m, 0.8*m, 1.0*m };
452 G4double rmin[5] = { 0.5*m, 0.4*m, 0.0*m, 0.0*m, 0.9*m };
453 G4double rmax[5] = { 0.6*m, 0.6*m, 1.0*m, 1.0*m, 1.1*m };
454 testVolume = new G4Polycone( "test_pcon2",
455 startPhi, deltaPhi, 5, z_values, rmin, rmax );
456 }
457 break;
458
459 case PCON3: {
460 G4double z_values[8] = { -1.0*m, -0.5*m, -0.5*m, -1.0*m, -1.0*m, 0.7*m, 0.7*m, 1.0*m };
461 G4double rmin[8] = { 0.6*m, 0.6*m, 0.5*m, 0.5*m, 0.4*m, 0.4*m, 0.4*m, 0.0*m };
462 G4double rmax[8] = { 0.7*m, 0.7*m, 0.8*m, 0.9*m, 1.0*m, 1.0*m, 0.5*m, 0.5*m };
463 testVolume = new G4Polycone( "test_pcon3",
464 startPhi, deltaPhi, 8, z_values, rmin, rmax );
465 }
466 break;
467
468 case PCON4: {
469 G4double RMINVec[8];
470 RMINVec[0] = 30*cm;
471 RMINVec[1] = 30*cm;
472 RMINVec[2] = 0*cm;
473 RMINVec[3] = 0*cm;
474 RMINVec[4] = 0*cm;
475 RMINVec[5] = 0*cm;
476 RMINVec[6] = 40*cm;
477 RMINVec[7] = 40*cm;
478
479 G4double RMAXVec[8];
480 RMAXVec[0] = 70*cm;
481 RMAXVec[1] = 70*cm;
482 RMAXVec[2] = 70*cm;
483 RMAXVec[3] = 40*cm;
484 RMAXVec[4] = 40*cm;
485 RMAXVec[5] = 80*cm;
486 RMAXVec[6] = 80*cm;
487 RMAXVec[7] = 60*cm;
488
489 G4double Z_Values[8];
490 Z_Values[0] =-20*cm;
491 Z_Values[1] =-10*cm;
492 Z_Values[2] =-10*cm;
493 Z_Values[3] = 0*cm;
494 Z_Values[4] = 10*cm;
495 Z_Values[5] = 20*cm;
496 Z_Values[6] = 30*cm;
497 Z_Values[7] = 40*cm;
498
499 testVolume = new G4Polycone ("test_pcon4",
500 startPhi, deltaPhi, 8, Z_Values, RMINVec, RMAXVec );
501 }
502 break;
503
504 case PGON: {
505 G4double z_values[2] = { -1.0*m, 1.0*m };
506 G4double rmin[2] = { 0.8*m, 1.0*m };
507 G4double rmax[2] = { 1.0*m, 1.2*m };
508 testVolume = new G4Polyhedra( "test_pgon",
509 startPhi, deltaPhi, numSide, 2, z_values, rmin, rmax );
510/*
511 // SBT test case c
512 G4double rv[17] = { 0.0*m, 0.2*m, 0.3*m, 0.32*m, 0.32*m, 0.4*m, 0.4*m, 0.5*m, 0.5*m, 0.8*m,
513 0.8*m, 0.9*m, 0.9*m, 0.8*m, 0.8*m, 0.3*m, 0.0*m };
514 G4double zv[17] = { -0.5*m, -0.5*m, -1.1*m, -1.1*m, -0.4*m, -0.4*m, -1.0*m, -1.0*m, -0.4*m,
515 -1.0*m, 0.0*m, 0.0*m, 0.2*m, 0.2*m, 1.0*m, 0.0*m, 1.0*m };
516 testVolume = new G4Polyhedra ("test_pgon", 0.0*deg, 360.0*deg, 6, 17, rv, zv );
517
518 // SBT test case d
519 G4double rv[17] = { 0.0*m, 0.2*m, 0.3*m, 0.32*m, 0.32*m, 0.4*m, 0.4*m, 0.5*m, 0.5*m, 0.8*m,
520 0.8*m, 0.9*m, 0.9*m, 0.8*m, 0.8*m, 0.3*m, 0.0*m };
521 G4double zv[17] = { -0.5*m, -0.5*m, -1.1*m, -1.1*m, -0.4*m, -0.4*m, -1.0*m, -1.0*m, -0.4*m,
522 -1.0*m, 0.0*m, 0.0*m, 0.2*m, 0.2*m, 1.0*m, 0.0*m, 1.0*m };
523 testVolume = new G4Polyhedra ("test_pgon", 0.0*deg, 90.0*deg, 2, 17, rv, zv );
524
525 // SBT test case f
526 G4double zv[6] = { -0.6*m, 0.0*m, -1.0*m, 0.5*m, 0.5*m, 1.0*m };
527 G4double rmin[6] = { 0.5*m, 0.5*m, 0.4*m, 0.4*m, 0.8*m, 0.8*m};
528 G4double rmax[6] = { 0.6*m, 0.6*m, 1.0*m, 1.0*m, 1.0*m, 1.1*m };
529 testVolume = new G4Polyhedra ("test_pgon", 0.0*deg, 270.0*deg, 6, 6, zv, rmin, rmax );
530*/
531 }
532 break;
533
534 case PGON2: {
535 G4double z_values[5] = { -1.0*m, 0.0*m, 0.0*m, 0.8*m, 1.0*m };
536 G4double rmin[5] = { 0.5*m, 0.4*m, 0.0*m, 0.0*m, 0.9*m };
537 G4double rmax[5] = { 0.6*m, 0.6*m, 1.0*m, 1.0*m, 1.1*m };
538 testVolume = new G4Polyhedra( "test_pgon2",
539 startPhi, deltaPhi, numSide, 5, z_values, rmin, rmax );
540 }
541 break;
542
543 case PGON3: {
544 G4double z_values[6] = { -0.6*m, 0.0*m,-1.0*m, 0.5*m, 0.5*m, 1.0*m };
545 G4double rmin[6] = { 0.5*m, 0.5*m, 0.4*m, 0.4*m, 0.8*m, 0.8*m };
546 G4double rmax[6] = { 0.6*m, 0.6*m, 1.0*m, 1.0*m, 1.0*m, 1.1*m };
547 testVolume = new G4Polyhedra( "test_pgon3",
548 startPhi, deltaPhi, numSide, 6, z_values, rmin, rmax );
549 }
550 break;
551
552 case TESSEL1: {
553 // Extruded solid with triangular polygon
554 // (the same as test_xtru1, but redefined via tessels
555
556 G4TessellatedSolid* tessel = new G4TessellatedSolid("test_tessel1");
557
558 tessel->AddFacet(
559 new G4TriangularFacet(G4ThreeVector(-0.3*m,-0.3*m,-0.3*m),
560 G4ThreeVector( 0.0*m, 0.3*m,-0.3*m),
561 G4ThreeVector( 0.3*m,-0.3*m,-0.3*m),
562 ABSOLUTE));
563 tessel->AddFacet(
564 new G4TriangularFacet(G4ThreeVector( 0.3*m,-0.3*m, 0.3*m),
565 G4ThreeVector( 0.0*m, 0.3*m, 0.3*m),
566 G4ThreeVector(-0.3*m,-0.3*m, 0.3*m),
567 ABSOLUTE));
568 tessel->AddFacet(
569 new G4QuadrangularFacet(G4ThreeVector( 0.0*m, 0.3*m,-0.3*m),
570 G4ThreeVector(-0.3*m,-0.3*m,-0.3*m),
571 G4ThreeVector(-0.3*m,-0.3*m, 0.3*m),
572 G4ThreeVector( 0.0*m, 0.3*m, 0.3*m),
573 ABSOLUTE));
574 tessel->AddFacet(
575 new G4QuadrangularFacet(G4ThreeVector( 0.3*m,-0.3*m,-0.3*m),
576 G4ThreeVector( 0.0*m, 0.3*m,-0.3*m),
577 G4ThreeVector( 0.0*m, 0.3*m, 0.3*m),
578 G4ThreeVector( 0.3*m,-0.3*m, 0.3*m),
579 ABSOLUTE));
580 tessel->AddFacet(
581 new G4QuadrangularFacet(G4ThreeVector(-0.3*m,-0.3*m,-0.3*m),
582 G4ThreeVector( 0.3*m,-0.3*m,-0.3*m),
583 G4ThreeVector( 0.3*m,-0.3*m, 0.3*m),
584 G4ThreeVector(-0.3*m,-0.3*m, 0.3*m),
585 ABSOLUTE));
586 tessel->SetSolidClosed(true);
587 testVolume = tessel;
588 G4cout << *tessel << G4endl;
589/*
590 G4ExtrudedSolid* xtru1 = CreateExtrudedSolid1();
591 testVolume = new G4TessellatedSolid(*xtru1);
592 testVolume->SetName("test_tessel1");
593 G4cout << *((G4TessellatedSolid*)testVolume) << G4endl;
594*/
595 }
596 break;
597
598 case TESSEL2: {
599 G4ExtrudedSolid* xtru2 = CreateExtrudedSolid2();
600 testVolume = new G4TessellatedSolid(*xtru2);
601 testVolume->SetName("test_tessel2");
602 delete xtru2;
603 }
604 break;
605
606 case TESSEL3: {
607 G4ExtrudedSolid* xtru3 = CreateExtrudedSolid3();
608 testVolume = new G4TessellatedSolid(*xtru3);
609 testVolume->SetName("test_tessel3");
610 delete xtru3;
611 }
612 break;
613
614 case TESSEL4: {
615 G4ExtrudedSolid* xtru4 = CreateExtrudedSolid4();
616 testVolume = new G4TessellatedSolid(*xtru4);
617 testVolume->SetName("test_tessel4");
618 delete xtru4;
619 }
620 break;
621
622 case TET:
623 testVolume = new G4Tet( "test_tet",
624 G4ThreeVector( 0.0*m, 0.0*m, 1.0*m),
625 G4ThreeVector(-1.0*m, -1.0*m, -1.0*m),
626 G4ThreeVector(+1.0*m, -1.0*m, -1.0*m),
627 G4ThreeVector( 0.0*m, 1.0*m, -1.0*m));
628/*
629 // SBT test case d
630 testVolume = new G4Tet( "test_tet",
631 G4ThreeVector( 0.0*m, 0.0*m, 1.73205080756887719*m),
632 G4ThreeVector( 0.0*m, 1.63299316185545207*m, -0.577350269189625842*m),
633 G4ThreeVector(-1.41421356237309515*m, -0.816496580927726034*m, -0.577350269189625842*m),
634 G4ThreeVector( 1.41421356237309515*m, -0.816496580927726034*m, -0.577350269189625842*m));
635*/
636 break;
637
638 case TWBOX:
639 // SBT test case a
640 testVolume = new G4TwistedBox( "test_twbox", 30.0*deg, 1.0*m, 1.0*m, 1.0*m);
641 break;
642
643 case TWTRAP1:
644 testVolume = new G4TwistedTrap( "test_twtrap1",
645 30.0*deg, 0.8*m, 1.0*m, 1.0*m, 1.0*m );
646 break;
647
648 case TWTRAP2:
649 // SBT test case a
650 testVolume = new G4TwistedTrap( "test_twtrap2",
651 30.0*deg, 1268.0*mm, 0.0*deg, 0.0*deg,
652 295.0*mm, 1712.2*mm, 1870.29*mm,
653 295.0*mm, 1712.2*mm, 1870.29*mm, 0.0*deg );
654 break;
655
656 case TWTRD:
657 // SBT test case c
658 testVolume = new G4TwistedTrd( "test_twtrd",
659 0.5*m, 1.5*m, 0.25*m, 1.0*m, 1.0*m, 30.0*deg );
660 break;
661
662 case TWTUBS:
663 // SBT test case a
664 testVolume = new G4TwistedTubs( "test_twtubs",
665 30.0*deg, 0.8*m, 1.0*m, -1.0*m, 1.0*m, 1, 90.0*deg );
666 break;
667
668
669 //
670 // Boolean solids
671 //
672
673 case BOOL1:
674 G4Box *outside = new G4Box( "testboolout", 1*m, 1*m, 1*m );
675 G4Tubs *inside = new G4Tubs( "testboolin", 0.0, 0.4*m, 1*m, 0, 360*deg );
676 G4Transform3D tran = G4Translate3D( 0.4*m, 0.0, 0.0 );
677
678 testVolume = new G4SubtractionSolid( "testbool", (G4VSolid *)outside, (G4VSolid *)inside, tran );
679 break;
680
681 }
682
683 G4LogicalVolume *testLog = new G4LogicalVolume( testVolume, Vaccuum, "test_log", 0, 0, 0 );
684 new G4PVPlacement( rot, G4ThreeVector(), testLog,
685 "test", hallLog, false, 0 );
686
687 //
688 // Put some stuff in it, if we want
689 //
690 if (messenger->SelectedVolume() == VOXEL) {
691 G4RotationMatrix *noRot = new G4RotationMatrix();
692
693 G4Box *vxBox = new G4Box( "voxel_x", 0.3*mm, 0.6*m, 0.6*m );
694 G4LogicalVolume *vxLog1 = new G4LogicalVolume( vxBox, Vaccuum, "x1", 0, 0, 0 );
695 new G4PVPlacement( noRot, G4ThreeVector( -0.6*m, 0.0*m, 0.0*m ),
696 vxLog1, "testx1", testLog, false, 0 );
697 G4LogicalVolume *vxLog2 = new G4LogicalVolume( vxBox, Vaccuum, "x2", 0, 0, 0 );
698 new G4PVPlacement( noRot, G4ThreeVector( -0.2*m, 0.0*m, 0.0*m ),
699 vxLog2, "testx2", testLog, false, 0 );
700 G4LogicalVolume *vxLog3 = new G4LogicalVolume( vxBox, Vaccuum, "x3", 0, 0, 0 );
701 new G4PVPlacement( noRot, G4ThreeVector( +0.2*m, 0.0*m, 0.0*m ),
702 vxLog3, "testx3", testLog, false, 0 );
703 G4LogicalVolume *vxLog4 = new G4LogicalVolume( vxBox, Vaccuum, "x4", 0, 0, 0 );
704 new G4PVPlacement( noRot, G4ThreeVector( +0.6*m, 0.0*m, 0.0*m ),
705 vxLog4, "testx4", testLog, false, 0 );
706
707 G4Box *vyBox = new G4Box( "voxel_y", 0.8*m, 0.3*mm, 0.6*m );
708 G4LogicalVolume *vyLog1 = new G4LogicalVolume( vyBox, Vaccuum, "y1", 0, 0, 0 );
709 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, -0.8*m, 0.0*m ),
710 vyLog1, "testy1", testLog, false, 0 );
711 G4LogicalVolume *vyLog2 = new G4LogicalVolume( vyBox, Vaccuum, "y2", 0, 0, 0 );
712 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, -0.7*m, 0.0*m ),
713 vyLog2, "testy2", testLog, false, 0 );
714 G4LogicalVolume *vyLog3 = new G4LogicalVolume( vyBox, Vaccuum, "y3", 0, 0, 0 );
715 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, +0.7*m, 0.0*m ),
716 vyLog3, "testy3", testLog, false, 0 );
717 G4LogicalVolume *vyLog4 = new G4LogicalVolume( vyBox, Vaccuum, "y4", 0, 0, 0 );
718 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, +0.8*m, 0.0*m ),
719 vyLog4, "testy4", testLog, false, 0 );
720
721 G4Box *vzBox = new G4Box( "voxel_z", 0.8*m, 0.8*m, 0.3*mm );
722 G4LogicalVolume *vzLog1 = new G4LogicalVolume( vzBox, Vaccuum, "z1", 0, 0, 0 );
723 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, 0.0*m, -0.8*m ),
724 vzLog1, "testz1", testLog, false, 0 );
725 G4LogicalVolume *vzLog2 = new G4LogicalVolume( vzBox, Vaccuum, "z2", 0, 0, 0 );
726 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, 0.0*m, -0.7*m ),
727 vzLog2, "testz2", testLog, false, 0 );
728 G4LogicalVolume *vzLog3 = new G4LogicalVolume( vzBox, Vaccuum, "z3", 0, 0, 0 );
729 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, 0.0*m, +0.7*m ),
730 vzLog3, "testz3", testLog, false, 0 );
731 G4LogicalVolume *vzLog4 = new G4LogicalVolume( vzBox, Vaccuum, "z4", 0, 0, 0 );
732 new G4PVPlacement( noRot, G4ThreeVector( 0.0*m, 0.0*m, +0.8*m ),
733 vzLog4, "testz4", testLog, false, 0 );
734 }
735
736 //
737 // Red seems an appropriate color
738 //
739 testLog->SetVisAttributes( redStuff );
740
741 //
742 // Too simple?? Yeah. Let's make our test volume sensitive.
743
744 G4SDManager *sensitiveMan = G4SDManager::GetSDMpointer();
745
746 FredSensitive *sensitive = new FredSensitive( "/fred/test" );
747 sensitiveMan->AddNewDetector( sensitive );
748 testLog->SetSensitiveDetector( sensitive );
749
750 //
751 // And while we're at it, do the same to mother volume
752
753 FredSensMother *sensMother = new FredSensMother( "/fred/mother" );
754 sensitiveMan->AddNewDetector( sensMother );
755 hallLog->SetSensitiveDetector( sensMother );
756
757 //
758 // Tell our "messenger" about this test volume
759 //
760 messenger->SetTestVolume( testVolume );
761
762 return hall;
763 }
Note: See TracBrowser for help on using the repository browser.