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