20#include "BDSException.hh"
21#include "BDSPhysicsVectorLinear.hh"
30BDSPhysicsVectorLinear::BDSPhysicsVectorLinear(
const std::vector<G4double>& kineticEnergyIn,
31 const std::vector<G4double>& valuesIn):
32 kineticEnergy(kineticEnergyIn),
34 eKMin(kineticEnergy[0]),
35 eKMax(kineticEnergy.back()),
36 eKMinValue(values[0]),
37 eKMaxValue(values.back())
39 if (kineticEnergy.size() != valuesIn.size())
40 {
throw BDSException(__METHOD_NAME__,
"kinetic energy vector and values vector mismatch in size.");}
41 if (kineticEnergy.size() < 2)
42 {
throw BDSException(__METHOD_NAME__,
"must be at least 2 points in Ek vs value vectors.");}
53 auto indexGreaterThanOrEqual = std::lower_bound(kineticEnergy.begin(), kineticEnergy.end(), eK);
54 G4int index2 = (G4int)std::distance(kineticEnergy.begin(), indexGreaterThanOrEqual);
55 G4int index1 = index2 - 1;
56 G4double dx = (eK - kineticEnergy[index1]) / (kineticEnergy[index2] - kineticEnergy[index1]);
57 G4double result = values[index1]*(1.0 - dx) + values[index2]*dx;
General exception with possible name of object and message.
G4double Value(G4double eK) const
Get the linearly interpolated value for a given kinetic energy.