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
G4VScoreWriter.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//
28
29#include "G4VScoreWriter.hh"
30
32#include "G4VPrimitiveScorer.hh"
33#include "G4VScoringMesh.hh"
34
35#include <map>
36#include <fstream>
37
39{
40 // Should be checked for nullptr!
41 fScoringMesh = sm;
43}
44
46 const G4String& fileName,
47 const G4String& option)
48{
49 // change the option string into lowercase to the case-insensitive.
50 G4String opt = option;
51 std::transform(opt.begin(), opt.end(), opt.begin(), (int (*)(int))(tolower));
52
53 // confirm the option
54 if(opt.empty())
55 opt = "csv";
56 if(opt.find("csv") == std::string::npos &&
57 opt.find("sequence") == std::string::npos)
58 {
59 G4cerr << "ERROR : DumpToFile : Unknown option -> " << option << G4endl;
60 return;
61 }
62
63 // open the file
64 std::ofstream ofile(fileName);
65 if(!ofile)
66 {
67 G4cerr << "ERROR : DumpToFile : File open error -> " << fileName << G4endl;
68 return;
69 }
70 ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
71
72 using MeshScoreMap = G4VScoringMesh::MeshScoreMap;
73 // retrieve the map
74 MeshScoreMap fSMap = fScoringMesh->GetScoreMap();
75
76 // NOLINTNEXTLINE(modernize-use-auto): Explicitly want a const_iterator
77 MeshScoreMap::const_iterator msMapItr = fSMap.find(psName);
78 if(msMapItr == fSMap.end())
79 {
80 G4cerr << "ERROR : DumpToFile : Unknown quantity, \"" << psName << "\"."
81 << G4endl;
82 return;
83 }
84
85 std::map<G4int, G4StatDouble*>* score = msMapItr->second->GetMap();
86 ofile << "# primitive scorer name: " << msMapItr->first << std::endl;
87 if(fact != 1.0)
88 {
89 ofile << "# multiplied factor : " << fact << std::endl;
90 }
91
92 G4double unitValue = fScoringMesh->GetPSUnitValue(psName);
93 G4String unit = fScoringMesh->GetPSUnit(psName);
94 G4String divisionAxisNames[3];
95 fScoringMesh->GetDivisionAxisNames(divisionAxisNames);
96 // index order
97 ofile << "# i" << divisionAxisNames[0] << ", i" << divisionAxisNames[1]
98 << ", i" << divisionAxisNames[2];
99 // unit of scored value
100 ofile << ", total(value) ";
101 if(!unit.empty())
102 ofile << "[" << unit << "]";
103 ofile << ", total(val^2), entry" << G4endl;
104
105 // "sequence" option: write header info
106 if(opt.find("sequence") != std::string::npos)
107 {
108 ofile << fNMeshSegments[0] << " " << fNMeshSegments[1] << " "
109 << fNMeshSegments[2] << G4endl;
110 }
111
112 // write quantity
113 long count = 0;
114 ofile << std::setprecision(16); // for double value with 8 bytes
115 for(int x = 0; x < fNMeshSegments[0]; x++)
116 {
117 for(int y = 0; y < fNMeshSegments[1]; y++)
118 {
119 for(int z = 0; z < fNMeshSegments[2]; z++)
120 {
121 G4int idx = GetIndex(x, y, z);
122
123 if(opt.find("csv") != std::string::npos)
124 ofile << x << "," << y << "," << z << ",";
125
126 auto value = score->find(idx);
127 if(value == score->end())
128 {
129 ofile << 0. << "," << 0. << "," << 0;
130 }
131 else
132 {
133 ofile << (value->second->sum_wx()) / unitValue * fact << ","
134 << (value->second->sum_wx2()) / unitValue / unitValue * fact *
135 fact
136 << "," << value->second->n();
137 }
138
139 if(opt.find("csv") != std::string::npos)
140 {
141 ofile << G4endl;
142 }
143 else if(opt.find("sequence") != std::string::npos)
144 {
145 ofile << " ";
146 if(count++ % 5 == 4)
147 ofile << G4endl;
148 }
149
150 } // z
151 } // y
152 } // x
153 ofile << std::setprecision(6);
154
155 // close the file
156 ofile.close();
157}
158
160 const G4String& option)
161{
162 // change the option string into lowercase to the case-insensitive.
163 G4String opt = option;
164 std::transform(opt.begin(), opt.end(), opt.begin(), (int (*)(int))(tolower));
165
166 // confirm the option
167 if(opt.empty())
168 opt = "csv";
169 if(opt.find("csv") == std::string::npos &&
170 opt.find("sequence") == std::string::npos)
171 {
172 G4cerr << "ERROR : DumpToFile : Unknown option -> " << option << G4endl;
173 return;
174 }
175
176 // open the file
177 std::ofstream ofile(fileName);
178 if(!ofile)
179 {
180 G4cerr << "ERROR : DumpToFile : File open error -> " << fileName << G4endl;
181 return;
182 }
183 ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
184 if(fact != 1.0)
185 {
186 ofile << "# multiplied factor : " << fact << std::endl;
187 }
188
189 // retrieve the map
190 using MeshScoreMap = G4VScoringMesh::MeshScoreMap;
191 MeshScoreMap fSMap = fScoringMesh->GetScoreMap();
192 // NOLINTNEXTLINE(modernize-use-auto): Explicitly want a const_iterator
193 MeshScoreMap::const_iterator msMapItr = fSMap.begin();
194 std::map<G4int, G4StatDouble*>* score;
195 for(; msMapItr != fSMap.end(); msMapItr++)
196 {
197 G4String psname = msMapItr->first;
198
199 score = msMapItr->second->GetMap();
200 ofile << "# primitive scorer name: " << msMapItr->first << std::endl;
201
202 G4double unitValue = fScoringMesh->GetPSUnitValue(psname);
203 G4String unit = fScoringMesh->GetPSUnit(psname);
204 G4String divisionAxisNames[3];
205 fScoringMesh->GetDivisionAxisNames(divisionAxisNames);
206 // index order
207 ofile << "# i" << divisionAxisNames[0] << ", i" << divisionAxisNames[1]
208 << ", i" << divisionAxisNames[2];
209 // unit of scored value
210 ofile << ", total(value) ";
211 if(!unit.empty())
212 ofile << "[" << unit << "]";
213 ofile << ", total(val^2), entry" << G4endl;
214
215 // "sequence" option: write header info
216 if(opt.find("sequence") != std::string::npos)
217 {
218 ofile << fNMeshSegments[0] << " " << fNMeshSegments[1] << " "
219 << fNMeshSegments[2] << G4endl;
220 }
221
222 // write quantity
223 long count = 0;
224 ofile << std::setprecision(16); // for double value with 8 bytes
225 for(int x = 0; x < fNMeshSegments[0]; x++)
226 {
227 for(int y = 0; y < fNMeshSegments[1]; y++)
228 {
229 for(int z = 0; z < fNMeshSegments[2]; z++)
230 {
231 G4int idx = GetIndex(x, y, z);
232
233 if(opt.find("csv") != std::string::npos)
234 ofile << x << "," << y << "," << z << ",";
235
236 auto value = score->find(idx);
237 if(value == score->end())
238 {
239 ofile << 0. << "," << 0. << "," << 0;
240 }
241 else
242 {
243 ofile << (value->second->sum_wx()) / unitValue * fact << ","
244 << (value->second->sum_wx2()) / unitValue / unitValue * fact *
245 fact
246 << "," << value->second->n();
247 }
248
249 if(opt.find("csv") != std::string::npos)
250 {
251 ofile << G4endl;
252 }
253 else if(opt.find("sequence") != std::string::npos)
254 {
255 ofile << " ";
256 if(count++ % 5 == 4)
257 ofile << G4endl;
258 }
259
260 } // z
261 } // y
262 } // x
263 ofile << std::setprecision(6);
264
265 } // for(; msMapItr ....)
266
267 // close the file
268 ofile.close();
269}
270
272{
273 return x * fNMeshSegments[1] * fNMeshSegments[2] + y * fNMeshSegments[2] + z;
274}
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4int fNMeshSegments[3]
G4VScoringMesh * fScoringMesh
virtual void DumpQuantityToFile(const G4String &psName, const G4String &fileName, const G4String &option)
virtual void DumpAllQuantitiesToFile(const G4String &fileName, const G4String &option)
G4int GetIndex(G4int x, G4int y, G4int z) const
void SetScoringMesh(G4VScoringMesh *sm)
void GetNumberOfSegments(G4int nSegment[3])
G4double GetPSUnitValue(const G4String &psname)
G4String GetPSUnit(const G4String &psname)
const G4String & GetWorldName() const
std::map< G4String, RunScore * > MeshScoreMap
void GetDivisionAxisNames(G4String divisionAxisNames[3])
MeshScoreMap GetScoreMap() const
std::ofstream ofile
Definition: clparse.cc:44