| 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 | //
|
|---|
| 81 | FredDetectorConstruction::FredDetectorConstruction( FredMessenger *ourMessenger )
|
|---|
| 82 | {
|
|---|
| 83 | messenger = ourMessenger;
|
|---|
| 84 | }
|
|---|
| 85 |
|
|---|
| 86 | FredDetectorConstruction::~FredDetectorConstruction()
|
|---|
| 87 | {;}
|
|---|
| 88 |
|
|---|
| 89 |
|
|---|
| 90 | //
|
|---|
| 91 | // Private methods
|
|---|
| 92 | //
|
|---|
| 93 | G4ExtrudedSolid* 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 |
|
|---|
| 106 | G4ExtrudedSolid* 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 |
|
|---|
| 119 | G4ExtrudedSolid* 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 |
|
|---|
| 141 | G4ExtrudedSolid* 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 | //
|
|---|
| 162 | G4VPhysicalVolume* 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 | }
|
|---|