Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/analysis/management/src/G4NtupleBookingManager.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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, 01/09/2020  (ivana@ipno.in2p3.fr)
 28 
 29 #include "G4NtupleBookingManager.hh"
 30 #include "G4AnalysisManagerState.hh"
 31 #include "G4AnalysisUtilities.hh"
 32 
 33 using namespace G4Analysis;
 34 using std::to_string;
 35 
 36 //
 37 // private template functions
 38 //
 39 
 40 //_____________________________________________________________________________
 41 G4NtupleBookingManager::G4NtupleBookingManager(
 42   const G4AnalysisManagerState& state)
 43   : G4BaseAnalysisManager(state)
 44 {}
 45 
 46 //_____________________________________________________________________________
 47 G4NtupleBookingManager::~G4NtupleBookingManager()
 48 {
 49   for ( auto ntupleBooking : fNtupleBookingVector ) {
 50     delete ntupleBooking;
 51   }
 52 }
 53 
 54 //_____________________________________________________________________________
 55 G4NtupleBooking*
 56 G4NtupleBookingManager::GetNtupleBookingInFunction(
 57   G4int id, std::string_view functionName, G4bool warn) const
 58 {
 59   auto index = id - fFirstId;
 60   if ( index < 0 || index >= G4int(fNtupleBookingVector.size()) ) {
 61     if ( warn) {
 62       Warn("Ntuple booking " + to_string(id) + " does not exist.",
 63         fkClass, functionName);
 64     }
 65     return nullptr;
 66   }
 67 
 68   return fNtupleBookingVector[index];
 69 }
 70 
 71 //_____________________________________________________________________________
 72 G4bool G4NtupleBookingManager::CheckName(
 73   const G4String& name, const G4String& objectType) const
 74 {
 75   if (name.size() == 0u) {
 76     Warn("Empty " + objectType + " name is not allowed.\n" +
 77       objectType + " was not created.",  fkClass, "CheckName");
 78     return false;
 79   }
 80   return true;
 81 }
 82 
 83 //
 84 // protected functions
 85 //
 86 
 87 //_____________________________________________________________________________
 88 G4bool G4NtupleBookingManager::IsEmpty() const
 89 {
 90   return fNtupleBookingVector.size() == 0u;
 91 }
 92 
 93 //_____________________________________________________________________________
 94 G4int G4NtupleBookingManager::CreateNtuple(
 95   const G4String& name, const G4String& title)
 96 {
 97   if ( ! CheckName(name, "Ntuple") ) return kInvalidId;
 98 
 99   Message(kVL4, "create", "ntuple booking", name);
100 
101   G4int index = 0;
102   G4NtupleBooking* ntupleBooking = nullptr;
103   if (fFreeIds.empty()) {
104     index = (G4int)fNtupleBookingVector.size();
105     ntupleBooking = new G4NtupleBooking();
106     fNtupleBookingVector.push_back(ntupleBooking);
107     ntupleBooking->fNtupleId = G4int(index + fFirstId);
108   }
109   else {
110     // Get the first freed Id
111     index = *(fFreeIds.begin()) - GetFirstId();
112     ntupleBooking = fNtupleBookingVector[index];
113     ntupleBooking->fNtupleBooking = tools::ntuple_booking();
114     ntupleBooking->Reset();
115 
116     // Remove the id from the set
117     fFreeIds.erase(fFreeIds.begin());
118   }
119 
120   // Save name & title in ntuple booking
121   ntupleBooking->fNtupleBooking.set_name(name);
122   ntupleBooking->fNtupleBooking.set_title(title);
123 
124   // Update related data
125   fLockFirstId = true;
126   fCurrentNtupleId = ntupleBooking->fNtupleId;
127 
128   Message(kVL2, "create", "ntuple booking",
129     name +  " ntupleId " + to_string(ntupleBooking->fNtupleId));
130 
131   return fCurrentNtupleId;
132 }
133 
134 //_____________________________________________________________________________
135 G4int G4NtupleBookingManager::CreateNtupleIColumn(const G4String& name,
136                                                std::vector<int>* vector)
137 {
138   return CreateNtupleIColumn(GetCurrentNtupleId(), name, vector);
139 }
140 
141 //_____________________________________________________________________________
142 G4int G4NtupleBookingManager::CreateNtupleFColumn(const G4String& name,
143                                                std::vector<float>* vector)
144 {
145   return CreateNtupleFColumn(GetCurrentNtupleId(), name, vector);
146 }
147 
148 //_____________________________________________________________________________
149 G4int G4NtupleBookingManager::CreateNtupleDColumn(const G4String& name,
150                                                std::vector<double>* vector)
151 {
152   return CreateNtupleDColumn(GetCurrentNtupleId(), name, vector);
153 }
154 
155 //_____________________________________________________________________________
156 G4int G4NtupleBookingManager::CreateNtupleSColumn(const G4String& name,
157                                                std::vector<std::string>* vector)
158 {
159   return CreateNtupleSColumn(GetCurrentNtupleId(), name, vector);
160 }
161 
162 //_____________________________________________________________________________
163 G4NtupleBooking*  G4NtupleBookingManager::FinishNtuple()
164 {
165   return FinishNtuple(GetCurrentNtupleId());
166 }
167 
168 //_____________________________________________________________________________
169 G4int G4NtupleBookingManager::CreateNtupleIColumn(
170   G4int ntupleId, const G4String& name, std::vector<int>* vector)
171 {
172   return CreateNtupleTColumn<int>(ntupleId, name, vector);
173 }
174 
175 //_____________________________________________________________________________
176 G4int G4NtupleBookingManager::CreateNtupleFColumn(
177   G4int ntupleId, const G4String& name, std::vector<float>* vector)
178 {
179   return CreateNtupleTColumn<float>(ntupleId, name, vector);
180 }
181 
182 //_____________________________________________________________________________
183 G4int G4NtupleBookingManager::CreateNtupleDColumn(
184   G4int ntupleId, const G4String& name, std::vector<double>* vector)
185 {
186   return CreateNtupleTColumn<double>(ntupleId, name, vector);
187 }
188 
189 //_____________________________________________________________________________
190 G4int G4NtupleBookingManager::CreateNtupleSColumn(
191   G4int ntupleId, const G4String& name, std::vector<std::string>* vector)
192 {
193   return CreateNtupleTColumn<std::string>(ntupleId, name, vector);
194 }
195 
196 //_____________________________________________________________________________
197 G4NtupleBooking*  G4NtupleBookingManager::FinishNtuple(
198   G4int ntupleId)
199 {
200   // Nothing to be done for booking,
201   return GetNtupleBookingInFunction(ntupleId, "FinishNtuple");
202 }
203 
204 //_____________________________________________________________________________
205 G4bool G4NtupleBookingManager::SetFirstNtupleColumnId(G4int firstId)
206 {
207   if ( fLockFirstNtupleColumnId ) {
208     Warn("Cannot set FirstNtupleColumnId as its value was already used.",
209       fkClass, "SetFirstNtupleColumnId");
210     return false;
211   }
212 
213   fFirstNtupleColumnId = firstId;
214   return true;
215 }
216 
217 //_____________________________________________________________________________
218 void  G4NtupleBookingManager::SetActivation(
219   G4bool activation)
220 {
221   for ( auto ntupleBooking : fNtupleBookingVector ) {
222     ntupleBooking->fActivation = activation;
223   }
224 }
225 
226 //_____________________________________________________________________________
227 void  G4NtupleBookingManager::SetActivation(
228   G4int ntupleId, G4bool activation)
229 {
230   auto ntupleBooking
231     = GetNtupleBookingInFunction(ntupleId, "SetActivation");
232   if (ntupleBooking == nullptr) return;
233 
234   ntupleBooking->fActivation = activation;
235 }
236 
237 //_____________________________________________________________________________
238 G4bool  G4NtupleBookingManager::GetActivation(
239   G4int ntupleId) const
240 {
241   auto ntupleBooking
242     = GetNtupleBookingInFunction(ntupleId, "GetActivation");
243   if (ntupleBooking == nullptr) return false;
244 
245   return ntupleBooking->fActivation;
246 }
247 
248 //_____________________________________________________________________________
249 void  G4NtupleBookingManager::SetFileName(
250   const G4String& fileName)
251 {
252   for ( auto ntupleBooking : fNtupleBookingVector ) {
253     ntupleBooking->fFileName = fileName;
254   }
255 }
256 
257 //_____________________________________________________________________________
258 void  G4NtupleBookingManager::SetFileName(
259   G4int ntupleId, const G4String& fileName)
260 {
261   auto ntupleBooking
262     = GetNtupleBookingInFunction(ntupleId, "SetFileName");
263   if (ntupleBooking == nullptr) return;
264 
265   // Do nothing if file name does not change
266   if ( ntupleBooking->fFileName == fileName ) return;
267 
268   auto ntupleFileName = fileName;
269   auto extension = GetExtension(fileName);
270   if (extension.size() != 0u) {
271     // Check if valid extension (if present)
272     auto output = G4Analysis::GetOutput(extension);
273     if ( output == G4AnalysisOutput::kNone ) {
274       Warn("The file extension " + extension + " is not supported.",
275         fkClass, "SetFileName");
276       return;
277     }
278   }
279   else {
280     if (fFileType.size() != 0u) {
281       //add extension if missing and file type is defined
282       ntupleFileName = fileName + "." + fFileType;
283     }
284   }
285 
286   // Save the fileName in booking
287   // If extension is still missing (possible with generic manager),
288   // it will be completed with the default one at OpenFile
289   ntupleBooking->fFileName = std::move(ntupleFileName);
290 }
291 
292 //_____________________________________________________________________________
293 G4String  G4NtupleBookingManager::GetFileName(
294   G4int ntupleId) const
295 {
296   auto ntupleBooking
297     = GetNtupleBookingInFunction(ntupleId, "GetFileName");
298   if (ntupleBooking == nullptr) return "";
299 
300   return ntupleBooking->fFileName;
301 }
302 
303 //_____________________________________________________________________________
304 void G4NtupleBookingManager::ClearData()
305 {
306   for ( auto ntupleBooking : fNtupleBookingVector ) {
307     delete ntupleBooking;
308   }
309   fNtupleBookingVector.clear();
310   fLockFirstNtupleColumnId = false;
311 
312   Message(G4Analysis::kVL2, "clear", "ntupleBookings");
313 }
314 
315 //_____________________________________________________________________________
316 G4bool G4NtupleBookingManager::Delete(G4int id, G4bool keepSetting)
317 {
318   Message(kVL4, "delete", "ntuple booking ntupleId " + to_string(id));
319 
320   auto ntupleBooking = GetNtupleBookingInFunction(id, "Delete", true);
321 
322   if (ntupleBooking == nullptr) return false;
323 
324   // Update ntuple booking
325   ntupleBooking->SetDeleted(true, keepSetting);
326 
327   // Register freed Id
328   fFreeIds.insert(id);
329 
330   Message(G4Analysis::kVL2, "delete", "ntuple booking ntupleId " + to_string(id));
331 
332   return true;
333 }
334 
335 //_____________________________________________________________________________
336 G4bool G4NtupleBookingManager::List(std::ostream& output, G4bool onlyIfActive)
337 {
338   // Save current output stream formatting
339   std::ios_base::fmtflags outputFlags(output.flags() );
340 
341   // Define optimal field widths
342   size_t maxNameLength = 0;
343   size_t maxTitleLength = 0;
344   // size_t maxEntries = 0;
345   size_t nofActive = 0;
346   for (auto g4NtupleBooking : fNtupleBookingVector) {
347     const auto& ntupleBooking = g4NtupleBooking->fNtupleBooking;
348     if (ntupleBooking.name().length() > maxNameLength) {
349       maxNameLength = ntupleBooking.name().length();
350     }
351     if (ntupleBooking.title().length() > maxTitleLength) {
352       maxTitleLength = ntupleBooking.title().length();
353     }
354     // if (ntuple->entries() > maxEntries) {
355     //   maxEntries = ntuple->entries();
356     // }
357     if (g4NtupleBooking->fActivation) {
358       ++nofActive;
359     }
360   }
361   size_t maxIdWidth = std::to_string(fNtupleBookingVector.size() + GetFirstId()).length();
362   // update strings width for added double quotas
363   maxNameLength += 2;
364   maxTitleLength += 2;
365 
366   // List general info
367   output << "Ntuple: " << nofActive << " active ";
368   if (! onlyIfActive) {
369      output << " of " << GetNofNtuples(true) << " defined ";
370   }
371   output << G4endl;
372 
373   // List objects
374   G4int counter = 0;
375   for (auto g4NtupleBooking : fNtupleBookingVector) {
376     const auto& ntupleBooking = g4NtupleBooking->fNtupleBooking;
377 
378     // skip inactivated objcets
379     if (fState.GetIsActivation() && onlyIfActive && (! g4NtupleBooking->fActivation)) continue;
380 
381     // print selected info
382     output << "   id: " << std::setw((G4int)maxIdWidth) << GetFirstId() + counter++
383       << " name: \"" << std::setw((G4int)maxNameLength) << std::left << ntupleBooking.name() + "\""
384       << " title: \"" << std::setw((G4int)maxTitleLength) << std::left << ntupleBooking.title() + "\"";
385       // << " entries: " << std::setw((G4int)maxEntriesWidth) << ntuple->entries();
386     if (! onlyIfActive) {
387       output << " active: " << std::boolalpha << g4NtupleBooking->fActivation;
388     }
389     output  << G4endl;
390   }
391 
392   // Restore the output stream formatting
393   output.flags(outputFlags);
394 
395   return output.good();
396 }
397 
398 //
399 // public methods
400 //
401 
402 //_____________________________________________________________________________
403 void G4NtupleBookingManager::SetFileType(const G4String& fileType)
404 {
405   // do nothing if file type is defined and is same
406   if ( fFileType == fileType ) return;
407 
408   // save the type
409   fFileType = fileType;
410 
411   // Give warning and redefine file extension in bookings
412   // with file name of different fileTypes
413   for ( auto ntupleBooking : fNtupleBookingVector ) {
414     if ((ntupleBooking->fFileName).size() == 0u) continue;
415 
416     auto extension = GetExtension(ntupleBooking->fFileName);
417     if ( fFileType == extension ) continue;
418 
419     // multiple file types are not suported
420     auto baseFileName = GetBaseName(ntupleBooking->fFileName);
421     auto ntupleFileName = baseFileName + "." + fFileType;
422     if (extension.size() != 0u) {
423       Warn("Writing ntuples in files of different output types " +
424            fFileType + ", " + extension + " is not supported.",
425            fkClass, "SetFileType");
426     }
427 
428     // Save the info in ntuple description
429     ntupleBooking->fFileName = std::move(ntupleFileName);
430   }
431 }
432 
433 //_____________________________________________________________________________
434 tools::ntuple_booking* G4NtupleBookingManager::GetNtuple(
435   G4bool warn, G4bool onlyIfActive) const
436 {
437   return GetNtuple(fFirstId, warn, onlyIfActive);
438 }
439 
440 //_____________________________________________________________________________
441 tools::ntuple_booking* G4NtupleBookingManager::GetNtuple(
442   G4int ntupleId, G4bool warn, G4bool onlyIfActive) const
443 {
444   auto g4Booking = GetNtupleBookingInFunction(ntupleId, "GetNtuple", warn);
445 
446   if (g4Booking == nullptr) return nullptr;
447 
448   if ( ( g4Booking->GetDeleted() ) ||
449        ( onlyIfActive && (! g4Booking->fActivation) ) ) return nullptr;
450 
451   return &(g4Booking->fNtupleBooking);
452 }
453