68 const std::string message;
71 DatasetNotFoundException(
const std::string &filename) : message(std::string(
"Dataset file ") + filename + std::string(
" not found")) {
74 virtual const char *what()
const throw() {
75 return message.c_str();
82 const std::string message;
85 DatasetReadException(
const std::string ¶meterName) : message(std::string(
"Dataset reading failed at ") + parameterName) {
88 virtual const char *what()
const throw() {
89 return message.c_str();
97 const std::string message;
103 virtual const char *what()
const throw() {
104 return message.c_str();
111 const std::string message;
117 virtual const char *what()
const throw() {
118 return message.c_str();
133 Vector3(
double x,
double y,
double z) {
140 return Vector3(x + other.x, y + other.y, z + other.z);
143 return Vector3(x - other.x, y - other.y, z - other.z);
146 Vector3 operator*(
const double factor)
const {
147 return Vector3(x * factor, y * factor, z * factor);
150 Vector3 operator/(
const double factor)
const {
151 return Vector3(x / factor, y / factor, z / factor);
154 bool isZero()
const {
155 return x == 0.0 && y == 0.0 && z == 0.0;
200 double visibilityMin;
201 double visibilityMax;
215 struct InterpolationParameter {
221 struct AngleParameters {
222 InterpolationParameter gamma, alpha, zero;
226 struct ControlParameters {
228 std::array<std::vector<float>::const_iterator, 16> coefficients;
229 std::array<double, 4> interpolationFactor;
238 std::vector<double> sunBreaks;
242 std::vector<double> zenithBreaks;
245 std::vector<double> emphBreaks;
247 int totalCoefsSingleConfig;
248 int totalCoefsAllConfigs;
252 struct TransmittanceParameters {
253 InterpolationParameter altitude;
254 InterpolationParameter distance;
272 int skippedConfigsBegin;
276 int skippedConfigsEnd;
280 std::vector<double> visibilitiesRad;
281 std::vector<double> albedosRad;
282 std::vector<double> altitudesRad;
283 std::vector<double> elevationsRad;
287 Metadata metadataRad;
297 std::vector<float> dataRad;
301 Metadata metadataPol;
310 std::vector<float> dataPol;
317 std::vector<double> altitudesTrans;
318 std::vector<double> visibilitiesTrans;
322 std::vector<float> dataTransU;
323 std::vector<float> dataTransV;
341 void initialize(
const std::string &filename,
const double singleVisibility = 0.0);
343 bool isInitialized()
const {
360 Parameters
computeParameters(
const Vector3 &viewPoint,
const Vector3 &viewDirection,
const double groundLevelSolarElevationAtOrigin,
const double groundLevelSolarAzimuthAtOrigin,
const double visibility,
const double albedo)
const;
366 double skyRadiance(
const Parameters ¶ms,
const double wavelength)
const;
374 double sunRadiance(
const Parameters ¶ms,
const double wavelength)
const;
383 double polarisation(
const Parameters ¶ms,
const double wavelength)
const;
393 double transmittance(
const Parameters ¶ms,
const double wavelength,
const double distance)
const;
407 void readRadiance(FILE *handle,
const double singleVisibility);
411 void readTransmittance(FILE *handle);
415 void readPolarisation(FILE *handle);
421 std::vector<float>::const_iterator getCoefficients(
const std::vector<float> &dataset,
const int totalCoefsSingleConfig,
const int elevation,
const int altitude,
const int visibility,
const int albedo,
const int wavelength)
const;
425 template<
int TOffset,
int TLevel>
426 double interpolate(
const AngleParameters &angleParameters,
const ControlParameters &controlParameters,
const Metadata &metadata)
const {
430 if constexpr (TLevel == 4) {
431 return reconstruct(angleParameters, controlParameters.coefficients[TOffset], metadata);
434 const double resultLow = interpolate<TOffset, TLevel + 1>(angleParameters, controlParameters, metadata);
437 if (controlParameters.interpolationFactor[TLevel] < 1e-6) {
442 const double resultHigh = interpolate<TOffset + (1 << (3 - TLevel)), TLevel + 1>(angleParameters, controlParameters, metadata);
445 return lerp(resultLow, resultHigh, controlParameters.interpolationFactor[TLevel]);
451 double reconstruct(
const AngleParameters &angleParameters,
const std::vector<float>::const_iterator controlParameters,
const Metadata &metadata)
const;
457 InterpolationParameter getInterpolationParameter(
const double queryVal,
const std::vector<double> &breaks)
const;
460 double evaluateModel(
const Parameters ¶ms,
const double wavelength,
const std::vector<float> &data,
const Metadata &metadata)
const;
466 std::vector<float>::const_iterator getCoefficientsTransBase(
const int altitude,
const int a,
const int d)
const;
470 std::vector<float>::const_iterator getCoefficientsTrans(
const int visibility,
const int altitude,
const int wavelength)
const;
473 double interpolateTrans(
const int visibilityIndex,
const InterpolationParameter altitudeParam,
const TransmittanceParameters transParams,
const int channelIndex)
const;
477 double reconstructTrans(
const int visibilityIndex,
const int altitudeIndex,
const TransmittanceParameters transParams,
const int channelIndex)
const;
480 InterpolationParameter getInterpolationParameterTrans(
const double value,
const int paramCount,
const int power)
const;
484 TransmittanceParameters toTransmittanceParams(
const double theta,
const double distance,
const double altitude)
const;