Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

LdfFile.cxx

Go to the documentation of this file.
00001 
00012 #include "FitsFile.h"
00013 
00014 #include <cassert>
00015 
00016 using std::string;
00017 using std::vector;
00018 
00019 FitsFile::FitsFile ( const std::string & filename )
00020   : FitsFileBase ( filename )
00021 {
00022 }
00023 
00024 void
00025 FitsFile::
00026 fillHDUNames ( std::vector < std::string > & names )
00027 {
00028   names.clear ();
00029   int number = getNumberOfHDU ( );
00030 
00031   for ( int i = 0; i < number; i++ ) {
00032     moveToHDU ( i );
00033     string value = stringValueForKey ( "EXTNAME" );
00034 
00035     if ( value == "" ) {
00036       if ( i == 0 ) {
00037         int number = intValueForKey ( "NAXIS" );
00038         if ( number == 0 ) {
00039           value = "Empty image";
00040         }
00041       }
00042     }
00043 
00044     if ( value == "" ) value = "<no name>";
00045     names.push_back ( value );
00046   }
00047 }
00048 
00049 int
00050 FitsFile::
00051 fillColumnNames ( std::vector < std::string > & labels )
00052 {
00053   labels.clear ();
00054   int columns = getNumberOfColumns ();
00055 
00056   if ( columns != 0 ) {
00057     m_status = 0; // must NOT be reset on each fits call, else matchs
00058                   // same column on each call
00059     for ( int i = 0; i < columns; i++ ) { // count like Fortran
00060       char colname [ FLEN_VALUE ];
00061       int col;
00062       fits_get_colname ( m_fptr, CASEINSEN, "*",
00063                          colname, &col, &m_status );
00064       labels.push_back ( string ( colname ) );
00065     }
00066   }
00067   else { // must be image
00068     labels.push_back ( string ( "none" ) );
00069   }
00070 
00071   return m_status;
00072 }
00073 
00074 int
00075 FitsFile::
00076 fillDoubleVectorFromColumn ( std::vector < double > & vec, int column )
00077 {
00078   int retval = 0;
00079 
00080   HduType type = getHduType ();
00081   if ( type == Btable || type == Atable ) {
00082     retval = fillFromTableColumn ( vec, column );
00083   }
00084   else {
00085     retval = fillFromImage ( vec );
00086   }
00087 
00088   return retval;
00089 }
00090 
00091 int
00092 FitsFile::
00093 fillFromTableColumn ( std::vector < double > & vec, int column )
00094 {
00095   int anynul;
00096   double nulval = 0;
00097   long nelements = vec.size();
00098   vector<double>::iterator it = vec.begin();
00099   double * ptr = &*it;
00100   // Careful, counting columns like Fortran
00101   m_status = 0;
00102   fits_read_col_dbl( m_fptr, column+1, 1, 1, nelements, nulval,
00103                      ptr, &anynul, &m_status);
00104 
00105   return m_status;
00106 }
00107 
00108 int
00109 FitsFile::
00110 fillAxisSizes ( std::vector < long > & vec ) const
00111 {
00112   vec.clear ();
00113   int naxis = getImageDimensions ();
00114   vec.resize ( naxis );
00115 
00116   vector < long > ::iterator first = vec.begin();
00117   long * ptr = & *first;
00118   m_status = 0;
00119   fits_get_img_size ( m_fptr, naxis, ptr, & m_status );
00120   assert ( m_status == 0 );
00121 
00122   return m_status;
00123 }
00124 
00125 void
00126 FitsFile::
00127 fillImageDeltas ( std::vector < double > & deltas ) const
00128 {
00129   deltas.clear ();
00130   int naxis = getImageDimensions ();
00131   deltas.reserve ( naxis );
00132 
00133   char key [ FLEN_KEYWORD];
00134   char * keyroot = "CDELT";
00135   for ( int i = 0; i < naxis; i++ ) {
00136     m_status = 0;
00137     fits_make_keyn ( keyroot, i+1, key, & m_status );
00138     bool yes = hasKey ( key );
00139 
00140     if ( yes ) {
00141       double value = doubleValueForKey ( key );
00142       deltas.push_back ( value );
00143     }
00144     else { // no key, take default
00145       deltas.push_back ( 1.0 );
00146     }
00147   }
00148 }
00149 
00150 void
00151 FitsFile::
00152 fillRefPixelIndices ( std::vector < int > & indices ) const
00153 {
00154   indices.clear ();
00155   int naxis = getImageDimensions ();
00156   indices.reserve ( naxis );
00157 
00158   char key [ FLEN_KEYWORD];
00159   char * keyroot = "CRPIX";
00160   for ( int i = 0; i < naxis; i++ ) {
00161     m_status = 0;
00162     fits_make_keyn ( keyroot, i+1, key, & m_status );
00163     bool yes = hasKey ( key );
00164 
00165     if ( yes ) {
00166       int value = intValueForKey ( key );
00167       indices.push_back ( value );
00168     }
00169     else { // no key, take default
00170       indices.push_back ( 1 );
00171     }
00172   }
00173 }
00174 
00175 void
00176 FitsFile::
00177 fillRefPixelValues ( std::vector < double > & values ) const
00178 {
00179   values.clear ();
00180   int naxis = getImageDimensions ();
00181   values.reserve ( naxis );
00182 
00183   char key [ FLEN_KEYWORD];
00184   char * keyroot = "CRVAL";
00185   for ( int i = 0; i < naxis; i++ ) {
00186     m_status = 0;
00187     fits_make_keyn ( keyroot, i+1, key, & m_status );
00188     bool yes = hasKey ( key );
00189 
00190     if ( yes ) {
00191       double value = doubleValueForKey ( key );
00192       values.push_back ( value );
00193     }
00194     else { // no key, take default
00195       values.push_back ( 0. );
00196     }
00197   }
00198 }
00199 
00200 bool
00201 FitsFile::
00202 isHammerAitoff () const
00203 {
00204   bool hammer = true;
00205 
00206   char key [FLEN_KEYWORD];
00207   char * keyroot = "CTYPE";
00208   for ( int i = 0; i < 2; i++ ) {
00209     fits_make_keyn ( keyroot, i+1, key, & m_status );
00210     bool yes = hasKey ( key );
00211 
00212     if ( yes ) {
00213       string value = stringValueForKey ( key );
00214       if ( value.find ( "-AIT" ) == string::npos ) {
00215         hammer = false;
00216       }
00217     } else {
00218       hammer = false;
00219     }
00220   }
00221 
00222   return hammer;
00223 }
00224 
00225 int
00226 FitsFile::
00227 fillFromImage ( std::vector < double > & vec )
00228 {
00229   vector < long > naxes;
00230   fillAxisSizes ( naxes );
00231   if (  naxes.size () == 3 ) {
00232     assert ( naxes[2] == 1 );
00233   }
00234 
00235   int datatype = Double;
00236   long nelements = naxes[0] * naxes[1];
00237   double nulval = 0;
00238   vector < double >::iterator first = vec.begin();
00239   double * ptr = & *first;
00240   int anynul;
00241   m_status = 0;
00242   if ( naxes.size () == 2 ) {
00243     long fpixel[2] = { 1, 1 }; // index like Fortran
00244     fits_read_pix ( m_fptr, datatype, fpixel, nelements,
00245                     & nulval, ptr, & anynul, & m_status );
00246   } else {
00247     long fpixel[] = { 1, 1, 1 }; // index like Fortran
00248     fits_read_pix ( m_fptr, datatype, fpixel, nelements,
00249                     & nulval, ptr, & anynul, & m_status );
00250   }
00251 
00252   return m_status;
00253 }
00254 
00255 int
00256 FitsFile::
00257 fillIntVectorFromColumn( std::vector < int > & vec, int column )
00258 {
00259   int anynul, status = 0;
00260   int nulval = 0;
00261   long nelements = vec.size();
00262   vector<int>::iterator it = vec.begin();
00263   int * ptr = new int [ nelements ];
00264   // Careful, counting columns like Fortran
00265   m_status = 0;
00266   fits_read_col_int( m_fptr, column+1, 1, 1, nelements, nulval,
00267                      ptr, &anynul, &status);
00268   copy ( ptr, ptr+nelements, it );
00269 
00270   return status;
00271 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3