Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4NtupleBookingManager.cc
Go to the documentation of this file.
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
27// Author: Ivana Hrivnacova, 01/09/2020 ([email protected])
28
32
33using namespace G4Analysis;
34using std::to_string;
35
36//
37// private template functions
38//
39
40//_____________________________________________________________________________
45
46//_____________________________________________________________________________
48{
49 for ( auto ntupleBooking : fNtupleBookingVector ) {
50 delete ntupleBooking;
51 }
52}
53
54//_____________________________________________________________________________
56G4NtupleBookingManager::GetNtupleBookingInFunction(
57 G4int id, std::string_view functionName, G4bool warn) const
58{
59 auto index = id - fFirstId;
60 if ( index < 0 || index >= G4int(fNtupleBookingVector.size()) ) {
61 if ( warn) {
62 Warn("Ntuple booking " + to_string(id) + " does not exist.",
63 fkClass, functionName);
64 }
65 return nullptr;
66 }
67
68 return fNtupleBookingVector[index];
69}
70
71//_____________________________________________________________________________
72G4bool G4NtupleBookingManager::CheckName(
73 const G4String& name, const G4String& objectType) const
74{
75 if (name.size() == 0u) {
76 Warn("Empty " + objectType + " name is not allowed.\n" +
77 objectType + " was not created.", fkClass, "CheckName");
78 return false;
79 }
80 return true;
81}
82
83//
84// protected functions
85//
86
87//_____________________________________________________________________________
89{
90 return fNtupleBookingVector.size() == 0u;
91}
92
93//_____________________________________________________________________________
95 const G4String& name, const G4String& title)
96{
97 if ( ! CheckName(name, "Ntuple") ) return kInvalidId;
98
99 Message(kVL4, "create", "ntuple booking", name);
100
101 G4int index = 0;
102 G4NtupleBooking* ntupleBooking = nullptr;
103 if (fFreeIds.empty()) {
104 index = (G4int)fNtupleBookingVector.size();
105 ntupleBooking = new G4NtupleBooking();
106 fNtupleBookingVector.push_back(ntupleBooking);
107 ntupleBooking->fNtupleId = G4int(index + fFirstId);
108 }
109 else {
110 // Get the first freed Id
111 index = *(fFreeIds.begin()) - GetFirstId();
112 ntupleBooking = fNtupleBookingVector[index];
113 ntupleBooking->fNtupleBooking = tools::ntuple_booking();
114 ntupleBooking->Reset();
115
116 // Remove the id from the set
117 fFreeIds.erase(fFreeIds.begin());
118 }
119
120 // Save name & title in ntuple booking
121 ntupleBooking->fNtupleBooking.set_name(name);
122 ntupleBooking->fNtupleBooking.set_title(title);
123
124 // Update related data
125 fLockFirstId = true;
126 fCurrentNtupleId = ntupleBooking->fNtupleId;
127
128 Message(kVL2, "create", "ntuple booking",
129 name + " ntupleId " + to_string(ntupleBooking->fNtupleId));
130
131 return fCurrentNtupleId;
132}
133
134//_____________________________________________________________________________
136 std::vector<int>* vector)
137{
138 return CreateNtupleIColumn(GetCurrentNtupleId(), name, vector);
139}
140
141//_____________________________________________________________________________
143 std::vector<float>* vector)
144{
145 return CreateNtupleFColumn(GetCurrentNtupleId(), name, vector);
146}
147
148//_____________________________________________________________________________
150 std::vector<double>* vector)
151{
152 return CreateNtupleDColumn(GetCurrentNtupleId(), name, vector);
153}
154
155//_____________________________________________________________________________
157 std::vector<std::string>* vector)
158{
159 return CreateNtupleSColumn(GetCurrentNtupleId(), name, vector);
160}
161
162//_____________________________________________________________________________
164{
165 return FinishNtuple(GetCurrentNtupleId());
166}
167
168//_____________________________________________________________________________
170 G4int ntupleId, const G4String& name, std::vector<int>* vector)
171{
172 return CreateNtupleTColumn<int>(ntupleId, name, vector);
173}
174
175//_____________________________________________________________________________
177 G4int ntupleId, const G4String& name, std::vector<float>* vector)
178{
179 return CreateNtupleTColumn<float>(ntupleId, name, vector);
180}
181
182//_____________________________________________________________________________
184 G4int ntupleId, const G4String& name, std::vector<double>* vector)
185{
186 return CreateNtupleTColumn<double>(ntupleId, name, vector);
187}
188
189//_____________________________________________________________________________
191 G4int ntupleId, const G4String& name, std::vector<std::string>* vector)
192{
193 return CreateNtupleTColumn<std::string>(ntupleId, name, vector);
194}
195
196//_____________________________________________________________________________
198 G4int ntupleId)
199{
200 // Nothing to be done for booking,
201 return GetNtupleBookingInFunction(ntupleId, "FinishNtuple");
202}
203
204//_____________________________________________________________________________
206{
207 if ( fLockFirstNtupleColumnId ) {
208 Warn("Cannot set FirstNtupleColumnId as its value was already used.",
209 fkClass, "SetFirstNtupleColumnId");
210 return false;
211 }
212
213 fFirstNtupleColumnId = firstId;
214 return true;
215}
216
217//_____________________________________________________________________________
219 G4bool activation)
220{
221 for ( auto ntupleBooking : fNtupleBookingVector ) {
222 ntupleBooking->fActivation = activation;
223 }
224}
225
226//_____________________________________________________________________________
228 G4int ntupleId, G4bool activation)
229{
230 auto ntupleBooking
231 = GetNtupleBookingInFunction(ntupleId, "SetActivation");
232 if (ntupleBooking == nullptr) return;
233
234 ntupleBooking->fActivation = activation;
235}
236
237//_____________________________________________________________________________
239 G4int ntupleId) const
240{
241 auto ntupleBooking
242 = GetNtupleBookingInFunction(ntupleId, "GetActivation");
243 if (ntupleBooking == nullptr) return false;
244
245 return ntupleBooking->fActivation;
246}
247
248//_____________________________________________________________________________
250 const G4String& fileName)
251{
252 for ( auto ntupleBooking : fNtupleBookingVector ) {
253 ntupleBooking->fFileName = fileName;
254 }
255}
256
257//_____________________________________________________________________________
259 G4int ntupleId, const G4String& fileName)
260{
261 auto ntupleBooking
262 = GetNtupleBookingInFunction(ntupleId, "SetFileName");
263 if (ntupleBooking == nullptr) return;
264
265 // Do nothing if file name does not change
266 if ( ntupleBooking->fFileName == fileName ) return;
267
268 auto ntupleFileName = fileName;
269 auto extension = GetExtension(fileName);
270 if (extension.size() != 0u) {
271 // Check if valid extension (if present)
272 auto output = G4Analysis::GetOutput(extension);
273 if ( output == G4AnalysisOutput::kNone ) {
274 Warn("The file extension " + extension + " is not supported.",
275 fkClass, "SetFileName");
276 return;
277 }
278 }
279 else {
280 if (fFileType.size() != 0u) {
281 //add extension if missing and file type is defined
282 ntupleFileName = fileName + "." + fFileType;
283 }
284 }
285
286 // Save the fileName in booking
287 // If extension is still missing (possible with generic manager),
288 // it will be completed with the default one at OpenFile
289 ntupleBooking->fFileName = ntupleFileName;
290}
291
292//_____________________________________________________________________________
294 G4int ntupleId) const
295{
296 auto ntupleBooking
297 = GetNtupleBookingInFunction(ntupleId, "GetFileName");
298 if (ntupleBooking == nullptr) return "";
299
300 return ntupleBooking->fFileName;
301}
302
303//_____________________________________________________________________________
305{
306 for ( auto ntupleBooking : fNtupleBookingVector ) {
307 delete ntupleBooking;
308 }
309 fNtupleBookingVector.clear();
310 fLockFirstNtupleColumnId = false;
311
312 Message(G4Analysis::kVL2, "clear", "ntupleBookings");
313}
314
315//_____________________________________________________________________________
317{
318 Message(kVL4, "delete", "ntuple booking ntupleId " + to_string(id));
319
320 auto ntupleBooking = GetNtupleBookingInFunction(id, "Delete", true);
321
322 if (ntupleBooking == nullptr) return false;
323
324 // Update ntuple booking
325 ntupleBooking->SetDeleted(true, keepSetting);
326
327 // Register freed Id
328 fFreeIds.insert(id);
329
330 Message(G4Analysis::kVL2, "delete", "ntuple booking ntupleId " + to_string(id));
331
332 return true;
333}
334
335//_____________________________________________________________________________
336G4bool G4NtupleBookingManager::List(std::ostream& output, G4bool onlyIfActive)
337{
338 // Save current output stream formatting
339 std::ios_base::fmtflags outputFlags(output.flags() );
340
341 // Define optimal field widths
342 size_t maxNameLength = 0;
343 size_t maxTitleLength = 0;
344 // size_t maxEntries = 0;
345 size_t nofActive = 0;
346 for (auto g4NtupleBooking : fNtupleBookingVector) {
347 const auto& ntupleBooking = g4NtupleBooking->fNtupleBooking;
348 if (ntupleBooking.name().length() > maxNameLength) {
349 maxNameLength = ntupleBooking.name().length();
350 }
351 if (ntupleBooking.title().length() > maxTitleLength) {
352 maxTitleLength = ntupleBooking.title().length();
353 }
354 // if (ntuple->entries() > maxEntries) {
355 // maxEntries = ntuple->entries();
356 // }
357 if (g4NtupleBooking->fActivation) {
358 ++nofActive;
359 }
360 }
361 size_t maxIdWidth = std::to_string(fNtupleBookingVector.size() + GetFirstId()).length();
362 // update strings width for added double quotas
363 maxNameLength += 2;
364 maxTitleLength += 2;
365
366 // List general info
367 output << "Ntuple: " << nofActive << " active ";
368 if (! onlyIfActive) {
369 output << " of " << GetNofNtuples(true) << " defined ";
370 }
371 output << G4endl;
372
373 // List objects
374 G4int counter = 0;
375 for (auto g4NtupleBooking : fNtupleBookingVector) {
376 const auto& ntupleBooking = g4NtupleBooking->fNtupleBooking;
377
378 // skip inactivated objcets
379 if (fState.GetIsActivation() && onlyIfActive && (! g4NtupleBooking->fActivation)) continue;
380
381 // print selected info
382 output << " id: " << std::setw((G4int)maxIdWidth) << GetFirstId() + counter++
383 << " name: \"" << std::setw((G4int)maxNameLength) << std::left << ntupleBooking.name() + "\""
384 << " title: \"" << std::setw((G4int)maxTitleLength) << std::left << ntupleBooking.title() + "\"";
385 // << " entries: " << std::setw((G4int)maxEntriesWidth) << ntuple->entries();
386 if (! onlyIfActive) {
387 output << " active: " << std::boolalpha << g4NtupleBooking->fActivation;
388 }
389 output << G4endl;
390 }
391
392 // Restore the output stream formatting
393 output.flags(outputFlags);
394
395 return output.good();
396}
397
398//
399// public methods
400//
401
402//_____________________________________________________________________________
404{
405 // do nothing if file type is defined and is same
406 if ( fFileType == fileType ) return;
407
408 // save the type
409 fFileType = fileType;
410
411 // Give warning and redefine file extension in bookings
412 // with file name of different fileTypes
413 for ( auto ntupleBooking : fNtupleBookingVector ) {
414 if ((ntupleBooking->fFileName).size() == 0u) continue;
415
416 auto extension = GetExtension(ntupleBooking->fFileName);
417 if ( fFileType == extension ) continue;
418
419 // multiple file types are not suported
420 auto baseFileName = GetBaseName(ntupleBooking->fFileName);
421 auto ntupleFileName = baseFileName + "." + fFileType;
422 if (extension.size() != 0u) {
423 Warn("Writing ntuples in files of different output types " +
424 fFileType + ", " + extension + " is not supported.",
425 fkClass, "SetFileType");
426 }
427
428 // Save the info in ntuple description
429 ntupleBooking->fFileName = ntupleFileName;
430 }
431}
432
433//_____________________________________________________________________________
435 G4bool warn, G4bool onlyIfActive) const
436{
437 return GetNtuple(fFirstId, warn, onlyIfActive);
438}
439
440//_____________________________________________________________________________
442 G4int ntupleId, G4bool warn, G4bool onlyIfActive) const
443{
444 auto g4Booking = GetNtupleBookingInFunction(ntupleId, "GetNtuple", warn);
445
446 if (g4Booking == nullptr) return nullptr;
447
448 if ( ( g4Booking->GetDeleted() ) ||
449 ( onlyIfActive && (! g4Booking->fActivation) ) ) return nullptr;
450
451 return &(g4Booking->fNtupleBooking);
452}
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
void Message(G4int level, const G4String &action, const G4String &objectType, const G4String &objectName="", G4bool success=true) const
const G4AnalysisManagerState & fState
G4bool GetActivation(G4int ntupleId) const
G4bool SetFirstNtupleColumnId(G4int firstId)
std::vector< G4NtupleBooking * > fNtupleBookingVector
G4int GetNofNtuples(G4bool onlyIfExist=false) const
G4String GetFileName(G4int id) const
G4int CreateNtupleSColumn(const G4String &name, std::vector< std::string > *vector)
G4bool Delete(G4int id, G4bool keepSetting)
G4int CreateNtupleDColumn(const G4String &name, std::vector< double > *vector)
G4int CreateNtuple(const G4String &name, const G4String &title)
G4int CreateNtupleFColumn(const G4String &name, std::vector< float > *vector)
G4NtupleBookingManager()=delete
void SetFileName(const G4String &fileName)
G4bool List(std::ostream &output, G4bool onlyIfActive=true)
tools::ntuple_booking * GetNtuple(G4bool warn, G4bool onlyIfActive) const
G4int CreateNtupleIColumn(const G4String &name, std::vector< int > *vector)
void SetFileType(const G4String &fileType)
void SetActivation(G4bool activation)
G4String GetExtension(const G4String &fileName, const G4String &defaultExtension="")
constexpr G4int kVL2
G4AnalysisOutput GetOutput(const G4String &outputName, G4bool warn=true)
constexpr G4int kVL4
constexpr G4int kInvalidId
G4String GetBaseName(const G4String &fileName)
void Warn(const G4String &message, const std::string_view inClass, const std::string_view inFunction)
const char * name(G4int ptype)
tools::ntuple_booking fNtupleBooking