18#include "HiCalTypes.h"
21#include "Statistics.h"
22#include "PvlKeyword.h"
23#include "NumericalApproximation.h"
26#include "IException.h"
30 template <
typename T>
inline T MIN(
const T &A,
const T &B) {
31 if ( A < B ) {
return (A); }
35 template <
typename T>
inline T MAX(
const T &A,
const T &B) {
36 if ( A > B ) {
return (A); }
47 for (
int i = 0 ; i < v.dim() ; i++) {
60 for (
int i = 0 ; i < v.dim() ; i++) {
72 const int cpmm2ccd[] = {0,1,2,3,12,4,10,11,5,13,6,7,8,9};
73 if ( (cpmm < 0) || (cpmm >= (
int)(
sizeof(cpmm2ccd)/
sizeof(
int))) ) {
74 QString mess =
"CpmmToCdd: Bad CpmmNumber (" +
toString(cpmm) +
")";
77 return (cpmm2ccd[cpmm]);
87 if ( (ccd < 0) || (ccd > 13) ) {
88 QString mess =
"CcdToFilter: Bad Ccd Number (" +
toString(ccd) +
")";
93 if ( ccd <= 9 ) { filter =
"RED"; }
94 else if (ccd <= 11) { filter =
"IR"; }
95 else { filter =
"BG"; }
112 int nlines(eline-sline+1);
114 for (
int l = 0 ; l < nlines ; l++) {
115 for (
int s = 0 ; s < m.dim2() ; s++) {
116 mcrop[l][s] = m[l+sline][s];
135 int nsamps(esamp-ssamp+1);
137 for (
int l = 0 ; l < m.dim1() ; l++) {
138 for (
int s = 0 ; s < nsamps ; s++) {
139 mcrop[l][s] = m[l][s+ssamp];
158 eline = (eline == -1) ? m.dim1() - 1 : eline;
160 for (
int s = 0 ; s < m.dim2() ; s++) {
162 for (
int l = sline ; l <= eline ; l++) {
165 v[s] = stats.Average();
184 esamp = (esamp == -1) ? m.dim2() - 1 : esamp;
186 for (
int l = 0 ; l < m.dim1() ; l++) {
188 for (
int s = ssamp ; s <= esamp ; s++) {
191 v[l] = stats.Average();
207 if (!conf.exists(keyname)) {
return (defval); }
208 if (conf.count(keyname) < index) {
return (defval); }
209 QString iValue(conf.value(keyname, index));
223 return toInt(QString(value).trimmed());
234template <
typename T>
double ToDouble(
const T &value) {
235 return toDouble(QString(value).trimmed());
246template <
typename T> QString
ToString(
const T &value) {
258inline bool IsEqual(
const QString &v1,
const QString &v2 =
"TRUE") {
259 return (v1.toUpper() == v2.toUpper());
277 const QString &value =
"TRUE") {
278 if ( prof.exists(key) ) {
279 return (
IsEqual(prof(key), value));
296 return (
IsTrueValue(prof,
"Debug::SkipModule",
"TRUE"));
302 if (top.dim2() != bottom.dim2()) {
303 std::ostringstream mess;
304 mess <<
"Top buffer samples (" << top.dim2()
305 <<
") do not match bottom buffer samples (" << bottom.dim2()
310 int nlines(top.dim1()+bottom.dim1());
312 for (
int lt = 0 ; lt < top.dim1() ; lt++) {
313 for (
int s = 0 ; s < top.dim2() ; s++) {
314 mat[lt][s] = top[lt][s];
318 int topl = top.dim1();
319 for (
int lb = 0 ; lb < bottom.dim1() ; lb++) {
320 for (
int s = 0 ; s < top.dim2() ; s++) {
321 mat[topl+lb][s] = bottom[lb][s];
329 if (right.dim1() != right.dim1()) {
330 std::ostringstream mess;
331 mess <<
"Left buffer lines (" << left.dim1()
332 <<
") do not match right buffer lines (" << right.dim1()
337 int nsamps(left.dim2()+right.dim2());
339 for (
int ll = 0 ; ll < left.dim1() ; ll++) {
340 for (
int s = 0 ; s < left.dim2() ; s++) {
341 mat[ll][s] = left[ll][s];
345 int lefts = left.dim2();
346 for (
int lr = 0 ; lr < right.dim1() ; lr++) {
347 for (
int s = 0 ; s < right.dim2() ; s++) {
348 mat[lr][lefts+s] = right[lr][s];
364 HiLineTimeEqn(
int bin,
double ltime) : _bin(bin), _ltime(ltime) { }
367 void setLineTime(
double ltime) { _ltime = ltime; }
368 void setBin(
int bin) { _bin = bin; }
369 double Time(
const double line)
const {
370 return (line * (_bin * _ltime * 1.0E-6));
372 double operator()(
const double line)
const {
return (Time(line)); }
391inline double HiTempEqn(
const double temperature,
const double napcm2 = 2.0,
392 const double px = 12.0) {
393 double temp = temperature + 273.0;
394 double eg = 1.1557 - (7.021E-4 * temp * temp) / (1108.0 + temp);
395 const double K = 1.38E-23;
396 const double Q = 1.6E-19;
397 return (napcm2*(px*px)*2.55E7*std::pow(temp,1.5)*std::exp(-eg*Q/2.0/K/temp));
417 if ( n == v.dim() ) {
return (v); }
419 double mag((
double) v.dim()/ (
double) n);
421 for (
int i = 0 ; i < v.dim() ; i++ ) {
422 double x((
double) i);
424 nterp.AddData(x,v[i]);
430 for (
int j = 0 ; j < n ; j++ ) {
431 double x = (double) j * mag;
446 for (
int blob = 0 ; blob < label.
objects() ; blob++ ) {
448 QString name = label.
object(blob)[
"Name"][0];
449 if ( name.toLower() ==
"hirise calibration ancillary" ||
450 name.toLower() ==
"hirise calibration images" ||
451 name.toLower() ==
"hirise ancillary") {
477 if (data.size() == 0)
return (
Null);
478 if (data.size() == 1)
return (data[0]);
480#if defined(USE_AVERAGE)
482 stats.
AddData(&data[0], data.size());
483 return (stat.Average());
485 std::sort(data.begin(), data.end());
486 int meanIndex = data.size()/2;
487 if ((data.size() % 2) == 1)
return data[meanIndex];
488 return ((data[meanIndex-1]+data[meanIndex])/2.0);
A DbProfile is a container for access parameters to a database.
Compute HiRISE line times.
@ User
A type of error that could only have occurred due to a mistake on the user's part (e....
NumericalApproximation provides various numerical analysis methods of interpolation,...
@ CubicNatural
Cubic Spline interpolation with natural boundary conditions.
@ NearestEndpoint
Evaluate() returns the y-value of the nearest endpoint if a is outside of the domain.
bool isNamed(const QString &match) const
Returns whether the given string is equal to the container name or not.
Container for cube-like labels.
void deleteObject(const QString &name)
Remove an object from the current PvlObject.
int objects() const
Returns the number of objects.
PvlObject & object(const int index)
Return the object at the specified index.
This class is used to accumulate statistics on double arrays.
void AddData(const double *data, const unsigned int count)
Add an array of doubles to the accumulators and counters.
This is free and unencumbered software released into the public domain.
QString CcdToFilter(int ccd)
Convert HiRISE Ccd number to string filter name.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
int toInt(const QString &string)
Global function to convert from a string to an integer.
double HiTempEqn(const double temperature, const double napcm2=2.0, const double px=12.0)
Implements (classic) HiRISE temperature equation.
HiMatrix cropSamples(const HiMatrix &m, int ssamp, int esamp)
Crop specified samples from a buffer.
HiVector rebin(const HiVector &v, int n)
Rebins a vector to a different size.
int ValidCount(const HiVector &v)
Counts number of valid pixels in vector.
TNT::Array2D< double > HiMatrix
2-D buffer
int InValidCount(const HiVector &v)
Counts number of invalid pixels in vector.
HiVector averageSamples(const HiMatrix &m, int ssamp=0, int esamp=-1)
Reduces by averaging specified samples from a buffer.
int CpmmToCcd(int cpmm)
Convert HiRISE Cpmm number to Ccd number.
double GainLineStat(std::vector< double > &data)
Return the statistics for a vector of data.
const double Null
Value for an Isis Null pixel.
T ConfKey(const DbProfile &conf, const QString &keyname, const T &defval, int index=0)
Find a keyword in a profile using default for non-existant keywords.
bool IsTrueValue(const DbProfile &prof, const QString &key, const QString &value="TRUE")
Determines if the keyword value is the expected value.
void RemoveHiBlobs(Pvl &label)
Deletes HiRISE specific BLOBS from cube file.
bool IsSpecial(const double d)
Returns if the input pixel is special.
TNT::Array1D< double > HiVector
1-D Buffer
QString ToString(const T &value)
Helper function to convert values to strings.
HiVector averageLines(const HiMatrix &m, int sline=0, int eline=-1)
Reduces by averaging specified lines from a buffer.
double ToDouble(const T &value)
Helper function to convert values to doubles.
double toDouble(const QString &string)
Global function to convert from a string to a double.
HiMatrix cropLines(const HiMatrix &m, int sline, int eline)
Crop specified lines from a buffer.
bool SkipModule(const DbProfile &prof)
Checks profile flag to skip the current Module.
int ToInteger(const T &value)
Helper function to convert values to Integers.
bool IsEqual(const QString &v1, const QString &v2="TRUE")
Shortened string equality test.