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;
00058
00059 for ( int i = 0; i < columns; i++ ) {
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 {
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
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 {
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 {
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 {
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 };
00244 fits_read_pix ( m_fptr, datatype, fpixel, nelements,
00245 & nulval, ptr, & anynul, & m_status );
00246 } else {
00247 long fpixel[] = { 1, 1, 1 };
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
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 }