37 #include "NumericalApproximation.h" 44 template <
typename T>
inline T
MIN(
const T &A,
const T &B) {
45 if ( A < B ) {
return (A); }
49 template <
typename T>
inline T
MAX(
const T &A,
const T &B) {
50 if ( A > B ) {
return (A); }
61 for (
int i = 0 ; i < v.dim() ; i++) {
74 for (
int i = 0 ; i < v.dim() ; i++) {
86 const int cpmm2ccd[] = {0,1,2,3,12,4,10,11,5,13,6,7,8,9};
87 if ( (cpmm < 0) || (cpmm >= (
int)(
sizeof(cpmm2ccd)/
sizeof(
int))) ) {
88 QString mess =
"CpmmToCdd: Bad CpmmNumber (" +
toString(cpmm) +
")";
91 return (cpmm2ccd[cpmm]);
101 if ( (ccd < 0) || (ccd > 13) ) {
102 QString mess =
"CcdToFilter: Bad Ccd Number (" +
toString(ccd) +
")";
107 if ( ccd <= 9 ) { filter =
"RED"; }
108 else if (ccd <= 11) { filter =
"IR"; }
109 else { filter =
"BG"; }
126 int nlines(eline-sline+1);
128 for (
int l = 0 ; l < nlines ; l++) {
129 for (
int s = 0 ; s < m.dim2() ; s++) {
130 mcrop[l][s] = m[l+sline][s];
149 int nsamps(esamp-ssamp+1);
151 for (
int l = 0 ; l < m.dim1() ; l++) {
152 for (
int s = 0 ; s < nsamps ; s++) {
153 mcrop[l][s] = m[l][s+ssamp];
172 eline = (eline == -1) ? m.dim1() - 1 : eline;
174 for (
int s = 0 ; s < m.dim2() ; s++) {
176 for (
int l = sline ; l <= eline ; l++) {
198 esamp = (esamp == -1) ? m.dim2() - 1 : esamp;
200 for (
int l = 0 ; l < m.dim1() ; l++) {
202 for (
int s = ssamp ; s <= esamp ; s++) {
218 template <
typename T>
221 if (!conf.
exists(keyname)) {
return (defval); }
222 if (conf.
count(keyname) < index) {
return (defval); }
223 QString iValue(conf.
value(keyname, index));
237 return toInt(QString(value).trimmed());
248 template <
typename T>
double ToDouble(
const T &value) {
249 return toDouble(QString(value).trimmed());
260 template <
typename T> QString
ToString(
const T &value) {
272 inline bool IsEqual(
const QString &v1,
const QString &v2 =
"TRUE") {
273 return (v1.toUpper() == v2.toUpper());
291 const QString &value =
"TRUE") {
293 return (
IsEqual(prof(key), value));
310 return (
IsTrueValue(prof,
"Debug::SkipModule",
"TRUE"));
316 if (top.dim2() != bottom.dim2()) {
317 std::ostringstream mess;
318 mess <<
"Top buffer samples (" << top.dim2()
319 <<
") do not match bottom buffer samples (" << bottom.dim2()
324 int nlines(top.dim1()+bottom.dim1());
326 for (
int lt = 0 ; lt < top.dim1() ; lt++) {
327 for (
int s = 0 ; s < top.dim2() ; s++) {
328 mat[lt][s] = top[lt][s];
332 int topl = top.dim1();
333 for (
int lb = 0 ; lb < bottom.dim1() ; lb++) {
334 for (
int s = 0 ; s < top.dim2() ; s++) {
335 mat[topl+lb][s] = bottom[lb][s];
343 if (right.dim1() != right.dim1()) {
344 std::ostringstream mess;
345 mess <<
"Left buffer lines (" << left.dim1()
346 <<
") do not match right buffer lines (" << right.dim1()
351 int nsamps(left.dim2()+right.dim2());
353 for (
int ll = 0 ; ll < left.dim1() ; ll++) {
354 for (
int s = 0 ; s < left.dim2() ; s++) {
355 mat[ll][s] = left[ll][s];
359 int lefts = left.dim2();
360 for (
int lr = 0 ; lr < right.dim1() ; lr++) {
361 for (
int s = 0 ; s < right.dim2() ; s++) {
362 mat[lr][lefts+s] = right[lr][s];
378 HiLineTimeEqn(
int bin,
double ltime) : _bin(bin), _ltime(ltime) { }
381 void setLineTime(
double ltime) { _ltime = ltime; }
382 void setBin(
int bin) { _bin = bin; }
383 double Time(
const double line)
const {
384 return (line * (_bin * _ltime * 1.0
E-6));
386 double operator()(
const double line)
const {
return (Time(line)); }
405 inline double HiTempEqn(
const double temperature,
const double napcm2 = 2.0,
406 const double px = 12.0) {
407 double temp = temperature + 273.0;
408 double eg = 1.1557 - (7.021E-4 * temp * temp) / (1108.0 + temp);
409 const double K = 1.38E-23;
410 const double Q = 1.6E-19;
411 return (napcm2*(px*px)*2.55E7*std::pow(temp,1.5)*std::exp(-eg*Q/2.0/K/temp));
431 if ( n == v.dim() ) {
return (v); }
433 double mag((
double) v.dim()/ (double) n);
435 for (
int i = 0 ; i < v.dim() ; i++ ) {
436 double x((
double) i);
444 for (
int j = 0 ; j < n ; j++ ) {
445 double x = (double) j * mag;
460 for (
int blob = 0 ; blob < label.
objects() ; blob++ ) {
462 QString name = label.
object(blob)[
"Name"][0];
463 if ( name.toLower() ==
"hirise calibration ancillary" ||
464 name.toLower() ==
"hirise calibration images" ||
465 name.toLower() ==
"hirise ancillary") {
491 if (data.size() == 0)
return (
Null);
492 if (data.size() == 1)
return (data[0]);
494 #if defined(USE_AVERAGE) 496 stats.
AddData(&data[0], data.size());
497 return (stat.Average());
499 std::sort(data.begin(), data.end());
500 int meanIndex = data.size()/2;
501 if ((data.size() % 2) == 1)
return data[meanIndex];
502 return ((data[meanIndex-1]+data[meanIndex])/2.0);
PvlObject & object(const int index)
Return the object at the specified index.
const double Null
Value for an Isis Null pixel.
int CpmmToCcd(int cpmm)
Convert HiRISE Cpmm number to Ccd number.
bool SkipModule(const DbProfile &prof)
Checks profile flag to skip the current Module.
Compute HiRISE line times.
int count(const QString &key) const
Report number of values in keyword.
int objects() const
Returns the number of objects.
HiVector averageSamples(const HiMatrix &m, int ssamp=0, int esamp=-1)
Reduces by averaging specified samples from a buffer.
double HiTempEqn(const double temperature, const double napcm2=2.0, const double px=12.0)
Implements (classic) HiRISE temperature equation.
int InValidCount(const HiVector &v)
Counts number of invalid pixels in vector.
int toInt(const QString &string)
Global function to convert from a string to an integer.
bool exists(const QString &key) const
Checks for the existance of a keyword.
void RemoveHiBlobs(Pvl &label)
Deletes HiRISE specific BLOBS from cube file.
NumericalApproximation provides various numerical analysis methods of interpolation, extrapolation and approximation of a tabulated set of x, y data.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Evaluate() returns the y-value of the nearest endpoint if a is outside of the domain.
double toDouble(const QString &string)
Global function to convert from a string to a double.
Cubic Spline interpolation with natural boundary conditions.
A DbProfile is a container for access parameters to a database.
bool IsEqual(const QString &v1, const QString &v2="TRUE")
Shortened string equality test.
This class is used to accumulate statistics on double arrays.
double Evaluate(const double a, const ExtrapType &etype=ThrowError)
Calculates interpolated or extrapolated value of tabulated data set for given domain value...
int ToInteger(const T &value)
Helper function to convert values to Integers.
bool IsTrueValue(const DbProfile &prof, const QString &key, const QString &value="TRUE")
Determines if the keyword value is the expected value.
int ValidCount(const HiVector &v)
Counts number of valid pixels in vector.
QString CcdToFilter(int ccd)
Convert HiRISE Ccd number to string filter name.
QString value(const QString &key, int nth=0) const
Returns the specified value for the given keyword.
#define _FILEINFO_
Macro for the filename and line number.
A type of error that could only have occurred due to a mistake on the user's part (e...
bool IsSpecial(const double d)
Returns if the input pixel is special.
HiVector rebin(const HiVector &v, int n)
Rebins a vector to a different size.
Container for cube-like labels.
const double E
Sets some basic constants for use in ISIS programming.
double ToDouble(const T &value)
Helper function to convert values to doubles.
void deleteObject(const QString &name)
Remove an object from the current PvlObject.
HiVector averageLines(const HiMatrix &m, int sline=0, int eline=-1)
Reduces by averaging specified lines from a buffer.
bool isNamed(const QString &match) const
Returns whether the given string is equal to the container name or not.
void AddData(const double x, const double y)
Add a datapoint to the set.
Namespace for ISIS/Bullet specific routines.
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.
HiMatrix cropSamples(const HiMatrix &m, int ssamp, int esamp)
Crop specified samples from a buffer.
double GainLineStat(std::vector< double > &data)
Return the statistics for a vector of data.
HiMatrix cropLines(const HiMatrix &m, int sline, int eline)
Crop specified lines from a buffer.
void AddData(const double *data, const unsigned int count)
Add an array of doubles to the accumulators and counters.
QString ToString(const T &value)
Helper function to convert values to strings.
double Average() const
Computes and returns the average.
TNT::Array2D< double > HiMatrix
2-D buffer
T MIN(const T &A, const T &B)
Implement templatized MIN fumnction.
T MAX(const T &A, const T &B)
Implement templatized MAX fumnction.
TNT::Array1D< double > HiVector
1-D Buffer