Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/analysis/csv/src/G4CsvFileManager.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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, 18/06/2013  (ivana@ipno.in2p3.fr)
 28 
 29 #include "G4CsvFileManager.hh"
 30 #include "G4CsvHnFileManager.hh"
 31 #include "G4AnalysisManagerState.hh"
 32 #include "G4AnalysisUtilities.hh"
 33 #include "G4Filesystem.hh"
 34 
 35 using namespace G4Analysis;
 36 using namespace tools;
 37 
 38 //_____________________________________________________________________________
 39 G4CsvFileManager::G4CsvFileManager(const G4AnalysisManagerState& state)
 40  : G4VTFileManager(state)
 41 {
 42   // Create helpers defined in the base class
 43   fH1FileManager = std::make_shared<G4CsvHnFileManager<histo::h1d>>(this);
 44   fH2FileManager = std::make_shared<G4CsvHnFileManager<histo::h2d>>(this);
 45   fH3FileManager = std::make_shared<G4CsvHnFileManager<histo::h3d>>(this);
 46   fP1FileManager = std::make_shared<G4CsvHnFileManager<histo::p1d>>(this);
 47   fP2FileManager = std::make_shared<G4CsvHnFileManager<histo::p2d>>(this);
 48 }
 49 
 50 //
 51 // private methods
 52 //
 53 
 54 //_____________________________________________________________________________
 55 G4String G4CsvFileManager::GetNtupleFileName(CsvNtupleDescription* ntupleDescription)
 56 {
 57   // get ntuple file name
 58   auto ntupleFileName = ntupleDescription->GetFileName();
 59   auto cycle = GetCycle();
 60   if (ntupleFileName.size() != 0u) {
 61     // update filename per object per thread
 62     ntupleFileName = GetTnFileName(ntupleFileName, GetFileType(), cycle);
 63   }
 64   else {
 65     // compose ntuple file name from the default file name
 66     ntupleFileName = GetNtupleFileName(ntupleDescription->GetNtupleBooking().name(), cycle);
 67   }
 68 
 69   if ( IsNtupleDirectory() ) {
 70     ntupleFileName = "./" + GetNtupleDirectoryName() + "/" + ntupleFileName;
 71   }
 72 
 73   return ntupleFileName;
 74 }
 75 
 76 //
 77 // protected methods
 78 //
 79 
 80 //_____________________________________________________________________________
 81 std::shared_ptr<std::ofstream> G4CsvFileManager::CreateFileImpl(const G4String& fileName)
 82 {
 83   std::shared_ptr<std::ofstream> file = std::make_shared<std::ofstream>(fileName);
 84   if ( file->fail() ) {
 85     Warn("Cannot create file " + fileName, fkClass, "CreateFileImpl");
 86     return nullptr;
 87   }
 88 
 89   return file;
 90 }
 91 
 92 //_____________________________________________________________________________
 93 G4bool G4CsvFileManager::WriteFileImpl(std::shared_ptr<std::ofstream> /*file*/)
 94 {
 95   // Nothing to be done here
 96   return true;
 97 }
 98 
 99 //_____________________________________________________________________________
100 G4bool G4CsvFileManager::CloseFileImpl(std::shared_ptr<std::ofstream> file)
101 {
102   if ( ! file ) return false;
103 
104   // close file
105   file->close();
106 
107   return true;
108 }
109 
110 //
111 // public methods
112 //
113 
114 //_____________________________________________________________________________
115 G4bool G4CsvFileManager::OpenFile(const G4String& fileName)
116 {
117   // Keep file name
118   fFileName =  fileName;
119 
120   fIsOpenFile = true;
121 
122   return true;
123 }
124 
125 //_____________________________________________________________________________
126 G4bool G4CsvFileManager::SetHistoDirectoryName(const G4String& dirName)
127 {
128   // A directory is taken into account only if it exists in file system
129   if ( G4fs::is_directory(dirName.data()) ) {
130      fIsHistoDirectory = G4VFileManager::SetHistoDirectoryName(dirName);
131      return fIsHistoDirectory;
132   }
133 
134   G4Analysis::Warn("Directory " + dirName + " does not exists.\n"
135     "Histograms will be written in the current directory.",
136     fkClass, "SetHistoDirectoryName");
137   return false;
138 }
139 
140 //_____________________________________________________________________________
141 G4bool G4CsvFileManager::SetNtupleDirectoryName(const G4String& dirName)
142 {
143   // A directory is taken into account only if it exists in file system
144   if ( G4fs::is_directory(dirName.data()) ) {
145      fIsNtupleDirectory = G4VFileManager::SetNtupleDirectoryName(dirName);
146      return fIsNtupleDirectory;
147   }
148 
149   G4Analysis::Warn("Directory " + dirName + " does not exists.\n"
150     "Ntuples will be written in the current directory.",
151     fkClass, "SetNtupleDirectoryName");
152   return false;
153 }
154 
155 //_____________________________________________________________________________
156 G4bool G4CsvFileManager::NotifyNtupleFile(CsvNtupleDescription* ntupleDescription)
157 {
158   // Notify not empty file
159   auto ntupleFileName = GetNtupleFileName(ntupleDescription);
160 
161   return SetIsEmpty(ntupleFileName, ! ntupleDescription->GetHasFill());
162 }
163 
164 //_____________________________________________________________________________
165 G4bool G4CsvFileManager::CreateNtupleFile(
166   CsvNtupleDescription* ntupleDescription)
167 {
168   // Get ntuple file name per object (if defined)
169   auto ntupleFileName = GetNtupleFileName(ntupleDescription);
170 
171   // Update file name if it is already in use
172   while ( GetTFile(ntupleFileName, false) != nullptr ) {
173     // the file is already in use
174     auto oldName = ntupleFileName;
175     auto newName = GetBaseName(oldName) + "_bis." + GetExtension(oldName);
176     ntupleDescription->SetFileName(newName);
177 
178     Warn("Ntuple filename " + oldName + " is already in use.\n" +
179          "It will be replaced with : " + newName,
180          fkClass, "CreateNtupleFile");
181 
182     ntupleFileName = GetNtupleFileName(ntupleDescription);
183   }
184 
185   // Create new ntuple file
186   ntupleDescription->SetFile(CreateTFile(ntupleFileName));
187 
188   return (ntupleDescription->GetFile() != nullptr);
189 }
190 
191 //_____________________________________________________________________________
192 G4bool G4CsvFileManager::CloseNtupleFile(
193   CsvNtupleDescription* ntupleDescription)
194 {
195   // Notifying not empty file is done in G4CsvNtupleFileManager::ActionAtWrite,
196   // as here we increment the cycle number and GetNtupleFileName returns a file name
197   // for the next cycle version.
198 
199   // Ntuple files are registered in file manager map.
200   // they will be closed with CloseFiles() calls
201 
202   ntupleDescription->GetFile().reset();
203 
204   return true;
205 }
206