|
Isis 3.0 Application Source Code Reference |
Home |
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 }