Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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// $Id$
28//
29
30#include "G4VScoreWriter.hh"
31
33#include "G4SDParticleFilter.hh"
34#include "G4VPrimitiveScorer.hh"
35#include "G4VScoringMesh.hh"
36
37#include <map>
38#include <fstream>
39
41 : fScoringMesh(0), verboseLevel(0) {
43}
44
46}
47
49 fScoringMesh = sm;
51}
52
54 const G4String& fileName,
55 const G4String& option) {
56
57 // change the option string into lowercase to the case-insensitive.
58 G4String opt = option;
59 std::transform(opt.begin(), opt.end(), opt.begin(), (int (*)(int))(tolower));
60
61 // confirm the option
62 if(opt.size() == 0) opt = "csv";
63 if(opt.find("csv") == std::string::npos &&
64 opt.find("sequence") == std::string::npos) {
65 G4cerr << "ERROR : DumpToFile : Unknown option -> "
66 << option << G4endl;
67 return;
68 }
69
70 // open the file
71 std::ofstream ofile(fileName);
72 if(!ofile) {
73 G4cerr << "ERROR : DumpToFile : File open error -> "
74 << fileName << G4endl;
75 return;
76 }
77 ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
78
79
80 // retrieve the map
82
83
84 MeshScoreMap::const_iterator msMapItr = fSMap.find(psName);
85 if(msMapItr == fSMap.end()) {
86 G4cerr << "ERROR : DumpToFile : Unknown quantity, \""
87 << psName << "\"." << G4endl;
88 return;
89 }
90
91
92 std::map<G4int, G4double*> * score = msMapItr->second->GetMap();
93 ofile << "# primitive scorer name: " << msMapItr->first << std::endl;
94
95
96 G4double unitValue = fScoringMesh->GetPSUnitValue(psName);
97 G4String unit = fScoringMesh->GetPSUnit(psName);
98 G4String divisionAxisNames[3];
99 fScoringMesh->GetDivisionAxisNames(divisionAxisNames);
100 // index order
101 ofile << "# i" << divisionAxisNames[0]
102 << ", i" << divisionAxisNames[1]
103 << ", i" << divisionAxisNames[2];
104 // unit of scored value
105 ofile << ", value ";
106 if(unit.size() > 0) ofile << "[" << unit << "]";
107 ofile << G4endl;
108
109 // "sequence" option: write header info
110 if(opt.find("sequence") != std::string::npos) {
111 ofile << fNMeshSegments[0] << " " << fNMeshSegments[1] << " " << fNMeshSegments[2]
112 << G4endl;
113 }
114
115 // write quantity
116 long count = 0;
117 ofile << std::setprecision(16); // for double value with 8 bytes
118 for(int x = 0; x < fNMeshSegments[0]; x++) {
119 for(int y = 0; y < fNMeshSegments[1]; y++) {
120 for(int z = 0; z < fNMeshSegments[2]; z++) {
121 G4int idx = GetIndex(x, y, z);
122
123 if(opt.find("csv") != std::string::npos)
124 ofile << x << "," << y << "," << z << ",";
125
126 std::map<G4int, G4double*>::iterator value = score->find(idx);
127 if(value == score->end()) {
128 ofile << 0.;
129 } else {
130 ofile << *(value->second)/unitValue;
131 }
132
133 if(opt.find("csv") != std::string::npos) {
134 ofile << G4endl;
135 } else if(opt.find("sequence") != std::string::npos) {
136 ofile << " ";
137 if(count++%5 == 4) ofile << G4endl;
138 }
139
140 } // z
141 } // y
142 } // x
143 ofile << std::setprecision(6);
144
145 // close the file
146 ofile.close();
147
148}
149
151 const G4String& option) {
152
153 // change the option string into lowercase to the case-insensitive.
154 G4String opt = option;
155 std::transform(opt.begin(), opt.end(), opt.begin(), (int (*)(int))(tolower));
156
157 // confirm the option
158 if(opt.size() == 0) opt = "csv";
159 if(opt.find("csv") == std::string::npos &&
160 opt.find("sequence") == std::string::npos) {
161 G4cerr << "ERROR : DumpToFile : Unknown option -> "
162 << option << G4endl;
163 return;
164 }
165
166 // open the file
167 std::ofstream ofile(fileName);
168 if(!ofile) {
169 G4cerr << "ERROR : DumpToFile : File open error -> "
170 << fileName << G4endl;
171 return;
172 }
173 ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
174
175 // retrieve the map
177 MeshScoreMap::const_iterator msMapItr = fSMap.begin();
178 std::map<G4int, G4double*> * score;
179 for(; msMapItr != fSMap.end(); msMapItr++) {
180
181 G4String psname = msMapItr->first;
182
183 score = msMapItr->second->GetMap();
184 ofile << "# primitive scorer name: " << msMapItr->first << std::endl;
185
186 G4double unitValue = fScoringMesh->GetPSUnitValue(psname);
187 G4String unit = fScoringMesh->GetPSUnit(psname);
188 G4String divisionAxisNames[3];
189 fScoringMesh->GetDivisionAxisNames(divisionAxisNames);
190 // index order
191 ofile << "# i" << divisionAxisNames[0]
192 << ", i" << divisionAxisNames[1]
193 << ", i" << divisionAxisNames[2];
194 // unit of scored value
195 ofile << ", value ";
196 if(unit.size() > 0) ofile << "[" << unit << "]";
197 ofile << G4endl;
198
199
200 // "sequence" option: write header info
201 if(opt.find("sequence") != std::string::npos) {
202 ofile << fNMeshSegments[0] << " " << fNMeshSegments[1] << " " << fNMeshSegments[2]
203 << G4endl;
204 }
205
206 // write quantity
207 long count = 0;
208 ofile << std::setprecision(16); // for double value with 8 bytes
209 for(int x = 0; x < fNMeshSegments[0]; x++) {
210 for(int y = 0; y < fNMeshSegments[1]; y++) {
211 for(int z = 0; z < fNMeshSegments[2]; z++) {
212 G4int idx = GetIndex(x, y, z);
213
214 if(opt.find("csv") != std::string::npos)
215 ofile << x << "," << y << "," << z << ",";
216
217 std::map<G4int, G4double*>::iterator value = score->find(idx);
218 if(value == score->end()) {
219 ofile << 0.;
220 } else {
221 ofile << *(value->second)/unitValue;
222 }
223
224 if(opt.find("csv") != std::string::npos) {
225 ofile << G4endl;
226 } else if(opt.find("sequence") != std::string::npos) {
227 ofile << " ";
228 if(count++%5 == 4) ofile << G4endl;
229 }
230
231 } // z
232 } // y
233 } // x
234 ofile << std::setprecision(6);
235
236 } // for(; msMapItr ....)
237
238 // close the file
239 ofile.close();
240
241}
242
244 //return x + y*fNMeshSegments[0] + z*fNMeshSegments[0]*fNMeshSegments[1];
245 return x*fNMeshSegments[1]*fNMeshSegments[2] +y*fNMeshSegments[2]+z;
246}
247
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
std::map< G4String, G4THitsMap< G4double > * > MeshScoreMap
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4int first(char) const
virtual ~G4VScoreWriter()
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)
MeshScoreMap GetScoreMap()
const G4String & GetWorldName() const
void GetDivisionAxisNames(G4String divisionAxisNames[3])
std::ofstream ofile
Definition: clparse.cc:45