Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4RootNtupleManager.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, 18/06/2013 ([email protected])
28
31#include "G4RootFileManager.hh"
34
35#include "tools/wroot/file"
36
37using namespace G4Analysis;
38using std::to_string;
39
40//_____________________________________________________________________________
42 const std::shared_ptr<G4NtupleBookingManager>& bookingManger,
43 G4int nofMainManagers, G4int nofFiles,
44 G4bool rowWise, G4bool rowMode)
45 : G4TNtupleManager<tools::wroot::ntuple, G4RootFile>(state),
46 fRowWise(rowWise),
47 fRowMode(rowMode)
48{
49 for ( G4int i=0; i<nofMainManagers; ++i) {
50 auto fileNumber = i;
51 if ( (i == 0) && (nofFiles == 0) ) {
52 // the main ntuple file will be merged in the default file
53 fileNumber = -1;
54 }
55 fMainNtupleManagers.push_back(
56 std::make_shared<G4RootMainNtupleManager>(
57 this, bookingManger, rowWise, fileNumber, fState));
58 }
59}
60
61//
62// private methods
63//
64
65//_____________________________________________________________________________
66void G4RootNtupleManager::CreateTNtupleFromBooking(
67 RootNtupleDescription* ntupleDescription)
68{
69 if (fMainNtupleManagers.size() == 0u) {
70 // No merging
71 if (ntupleDescription->GetNtuple() != nullptr) {
72 Warn("Cannot create ntuple. Ntuple already exists.",
73 fkClass, "CreateTNtupleFromBooking");
74 return;
75 }
76
77 // Create ntuple file from ntuple description
78 auto ntupleFile = fFileManager->CreateNtupleFile(ntupleDescription);
79 if ( ! ntupleFile ) {
80 Warn("Cannot create ntuple. Ntuple file does not exist.",
81 fkClass, "CreateTNtupleFromBooking");
82 return;
83 }
84
85 auto directory = std::get<2>(*ntupleFile);
86 ntupleDescription->SetNtuple(
87 new tools::wroot::ntuple(
88 *directory, ntupleDescription->GetNtupleBooking(), fRowWise));
89
90 auto basketSize = fFileManager->GetBasketSize();
91 ntupleDescription->GetNtuple()->set_basket_size(basketSize);
92
93 ntupleDescription->SetIsNtupleOwner(false);
94 // ntuple object is deleted automatically when closing a file
95 fNtupleVector.push_back(ntupleDescription->GetNtuple());
96 }
97 else {
98 // Merging activated
99 for ( const auto& manager : fMainNtupleManagers ) {
100 manager->CreateNtuple(ntupleDescription);
101 }
102 }
103}
104
105//_____________________________________________________________________________
106void G4RootNtupleManager::FinishTNtuple(
107 RootNtupleDescription* /*ntupleDescription*/, G4bool /*fromBooking*/)
108{
109 // nothing to be done
110}
111
112//_____________________________________________________________________________
113G4bool G4RootNtupleManager::Reset()
114{
116 // this will clear ntuple vector
117
118 auto result = true;
119
120 for ( const auto& manager : fMainNtupleManagers ) {
121 result &= manager->Reset();
122 }
123
124 return result;
125}
126
127//_____________________________________________________________________________
128void G4RootNtupleManager::Clear()
129{
131 // this will clear ntuple vector
132
133 for ( const auto& manager : fMainNtupleManagers ) {
134 manager->ClearData();
135 }
136}
137
138//_____________________________________________________________________________
139G4bool G4RootNtupleManager::Merge()
140{
141 auto result = true;
142
143 for ( const auto& manager : fMainNtupleManagers ) {
144 result &= manager->Merge();
145 }
146
147 return result;
148}
149
150//_____________________________________________________________________________
151void G4RootNtupleManager::SetFileManager(
152 const std::shared_ptr<G4RootFileManager>& fileManager)
153{
154 fFileManager = fileManager;
155
156 for ( const auto& manager : fMainNtupleManagers ) {
157 manager->SetFileManager(fileManager);
158 }
159}
160
161//_____________________________________________________________________________
162void G4RootNtupleManager::SetNtupleRowWise(G4bool rowWise, G4bool rowMode)
163{
164// Set rowWise mode and propagate it to main ntuple managers
165
166 fRowWise = rowWise;
167 fRowMode = rowMode;
168
169 for (auto& mainNtupleManager : fMainNtupleManagers ) {
170 mainNtupleManager->SetRowWise(rowWise);
171 }
172}
173
174//_____________________________________________________________________________
175void G4RootNtupleManager::SetNewCycle(G4bool value)
176{
178
179 for ( const auto& manager : fMainNtupleManagers ) {
180 manager->SetNewCycle(value);
181 }
182}
183
184//_____________________________________________________________________________
185std::shared_ptr<G4RootMainNtupleManager>
186G4RootNtupleManager::GetMainNtupleManager(G4int index) const
187{
188 if ( index < 0 || index >= G4int(fMainNtupleManagers.size()) ) {
189 Warn("main ntuple manager " + to_string(index) + " does not exist.",
190 fkClass, "GetMainNtupleManager");
191 return nullptr;
192 }
193
194 return fMainNtupleManagers[index];
195}
196
197//_____________________________________________________________________________
198unsigned int G4RootNtupleManager::GetBasketSize() const
199{
200 if ( ! fFileManager ) {
201 Warn("File manager must be defined first.", fkClass, "GetBasketSize");
202 return 0;
203 }
204
205 return fFileManager->GetBasketSize();
206}
207
208//_____________________________________________________________________________
209unsigned int G4RootNtupleManager::GetBasketEntries() const
210{
211 if ( ! fFileManager ) {
212 Warn("File manager must be defined first.", fkClass, "GetBasketEntries");
213 return 0;
214 }
215
216 return fFileManager->GetBasketEntries();
217}
std::tuple< std::shared_ptr< tools::wroot::file >, tools::wroot::directory *, tools::wroot::directory * > G4RootFile
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4AnalysisManagerState & fState
G4RootNtupleManager()=delete
const tools::ntuple_booking & GetNtupleBooking() const
void SetNtuple(NT *ntuple)
void SetIsNtupleOwner(G4bool isNtupleOwner)
std::vector< tools::wroot::ntuple * > fNtupleVector
void SetNewCycle(G4bool value) override
void Warn(const G4String &message, const std::string_view inClass, const std::string_view inFunction)