9#include "SpecialPixel.h"
10#include "IException.h"
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);
143 if(pharef < 0.0 || pharef >= 180.0) {
144 std::string msg =
"Invalid value of normalization pharef [" +
145 IString(pharef) +
"]";
146 throw IException(IException::User, msg, _FILEINFO_);
149 p_normPharef = pharef;
162 if(incref < 0.0 || incref >= 90.0) {
163 std::string msg =
"Invalid value of normalization incref [" +
164 IString(incref) +
"]";
165 throw IException(IException::User, msg, _FILEINFO_);
168 p_normIncref = incref;
181 if(emaref < 0.0 || emaref >= 90.0) {
182 std::string msg =
"Invalid value of normalization emaref [" +
183 IString(emaref) +
"]";
184 throw IException(IException::User, msg, _FILEINFO_);
187 p_normEmaref = emaref;
201 if(phamat < 0.0 || phamat >= 180.0) {
202 std::string msg =
"Invalid value of normalization phamat [" +
203 IString(phamat) +
"]";
204 throw IException(IException::User, msg, _FILEINFO_);
207 p_normPhamat = phamat;
221 if(incmat < 0.0 || incmat >= 90.0) {
222 std::string msg =
"Invalid value of normalization incmat [" +
223 IString(incmat) +
"]";
224 throw IException(IException::User, msg, _FILEINFO_);
227 p_normIncmat = incmat;
241 if(emamat < 0.0 || emamat >= 90.0) {
242 std::string msg =
"Invalid value of normalization emamat [" +
243 IString(emamat) +
"]";
244 throw IException(IException::User, msg, _FILEINFO_);
247 p_normEmamat = emamat;
257 p_normAlbedo = albedo;
275 p_normThresh = thresh;
Mixed albedo/topo normalization without atmosphere.
void SetNormEmamat(const double emamat)
Set the normalization function parameter.
void SetNormEmaref(const double emaref)
Set the normalization function parameter.
void SetNormIncref(const double incref)
Set the normalization function parameter.
void SetNormAlbedo(const double albedo)
Set the normalization function parameter.
void SetNormThresh(const double thresh)
Set the normalization function parameter.
void SetNormIncmat(const double incmat)
Set the normalization function parameter.
void SetNormPharef(const double pharef)
Set parameters needed for albedo normalization.
void SetNormPhamat(const double phamat)
Set the normalization function parameter.
This is free and unencumbered software released into the public domain.