// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // // $Id: G4PhysicsVector.cc,v 1.27 2008/10/16 12:14:36 gcosmo Exp $ // GEANT4 tag $Name: geant4-09-02-ref-02 $ // // // -------------------------------------------------------------- // GEANT 4 class implementation file // // G4PhysicsVector.cc // // History: // 02 Dec. 1995, G.Cosmo : Structure created based on object model // 03 Mar. 1996, K.Amako : Implemented the 1st version // 01 Jul. 1996, K.Amako : Hidden bin from the user introduced // 12 Nov. 1998, K.Amako : A bug in GetVectorLength() fixed // 11 Nov. 2000, H.Kurashige : use STL vector for dataVector and binVector // 18 Jan. 2001, H.Kurashige : removed ptrNextTable // 09 Mar. 2001, H.Kurashige : added G4PhysicsVector type // 05 Sep. 2008, V.Ivanchenko : added protections for zero-length vector // -------------------------------------------------------------- #include "G4PhysicsVector.hh" #include // -------------------------------------------------------------- G4PhysicsVector::G4PhysicsVector(G4bool spline) : type(T_G4PhysicsVector), edgeMin(0.), edgeMax(0.), numberOfBin(0), lastEnergy(0.), lastValue(0.), lastBin(0), secDerivative(0), useSpline(spline) {} // -------------------------------------------------------------- G4PhysicsVector::~G4PhysicsVector() { DeleteData(); } // -------------------------------------------------------------- G4PhysicsVector::G4PhysicsVector(const G4PhysicsVector& right) { CopyData(right); } // -------------------------------------------------------------- G4PhysicsVector& G4PhysicsVector::operator=(const G4PhysicsVector& right) { if (&right==this) { return *this; } if (type != right.type) { return *this; } DeleteData(); CopyData(right); return *this; } // -------------------------------------------------------------- G4int G4PhysicsVector::operator==(const G4PhysicsVector &right) const { return (this == &right); } // -------------------------------------------------------------- G4int G4PhysicsVector::operator!=(const G4PhysicsVector &right) const { return (this != &right); } // -------------------------------------------------------------- void G4PhysicsVector::DeleteData() { delete [] secDerivative; secDerivative = 0; } // -------------------------------------------------------------- void G4PhysicsVector::CopyData(const G4PhysicsVector& vec) { type = vec.type; edgeMin = vec.edgeMin; edgeMax = vec.edgeMax; numberOfBin = vec.numberOfBin; lastEnergy = vec.lastEnergy; lastValue = vec.lastValue; lastBin = vec.lastBin; dataVector = vec.dataVector; binVector = vec.binVector; useSpline = vec.useSpline; comment = vec.comment; if (vec.secDerivative) { secDerivative = new G4double [numberOfBin]; for (size_t i=0; i> edgeMin >> edgeMax >> numberOfBin; if (fIn.fail()) { return false; } // contents size_t size=0; fIn >> size; if (fIn.fail()) { return false; } binVector.reserve(size); dataVector.reserve(size); G4double vBin, vData; for(size_t i = 0; i < size ; i++) { vBin = 0.; vData= 0.; fIn >> vBin >> vData; if (fIn.fail()) { return false; } binVector.push_back(vBin); dataVector.push_back(vData); } return true ; } // retrieve in binary mode // binning fIn.read((char*)(&edgeMin), sizeof edgeMin); fIn.read((char*)(&edgeMax), sizeof edgeMax); fIn.read((char*)(&numberOfBin), sizeof numberOfBin ); // contents size_t size; fIn.read((char*)(&size), sizeof size); G4double* value = new G4double[2*size]; fIn.read((char*)(value), 2*size*(sizeof(G4double)) ); if (G4int(fIn.gcount()) != G4int(2*size*(sizeof(G4double))) ) { delete [] value; return false; } binVector.reserve(size); dataVector.reserve(size); for(size_t i = 0; i < size; i++) { binVector.push_back(value[2*i]); dataVector.push_back(value[2*i+1]); } delete [] value; return true; } // -------------------------------------------------------------- void G4PhysicsVector::FillSecondDerivatives() { secDerivative = new G4double [numberOfBin]; size_t n = numberOfBin-1; // cannot compute derivatives for less than 3 points if(3 > numberOfBin) { secDerivative[0] = 0.0; secDerivative[n] = 0.0; return; } for(size_t i=1; i