9#include "SpecialPixel.h"
10#include "IException.h"
13 Mixed::Mixed(Pvl &pvl, PhotoModel &pmodel) : NormModel(pvl, pmodel) {
14 PvlGroup &algorithm = pvl.findObject(
"NormalizationModel").findGroup(
"Algorithm", Pvl::Traverse);
27 if(algorithm.hasKeyword(
"Pharef")) {
28 SetNormPharef(algorithm[
"Pharef"]);
31 if(algorithm.hasKeyword(
"Incref")) {
32 SetNormIncref(algorithm[
"Incref"]);
35 if(algorithm.hasKeyword(
"Emaref")) {
36 SetNormEmaref(algorithm[
"Emaref"]);
39 if(algorithm.hasKeyword(
"Incmat")) {
40 SetNormIncmat(algorithm[
"Incmat"]);
43 if(algorithm.hasKeyword(
"Phamat")) {
44 SetNormPhamat(algorithm[
"Phamat"]);
46 p_normPhamat = p_normIncmat;
49 if(algorithm.hasKeyword(
"Emamat")) {
50 SetNormEmamat(algorithm[
"Emamat"]);
53 if(algorithm.hasKeyword(
"Thresh")) {
54 SetNormThresh(algorithm[
"Thresh"]);
57 if(algorithm.hasKeyword(
"Albedo")) {
58 SetNormAlbedo(algorithm[
"Albedo"]);
64 GetPhotoModel()->SetStandardConditions(
true);
65 p_psurfref = GetPhotoModel()->CalcSurfAlbedo(p_normPharef, p_normIncref, p_normEmaref);
66 double pprimeref = GetPhotoModel()->PhtTopder(p_normPharef, p_normIncref, p_normEmaref);
68 if(p_psurfref == 0.0) {
69 std::string err =
"Divide by zero error";
70 throw IException(IException::Unknown, err, _FILEINFO_);
73 p_rhobar = p_normAlbedo / p_psurfref;
77 p_psurfmatch = GetPhotoModel()->CalcSurfAlbedo(p_normPhamat, p_normIncmat, p_normEmamat);
78 p_pprimematch = GetPhotoModel()->PhtTopder(p_normPhamat, p_normIncmat, p_normEmamat);
82 double arg = pow(p_psurfref, 2.0) + pow(p_psurfmatch * pprimeref / std::max(1.0e-30, p_pprimematch), 2.0);
83 if((arg < 1.0e-10) || (arg > 1.0e10)) {
84 std::string err =
"Bad reference state encountered";
85 throw IException(IException::Unknown, err, _FILEINFO_);
89 GetPhotoModel()->SetStandardConditions(
false);
92 void Mixed::NormModelAlgorithm(
double phase,
double incidence,
double emission,
93 double demincidence,
double dememission,
double dn,
94 double &albedo,
double &mult,
double &base) {
99 static double old_phase = -9999;
100 static double old_incidence = -9999;
101 static double old_emission = -9999;
102 static double old_demincidence = -9999;
103 static double old_dememission = -9999;
105 if (old_phase != phase || old_incidence != incidence || old_emission != emission ||
106 old_demincidence != demincidence || old_dememission != dememission) {
109 psurf = GetPhotoModel()->CalcSurfAlbedo(phase, demincidence, dememission);
110 pprime = GetPhotoModel()->PhtTopder(phase, demincidence, dememission);
111 double arg = pow(psurf, 2.0) + pow(p_psurfmatch * pprime / std::max(1.0e-30, p_pprimematch), 2.0);
112 aden = sqrt(std::max(1.0e-30, arg));
115 old_incidence = incidence;
116 old_emission = emission;
117 old_demincidence = demincidence;
118 old_dememission = dememission;
125 if(aden > p_anum * p_normThresh) {
129 albedo = dn * p_anum / aden + p_rhobar * (p_psurfref - p_anum / aden * psurf);
142 void Mixed::SetNormPharef(
const double pharef) {
143 if(pharef < 0.0 || pharef >= 180.0) {
144 std::string msg =
"Invalid value of normalization pharef [" +
146 throw IException(IException::User, msg, _FILEINFO_);
149 p_normPharef = pharef;
161 void Mixed::SetNormIncref(
const double incref) {
162 if(incref < 0.0 || incref >= 90.0) {
163 std::string msg =
"Invalid value of normalization incref [" +
165 throw IException(IException::User, msg, _FILEINFO_);
168 p_normIncref = incref;
180 void Mixed::SetNormEmaref(
const double emaref) {
181 if(emaref < 0.0 || emaref >= 90.0) {
182 std::string msg =
"Invalid value of normalization emaref [" +
184 throw IException(IException::User, msg, _FILEINFO_);
187 p_normEmaref = emaref;
200 void Mixed::SetNormPhamat(
const double phamat) {
201 if(phamat < 0.0 || phamat >= 180.0) {
202 std::string msg =
"Invalid value of normalization phamat [" +
204 throw IException(IException::User, msg, _FILEINFO_);
207 p_normPhamat = phamat;
220 void Mixed::SetNormIncmat(
const double incmat) {
221 if(incmat < 0.0 || incmat >= 90.0) {
222 std::string msg =
"Invalid value of normalization incmat [" +
224 throw IException(IException::User, msg, _FILEINFO_);
227 p_normIncmat = incmat;
240 void Mixed::SetNormEmamat(
const double emamat) {
241 if(emamat < 0.0 || emamat >= 90.0) {
242 std::string msg =
"Invalid value of normalization emamat [" +
244 throw IException(IException::User, msg, _FILEINFO_);
247 p_normEmamat = emamat;
256 void Mixed::SetNormAlbedo(
const double albedo) {
257 p_normAlbedo = albedo;
274 void Mixed::SetNormThresh(
const double thresh) {
275 p_normThresh = thresh;
Adds specific functionality to C++ strings.
Mixed albedo/topo normalization without atmosphere.
Container for cube-like labels.
This is free and unencumbered software released into the public domain.