Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/global/management/src/G4OrderedTable.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 ]

  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 // --------------------------------------------------------------------
 40 G4OrderedTable::G4OrderedTable(std::size_t cap)
 41   : std::vector<G4DataVector*>(cap, (G4DataVector*) nullptr)
 42 {}
 43 
 44 // --------------------------------------------------------------------
 45 void G4OrderedTable::clearAndDestroy()
 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 // --------------------------------------------------------------------
 66 G4bool G4OrderedTable::Store(const G4String& fileName, G4bool ascii)
 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   auto 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 // --------------------------------------------------------------------
119 G4bool G4OrderedTable::Retrieve(const G4String& fileName, G4bool ascii)
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
144   clearAndDestroy();
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     }
178     if(vType != G4DataVector::T_G4DataVector)
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 // --------------------------------------------------------------------
212 std::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 }
226