Files
geant4/examples/advanced/brachytherapy/src/BrachyDetectorConstructionFlexi.cc
T
2022-07-01 10:44:02 +02:00

242 lines
9.9 KiB
C++

//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
// --------------------------------------------------------------
// GEANT 4 - Brachytherapy example
// --------------------------------------------------------------
//
// Code developed by:
// S. Guatelli, D. Cutajar, J. Poder
// Centre For Medical Radiation Physics, University of Wollongong
//
// ****************************************
// * *
// * BrachyDetectorConstructionFlexi.cc*
// * *
// ****************************************
//
//
#include "globals.hh"
#include "G4SystemOfUnits.hh"
#include "BrachyDetectorConstructionFlexi.hh"
#include "G4RunManager.hh"
#include "G4Tubs.hh"
#include "G4Cons.hh"
#include "G4LogicalVolume.hh"
#include "G4ThreeVector.hh"
#include "G4PVPlacement.hh"
#include "G4Transform3D.hh"
#include "G4RotationMatrix.hh"
#include "G4TransportationManager.hh"
#include "G4VisAttributes.hh"
#include "G4Colour.hh"
#include "G4NistManager.hh"
BrachyDetectorConstructionFlexi::BrachyDetectorConstructionFlexi()
: fSteelShell(nullptr), fLogicalSteelShell(nullptr), fAirGap(nullptr), fLogicalAirGap(nullptr), fPhysicalAirGap(nullptr),
fEnd1SteelShell(nullptr), fLogicalEnd1SteelShell(nullptr), fPhysicalEnd1SteelShell(nullptr),
fEnd2SteelShell(nullptr), fLogicalEnd2SteelShell(nullptr), fPhysicalEnd2SteelShell(nullptr),
fCable(nullptr), fLogicalCable(nullptr), fPhysicalCable(nullptr),
fIridiumCore(nullptr), fLogicalIridiumCore(nullptr), fPhysicalIridiumCore(nullptr),
fSteelAttributes(nullptr), fEndAttributes(nullptr), fSimpleIridiumVisAtt(nullptr)
{}
void BrachyDetectorConstructionFlexi::ConstructFlexi(G4VPhysicalVolume* mother)
{
G4NistManager* nist = G4NistManager::Instance();
G4Material* iridiumMat = nist -> FindOrBuildMaterial("G4_Ir");
G4Material* airMat = nist -> FindOrBuildMaterial("G4_AIR");
//Define Stainless-steel-304 - Flexi source
G4int Z; //atomic number of the element
G4Element* elC = nist -> FindOrBuildElement(Z=6);
G4Element* elMn = nist -> FindOrBuildElement(Z=12);
G4Element* elSi = nist -> FindOrBuildElement(Z=14);
G4Element* elCr = nist -> FindOrBuildElement(Z=24);
G4Element* elFe = nist -> FindOrBuildElement(Z=26);
G4Element* elNi = nist -> FindOrBuildElement(Z=28);
constexpr G4double d = 7.999*g/cm3;
auto steelMat = new G4Material("Stainless steel 304",d,6);
steelMat -> AddElement(elMn, 0.02);
steelMat -> AddElement(elSi, 0.01);
steelMat -> AddElement(elCr, 0.19);
steelMat -> AddElement(elNi, 0.10);
steelMat -> AddElement(elFe, 0.6792);
steelMat -> AddElement(elC, 0.0008);
//Define dimensions of the outer Steel shell around the solid source - not including the ends
G4double shellr_min = 0.00 * mm;
G4double shellr_max = 0.85 * mm;
G4double shell_length = 3.6 * mm;
fSteelShell = new G4Tubs("steel_shell",shellr_min, shellr_max/2, shell_length/2.,0.*deg,360.*deg);
fLogicalSteelShell = new G4LogicalVolume(fSteelShell, steelMat, "steel_shell_log", nullptr, nullptr, nullptr);
fPhysicalSteelShell = new G4PVPlacement(nullptr,G4ThreeVector(0,0,0),"phys_steel_shell", fLogicalSteelShell, mother, false, 0, true);
//Define dimensions of the air gap between Steel shell and Iridium core
G4double airr_min = 0.00 * mm;
G4double airr_max = 0.67 * mm;
G4double air_length = 3.6 * mm;
fAirGap = new G4Tubs("air_gap", airr_min, airr_max/2, air_length/2, 0.*deg, 360.*deg);
fLogicalAirGap = new G4LogicalVolume(fAirGap, airMat, "air_gap_log", nullptr, nullptr, nullptr);
fPhysicalAirGap = new G4PVPlacement(nullptr, G4ThreeVector(0,0,0), "phys_air_gap", fLogicalAirGap, fPhysicalSteelShell, false, 0, true);
//Define the non-cable weld end of the Steel shell
G4double end1r_min = 0.0 * mm;
G4double end1r_max = 0.85 * mm;
G4double end1length = 0.65 * mm;
fEnd1SteelShell = new G4Tubs("End_1_steel_shell", end1r_min, end1r_max/2, end1length/2.,0.*deg,360.*deg);
fLogicalEnd1SteelShell = new G4LogicalVolume(fEnd1SteelShell, steelMat, "End1_steel_shell_log", nullptr, nullptr, nullptr);
G4double end1offset_x = 0.0 * mm;
G4double end1offset_y = 0.0 * mm;
G4double end1offset_z = 2.125 * mm;
fPhysicalEnd1SteelShell = new G4PVPlacement(nullptr,G4ThreeVector(end1offset_x,end1offset_y,end1offset_z),"phys_End1_steel_shell", fLogicalEnd1SteelShell,mother, false, 0, true);
//Define the cable weld end of the Steel shell
G4double end2r_min1 = 0.0 * mm;
G4double end2r_max1 = 0.85 * mm;
G4double end2r_min2 = 0.0 * mm;
G4double end2r_max2 = 0.5 * mm;
G4double end2length = 0.4 * mm;
fEnd2SteelShell = new G4Cons("End_2_steel_shell", end2r_min2, end2r_max2/2, end2r_min1, end2r_max1/2, end2length/2.0, 0.0, 360.0*deg);
fLogicalEnd2SteelShell = new G4LogicalVolume(fEnd2SteelShell, steelMat, "End2_steel_shell_log", nullptr, nullptr, nullptr);
G4double end2offset_x = 0.0 * mm;
G4double end2offset_y = 0.0 * mm;
G4double end2offset_z = -2.0 * mm;
fPhysicalEnd2SteelShell = new G4PVPlacement(nullptr,G4ThreeVector(end2offset_x,end2offset_y,end2offset_z), "phys_End2_steel_shell", fLogicalEnd2SteelShell, mother, false, 0, true);
//Define the cable
G4double cable_min = 0.0 * mm;
G4double cable_max = 0.5 * mm;
G4double cablelength = 5.0 * mm;
fCable = new G4Tubs("cable",cable_min, cable_max/2, cablelength/2.,0.*deg,360.*deg);
fLogicalCable = new G4LogicalVolume(fCable, steelMat, "cable_log", nullptr, nullptr, nullptr);
G4double cableoffset_x = 0.0 * mm;
G4double cableoffset_y = 0.0 * mm;
G4double cableoffset_z = -4.7 * mm;
fPhysicalCable = new G4PVPlacement(nullptr,G4ThreeVector(cableoffset_x,cableoffset_y,cableoffset_z),"phys_cable", fLogicalCable, mother, false, 0, true);
// Define the Iridium core
G4double corer_min = 0.0 * mm;
G4double corer_max = 0.6 * mm;
G4double core_length = 3.5 * mm;
fIridiumCore = new G4Tubs("iridium_core",corer_min, corer_max/2,core_length/2.,0.*deg,360.*deg);
fLogicalIridiumCore = new G4LogicalVolume(fIridiumCore, iridiumMat, "iridium_core_log", nullptr, nullptr, nullptr);
fPhysicalIridiumCore = new G4PVPlacement(nullptr,G4ThreeVector(0,0,0), "phys_iridium_core", fLogicalIridiumCore, fPhysicalAirGap, false, 0, true);
// Visualisations
//Shell/cable attributes
fSteelAttributes = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); // red
fSteelAttributes -> SetVisibility(true);
fSteelAttributes -> SetForceAuxEdgeVisible(true);
fEndAttributes = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); // red
fEndAttributes -> SetVisibility(true);
fEndAttributes -> SetForceAuxEdgeVisible(true);
fLogicalSteelShell -> SetVisAttributes(fSteelAttributes);
fLogicalEnd1SteelShell -> SetVisAttributes(fEndAttributes);
fLogicalEnd2SteelShell -> SetVisAttributes(fEndAttributes);
fLogicalCable -> SetVisAttributes(fSteelAttributes);
G4Colour magenta (1.0, 0.0, 1.0) ;
fSimpleIridiumVisAtt = new G4VisAttributes(magenta);
fSimpleIridiumVisAtt -> SetVisibility(true);
fSimpleIridiumVisAtt -> SetForceWireframe(true);
fLogicalIridiumCore -> SetVisAttributes(fSimpleIridiumVisAtt);
}
void BrachyDetectorConstructionFlexi::CleanFlexi()
{
delete fSimpleIridiumVisAtt;
fSimpleIridiumVisAtt = nullptr;
delete fEndAttributes;
fEndAttributes = nullptr;
delete fSteelAttributes;
fSteelAttributes = nullptr;
delete fPhysicalIridiumCore;
fPhysicalIridiumCore = nullptr ;
delete fLogicalIridiumCore;
fLogicalIridiumCore = nullptr;
delete fIridiumCore;
fIridiumCore = nullptr;
delete fPhysicalCable;
fPhysicalCable = nullptr;
delete fLogicalCable;
fLogicalCable = nullptr;
delete fCable;
fCable = nullptr;
delete fPhysicalEnd2SteelShell;
fPhysicalEnd2SteelShell = nullptr;
delete fLogicalEnd2SteelShell;
fLogicalEnd2SteelShell = nullptr;
delete fEnd2SteelShell;
fEnd2SteelShell = nullptr;
delete fPhysicalEnd1SteelShell;
fPhysicalEnd1SteelShell = nullptr;
delete fLogicalEnd1SteelShell;
fLogicalEnd1SteelShell = nullptr;
delete fEnd1SteelShell;
fEnd1SteelShell = nullptr;
delete fPhysicalAirGap;
fPhysicalAirGap = nullptr;
delete fLogicalAirGap;
fLogicalAirGap = nullptr;
delete fAirGap;
fAirGap = nullptr;
delete fPhysicalSteelShell;
fPhysicalSteelShell = nullptr;
delete fLogicalSteelShell;
fLogicalSteelShell = nullptr;
delete fSteelShell;
fSteelShell = nullptr;
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
}