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.