Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4OrderedTable.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// G4OrderedTable class implementation
27//
28// Author: M.Maire (LAPP), September 1996
29// Revisions: H.Kurashige (Kobe Univ.), January-September 2001
30// --------------------------------------------------------------------
31
32#include "G4OrderedTable.hh"
33#include "G4DataVector.hh"
34
35#include <fstream>
36#include <iomanip>
37#include <iostream>
38
39// --------------------------------------------------------------------
41 : std::vector<G4DataVector*>(cap, (G4DataVector*) nullptr)
42{}
43
44// --------------------------------------------------------------------
46{
47 G4DataVector* a = nullptr;
48 while(!empty())
49 {
50 a = back();
51 pop_back();
52 for(auto i = cbegin(); i != cend(); ++i)
53 {
54 if(*i == a)
55 {
56 erase(i);
57 --i;
58 }
59 }
60
61 delete a;
62 }
63}
64
65// --------------------------------------------------------------------
67{
68 std::ofstream fOut;
69
70 // open output file //
71 if(!ascii)
72 {
73 fOut.open(fileName, std::ios::out | std::ios::binary);
74 }
75 else
76 {
77 fOut.open(fileName, std::ios::out);
78 }
79
80 // check if the file has been opened successfully
81 if(!fOut)
82 {
83#ifdef G4VERBOSE
84 G4cerr << "G4OrderedTable::::Store():";
85 G4cerr << " Cannot open file: " << fileName << G4endl;
86#endif
87 fOut.close();
88 return false;
89 }
90
91 G4int tableSize = G4int(size()); // Number of elements
92 if(!ascii)
93 {
94 fOut.write((char*) (&tableSize), sizeof tableSize);
95 }
96 else
97 {
98 fOut << tableSize << G4endl;
99 }
100
101 G4int vType = G4DataVector::T_G4DataVector; // Data Vector
102 for(const auto itr : *this)
103 {
104 if(!ascii)
105 {
106 fOut.write((char*) (&vType), sizeof vType);
107 }
108 else
109 {
110 fOut << vType << G4endl;
111 }
112 itr->Store(fOut, ascii);
113 }
114 fOut.close();
115 return true;
116}
117
118// --------------------------------------------------------------------
120{
121 std::ifstream fIn;
122 // open input file //
123 if(!ascii)
124 {
125 fIn.open(fileName, std::ios::in | std::ios::binary);
126 }
127 else
128 {
129 fIn.open(fileName, std::ios::in);
130 }
131
132 // check if the file has been opened successfully
133 if(!fIn)
134 {
135#ifdef G4VERBOSE
136 G4cerr << "G4OrderedTable::Retrieve():";
137 G4cerr << " Cannot open file: " << fileName << G4endl;
138#endif
139 fIn.close();
140 return false;
141 }
142
143 // clear
145
146 // Number of elements
147 G4int tableSize = 0;
148 if(!ascii)
149 {
150 fIn.read((char*) (&tableSize), sizeof tableSize);
151 }
152 else
153 {
154 fIn >> tableSize;
155 }
156 if(tableSize <= 0)
157 {
158#ifdef G4VERBOSE
159 G4cerr << "G4OrderedTable::Retrieve():";
160 G4cerr << " Invalid table size: " << tableSize << G4endl;
161#endif
162 return false;
163 }
164 reserve(tableSize);
165
166 // Physics Vector
167 for(G4int idx = 0; idx < tableSize; ++idx)
168 {
169 G4int vType = 0;
170 if(!ascii)
171 {
172 fIn.read((char*) (&vType), sizeof vType);
173 }
174 else
175 {
176 fIn >> vType;
177 }
179 {
180#ifdef G4VERBOSE
181 G4cerr << "G4OrderedTable::Retrieve():";
182 G4cerr << " Illegal Data Vector type: " << vType << " in ";
183 G4cerr << fileName << G4endl;
184#endif
185 fIn.close();
186 return false;
187 }
188
189 auto* pVec = new G4DataVector;
190
191 if(!(pVec->Retrieve(fIn, ascii)))
192 {
193#ifdef G4VERBOSE
194 G4cerr << "G4OrderedTable::Retrieve(): ";
195 G4cerr << " Error in retreiving " << idx
196 << "-th Physics Vector from file: ";
197 G4cerr << fileName << G4endl;
198#endif
199 fIn.close();
200 delete pVec;
201 return false;
202 }
203
204 // add a PhysicsVector to this OrderedTable
205 push_back(pVec);
206 }
207 fIn.close();
208 return true;
209}
210
211// --------------------------------------------------------------------
212std::ostream& operator<<(std::ostream& out, G4OrderedTable& right)
213{
214 // Printout Data Vector
215 std::size_t i = 0;
216 for(const auto itr : right)
217 {
218 out << std::setw(8) << i << "-th Vector ";
219 out << ": Type " << G4DataVector::T_G4DataVector << G4endl;
220 out << *itr;
221 i += 1;
222 }
223 out << G4endl;
224 return out;
225}
std::ostream & operator<<(std::ostream &out, G4OrderedTable &right)
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4OrderedTable()=default
void clearAndDestroy()
G4bool Store(const G4String &filename, G4bool ascii=false)
G4bool Retrieve(const G4String &filename, G4bool ascii=false)