00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef FITS_FITSIO_H
00029 #define FITS_FITSIO_H
00030
00031 #include <casacore/casa/aips.h>
00032 # include <casacore/fits/FITS/fits.h>
00033 # include <casacore/fits/FITS/blockio.h>
00034 # include <casacore/fits/FITS/hdu.h>
00035
00036 # include <casacore/casa/Arrays/Vector.h>
00037
00038 namespace casacore {
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 class FitsIO {
00063 public:
00064 virtual ~FitsIO();
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 enum FitsErrs { OK, IOERR, MISSKEY, BADBEGIN, EMPTYFILE,
00079 NOPRIMARY, BADOPER, BADEOF, MEMERR, BADBITPIX, NOAXISN,
00080 NOPCOUNT, NOGCOUNT, BADPCOUNT, BADGCOUNT, NOGROUPS,
00081 BADNAXIS, BADPRIMARY, BADSIZE, HDUERR };
00082 int err() const { return m_err_status; }
00083
00084
00085
00086
00087 int fitsrecsize() const { return m_recsize; }
00088
00089
00090
00091 Bool isafits() const { return m_valid_fits; }
00092
00093 Bool isextend() const { return m_extend; }
00094
00095 Bool eof() const { return Bool(m_rec_type == FITS::EndOfFile); }
00096
00097 FITS::FitsRecType rectype() const { return m_rec_type; }
00098
00099 FITS::HDUType hdutype() const { return m_hdu_type; }
00100 FITS::ValueType datatype() const { return m_data_type; }
00101
00102
00103 OFF_T datasize() const { return m_data_size; }
00104
00105 Int itemsize() const { return m_item_size; }
00106
00107
00108 OFF_T currsize() const { return m_curr_size; }
00109
00110 FitsKeyCardTranslator& getkc(){ return m_kc; }
00111
00112 fitsfile *getfptr() const { return m_fptr; }
00113
00114
00115 OFF_T getskipsize() const {return m_skipHDU_size;}
00116
00117
00118 protected:
00119 FitsIO(FITSErrorHandler);
00120
00121 fitsfile *m_fptr;
00122 const int m_recsize;
00123 Bool m_valid_fits;
00124 Bool m_extend;
00125 Bool m_isaprimary;
00126 Bool m_header_done;
00127 FITS::FitsRecType m_rec_type;
00128 FITS::HDUType m_hdu_type;
00129
00130 FITSErrorHandler m_errfn;
00131 FitsErrs m_err_status;
00132 FitsKeyCardTranslator m_kc;
00133 FitsKeywordList m_kw;
00134
00135 char *m_curr;
00136 int m_bytepos;
00137 Int m_item_size;
00138 FITS::ValueType m_data_type;
00139
00140 OFF_T m_data_size;
00141
00142
00143
00144 OFF_T m_curr_size;
00145
00146
00147 OFF_T m_skipHDU_size;
00148
00149
00150 virtual void errmsg(FitsErrs, const char *) = 0;
00151
00152 };
00153
00154
00155
00156 class FitsInput : public FitsIO {
00157 friend int HeaderDataUnit::get_hdr(FITS::HDUType, FitsKeywordList &);
00158 friend OFF_T HeaderDataUnit::read_all_data(char *);
00159 friend int HeaderDataUnit::read_data(char *, Int);
00160 friend int HeaderDataUnit::skip(uInt);
00161 friend int HeaderDataUnit::skip();
00162
00163 public:
00164
00165 FitsInput(const char *, const FITS::FitsDevice &, int = 10,
00166 FITSErrorHandler errhandler = FITSError::defaultHandler);
00167 FitsInput(FITSErrorHandler errhandler = FITSError::defaultHandler);
00168 ~FitsInput();
00169
00170
00171 int skip_hdu();
00172
00173
00174 void skip_all(FITS::HDUType);
00175
00176
00177
00178 char *read_sp();
00179
00180
00181
00182
00183 Vector<String> kwlist_str(Bool length80=False);
00184
00185
00186 int blockno() const {return m_fin.blockno();}
00187
00188
00189 int recno() const {return m_fin.recno();}
00190 BlockInput & getfin(){ return m_fin; }
00191
00192
00193 int getnumhdu() const {return m_thdunum;}
00194
00195 private:
00196 BlockInput &m_fin;
00197 BlockInput &make_input(const char *, const FITS::FitsDevice &, int,
00198 FITSErrorHandler errhandler = FITSError::defaultHandler);
00199
00200
00201 Bool m_got_rec;
00202
00203 int m_thdunum;
00204
00205 virtual void errmsg(FitsErrs, const char *);
00206 void init();
00207 void read_header_rec();
00208 bool current_hdu_type( FITS::HDUType &);
00209 bool get_data_type( FITS::ValueType &);
00210
00211
00212
00213
00214
00215 int process_header(FITS::HDUType, FitsKeywordList &);
00216
00217
00218 OFF_T read_all(FITS::HDUType, char *);
00219
00220 int read(FITS::HDUType, char *, int );
00221
00222 int skip(FITS::HDUType, OFF_T);
00223
00224 };
00225
00226
00227
00228 class FitsOutput : public FitsIO {
00229 friend int HeaderDataUnit::write_hdr(FitsOutput &);
00230 friend int HeaderDataUnit::write_all_data(FitsOutput &, char *);
00231 friend int HeaderDataUnit::write_data(FitsOutput &, char *, Int);
00232
00233 public:
00234
00235 FitsOutput(const char *, const FITS::FitsDevice &, int = 10,
00236 FITSErrorHandler errhandler = FITSError::defaultHandler);
00237 FitsOutput(FITSErrorHandler errhandler = FITSError::defaultHandler);
00238 ~FitsOutput();
00239
00240
00241 void set_data_info( FitsKeywordList &kwl, FITS::HDUType t, FITS::ValueType dt, OFF_T ds, Int is);
00242
00243
00244 int write_sp(char *rec);
00245
00246 int hdu_complete() {
00247 return (m_rec_type == FITS::HDURecord && m_data_size == 0);
00248 }
00249 BlockOutput & getfout(){ return m_fout; }
00250 void setfptr( fitsfile* ffp );
00251 Bool required_keys_only(){ return m_required_keys_only; }
00252
00253 private:
00254 BlockOutput &m_fout;
00255 Bool m_required_keys_only;
00256 BlockOutput &make_output(const char *, const FITS::FitsDevice &, int,
00257 FITSErrorHandler errhandler = FITSError::defaultHandler);
00258
00259 virtual void errmsg(FitsErrs, const char *);
00260
00261 int hdu_inprogress() {
00262 return (m_rec_type == FITS::HDURecord && m_data_size > 0 && m_curr_size < m_data_size);
00263 }
00264
00265
00266
00267 int write_hdr(FitsKeywordList &, FITS::HDUType, FITS::ValueType, OFF_T, Int);
00268
00269 int write_all(FITS::HDUType, char *, char);
00270
00271 int write(FITS::HDUType, char *, Int, char);
00272
00273 };
00274
00275
00276
00277 class FitsDiskInput : public BlockInput {
00278 public:
00279 FitsDiskInput(const char *, int, int = 1,
00280 FITSErrorHandler errhandler = FITSError::defaultHandler);
00281 ~FitsDiskInput();
00282
00283 char *skip(int);
00284 };
00285
00286
00287
00288 class FitsDiskOutput : public BlockOutput {
00289 public:
00290 FitsDiskOutput(const char *, int, int = 1,
00291 FITSErrorHandler errhandler = FITSError::defaultHandler);
00292 ~FitsDiskOutput();
00293 };
00294
00295
00296
00297 class FitsStdInput : public BlockInput {
00298 public:
00299 FitsStdInput(int,
00300 FITSErrorHandler errhandler = FITSError::defaultHandler);
00301 ~FitsStdInput();
00302 };
00303
00304
00305
00306 class FitsStdOutput : public BlockOutput {
00307 public:
00308 FitsStdOutput(int,
00309 FITSErrorHandler errhandler = FITSError::defaultHandler);
00310 ~FitsStdOutput();
00311 };
00312
00313
00314
00315 class FitsTape9Input : public BlockInput {
00316 public:
00317 FitsTape9Input(const char *, int, int = 10,
00318 FITSErrorHandler errhandler = FITSError::defaultHandler);
00319 ~FitsTape9Input();
00320 };
00321
00322
00323
00324 class FitsTape9Output : public BlockOutput {
00325 public:
00326 FitsTape9Output(const char *, int, int = 10,
00327 FITSErrorHandler errhandler = FITSError::defaultHandler);
00328 ~FitsTape9Output();
00329 };
00330
00331
00332 }
00333
00334 # endif