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 : steel_shell(0),logical_steel_shell(0),air_gap(0), logical_air_gap(0), physical_air_gap(0), 60 fEnd1SteelShell(nullptr), fLogicalEnd1Stee << 60 End1_steel_shell(0),logical_End1_steel_shell(0), physical_End1_steel_shell(0), 61 fEnd2SteelShell(nullptr), fLogicalEnd2Stee << 61 End2_steel_shell(0),logical_End2_steel_shell(0), physical_End2_steel_shell(0), 62 fCable(nullptr), fLogicalCable(nullptr), f << 62 cable(0),logical_cable(0),physical_cable(0), 63 fIridiumCore(nullptr), fLogicalIridiumCore << 63 iridium_core(0),logical_iridium_core(0),physical_iridium_core(0), 64 fSteelAttributes(nullptr), fEndAttributes( << 64 steelAttributes(0), endAttributes(0), simpleIridiumVisAtt(0) 65 {} << 65 { >> 66 pMat = new BrachyMaterial(); >> 67 } >> 68 >> 69 BrachyDetectorConstructionFlexi::~BrachyDetectorConstructionFlexi() >> 70 { >> 71 delete pMat; >> 72 } 66 73 67 void BrachyDetectorConstructionFlexi::Construc 74 void BrachyDetectorConstructionFlexi::ConstructFlexi(G4VPhysicalVolume* mother) 68 { 75 { 69 G4NistManager* nist = G4NistManager::Instanc << 76 G4Material* steelMat = pMat -> GetMat("Stainless steel 304"); 70 << 77 G4Material* iridiumMat = pMat -> GetMat("Iridium"); 71 G4Material* iridiumMat = nist -> FindOrBuild << 78 G4Material* airMat = pMat -> 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 steel_shell = new G4Tubs("steel_shell",shellr_min, shellr_max/2, shell_length/2.,0.*deg,360.*deg); 98 fLogicalSteelShell = new G4LogicalVolume(fSt << 86 logical_steel_shell = new G4LogicalVolume(steel_shell, steelMat, "steel_shell_log", 0, 0, 0); 99 fPhysicalSteelShell = new G4PVPlacement(null << 87 physical_steel_shell = new G4PVPlacement(0,G4ThreeVector(0,0,0),"phys_steel_shell", logical_steel_shell, 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 air_gap = new G4Tubs("air_gap", airr_min, airr_max/2, air_length/2, 0.*deg, 360.*deg); 106 fLogicalAirGap = new G4LogicalVolume(fAirGap << 94 logical_air_gap = new G4LogicalVolume(air_gap, airMat, "air_gap_log", 0, 0, 0); 107 fPhysicalAirGap = new G4PVPlacement(nullptr, << 95 physical_air_gap = new G4PVPlacement(0, G4ThreeVector(0,0,0), "phys_air_gap",logical_air_gap, physical_steel_shell, 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 End1_steel_shell = new G4Tubs("End_1_steel_shell",End1r_min, End1r_max/2, End1length/2.,0.*deg,360.*deg); 114 fLogicalEnd1SteelShell = new G4LogicalVolume << 102 logical_End1_steel_shell = new G4LogicalVolume(End1_steel_shell, 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 physical_End1_steel_shell = new G4PVPlacement(0,G4ThreeVector(end1offset_x,end1offset_y,end1offset_z),"phys_End1_steel_shell", logical_End1_steel_shell,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 End2_steel_shell = 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 logical_End2_steel_shell = new G4LogicalVolume(End2_steel_shell, 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 physical_End2_steel_shell = new G4PVPlacement(0,G4ThreeVector(end2offset_x,end2offset_y,end2offset_z), "phys_End2_steel_shell", logical_End2_steel_shell,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 cable = new G4Tubs("cable",cable_min, cable_max/2, cablelength/2.,0.*deg,360.*deg); 138 fLogicalCable = new G4LogicalVolume(fCable, << 126 logical_cable = new G4LogicalVolume(cable, 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 physical_cable = new G4PVPlacement(0,G4ThreeVector(cableoffset_x,cableoffset_y,cableoffset_z),"phys_cable", logical_cable, 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 iridium_core = new G4Tubs("iridium_core",corer_min, corer_max/2,core_length/2.,0.*deg,360.*deg); 149 fLogicalIridiumCore = new G4LogicalVolume(fI << 137 logical_iridium_core = new G4LogicalVolume(iridium_core, iridiumMat, "iridium_core_log", 0, 0, 0); 150 fPhysicalIridiumCore = new G4PVPlacement(nul << 138 physical_iridium_core = new G4PVPlacement(0,G4ThreeVector(0,0,0), "phys_iridium_core", logical_iridium_core, physical_air_gap, 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 steelAttributes = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); // red 156 fSteelAttributes -> SetVisibility(true); << 144 steelAttributes -> SetVisibility(true); 157 fSteelAttributes -> SetForceAuxEdgeVisible(t << 145 steelAttributes -> SetForceAuxEdgeVisible(true); 158 << 146 159 fEndAttributes = new G4VisAttributes(G4Colou << 147 endAttributes = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); // red 160 fEndAttributes -> SetVisibility(true); << 148 endAttributes -> SetVisibility(true); 161 fEndAttributes -> SetForceAuxEdgeVisible(tru << 149 endAttributes -> SetForceAuxEdgeVisible(true); 162 fLogicalSteelShell -> SetVisAttributes(fStee << 150 logical_steel_shell -> SetVisAttributes(steelAttributes); 163 fLogicalEnd1SteelShell -> SetVisAttributes(f << 151 logical_End1_steel_shell -> SetVisAttributes(endAttributes); 164 fLogicalEnd2SteelShell -> SetVisAttributes(f << 152 logical_End2_steel_shell -> SetVisAttributes(endAttributes); 165 fLogicalCable -> SetVisAttributes(fSteelAttr << 153 logical_cable -> SetVisAttributes(steelAttributes); 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 simpleIridiumVisAtt = new G4VisAttributes(magenta); 170 fSimpleIridiumVisAtt -> SetVisibility(true); << 158 simpleIridiumVisAtt -> SetVisibility(true); 171 fSimpleIridiumVisAtt -> SetForceWireframe(tr << 159 simpleIridiumVisAtt -> SetForceWireframe(true); 172 fLogicalIridiumCore -> SetVisAttributes(fSim << 160 logical_iridium_core -> SetVisAttributes(simpleIridiumVisAtt); 173 } 161 } 174 162 175 void BrachyDetectorConstructionFlexi::CleanFle 163 void BrachyDetectorConstructionFlexi::CleanFlexi() 176 { 164 { 177 delete fSimpleIridiumVisAtt; << 165 delete simpleIridiumVisAtt; 178 fSimpleIridiumVisAtt = nullptr; << 166 simpleIridiumVisAtt = 0; 179 167 180 delete fEndAttributes; << 168 delete endAttributes; 181 fEndAttributes = nullptr; << 169 endAttributes = 0; 182 170 183 delete fSteelAttributes; << 171 delete steelAttributes; 184 fSteelAttributes = nullptr; << 172 steelAttributes = 0; 185 173 186 delete fPhysicalIridiumCore; << 174 delete physical_iridium_core; 187 fPhysicalIridiumCore = nullptr ; << 175 physical_iridium_core = 0 ; 188 176 189 delete fLogicalIridiumCore; << 177 delete logical_iridium_core; 190 fLogicalIridiumCore = nullptr; << 178 logical_iridium_core = 0; 191 179 192 delete fIridiumCore; << 180 delete iridium_core; 193 fIridiumCore = nullptr; << 181 iridium_core = 0; 194 182 195 delete fPhysicalCable; << 183 delete physical_cable; 196 fPhysicalCable = nullptr; << 184 physical_cable = 0; 197 185 198 delete fLogicalCable; << 186 delete logical_cable; 199 fLogicalCable = nullptr; << 187 logical_cable = 0; 200 188 201 delete fCable; << 189 delete cable; 202 fCable = nullptr; << 190 cable = 0; 203 191 204 delete fPhysicalEnd2SteelShell; << 192 delete physical_End2_steel_shell; 205 fPhysicalEnd2SteelShell = nullptr; << 193 physical_End2_steel_shell = 0; 206 194 207 delete fLogicalEnd2SteelShell; << 195 delete logical_End2_steel_shell; 208 fLogicalEnd2SteelShell = nullptr; << 196 logical_End2_steel_shell = 0; 209 197 210 delete fEnd2SteelShell; << 198 delete End2_steel_shell; 211 fEnd2SteelShell = nullptr; << 199 End2_steel_shell = 0; 212 200 213 delete fPhysicalEnd1SteelShell; << 201 delete physical_End1_steel_shell; 214 fPhysicalEnd1SteelShell = nullptr; << 202 physical_End1_steel_shell = 0; 215 203 216 delete fLogicalEnd1SteelShell; << 204 delete logical_End1_steel_shell; 217 fLogicalEnd1SteelShell = nullptr; << 205 logical_End1_steel_shell = 0; 218 206 219 delete fEnd1SteelShell; << 207 delete End1_steel_shell; 220 fEnd1SteelShell = nullptr; << 208 End1_steel_shell = 0; 221 209 222 delete fPhysicalAirGap; << 210 delete physical_air_gap; 223 fPhysicalAirGap = nullptr; << 211 physical_air_gap = 0; 224 212 225 delete fLogicalAirGap; << 213 delete logical_air_gap; 226 fLogicalAirGap = nullptr; << 214 logical_air_gap = 0; 227 215 228 delete fAirGap; << 216 delete air_gap; 229 fAirGap = nullptr; << 217 air_gap = 0; 230 218 231 delete fPhysicalSteelShell; << 219 delete physical_steel_shell; 232 fPhysicalSteelShell = nullptr; << 220 physical_steel_shell = 0; 233 221 234 delete fLogicalSteelShell; << 222 delete logical_steel_shell; 235 fLogicalSteelShell = nullptr; << 223 logical_steel_shell = 0; 236 224 237 delete fSteelShell; << 225 delete steel_shell; 238 fSteelShell = nullptr; << 226 steel_shell = 0; 239 227 240 G4RunManager::GetRunManager() -> GeometryHas << 228 G4RunManager::GetRunManager() -> GeometryHasBeenModified(); 241 } 229 } 242 230