G4-ExampleB1/src/DetectorConstruction.cc

136 lines
5.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "DetectorConstruction.hh"
#include "G4Box.hh"
#include "G4Cons.hh"
#include "G4LogicalVolume.hh"
#include "G4NistManager.hh"
#include "G4Orb.hh"
#include "G4PVPlacement.hh"
#include "G4RunManager.hh"
#include "G4Sphere.hh"
#include "G4SystemOfUnits.hh"
#include "G4Trd.hh"
namespace B1 {
// 构造函数
DetectorConstruction::DetectorConstruction() {}
// 构析函数
DetectorConstruction::~DetectorConstruction() {}
// 描述函数
G4VPhysicalVolume* DetectorConstruction::Construct() {
// NIST 材料查找表
G4NistManager* nist = G4NistManager::Instance();
// Envelope 的参数
// 外层的水箱
G4double env_sizeXY = 20 * cm, env_sizeZ = 30 * cm;
G4Material* env_mat = nist->FindOrBuildMaterial("G4_WATER");
// 检查几何体之间是否重叠
G4bool checkOverlaps = true;
// World
// 整个大环境,超出环境则认为逃逸
G4double world_sizeXY = 1.2 * env_sizeXY;
G4double world_sizeZ = 1.2 * env_sizeZ;
G4Material* world_mat = nist->FindOrBuildMaterial("G4_AIR");
// 描述几何体
// solid 几何框架 -> logic 材料 -> physical 放置等操作
// 定义 World 的框架大小,注意尺寸是半尺寸
G4Box* solidWorld = new G4Box("World", // 名称
0.5 * world_sizeXY, 0.5 * world_sizeXY, 0.5 * world_sizeZ); // 尺寸
G4LogicalVolume* logicWorld = new G4LogicalVolume(solidWorld, // 几何框架
world_mat, // 材料
"World"); // 名称
G4VPhysicalVolume* physWorld = new G4PVPlacement(0, // 旋转
G4ThreeVector(), // 中心位置,必须在 (0,0,0)
logicWorld, // 材料
"World", // 名称
0, // 母体环境Mother Volume
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
// Envelope
// World 中的小环境
G4Box* solidEnv = new G4Box("Envelope", // 名称
0.5 * env_sizeXY, 0.5 * env_sizeXY, 0.5 * env_sizeZ); // 尺寸
G4LogicalVolume* logicEnv = new G4LogicalVolume(solidEnv, // 几何框架
env_mat, // 材料
"Envelope"); // 名称
new G4PVPlacement(0, // no rotation
G4ThreeVector(), // at (0,0,0)
logicEnv, // logical volume
"Envelope", // name
logicWorld, // Mother Logical Volumes即 World
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
// Shape 1
G4Material* shape1_mat = nist->FindOrBuildMaterial("G4_A-150_TISSUE");
G4ThreeVector pos1 = G4ThreeVector(0, 2 * cm, -7 * cm);
// 圆锥状 Conical section
G4double shape1_rmina = 0. * cm, shape1_rmaxa = 2. * cm;
G4double shape1_rminb = 0. * cm, shape1_rmaxb = 4. * cm;
G4double shape1_hz = 3. * cm;
G4double shape1_phimin = 0. * deg, shape1_phimax = 360. * deg;
G4Cons* solidShape1 = new G4Cons("Shape1", shape1_rmina, shape1_rmaxa, shape1_rminb, shape1_rmaxb, shape1_hz,
shape1_phimin, shape1_phimax);
G4LogicalVolume* logicShape1 = new G4LogicalVolume(solidShape1, // solid
shape1_mat, // material
"Shape1"); // name
new G4PVPlacement(0, // no rotation
pos1, // at position
logicShape1, // logical volume
"Shape1", // name
logicEnv, // mother volume
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
// Shape 2
G4Material* shape2_mat = nist->FindOrBuildMaterial("G4_BONE_COMPACT_ICRU");
G4ThreeVector pos2 = G4ThreeVector(0, -1 * cm, 7 * cm);
// 梯形 Trapezoid
G4double shape2_dxa = 12 * cm, shape2_dxb = 12 * cm;
G4double shape2_dya = 10 * cm, shape2_dyb = 16 * cm;
G4double shape2_dz = 6 * cm;
G4Trd* solidShape2 = new G4Trd("Shape2", // name
0.5 * shape2_dxa, 0.5 * shape2_dxb, 0.5 * shape2_dya, 0.5 * shape2_dyb,
0.5 * shape2_dz); // size
G4LogicalVolume* logicShape2 = new G4LogicalVolume(solidShape2, // solid
shape2_mat, // material
"Shape2"); // name
new G4PVPlacement(0, // no rotation
pos2, // at position
logicShape2, // logical volume
"Shape2", // name
logicEnv, // mother volume
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
// 设置 Shape2 用于计算剂量
fScoringVolume = logicShape2;
// 总是返回大环境的物理体
return physWorld;
}
} // namespace B1