USGS

Isis 3.0 Application Source Code Reference

Home

camstats.cpp

Go to the documentation of this file.
00001 #include "Isis.h"
00002 #include "Statistics.h"
00003 #include "Camera.h"
00004 #include "UserInterface.h"
00005 #include "Cube.h"
00006 #include "Progress.h"
00007 #include "Process.h"
00008 
00009 #include "iString.h"
00010 
00011 using namespace std;
00012 using namespace Isis;
00013 
00014 //function to build stats data
00015 void buildStats (Camera *cam, int &sample, int &line);
00016 void writeFlat (ofstream &os, Statistics &s);
00017 
00018 /**  Produces NULL values for special pixels
00019  * 
00020  * @param keyname  Name of keyword to generate
00021  * @param value    Value to write to keyword
00022  * @param unit     Optional units for keywords
00023  * 
00024  * @return PvlKeyword Newly created keyword
00025  */
00026 static inline PvlKeyword ValidateKey(const std::string keyname, const double 
00027  &value, const std::string &unit = "") { 
00028   if (IsSpecial(value)) {
00029     return (PvlKeyword(keyname, "NULL"));
00030   }
00031   else {
00032     return (PvlKeyword(keyname,value,unit));
00033   }
00034 }
00035 
00036 
00037 //global stats opjects that will be used by function 
00038 Statistics latStat;
00039 Statistics lonStat;
00040 Statistics resStat;
00041 Statistics sampleResStat;
00042 Statistics lineResStat;
00043 Statistics aspectRatioStat;
00044 Statistics phaseStat;
00045 Statistics emissionStat;
00046 Statistics incidenceStat;
00047 Statistics localSolarTimeStat;
00048 Statistics localRaduisStat;
00049 Statistics northAzimuthStat;
00050 
00051 void IsisMain(){
00052 
00053   Process p;
00054 
00055   // Reset all the stats objects because they are global
00056   latStat.Reset();
00057   lonStat.Reset();
00058   resStat.Reset();
00059   sampleResStat.Reset();
00060   lineResStat.Reset();
00061   aspectRatioStat.Reset();
00062   phaseStat.Reset();
00063   emissionStat.Reset();
00064   incidenceStat.Reset();
00065   localSolarTimeStat.Reset();
00066   localRaduisStat.Reset();
00067   northAzimuthStat.Reset();
00068 
00069   UserInterface &ui = Application::GetUserInterface();
00070 
00071   Cube *icube = p.SetInputCube("FROM");
00072   Camera *cam = icube->Camera();
00073 
00074 //  Cube cube;
00075 //  cube.Open(ui.GetFilename("FROM"));
00076 //  Camera *cam = cube.Camera();
00077 
00078   int eband = cam->Bands();
00079   // if the camera is band independent that only run one band
00080   if (cam->IsBandIndependent()) eband = 1;
00081   int linc = ui.GetInteger("LINC");
00082   int sinc = ui.GetInteger("SINC");
00083 
00084   int pTotal = eband * ((cam->Lines()-2) / linc + 2) ;
00085   Progress progress;
00086   progress.SetMaximumSteps(pTotal);
00087   progress.CheckStatus();
00088 
00089   for (int band=1; band<=eband; band++) {
00090     cam->SetBand(band);
00091     for (int line=1; line<(int)cam->Lines(); line=line+linc) {
00092       for (int sample=1; sample< cam->Samples(); sample=sample+sinc) {
00093         buildStats(cam, sample, line);
00094       }
00095       //set the sample value to the last sample and run buildstats
00096       int sample = cam->Samples();
00097       buildStats(cam, sample, line);
00098       progress.CheckStatus();
00099     }
00100     //set the line value to the last line and run on all samples(sample + sinc)
00101     int line = cam->Lines();
00102     for (int sample=1; sample< cam->Samples(); sample=sample+sinc) {
00103       buildStats(cam, sample, line);
00104     }
00105     //set last sample and run with last line
00106     int sample = cam->Samples();
00107     buildStats(cam, sample, line);
00108     progress.CheckStatus();
00109   }
00110 
00111   //Set up the Pvl groups and get min, max, avg, and sd for each statstics object  
00112   PvlGroup pUser("User Parameters");
00113   pUser += PvlKeyword("Filename",ui.GetFilename("FROM"));
00114   pUser += PvlKeyword("Linc",ui.GetInteger("LINC"));
00115   pUser += PvlKeyword("Sinc",ui.GetInteger("SINC"));
00116 
00117   PvlGroup pLat("Latitude");
00118   pLat += ValidateKey("LatitudeMinimum",latStat.Minimum());
00119   pLat += ValidateKey("LatitudeMaximum",latStat.Maximum());
00120   pLat += ValidateKey("LatitudeAverage",latStat.Average());
00121   pLat += ValidateKey("LatitudeStandardDeviation",latStat.StandardDeviation());
00122 
00123   PvlGroup pLon("Longitude");
00124   pLon += ValidateKey("LongitudeMinimum",lonStat.Minimum());
00125   pLon += ValidateKey("LongitudeMaximum",lonStat.Maximum());
00126   pLon += ValidateKey("LongitudeAverage",lonStat.Average());
00127   pLon += ValidateKey("LongitudeStandardDeviation",lonStat.StandardDeviation());
00128 
00129   PvlGroup pSampleRes("SampleResolution");
00130   pSampleRes += ValidateKey("SampleResolutionMinimum",sampleResStat.Minimum(),
00131                            "meters/pixel");
00132   pSampleRes += ValidateKey("SampleResolutionMaximum",sampleResStat.Maximum(),
00133                            "meters/pixel");
00134   pSampleRes += ValidateKey("SampleResolutionAverage",sampleResStat.Average(),
00135                            "meters/pixel");
00136   pSampleRes += ValidateKey("SampleResolutionStandardDeviation",
00137                            sampleResStat.StandardDeviation(),"meters/pixel");
00138 
00139   PvlGroup pLineRes("LineResolution");
00140   pLineRes += ValidateKey("LineResolutionMinimum",lineResStat.Minimum(),
00141                          "meters/pixel");
00142   pLineRes += ValidateKey("LineResolutionMaximum",lineResStat.Maximum(),
00143                          "meters/pixel");
00144   pLineRes += ValidateKey("LineResolutionAverage",lineResStat.Average(),
00145                          "meters/pixel");
00146   pLineRes += ValidateKey("LineResolutionStandardDeviation",
00147                          lineResStat.StandardDeviation(),"meters/pixel");
00148 
00149   PvlGroup pResolution("Resolution");
00150   pResolution += ValidateKey("ResolutionMinimum",resStat.Minimum(),
00151                             "meters/pixel");
00152   pResolution += ValidateKey("ResolutionMaximum",resStat.Maximum(),
00153                             "meters/pixel");
00154   pResolution += ValidateKey("ResolutionAverage",resStat.Average(),
00155                             "meters/pixel");
00156   pResolution += ValidateKey("ResolutionStandardDeviation",
00157                             resStat.StandardDeviation(),"meters/pixel");
00158 
00159   PvlGroup pAspectRatio("AspectRatio");
00160   pAspectRatio += ValidateKey("AspectRatioMinimum",aspectRatioStat.Minimum());
00161   pAspectRatio += ValidateKey("AspectRatioMaximun",aspectRatioStat.Maximum());
00162   pAspectRatio += ValidateKey("AspectRatioAverage",aspectRatioStat.Average());
00163   pAspectRatio += ValidateKey("AspectRatioStandardDeviation",
00164                              aspectRatioStat.StandardDeviation());
00165 
00166   PvlGroup pPhase("PhaseAngle");
00167   pPhase += ValidateKey("PhaseMinimum",phaseStat.Minimum());
00168   pPhase += ValidateKey("PhaseMaximum",phaseStat.Maximum());
00169   pPhase += ValidateKey("PhaseAverage",phaseStat.Average());
00170   pPhase += ValidateKey("PhaseStandardDeviation",phaseStat.StandardDeviation());
00171 
00172   PvlGroup pEmission("EmissionAngle");
00173   pEmission += ValidateKey("EmissionMinimum",emissionStat.Minimum());
00174   pEmission += ValidateKey("EmissionMaximum",emissionStat.Maximum());
00175   pEmission += ValidateKey("EmissionAverage",emissionStat.Average());
00176   pEmission += ValidateKey("EmissionStandardDeviation",
00177                           emissionStat.StandardDeviation());
00178 
00179   PvlGroup pIncidence("IncidenceAngle");
00180   pIncidence += ValidateKey("IncidenceMinimum",incidenceStat.Minimum());
00181   pIncidence += ValidateKey("IncidenceMaximum",incidenceStat.Maximum());
00182   pIncidence += ValidateKey("IncidenceAverage",incidenceStat.Average());
00183   pIncidence += ValidateKey("IncidenceStandardDeviation",
00184                            incidenceStat.StandardDeviation());
00185 
00186   PvlGroup pTime("LocalSolarTime");
00187   pTime += ValidateKey("LocalSolarTimeMinimum",localSolarTimeStat.Minimum(),
00188                       "hours");
00189   pTime += ValidateKey("LocalSolarTimeMaximum",localSolarTimeStat.Maximum(),
00190                       "hours");
00191   pTime += ValidateKey("LocalSolarTimeAverage",localSolarTimeStat.Average(),
00192                       "hours");
00193   pTime += ValidateKey("LocalSolarTimeStandardDeviation",
00194                       localSolarTimeStat.StandardDeviation(),"hours");
00195 
00196   PvlGroup pLocalRadius("LocalRadius");
00197   pLocalRadius += ValidateKey("LocalRadiusMinimum",localRaduisStat.Minimum());
00198   pLocalRadius += ValidateKey("LocalRadiusMaximum",localRaduisStat.Maximum());
00199   pLocalRadius += ValidateKey("LocalRadiusAverage",localRaduisStat.Average());
00200   pLocalRadius += ValidateKey("LocalRadiusStandardDeviation",
00201                              localRaduisStat.StandardDeviation());
00202 
00203   PvlGroup pNorthAzimuth("NorthAzimuth");
00204   pNorthAzimuth += ValidateKey("NorthAzimuthMinimum",northAzimuthStat.Minimum());
00205   pNorthAzimuth += ValidateKey("NorthAzimuthMaximum",northAzimuthStat.Maximum());
00206   pNorthAzimuth += ValidateKey("NorthAzimuthAverage",northAzimuthStat.Average());
00207   pNorthAzimuth += ValidateKey("NorthAzimuthStandardDeviation",
00208                               northAzimuthStat.StandardDeviation());
00209 
00210   // Send the Output to the log area
00211   Application::Log(pUser);
00212   Application::Log(pLat);
00213   Application::Log(pLon);
00214   Application::Log(pSampleRes);
00215   Application::Log(pLineRes);
00216   Application::Log(pResolution);
00217   Application::Log(pAspectRatio);
00218   Application::Log(pPhase);
00219   Application::Log(pEmission);
00220   Application::Log(pIncidence);
00221   Application::Log(pTime);
00222   Application::Log(pLocalRadius);
00223   Application::Log(pNorthAzimuth);
00224 
00225   if (ui.WasEntered("TO")) {
00226     string from = ui.GetFilename("FROM");
00227     string outfile = Filename(ui.GetFilename("TO")).Expanded();
00228     bool exists = Filename(outfile).Exists();
00229     bool append = ui.GetBoolean("APPEND");
00230 
00231     //If the user chooses a fromat of PVL then write to the output file ("TO")
00232     if (ui.GetString("FORMAT") == "PVL") {
00233       Pvl temp;
00234       temp.SetTerminator("");
00235       temp.AddGroup(pUser);
00236       temp.AddGroup(pLat);
00237       temp.AddGroup(pLon);
00238       temp.AddGroup(pSampleRes);
00239       temp.AddGroup(pLineRes);
00240       temp.AddGroup(pResolution);
00241       temp.AddGroup(pAspectRatio);
00242       temp.AddGroup(pPhase);
00243       temp.AddGroup(pEmission);
00244       temp.AddGroup(pIncidence);
00245       temp.AddGroup(pTime);
00246       temp.AddGroup(pLocalRadius);
00247       temp.AddGroup(pNorthAzimuth);
00248 
00249       if (append) {
00250         temp.Append(outfile);
00251       }
00252       else {
00253         temp.Write(outfile);
00254       }
00255     }
00256 
00257     //Create a flatfile of the data with columhn headings 
00258     // the flatfile is comma delimited and can be imported in to spreadsheets
00259     else {
00260       ofstream os;
00261       bool writeHeader = true;
00262       if (append) {
00263         os.open(outfile.c_str(),ios::app);
00264         if (exists) {
00265           writeHeader = false;
00266         }
00267       }
00268       else {
00269         os.open(outfile.c_str(),ios::out);
00270       }
00271 
00272       // if new file or append and no file exists then write header
00273       if(writeHeader){
00274       os << "Filename,"<<
00275         "LatitudeMinimum,"<<
00276         "LatitudeMaximum,"<<
00277         "LatitudeAverage,"<<
00278         "LatitudeStandardDeviation,"<<
00279         "LongitudeMinimum,"<<
00280         "LongitudeMaximum,"<<
00281         "LongitudeAverage,"<<
00282         "LongitudeStandardDeviation,"<<
00283         "SampleResolutionMinimum,"<<
00284         "SampleResolutionMaximum,"<<
00285         "SampleResolutionAverage,"<<
00286         "SampleResolutionStandardDeviation,"<<
00287         "LineResolutionMinimum,"<<
00288         "LineResolutionMaximum,"<<
00289         "LineResolutionAverage,"<<
00290         "LineResolutionStandardDeviation,"<<
00291         "ResolutionMinimum,"<<
00292         "ResolutionMaximum,"<<
00293         "ResolutionAverage,"<<
00294         "ResolutionStandardDeviation,"<<
00295         "AspectRatioMinimum,"<<
00296         "AspectRatioMaximum,"<<
00297         "AspectRatioAverage,"<<
00298         "AspectRatioStandardDeviation,"<<
00299         "PhaseMinimum,"<<
00300         "PhaseMaximum,"<<
00301         "PhaseAverage,"<<
00302         "PhaseStandardDeviation,"<<
00303         "EmissionMinimum,"<<
00304         "EmissionMaximum,"<<
00305         "EmissionAverage,"<<
00306         "EmissionStandardDeviation,"<<
00307         "IncidenceMinimum,"<<
00308         "IncidenceMaximum,"<<
00309         "IncidenceAverage,"<<
00310         "IncidenceStandardDeviation,"<<
00311         "LocalSolarTimeMinimum,"<<
00312         "LocalSolarTimeMaximum,"<<
00313         "LocalSolarTimeAverage,"<<
00314         "LocalSolarTimeStandardDeviation,"<<
00315         "LocalRadiusMaximum,"<<
00316         "LocalRadiusMaximum,"<<
00317         "LocalRadiusAverage,"<<
00318         "LocalRadiusStandardDeviation,"<<
00319         "NorthAzimuthMinimum,"<<
00320         "NorthAzimuthMaximum,"<<
00321         "NorthAzimuthAverage,"<<
00322         "NorthAzimuthStandardDeviation,"<<endl;
00323       }
00324       os << Filename(from).Expanded() <<",";
00325         //call the function to write out the values for each group
00326         writeFlat(os, latStat);
00327         writeFlat(os, lonStat);
00328         writeFlat(os, sampleResStat);
00329         writeFlat(os, lineResStat);
00330         writeFlat(os, resStat);
00331         writeFlat(os, aspectRatioStat);
00332         writeFlat(os, phaseStat);
00333         writeFlat(os, emissionStat);
00334         writeFlat(os, incidenceStat);
00335         writeFlat(os, localSolarTimeStat);
00336         writeFlat(os, localRaduisStat);
00337         writeFlat(os, northAzimuthStat);
00338         os << endl;
00339     }
00340   }
00341 
00342   if( ui.GetBoolean("ATTACH") ) {
00343 
00344     string cam_name = "CameraStatistics";
00345 
00346     //Creates new CameraStatistics Table
00347     TableField fname( "Name", Isis::TableField::Text, 20 );
00348     TableField fmin( "Minimum", Isis::TableField::Double );
00349     TableField fmax( "Maximum", Isis::TableField::Double );
00350     TableField favg( "Average", Isis::TableField::Double );
00351     TableField fstd( "StandardDeviation", Isis::TableField::Double );
00352 
00353     TableRecord record;
00354     record += fname;
00355     record += fmin;
00356     record += fmax;
00357     record += favg;
00358     record += fstd;
00359 
00360     Table table( cam_name, record );
00361 
00362     vector<PvlGroup> grps;
00363     grps.push_back( pLat );
00364     grps.push_back( pLon );
00365     grps.push_back( pSampleRes );
00366     grps.push_back( pLineRes );
00367     grps.push_back( pResolution );
00368     grps.push_back( pAspectRatio );
00369     grps.push_back( pPhase );
00370     grps.push_back( pEmission );
00371     grps.push_back( pIncidence );
00372     grps.push_back( pTime );
00373     grps.push_back( pLocalRadius );
00374     grps.push_back( pNorthAzimuth );
00375 
00376     for( vector<PvlGroup>::iterator g = grps.begin(); g != grps.end(); g++ ) {
00377       int i = 0;
00378       record[i++] = g->Name();
00379       record[i++] = (double) (*g)[0][0];
00380       record[i++] = (double) (*g)[1][0];
00381       record[i++] = (double) (*g)[2][0];
00382       record[i++] = (double) (*g)[3][0];
00383       table += record;
00384     }
00385 
00386     icube->ReOpen( "rw" );
00387     icube->Write( table );
00388     p.WriteHistory(*icube);
00389     icube->Close();
00390 
00391   }
00392 
00393 }
00394 
00395 //function to add stats data to the stats object.
00396 //also tests if the line and samp are valid
00397 void buildStats (Camera *cam, int &sample, int &line){
00398   cam->SetImage(sample, line);
00399   if (cam->HasSurfaceIntersection()) {
00400     latStat.AddData(cam->UniversalLatitude());
00401     lonStat.AddData(cam->UniversalLongitude());
00402     resStat.AddData(cam->PixelResolution());
00403     sampleResStat.AddData(cam->SampleResolution());
00404     lineResStat.AddData(cam->LineResolution());
00405     phaseStat.AddData(cam->PhaseAngle());
00406     emissionStat.AddData(cam->EmissionAngle());
00407     incidenceStat.AddData(cam->IncidenceAngle());
00408     localSolarTimeStat.AddData(cam->LocalSolarTime());
00409     localRaduisStat.AddData(cam->LocalRadius());
00410     northAzimuthStat.AddData(cam->NorthAzimuth());
00411 
00412     double Aratio = cam->LineResolution() / cam->SampleResolution();
00413     aspectRatioStat.AddData(Aratio);    
00414   }
00415 }
00416 
00417 static inline string ValidateValue(const double &value) {
00418   if ( IsSpecial(value) ) {
00419     return (string("NULL"));
00420   }
00421   else {
00422     return ((string) iString(value));
00423   }
00424 }
00425 
00426 //function to write the stats values to flat file
00427 void writeFlat (ofstream &os, Statistics &s){
00428   os << ValidateValue(s.Minimum())<<","<<
00429         ValidateValue(s.Maximum())<<","<<
00430         ValidateValue(s.Average())<<","<<
00431         ValidateValue(s.StandardDeviation())<<",";
00432 }