USGS

Isis 3.0 Application Source Code Reference

Home

cubefunc.cpp

Go to the documentation of this file.
00001 #include <cmath>
00002 #include "Isis.h"
00003 #include "ProcessByLine.h"
00004 #include "SpecialPixel.h"
00005 #include "iException.h"
00006 
00007 using namespace std; 
00008 using namespace Isis;
00009 
00010 void cubefunc (Buffer &in,
00011                Buffer &out);
00012 
00013 double bad=0;
00014 double y;
00015 
00016 enum function {
00017   COS,
00018   SIN,
00019   TAN,
00020   ACOS,
00021   ASIN,
00022   ATAN,
00023   INV,
00024   SQRT,
00025   POW10,
00026   EXP,
00027   XTOY,
00028   LOG10,
00029   LN,
00030   ABS
00031 } Function;
00032 
00033 
00034 void IsisMain() {
00035   // We will be processing by line
00036   ProcessByLine p;
00037 
00038   // Setup the input and output cubes
00039   p.SetInputCube("FROM");
00040   p.SetOutputCube ("TO");
00041 
00042   UserInterface &ui = Application::GetUserInterface();
00043 
00044   // Which function is it to be?
00045   string func = ui.GetString ("FUNCTION");
00046   if (func == "COS") Function = COS;
00047   if (func == "SIN") Function = SIN;
00048   if (func == "TAN") Function = TAN;
00049   if (func == "ACOS") Function = ACOS;
00050   if (func == "ASIN") Function = ASIN;
00051   if (func == "ATAN") Function = ATAN;
00052   if (func == "INV") Function = INV;
00053   if (func == "SQRT") Function = SQRT;
00054   if (func == "POW10") Function = POW10;
00055   if (func == "EXP") Function = EXP;
00056   if (func == "XTOY") Function = XTOY;
00057   if (func == "LOG10") Function = LOG10;
00058   if (func == "LN") Function = LN;
00059   if (func == "ABS") Function = ABS;
00060 
00061   if (Function == XTOY) {
00062     if (ui.WasEntered ("Y")) {
00063       y = ui.GetDouble("Y");
00064     }
00065     else {
00066       string message = "For the XTOY function, you must enter a value for y";
00067       throw iException::Message(iException::User,message,_FILEINFO_);
00068     }
00069   }
00070   
00071   // Start the processing
00072   p.StartProcess(cubefunc);
00073 
00074   if (bad != 0) {
00075     PvlGroup results ("Results");
00076     string message = "Invalid input pixels converted to Isis NULL values";
00077     results += PvlKeyword ("Error", message);
00078     results += PvlKeyword ("Count",bad);
00079     Application::Log (results);
00080   }
00081   p.EndProcess();
00082 }
00083 
00084 // Line processing routine
00085 void cubefunc (Buffer &in,
00086                Buffer &out) 
00087 {       
00088 
00089   // Loop for each pixel in the line. 
00090   for (int i=0; i<in.size(); i++) {
00091 
00092     if (IsSpecial (in[i])) {
00093       out[i] = in[i];
00094     }
00095     else {
00096       double deg;
00097       switch (Function) {
00098       case COS:
00099           if (in[i] < (-(2*PI)) || in[i] > (2*PI)) {
00100             out[i] = NULL8;
00101             bad++;
00102           }
00103           out[i] = cos (in[i]); 
00104           break;
00105         case SIN:
00106           if (in[i] < (-(2*PI)) || in[i] > (2*PI)) {
00107             out[i] = NULL8;
00108             bad++;
00109           }
00110           out[i] = sin (in[i]);
00111           break;
00112         case TAN:
00113           //  Check for invalid input values.  Check within a certain
00114           //  tolerance since the radiance value will probably never be
00115           //  exactly 90, 270, -90 or -270 degrees due to round off.  
00116           //  First convert input value from radians to degrees.
00117           deg = in[i] * (180./PI);
00118           if ( abs(abs(in[i]) - 90.0) <= .0001 ||
00119                abs(abs(in[i]) - 270.0) <= .0001) {
00120             out[i] = NULL8;
00121             bad++;
00122           }
00123           else {
00124             out[i] = tan (in[i]);
00125           }
00126           break;
00127         case ACOS:
00128           if (in[i] < -1.0 || in[i] > 1.0) {
00129             out[i] = NULL8;
00130             bad++;
00131           }
00132           else {
00133             out[i] = acos (in[i]);
00134           }
00135           break;
00136         case ASIN:
00137           if (in[i] < -1.0 || in[i] > 1.0) {
00138             out[i] = NULL8;
00139             bad++;
00140           }
00141           else {
00142             out[i] = asin (in[i]);
00143           }
00144           break;
00145         case ATAN:
00146           out[i] = atan (in[i]);
00147           break;
00148         case INV:
00149           if (in[i] == 0) {
00150             out[i] = NULL8;
00151             bad++;
00152           }
00153           else {
00154             out[i] = 1 / in[i];
00155           }
00156           break;
00157         case SQRT:
00158           if (in[i] <= 0) {
00159             out[i] = NULL8;
00160             bad++;
00161           }
00162           else {
00163             out[i] = sqrt (in[i]);
00164           }
00165           break;
00166         case POW10:
00167           out[i] = pow (10,in[i]);
00168           break;
00169         case EXP:
00170           out[i] = exp (in[i]);
00171           break;
00172         case XTOY:
00173           out[i] = pow (in[i],y);
00174           break;
00175         case LOG10:
00176           if (in[i] <= 0) {
00177             out[i] = NULL8;
00178             bad++;
00179           }
00180           else {
00181             out[i] = log10 (in[i]);
00182           }
00183           break;
00184         case LN:
00185           if (in[i] <= 0) {
00186             out[i] = NULL8;
00187             bad++;
00188           }
00189           else {
00190             out[i] = log (in[i]);
00191           }
00192           break;
00193         case ABS:
00194           out[i] = abs (in[i]);
00195           break;
00196       }
00197     }
00198   }
00199 }