Loading...
Searching...
No Matches
G4RootMpiNtupleFileManager.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, 21/11/2018 (ivana@ipno.in2p3.fr)
28
32#include "G4AnalysisUtilities.hh"
33
34#include <tools/impi>
35
36using namespace G4Analysis;
37using std::make_shared;
38
39//_____________________________________________________________________________
42 fImpi(nullptr),
43 fMpiRank(-1),
44 fMpiSize(0),
45 fMpiSlaveNtupleManager(nullptr),
46 fNtupleBooked(false)
47{}
48
49//_____________________________________________________________________________
52
53//
54// private methods
55//
56
57//_____________________________________________________________________________
59 G4int nofNtupleFiles)
60{
61 Message(kVL2, "set", "mpi ntuple merging mode");
62
63 auto canMerge = true;
64
65 // Illegal situations
66 if ( fMpiSize < 2 ) {
67 G4ExceptionDescription description;
68 description
69 << "Merging ntuples is not applicable on a single rank." << G4endl
70 << "Setting was ignored.";
71 G4Exception("G4RootMpiNtupleFileManager::SetMpiNtupleMergingMode()",
72 "Analysis_W013", JustWarning, description);
73 canMerge = false;
74 }
75
76 G4String mergingMode;
77 if ( ! canMerge ) {
78 fNtupleMergeMode = G4NtupleMergeMode::kNone;
79 mergingMode = "G4NtupleMergeMode::kNone";
80 }
81 else {
82 // Set the number of reduced ntuple files
83 // (multiple output files are not yet supported)
84 fNofNtupleFiles = nofNtupleFiles;
85
86 // Forced merging mode
87 // MPI
88 if ( fMpiRank >= fMpiSize ) {
89 // the extra worker
90 fNtupleMergeMode = G4NtupleMergeMode::kMain;
91 mergingMode = "G4NtupleMergeMode::kMain";
92 } else {
93 // processing worker
94 fNtupleMergeMode = G4NtupleMergeMode::kSlave;
95 mergingMode = "G4NtupleMergeMode::kSlave";
96 }
97 }
98
99 Message(kVL1, "set", "mpi ntuple merging mode", mergingMode);
100}
101
102//
103// public methods
104//
105
106//_____________________________________________________________________________
108 G4int mpiRank, G4int mpiSize,
109 G4int nofNtupleFiles)
110{
111 if ( fIsInitialized ) {
112 G4ExceptionDescription description;
113 description
114 << "Cannot change merging mode." << G4endl
115 << "The function must be called before OpenFile().";
116 G4Exception("G4RootMpiNtupleFileManager::SetMpiNtupleMerging",
117 "Analysis_W013", JustWarning, description);
118 return;
119 }
120
121 // Save MPI merging parameters
122 fImpi = impi;
123 fMpiRank = mpiRank;
124 fMpiSize = mpiSize;
125
126 // Set ntuple merging mode
127 SetMpiNtupleMergingMode(nofNtupleFiles);
128}
129
130//_____________________________________________________________________________
131std::shared_ptr<G4VNtupleManager> G4RootMpiNtupleFileManager::CreateNtupleManager()
132{
133 Message(kVL4, "create", "mpi ntuple manager");
134
135 std::shared_ptr<G4VNtupleManager> activeNtupleManager = nullptr;
136 switch ( fNtupleMergeMode )
137 {
138 case G4NtupleMergeMode::kNone:
139 fNtupleManager
140 = make_shared<G4RootNtupleManager>(fState, fBookingManager,
141 0, 0, fNtupleRowWise, fNtupleRowMode);
142 fNtupleManager->SetFileManager(fFileManager);
143 activeNtupleManager = fNtupleManager;
144 break;
145
146 case G4NtupleMergeMode::kMain: {
147 fNtupleManager
148 = make_shared<G4RootMpiNtupleManager>(fState, fBookingManager,
149 fNtupleRowWise, fNtupleRowMode, fImpi, fMpiSize);
150 fNtupleManager->SetFileManager(fFileManager);
151 activeNtupleManager = fNtupleManager;
152 break;
153 }
154
155 case G4NtupleMergeMode::kSlave: {
156 auto destinationRank = fMpiSize;
158 = make_shared<G4RootMpiPNtupleManager>(fState, fImpi, fMpiRank, destinationRank);
159 activeNtupleManager = fMpiSlaveNtupleManager;
160 break;
161 }
162 }
163
164 G4String mergeMode;
165 switch ( fNtupleMergeMode ) {
166 case G4NtupleMergeMode::kNone:
167 mergeMode = "";
168 break;
169 case G4NtupleMergeMode::kMain:
170 mergeMode = "main ";
171 break;
172 case G4NtupleMergeMode::kSlave:
173 mergeMode = "slave ";
174 break;
175 }
176 Message(kVL3, "create", mergeMode + "mpi ntuple manager");
177
178 fIsInitialized = true;
179
180 return activeNtupleManager;
181}
182
183//_____________________________________________________________________________
185{
186 // No MPI merging, call base class
187 if ( fNtupleMergeMode == G4NtupleMergeMode::kNone ) {
188 return G4RootNtupleFileManager::ActionAtOpenFile(fileName);
189 }
190
191 if ( ! fNtupleBooked ) {
192
193 G4String objectType = "analysis file";
194 if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) {
195 objectType = "main analysis file";
196 }
197 Message(kVL4, "open", objectType, fileName);
198
199
200 if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) {
201 // Creating files is triggered from CreateNtuple
202 fNtupleManager->CreateNtuplesFromBooking(
203 fBookingManager->GetNtupleBookingVector());
204 }
205
206 if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) {
207 // G4cout << "Slave: Go to create ntuples from booking" << G4endl;
208 // No file is open by Slave manager
209 fMpiSlaveNtupleManager->CreateNtuplesFromBooking(
210 fBookingManager->GetNtupleBookingVector());
211 }
212
213 Message(kVL1, "open", objectType, fileName);
214
215 fNtupleBooked = true;
216 }
217
218 return true;
219}
220
221//_____________________________________________________________________________
223{
224 // No MPI merging, call base class
225 if ( fNtupleMergeMode == G4NtupleMergeMode::kNone ) {
226 return G4RootNtupleFileManager::ActionAtWrite();
227 }
228
229 auto result = true;
230
231 G4String ntupleType;
232 if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) ntupleType = "main ntuples";
233 if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) ntupleType = "slave ntuples";
234
235 Message(kVL4, "merge", ntupleType);
236
237 if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) {
238 result &= fNtupleManager->Merge();
239 }
240
241 if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) {
242 result &= fMpiSlaveNtupleManager->Merge();
243 }
244
245 Message(kVL1, "merge", ntupleType, "", result);
246
247 return result;
248}
249
250//_____________________________________________________________________________
252{
253 // No MPI merging, call base class
254 if ( fNtupleMergeMode == G4NtupleMergeMode::kNone ) {
255 return G4RootNtupleFileManager::ActionAtCloseFile();
256 }
257
258 if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave) {
259 fMpiSlaveNtupleManager->SetNewCycle(false);
260 return true;
261 }
262
263 return CloseNtupleFiles();
264}
265
266//_____________________________________________________________________________
268{
269// Reset ntuples
270
271 // No MPI merging, call base class
272 if ( fNtupleMergeMode == G4NtupleMergeMode::kNone ) {
273 return G4RootNtupleFileManager::Reset();
274 }
275
276 auto result = true;
277
278 if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) {
279 result &= fNtupleManager->Reset();
280 }
281
282 if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) {
283 result &= fMpiSlaveNtupleManager->Reset();
284 }
285
286 return result;
287}
virtual G4bool ActionAtOpenFile(const G4String &fileName) final
std::shared_ptr< G4RootMpiPNtupleManager > fMpiSlaveNtupleManager
virtual std::shared_ptr< G4VNtupleManager > CreateNtupleManager() override
void SetMpiNtupleMerging(tools::impi *impi, G4int mpiRank, G4int mpiSize, G4int nofReducedNtupleFiles=0)
void SetMpiNtupleMergingMode(G4int nofNtupleFiles)
G4RootMpiNtupleFileManager(const G4AnalysisManagerState &state)

Applications | User Support | Publications | Collaboration