ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4RootFileManager.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4RootFileManager.cc
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, 15/06/2011 (ivana@ipno.in2p3.fr)
28 
29 #include "G4RootFileManager.hh"
31 #include "G4AnalysisUtilities.hh"
32 
33 #include "tools/wroot/file"
34 #include "tools/zlib"
35 
36 #include <iostream>
37 #include <cstdio>
38 
39 using namespace G4Analysis;
40 
41 //_____________________________________________________________________________
43  : G4VFileManager(state),
44  fFile(nullptr),
45  fHistoDirectory(nullptr),
46  fNtupleDirectory(nullptr),
47  fNofNtupleFiles(0),
48  fNtupleFiles(),
49  fMainNtupleDirectories(),
50  fBasketSize(0),
51  fBasketEntries(0)
52 {}
53 
54 //_____________________________________________________________________________
56 {}
57 
58 //
59 // private methods
60 //
61 
62 //_____________________________________________________________________________
64 {
65  auto finalResult = true;
66 
67  for ( auto i = 0; i < fNofNtupleFiles; i++ ) {
68 
69  auto name = GetNtupleFileName(i);
70 
71 #ifdef G4VERBOSE
72  if ( fState.GetVerboseL4() )
74  ->Message("create", "main ntuple file", name);
75 #endif
76 
77  // create new file
78  auto rfile = std::make_shared<tools::wroot::file>(G4cout, name);
79  rfile->add_ziper('Z', tools::compress_buffer);
80  rfile->set_compression(fState.GetCompressionLevel());
81 
82  if ( ! rfile->is_open() ) {
83  G4ExceptionDescription description;
84  description << " " << "Cannot open file " << name;
85  G4Exception("G4RootAnalysisManager::OpenFile()",
86  "Analysis_W001", JustWarning, description);
87  finalResult = false;
88  }
89 
90  // Do not create directory if extra ntuple files
91  // auto result = CreateNtupleDirectory(rfile);
92  // finalResult = finalResult && result;
93  tools::wroot::directory* directory = &rfile->dir();
94  if ( fNtupleDirectoryName != "" ) {
95  directory = rfile->dir().mkdir(fNtupleDirectoryName);
96  if ( ! directory ) {
97  G4ExceptionDescription description;
98  description << " "
99  << "cannot create directory " << fNtupleDirectoryName;
100  G4Exception("G4RootFileManager::OpenNtupleFiles()",
101  "Analysis_W001", JustWarning, description);
102  directory = &fFile->dir();
103  }
104  }
105 
106  fNtupleFiles.push_back(rfile);
107  fMainNtupleDirectories.push_back(directory);
108 
109 #ifdef G4VERBOSE
110  if ( fState.GetVerboseL1() )
112  ->Message("create", "main ntuple file", name);
113 #endif
114 
115  }
116 
117  return finalResult;
118 }
119 
120 //_____________________________________________________________________________
121 G4bool G4RootFileManager::WriteFile(std::shared_ptr<tools::wroot::file> rfile,
122 #ifdef G4VERBOSE
123  const G4String& fileName)
124 #else
125  const G4String& /*fileName*/)
126 #endif
127 {
128  // Do nothing if there is no file
129  if ( ! fIsOpenFile ) return true;
130 
131 #ifdef G4VERBOSE
132  if ( fState.GetVerboseL4() )
133  fState.GetVerboseL4()->Message("write", "file", fileName);
134 #endif
135 
136  unsigned int n;
137  auto result = rfile->write(n);
138 
139 #ifdef G4VERBOSE
140  if ( fState.GetVerboseL1() )
141  fState.GetVerboseL1()->Message("write", "file", fileName, result);
142 #endif
143 
144  return result;
145 }
146 
147 //_____________________________________________________________________________
148 G4bool G4RootFileManager::CloseFile(std::shared_ptr<tools::wroot::file> rfile,
149 #ifdef G4VERBOSE
150  const G4String& fileName)
151 #else
152  const G4String& /*fileName*/)
153 #endif
154 {
155  // Do nothing if there is no file
156  if ( ! fIsOpenFile ) return true;
157 
158 #ifdef G4VERBOSE
159  if ( fState.GetVerboseL4() )
160  fState.GetVerboseL4()->Message("close", "file", fileName);
161 #endif
162 
163  rfile->close();
164 
165 #ifdef G4VERBOSE
166  if ( fState.GetVerboseL1() )
167  fState.GetVerboseL1()->Message("close", "file", fileName, true);
168 #endif
169 
170  return true;
171 }
172 
173 //
174 // public methods
175 //
176 //_____________________________________________________________________________
178 {
179  // Keep file name
180  fFileName = fileName;
181  auto name = GetFullFileName();
182 
183  // delete previous file if exists
184  //if ( fFile ) delete fFile;
185 
186  // create new file
187  fFile = std::make_shared<tools::wroot::file>(G4cout, name);
188  fFile->add_ziper('Z',tools::compress_buffer);
189  fFile->set_compression(fState.GetCompressionLevel());
190 
191  if ( ! fFile->is_open() ) {
192  fFile = nullptr;
193  G4ExceptionDescription description;
194  description << " " << "Cannot open file " << fileName;
195  G4Exception("G4RootAnalysisManager::OpenFile()",
196  "Analysis_W001", JustWarning, description);
197  return false;
198  }
199 
200  // Create directories
201  if ( ! CreateHistoDirectory() ) return false;
202  if ( ! CreateNtupleDirectory() ) return false;
203 
204  // Open ntuple files
205  OpenNtupleFiles();
206 
207  fLockFileName = true;
210 
211  fIsOpenFile = true;
212 
213  return true;
214 }
215 
216 //_____________________________________________________________________________
218 {
219  auto finalResult = true;
220 
221  auto result = WriteFile(fFile, GetFullFileName());
222  finalResult = finalResult && result;
223 
224  auto counter = 0;
225  for ( auto ntupleFile : fNtupleFiles ) {
226  result = WriteFile(ntupleFile, GetNtupleFileName(counter++));
227  finalResult = finalResult && result;
228  }
229  return finalResult;
230 }
231 
232 //_____________________________________________________________________________
234 {
235  auto finalResult = true;
236 
237  auto result = CloseFile(fFile, GetFullFileName());
238  finalResult = finalResult && result;
239 
240  auto counter = 0;
241  for ( auto ntupleFile : fNtupleFiles ) {
242  result = CloseFile(ntupleFile, GetNtupleFileName(counter++));
243  finalResult = finalResult && result;
244  }
245 
246  fLockFileName = false;
247  fIsOpenFile = false;
248 
249  return finalResult;
250 }
251 
252 //_____________________________________________________________________________
254 {
255  if ( fHistoDirectoryName == "" ) {
256  // Do not create a new directory if its name is not set
257  fHistoDirectory = &(fFile->dir());
258  return true;
259  }
260 
261 #ifdef G4VERBOSE
262  if ( fState.GetVerboseL4() )
264  ->Message("create", "directory for histograms", fHistoDirectoryName);
265 #endif
266 
267  fHistoDirectory = fFile->dir().mkdir(fHistoDirectoryName);
268  if ( ! fHistoDirectory ) {
269  G4ExceptionDescription description;
270  description << " "
271  << "cannot create directory " << fHistoDirectoryName;
272  G4Exception("G4RootFileManager::CreateHistoDirectory()",
273  "Analysis_W001", JustWarning, description);
274  return false;
275  }
276 #ifdef G4VERBOSE
277  else {
278  if ( fState.GetVerboseL2() )
280  ->Message("create", "directory for histograms", fHistoDirectoryName);
281  }
282 #endif
283  return true;
284 }
285 
286 //_____________________________________________________________________________
288 {
289  if ( fNtupleDirectoryName == "" ) {
290  // Do not create a new directory if its name is not set
291  fNtupleDirectory = &(fFile->dir());
292  return true;
293  }
294 
295 #ifdef G4VERBOSE
296  if ( fState.GetVerboseL4() )
298  ->Message("create", "directory for ntuples", fNtupleDirectoryName);
299 #endif
300 
302  if ( ! fNtupleDirectory ) {
303  G4ExceptionDescription description;
304  description << " "
305  << "cannot create directory " << fNtupleDirectoryName;
306  G4Exception("G4RootFileManager::CreateNtupleDirectory()",
307  "Analysis_W001", JustWarning, description);
308  return false;
309  }
310 #ifdef G4VERBOSE
311  else {
312  if ( fState.GetVerboseL2() )
314  ->Message("create", "directory for ntuples", fNtupleDirectoryName);
315  }
316 #endif
317  return true;
318 }
319 
320 //_____________________________________________________________________________
321 std::shared_ptr<tools::wroot::file>
323 {
324  if ( index==0 && ( ! fNtupleFiles.size() ) ) return fFile;
325 
326  if ( index < 0 || index >= G4int(fNtupleFiles.size()) ) {
327  G4String inFunction = "G4RootFileManager::GetNtupleFile()";
328  G4ExceptionDescription description;
329  description << " " << "ntuple file " << index << " does not exist.";
330  G4Exception(inFunction, "Analysis_W011", JustWarning, description);
331  return nullptr;
332  }
333 
334  return fNtupleFiles[index];
335 }
336 
337 //_____________________________________________________________________________
338 tools::wroot::directory*
340 {
341  if ( index==0 && ( ! fMainNtupleDirectories.size() ) ) return fNtupleDirectory;
342 
343  if ( index < 0 || index >= G4int(fMainNtupleDirectories.size()) ) {
344  G4String inFunction = "G4RootFileManager::GetMainNtupleDirectory()";
345  G4ExceptionDescription description;
346  description << " " << "main ntuple directory " << index << " does not exist.";
347  G4Exception(inFunction, "Analysis_W011", JustWarning, description);
348  return nullptr;
349  }
350 
351  return fMainNtupleDirectories[index];
352 }
353