Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // Hadrontherapy advanced example for Geant4 27 // See more at: https://twiki.cern.ch/twiki/bin/view/Geant4/AdvancedExamplesHadrontherapy 28 29 #include "HadrontherapyDetectorMessenger.hh" 30 #include "HadrontherapyDetectorConstruction.hh" 31 #include "G4UIdirectory.hh" 32 #include "G4UIcmdWith3VectorAndUnit.hh" 33 #include "G4UIcmdWithoutParameter.hh" 34 #include "G4UIcmdWithAString.hh" 35 #include "G4SystemOfUnits.hh" 36 #include "G4UIcmdWithABool.hh" 37 38 ///////////////////////////////////////////////////////////////////////////// 39 HadrontherapyDetectorMessenger::HadrontherapyDetectorMessenger(HadrontherapyDetectorConstruction* detector) 40 :hadrontherapyDetector(detector) 41 { 42 // Change Phantom size 43 changeThePhantomDir = new G4UIdirectory("/changePhantom/"); 44 changeThePhantomDir -> SetGuidance("Command to change the Phantom Size/position"); 45 changeThePhantomSizeCmd = new G4UIcmdWith3VectorAndUnit("/changePhantom/size", this); 46 changeThePhantomSizeCmd -> SetGuidance("Insert sizes X Y and Z" 47 "\n 0 or negative values mean <<Don't change it!>>"); 48 changeThePhantomSizeCmd -> SetParameterName("PhantomSizeAlongX", 49 "PhantomSizeAlongY", 50 "PhantomSizeAlongZ", false); 51 changeThePhantomSizeCmd -> SetDefaultUnit("mm"); 52 changeThePhantomSizeCmd -> SetUnitCandidates("nm um mm cm"); 53 changeThePhantomSizeCmd -> AvailableForStates(G4State_Idle); 54 55 56 // Change Phantom material 57 changeThePhantomMaterialCmd = new G4UIcmdWithAString("/changePhantom/material", this); 58 changeThePhantomMaterialCmd -> SetGuidance("Change the Phantom and the detector material"); 59 changeThePhantomMaterialCmd -> SetParameterName("PhantomMaterial", false); 60 changeThePhantomMaterialCmd -> SetDefaultValue("G4_WATER"); 61 changeThePhantomMaterialCmd -> AvailableForStates(G4State_Idle); 62 63 // Change Phantom position 64 changeThePhantomPositionCmd = new G4UIcmdWith3VectorAndUnit("/changePhantom/position", this); 65 changeThePhantomPositionCmd -> SetGuidance("Insert X Y and Z dimensions for the position of the center of the Phantom" 66 " respect to that of the \"World\""); 67 changeThePhantomPositionCmd -> SetParameterName("PositionAlongX", 68 "PositionAlongY", 69 "PositionAlongZ", false); 70 changeThePhantomPositionCmd -> SetDefaultUnit("mm"); 71 changeThePhantomPositionCmd -> SetUnitCandidates("um mm cm m"); 72 changeThePhantomPositionCmd -> AvailableForStates(G4State_Idle); 73 74 75 updateCmd = new G4UIcmdWithoutParameter("/changePhantom/update",this); 76 updateCmd->SetGuidance("Update Phantom/Detector geometry."); 77 updateCmd->SetGuidance("This command MUST be applied before \"beamOn\" "); 78 updateCmd->SetGuidance("if you changed geometrical value(s)."); 79 updateCmd->AvailableForStates(G4State_Idle); 80 81 // Change detector size 82 changeTheDetectorDir = new G4UIdirectory("/changeDetector/"); 83 changeTheDetectorDir -> SetGuidance("Command to change the Detector's Size/position/Voxels"); 84 85 changeTheDetectorSizeCmd = new G4UIcmdWith3VectorAndUnit("/changeDetector/size",this); 86 changeTheDetectorSizeCmd -> SetGuidance("Insert sizes for X Y and Z dimensions of the Detector" 87 "\n 0 or negative values mean <<Don't change it>>"); 88 changeTheDetectorSizeCmd -> SetParameterName("DetectorSizeAlongX", "DetectorSizeAlongY", "DetectorSizeAlongZ", false); 89 changeTheDetectorSizeCmd -> SetDefaultUnit("mm"); 90 changeTheDetectorSizeCmd -> SetUnitCandidates("nm um mm cm"); 91 changeTheDetectorSizeCmd -> AvailableForStates(G4State_Idle); 92 93 // Change the detector to phantom displacement 94 changeTheDetectorToPhantomPositionCmd = new G4UIcmdWith3VectorAndUnit("/changeDetector/displacement",this); 95 changeTheDetectorToPhantomPositionCmd -> SetGuidance("Insert X Y and Z displacements between Detector and Phantom" 96 "\nNegative values mean <<Don't change it!>>"); 97 changeTheDetectorToPhantomPositionCmd -> SetParameterName("DisplacementAlongX", 98 "DisplacementAlongY", 99 "DisplacementAlongZ", false); 100 changeTheDetectorToPhantomPositionCmd -> SetDefaultUnit("mm"); 101 changeTheDetectorToPhantomPositionCmd -> SetUnitCandidates("nm um mm cm"); 102 changeTheDetectorToPhantomPositionCmd -> AvailableForStates(G4State_Idle); 103 104 // Change voxels by its size 105 changeTheDetectorVoxelCmd = new G4UIcmdWith3VectorAndUnit("/changeDetector/voxelSize",this); 106 changeTheDetectorVoxelCmd -> SetGuidance("Insert Voxel sizes for X Y and Z dimensions" 107 "\n 0 or negative values mean <<Don't change it!>>"); 108 changeTheDetectorVoxelCmd -> SetParameterName("VoxelSizeAlongX", "VoxelSizeAlongY", "VoxelSizeAlongZ", false); 109 changeTheDetectorVoxelCmd -> SetDefaultUnit("mm"); 110 changeTheDetectorVoxelCmd -> SetUnitCandidates("nm um mm cm"); 111 changeTheDetectorVoxelCmd -> AvailableForStates(G4State_Idle); 112 113 114 changeTheSource = new G4UIdirectory("/changeTheSource/"); 115 changeTheSource -> SetGuidance("Command to change the source"); 116 117 118 119 120 ///////////////////////////////////////////////////////////////////////////// 121 122 VirtualLayer = new G4UIcmdWithABool("/changeTheSource/VirtualLayer",this); 123 VirtualLayer -> SetParameterName("VirtualLayer ", false); 124 VirtualLayer -> SetDefaultValue("false"); 125 VirtualLayer -> SetGuidance("Set if you want place a VirtualLayer" 126 "\n[usage]: /changeTheSource/VirtualLayer [true/false]"); 127 VirtualLayer -> AvailableForStates(G4State_Idle, G4State_PreInit); 128 129 130 VirtualLayerPosition = new G4UIcmdWith3VectorAndUnit("/changeTheSource/VirtualLayerPosition", this); 131 VirtualLayerPosition -> SetGuidance("Insert X Y and Z dimensions for the position of the center of the Virtual Layer" 132 " respect to that of the \"World\""); 133 VirtualLayerPosition -> SetParameterName("PositionAlongX", 134 "PositionAlongY", 135 "PositionAlongZ", false); 136 137 VirtualLayerPosition -> SetDefaultUnit("cm"); 138 VirtualLayerPosition -> SetUnitCandidates("um mm cm m"); 139 VirtualLayerPosition -> AvailableForStates(G4State_Idle); 140 141 142 143 } 144 145 ///////////////////////////////////////////////////////////////////////////// 146 HadrontherapyDetectorMessenger::~HadrontherapyDetectorMessenger() 147 { 148 delete changeThePhantomDir; 149 delete changeThePhantomSizeCmd; 150 delete changeThePhantomPositionCmd; 151 delete changeThePhantomMaterialCmd; 152 delete updateCmd; 153 delete changeTheDetectorDir; 154 delete changeTheDetectorSizeCmd; 155 delete changeTheDetectorToPhantomPositionCmd; 156 delete changeTheDetectorVoxelCmd; 157 delete VirtualLayer; 158 delete VirtualLayerPosition; 159 } 160 161 ///////////////////////////////////////////////////////////////////////////// 162 void HadrontherapyDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) 163 { 164 165 if( command == changeThePhantomSizeCmd) 166 { 167 G4ThreeVector size = changeThePhantomSizeCmd -> GetNew3VectorValue(newValue); 168 hadrontherapyDetector -> SetPhantomSize(size.getX(),size.getY(),size.getZ()); 169 } 170 else if (command == changeThePhantomPositionCmd ) 171 { 172 173 G4ThreeVector size = changeThePhantomPositionCmd -> GetNew3VectorValue(newValue); 174 hadrontherapyDetector -> SetPhantomPosition(size); 175 } 176 else if (command == changeThePhantomMaterialCmd) 177 { 178 hadrontherapyDetector -> SetPhantomMaterial(newValue); 179 } 180 else if (command == changeTheDetectorSizeCmd) 181 { 182 G4ThreeVector size = changeTheDetectorSizeCmd -> GetNew3VectorValue(newValue); 183 hadrontherapyDetector -> SetDetectorSize(size.getX(),size.getY(),size.getZ()); 184 } 185 else if (command == changeTheDetectorToPhantomPositionCmd) 186 { 187 G4ThreeVector size = changeTheDetectorToPhantomPositionCmd-> GetNew3VectorValue(newValue); 188 hadrontherapyDetector -> SetDetectorToPhantomPosition(size); 189 190 } 191 else if (command == changeTheDetectorVoxelCmd) 192 { 193 G4ThreeVector size = changeTheDetectorVoxelCmd -> GetNew3VectorValue(newValue); 194 hadrontherapyDetector -> SetVoxelSize(size.getX(),size.getY(),size.getZ()); 195 } 196 else if (command == updateCmd) 197 { 198 hadrontherapyDetector -> UpdateGeometry(); 199 } 200 201 else if(command == VirtualLayer) 202 { 203 hadrontherapyDetector->VirtualLayer(VirtualLayer->GetNewBoolValue(newValue)); 204 } 205 else if(command == VirtualLayerPosition) 206 { 207 G4ThreeVector size = VirtualLayerPosition-> GetNew3VectorValue(newValue); 208 209 hadrontherapyDetector -> SetVirtualLayerPosition(size); 210 } 211 212 } 213