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