Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // ------------------------------------------- 27 // -------------------------------------------------------------- 28 // GEANT 4 - Brachytherapy exa 28 // GEANT 4 - Brachytherapy example 29 // ------------------------------------------- 29 // -------------------------------------------------------------- 30 // 30 // 31 // Code developed by: 31 // Code developed by: 32 // S. Guatelli, D. Cutajar, J. Poder 32 // S. Guatelli, D. Cutajar, J. Poder 33 // Centre For Medical Radiation Physics, Unive 33 // Centre For Medical Radiation Physics, University of Wollongong 34 // 34 // 35 // **************************************** 35 // **************************************** 36 // * * 36 // * * 37 // * BrachyDetectorConstructionFlexi.cc* 37 // * BrachyDetectorConstructionFlexi.cc* 38 // * * 38 // * * 39 // **************************************** 39 // **************************************** 40 // 40 // 41 // 41 // 42 #include "globals.hh" 42 #include "globals.hh" 43 #include "G4SystemOfUnits.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "BrachyDetectorConstructionFlexi.hh" 44 #include "BrachyDetectorConstructionFlexi.hh" 45 #include "G4RunManager.hh" 45 #include "G4RunManager.hh" 46 #include "G4Tubs.hh" 46 #include "G4Tubs.hh" 47 #include "G4Cons.hh" 47 #include "G4Cons.hh" 48 #include "G4LogicalVolume.hh" 48 #include "G4LogicalVolume.hh" 49 #include "G4ThreeVector.hh" 49 #include "G4ThreeVector.hh" 50 #include "G4PVPlacement.hh" 50 #include "G4PVPlacement.hh" 51 #include "G4Transform3D.hh" 51 #include "G4Transform3D.hh" 52 #include "G4RotationMatrix.hh" 52 #include "G4RotationMatrix.hh" 53 #include "G4TransportationManager.hh" 53 #include "G4TransportationManager.hh" >> 54 #include "BrachyMaterial.hh" 54 #include "G4VisAttributes.hh" 55 #include "G4VisAttributes.hh" 55 #include "G4Colour.hh" 56 #include "G4Colour.hh" 56 #include "G4NistManager.hh" << 57 57 58 BrachyDetectorConstructionFlexi::BrachyDetecto 58 BrachyDetectorConstructionFlexi::BrachyDetectorConstructionFlexi() 59 : fSteelShell(nullptr), fLogicalSteelShell(n 59 : fSteelShell(nullptr), fLogicalSteelShell(nullptr), fAirGap(nullptr), fLogicalAirGap(nullptr), fPhysicalAirGap(nullptr), 60 fEnd1SteelShell(nullptr), fLogicalEnd1Stee 60 fEnd1SteelShell(nullptr), fLogicalEnd1SteelShell(nullptr), fPhysicalEnd1SteelShell(nullptr), 61 fEnd2SteelShell(nullptr), fLogicalEnd2Stee 61 fEnd2SteelShell(nullptr), fLogicalEnd2SteelShell(nullptr), fPhysicalEnd2SteelShell(nullptr), 62 fCable(nullptr), fLogicalCable(nullptr), f 62 fCable(nullptr), fLogicalCable(nullptr), fPhysicalCable(nullptr), 63 fIridiumCore(nullptr), fLogicalIridiumCore 63 fIridiumCore(nullptr), fLogicalIridiumCore(nullptr), fPhysicalIridiumCore(nullptr), 64 fSteelAttributes(nullptr), fEndAttributes( 64 fSteelAttributes(nullptr), fEndAttributes(nullptr), fSimpleIridiumVisAtt(nullptr) 65 {} << 65 { >> 66 fMat = new BrachyMaterial(); >> 67 } >> 68 >> 69 BrachyDetectorConstructionFlexi::~BrachyDetectorConstructionFlexi() >> 70 { >> 71 delete fMat; >> 72 } 66 73 67 void BrachyDetectorConstructionFlexi::Construc 74 void BrachyDetectorConstructionFlexi::ConstructFlexi(G4VPhysicalVolume* mother) 68 { 75 { 69 G4NistManager* nist = G4NistManager::Instanc << 76 G4Material* steelMat = fMat -> GetMat("Stainless steel 304"); 70 << 77 G4Material* iridiumMat = fMat -> GetMat("Iridium"); 71 G4Material* iridiumMat = nist -> FindOrBuild << 78 G4Material* airMat = fMat -> GetMat("Air"); 72 G4Material* airMat = nist -> FindOrBuildMate << 79 73 << 74 //Define Stainless-steel-304 - Flexi source << 75 G4int Z; //atomic number of the element << 76 G4Element* elC = nist -> FindOrBuildElement( << 77 G4Element* elMn = nist -> FindOrBuildElement << 78 G4Element* elSi = nist -> FindOrBuildElement << 79 G4Element* elCr = nist -> FindOrBuildElement << 80 G4Element* elFe = nist -> FindOrBuildElement << 81 G4Element* elNi = nist -> FindOrBuildElement << 82 << 83 constexpr G4double d = 7.999*g/cm3; << 84 auto steelMat = new G4Material("Stainless st << 85 steelMat -> AddElement(elMn, 0.02); << 86 steelMat -> AddElement(elSi, 0.01); << 87 steelMat -> AddElement(elCr, 0.19); << 88 steelMat -> AddElement(elNi, 0.10); << 89 steelMat -> AddElement(elFe, 0.6792); << 90 steelMat -> AddElement(elC, 0.0008); << 91 << 92 //Define dimensions of the outer Steel shell 80 //Define dimensions of the outer Steel shell around the solid source - not including the ends 93 81 94 G4double shellr_min = 0.00 * mm; 82 G4double shellr_min = 0.00 * mm; 95 G4double shellr_max = 0.85 * mm; 83 G4double shellr_max = 0.85 * mm; 96 G4double shell_length = 3.6 * mm; 84 G4double shell_length = 3.6 * mm; 97 fSteelShell = new G4Tubs("steel_shell",shell 85 fSteelShell = new G4Tubs("steel_shell",shellr_min, shellr_max/2, shell_length/2.,0.*deg,360.*deg); 98 fLogicalSteelShell = new G4LogicalVolume(fSt << 86 fLogicalSteelShell = new G4LogicalVolume(fSteelShell, steelMat, "steel_shell_log", 0, 0, 0); 99 fPhysicalSteelShell = new G4PVPlacement(null 87 fPhysicalSteelShell = new G4PVPlacement(nullptr,G4ThreeVector(0,0,0),"phys_steel_shell", fLogicalSteelShell, mother, false, 0, true); 100 88 101 //Define dimensions of the air gap between Ste 89 //Define dimensions of the air gap between Steel shell and Iridium core 102 G4double airr_min = 0.00 * mm; 90 G4double airr_min = 0.00 * mm; 103 G4double airr_max = 0.67 * mm; 91 G4double airr_max = 0.67 * mm; 104 G4double air_length = 3.6 * mm; 92 G4double air_length = 3.6 * mm; 105 fAirGap = new G4Tubs("air_gap", airr_min, ai 93 fAirGap = new G4Tubs("air_gap", airr_min, airr_max/2, air_length/2, 0.*deg, 360.*deg); 106 fLogicalAirGap = new G4LogicalVolume(fAirGap << 94 fLogicalAirGap = new G4LogicalVolume(fAirGap, airMat, "air_gap_log", 0, 0, 0); 107 fPhysicalAirGap = new G4PVPlacement(nullptr, 95 fPhysicalAirGap = new G4PVPlacement(nullptr, G4ThreeVector(0,0,0), "phys_air_gap", fLogicalAirGap, fPhysicalSteelShell, false, 0, true); 108 96 109 //Define the non-cable weld end of the Steel s 97 //Define the non-cable weld end of the Steel shell 110 G4double end1r_min = 0.0 * mm; 98 G4double end1r_min = 0.0 * mm; 111 G4double end1r_max = 0.85 * mm; 99 G4double end1r_max = 0.85 * mm; 112 G4double end1length = 0.65 * mm; 100 G4double end1length = 0.65 * mm; 113 fEnd1SteelShell = new G4Tubs("End_1_steel_sh 101 fEnd1SteelShell = new G4Tubs("End_1_steel_shell", end1r_min, end1r_max/2, end1length/2.,0.*deg,360.*deg); 114 fLogicalEnd1SteelShell = new G4LogicalVolume << 102 fLogicalEnd1SteelShell = new G4LogicalVolume(fEnd1SteelShell, steelMat, "End1_steel_shell_log", 0, 0, 0); 115 G4double end1offset_x = 0.0 * mm; 103 G4double end1offset_x = 0.0 * mm; 116 G4double end1offset_y = 0.0 * mm; 104 G4double end1offset_y = 0.0 * mm; 117 G4double end1offset_z = 2.125 * mm; 105 G4double end1offset_z = 2.125 * mm; 118 fPhysicalEnd1SteelShell = new G4PVPlacement( 106 fPhysicalEnd1SteelShell = new G4PVPlacement(nullptr,G4ThreeVector(end1offset_x,end1offset_y,end1offset_z),"phys_End1_steel_shell", fLogicalEnd1SteelShell,mother, false, 0, true); 119 107 120 //Define the cable weld end of the Steel shell 108 //Define the cable weld end of the Steel shell 121 G4double end2r_min1 = 0.0 * mm; 109 G4double end2r_min1 = 0.0 * mm; 122 G4double end2r_max1 = 0.85 * mm; 110 G4double end2r_max1 = 0.85 * mm; 123 G4double end2r_min2 = 0.0 * mm; 111 G4double end2r_min2 = 0.0 * mm; 124 G4double end2r_max2 = 0.5 * mm; 112 G4double end2r_max2 = 0.5 * mm; 125 G4double end2length = 0.4 * mm; 113 G4double end2length = 0.4 * mm; 126 fEnd2SteelShell = new G4Cons("End_2_steel_sh 114 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); 127 fLogicalEnd2SteelShell = new G4LogicalVolume << 115 fLogicalEnd2SteelShell = new G4LogicalVolume(fEnd2SteelShell, steelMat, "End2_steel_shell_log", 0, 0, 0); 128 G4double end2offset_x = 0.0 * mm; 116 G4double end2offset_x = 0.0 * mm; 129 G4double end2offset_y = 0.0 * mm; 117 G4double end2offset_y = 0.0 * mm; 130 G4double end2offset_z = -2.0 * mm; 118 G4double end2offset_z = -2.0 * mm; 131 fPhysicalEnd2SteelShell = new G4PVPlacement( 119 fPhysicalEnd2SteelShell = new G4PVPlacement(nullptr,G4ThreeVector(end2offset_x,end2offset_y,end2offset_z), "phys_End2_steel_shell", fLogicalEnd2SteelShell, mother, false, 0, true); 132 120 133 //Define the cable 121 //Define the cable 134 G4double cable_min = 0.0 * mm; 122 G4double cable_min = 0.0 * mm; 135 G4double cable_max = 0.5 * mm; 123 G4double cable_max = 0.5 * mm; 136 G4double cablelength = 5.0 * mm; 124 G4double cablelength = 5.0 * mm; 137 fCable = new G4Tubs("cable",cable_min, cable 125 fCable = new G4Tubs("cable",cable_min, cable_max/2, cablelength/2.,0.*deg,360.*deg); 138 fLogicalCable = new G4LogicalVolume(fCable, << 126 fLogicalCable = new G4LogicalVolume(fCable, steelMat, "cable_log", 0, 0, 0); 139 G4double cableoffset_x = 0.0 * mm; 127 G4double cableoffset_x = 0.0 * mm; 140 G4double cableoffset_y = 0.0 * mm; 128 G4double cableoffset_y = 0.0 * mm; 141 G4double cableoffset_z = -4.7 * mm; 129 G4double cableoffset_z = -4.7 * mm; 142 fPhysicalCable = new G4PVPlacement(nullptr,G 130 fPhysicalCable = new G4PVPlacement(nullptr,G4ThreeVector(cableoffset_x,cableoffset_y,cableoffset_z),"phys_cable", fLogicalCable, mother, false, 0, true); 143 131 144 // Define the Iridium core 132 // Define the Iridium core 145 G4double corer_min = 0.0 * mm; 133 G4double corer_min = 0.0 * mm; 146 G4double corer_max = 0.6 * mm; 134 G4double corer_max = 0.6 * mm; 147 G4double core_length = 3.5 * mm; 135 G4double core_length = 3.5 * mm; 148 fIridiumCore = new G4Tubs("iridium_core",cor 136 fIridiumCore = new G4Tubs("iridium_core",corer_min, corer_max/2,core_length/2.,0.*deg,360.*deg); 149 fLogicalIridiumCore = new G4LogicalVolume(fI << 137 fLogicalIridiumCore = new G4LogicalVolume(fIridiumCore, iridiumMat, "iridium_core_log", 0, 0, 0); 150 fPhysicalIridiumCore = new G4PVPlacement(nul 138 fPhysicalIridiumCore = new G4PVPlacement(nullptr,G4ThreeVector(0,0,0), "phys_iridium_core", fLogicalIridiumCore, fPhysicalAirGap, false, 0, true); 151 139 152 // Visualisations 140 // Visualisations 153 141 154 //Shell/cable attributes 142 //Shell/cable attributes 155 fSteelAttributes = new G4VisAttributes(G4Col 143 fSteelAttributes = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); // red 156 fSteelAttributes -> SetVisibility(true); 144 fSteelAttributes -> SetVisibility(true); 157 fSteelAttributes -> SetForceAuxEdgeVisible(t 145 fSteelAttributes -> SetForceAuxEdgeVisible(true); 158 146 159 fEndAttributes = new G4VisAttributes(G4Colou 147 fEndAttributes = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); // red 160 fEndAttributes -> SetVisibility(true); 148 fEndAttributes -> SetVisibility(true); 161 fEndAttributes -> SetForceAuxEdgeVisible(tru 149 fEndAttributes -> SetForceAuxEdgeVisible(true); 162 fLogicalSteelShell -> SetVisAttributes(fStee 150 fLogicalSteelShell -> SetVisAttributes(fSteelAttributes); 163 fLogicalEnd1SteelShell -> SetVisAttributes(f 151 fLogicalEnd1SteelShell -> SetVisAttributes(fEndAttributes); 164 fLogicalEnd2SteelShell -> SetVisAttributes(f 152 fLogicalEnd2SteelShell -> SetVisAttributes(fEndAttributes); 165 fLogicalCable -> SetVisAttributes(fSteelAttr 153 fLogicalCable -> SetVisAttributes(fSteelAttributes); 166 154 167 G4Colour magenta (1.0, 0.0, 1.0) ; 155 G4Colour magenta (1.0, 0.0, 1.0) ; 168 156 169 fSimpleIridiumVisAtt = new G4VisAttributes(m 157 fSimpleIridiumVisAtt = new G4VisAttributes(magenta); 170 fSimpleIridiumVisAtt -> SetVisibility(true); 158 fSimpleIridiumVisAtt -> SetVisibility(true); 171 fSimpleIridiumVisAtt -> SetForceWireframe(tr 159 fSimpleIridiumVisAtt -> SetForceWireframe(true); 172 fLogicalIridiumCore -> SetVisAttributes(fSim 160 fLogicalIridiumCore -> SetVisAttributes(fSimpleIridiumVisAtt); 173 } 161 } 174 162 175 void BrachyDetectorConstructionFlexi::CleanFle 163 void BrachyDetectorConstructionFlexi::CleanFlexi() 176 { 164 { 177 delete fSimpleIridiumVisAtt; 165 delete fSimpleIridiumVisAtt; 178 fSimpleIridiumVisAtt = nullptr; 166 fSimpleIridiumVisAtt = nullptr; 179 167 180 delete fEndAttributes; 168 delete fEndAttributes; 181 fEndAttributes = nullptr; 169 fEndAttributes = nullptr; 182 170 183 delete fSteelAttributes; 171 delete fSteelAttributes; 184 fSteelAttributes = nullptr; 172 fSteelAttributes = nullptr; 185 173 186 delete fPhysicalIridiumCore; 174 delete fPhysicalIridiumCore; 187 fPhysicalIridiumCore = nullptr ; 175 fPhysicalIridiumCore = nullptr ; 188 176 189 delete fLogicalIridiumCore; 177 delete fLogicalIridiumCore; 190 fLogicalIridiumCore = nullptr; 178 fLogicalIridiumCore = nullptr; 191 179 192 delete fIridiumCore; 180 delete fIridiumCore; 193 fIridiumCore = nullptr; 181 fIridiumCore = nullptr; 194 182 195 delete fPhysicalCable; 183 delete fPhysicalCable; 196 fPhysicalCable = nullptr; 184 fPhysicalCable = nullptr; 197 185 198 delete fLogicalCable; 186 delete fLogicalCable; 199 fLogicalCable = nullptr; 187 fLogicalCable = nullptr; 200 188 201 delete fCable; 189 delete fCable; 202 fCable = nullptr; 190 fCable = nullptr; 203 191 204 delete fPhysicalEnd2SteelShell; 192 delete fPhysicalEnd2SteelShell; 205 fPhysicalEnd2SteelShell = nullptr; 193 fPhysicalEnd2SteelShell = nullptr; 206 194 207 delete fLogicalEnd2SteelShell; 195 delete fLogicalEnd2SteelShell; 208 fLogicalEnd2SteelShell = nullptr; 196 fLogicalEnd2SteelShell = nullptr; 209 197 210 delete fEnd2SteelShell; 198 delete fEnd2SteelShell; 211 fEnd2SteelShell = nullptr; 199 fEnd2SteelShell = nullptr; 212 200 213 delete fPhysicalEnd1SteelShell; 201 delete fPhysicalEnd1SteelShell; 214 fPhysicalEnd1SteelShell = nullptr; 202 fPhysicalEnd1SteelShell = nullptr; 215 203 216 delete fLogicalEnd1SteelShell; 204 delete fLogicalEnd1SteelShell; 217 fLogicalEnd1SteelShell = nullptr; 205 fLogicalEnd1SteelShell = nullptr; 218 206 219 delete fEnd1SteelShell; 207 delete fEnd1SteelShell; 220 fEnd1SteelShell = nullptr; 208 fEnd1SteelShell = nullptr; 221 209 222 delete fPhysicalAirGap; 210 delete fPhysicalAirGap; 223 fPhysicalAirGap = nullptr; 211 fPhysicalAirGap = nullptr; 224 212 225 delete fLogicalAirGap; 213 delete fLogicalAirGap; 226 fLogicalAirGap = nullptr; 214 fLogicalAirGap = nullptr; 227 215 228 delete fAirGap; 216 delete fAirGap; 229 fAirGap = nullptr; 217 fAirGap = nullptr; 230 218 231 delete fPhysicalSteelShell; 219 delete fPhysicalSteelShell; 232 fPhysicalSteelShell = nullptr; 220 fPhysicalSteelShell = nullptr; 233 221 234 delete fLogicalSteelShell; 222 delete fLogicalSteelShell; 235 fLogicalSteelShell = nullptr; 223 fLogicalSteelShell = nullptr; 236 224 237 delete fSteelShell; 225 delete fSteelShell; 238 fSteelShell = nullptr; 226 fSteelShell = nullptr; 239 227 240 G4RunManager::GetRunManager() -> GeometryHas 228 G4RunManager::GetRunManager() -> GeometryHasBeenModified(); 241 } 229 } 242 230