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 // Author: Ivana Hrivnacova, 05/05/2015 (ivan 27 // Author: Ivana Hrivnacova, 05/05/2015 (ivana@ipno.in2p3.fr) 28 28 29 #include "G4NtupleMessenger.hh" 29 #include "G4NtupleMessenger.hh" 30 #include "G4VAnalysisManager.hh" 30 #include "G4VAnalysisManager.hh" 31 #include "G4AnalysisUtilities.hh" 31 #include "G4AnalysisUtilities.hh" 32 32 33 #include "G4UIcommand.hh" 33 #include "G4UIcommand.hh" 34 #include "G4UIparameter.hh" 34 #include "G4UIparameter.hh" 35 #include "G4UIcmdWithABool.hh" 35 #include "G4UIcmdWithABool.hh" 36 #include "G4UIcmdWithAString.hh" 36 #include "G4UIcmdWithAString.hh" 37 #include "G4UIcmdWithoutParameter.hh" << 37 >> 38 #include <iostream> 38 39 39 using namespace G4Analysis; 40 using namespace G4Analysis; 40 using std::to_string; << 41 >> 42 namespace { >> 43 >> 44 void WrongParametersException( >> 45 const G4String& commandName, std::size_t got, std::size_t expected) >> 46 { >> 47 G4ExceptionDescription description; >> 48 description >> 49 << "Got wrong number of \"" << commandName >> 50 << "\" parameters: " << got << " instead of " << expected >> 51 << " expected" << G4endl; >> 52 G4Exception("G4NtupleMessenger::SetNewValue", >> 53 "Analysis_W013", JustWarning, description); >> 54 } >> 55 >> 56 } 41 57 42 //____________________________________________ 58 //_____________________________________________________________________________ 43 G4NtupleMessenger::G4NtupleMessenger(G4VAnalys 59 G4NtupleMessenger::G4NtupleMessenger(G4VAnalysisManager* manager) 44 : fManager(manager) << 60 : G4UImessenger(), >> 61 fManager(manager), >> 62 fSetActivationCmd(nullptr), >> 63 fSetActivationAllCmd(nullptr), >> 64 fSetFileNameCmd(nullptr), >> 65 fSetFileNameAllCmd(nullptr) 45 { 66 { 46 fNtupleDir = std::make_unique<G4UIdirectory> << 67 fNtupleDir = G4Analysis::make_unique<G4UIdirectory>("/analysis/ntuple/"); 47 fNtupleDir->SetGuidance("ntuple control"); 68 fNtupleDir->SetGuidance("ntuple control"); 48 << 69 49 CreateCmd(); << 50 CreateColumnCmds(); << 51 FinishCmd(); << 52 DeleteCmd(); << 53 SetActivationCmd(); 70 SetActivationCmd(); 54 SetActivationToAllCmd(); 71 SetActivationToAllCmd(); 55 SetFileNameCmd(); 72 SetFileNameCmd(); 56 SetFileNameToAllCmd(); 73 SetFileNameToAllCmd(); 57 ListCmd(); << 58 } 74 } 59 75 60 //____________________________________________ 76 //_____________________________________________________________________________ 61 G4NtupleMessenger::~G4NtupleMessenger() = defa << 77 G4NtupleMessenger::~G4NtupleMessenger() >> 78 { >> 79 } 62 80 63 // 81 // 64 // private functions << 82 // public functions 65 // 83 // 66 84 67 //____________________________________________ 85 //_____________________________________________________________________________ 68 void G4NtupleMessenger::AddIdParameter(G4UIcom << 86 void G4NtupleMessenger::SetActivationCmd() 69 { 87 { 70 auto ntupleId = new G4UIparameter("NtupleId" 88 auto ntupleId = new G4UIparameter("NtupleId", 'i', false); 71 ntupleId->SetGuidance("Ntuple id"); 89 ntupleId->SetGuidance("Ntuple id"); 72 ntupleId->SetParameterRange("NtupleId>=0"); 90 ntupleId->SetParameterRange("NtupleId>=0"); 73 91 74 command.SetParameter(ntupleId); << 92 auto ntupleActivation = new G4UIparameter("NtupleActivation", 's', true); 75 } << 93 ntupleActivation->SetGuidance("Ntuple activation"); 76 << 94 ntupleActivation->SetDefaultValue("none"); 77 //____________________________________________ << 78 void G4NtupleMessenger::CreateCmd() << 79 { << 80 fCreateCmd = CreateCommand<G4UIcommand>("cre << 81 << 82 auto ntName = new G4UIparameter("name", 's', << 83 ntName->SetGuidance("Ntuple name"); << 84 fCreateCmd->SetParameter(ntName); << 85 << 86 auto ntTitle = new G4UIparameter("title", 's << 87 ntTitle->SetGuidance("Ntuple title"); << 88 fCreateCmd->SetParameter(ntTitle); << 89 } << 90 << 91 //____________________________________________ << 92 void G4NtupleMessenger::CreateColumnCmds() << 93 { << 94 std::vector<char> colTypes = {'I', 'F', 'D', << 95 << 96 for (auto colType : colTypes ) { << 97 G4String name = "createColumn"; << 98 G4String guidance = "Create ntuple column << 99 name.insert(6, 1, colType); << 100 guidance.insert(7, 1, colType); << 101 auto cmd = CreateCommand<G4UIcmdWithAStrin << 102 fCreateColumnCmds[colType] = std::move(cmd << 103 } << 104 } << 105 << 106 //____________________________________________ << 107 void G4NtupleMessenger::FinishCmd() << 108 { << 109 fFinishCmd = CreateCommand<G4UIcmdWithoutPar << 110 "finish", "Finish creating ntuple"); << 111 } << 112 << 113 //____________________________________________ << 114 void G4NtupleMessenger::DeleteCmd() << 115 { << 116 fDeleteCmd = CreateCommand<G4UIcommand>( << 117 "delete", "Delete ntuple with given id"); << 118 << 119 // Add Id parameter << 120 AddIdParameter(*fDeleteCmd); << 121 << 122 auto parKeepSetting = new G4UIparameter("kee << 123 G4String guidance = << 124 "If set true, activation, file name, etc. << 125 "and applied when a new object with the sa << 126 parKeepSetting->SetGuidance(guidance.c_str() << 127 parKeepSetting->SetDefaultValue("false"); << 128 fDeleteCmd->SetParameter(parKeepSetting); << 129 } << 130 << 131 //____________________________________________ << 132 void G4NtupleMessenger::SetActivationCmd() << 133 { << 134 fSetActivationCmd = CreateCommand<G4UIcomman << 135 "setActivation", "Set activation for the n << 136 95 137 AddIdParameter(*fSetActivationCmd); << 96 fSetActivationCmd = G4Analysis::make_unique<G4UIcommand>("/analysis/ntuple/setActivation", this); >> 97 G4String guidance("Set activation for the ntuple of given id"); 138 98 139 auto ntupleActivation = new G4UIparameter("N << 99 fSetActivationCmd->SetGuidance(guidance); 140 ntupleActivation->SetGuidance("Ntuple activa << 100 fSetActivationCmd->SetParameter(ntupleId); 141 ntupleActivation->SetDefaultValue(true); << 142 fSetActivationCmd->SetParameter(ntupleActiva 101 fSetActivationCmd->SetParameter(ntupleActivation); 143 } << 102 fSetActivationCmd->AvailableForStates(G4State_PreInit, G4State_Idle); >> 103 } 144 104 145 //____________________________________________ 105 //_____________________________________________________________________________ 146 void G4NtupleMessenger::SetActivationToAllCmd( 106 void G4NtupleMessenger::SetActivationToAllCmd() 147 { 107 { 148 fSetActivationAllCmd = CreateCommand<G4UIcmd << 108 fSetActivationAllCmd 149 "setActivationToAll", "Set activation to a << 109 = G4Analysis::make_unique<G4UIcmdWithABool>("/analysis/ntuple/setActivationToAll", this); >> 110 G4String guidance("Set activation to all ntuples"); >> 111 fSetActivationAllCmd->SetGuidance(guidance); 150 fSetActivationAllCmd->SetParameterName("AllN 112 fSetActivationAllCmd->SetParameterName("AllNtupleActivation",false); 151 } << 113 } 152 << 114 153 //____________________________________________ 115 //_____________________________________________________________________________ 154 void G4NtupleMessenger::SetFileNameCmd() 116 void G4NtupleMessenger::SetFileNameCmd() 155 { 117 { 156 fSetFileNameCmd = CreateCommand<G4UIcommand> << 118 auto ntupleId = new G4UIparameter("NtupleId", 'i', false); 157 "setFileName", "Set file name for the ntup << 119 ntupleId->SetGuidance("Ntuple id"); 158 << 120 ntupleId->SetParameterRange("NtupleId>=0"); 159 AddIdParameter(*fSetFileNameCmd); << 160 121 161 auto ntupleFileName = new G4UIparameter("Ntu << 122 auto ntupleFileName = new G4UIparameter("NtupleFileName", 's', true); 162 ntupleFileName->SetGuidance("Ntuple file nam 123 ntupleFileName->SetGuidance("Ntuple file name"); >> 124 ntupleFileName->SetDefaultValue("none"); >> 125 >> 126 fSetFileNameCmd = G4Analysis::make_unique<G4UIcommand>("/analysis/ntuple/setFileName", this); >> 127 G4String guidance("Set file name for the ntuple of given id"); >> 128 >> 129 fSetFileNameCmd->SetGuidance(guidance); >> 130 fSetFileNameCmd->SetParameter(ntupleId); 163 fSetFileNameCmd->SetParameter(ntupleFileName 131 fSetFileNameCmd->SetParameter(ntupleFileName); >> 132 fSetFileNameCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 164 } 133 } 165 134 166 //____________________________________________ 135 //_____________________________________________________________________________ 167 void G4NtupleMessenger::SetFileNameToAllCmd() 136 void G4NtupleMessenger::SetFileNameToAllCmd() 168 { 137 { 169 fSetFileNameAllCmd = CreateCommand<G4UIcmdWi << 138 fSetFileNameAllCmd 170 "setFileNameToAll", "Set file name to all << 139 = G4Analysis::make_unique<G4UIcmdWithAString>("/analysis/ntuple/setFileNameToAll", this); >> 140 G4String guidance("Set file name to all ntuples"); >> 141 fSetFileNameAllCmd->SetGuidance(guidance); 171 fSetFileNameAllCmd->SetParameterName("AllNtu 142 fSetFileNameAllCmd->SetParameterName("AllNtupleFileName",false); 172 } 143 } 173 144 174 //____________________________________________ << 175 void G4NtupleMessenger::ListCmd() << 176 { << 177 fListCmd = CreateCommand<G4UIcommand>("list" << 178 fListCmd->AvailableForStates(G4State_Idle, G << 179 << 180 auto parOnlyIfActive = new G4UIparameter("on << 181 parOnlyIfActive->SetGuidance("Option whether << 182 parOnlyIfActive->SetDefaultValue("true"); << 183 fListCmd->SetParameter(parOnlyIfActive); << 184 } << 185 << 186 // 145 // 187 // public methods 146 // public methods 188 // 147 // 189 148 190 //____________________________________________ 149 //_____________________________________________________________________________ 191 void G4NtupleMessenger::SetNewValue(G4UIcomman 150 void G4NtupleMessenger::SetNewValue(G4UIcommand* command, G4String newValues) 192 { 151 { 193 // process "All" commands first << 194 << 195 if ( command == fSetActivationAllCmd.get() ) << 196 fManager->SetActivation(fSetActivationAllC << 197 return; << 198 } << 199 << 200 if ( command == fSetFileNameAllCmd.get() ) { << 201 fManager->SetFileName(newValues); << 202 return; << 203 } << 204 << 205 // Tokenize parameters in a vector << 206 std::vector<G4String> parameters; << 207 G4Analysis::Tokenize(newValues, parameters); << 208 // check consistency << 209 if ( parameters.size() != command->GetParame << 210 // Should never happen but let's check any << 211 G4Analysis::Warn( << 212 "Got wrong number of \"" + command->GetC << 213 "\" parameters: " + std::to_string(param << 214 " instead of " + std::to_string(command- << 215 fkClass, "WarnAboutParameters"); << 216 return; << 217 } << 218 << 219 auto counter = 0; << 220 << 221 // commands without Id parameter << 222 << 223 if ( command == fCreateCmd.get() ) { << 224 const auto& name = parameters[counter++]; << 225 const auto& title = parameters[counter++]; << 226 fTmpNtupleId = fManager->CreateNtuple(name << 227 return; << 228 } << 229 << 230 for (const auto& [colType, checkCommand] : f << 231 if ( command == checkCommand.get() ) { << 232 const auto& name = parameters[counter++] << 233 switch (colType) { << 234 case 'I': << 235 fManager->CreateNtupleIColumn(fTmpNt << 236 return; << 237 case 'F': << 238 fManager->CreateNtupleFColumn(fTmpNt << 239 return; << 240 case 'D': << 241 fManager->CreateNtupleDColumn(fTmpNt << 242 return; << 243 case 'S': << 244 fManager->CreateNtupleSColumn(fTmpNt << 245 return; << 246 default: << 247 return; << 248 } << 249 } << 250 } << 251 << 252 if ( command == fFinishCmd.get() ) { << 253 fManager->FinishNtuple(fTmpNtupleId); << 254 fTmpNtupleId = G4Analysis::kInvalidId; << 255 return; << 256 } << 257 << 258 // commands with Id parameter << 259 << 260 auto id = G4UIcommand::ConvertToInt(paramete << 261 << 262 if ( command == fDeleteCmd.get() ) { << 263 const auto& keepSetting = G4UIcommand::Con << 264 fManager->DeleteNtuple(id, keepSetting); << 265 return; << 266 } << 267 << 268 if ( command == fSetActivationCmd.get() ) { 152 if ( command == fSetActivationCmd.get() ) { 269 fManager->SetNtupleActivation(id, G4UIcomm << 153 // tokenize parameters in a vector 270 return; << 154 std::vector<G4String> parameters; 271 } << 155 G4Analysis::Tokenize(newValues, parameters); 272 << 156 // check consistency 273 if ( command == fSetFileNameCmd.get() ) { << 157 if ( parameters.size() == command->GetParameterEntries() ) { 274 fManager->SetNtupleFileName(id, parameters << 158 auto counter = 0; 275 return; << 159 auto id = G4UIcommand::ConvertToInt(parameters[counter++]); >> 160 auto activation = G4UIcommand::ConvertToBool(parameters[counter++]); >> 161 fManager->SetNtupleActivation(id, activation); >> 162 } >> 163 else { >> 164 // Should never happen but let's check anyway for consistency >> 165 WrongParametersException(command->GetCommandName(), >> 166 parameters.size(),command->GetParameterEntries()); >> 167 } >> 168 } >> 169 else if ( command == fSetActivationAllCmd.get() ) { >> 170 auto activation = fSetActivationAllCmd->GetNewBoolValue(newValues); >> 171 fManager->SetNtupleActivation(activation); >> 172 } >> 173 else if ( command == fSetFileNameCmd.get() ) { >> 174 // tokenize parameters in a vector >> 175 std::vector<G4String> parameters; >> 176 G4Analysis::Tokenize(newValues, parameters); >> 177 // check consistency >> 178 if ( parameters.size() == command->GetParameterEntries() ) { >> 179 auto counter = 0; >> 180 auto id = G4UIcommand::ConvertToInt(parameters[counter++]); >> 181 auto fileName = parameters[counter++]; >> 182 fManager->SetNtupleFileName(id, fileName); >> 183 } >> 184 else { >> 185 // Should never happen but let's check anyway for consistency >> 186 WrongParametersException(command->GetCommandName(), >> 187 parameters.size(),command->GetParameterEntries()); >> 188 } 276 } 189 } 277 << 190 else if ( command == fSetFileNameAllCmd.get() ) { 278 if ( command == fListCmd.get() ) { << 191 auto fileName = newValues; 279 const auto& onlyIfActive = G4UIcommand::Co << 192 fManager->SetNtupleFileName(fileName); 280 fManager->ListNtuple(onlyIfActive); << 281 return; << 282 } 193 } 283 } 194 } 284 195