Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/digits_hits/utils/src/G4VScoreWriter.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 ]

Diff markup

Differences between /digits_hits/utils/src/G4VScoreWriter.cc (Version 11.3.0) and /digits_hits/utils/src/G4VScoreWriter.cc (Version 10.7)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // G4VScoreWriter                              <<  26 //
 27 // ------------------------------------------- <<  27 //
 28                                                    28 
 29 #include "G4VScoreWriter.hh"                       29 #include "G4VScoreWriter.hh"
 30                                                    30 
 31 #include "G4MultiFunctionalDetector.hh"            31 #include "G4MultiFunctionalDetector.hh"
                                                   >>  32 #include "G4SDParticleFilter.hh"
 32 #include "G4VPrimitiveScorer.hh"                   33 #include "G4VPrimitiveScorer.hh"
 33 #include "G4VScoringMesh.hh"                       34 #include "G4VScoringMesh.hh"
 34                                                    35 
 35 #include <map>                                     36 #include <map>
 36 #include <fstream>                                 37 #include <fstream>
 37                                                    38 
 38 void G4VScoreWriter::SetScoringMesh(G4VScoring <<  39 G4VScoreWriter::G4VScoreWriter()
                                                   >>  40   : fScoringMesh(nullptr), verboseLevel(0), fact(1.0)
 39 {                                                  41 {
 40   // Should be checked for nullptr!            <<  42   fNMeshSegments[0] = fNMeshSegments[1] = fNMeshSegments[2] = 0;
 41   fScoringMesh = sm;                           <<  43 }
 42   fScoringMesh->GetNumberOfSegments(fNMeshSegm <<  44 
                                                   >>  45 G4VScoreWriter::~G4VScoreWriter() {
                                                   >>  46 }
                                                   >>  47 
                                                   >>  48 void G4VScoreWriter::SetScoringMesh(G4VScoringMesh * sm) {
                                                   >>  49     fScoringMesh = sm;
                                                   >>  50     fScoringMesh->GetNumberOfSegments(fNMeshSegments);
 43 }                                                  51 }
 44                                                    52 
 45 void G4VScoreWriter::DumpQuantityToFile(const      53 void G4VScoreWriter::DumpQuantityToFile(const G4String& psName,
 46                                         const      54                                         const G4String& fileName,
 47                                         const  <<  55                                         const G4String& option) {
 48 {                                              <<  56 
 49   // change the option string into lowercase t     57   // change the option string into lowercase to the case-insensitive.
 50   G4String opt = option;                           58   G4String opt = option;
 51   std::transform(opt.begin(), opt.end(), opt.b     59   std::transform(opt.begin(), opt.end(), opt.begin(), (int (*)(int))(tolower));
 52                                                    60 
 53   // confirm the option                            61   // confirm the option
 54   if(opt.empty())                              <<  62   if(opt.size() == 0) opt = "csv";
 55     opt = "csv";                               << 
 56   if(opt.find("csv") == std::string::npos &&       63   if(opt.find("csv") == std::string::npos &&
 57      opt.find("sequence") == std::string::npos <<  64      opt.find("sequence") == std::string::npos) {
 58   {                                            <<  65     G4cerr << "ERROR : DumpToFile : Unknown option -> "
 59     G4cerr << "ERROR : DumpToFile : Unknown op <<  66      << option << G4endl;
 60     return;                                        67     return;
 61   }                                                68   }
 62                                                    69 
 63   // open the file                                 70   // open the file
 64   std::ofstream ofile(fileName);                   71   std::ofstream ofile(fileName);
 65   if(!ofile)                                   <<  72   if(!ofile) {
 66   {                                            <<  73     G4cerr << "ERROR : DumpToFile : File open error -> "
 67     G4cerr << "ERROR : DumpToFile : File open  <<  74      << fileName << G4endl;
 68     return;                                        75     return;
 69   }                                                76   }
 70   ofile << "# mesh name: " << fScoringMesh->Ge     77   ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
 71                                                    78 
 72   using MeshScoreMap = G4VScoringMesh::MeshSco     79   using MeshScoreMap = G4VScoringMesh::MeshScoreMap;
 73   // retrieve the map                              80   // retrieve the map
 74   MeshScoreMap fSMap = fScoringMesh->GetScoreM     81   MeshScoreMap fSMap = fScoringMesh->GetScoreMap();
                                                   >>  82   
 75                                                    83 
 76   // NOLINTNEXTLINE(modernize-use-auto): Expli << 
 77   MeshScoreMap::const_iterator msMapItr = fSMa     84   MeshScoreMap::const_iterator msMapItr = fSMap.find(psName);
 78   if(msMapItr == fSMap.end())                  <<  85   if(msMapItr == fSMap.end()) {
 79   {                                            <<  86     G4cerr << "ERROR : DumpToFile : Unknown quantity, \""
 80     G4cerr << "ERROR : DumpToFile : Unknown qu <<  87      << psName << "\"." << G4endl;
 81            << G4endl;                          << 
 82     return;                                        88     return;
 83   }                                                89   }
 84                                                    90 
 85   std::map<G4int, G4StatDouble*>* score = msMa <<  91 
                                                   >>  92   std::map<G4int, G4StatDouble*> * score = msMapItr->second->GetMap();
 86   ofile << "# primitive scorer name: " << msMa     93   ofile << "# primitive scorer name: " << msMapItr->first << std::endl;
 87   if(fact != 1.0)                              <<  94   if(fact!=1.0)
 88   {                                            <<  95   { ofile << "# multiplied factor : " << fact << std::endl; }
 89     ofile << "# multiplied factor : " << fact  << 
 90   }                                            << 
 91                                                    96 
 92   G4double unitValue = fScoringMesh->GetPSUnit     97   G4double unitValue = fScoringMesh->GetPSUnitValue(psName);
 93   G4String unit      = fScoringMesh->GetPSUnit <<  98   G4String unit = fScoringMesh->GetPSUnit(psName);
 94   G4String divisionAxisNames[3];                   99   G4String divisionAxisNames[3];
 95   fScoringMesh->GetDivisionAxisNames(divisionA    100   fScoringMesh->GetDivisionAxisNames(divisionAxisNames);
 96   // index order                                  101   // index order
 97   ofile << "# i" << divisionAxisNames[0] << ", << 102   ofile << "# i" << divisionAxisNames[0]
 98         << ", i" << divisionAxisNames[2];      << 103   << ", i" << divisionAxisNames[1]
                                                   >> 104   << ", i" << divisionAxisNames[2];
 99   // unit of scored value                         105   // unit of scored value
100   ofile << ", total(value) ";                     106   ofile << ", total(value) ";
101   if(!unit.empty())                            << 107   if(unit.size() > 0) ofile << "[" << unit << "]";
102     ofile << "[" << unit << "]";               << 
103   ofile << ", total(val^2), entry" << G4endl;     108   ofile << ", total(val^2), entry" << G4endl;
104                                                   109 
105   // "sequence" option: write header info      << 110   // "sequence" option: write header info 
106   if(opt.find("sequence") != std::string::npos << 111   if(opt.find("sequence") != std::string::npos) {
107   {                                            << 112     ofile << fNMeshSegments[0] << " " << fNMeshSegments[1] << " " << fNMeshSegments[2]
108     ofile << fNMeshSegments[0] << " " << fNMes << 113     << G4endl;
109           << fNMeshSegments[2] << G4endl;      << 
110   }                                               114   }
111                                                   115 
112   // write quantity                               116   // write quantity
113   G4long count = 0;                            << 117   long count = 0;
114   ofile << std::setprecision(16);  // for doub << 118   ofile << std::setprecision(16); // for double value with 8 bytes
115   for(G4int x = 0; x < fNMeshSegments[0]; x++) << 119   for(int x = 0; x < fNMeshSegments[0]; x++) {
116   {                                            << 120     for(int y = 0; y < fNMeshSegments[1]; y++) {
117     for(G4int y = 0; y < fNMeshSegments[1]; y+ << 121       for(int z = 0; z < fNMeshSegments[2]; z++) {
118     {                                          << 122   G4int idx = GetIndex(x, y, z);
119       for(G4int z = 0; z < fNMeshSegments[2];  << 123   
120       {                                        << 124   if(opt.find("csv") != std::string::npos)
121         G4int idx = GetIndex(x, y, z);         << 125     ofile << x << "," << y << "," << z << ",";
122                                                << 126 
123         if(opt.find("csv") != std::string::npo << 127   std::map<G4int, G4StatDouble*>::iterator value = score->find(idx);
124           ofile << x << "," << y << "," << z < << 128   if(value == score->end()) {
125                                                << 129     ofile << 0. << "," << 0. << "," << 0;
126         auto value = score->find(idx);         << 130   } else {
127         if(value == score->end())              << 131     ofile << (value->second->sum_wx())/unitValue*fact << ","
128         {                                      << 132                 << (value->second->sum_wx2())/unitValue/unitValue*fact*fact << ","
129           ofile << 0. << "," << 0. << "," << 0 << 133                 << value->second->n();
130         }                                      << 134   }
131         else                                   << 135 
132         {                                      << 136   if(opt.find("csv") != std::string::npos) {
133           ofile << (value->second->sum_wx()) / << 137     ofile << G4endl;
134                 << (value->second->sum_wx2())  << 138   } else if(opt.find("sequence") != std::string::npos) {
135                      fact                      << 139     ofile << " ";
136                 << "," << value->second->n();  << 140     if(count++%5 == 4) ofile << G4endl;
137         }                                      << 141   }
138                                                << 142 
139         if(opt.find("csv") != std::string::npo << 143       } // z
140         {                                      << 144     } // y
141           ofile << G4endl;                     << 145   } // x
142         }                                      << 
143         else if(opt.find("sequence") != std::s << 
144         {                                      << 
145           ofile << " ";                        << 
146           if(count++ % 5 == 4)                 << 
147             ofile << G4endl;                   << 
148         }                                      << 
149                                                << 
150       }  // z                                  << 
151     }    // y                                  << 
152   }      // x                                  << 
153   ofile << std::setprecision(6);                  146   ofile << std::setprecision(6);
154                                                   147 
155   // close the file                               148   // close the file
156   ofile.close();                                  149   ofile.close();
                                                   >> 150   
157 }                                                 151 }
158                                                   152 
159 void G4VScoreWriter::DumpAllQuantitiesToFile(c    153 void G4VScoreWriter::DumpAllQuantitiesToFile(const G4String& fileName,
160                                              c << 154                                              const G4String& option) {
161 {                                              << 155 
162   // change the option string into lowercase t    156   // change the option string into lowercase to the case-insensitive.
163   G4String opt = option;                          157   G4String opt = option;
164   std::transform(opt.begin(), opt.end(), opt.b << 158   std::transform(opt.begin(), opt.end(), opt.begin(), (int (*)(int))(tolower));
165                                                   159 
166   // confirm the option                           160   // confirm the option
167   if(opt.empty())                              << 161   if(opt.size() == 0) opt = "csv";
168     opt = "csv";                               << 
169   if(opt.find("csv") == std::string::npos &&      162   if(opt.find("csv") == std::string::npos &&
170      opt.find("sequence") == std::string::npos << 163      opt.find("sequence") == std::string::npos) {
171   {                                            << 164     G4cerr << "ERROR : DumpToFile : Unknown option -> "
172     G4cerr << "ERROR : DumpToFile : Unknown op << 165      << option << G4endl;
173     return;                                       166     return;
174   }                                               167   }
175                                                   168 
176   // open the file                                169   // open the file
177   std::ofstream ofile(fileName);                  170   std::ofstream ofile(fileName);
178   if(!ofile)                                   << 171   if(!ofile) {
179   {                                            << 172     G4cerr << "ERROR : DumpToFile : File open error -> "
180     G4cerr << "ERROR : DumpToFile : File open  << 173      << fileName << G4endl;
181     return;                                       174     return;
182   }                                               175   }
183   ofile << "# mesh name: " << fScoringMesh->Ge    176   ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
184   if(fact != 1.0)                              << 177   if(fact!=1.0)
185   {                                            << 178   { ofile << "# multiplied factor : " << fact << std::endl; }
186     ofile << "# multiplied factor : " << fact  << 
187   }                                            << 
188                                                   179 
189   // retrieve the map                             180   // retrieve the map
190   using MeshScoreMap = G4VScoringMesh::MeshSco    181   using MeshScoreMap = G4VScoringMesh::MeshScoreMap;
191   MeshScoreMap fSMap = fScoringMesh->GetScoreM    182   MeshScoreMap fSMap = fScoringMesh->GetScoreMap();
192   // NOLINTNEXTLINE(modernize-use-auto): Expli << 
193   MeshScoreMap::const_iterator msMapItr = fSMa    183   MeshScoreMap::const_iterator msMapItr = fSMap.begin();
194   std::map<G4int, G4StatDouble*>* score;       << 184   std::map<G4int, G4StatDouble*> * score;
195   for(; msMapItr != fSMap.end(); msMapItr++)   << 185   for(; msMapItr != fSMap.end(); msMapItr++) {
196   {                                            << 186 
197     G4String psname = msMapItr->first;            187     G4String psname = msMapItr->first;
198                                                   188 
199     score = msMapItr->second->GetMap();           189     score = msMapItr->second->GetMap();
200     ofile << "# primitive scorer name: " << ms    190     ofile << "# primitive scorer name: " << msMapItr->first << std::endl;
201                                                   191 
202     G4double unitValue = fScoringMesh->GetPSUn    192     G4double unitValue = fScoringMesh->GetPSUnitValue(psname);
203     G4String unit      = fScoringMesh->GetPSUn << 193     G4String unit = fScoringMesh->GetPSUnit(psname);
204     G4String divisionAxisNames[3];                194     G4String divisionAxisNames[3];
205     fScoringMesh->GetDivisionAxisNames(divisio    195     fScoringMesh->GetDivisionAxisNames(divisionAxisNames);
206     // index order                                196     // index order
207     ofile << "# i" << divisionAxisNames[0] <<  << 197     ofile << "# i" << divisionAxisNames[0]
208           << ", i" << divisionAxisNames[2];    << 198     << ", i" << divisionAxisNames[1]
                                                   >> 199     << ", i" << divisionAxisNames[2];
209     // unit of scored value                       200     // unit of scored value
210     ofile << ", total(value) ";                   201     ofile << ", total(value) ";
211     if(!unit.empty())                          << 202     if(unit.size() > 0) ofile << "[" << unit << "]";
212       ofile << "[" << unit << "]";             << 
213     ofile << ", total(val^2), entry" << G4endl    203     ofile << ", total(val^2), entry" << G4endl;
214                                                   204 
215     // "sequence" option: write header info    << 205 
216     if(opt.find("sequence") != std::string::np << 206     // "sequence" option: write header info 
217     {                                          << 207     if(opt.find("sequence") != std::string::npos) {
218       ofile << fNMeshSegments[0] << " " << fNM << 208       ofile << fNMeshSegments[0] << " " << fNMeshSegments[1] << " " << fNMeshSegments[2]
219             << fNMeshSegments[2] << G4endl;    << 209       << G4endl;
220     }                                             210     }
221                                                   211 
222     // write quantity                             212     // write quantity
223     G4long count = 0;                          << 213     long count = 0;
224     ofile << std::setprecision(16);  // for do << 214     ofile << std::setprecision(16); // for double value with 8 bytes
225     for(G4int x = 0; x < fNMeshSegments[0]; x+ << 215     for(int x = 0; x < fNMeshSegments[0]; x++) {
226     {                                          << 216       for(int y = 0; y < fNMeshSegments[1]; y++) {
227       for(G4int y = 0; y < fNMeshSegments[1];  << 217   for(int z = 0; z < fNMeshSegments[2]; z++) {
228       {                                        << 218     G4int idx = GetIndex(x, y, z);
229         for(G4int z = 0; z < fNMeshSegments[2] << 219     
230         {                                      << 220     if(opt.find("csv") != std::string::npos)
231           G4int idx = GetIndex(x, y, z);       << 221       ofile << x << "," << y << "," << z << ",";
232                                                << 222     
233           if(opt.find("csv") != std::string::n << 223     std::map<G4int, G4StatDouble*>::iterator value = score->find(idx);
234             ofile << x << "," << y << "," << z << 224       if(value == score->end()) {
235                                                << 225       ofile << 0. << "," << 0. << "," << 0;
236           auto value = score->find(idx);       << 226     } else {
237           if(value == score->end())            << 227       ofile << (value->second->sum_wx())/unitValue*fact << ","
238           {                                    << 228                   << (value->second->sum_wx2())/unitValue/unitValue*fact*fact << ","
239             ofile << 0. << "," << 0. << "," << << 229                   << value->second->n();
240           }                                    << 230     }
241           else                                 << 231 
242           {                                    << 232     if(opt.find("csv") != std::string::npos) {
243             ofile << (value->second->sum_wx()) << 233       ofile << G4endl;
244                   << (value->second->sum_wx2() << 234     } else if(opt.find("sequence") != std::string::npos) {
245                        fact                    << 235       ofile << " ";
246                   << "," << value->second->n() << 236       if(count++%5 == 4) ofile << G4endl;
247           }                                    << 237     }
248                                                << 238 
249           if(opt.find("csv") != std::string::n << 239   } // z
250           {                                    << 240       } // y
251             ofile << G4endl;                   << 241     } // x
252           }                                    << 
253           else if(opt.find("sequence") != std: << 
254           {                                    << 
255             ofile << " ";                      << 
256             if(count++ % 5 == 4)               << 
257               ofile << G4endl;                 << 
258           }                                    << 
259                                                << 
260         }  // z                                << 
261       }    // y                                << 
262     }      // x                                << 
263     ofile << std::setprecision(6);                242     ofile << std::setprecision(6);
264                                                   243 
265   }  // for(; msMapItr ....)                   << 244   } // for(; msMapItr ....)
266                                                   245 
267   // close the file                               246   // close the file
268   ofile.close();                                  247   ofile.close();
                                                   >> 248   
269 }                                                 249 }
270                                                   250 
271 G4int G4VScoreWriter::GetIndex(G4int x, G4int  << 251 G4int G4VScoreWriter::GetIndex(G4int x, G4int y, G4int z) const {
272 {                                              << 252     //return x + y*fNMeshSegments[0] + z*fNMeshSegments[0]*fNMeshSegments[1];
273   return x * fNMeshSegments[1] * fNMeshSegment << 253     return x*fNMeshSegments[1]*fNMeshSegments[2] +y*fNMeshSegments[2]+z;
274 }                                                 254 }
                                                   >> 255 
275                                                   256