2// ********************************************************************
3// * License and Disclaimer *
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. *
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. *
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// ********************************************************************
27// Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr)
29#include "G4AnalysisManagerState.hh"
30#include "G4AnalysisUtilities.hh"
34//_____________________________________________________________________________
36G4TRNtupleManager<NT>::G4TRNtupleManager(const G4AnalysisManagerState& state)
37 : G4BaseRNtupleManager(state)
40//_____________________________________________________________________________
42G4TRNtupleManager<NT>::~G4TRNtupleManager()
44 for ( auto ntupleDescription : fNtupleDescriptionVector ) {
45 delete ntupleDescription;
53//_____________________________________________________________________________
55G4TRNtupleDescription<NT>*
56G4TRNtupleManager<NT>::GetNtupleDescriptionInFunction(
57 G4int id, std::string_view functionName, G4bool warn) const
59 G4int index = id - fFirstId;
60 if ( index < 0 || index >= G4int(fNtupleDescriptionVector.size()) ) {
62 G4Analysis::Warn("ntuple " + to_string(id) + " does not exist.",
63 fkClass, functionName);
68 return fNtupleDescriptionVector[index];
71//_____________________________________________________________________________
75G4TRNtupleManager<NT>::SetNtupleTColumn(
76 G4int ntupleId, const G4String& columnName, T& value)
78 Message(G4Analysis::kVL4, "set", "ntuple T column",
79 " ntupleId " + to_string(ntupleId) + " " + columnName);
81 auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleTColumn");
82 if ( ! ntupleDescription ) return false;
84 auto ntupleBinding = ntupleDescription->fNtupleBinding;
85 ntupleBinding->add_column(columnName, value);
87 Message(G4Analysis::kVL2, "set", "ntuple T column",
88 " ntupleId " + to_string(ntupleId) + " " + columnName);
93//_____________________________________________________________________________
97G4TRNtupleManager<NT>::SetNtupleTColumn(
98 G4int ntupleId, const G4String& columnName, std::vector<T>& vector)
100 Message(G4Analysis::kVL4, "set", "ntuple T column",
101 " ntupleId " + to_string(ntupleId) + " " + columnName);
103 auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleTColumn");
104 if ( ! ntupleDescription ) return false;
106 auto ntupleBinding = ntupleDescription->fNtupleBinding;
107 ntupleBinding->add_column(columnName, vector);
109 Message(G4Analysis::kVL2, "set", "ntuple T column",
110 " ntupleId " + to_string(ntupleId) + " " + columnName);
120//_____________________________________________________________________________
121template <typename NT>
122G4bool G4TRNtupleManager<NT>::IsEmpty() const
124 return ! fNtupleDescriptionVector.size();
127//_____________________________________________________________________________
128template <typename NT>
129G4bool G4TRNtupleManager<NT>::Reset()
133 for ( auto ntupleDescription : fNtupleDescriptionVector ) {
134 delete ntupleDescription->fNtuple;
135 ntupleDescription->fNtuple=nullptr;
140//_____________________________________________________________________________
141template <typename NT>
143G4TRNtupleManager<NT>::GetNtuple() const
145 return GetNtuple(fFirstId);
148//_____________________________________________________________________________
149template <typename NT>
151G4TRNtupleManager<NT>::GetNtuple(
152 G4int ntupleId) const
154 auto rntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "GetNtuple");
156 if ( ! rntupleDescription ) return nullptr;
158 return rntupleDescription->fNtuple;
161//_____________________________________________________________________________
162template <typename NT>
163G4int G4TRNtupleManager<NT>::SetNtuple(
164 G4TRNtupleDescription<NT>* rntupleDescription)
166 G4int id = fNtupleDescriptionVector.size() + fFirstId;
168 fNtupleDescriptionVector.push_back(rntupleDescription);
173//_____________________________________________________________________________
174template <typename NT>
176G4TRNtupleManager<NT>::SetNtupleIColumn(
177 G4int ntupleId, const G4String& columnName, G4int& value)
179 return SetNtupleTColumn<int>(ntupleId, columnName, value);
182//_____________________________________________________________________________
183template <typename NT>
185G4TRNtupleManager<NT>::SetNtupleFColumn(
186 G4int ntupleId, const G4String& columnName, G4float& value)
188 return SetNtupleTColumn<float>(ntupleId, columnName, value);
191//_____________________________________________________________________________
192template <typename NT>
194G4TRNtupleManager<NT>::SetNtupleDColumn(
195 G4int ntupleId, const G4String& columnName, G4double& value)
197 return SetNtupleTColumn<double>(ntupleId, columnName, value);
200//_____________________________________________________________________________
201template <typename NT>
203G4TRNtupleManager<NT>::SetNtupleIColumn(
204 G4int ntupleId, const G4String& columnName, std::vector<G4int>& vector)
206 return SetNtupleTColumn<int>(ntupleId, columnName, vector);
209//_____________________________________________________________________________
210template <typename NT>
212G4TRNtupleManager<NT>::SetNtupleFColumn(
213 G4int ntupleId, const G4String& columnName, std::vector<G4float>& vector)
215 return SetNtupleTColumn<float>(ntupleId, columnName, vector);
218//_____________________________________________________________________________
219template <typename NT>
221G4TRNtupleManager<NT>::SetNtupleDColumn(
222 G4int ntupleId, const G4String& columnName, std::vector<G4double>& vector)
224 return SetNtupleTColumn<double>(ntupleId, columnName, vector);
227//_____________________________________________________________________________
228template <typename NT>
230G4TRNtupleManager<NT>::SetNtupleSColumn(
231 G4int ntupleId, const G4String& columnName, G4String& value)
233 return SetNtupleTColumn<std::string>(ntupleId, columnName, value);
236//_____________________________________________________________________________
237template <typename NT>
239G4TRNtupleManager<NT>::SetNtupleSColumn(
240 G4int ntupleId, const G4String& columnName, std::vector<std::string>& vector)
242 return SetNtupleTColumn<std::string>(ntupleId, columnName, vector);
245//_____________________________________________________________________________
246template <typename NT>
247G4bool G4TRNtupleManager<NT>::GetNtupleRow(G4int ntupleId)
249 Message(G4Analysis::kVL4, "get", "ntuple row",
250 "ntupleId " + to_string(ntupleId));
252 auto ntupleDescription
253 = GetNtupleDescriptionInFunction(ntupleId, "GetNtupleRow");
254 if ( ! ntupleDescription ) return false;
256 auto next = GetTNtupleRow(ntupleDescription);
258 Message(G4Analysis::kVL2, "get", "ntuple row",
259 "ntupleId " + to_string(ntupleId));
265//_____________________________________________________________________________
266template <typename NT>
268G4TRNtupleManager<NT>::GetNofNtuples() const
270 return G4int(fNtupleDescriptionVector.size());