18#include "HiCalTypes.h"
21#include "Statistics.h"
22#include "PvlKeyword.h"
23#include "NumericalApproximation.h"
26#include "IException.h"
37 for (
int i = 0 ; i < v.dim() ; i++) {
50 for (
int i = 0 ; i < v.dim() ; i++) {
62 const int cpmm2ccd[] = {0,1,2,3,12,4,10,11,5,13,6,7,8,9};
63 if ( (cpmm < 0) || (cpmm >= (
int)(
sizeof(cpmm2ccd)/
sizeof(
int))) ) {
64 QString mess =
"CpmmToCdd: Bad CpmmNumber (" +
toString(cpmm) +
")";
67 return (cpmm2ccd[cpmm]);
77 if ( (ccd < 0) || (ccd > 13) ) {
78 QString mess =
"CcdToFilter: Bad Ccd Number (" +
toString(ccd) +
")";
83 if ( ccd <= 9 ) { filter =
"RED"; }
84 else if (ccd <= 11) { filter =
"IR"; }
85 else { filter =
"BG"; }
102 int nlines(eline-sline+1);
104 for (
int l = 0 ; l < nlines ; l++) {
105 for (
int s = 0 ; s < m.dim2() ; s++) {
106 mcrop[l][s] = m[l+sline][s];
125 int nsamps(esamp-ssamp+1);
127 for (
int l = 0 ; l < m.dim1() ; l++) {
128 for (
int s = 0 ; s < nsamps ; s++) {
129 mcrop[l][s] = m[l][s+ssamp];
148 eline = (eline == -1) ? m.dim1() - 1 : eline;
150 for (
int s = 0 ; s < m.dim2() ; s++) {
152 for (
int l = sline ; l <= eline ; l++) {
155 v[s] = stats.Average();
174 esamp = (esamp == -1) ? m.dim2() - 1 : esamp;
176 for (
int l = 0 ; l < m.dim1() ; l++) {
178 for (
int s = ssamp ; s <= esamp ; s++) {
181 v[l] = stats.Average();
197 if (!conf.exists(keyname)) {
return (defval); }
198 if (conf.count(keyname) < index) {
return (defval); }
199 QString iValue(conf.value(keyname, index));
213 return toInt(QString(value).trimmed());
224template <
typename T>
double ToDouble(
const T &value) {
225 return toDouble(QString(value).trimmed());
236template <
typename T> QString
ToString(
const T &value) {
248inline bool IsEqual(
const QString &v1,
const QString &v2 =
"TRUE") {
249 return (v1.toUpper() == v2.toUpper());
267 const QString &value =
"TRUE") {
268 if ( prof.exists(key) ) {
269 return (
IsEqual(prof(key), value));
286 return (
IsTrueValue(prof,
"Debug::SkipModule",
"TRUE"));
292 if (top.dim2() != bottom.dim2()) {
293 std::ostringstream mess;
294 mess <<
"Top buffer samples (" << top.dim2()
295 <<
") do not match bottom buffer samples (" << bottom.dim2()
300 int nlines(top.dim1()+bottom.dim1());
302 for (
int lt = 0 ; lt < top.dim1() ; lt++) {
303 for (
int s = 0 ; s < top.dim2() ; s++) {
304 mat[lt][s] = top[lt][s];
308 int topl = top.dim1();
309 for (
int lb = 0 ; lb < bottom.dim1() ; lb++) {
310 for (
int s = 0 ; s < top.dim2() ; s++) {
311 mat[topl+lb][s] = bottom[lb][s];
319 if (right.dim1() != right.dim1()) {
320 std::ostringstream mess;
321 mess <<
"Left buffer lines (" << left.dim1()
322 <<
") do not match right buffer lines (" << right.dim1()
327 int nsamps(left.dim2()+right.dim2());
329 for (
int ll = 0 ; ll < left.dim1() ; ll++) {
330 for (
int s = 0 ; s < left.dim2() ; s++) {
331 mat[ll][s] = left[ll][s];
335 int lefts = left.dim2();
336 for (
int lr = 0 ; lr < right.dim1() ; lr++) {
337 for (
int s = 0 ; s < right.dim2() ; s++) {
338 mat[lr][lefts+s] = right[lr][s];
354 HiLineTimeEqn(
int bin,
double ltime) : _bin(bin), _ltime(ltime) { }
357 void setLineTime(
double ltime) { _ltime = ltime; }
358 void setBin(
int bin) { _bin = bin; }
359 double Time(
const double line)
const {
360 return (line * (_bin * _ltime * 1.0E-6));
362 double operator()(
const double line)
const {
return (Time(line)); }
381inline double HiTempEqn(
const double temperature,
const double napcm2 = 2.0,
382 const double px = 12.0) {
383 double temp = temperature + 273.0;
384 double eg = 1.1557 - (7.021E-4 * temp * temp) / (1108.0 + temp);
385 const double K = 1.38E-23;
386 const double Q = 1.6E-19;
387 return (napcm2*(px*px)*2.55E7*std::pow(temp,1.5)*std::exp(-eg*Q/2.0/K/temp));
407 if ( n == v.dim() ) {
return (v); }
409 double mag((
double) v.dim()/ (
double) n);
411 for (
int i = 0 ; i < v.dim() ; i++ ) {
412 double x((
double) i);
414 nterp.AddData(x,v[i]);
420 for (
int j = 0 ; j < n ; j++ ) {
421 double x = (double) j * mag;
436 for (
int blob = 0 ; blob < label.
objects() ; blob++ ) {
438 QString name = label.
object(blob)[
"Name"][0];
439 if ( name.toLower() ==
"hirise calibration ancillary" ||
440 name.toLower() ==
"hirise calibration images" ||
441 name.toLower() ==
"hirise ancillary") {
467 if (data.size() == 0)
return (
Null);
468 if (data.size() == 1)
return (data[0]);
470#if defined(USE_AVERAGE)
472 stats.
AddData(&data[0], data.size());
473 return (stat.Average());
475 std::sort(data.begin(), data.end());
476 int meanIndex = data.size()/2;
477 if ((data.size() % 2) == 1)
return data[meanIndex];
478 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.