Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 #include "Par04DetectorMessenger.hh" 27 28 #include "Par04DetectorConstruction.hh" // fo 29 30 #include "G4UIcmdWithADoubleAndUnit.hh" // fo 31 #include "G4UIcmdWithAnInteger.hh" // for G4U 32 #include "G4UIcmdWithoutParameter.hh" // for 33 #include "G4UIdirectory.hh" // for G4UIdirect 34 35 #include <CLHEP/Units/SystemOfUnits.h> // for 36 #include <G4ApplicationState.hh> // for G4Sta 37 #include <G4ThreeVector.hh> // for G4ThreeVec 38 #include <G4Types.hh> // for G4bool, G4double 39 #include <G4UIcommand.hh> // for G4UIcommand 40 #include <G4UImessenger.hh> // for G4UImessen 41 #include <G4UIparameter.hh> // for G4UIparame 42 #include <istream> // for basic_istream, basi 43 #include <string> // for operator>> 44 45 //....oooOO0OOooo........oooOO0OOooo........oo 46 47 Par04DetectorMessenger::Par04DetectorMessenger 48 : G4UImessenger(), fDetector(aDetector) 49 { 50 fExampleDir = new G4UIdirectory("/Par04/"); 51 fExampleDir->SetGuidance("UI commands specif 52 53 fDetectorDir = new G4UIdirectory("/Par04/det 54 fDetectorDir->SetGuidance("Detector construc 55 56 fPrintCmd = new G4UIcmdWithoutParameter("/Pa 57 fPrintCmd->SetGuidance("Print current settin 58 59 fDetectorInnerRadiusCmd = 60 new G4UIcmdWithADoubleAndUnit("/Par04/dete 61 fDetectorInnerRadiusCmd->SetGuidance("Set cy 62 fDetectorInnerRadiusCmd->SetParameterName("S 63 fDetectorInnerRadiusCmd->SetRange("Size>0.") 64 fDetectorInnerRadiusCmd->SetUnitCategory("Le 65 fDetectorInnerRadiusCmd->AvailableForStates( 66 fDetectorInnerRadiusCmd->SetToBeBroadcasted( 67 68 fDetectorLengthCmd = new G4UIcmdWithADoubleA 69 fDetectorLengthCmd->SetGuidance("Set length 70 fDetectorLengthCmd->SetParameterName("Size", 71 fDetectorLengthCmd->SetRange("Size>0."); 72 fDetectorLengthCmd->SetUnitCategory("Length" 73 fDetectorLengthCmd->AvailableForStates(G4Sta 74 fDetectorLengthCmd->SetToBeBroadcasted(false 75 76 fNbLayersCmd = new G4UIcmdWithAnInteger("/Pa 77 fNbLayersCmd->SetGuidance("Set number of lay 78 fNbLayersCmd->SetParameterName("NbLayers", f 79 fNbLayersCmd->SetRange("NbLayers>0"); 80 fNbLayersCmd->AvailableForStates(G4State_Pre 81 fNbLayersCmd->SetToBeBroadcasted(false); 82 83 fAbsorCmd = new G4UIcommand("/Par04/detector 84 fAbsorCmd->SetGuidance("Set the absorber id, 85 fAbsorCmd->SetGuidance(" absorber number : 86 fAbsorCmd->SetGuidance(" material name"); 87 fAbsorCmd->SetGuidance(" thickness (with un 88 fAbsorCmd->SetGuidance(" if sensitive : tru 89 auto absNbPrm = new G4UIparameter("AbsorNb", 90 absNbPrm->SetGuidance("absor number : from 0 91 absNbPrm->SetParameterRange("AbsorNb>-1&Abso 92 fAbsorCmd->SetParameter(absNbPrm); 93 auto matPrm = new G4UIparameter("material", 94 matPrm->SetGuidance("material name"); 95 fAbsorCmd->SetParameter(matPrm); 96 auto thickPrm = new G4UIparameter("thickness 97 thickPrm->SetGuidance("thickness of absorber 98 thickPrm->SetParameterRange("thickness>0."); 99 fAbsorCmd->SetParameter(thickPrm); 100 auto unitPrm = new G4UIparameter("unit", 's' 101 unitPrm->SetGuidance("unit of thickness"); 102 G4String unitList = G4UIcommand::UnitsList(G 103 unitPrm->SetParameterCandidates(unitList); 104 fAbsorCmd->SetParameter(unitPrm); 105 auto sensitivePrm = new G4UIparameter("sensi 106 sensitivePrm->SetGuidance("if absorber is se 107 fAbsorCmd->SetParameter(sensitivePrm); 108 109 fAbsorCmd->AvailableForStates(G4State_PreIni 110 fAbsorCmd->SetToBeBroadcasted(false); 111 112 fMeshDir = new G4UIdirectory("/Par04/mesh/") 113 fMeshDir->SetGuidance("Mesh UI commands"); 114 115 fMeshNbRhoCellsCmd = new G4UIcmdWithAnIntege 116 fMeshNbRhoCellsCmd->SetGuidance("Set number 117 fMeshNbRhoCellsCmd->SetParameterName("NbRhoC 118 fMeshNbRhoCellsCmd->SetRange("NbRhoCells>0") 119 fMeshNbRhoCellsCmd->AvailableForStates(G4Sta 120 fMeshNbRhoCellsCmd->SetToBeBroadcasted(false 121 122 fMeshNbPhiCellsCmd = new G4UIcmdWithAnIntege 123 fMeshNbPhiCellsCmd->SetGuidance("Set number 124 fMeshNbPhiCellsCmd->SetParameterName("NbPhiC 125 fMeshNbPhiCellsCmd->SetRange("NbPhiCells>0") 126 fMeshNbPhiCellsCmd->AvailableForStates(G4Sta 127 fMeshNbPhiCellsCmd->SetToBeBroadcasted(false 128 129 fMeshNbZCellsCmd = new G4UIcmdWithAnInteger( 130 fMeshNbZCellsCmd->SetGuidance("Set number of 131 fMeshNbZCellsCmd->SetParameterName("NbZCells 132 fMeshNbZCellsCmd->SetRange("NbZCells>0"); 133 fMeshNbZCellsCmd->AvailableForStates(G4State 134 fMeshNbZCellsCmd->SetToBeBroadcasted(false); 135 136 fMeshSizeRhoCellsCmd = new G4UIcmdWithADoubl 137 fMeshSizeRhoCellsCmd->SetGuidance("Set size 138 fMeshSizeRhoCellsCmd->SetParameterName("Size 139 fMeshSizeRhoCellsCmd->SetRange("Size>0."); 140 fMeshSizeRhoCellsCmd->SetUnitCategory("Lengt 141 fMeshSizeRhoCellsCmd->AvailableForStates(G4S 142 fMeshSizeRhoCellsCmd->SetToBeBroadcasted(fal 143 144 fMeshSizeZCellsCmd = new G4UIcmdWithADoubleA 145 fMeshSizeZCellsCmd->SetGuidance("Set size of 146 fMeshSizeZCellsCmd->SetParameterName("Size", 147 fMeshSizeZCellsCmd->SetRange("Size>0."); 148 fMeshSizeZCellsCmd->SetUnitCategory("Length" 149 fMeshSizeZCellsCmd->AvailableForStates(G4Sta 150 fMeshSizeZCellsCmd->SetToBeBroadcasted(false 151 } 152 153 //....oooOO0OOooo........oooOO0OOooo........oo 154 155 Par04DetectorMessenger::~Par04DetectorMessenge 156 { 157 delete fPrintCmd; 158 delete fDetectorInnerRadiusCmd; 159 delete fDetectorLengthCmd; 160 delete fNbLayersCmd; 161 delete fAbsorCmd; 162 delete fDetectorDir; 163 delete fMeshNbRhoCellsCmd; 164 delete fMeshNbPhiCellsCmd; 165 delete fMeshNbZCellsCmd; 166 delete fMeshSizeRhoCellsCmd; 167 delete fMeshSizeZCellsCmd; 168 delete fMeshDir; 169 delete fExampleDir; 170 } 171 172 //....oooOO0OOooo........oooOO0OOooo........oo 173 174 void Par04DetectorMessenger::SetNewValue(G4UIc 175 { 176 if (aCommand == fPrintCmd) { 177 fDetector->Print(); 178 } 179 else if (aCommand == fDetectorInnerRadiusCmd 180 fDetector->SetInnerRadius(fDetectorInnerRa 181 } 182 else if (aCommand == fDetectorLengthCmd) { 183 fDetector->SetLength(fDetectorInnerRadiusC 184 } 185 else if (aCommand == fNbLayersCmd) { 186 fDetector->SetNbOfLayers(fNbLayersCmd->Get 187 } 188 else if (aCommand == fAbsorCmd) { 189 G4int num; 190 G4double thick; 191 G4String unt, mat; 192 G4bool sensitive; 193 std::istringstream is(aNewValue); 194 is >> num >> mat >> thick >> unt >> std::b 195 G4String material = mat; 196 thick *= G4UIcommand::ValueOf(unt); 197 fDetector->SetAbsorberMaterial(num, materi 198 fDetector->SetAbsorberThickness(num, thick 199 fDetector->SetAbsorberSensitivity(num, sen 200 } 201 else if (aCommand == fMeshNbRhoCellsCmd) { 202 fDetector->SetMeshNbOfCells(0, fMeshNbRhoC 203 } 204 else if (aCommand == fMeshNbPhiCellsCmd) { 205 fDetector->SetMeshNbOfCells(1, fMeshNbPhiC 206 fDetector->SetMeshSizeOfCells(1, 207 2. * CLHEP:: 208 } 209 else if (aCommand == fMeshNbZCellsCmd) { 210 fDetector->SetMeshNbOfCells(2, fMeshNbZCel 211 } 212 else if (aCommand == fMeshSizeRhoCellsCmd) { 213 fDetector->SetMeshSizeOfCells(0, fMeshSize 214 } 215 else if (aCommand == fMeshSizeZCellsCmd) { 216 fDetector->SetMeshSizeOfCells(2, fMeshSize 217 } 218 } 219 220 //....oooOO0OOooo........oooOO0OOooo........oo 221 222 G4String Par04DetectorMessenger::GetCurrentVal 223 { 224 G4String cv; 225 226 if (aCommand == fDetectorInnerRadiusCmd) { 227 cv = fDetectorInnerRadiusCmd->ConvertToStr 228 } 229 else if (aCommand == fDetectorLengthCmd) { 230 cv = fDetectorLengthCmd->ConvertToString(f 231 } 232 else if (aCommand == fNbLayersCmd) { 233 cv = fNbLayersCmd->ConvertToString(fDetect 234 } 235 else if (aCommand == fMeshNbRhoCellsCmd) { 236 cv = fMeshNbRhoCellsCmd->ConvertToString(f 237 } 238 else if (aCommand == fMeshNbPhiCellsCmd) { 239 cv = fMeshNbPhiCellsCmd->ConvertToString(f 240 } 241 else if (aCommand == fMeshNbZCellsCmd) { 242 cv = fMeshNbZCellsCmd->ConvertToString(fDe 243 } 244 else if (aCommand == fMeshSizeRhoCellsCmd) { 245 cv = fMeshSizeRhoCellsCmd->ConvertToString 246 } 247 else if (aCommand == fMeshSizeZCellsCmd) { 248 cv = fMeshSizeZCellsCmd->ConvertToString(f 249 } 250 return cv; 251 } 252