2022-05-09 00:31:02 +08:00
|
|
|
|
#include "DetectorConstruction.h"
|
|
|
|
|
#include "Material.h"
|
|
|
|
|
|
|
|
|
|
#include "G4Box.hh"
|
2022-05-09 17:26:35 +08:00
|
|
|
|
#include "G4IntersectionSolid.hh"
|
2022-05-09 00:31:02 +08:00
|
|
|
|
#include "G4LogicalVolume.hh"
|
|
|
|
|
#include "G4PVPlacement.hh"
|
2022-05-09 17:26:35 +08:00
|
|
|
|
#include "G4SubtractionSolid.hh"
|
2022-05-09 00:31:02 +08:00
|
|
|
|
#include "G4SystemOfUnits.hh"
|
|
|
|
|
#include "G4Tubs.hh"
|
2022-05-09 17:26:35 +08:00
|
|
|
|
#include "G4UnionSolid.hh"
|
2022-05-09 00:31:02 +08:00
|
|
|
|
|
|
|
|
|
DetectorConstruction::DetectorConstruction() {}
|
|
|
|
|
|
|
|
|
|
DetectorConstruction::~DetectorConstruction() {}
|
|
|
|
|
|
2022-05-09 17:26:35 +08:00
|
|
|
|
static G4double ConstrustSectionBig(G4LogicalVolume* fMotherLogical, G4double zBias) {
|
|
|
|
|
G4double pRmaxBig = 4.2 / 2 * m;
|
|
|
|
|
G4double hzBig = 6.72 / 2 * m;
|
|
|
|
|
G4double hxBigBox = 2.4 / 2 * m;
|
|
|
|
|
G4double pRmaxBigMid = pRmaxBig - 10 * cm;
|
|
|
|
|
G4ThreeVector pos1 = G4ThreeVector(0, 0, -(zBias + hzBig));
|
|
|
|
|
G4double pos2 = -(zBias + hzBig * 2) + 9.8 * cm;
|
|
|
|
|
|
|
|
|
|
// 外壳
|
|
|
|
|
G4Tubs* solidShellAl1 = new G4Tubs("sectionBigShellAl1", pRmaxBig - 2, pRmaxBig, hzBig, 0, 360);
|
|
|
|
|
G4LogicalVolume* logicShellAl1 = new G4LogicalVolume(
|
|
|
|
|
solidShellAl1, G4Material::GetMaterial("AluminumAlloySeries5"), "sectionBigShellAl1");
|
|
|
|
|
new G4PVPlacement(0, pos1, logicShellAl1, "sectionBigShellAl1", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
G4Tubs* solidShellTap = new G4Tubs("sectionBigShellTap", pRmaxBig - 55, pRmaxBig - 45, hzBig, 0, 360);
|
|
|
|
|
G4LogicalVolume* logicShellTap = new G4LogicalVolume(
|
|
|
|
|
solidShellTap, G4Material::GetMaterial("Taparan"), "sectionBigShellTap");
|
|
|
|
|
new G4PVPlacement(0, pos1, logicShellTap, "sectionBigShellTap", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
G4Tubs* solidShellAl2 = new G4Tubs("sectionBigShellAl2", pRmaxBigMid, pRmaxBigMid + 5, hzBig, 0, 360);
|
|
|
|
|
G4LogicalVolume* logicShellAl2 = new G4LogicalVolume(
|
|
|
|
|
solidShellAl2, G4Material::GetMaterial("AluminumAlloySeries5"), "sectionBigShellAl2");
|
|
|
|
|
new G4PVPlacement(0, pos1, logicShellAl2, "sectionBigShellAl2", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
// 填充
|
|
|
|
|
G4Tubs* solidMidTubs = new G4Tubs("sectionBigMidTubs", 0, pRmaxBigMid, hzBig, 0, 360);
|
|
|
|
|
G4Box* solidMidBox = new G4Box("sectionBigMidBox", hxBigBox, hxBigBox, hzBig);
|
|
|
|
|
G4SubtractionSolid* solidMid =
|
|
|
|
|
new G4SubtractionSolid("sectionBigMid", solidMidTubs, solidMidBox);
|
|
|
|
|
G4LogicalVolume* logicMid =
|
|
|
|
|
new G4LogicalVolume(solidMid, G4Material::GetMaterial("G4_Al"), "sectionBigMid");
|
|
|
|
|
new G4PVPlacement(0, pos1, logicMid, "sectionBigMid", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
// 空气
|
|
|
|
|
G4Box* solidAir = new G4Box("sectionBigAirBox", hxBigBox, hxBigBox, hzBig);
|
|
|
|
|
G4LogicalVolume* logicAir =
|
|
|
|
|
new G4LogicalVolume(solidAir, G4Material::GetMaterial("G4_AIR"), "sectionBigAir");
|
|
|
|
|
new G4PVPlacement(0, pos1, logicAir, "sectionBigAir", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
// 尾部
|
|
|
|
|
G4Tubs* solidTailAl1 = new G4Tubs("sectionBigTailAl1", 0, pRmaxBigMid, 2.5, 0, 360);
|
|
|
|
|
G4LogicalVolume* logicTailAl1 = new G4LogicalVolume(
|
|
|
|
|
solidTailAl1, G4Material::GetMaterial("AluminumAlloySeries5"), "sectionBigTailAl1");
|
|
|
|
|
new G4PVPlacement(0, G4ThreeVector(0, 0, pos2 - 2.5), logicTailAl1, "sectionBigTailAl1", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
G4Tubs* solidTailTap = new G4Tubs("sectionBigTailTap", 0, pRmaxBigMid, 5, 0, 360);
|
|
|
|
|
G4LogicalVolume* logicTailTap = new G4LogicalVolume(
|
|
|
|
|
solidTailTap, G4Material::GetMaterial("Taparan"), "sectionBigTailTap");
|
|
|
|
|
new G4PVPlacement(0, G4ThreeVector(0, 0, pos2 - 50), logicTailTap, "sectionBigTailTap", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
G4Tubs* solidTailAl2 = new G4Tubs("sectionBigTailAl2", 0, pRmaxBig, 1, 0, 360);
|
|
|
|
|
G4LogicalVolume* logicTailAl2 = new G4LogicalVolume(
|
|
|
|
|
solidTailAl2, G4Material::GetMaterial("AluminumAlloySeries5"), "sectionBigTailAl2");
|
|
|
|
|
new G4PVPlacement(0, G4ThreeVector(0, 0, pos2 - 99), logicTailAl2, "sectionBigTailAl2", fMotherLogical, false, 0, true);
|
|
|
|
|
|
|
|
|
|
return zBias + hzBig;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-09 00:31:02 +08:00
|
|
|
|
G4VPhysicalVolume* DetectorConstruction::Construct() {
|
2022-05-09 17:26:35 +08:00
|
|
|
|
G4double zBias = 0.815 * m;
|
|
|
|
|
|
2022-05-09 00:31:02 +08:00
|
|
|
|
// Define materials
|
|
|
|
|
DefineMaterials();
|
|
|
|
|
|
|
|
|
|
// World
|
2022-05-09 17:26:35 +08:00
|
|
|
|
G4Box* solidWorld = new G4Box("World", 3. * m, 3. * m, 10. * m);
|
|
|
|
|
G4LogicalVolume* logicWorld = new G4LogicalVolume(solidWorld, G4Material::GetMaterial("Vacuum"), "World");
|
|
|
|
|
G4VPhysicalVolume* physicsWorld = new G4PVPlacement(0, G4ThreeVector(), logicWorld, "World", 0, false, 0, true);
|
2022-05-09 00:31:02 +08:00
|
|
|
|
|
|
|
|
|
// 大柱段
|
2022-05-09 17:26:35 +08:00
|
|
|
|
zBias = ConstrustSectionBig(logicWorld, zBias);
|
|
|
|
|
|
|
|
|
|
return physicsWorld;
|
2022-05-09 00:31:02 +08:00
|
|
|
|
}
|