ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HadrontherapyDetectorMessenger.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file HadrontherapyDetectorMessenger.cc
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 
31 #include "G4UIdirectory.hh"
34 #include "G4UIcmdWithAString.hh"
35 #include "G4SystemOfUnits.hh"
36 #include "G4UIcmdWithABool.hh"
37 
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).");
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");
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 
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 
147 {
148  delete changeThePhantomDir;
152  delete updateCmd;
153  delete changeTheDetectorDir;
157  delete VirtualLayer;
158  delete VirtualLayerPosition;
159 }
160 
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  {
204  }
205  else if(command == VirtualLayerPosition)
206  {
207  G4ThreeVector size = VirtualLayerPosition-> GetNew3VectorValue(newValue);
208 
209  hadrontherapyDetector -> SetVirtualLayerPosition(size);
210  }
211 
212 }