Geant4  10.00.p03
G4XmlNtupleManager.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 // $Id: G4XmlNtupleManager.cc 70604 2013-06-03 11:27:06Z ihrivnac $
27 
28 // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr)
29 
30 #include "G4XmlNtupleManager.hh"
32 #include "G4XmlFileManager.hh"
34 #include "G4UnitsTable.hh"
35 
36 #include "tools/ntuple_booking"
37 
38 #include <iostream>
39 #include <cstdio>
40 
41 //_____________________________________________________________________________
43  : G4VNtupleManager(state),
44  fFileManager(0),
45  fNtupleVector()
46 {
47 }
48 
49 //_____________________________________________________________________________
51 {
52  std::vector<G4XmlNtupleDescription*>::iterator it;
53  for (it = fNtupleVector.begin(); it != fNtupleVector.end(); it++ ) {
54  delete (*it);
55  }
56 }
57 
58 //
59 // private methods
60 //
61 
62 //_____________________________________________________________________________
63 tools::waxml::ntuple::column<int>*
65 {
66  G4XmlNtupleDescription* ntupleDecription
67  = GetNtupleInFunction(ntupleId, "GetNtupleIColumn");
68  if ( ! ntupleDecription ) return 0;
69 
70  std::map<G4int, tools::waxml::ntuple::column<int>* >& ntupleIColumnMap
71  = ntupleDecription->fNtupleIColumnMap;
72  std::map<G4int, tools::waxml::ntuple::column<int>* >::const_iterator it
73  = ntupleIColumnMap.find(columnId);
74  if ( it == ntupleIColumnMap.end() ) {
75  G4ExceptionDescription description;
76  description << " " << "ntupleId " << ntupleId
77  << " columnId " << columnId << " does not exist.";
78  G4Exception("G4XmlNtupleManager::GetNtupleIColumn()",
79  "Analysis_W009", JustWarning, description);
80  return 0;
81  }
82 
83  return it->second;
84 }
85 
86 //_____________________________________________________________________________
87 tools::waxml::ntuple::column<float>*
89 {
90  G4XmlNtupleDescription* ntupleDecription
91  = GetNtupleInFunction(ntupleId, "GetNtupleFColumn");
92  if ( ! ntupleDecription ) return 0;
93 
94  std::map<G4int, tools::waxml::ntuple::column<float>* >& ntupleFColumnMap
95  = ntupleDecription->fNtupleFColumnMap;
96  std::map<G4int, tools::waxml::ntuple::column<float>* >::const_iterator it
97  = ntupleFColumnMap.find(columnId);
98  if ( it == ntupleFColumnMap.end() ) {
99  G4ExceptionDescription description;
100  description << " " << "ntupleId " << ntupleId
101  << " columnId " << columnId << " does not exist.";
102  G4Exception("G4XmlNtupleManager::GetNtupleFColumn()",
103  "Analysis_W009", JustWarning, description);
104  return 0;
105  }
106 
107  return it->second;
108 }
109 
110 //_____________________________________________________________________________
111 tools::waxml::ntuple::column<double>*
113 {
114  G4XmlNtupleDescription* ntupleDecription
115  = GetNtupleInFunction(ntupleId, "GetNtupleDColumn");
116  if ( ! ntupleDecription ) return 0;
117 
118  std::map<G4int, tools::waxml::ntuple::column<double>* >& ntupleDColumnMap
119  = ntupleDecription->fNtupleDColumnMap;
120  std::map<G4int, tools::waxml::ntuple::column<double>* >::const_iterator it
121  = ntupleDColumnMap.find(columnId);
122  if ( it == ntupleDColumnMap.end() ) {
123  G4ExceptionDescription description;
124  description << " " << "ntupleId " << ntupleId
125  << " columnId " << columnId << " does not exist.";
126  G4Exception("G4XmlNtupleManager::GetNtupleFColumn()",
127  "Analysis_W009", JustWarning, description);
128  return 0;
129  }
130 
131  return it->second;
132 }
133 
134 //_____________________________________________________________________________
136  G4String functionName, G4bool warn,
137  G4bool /*onlyIfActive*/) const
138 {
139  G4int index = id - fFirstId;
140  if ( index < 0 || index >= G4int(fNtupleVector.size()) ) {
141  if ( warn) {
142  G4String inFunction = "G4XmlNtupleManager::";
143  inFunction += functionName;
144  G4ExceptionDescription description;
145  description << " " << "ntuple " << id << " does not exist.";
146  G4Exception(inFunction, "Analysis_W007", JustWarning, description);
147  }
148  return 0;
149  }
150 
151  return fNtupleVector[index];
152 }
153 
154 //
155 // protected methods
156 //
157 
158 //_____________________________________________________________________________
160 {
161 // Create ntuple from ntuple_booking.
162 
163  // Do not create ntuples on master thread
164  if ( G4AnalysisManagerState::IsMT() && fState.GetIsMaster() ) return;
165 
166  std::vector<G4XmlNtupleDescription*>::iterator itn;
167  for (itn = fNtupleVector.begin(); itn != fNtupleVector.end(); itn++ ) {
168 
169  tools::ntuple_booking* ntupleBooking = (*itn)->fNtupleBooking;
170  if ( ! ntupleBooking ) continue;
171 
172 // Create ntuple from ntuple_booking.
173 #ifdef G4VERBOSE
174  if ( fState.GetVerboseL4() )
176  ->Message("create from booking", "ntuple", ntupleBooking->m_name);
177 #endif
178 
179  // create a file for this ntuple
180  if ( ! fFileManager->CreateNtupleFile((*itn)) ) continue;
181 
182  // create ntuple
183  (*itn)->fNtuple
184  = new tools::waxml::ntuple(*((*itn)->fFile), G4cerr, *ntupleBooking);
185 
186  if ( ntupleBooking->m_columns.size() ) {
187  // store ntuple columns in local maps
188  const std::vector<tools::ntuple_booking::col_t>& columns
189  = ntupleBooking->m_columns;
190  std::vector<tools::ntuple_booking::col_t>::const_iterator it;
191  G4int index = 0;
192  for ( it = columns.begin(); it!=columns.end(); ++it) {
193  if ( (*it).second == tools::_cid(int(0) ) ) {
194  (*itn)->fNtupleIColumnMap[index++]
195  = (*itn)->fNtuple->find_column<int>((*it).first);
196  }
197  else if( (*it).second == tools::_cid(float(0) ) ) {
198  (*itn)->fNtupleFColumnMap[index++]
199  = (*itn)->fNtuple->find_column<float>((*it).first);
200  }
201  else if((*it).second== tools::_cid(double(0))) {
202  (*itn)->fNtupleDColumnMap[index++]
203  = (*itn)->fNtuple->find_column<double>((*it).first);
204  }
205  else {
206  G4ExceptionDescription description;
207  description << " "
208  << "Unsupported column type " << (*it).first;
209  G4Exception("G4XmlNtupleManager::CreateNtuplesFromBooking()",
210  "Analysis_W004", JustWarning, description);
211  }
212  }
213  }
214  FinishNtuple();
215 #ifdef G4VERBOSE
216  if ( fState.GetVerboseL3() )
218  ->Message("create from booking", "ntuple", ntupleBooking->m_name);
219 #endif
220  }
221 }
222 
223 //_____________________________________________________________________________
225 {
226  return ! fNtupleVector.size();
227 }
228 
229 //_____________________________________________________________________________
231 {
232 // Reset ntuples
233 
234  std::vector<G4XmlNtupleDescription*>::iterator it;
235  for (it = fNtupleVector.begin(); it != fNtupleVector.end(); it++ ) {
236  delete (*it)->fNtuple;
237  (*it)->fNtuple = 0;
238  }
239 
240  return true;
241 }
242 
243 //_____________________________________________________________________________
244 tools::waxml::ntuple* G4XmlNtupleManager::GetNtuple() const
245 {
246  return GetNtuple(fFirstId);
247 }
248 
249 //_____________________________________________________________________________
250 tools::waxml::ntuple* G4XmlNtupleManager::GetNtuple(G4int ntupleId) const
251 {
252  G4XmlNtupleDescription* ntupleDescription
253  = GetNtupleInFunction(ntupleId, "GetNtuple");
254 
255  return ntupleDescription->fNtuple;
256 }
257 
258 //_____________________________________________________________________________
260  const G4String& title)
261 {
262 #ifdef G4VERBOSE
263  if ( fState.GetVerboseL4() )
264  fState.GetVerboseL4()->Message("create", "ntuple", name);
265 #endif
266 
267  // Create ntuple description
268  G4int index = fNtupleVector.size();
269  G4XmlNtupleDescription* ntupleDescription
270  = new G4XmlNtupleDescription();
271  fNtupleVector.push_back(ntupleDescription);
272 
273  // Create ntuple booking
274  ntupleDescription->fNtupleBooking = new tools::ntuple_booking();
275  ntupleDescription->fNtupleBooking->m_name = name;
276  ntupleDescription->fNtupleBooking->m_title = title;
277 
278  // Create ntuple if the file is open (what means here that
279  // a filename was already set)
280  if ( fFileManager->GetFileName().size() ) {
281  if ( fFileManager->CreateNtupleFile(ntupleDescription) ) {
282  ntupleDescription->fNtuple
283  = new tools::waxml::ntuple(*(ntupleDescription->fFile));
284  // ntuple object is deleted when closing a file
285  }
286  }
287 
288  fLockFirstId = true;
289 
290 #ifdef G4VERBOSE
291  if ( fState.GetVerboseL2() ) {
292  G4ExceptionDescription description;
293  description << name << " ntupleId " << index + fFirstId;
294  fState.GetVerboseL2()->Message("create", "ntuple", description);
295  }
296 #endif
297 
298  return index + fFirstId;
299 }
300 
301 //_____________________________________________________________________________
303 {
304  G4int ntupleId = fNtupleVector.size() + fFirstId - 1;
305  return CreateNtupleIColumn(ntupleId, name);
306 }
307 
308 //_____________________________________________________________________________
310 {
311  G4int ntupleId = fNtupleVector.size() + fFirstId - 1;
312  return CreateNtupleFColumn(ntupleId, name);
313 }
314 
315 //_____________________________________________________________________________
317 {
318  G4int ntupleId = fNtupleVector.size() + fFirstId - 1;
319  return CreateNtupleDColumn(ntupleId, name);
320 }
321 
322 //_____________________________________________________________________________
324 {
325  G4int ntupleId = fNtupleVector.size() + fFirstId - 1;
326  FinishNtuple(ntupleId);
327 }
328 
329 //_____________________________________________________________________________
331 {
332 #ifdef G4VERBOSE
333  if ( fState.GetVerboseL4() ) {
334  G4ExceptionDescription description;
335  description << name << " ntupleId " << ntupleId;
336  fState.GetVerboseL4()->Message("create", "ntuple I column", description);
337  }
338  #endif
339 
340  G4XmlNtupleDescription* ntupleDescription
341  = GetNtupleInFunction(ntupleId, "CreateNtupleIColumn");
342  if ( ! ntupleDescription ) return -1;
343 
344  tools::ntuple_booking* ntupleBooking
345  = ntupleDescription->fNtupleBooking;
346 
347  if ( ! ntupleBooking ) {
348  G4ExceptionDescription description;
349  description << " "
350  << "Ntuple " << ntupleId << " has to be created first. ";
351  G4Exception("G4XmlNtupleManager::CreateNtupleIColumn()",
352  "Analysis_W005", JustWarning, description);
353  return -1;
354  }
355 
356  // Save column info in booking
357  G4int index = ntupleBooking->m_columns.size();
358  ntupleBooking->add_column<int>(name);
359 
360  // Create column if ntuple already exists
361  if ( ntupleDescription->fNtuple ) {
362  tools::waxml::ntuple::column<int>* column
363  = ntupleDescription->fNtuple->create_column<int>(name);
364  ntupleDescription->fNtupleIColumnMap[index] = column;
365  }
366 
368 
369 #ifdef G4VERBOSE
370  if ( fState.GetVerboseL2() ) {
371  G4ExceptionDescription description;
372  description << name << " ntupleId " << ntupleId;
373  fState.GetVerboseL2()->Message("create", "ntuple I column", description);
374  }
375 #endif
376 
377  return index + fFirstNtupleColumnId;
378 }
379 
380 //_____________________________________________________________________________
382 {
383 #ifdef G4VERBOSE
384  if ( fState.GetVerboseL4() ) {
385  G4ExceptionDescription description;
386  description << name << " ntupleId " << ntupleId;
387  fState.GetVerboseL4()->Message("create", "ntuple F column", description);
388  }
389 #endif
390 
391  G4XmlNtupleDescription* ntupleDescription
392  = GetNtupleInFunction(ntupleId, "CreateNtupleFColumn");
393  if ( ! ntupleDescription ) return -1;
394 
395  tools::ntuple_booking* ntupleBooking
396  = ntupleDescription->fNtupleBooking;
397 
398  if ( ! ntupleBooking ) {
399  G4ExceptionDescription description;
400  description << " "
401  << "Ntuple " << ntupleId << " has to be created first. ";
402  G4Exception("G4XmlNtupleManager::CreateNtupleFColumn()",
403  "Analysis_W005", JustWarning, description);
404  return -1;
405  }
406 
407  // Save column info in booking
408  G4int index = ntupleBooking->m_columns.size();
409  ntupleBooking->add_column<float>(name);
410 
411  // Create column if ntuple already exists
412  if ( ntupleDescription->fNtuple ) {
413  tools::waxml::ntuple::column<float>* column
414  = ntupleDescription->fNtuple->create_column<float>(name);
415  ntupleDescription->fNtupleFColumnMap[index] = column;
416  }
417 
419 
420 #ifdef G4VERBOSE
421  if ( fState.GetVerboseL2() ) {
422  G4ExceptionDescription description;
423  description << name << " ntupleId " << ntupleId;
424  fState.GetVerboseL2()->Message("create", "ntuple F column", description);
425  }
426 #endif
427 
428  return index + fFirstNtupleColumnId;
429 }
430 
431 //_____________________________________________________________________________
433 {
434 #ifdef G4VERBOSE
435  if ( fState.GetVerboseL4() ) {
436  G4ExceptionDescription description;
437  description << name << " ntupleId " << ntupleId;
438  fState.GetVerboseL4()->Message("create", "ntuple D column", description);
439  }
440 #endif
441 
442  G4XmlNtupleDescription* ntupleDescription
443  = GetNtupleInFunction(ntupleId, "CreateNtupleDColumn");
444  if ( ! ntupleDescription ) return -1;
445 
446  tools::ntuple_booking* ntupleBooking
447  = ntupleDescription->fNtupleBooking;
448 
449  if ( ! ntupleBooking ) {
450  G4ExceptionDescription description;
451  description << " "
452  << "Ntuple " << ntupleId << " has to be created first. ";
453  G4Exception("G4XmlNtupleManager::CreateNtupleDColumn()",
454  "Analysis_W005", JustWarning, description);
455  return -1;
456  }
457 
458  // Save column info in booking
459  G4int index = ntupleBooking->m_columns.size();
460  ntupleBooking->add_column<double>(name);
461 
462  // Create column if ntuple already exists
463  if ( ntupleDescription->fNtuple ) {
464  tools::waxml::ntuple::column<double>* column
465  = ntupleDescription->fNtuple->create_column<double>(name);
466  ntupleDescription->fNtupleDColumnMap[index] = column;
467  }
468 
470 
471 #ifdef G4VERBOSE
472  if ( fState.GetVerboseL2() ) {
473  G4ExceptionDescription description;
474  description << name << " ntupleId " << ntupleId;
475  fState.GetVerboseL2()->Message("create", "ntuple D column", description);
476  }
477  #endif
478 
479  return index + fFirstNtupleColumnId;
480 }
481 
482 //_____________________________________________________________________________
484 {
485  G4XmlNtupleDescription* ntupleDescription
486  = GetNtupleInFunction(ntupleId, "FinishNtuple");
487  tools::ntuple_booking* ntupleBooking
488  = ntupleDescription->fNtupleBooking;
489 
490  if ( ! ntupleBooking ) {
491  G4ExceptionDescription description;
492  description << " "
493  << "Ntuple " << ntupleId << " has to be created first. ";
494  G4Exception("G4XmlNtupleManager::CreateNtupleDColumn()",
495  "Analysis_W005", JustWarning, description);
496  return;
497  }
498 
499 #ifdef G4VERBOSE
500  if ( fState.GetVerboseL4() ) {
501  G4ExceptionDescription description;
502  description << ntupleBooking->m_name << " ntupleId " << ntupleId;
503  fState.GetVerboseL4()->Message("finish", "ntuple", description);
504  }
505 #endif
506 
507  // Finish ntuple if ntuple already exists
508  if ( ntupleDescription->fNtuple ) {
509  G4String path = "/";
511  ntupleDescription->fNtuple
512  ->write_header(path, ntupleBooking->m_name, ntupleBooking->m_title);
513 
515  }
516 
517 #ifdef G4VERBOSE
518  if ( fState.GetVerboseL2() ) {
519  G4ExceptionDescription description;
520  description << ntupleBooking->m_name << " ntupleId " << ntupleId;
521  fState.GetVerboseL2()->Message("finish", "ntuple", description);
522  }
523 #endif
524 }
525 
526 //_____________________________________________________________________________
528 {
529  return FillNtupleIColumn(fFirstId, columnId, value);
530 }
531 
532 //_____________________________________________________________________________
534 {
535  return FillNtupleFColumn(fFirstId, columnId, value);
536 }
537 
538 //_____________________________________________________________________________
540 {
541  return FillNtupleDColumn(fFirstId, columnId, value);
542 }
543 
544 //_____________________________________________________________________________
546  G4int value)
547 {
548  tools::waxml::ntuple::column<int>* column
549  = GetNtupleIColumn(ntupleId, columnId);
550  if ( ! column ) {
551  G4ExceptionDescription description;
552  description << " " << " columnId " << columnId << " does not exist.";
553  G4Exception("G4XmlNtupleManager::FillNtupleIColumn()",
554  "Analysis_W009", JustWarning, description);
555  return false;
556  }
557 
558  column->fill(value);
559 #ifdef G4VERBOSE
560  if ( fState.GetVerboseL4() ) {
561  G4ExceptionDescription description;
562  description << " ntupleId " << ntupleId
563  << " columnId " << columnId << " value " << value;
564  fState.GetVerboseL4()->Message("fill", "ntuple I column", description);
565  }
566 #endif
567  return true;
568 }
569 //_____________________________________________________________________________
571  G4float value)
572 {
573  tools::waxml::ntuple::column<float>* column
574  = GetNtupleFColumn(ntupleId, columnId);
575  if ( ! column ) {
576  G4ExceptionDescription description;
577  description << " " << " columnId " << columnId << " does not exist.";
578  G4Exception("G4XmlNtupleManager::FillNtupleFColumn()",
579  "Analysis_W009", JustWarning, description);
580  return false;
581  }
582 
583  column->fill(value);
584 #ifdef G4VERBOSE
585  if ( fState.GetVerboseL4() ) {
586  G4ExceptionDescription description;
587  description << " ntupleId " << ntupleId
588  << " columnId " << columnId << " value " << value;
589  fState.GetVerboseL4()->Message("fill", "ntuple F column", description);
590  }
591 #endif
592  return true;
593 }
594 
595 //_____________________________________________________________________________
597  G4double value)
598 {
599  tools::waxml::ntuple::column<double>* column
600  = GetNtupleDColumn(ntupleId, columnId);
601  if ( ! column ) {
602  G4ExceptionDescription description;
603  description << " " << " columnId " << columnId << " does not exist.";
604  G4Exception("G4XmlNtupleManager::FillNtupleDColumn()",
605  "Analysis_W009", JustWarning, description);
606  return false;
607  }
608 
609  column->fill(value);
610 #ifdef G4VERBOSE
611  if ( fState.GetVerboseL4() ) {
612  G4ExceptionDescription description;
613  description << " ntupleId " << ntupleId
614  << " columnId " << columnId << " value " << value;
615  fState.GetVerboseL4()->Message("fill", "ntuple D column", description);
616  }
617 #endif
618  return true;
619 }
620 
621 //_____________________________________________________________________________
623 {
624  return AddNtupleRow(fFirstId);
625 }
626 
627 //_____________________________________________________________________________
629 {
630 #ifdef G4VERBOSE
631  if ( fState.GetVerboseL4() ) {
632  G4ExceptionDescription description;
633  description << " ntupleId " << ntupleId;
634  fState.GetVerboseL4()->Message("add", "ntuple row", description);
635  }
636 #endif
637 
638  G4XmlNtupleDescription* ntupleDescription
639  = GetNtupleInFunction(ntupleId, "AddNtupleRow");
640  if ( ! ntupleDescription ) return false;
641 
642  if ( ! ntupleDescription->fNtuple ) {
643  G4ExceptionDescription description;
644  description << " " << "ntuple does not exist. ";
645  G4Exception("G4XmlNtupleManager::AddNtupleRow()",
646  "Analysis_W008", JustWarning, description);
647  return false;
648  }
649 
650  ntupleDescription->fNtuple->add_row();
651 #ifdef G4VERBOSE
652  if ( fState.GetVerboseL4() ) {
653  G4ExceptionDescription description;
654  description << " ntupleId " << ntupleId;
655  fState.GetVerboseL4()->Message("add", "ntuple row", description);
656  }
657 #endif
658 
659  return true;
660 }
661 
void Message(const G4String &action, const G4String &object, const G4String &objectName, G4bool success=true) const
std::map< G4int, tools::waxml::ntuple::column< int > * > fNtupleIColumnMap
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
std::map< G4int, tools::waxml::ntuple::column< double > * > fNtupleDColumnMap
std::map< G4int, tools::waxml::ntuple::column< float > * > fNtupleFColumnMap
virtual G4bool FillNtupleIColumn(G4int columnId, G4int value)
void LockNtupleDirectoryName()
tools::waxml::ntuple * fNtuple
G4String name
Definition: TRTMaterials.hh:40
float G4float
Definition: G4Types.hh:77
tools::ntuple_booking * fNtupleBooking
virtual G4bool AddNtupleRow()
G4bool CreateNtupleFile(G4XmlNtupleDescription *ntupleDescription)
virtual G4int CreateNtupleFColumn(const G4String &name)
int G4int
Definition: G4Types.hh:78
G4XmlFileManager * fFileManager
const G4AnalysisVerbose * GetVerboseL2() const
G4String GetNtupleDirectoryName() const
const G4AnalysisVerbose * GetVerboseL3() const
virtual G4int CreateNtupleDColumn(const G4String &name)
const G4AnalysisVerbose * GetVerboseL4() const
G4String GetFileName() const
bool G4bool
Definition: G4Types.hh:79
G4bool IsEmpty() const
virtual G4bool FillNtupleFColumn(G4int columnId, G4float value)
virtual void FinishNtuple()
virtual G4int CreateNtupleIColumn(const G4String &name)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
tools::waxml::ntuple::column< float > * GetNtupleFColumn(G4int ntupleId, G4int columnId) const
virtual G4bool FillNtupleDColumn(G4int columnId, G4double value)
G4String & append(const G4String &)
virtual G4XmlNtupleDescription * GetNtupleInFunction(G4int id, G4String function, G4bool warn=true, G4bool onlyIfActive=true) const
tools::waxml::ntuple * GetNtuple() const
G4bool fLockFirstNtupleColumnId
G4XmlNtupleManager(const G4AnalysisManagerState &state)
double G4double
Definition: G4Types.hh:76
tools::waxml::ntuple::column< int > * GetNtupleIColumn(G4int ntupleId, G4int columnId) const
std::vector< G4XmlNtupleDescription * > fNtupleVector
virtual G4int CreateNtuple(const G4String &name, const G4String &title)
tools::waxml::ntuple::column< double > * GetNtupleDColumn(G4int ntupleId, G4int columnId) const
const G4AnalysisManagerState & fState
G4GLOB_DLL std::ostream G4cerr