File indexing completed on 2026-05-04 08:07:42
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 "G4Cons.hh"
0033 #include "G4LogicalVolume.hh"
0034 #include "G4NistManager.hh"
0035 #include "G4Orb.hh"
0036 #include "G4PVPlacement.hh"
0037 #include "G4RunManager.hh"
0038 #include "G4Sphere.hh"
0039 #include "G4SystemOfUnits.hh"
0040 #include "G4Trd.hh"
0041
0042 namespace B1
0043 {
0044
0045
0046
0047 G4VPhysicalVolume* DetectorConstruction::Construct()
0048 {
0049
0050 G4NistManager* nist = G4NistManager::Instance();
0051
0052
0053
0054 G4double env_sizeXY = 20 * cm, env_sizeZ = 30 * cm;
0055 G4Material* env_mat = nist->FindOrBuildMaterial("G4_WATER");
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
0105
0106
0107 G4Material* shape1_mat = nist->FindOrBuildMaterial("G4_A-150_TISSUE");
0108 G4ThreeVector pos1 = G4ThreeVector(0, 2 * cm, -7 * cm);
0109
0110
0111 G4double shape1_rmina = 0. * cm, shape1_rmaxa = 2. * cm;
0112 G4double shape1_rminb = 0. * cm, shape1_rmaxb = 4. * cm;
0113 G4double shape1_hz = 3. * cm;
0114 G4double shape1_phimin = 0. * deg, shape1_phimax = 360. * deg;
0115 auto solidShape1 = new G4Cons("Shape1", shape1_rmina, shape1_rmaxa, shape1_rminb, shape1_rmaxb,
0116 shape1_hz, shape1_phimin, shape1_phimax);
0117
0118 auto logicShape1 = new G4LogicalVolume(solidShape1,
0119 shape1_mat,
0120 "Shape1");
0121
0122 new G4PVPlacement(nullptr,
0123 pos1,
0124 logicShape1,
0125 "Shape1",
0126 logicEnv,
0127 false,
0128 0,
0129 checkOverlaps);
0130
0131
0132
0133
0134 G4Material* shape2_mat = nist->FindOrBuildMaterial("G4_BONE_COMPACT_ICRU");
0135 G4ThreeVector pos2 = G4ThreeVector(0, -1 * cm, 7 * cm);
0136
0137
0138 G4double shape2_dxa = 12 * cm, shape2_dxb = 12 * cm;
0139 G4double shape2_dya = 10 * cm, shape2_dyb = 16 * cm;
0140 G4double shape2_dz = 6 * cm;
0141 auto solidShape2 =
0142 new G4Trd("Shape2",
0143 0.5 * shape2_dxa, 0.5 * shape2_dxb, 0.5 * shape2_dya, 0.5 * shape2_dyb,
0144 0.5 * shape2_dz);
0145
0146 auto logicShape2 = new G4LogicalVolume(solidShape2,
0147 shape2_mat,
0148 "Shape2");
0149
0150 new G4PVPlacement(nullptr,
0151 pos2,
0152 logicShape2,
0153 "Shape2",
0154 logicEnv,
0155 false,
0156 0,
0157 checkOverlaps);
0158
0159
0160
0161 fScoringVolume = logicShape2;
0162
0163
0164
0165
0166 return physWorld;
0167 }
0168
0169
0170
0171 }