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