File indexing completed on 2026-09-16 08:30:50
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include "DetectorConstruction.hh"
0030
0031 #include "G4Box.hh"
0032 #include "G4LogicalVolume.hh"
0033 #include "G4NistManager.hh"
0034 #include "G4PVPlacement.hh"
0035 #include "G4RunManager.hh"
0036 #include "G4SubtractionSolid.hh"
0037 #include "G4SystemOfUnits.hh"
0038 #include "G4Tubs.hh"
0039
0040 #include <cmath>
0041
0042 namespace VtkVis
0043 {
0044
0045
0046
0047 G4VPhysicalVolume* DetectorConstruction::Construct()
0048 {
0049
0050 G4NistManager* nist = G4NistManager::Instance();
0051
0052
0053
0054 G4double env_sizeXY = 10 * m, env_sizeZ = 10 * m;
0055 G4Material* env_mat = nist->FindOrBuildMaterial("G4_Galactic");
0056
0057
0058
0059 G4bool checkOverlaps = true;
0060
0061
0062
0063
0064 G4double world_sizeXY = 1.2 * env_sizeXY;
0065 G4double world_sizeZ = 1.2 * env_sizeZ;
0066 G4Material* world_mat = nist->FindOrBuildMaterial("G4_AIR");
0067
0068 auto solidWorld =
0069 new G4Box("World",
0070 0.5 * world_sizeXY, 0.5 * world_sizeXY, 0.5 * world_sizeZ);
0071
0072 auto logicWorld = new G4LogicalVolume(solidWorld,
0073 world_mat,
0074 "World");
0075
0076 auto physWorld = new G4PVPlacement(nullptr,
0077 G4ThreeVector(),
0078 logicWorld,
0079 "World",
0080 nullptr,
0081 false,
0082 0,
0083 checkOverlaps);
0084
0085
0086
0087
0088 auto solidEnv = new G4Box("Envelope",
0089 0.5 * env_sizeXY, 0.5 * env_sizeXY, 0.5 * env_sizeZ);
0090
0091 auto logicEnv = new G4LogicalVolume(solidEnv,
0092 env_mat,
0093 "Envelope");
0094
0095 new G4PVPlacement(nullptr,
0096 G4ThreeVector(),
0097 logicEnv,
0098 "Envelope",
0099 logicWorld,
0100 false,
0101 0,
0102 checkOverlaps);
0103
0104 auto dumpPos = G4ThreeVector(0, 0, 0);
0105 auto dumpMat = nist->FindOrBuildMaterial("G4_CONCRETE");
0106 auto dumpShape1 = new G4Box("dumpShape1", 1 * m, 1 * m, 0.5 * m);
0107
0108 auto dumpCutoutPos = G4ThreeVector(0, 0, -5.1 * cm);
0109 auto dumpCutoutShape = new G4Tubs("DumpCutoutShape", 0 * cm, 10 * cm, 90 / 2 * cm, 0, 2 * M_PI);
0110
0111 auto dumpShape2 =
0112 new G4SubtractionSolid("dumpShape2", dumpShape1, dumpCutoutShape, 0, dumpCutoutPos);
0113
0114 auto dumpLogical = new G4LogicalVolume(dumpShape2,
0115 dumpMat,
0116 "dump");
0117
0118 new G4PVPlacement(nullptr,
0119 dumpPos,
0120 dumpLogical,
0121 "dump",
0122 logicEnv,
0123 false,
0124 0,
0125 checkOverlaps);
0126
0127 fScoringVolume = dumpLogical;
0128
0129
0130
0131
0132 return physWorld;
0133 }
0134
0135
0136
0137 }