53 {
54 using MeshScoreMap = G4VScoringMesh::MeshScoreMap;
55
56 if(verboseLevel > 0) {
57 G4cout << "User-defined DumpQuantityToFile() method is invoked."
58 << G4endl;
59 G4cout << " -- to obtain a projection of the quantity <"
60 << psName
61 << "> onto the x-y plane --" << G4endl;
62 }
63
64
66 std::transform(opt.begin(), opt.end(), opt.begin(), (int (*)(int))(tolower));
67
68
69 if(opt.size() == 0) opt = "csv";
70
71
72 std::ofstream ofile(fileName);
73 if(!ofile) {
74 G4cerr << "ERROR : DumpToFile : File open error -> "
75 << fileName << G4endl;
76 return;
77 }
78 ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
79
80
81
82 MeshScoreMap scMap = fScoringMesh->GetScoreMap();
83
84 MeshScoreMap::const_iterator msMapItr = scMap.find(psName);
85 if(msMapItr == scMap.end()) {
86 G4cerr << "ERROR : DumpToFile : Unknown quantity, \""
87 << psName << "\"." << G4endl;
88 return;
89 }
90 std::map<G4int, G4StatDouble*> * score = msMapItr->second->GetMap();
91 ofile << "# primitive scorer name: " << msMapItr->first << G4endl;
92
93
94 ofile << "# xy projection" << G4endl;
95 ofile << fNMeshSegments[0] << " " << fNMeshSegments[1] << " " << G4endl;
96
97
98 std::vector<double> projy;
99 for(int y = 0; y < fNMeshSegments[1]; y++) projy.push_back(0.);
100 std::vector<std::vector<double> > projxy;
101 for(int x = 0; x < fNMeshSegments[0]; x++) projxy.push_back(projy);
102
103 ofile << std::setprecision(16);
104 for(int x = 0; x < fNMeshSegments[0]; x++) {
105 for(int y = 0; y < fNMeshSegments[1]; y++) {
106 for(int z = 0; z < fNMeshSegments[2]; z++) {
107
108 G4int idx = GetIndex(x, y, z);
109
110 std::map<G4int, G4StatDouble*>::iterator value = score->find(idx);
111 if(value != score->end()) projxy[x][y] += value->second->sum_wx();
112
113 }
114 }
115 }
116
117
118 ofile << std::setprecision(16);
119 for(int x = 0; x < fNMeshSegments[0]; x++) {
120 for(int y = 0; y < fNMeshSegments[1]; y++) {
121
122 ofile << x << "," << y << ",";
123 ofile << projxy[x][y] << G4endl;
124
125 }
126 }
127 ofile << std::setprecision(6);
128
129
130 ofile.close();
131
132}