30#include "G4RootFileManager.hh"
31#include "G4AnalysisUtilities.hh"
33#include "tools/wroot/file"
34#include "tools/wroot/mpi_ntuple_row_wise"
35#include "tools/wroot/mpi_ntuple_column_wise"
37using namespace G4Analysis;
44void NotExistException(
const G4String& what, G4int
id,
const G4String& functionName)
46 G4String inFunction =
"G4RootMpiPNtupleManager::";
47 inFunction += functionName;
48 G4ExceptionDescription description;
49 description << what <<
" id= " <<
id <<
" does not exist.";
50 G4Exception(inFunction,
"Analysis_W011", JustWarning, description);
58 tools::impi* impi, G4int mpiRank, G4int destinationRank)
63 fDestinationRank(destinationRank)
71 delete ntupleDescription;
82 G4int
id,
G4String functionName, G4bool warn)
const
84 auto index =
id - fFirstId;
87 NotExistException(
"ntuple description",
id, functionName);
97 G4int
id,
G4String functionName, G4bool warn)
const
100 if ( ! ntupleDescription )
return nullptr;
102 if ( ! ntupleDescription->GetBasePNtuple() ) {
104 NotExistException(
"ntuple",
id, functionName);
108 return ntupleDescription->GetBasePNtuple();
118 Message(kVL4,
"create from booking",
"mpi pntuple",
123 G4bool verbose = IsVerbose(kVL2);
129 G4cerr <<
"G4RootMpiPNtupleManager::CreateNtuple: wait_buffer() failed."<< G4endl;
132 G4cout <<
"After wait_buffer with " <<
fImpi << G4endl;
134 tools::uint32 mainNtupleId;
137 unsigned int compression;
138 tools::wroot::seek seekDirectory;
139 tools::uint32 basketSize;
141 std::vector<tools::uint32> basketSizes;
142 unsigned int basketEntries;
144 if ( !
fImpi->unpack(mainNtupleId) ) {
145 G4cerr <<
"bunpack(byteSwap) failed."<< G4endl;
150 if ( !
fImpi->bunpack(rowWise) ) {
151 G4cerr <<
"bunpack(rowWise) failed."<< G4endl;
156 if ( !
fImpi->bunpack(byteSwap) ) {
157 G4cerr <<
"bunpack(byteSwap) failed."<< G4endl;
162 if ( !
fImpi->unpack(compression) ) {
163 G4cerr <<
"unpack(compression) failed."<< G4endl;
168 if ( !
fImpi->unpack(seekDirectory) ) {
169 G4cerr <<
"unpack(seek) failed."<< G4endl;
175 if ( !
fImpi->unpack(basketSize) ) {
176 G4cerr <<
"unpack(basketSize) failed."<< G4endl;
180 if ( !
fImpi->bunpack(rowMode) ) {
181 G4cerr <<
"bpack(rowMode) failed." << G4endl;
184 if ( !
fImpi->vunpack(basketSizes) ) {
185 G4cerr <<
"vunpack(basketSizes) failed."<< G4endl;
188 if( !
fImpi->unpack(basketEntries) ) {
189 G4cerr <<
"unpack(basketEntries) failed." << G4endl;
206 tools::wroot::mpi_ntuple_row_wise* ntuple
207 =
new tools::wroot::mpi_ntuple_row_wise(
208 mainNtupleId, G4cout, byteSwap, compression, seekDirectory,
209 basketSize, ntupleDescription->
GetDescription().GetNtupleBooking(), verbose);
213 tools::wroot::mpi_ntuple_column_wise* ntuple
214 =
new tools::wroot::mpi_ntuple_column_wise(
215 mainNtupleId, G4cout, byteSwap, compression, seekDirectory,
216 basketSizes, ntupleDescription->
GetDescription().GetNtupleBooking(),
217 rowMode, basketEntries, verbose);
228 Message(kVL3,
"create from booking",
"mpi pntuple",
234 const std::vector<G4NtupleBooking*>& ntupleBookings)
245 for (
auto g4NtupleBooking : ntupleBookings ) {
255 if ( fState.GetIsActivation() && ( ! ntupleDescription->GetDescription().GetActivation() ) )
continue;
258 if ( ntupleDescription->GetNtuple() )
continue;
260 Message(kVL4,
"create from booking",
"mpi pntuple",
261 ntupleDescription->GetDescription().GetNtupleBooking().name());
270 Message(kVL3,
"create from booking",
"mpi pntuple",
271 ntupleDescription->GetDescription().GetNtupleBooking().name());
283 return G4Analysis::kInvalidId;
288 G4int ntupleId, G4int columnId, G4int value)
290 return FillNtupleTColumn<int>(ntupleId, columnId, value);
295 G4int ntupleId, G4int columnId, G4float value)
297 return FillNtupleTColumn<float>(ntupleId, columnId, value);
302 G4int ntupleId, G4int columnId, G4double value)
304 return FillNtupleTColumn<double>(ntupleId, columnId, value);
309 G4int ntupleId, G4int columnId,
const G4String& value)
311 return FillNtupleTColumn<std::string>(ntupleId, columnId, value);
317 if ( fState.GetIsActivation() && ( !
GetActivation(ntupleId) ) ) {
322 Message(kVL4,
"add",
"pntuple row",
" ntupleId " + to_string(ntupleId));
325 if ( ! ntupleDescription )
return false;
329 = ntupleDescription->GetNtuple()
333 G4ExceptionDescription description;
334 description <<
" " <<
" ntupleId " << ntupleId
335 <<
"adding row has failed.";
336 G4Exception(
"G4RootMpiPNtupleManager::AddNtupleRow()",
337 "Analysis_W002", JustWarning, description);
340 Message(kVL3,
"add",
"pntuple row",
" ntupleId " + to_string(ntupleId));
351 auto finalResult =
true;
356 if ( ! ntupleDescription->GetDescription().GetActivation() )
continue;
360 if ( ! ntupleDescription->GetNtuple() )
continue;
362 Message(kVL4,
"merge",
"pntuple", ntupleDescription->GetDescription().GetNtupleBooking().name());
368 = ntupleDescription->GetNtuple()
372 G4ExceptionDescription description;
373 description <<
" " <<
" ntuple " << ntupleDescription->GetDescription().GetNtupleBooking().name()
374 <<
"end fill has failed.";
375 G4Exception(
"G4RootMpiPNtupleManager::Merge()",
376 "Analysis_W002", JustWarning, description);
379 delete ntupleDescription->GetNtuple();
380 ntupleDescription->SetNtuple(
nullptr);
382 Message(kVL3,
"merge",
"pntuple", ntupleDescription->GetDescription().GetNtupleBooking().name());
396 ntupleDescription->GetDescription().Reset();
408 delete ntupleDescription->GetNtuple();
414 Message(kVL2,
"clear",
"pntuples");
420 if ( IsVerbose(G4Analysis::kVL4) ) {
421 Message(G4Analysis::kVL4,
"delete",
"pntuple ntupleId " + to_string(
id));
426 if (ntupleDescription ==
nullptr)
return false;
429 delete ntupleDescription->GetNtuple();
430 ntupleDescription->SetNtuple(
nullptr);
431 ntupleDescription->SetBasePNtuple(
nullptr);
432 ntupleDescription->GetMainBranches().clear();
435 auto index =
id - GetFirstId();
438 Message(G4Analysis::kVL2,
"delete",
"pntuple ntupleId " + to_string(
id));
449 ntupleDescription->GetDescription().SetActivation(activation);
456 G4int ntupleId, G4bool activation)
459 if ( ! ntupleDescription )
return;
461 ntupleDescription->GetDescription().SetActivation(activation);
466 G4int ntupleId)
const
469 if ( ! ntupleDescription )
return false;
471 return ntupleDescription->GetDescription().GetActivation();
void SetImpi(tools::impi *value)
RootNtupleDescription & GetDescription()
void SetNtuple(tools::wroot::impi_ntuple *intuple)
void SetBasePNtuple(tools::wroot::base_pntuple *basePNtuple)
tools::wroot::impi_ntuple * GetNtuple() const
virtual G4bool GetActivation(G4int ntupleId) const final
virtual G4bool FillNtupleDColumn(G4int ntupleId, G4int columnId, G4double value) final
virtual G4bool Reset() final
G4bool GetNewCycle() const final
virtual G4bool AddNtupleRow(G4int ntupleId) final
virtual G4bool FillNtupleIColumn(G4int ntupleId, G4int columnId, G4int value) final
std::vector< tools::wroot::impi_ntuple * > fNtupleVector
tools::wroot::base_pntuple * GetNtupleInFunction(G4int id, G4String function, G4bool warn=true) const
G4RootMpiPNtupleManager(const G4AnalysisManagerState &state, tools::impi *impi, G4int mpiRank, G4int destinationRank)
void CreateNtuple(G4RootMpiPNtupleDescription *ntupleDescription)
virtual void Clear() final
G4bool Delete(G4int id) final
G4RootMpiPNtupleDescription * GetNtupleDescriptionInFunction(G4int id, G4String function, G4bool warn=true) const
virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, const G4String &value) final
virtual G4bool Merge() final
virtual G4bool FillNtupleFColumn(G4int ntupleId, G4int columnId, G4float value) final
virtual void SetActivation(G4bool activation) final
std::vector< G4RootMpiPNtupleDescription * > fNtupleDescriptionVector
virtual G4int GetNofNtuples() const final
~G4RootMpiPNtupleManager()
void SetNewCycle(G4bool value) final
void CreateNtuplesFromBooking(const std::vector< G4NtupleBooking * > &ntupleBookings)