00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "G4PhysicsVector.hh"
00047 #include <iomanip>
00048
00049 G4PhysicsVector::G4PhysicsVector()
00050 : type(T_G4PhysicsVector),
00051 edgeMin(0.), edgeMax(0.), numberOfBin(0),
00052 lastEnergy(0.), lastValue(0.), lastBin(0)
00053 {
00054 }
00055
00056 G4PhysicsVector::~G4PhysicsVector()
00057 {
00058 dataVector.clear();
00059 binVector.clear();
00060 type = T_G4PhysicsVector;
00061 }
00062
00063 G4PhysicsVector::G4PhysicsVector(const G4PhysicsVector& right)
00064 {
00065 *this=right;
00066 }
00067
00068 G4PhysicsVector& G4PhysicsVector::operator=(const G4PhysicsVector& right)
00069 {
00070 if (&right==this) { return *this; }
00071 if (type != right.type) { return *this; }
00072
00073 type = right.type;
00074 edgeMin = right.edgeMin;
00075 edgeMax = right.edgeMax;
00076 numberOfBin = right.numberOfBin;
00077 lastEnergy = right.lastEnergy;
00078 lastValue = right.lastValue;
00079 lastBin = right.lastBin;
00080 dataVector = right.dataVector;
00081 binVector = right.binVector;
00082 comment = right.comment;
00083 return *this;
00084 }
00085
00086 G4int G4PhysicsVector::operator==(const G4PhysicsVector &right) const
00087 {
00088 return (this == &right);
00089 }
00090
00091 G4int G4PhysicsVector::operator!=(const G4PhysicsVector &right) const
00092 {
00093 return (this != &right);
00094 }
00095
00096 G4double G4PhysicsVector::GetLowEdgeEnergy(size_t binNumber) const
00097 {
00098 return binVector[binNumber];
00099 }
00100
00101 G4bool G4PhysicsVector::Store(std::ofstream& fOut, G4bool ascii)
00102 {
00103
00104 if (ascii)
00105 {
00106 fOut << *this;
00107 return true;
00108 }
00109
00110
00111
00112 fOut.write((char*)(&edgeMin), sizeof edgeMin);
00113 fOut.write((char*)(&edgeMax), sizeof edgeMax);
00114 fOut.write((char*)(&numberOfBin), sizeof numberOfBin);
00115
00116
00117 size_t size = dataVector.size();
00118 fOut.write((char*)(&size), sizeof size);
00119
00120 G4double* value = new G4double[2*size];
00121 for(size_t i = 0; i < size; i++)
00122 {
00123 value[2*i] = binVector[i];
00124 value[2*i+1]= dataVector[i];
00125 }
00126 fOut.write((char*)(value), 2*size*(sizeof (G4double)));
00127 delete [] value;
00128
00129 return true;
00130 }
00131
00132 G4bool G4PhysicsVector::Retrieve(std::ifstream& fIn, G4bool ascii)
00133 {
00134
00135 lastEnergy=0.;
00136 lastValue =0.;
00137 lastBin =0;
00138 dataVector.clear();
00139 binVector.clear();
00140 comment = "";
00141
00142
00143 if (ascii)
00144 {
00145
00146 fIn >> edgeMin >> edgeMax >> numberOfBin;
00147 if (fIn.fail()) { return false; }
00148
00149 size_t size=0;
00150 fIn >> size;
00151 if (fIn.fail()) { return false; }
00152
00153 binVector.reserve(size);
00154 dataVector.reserve(size);
00155 for(size_t i = 0; i < size ; i++)
00156 {
00157 G4double vBin=0., vData=0.;
00158 fIn >> vBin >> vData;
00159 if (fIn.fail()) { return false; }
00160 binVector.push_back(vBin);
00161 dataVector.push_back(vData);
00162 }
00163 return true ;
00164 }
00165
00166
00167
00168 fIn.read((char*)(&edgeMin), sizeof edgeMin);
00169 fIn.read((char*)(&edgeMax), sizeof edgeMax);
00170 fIn.read((char*)(&numberOfBin), sizeof numberOfBin );
00171
00172
00173 size_t size;
00174 fIn.read((char*)(&size), sizeof size);
00175
00176 G4double* value = new G4double[2*size];
00177 fIn.read((char*)(value), 2*size*(sizeof(G4double)) );
00178 if (G4int(fIn.gcount()) != G4int(2*size*(sizeof(G4double))) ){
00179 delete [] value;
00180 return false;
00181 }
00182
00183 binVector.reserve(size);
00184 dataVector.reserve(size);
00185 for(size_t i = 0; i < size; i++) {
00186 binVector.push_back(value[2*i]);
00187 dataVector.push_back(value[2*i+1]);
00188 }
00189 delete [] value;
00190 return true;
00191 }
00192
00193 std::ostream& operator<<(std::ostream& out, const G4PhysicsVector& pv)
00194 {
00195
00196 out << std::setprecision(12) << pv.edgeMin;
00197 out <<" " << pv.edgeMax <<" " << pv.numberOfBin << G4endl;
00198
00199
00200 out << pv.dataVector.size() << G4endl;
00201 for(size_t i = 0; i < pv.dataVector.size(); i++)
00202 {
00203 out << std::setprecision(12) << pv.binVector[i] << " "
00204 << pv.dataVector[i] << G4endl;
00205 }
00206 return out;
00207 }