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 // $Id: G4HnMessenger.cc 66310 2012-12-17 11:56:35Z ihrivnac $ 26 27 27 // Author: Ivana Hrivnacova, 18/06/2013 (ivan 28 // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) 28 29 29 #include "G4HnMessenger.hh" 30 #include "G4HnMessenger.hh" 30 #include "G4HnManager.hh" 31 #include "G4HnManager.hh" 31 #include "G4AnalysisUtilities.hh" 32 #include "G4AnalysisUtilities.hh" 32 33 33 #include "G4UIcommand.hh" 34 #include "G4UIcommand.hh" 34 #include "G4UIparameter.hh" 35 #include "G4UIparameter.hh" >> 36 #include "G4UIcmdWithAnInteger.hh" 35 #include "G4UIcmdWithABool.hh" 37 #include "G4UIcmdWithABool.hh" 36 #include "G4UIcmdWithAString.hh" << 37 38 38 using namespace G4Analysis; << 39 #include <iostream> 39 40 40 //____________________________________________ << 41 namespace { 41 G4HnMessenger::G4HnMessenger(G4HnManager& mana << 42 42 : fManager(manager), << 43 void Exception(G4UIcommand* command, G4int nofParameters) 43 fHnType(manager.GetHnType()), << 44 fHnDimension(std::stoi(manager.GetHnType() << 45 { 44 { >> 45 G4ExceptionDescription description; >> 46 description >> 47 << "Got wrong number of \"" << command->GetCommandName() >> 48 << "\" parameters: " << nofParameters >> 49 << " instead of " << command->GetParameterEntries() >> 50 << " expected" << G4endl; >> 51 G4Exception("G4HnMessenger::SetNewValue", >> 52 "Analysis_W013", JustWarning, description); >> 53 } >> 54 >> 55 } >> 56 >> 57 //_____________________________________________________________________________ >> 58 G4HnMessenger::G4HnMessenger(G4HnManager* manager) >> 59 : G4UImessenger(), >> 60 fManager(manager), >> 61 fSetHnAsciiCmd(0), >> 62 fSetHnActivationCmd(0), >> 63 fSetHnActivationAllCmd(0) >> 64 { >> 65 46 SetHnAsciiCmd(); 66 SetHnAsciiCmd(); 47 SetHnActivationCmd(); 67 SetHnActivationCmd(); 48 SetHnActivationToAllCmd(); 68 SetHnActivationToAllCmd(); 49 SetHnPlottingCmd(); << 50 SetHnPlottingToAllCmd(); << 51 SetHnFileNameCmd(); << 52 SetHnFileNameToAllCmd(); << 53 << 54 auto maxDim = (fHnDimension < kMaxDim) ? fHn << 55 for (unsigned int idim = 0; idim < maxDim; + << 56 fSetAxisLogCmd.push_back(CreateSetAxisLogC << 57 } << 58 } 69 } 59 70 60 //____________________________________________ 71 //_____________________________________________________________________________ 61 G4HnMessenger::~G4HnMessenger() = default; << 72 G4HnMessenger::~G4HnMessenger() >> 73 { >> 74 delete fSetHnAsciiCmd; >> 75 delete fSetHnActivationCmd; >> 76 delete fSetHnActivationAllCmd; >> 77 } 62 78 63 // 79 // 64 // private functions 80 // private functions 65 // 81 // 66 82 67 //____________________________________________ 83 //_____________________________________________________________________________ 68 G4String G4HnMessenger::GetObjectType() const << 84 G4String G4HnMessenger::GetCmdDirectoryName() const 69 { 85 { 70 return (fHnType[0] == 'h') ? << 86 G4String hnType = fManager->GetHnType(); 71 fHnType.substr(1,1) + "D histogram" : << 87 hnType.toLower(); 72 fHnType.substr(1,1) + "D profile"; << 88 G4String name("/analysis/"); >> 89 name.append(hnType); >> 90 name.append("/"); >> 91 return name; 73 } 92 } 74 93 75 //____________________________________________ 94 //_____________________________________________________________________________ 76 void G4HnMessenger::AddIdParameter(G4UIcommand << 95 G4String G4HnMessenger::GetHnDescription() const 77 { 96 { 78 auto htId = new G4UIparameter("id", 'i', fal << 97 G4String hnDescription = fManager->GetHnType(); 79 htId->SetGuidance("Histogram id"); << 98 hnDescription.erase(0); 80 htId->SetParameterRange("id>=0"); << 99 hnDescription.append("D"); 81 command.SetParameter(htId); << 100 return hnDescription; 82 } << 83 << 84 //____________________________________________ << 85 void G4HnMessenger::AddOptionParameter(G4UIcom << 86 { << 87 auto param = new G4UIparameter(optionName, ' << 88 auto guidance = GetObjectType() + " " + opti << 89 param->SetGuidance(guidance.c_str()); << 90 param->SetDefaultValue("true"); << 91 command.SetParameter(param); << 92 } 101 } 93 102 94 //____________________________________________ 103 //_____________________________________________________________________________ 95 void G4HnMessenger::SetHnAsciiCmd() 104 void G4HnMessenger::SetHnAsciiCmd() 96 { 105 { 97 fSetAsciiCmd = << 106 G4String name = GetCmdDirectoryName(); 98 CreateCommand<G4UIcommand>("setAscii", "Pr << 107 name.append("setAscii"); 99 << 108 fSetHnAsciiCmd = new G4UIcmdWithAnInteger(name, this); 100 AddIdParameter(*fSetAsciiCmd); << 109 101 AddOptionParameter(*fSetAsciiCmd, "hnAscii") << 110 G4String guidance("Print "); 102 << 111 guidance.append(GetHnDescription()); >> 112 guidance.append(" histogram of #Id on ascii file."); >> 113 >> 114 fSetHnAsciiCmd->SetGuidance(guidance); >> 115 fSetHnAsciiCmd->SetParameterName("Id",false); >> 116 fSetHnAsciiCmd->SetRange("Id>=0"); >> 117 fSetHnAsciiCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 103 } 118 } 104 119 105 //____________________________________________ 120 //_____________________________________________________________________________ 106 void G4HnMessenger::SetHnActivationCmd() 121 void G4HnMessenger::SetHnActivationCmd() 107 { 122 { 108 fSetActivationCmd = << 123 G4UIparameter* hnId = new G4UIparameter("idActivation", 'i', false); 109 CreateCommand<G4UIcommand>("setActivation" << 124 hnId->SetGuidance("Histogram id"); 110 << 125 hnId->SetParameterRange("idActivation>=0"); 111 AddIdParameter(*fSetActivationCmd); << 126 112 AddOptionParameter(*fSetActivationCmd, "hnAc << 127 G4UIparameter* hnActivation = new G4UIparameter("hnActivation", 's', true); 113 } << 128 hnActivation->SetGuidance("Histogram activation"); >> 129 hnActivation->SetDefaultValue("none"); >> 130 >> 131 G4String name = GetCmdDirectoryName(); >> 132 name.append("setActivation"); >> 133 fSetHnActivationCmd = new G4UIcommand(name, this); >> 134 >> 135 G4String guidance("Set activation for the "); >> 136 guidance.append(GetHnDescription()); >> 137 guidance.append(" histogram of #Id"); >> 138 >> 139 fSetHnActivationCmd->SetGuidance(guidance); >> 140 fSetHnActivationCmd->SetParameter(hnId); >> 141 fSetHnActivationCmd->SetParameter(hnActivation); >> 142 fSetHnActivationCmd->AvailableForStates(G4State_PreInit, G4State_Idle); >> 143 } 114 144 115 //____________________________________________ 145 //_____________________________________________________________________________ 116 void G4HnMessenger::SetHnActivationToAllCmd() 146 void G4HnMessenger::SetHnActivationToAllCmd() 117 { 147 { 118 fSetActivationAllCmd = << 148 G4String name = GetCmdDirectoryName(); 119 CreateCommand<G4UIcmdWithABool>( << 149 name.append("setActivationToAll"); 120 "setActivationToAll", "Set activation to << 150 fSetHnActivationAllCmd = new G4UIcmdWithABool(name, this); 121 fSetActivationAllCmd->SetParameterName("Acti << 151 122 } << 152 G4String guidance("Set activation to all "); 123 << 153 guidance.append(GetHnDescription()); 124 //____________________________________________ << 154 guidance.append(" histograms."); 125 void G4HnMessenger::SetHnPlottingCmd() << 155 126 { << 156 fSetHnActivationAllCmd->SetGuidance(guidance); 127 fSetPlottingCmd = << 157 fSetHnActivationAllCmd->SetParameterName("Activation",false); 128 CreateCommand<G4UIcommand>("setPlotting", << 158 } 129 << 159 130 AddIdParameter(*fSetPlottingCmd); << 131 AddOptionParameter(*fSetPlottingCmd, "hnPlot << 132 } << 133 << 134 //____________________________________________ << 135 void G4HnMessenger::SetHnPlottingToAllCmd() << 136 { << 137 fSetPlottingAllCmd = << 138 CreateCommand<G4UIcmdWithABool>( << 139 "setPlottingToAll", "(In)Activate batch << 140 fSetPlottingAllCmd->SetParameterName("Plotti << 141 } << 142 << 143 //____________________________________________ << 144 void G4HnMessenger::SetHnFileNameCmd() << 145 { << 146 fSetFileNameCmd = << 147 CreateCommand<G4UIcommand>("setFileName", << 148 << 149 AddIdParameter(*fSetFileNameCmd); << 150 << 151 auto param = new G4UIparameter("hnFileName", << 152 auto guidance = GetObjectType() + " output f << 153 param->SetGuidance(guidance.c_str()); << 154 fSetFileNameCmd->SetParameter(param); << 155 } << 156 << 157 //____________________________________________ << 158 void G4HnMessenger::SetHnFileNameToAllCmd() << 159 { << 160 fSetFileNameAllCmd = << 161 CreateCommand<G4UIcmdWithAString>( << 162 "setFileNameToAll", "Set output file nam << 163 fSetFileNameAllCmd->SetParameterName("FileN << 164 } << 165 << 166 //____________________________________________ << 167 std::unique_ptr<G4UIcommand> << 168 G4HnMessenger::CreateSetAxisLogCommand(unsigne << 169 { << 170 G4String xyz{"XYZ"}; << 171 auto axis = xyz.substr(idim, 1); << 172 << 173 G4String commandName = "set" + axis + "axisL << 174 G4String guidance = "Activate " + axis + "- << 175 << 176 auto command = CreateCommand<G4UIcommand>(st << 177 command->AvailableForStates(G4State_PreInit, << 178 << 179 // Add Id parameter << 180 AddIdParameter(*command); << 181 << 182 auto parAxisLog = new G4UIparameter("axis", << 183 guidance = GetObjectType() + " " + std::move << 184 parAxisLog->SetGuidance(guidance.c_str()); << 185 command->SetParameter(parAxisLog); << 186 << 187 return command; << 188 } << 189 << 190 // 160 // 191 // public methods 161 // public methods 192 // 162 // 193 163 194 //____________________________________________ 164 //_____________________________________________________________________________ 195 void G4HnMessenger::SetNewValue(G4UIcommand* c 165 void G4HnMessenger::SetNewValue(G4UIcommand* command, G4String newValues) 196 { 166 { 197 // process "All" commands first << 167 if ( command == fSetHnAsciiCmd ) { 198 if ( command == fSetActivationAllCmd.get() ) << 168 G4int id = fSetHnAsciiCmd->GetNewIntValue(newValues); 199 fManager.SetActivation(fSetActivationAllCm << 169 fManager->SetAscii(id, true); 200 return; << 170 } 201 } << 171 else if ( command == fSetHnActivationCmd ) { 202 << 172 // tokenize parameters in a vector 203 if ( command == fSetPlottingAllCmd.get() ) { << 173 std::vector<G4String> parameters; 204 fManager.SetPlotting(fSetPlottingAllCmd->G << 174 G4Analysis::Tokenize(newValues, parameters); 205 return; << 175 // check consistency 206 } << 176 if ( G4int(parameters.size()) == command->GetParameterEntries() ) { 207 << 177 G4int counter = 0; 208 if ( command == fSetFileNameAllCmd.get() ) { << 178 G4int id = G4UIcommand::ConvertToInt(parameters[counter++]); 209 fManager.SetFileName(newValues); << 179 G4bool activation = G4UIcommand::ConvertToBool(parameters[counter++]); 210 return; << 180 fManager->SetActivation(id, activation); 211 } << 212 << 213 // Tokenize parameters in a vector << 214 std::vector<G4String> parameters; << 215 G4Analysis::Tokenize(newValues, parameters); << 216 // check consistency << 217 if ( parameters.size() != command->GetParame << 218 // Should never happen but let's check any << 219 G4Analysis::Warn( << 220 "Got wrong number of \"" + command->GetC << 221 "\" parameters: " + std::to_string(param << 222 " instead of " + std::to_string(command- << 223 fkClass, "WarnAboutParameters"); << 224 return; << 225 } << 226 << 227 auto counter = 0; << 228 auto id = G4UIcommand::ConvertToInt(paramete << 229 << 230 if ( command == fSetAsciiCmd.get() ) { << 231 fManager.SetAscii(id, G4UIcommand::Convert << 232 return; << 233 } << 234 << 235 if ( command == fSetActivationCmd.get() ) { << 236 fManager.SetActivation(id, G4UIcommand::Co << 237 return; << 238 } << 239 << 240 if ( command == fSetPlottingCmd.get() ) { << 241 fManager.SetPlotting(id, G4UIcommand::Conv << 242 return; << 243 } << 244 << 245 if ( command == fSetFileNameCmd.get() ) { << 246 fManager.SetFileName(id, parameters[counte << 247 return; << 248 } << 249 << 250 auto maxDim = (fHnDimension < kMaxDim) ? fHn << 251 for (unsigned int idim = 0; idim < maxDim; + << 252 if ( command == fSetAxisLogCmd[idim].get() << 253 auto axisLog = G4UIcommand::ConvertToBoo << 254 fManager.SetAxisIsLog(idim, id, axisLog) << 255 return; << 256 } 181 } 257 } << 182 else { 258 } << 183 // Should never happen but let's check anyway for consistency >> 184 Exception(command, parameters.size()); >> 185 } >> 186 } >> 187 else if ( command == fSetHnActivationAllCmd ) { >> 188 G4bool activation = fSetHnActivationAllCmd->GetNewBoolValue(newValues); >> 189 fManager->SetActivation(activation); >> 190 } >> 191 } 259 192