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_HDU_H
00029 #define FITS_HDU_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/casa/BasicSL/String.h>
00035 # include <casacore/casa/Arrays/Vector.h>
00036
00037
00038
00039 namespace casacore {
00040
00041 class FitsInput;
00042 class FitsOutput;
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 class HeaderDataUnit {
00072 friend std::ostream & operator << (std::ostream &, HeaderDataUnit &);
00073 public:
00074 virtual ~HeaderDataUnit();
00075
00076 Int dims() const { return no_dims; }
00077 Int dim(int n) const { return (0<no_dims && n<no_dims ? dimn[n] : 0); }
00078 OFF_T fitsdatasize() const { return fits_data_size; }
00079 FITS::ValueType datatype() const { return data_type; }
00080 Int fitsitemsize() const { return fits_item_size; }
00081 Int localitemsize() const { return local_item_size; }
00082 FITS::HDUType hdutype() const { return hdu_type; }
00083
00084
00085
00086 enum HDUErrs { OK, NOMEM, MISSKEY, BADBITPIX, NOAXISN,
00087 NOPCOUNT, NOGCOUNT, BADPCOUNT, BADGCOUNT, NOGROUPS,
00088 BADNAXIS, BADREC, BADTYPE, BADRULES, BADSIZE, BADOPER,
00089 BADCONV, BADIO };
00090 int err() const { return err_status; }
00091
00092
00093
00094
00095 int skip(uInt n);
00096 int skip();
00097
00098
00099
00100 int write_hdr(FitsOutput &);
00101
00102
00103
00104
00105
00106 static Bool determine_type(FitsKeywordList &, FITS::HDUType &,
00107 FITS::ValueType &, FITSErrorHandler, HDUErrs &);
00108
00109
00110
00111
00112
00113
00114
00115 static Bool compute_size(FitsKeywordList &, OFF_T &, Int &,
00116 FITS::HDUType &, FITS::ValueType &, FITSErrorHandler, HDUErrs &);
00117
00118
00119
00120 ConstFitsKeywordList &kwlist(){ return constkwlist_;}
00121
00122
00123 Vector<String> kwlist_str(Bool length80=False);
00124 void firstkw() { kwlist_.first(); }
00125 void lastkw() { kwlist_.last(); }
00126 const FitsKeyword *nextkw() { return kwlist_.next(); }
00127 const FitsKeyword *prevkw() { return kwlist_.prev(); }
00128 const FitsKeyword *currkw() { return kwlist_.curr(); }
00129 const FitsKeyword *kw(int n) { return kwlist_(n); }
00130
00131 const FitsKeyword *kw(const FITS::ReservedName &n) {
00132 return kwlist_(n); }
00133 const FitsKeyword *nextkw(FITS::ReservedName &n) {
00134 return kwlist_.next(n); }
00135 const FitsKeyword *kw(FITS::ReservedName &n, int i) {
00136 return kwlist_(n,i); }
00137 const FitsKeyword *nextkw(FITS::ReservedName &n, int i) {
00138 return kwlist_.next(n,i); }
00139 const FitsKeyword *kw(const char *n) { return kwlist_(n); }
00140 const FitsKeyword *nextkw(const char *n) { return kwlist_.next(n); }
00141 void mk(FITS::ReservedName k, Bool v, const char *c = 0);
00142 void mk(FITS::ReservedName k, const char *v = 0, const char *c = 0);
00143 void mk(FITS::ReservedName k, Int v, const char *c = 0);
00144 void mk(FITS::ReservedName k, double v, const char *c = 0);
00145 void mk(int n, FITS::ReservedName k, Bool v, const char *c = 0);
00146 void mk(int n, FITS::ReservedName k, const char *v, const char *c = 0);
00147 void mk(int n, FITS::ReservedName k, Int v, const char *c = 0);
00148 void mk(int n, FITS::ReservedName k, double v, const char *c = 0);
00149 void mk(const char *n, Bool v, const char *c = 0);
00150 void mk(const char *n, const char *v = 0, const char *c = 0);
00151 void mk(const char *n, Int v, const char *c = 0);
00152 void mk(const char *n, float v, const char *c = 0);
00153 void mk(const char *n, double v, const char *c = 0);
00154 void mk(const char *n, Int r, Int i, const char *c = 0);
00155 void mk(const char *n, float r, float i, const char *c = 0);
00156 void mk(const char *n, double r, double i, const char *c = 0);
00157 void spaces(const char *n = 0, const char *c = 0);
00158 void comment(const char *n = 0, const char *c = 0);
00159 void history(const char *c = 0);
00160
00161
00162 Bool notnull(double x) const { return double_null < x ? True : False; }
00163 Bool notnull(char *s) const { return ! s ? False : (s[0] != '\0' ? True : False); }
00164 Bool notnull(Int l) const { return Int_null < l ? True : False; }
00165
00166 protected:
00167
00168 HeaderDataUnit(FitsInput &, FITS::HDUType,
00169 FITSErrorHandler errhandler = FITSError::defaultHandler);
00170
00171
00172
00173
00174 HeaderDataUnit(FitsKeywordList &, FITS::HDUType,
00175 FITSErrorHandler errhandler = FITSError::defaultHandler,
00176 FitsInput * = 0);
00177
00178
00179
00180 HeaderDataUnit(FITS::HDUType,
00181 FITSErrorHandler errhandler = FITSError::defaultHandler,
00182 FitsInput * = 0);
00183
00184 bool init_data_unit( FITS::HDUType t );
00185
00186 FitsKeywordList &kwlist_;
00187 ConstFitsKeywordList constkwlist_;
00188 void posEnd();
00189
00190 FitsInput *fin;
00191 FITSErrorHandler errfn;
00192 HDUErrs err_status;
00193 void errmsg(HDUErrs, const char *);
00194
00195 Int no_dims;
00196 Int *dimn;
00197
00198 OFF_T fits_data_size;
00199 FITS::ValueType data_type;
00200 Int fits_item_size;
00201 Int local_item_size;
00202 FITS::HDUType hdu_type;
00203 char pad_char;
00204
00205
00206 char * assign(FITS::ReservedName);
00207 char * assign(FITS::ReservedName, int);
00208 double asgdbl(FITS::ReservedName, double);
00209 double asgdbl(FITS::ReservedName, int, double);
00210
00211 double double_null;
00212 char char_null;
00213 Int Int_null;
00214
00215 public:
00216 int get_hdr(FITS::HDUType, FitsKeywordList &);
00217 int read_data(char *, Int);
00218 int write_data(FitsOutput &, char *, Int);
00219 OFF_T read_all_data(char *);
00220 int write_all_data(FitsOutput &, char *);
00221 };
00222
00223 inline std::ostream & operator << (std::ostream &o, HeaderDataUnit &h) {
00224 return o << h.kwlist_; }
00225 inline void HeaderDataUnit::mk(FITS::ReservedName k, Bool v, const char *c) {
00226 posEnd(); kwlist_.mk(k,v,c); }
00227 inline void HeaderDataUnit::mk(FITS::ReservedName k, const char *v,
00228 const char *c) { posEnd(); kwlist_.mk(k,v,c); }
00229 inline void HeaderDataUnit::mk(FITS::ReservedName k, Int v, const char *c) {
00230 posEnd(); kwlist_.mk(k,v,c); }
00231 inline void HeaderDataUnit::mk(FITS::ReservedName k, double v, const char *c) {
00232 posEnd(); kwlist_.mk(k,v,c); }
00233 inline void HeaderDataUnit::mk(int n, FITS::ReservedName k, Bool v,
00234 const char *c) { posEnd(); kwlist_.mk(n,k,v,c); }
00235 inline void HeaderDataUnit::mk(int n, FITS::ReservedName k, const char *v,
00236 const char *c) { posEnd(); kwlist_.mk(n,k,v,c); }
00237 inline void HeaderDataUnit::mk(int n, FITS::ReservedName k, Int v,
00238 const char *c) { posEnd(); kwlist_.mk(n,k,v,c); }
00239 inline void HeaderDataUnit::mk(int n, FITS::ReservedName k, double v,
00240 const char *c) { posEnd(); kwlist_.mk(n,k,v,c); }
00241 inline void HeaderDataUnit::mk(const char *n, Bool v, const char *c) {
00242 posEnd(); kwlist_.mk(n,v,c); }
00243 inline void HeaderDataUnit::mk(const char *n, const char *v, const char *c) {
00244 posEnd(); kwlist_.mk(n,v,c); }
00245 inline void HeaderDataUnit::mk(const char *n, Int v, const char *c) {
00246 posEnd(); kwlist_.mk(n,v,c); }
00247 inline void HeaderDataUnit::mk(const char *n, float v, const char *c) {
00248 posEnd(); kwlist_.mk(n,v,c); }
00249 inline void HeaderDataUnit::mk(const char *n, double v, const char *c) {
00250 posEnd(); kwlist_.mk(n,v,c); }
00251 inline void HeaderDataUnit::mk(const char *n, Int r, Int i, const char *c) {
00252 posEnd(); kwlist_.mk(n,r,i,c); }
00253 inline void HeaderDataUnit::mk(const char *n, float r, float i, const char *c) {
00254 posEnd(); kwlist_.mk(n,r,i,c); }
00255 inline void HeaderDataUnit::mk(const char *n, double r, double i,
00256 const char *c) { posEnd(); kwlist_.mk(n,r,i,c); }
00257 inline void HeaderDataUnit::spaces(const char *n, const char *c) {
00258 posEnd(); kwlist_.spaces(n,c); }
00259 inline void HeaderDataUnit::comment(const char *n, const char *c) {
00260 posEnd(); kwlist_.comment(n,c); }
00261 inline void HeaderDataUnit::history(const char *c) {
00262 posEnd(); kwlist_.history(c); }
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 template <class TYPE>
00340 class PrimaryArray : public HeaderDataUnit {
00341 public:
00342 typedef TYPE ElementType;
00343
00344
00345 PrimaryArray(FitsInput &, FITSErrorHandler= FITSError::defaultHandler);
00346
00347 PrimaryArray(FitsKeywordList &,
00348 FITSErrorHandler= FITSError::defaultHandler);
00349
00350 PrimaryArray(FITSErrorHandler= FITSError::defaultHandler);
00351
00352
00353 virtual ~PrimaryArray();
00354
00355
00356
00357 double bscale() const { return bscale_x; }
00358 double bzero() const { return bzero_x; }
00359 char *bunit() const { return bunit_x; }
00360 Bool isablank() const { return isablank_x; }
00361 Int blank() const { return blank_x; }
00362 char *ctype(int n) const { return ctype_x[n]; }
00363 double crpix(int n) const { return crpix_x[n]; }
00364 double crota(int n) const { return crota_x[n]; }
00365 double crval(int n) const { return crval_x[n]; }
00366 double cdelt(int n) const { return cdelt_x[n]; }
00367 double datamax() const { return datamax_x; }
00368 double datamin() const { return datamin_x; }
00369 OFF_T nelements() const { return totsize; }
00370
00371
00372
00373
00374
00375
00376
00377
00378 double operator () (int, int, int, int, int) const;
00379 double operator () (int, int, int, int) const;
00380 double operator () (int, int, int) const;
00381 double operator () (int, int) const;
00382 double operator () (int) const;
00383
00384
00385
00386
00387
00388 TYPE & data(int, int, int, int, int);
00389 TYPE & data(int, int, int, int);
00390 TYPE & data(int, int, int);
00391 TYPE & data(int, int);
00392 TYPE & data(int);
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409 int store(const TYPE *source, FITS::FitsArrayOption = FITS::NoOpt);
00410 void copy(double *target, FITS::FitsArrayOption = FITS::NoOpt) const;
00411 void copy(float *target, FITS::FitsArrayOption = FITS::NoOpt) const;
00412 void move(TYPE *target, FITS::FitsArrayOption = FITS::NoOpt) const;
00413
00414
00415
00416
00417
00418 int store(const TYPE *source, int npixels);
00419 void copy(double *target, int npixels) const;
00420 void copy(float *target, int npixels) const;
00421 void move(TYPE *target, int npixels) const;
00422
00423
00424
00425 int write_priArr_hdr( FitsOutput &fout, int simple, int bitpix,
00426 int naxis, long naxes[], int extend );
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441 virtual int read();
00442 virtual int read( int );
00443 virtual int write(FitsOutput &);
00444 virtual OFF_T set_next(OFF_T);
00445
00446
00447
00448
00449
00450
00451
00452
00453 protected:
00454
00455 PrimaryArray(FitsInput &, FITS::HDUType,
00456 FITSErrorHandler errhandler = FITSError::defaultHandler);
00457
00458 PrimaryArray(FitsKeywordList &, FITS::HDUType,
00459 FITSErrorHandler errhandler = FITSError::defaultHandler);
00460
00461
00462 PrimaryArray(FITS::HDUType,
00463 FITSErrorHandler errhandler = FITSError::defaultHandler);
00464
00465
00466 double bscale_x;
00467 double bzero_x;
00468 char *bunit_x;
00469 Bool isablank_x;
00470 Int blank_x;
00471 char **ctype_x;
00472 double *crpix_x;
00473 double *crota_x;
00474 double *crval_x;
00475 double *cdelt_x;
00476 double datamax_x;
00477 double datamin_x;
00478 OFF_T totsize;
00479
00480 int *factor;
00481
00482
00483
00484 int offset(int, int) const;
00485 int offset(int, int, int) const;
00486 int offset(int, int, int, int) const;
00487 int offset(int, int, int, int, int) const;
00488
00489 OFF_T alloc_elems;
00490 OFF_T beg_elem;
00491 OFF_T end_elem;
00492
00493 TYPE *array;
00494
00495 void pa_assign();
00496 };
00497
00498 typedef PrimaryArray<unsigned char> BytePrimaryArray;
00499 typedef PrimaryArray<short> ShortPrimaryArray;
00500 typedef PrimaryArray<FitsLong> LongPrimaryArray;
00501 typedef PrimaryArray<float> FloatPrimaryArray;
00502 typedef PrimaryArray<double> DoublePrimaryArray;
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514 template <class TYPE>
00515 class ImageExtension : public PrimaryArray<TYPE> {
00516 public:
00517 typedef TYPE ElementType;
00518
00519 ImageExtension(FitsInput &,
00520 FITSErrorHandler errhandler = FITSError::defaultHandler);
00521 ImageExtension(FitsKeywordList &,
00522 FITSErrorHandler errhandler = FITSError::defaultHandler);
00523
00524 ImageExtension(FITSErrorHandler errhandler = FITSError::defaultHandler);
00525
00526 ~ImageExtension();
00527 char *xtension() { return xtension_x; }
00528 char *extname() { return extname_x; }
00529 Int extver() { return extver_x; }
00530 Int extlevel() { return extlevel_x; }
00531 Int pcount() { return pcount_x; }
00532 Int gcount() { return gcount_x; }
00533
00534 int write_imgExt_hdr( FitsOutput &fout,
00535 int bitpix, int naxis, long *naxes);
00536 protected:
00537 char *xtension_x;
00538 char *extname_x;
00539 Int extver_x;
00540 Int extlevel_x;
00541 Int pcount_x;
00542 Int gcount_x;
00543
00544 private:
00545 void ie_assign();
00546
00547
00548 protected:
00549 using PrimaryArray<TYPE>::assign;
00550 using PrimaryArray<TYPE>::errmsg;
00551 using PrimaryArray<TYPE>::init_data_unit;
00552 using PrimaryArray<TYPE>::pa_assign;
00553 using PrimaryArray<TYPE>::char_null;
00554 using PrimaryArray<TYPE>::kwlist_;
00555 using PrimaryArray<TYPE>::errfn;
00556 using PrimaryArray<TYPE>::hdu_type;
00557 using PrimaryArray<TYPE>::data_type;
00558 using PrimaryArray<TYPE>::fits_data_size;
00559 using PrimaryArray<TYPE>::fits_item_size;
00560 using PrimaryArray<TYPE>::array;
00561 using PrimaryArray<TYPE>::BADOPER;
00562 };
00563
00564 typedef ImageExtension<unsigned char> ByteImageExtension;
00565 typedef ImageExtension<short> ShortImageExtension;
00566 typedef ImageExtension<FitsLong> LongImageExtension;
00567 typedef ImageExtension<float> FloatImageExtension;
00568 typedef ImageExtension<double> DoubleImageExtension;
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593 template <class TYPE>
00594 class PrimaryGroup : public PrimaryArray<TYPE> {
00595 public:
00596 PrimaryGroup(FitsInput &,
00597 FITSErrorHandler errhandler = FITSError::defaultHandler);
00598 PrimaryGroup(FitsKeywordList &,
00599 FITSErrorHandler errhandler = FITSError::defaultHandler);
00600
00601 PrimaryGroup(FITSErrorHandler errhandler = FITSError::defaultHandler);
00602
00603 ~PrimaryGroup();
00604
00605
00606
00607 Int gcount() const { return gcount_x; }
00608 Int pcount() const { return pcount_x; }
00609 char *ptype(int n) const { return ptype_x[n]; }
00610 double pscal(int n) const { return pscal_x[n]; }
00611 double pzero(int n) const { return pzero_x[n]; }
00612
00613
00614 Int currgroup() const { return current_group; }
00615
00616 double parm(int);
00617 TYPE & rawparm(int);
00618
00619 void storeparm(const TYPE *source);
00620 void copyparm(double *target) const;
00621 void copyparm(float *target) const;
00622 void moveparm(TYPE *target) const;
00623
00624
00625
00626 int read();
00627 int write(FitsOutput &);
00628
00629
00630
00631 int write_priGrp_hdr( FitsOutput &fout, int simple, int bitpix,
00632 int naxis, long naxes[], long pcount, long gcount );
00633
00634
00635
00636
00637
00638 OFF_T set_next(OFF_T) { return 0; }
00639 int read(int) { return -1; }
00640
00641
00642 protected:
00643 Int pcount_x;
00644 Int gcount_x;
00645 char **ptype_x;
00646 double *pscal_x;
00647 double *pzero_x;
00648 TYPE *group_parm;
00649 Int current_group;
00650
00651 private:
00652 void pg_assign();
00653
00654
00655 protected:
00656 using PrimaryArray<TYPE>::assign;
00657 using PrimaryArray<TYPE>::errmsg;
00658 using PrimaryArray<TYPE>::init_data_unit;
00659 using PrimaryArray<TYPE>::pa_assign;
00660 using PrimaryArray<TYPE>::asgdbl;
00661 using PrimaryArray<TYPE>::nelements;
00662 using PrimaryArray<TYPE>::localitemsize;
00663 using PrimaryArray<TYPE>::fitsitemsize;
00664 using PrimaryArray<TYPE>::read_data;
00665 using PrimaryArray<TYPE>::write_data;
00666 using PrimaryArray<TYPE>::char_null;
00667 using PrimaryArray<TYPE>::kwlist_;
00668 using PrimaryArray<TYPE>::errfn;
00669 using PrimaryArray<TYPE>::err_status;
00670 using PrimaryArray<TYPE>::hdu_type;
00671 using PrimaryArray<TYPE>::data_type;
00672 using PrimaryArray<TYPE>::fits_data_size;
00673 using PrimaryArray<TYPE>::fits_item_size;
00674 using PrimaryArray<TYPE>::array;
00675 using PrimaryArray<TYPE>::totsize;
00676 using PrimaryArray<TYPE>::dimn;
00677 using PrimaryArray<TYPE>::no_dims;
00678 using PrimaryArray<TYPE>::factor;
00679 using PrimaryArray<TYPE>::ctype_x;
00680 using PrimaryArray<TYPE>::crpix_x;
00681 using PrimaryArray<TYPE>::crota_x;
00682 using PrimaryArray<TYPE>::crval_x;
00683 using PrimaryArray<TYPE>::cdelt_x;
00684 using PrimaryArray<TYPE>::BADOPER;
00685 using PrimaryArray<TYPE>::OK;
00686 using PrimaryArray<TYPE>::NOMEM;
00687 using PrimaryArray<TYPE>::BADIO;
00688 };
00689
00690 typedef PrimaryGroup<unsigned char> BytePrimaryGroup;
00691 typedef PrimaryGroup<short> ShortPrimaryGroup;
00692 typedef PrimaryGroup<FitsLong> LongPrimaryGroup;
00693 typedef PrimaryGroup<float> FloatPrimaryGroup;
00694 typedef PrimaryGroup<double> DoublePrimaryGroup;
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705 template <class TYPE>
00706 class PrimaryTable : public PrimaryArray<TYPE> {
00707 public:
00708 typedef TYPE ElementType;
00709
00710 PrimaryTable(FitsInput &,
00711 FITSErrorHandler errhandler = FITSError::defaultHandler);
00712 PrimaryTable(FitsKeywordList &,
00713 FITSErrorHandler errhandler = FITSError::defaultHandler);
00714
00715 PrimaryTable(FITSErrorHandler errhandler = FITSError::defaultHandler);
00716
00717 ~PrimaryTable();
00718
00719 int write_priTable_hdr( FitsOutput &fout,
00720 int bitpix, int naxis, long *naxes);
00721
00722 int read();
00723 int read(int) { return -1; }
00724 int write(FitsOutput &){ return -1; }
00725
00726 char* object() const { return object_x; }
00727 char* telescop() const { return telescop_x; }
00728 char* instrume() const { return instrume_x; }
00729 char* dateobs() const { return dateobs_x; }
00730 char* datemap() const { return datemap_x; }
00731 char* bunit() const { return bunit_x; }
00732 float bscal() const { return bscale_x; }
00733 float bzero() const { return bzero_x; }
00734 float equinox() const { return equinox_x; }
00735 float altrpix() const { return altrpix_x; }
00736
00737 protected:
00738 char* object_x;
00739 char* telescop_x;
00740 char* instrume_x;
00741 char* dateobs_x;
00742 char* datemap_x;
00743 Float bscale_x;
00744 Float bzero_x;
00745 char* bunit_x;
00746 Float equinox_x;
00747 Float altrpix_x;
00748
00749
00750 private:
00751 void pt_assign();
00752
00753
00754 protected:
00755 using PrimaryArray<TYPE>::assign;
00756 using PrimaryArray<TYPE>::errmsg;
00757 using PrimaryArray<TYPE>::init_data_unit;
00758 using PrimaryArray<TYPE>::pa_assign;
00759 using PrimaryArray<TYPE>::asgdbl;
00760 using PrimaryArray<TYPE>::nelements;
00761 using PrimaryArray<TYPE>::localitemsize;
00762 using PrimaryArray<TYPE>::fitsitemsize;
00763 using PrimaryArray<TYPE>::read_data;
00764 using PrimaryArray<TYPE>::write_data;
00765 using PrimaryArray<TYPE>::char_null;
00766 using PrimaryArray<TYPE>::kwlist_;
00767 using PrimaryArray<TYPE>::errfn;
00768 using PrimaryArray<TYPE>::err_status;
00769 using PrimaryArray<TYPE>::hdu_type;
00770 using PrimaryArray<TYPE>::data_type;
00771 using PrimaryArray<TYPE>::fits_data_size;
00772 using PrimaryArray<TYPE>::fits_item_size;
00773 using PrimaryArray<TYPE>::array;
00774 using PrimaryArray<TYPE>::totsize;
00775 using PrimaryArray<TYPE>::dimn;
00776 using PrimaryArray<TYPE>::no_dims;
00777 using PrimaryArray<TYPE>::factor;
00778 using PrimaryArray<TYPE>::ctype_x;
00779 using PrimaryArray<TYPE>::crpix_x;
00780 using PrimaryArray<TYPE>::crota_x;
00781 using PrimaryArray<TYPE>::crval_x;
00782 using PrimaryArray<TYPE>::cdelt_x;
00783 using PrimaryArray<TYPE>::BADOPER;
00784 using PrimaryArray<TYPE>::OK;
00785 using PrimaryArray<TYPE>::NOMEM;
00786 using PrimaryArray<TYPE>::BADIO;
00787 };
00788
00789 typedef PrimaryTable<unsigned char> BytePrimaryTable;
00790 typedef PrimaryTable<short> ShortPrimaryTable;
00791 typedef PrimaryTable<FitsLong> LongPrimaryTable;
00792 typedef PrimaryTable<float> FloatPrimaryTable;
00793 typedef PrimaryTable<double> DoublePrimaryTable;
00794
00795
00796
00797 class ExtensionHeaderDataUnit : public HeaderDataUnit {
00798 public:
00799 ExtensionHeaderDataUnit(FitsInput &,
00800 FITSErrorHandler errhandler = FITSError::defaultHandler);
00801 ExtensionHeaderDataUnit(FitsKeywordList &,
00802 FITSErrorHandler errhandler = FITSError::defaultHandler);
00803 ~ExtensionHeaderDataUnit();
00804 char *xtension() { return xtension_x; }
00805 char *extname() { return extname_x; }
00806 Int extver() { return extver_x; }
00807 Int extlevel() { return extlevel_x; }
00808 Int pcount() { return pcount_x; }
00809 Int gcount() { return gcount_x; }
00810
00811
00812 int read(char *addr, int nbytes) {
00813 return read_data(addr, Int(nbytes)); }
00814
00815 int write(FitsOutput &fout, char *addr, int nbytes) {
00816 return write_data(fout,addr,nbytes); }
00817
00818 protected:
00819 ExtensionHeaderDataUnit(FitsInput &, FITS::HDUType,
00820 FITSErrorHandler errhandler = FITSError::defaultHandler);
00821 ExtensionHeaderDataUnit(FitsKeywordList &, FITS::HDUType,
00822 FITSErrorHandler errhandler = FITSError::defaultHandler);
00823
00824 ExtensionHeaderDataUnit(FITS::HDUType,
00825 FITSErrorHandler errhandler = FITSError::defaultHandler);
00826
00827 char *xtension_x;
00828 char *extname_x;
00829 Int extver_x;
00830 Int extlevel_x;
00831 Int pcount_x;
00832 Int gcount_x;
00833
00834 private:
00835 void ex_assign();
00836 };
00837
00838
00839
00840 class FitsBase {
00841 friend class BinaryTableExtension;
00842 friend class AsciiTableExtension;
00843 public:
00844 FitsBase(const FITS::ValueType &t, int n) : no_elements(n),
00845 data_type(t) { }
00846 virtual ~FitsBase();
00847
00848 unsigned int nelements() const { return (unsigned int)no_elements; }
00849 virtual int fitsfieldsize() const = 0;
00850 virtual int localfieldsize() const = 0;
00851 virtual void *data() = 0;
00852 virtual int dims() const;
00853 virtual int dim(int n) const;
00854 virtual int *vdim();
00855 FITS::ValueType fieldtype() const { return data_type; }
00856
00857 static FitsBase *make(const FITS::ValueType &, int = 1);
00858 static FitsBase *make(const FITS::ValueType &, int, int *);
00859 static FitsBase *make(FitsBase &);
00860
00861 FitsBase & operator = (FitsBase &);
00862 virtual void show(std::ostream &) = 0;
00863
00864 protected:
00865 int no_elements;
00866 FITS::ValueType data_type;
00867 virtual void setaddr(void **) = 0;
00868 };
00869
00870 inline std::ostream & operator << (std::ostream &o, FitsBase &x) {
00871 x.show(o); return o;
00872 }
00873
00874
00875
00876
00877
00878
00879
00880
00881 template <class TYPE>
00882 class FitsField : public FitsBase {
00883 public:
00884 FitsField(int n = 1) :
00885 FitsBase(FITS::getfitstype(NoConvert<TYPE>()),n), field(0) { }
00886 ~FitsField();
00887
00888 TYPE & operator () () { return (*field)[0]; }
00889 TYPE & operator () (int i) { return (*field)[i]; }
00890 FitsField<TYPE> & operator = (const TYPE &x) {
00891 (*field)[0] = x; return *this; }
00892
00893 int fitsfieldsize() const;
00894 int localfieldsize() const;
00895
00896 void *data();
00897
00898 void show(std::ostream &);
00899
00900 protected:
00901 TYPE **field;
00902 void setaddr(void **addr);
00903 };
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925 template <> class FitsField<FitsBit> : public FitsBase {
00926 public:
00927 FitsField(int n = 1);
00928 ~FitsField();
00929
00930 FitsField<FitsBit> & operator () () { byte_offset = 0; mask = 0200;
00931 return *this; }
00932
00933 FitsField<FitsBit> & operator () (unsigned i) {
00934 byte_offset = i / 8; mask = 0200 >> (i % 8); return *this; }
00935
00936 FitsField<FitsBit> & operator = (unsigned i) {
00937 (*field)[byte_offset] =
00938 (i == 0 ? ((*field)[byte_offset] & ~mask) :
00939 ((*field)[byte_offset] | mask)); return *this; }
00940
00941 int fitsfieldsize() const;
00942 int localfieldsize() const;
00943
00944 operator int() { return (((*field)[byte_offset] & mask) != 0); }
00945
00946 void *data();
00947
00948 void show(std::ostream &);
00949
00950 protected:
00951 FitsBit **field;
00952 unsigned char mask;
00953 int byte_offset;
00954 void setaddr(void **addr);
00955 };
00956
00957 typedef FitsField<FitsLogical> LogicalFitsField;
00958 typedef FitsField<FitsBit> BitFitsField;
00959 typedef FitsField<char> CharFitsField;
00960 typedef FitsField<unsigned char> ByteFitsField;
00961 typedef FitsField<short> ShortFitsField;
00962 typedef FitsField<FitsLong> LongFitsField;
00963 typedef FitsField<float> FloatFitsField;
00964 typedef FitsField<double> DoubleFitsField;
00965 typedef FitsField<Complex> ComplexFitsField;
00966 typedef FitsField<IComplex> IComplexFitsField;
00967 typedef FitsField<DComplex> DComplexFitsField;
00968 typedef FitsField<FitsVADesc> VADescFitsField;
00969
00970
00971 template <class TYPE>
00972 class FitsArray : public FitsField<TYPE> {
00973 public:
00974 FitsArray(int, const int *);
00975 ~FitsArray();
00976 TYPE & operator () (int d0, int d1);
00977 TYPE & operator () (int, int, int);
00978 TYPE & operator () (int, int, int, int);
00979 TYPE & operator () (int, int, int, int, int);
00980 int dims() const;
00981 int dim(int n) const;
00982 int *vdim();
00983 protected:
00984 int no_dims;
00985 int *dimn;
00986 int *factor;
00987
00988
00989 protected:
00990 using FitsField<TYPE>::no_elements;
00991 using FitsField<TYPE>::field;
00992 };
00993
00994
00995
00996
00997
00998
00999
01000 template <> class FitsArray<FitsBit> : public FitsField<FitsBit> {
01001 public:
01002 FitsArray(int, const int *);
01003 ~FitsArray();
01004 FitsField<FitsBit> & operator () (int d0, int d1);
01005 FitsField<FitsBit> & operator () (int, int, int);
01006 FitsField<FitsBit> & operator () (int, int, int, int);
01007 FitsField<FitsBit> & operator () (int, int, int, int, int);
01008
01009
01010
01011 int dims() const;
01012 int dim(int n) const;
01013 int *vdim();
01014 protected:
01015 int no_dims;
01016 int *dimn;
01017 int *factor;
01018 };
01019
01020 typedef FitsArray<FitsLogical> LogicalFitsArray;
01021 typedef FitsArray<FitsBit> BitFitsArray;
01022 typedef FitsArray<char> CharFitsArray;
01023 typedef FitsArray<unsigned char> ByteFitsArray;
01024 typedef FitsArray<short> ShortFitsArray;
01025 typedef FitsArray<FitsLong> LongFitsArray;
01026 typedef FitsArray<float> FloatFitsArray;
01027 typedef FitsArray<double> DoubleFitsArray;
01028 typedef FitsArray<Complex> ComplexFitsArray;
01029 typedef FitsArray<IComplex> IComplexFitsArray;
01030 typedef FitsArray<DComplex> DComplexFitsArray;
01031 typedef FitsArray<FitsVADesc> VADescFitsArray;
01032
01033
01034
01035 class BinaryTableExtension : public ExtensionHeaderDataUnit {
01036 public:
01037 BinaryTableExtension(FitsInput &,
01038 FITSErrorHandler errhandler = FITSError::defaultHandler);
01039
01040 BinaryTableExtension(FitsKeywordList &,
01041 FITSErrorHandler errhandler = FITSError::defaultHandler);
01042
01043 BinaryTableExtension( FITSErrorHandler errhandler = FITSError::defaultHandler);
01044
01045 virtual ~BinaryTableExtension();
01046
01047
01048
01049 Int nrows() const { return dim(1); }
01050 Int ncols() const { return tfields_x; }
01051 uInt rowsize() const { return fitsrowsize; }
01052 Int tfields() const { return tfields_x; }
01053 const char *tform(int n) const { return tform_x[n]; }
01054 double tscal(int n) const { return tscal_x[n]; }
01055 double tzero(int n) const { return tzero_x[n]; }
01056 Bool isatnull(int n) const { return isatnull_x[n]; }
01057 Int tnull(int n) const { return tnull_x[n]; }
01058 const char *ttype(int n) const { return ttype_x[n]; }
01059 const char *tunit(int n) const { return tunit_x[n]; }
01060 const char *tdisp(int n) const { return tdisp_x[n]; }
01061 const char *tdim(int n) const { return tdim_x[n]; }
01062 const char *ctype(int n) const { return ctype_x[n]; }
01063 double crpix(int n) const { return crpix_x[n]; }
01064 double crota(int n) const { return crota_x[n]; }
01065 double crval(int n) const { return crval_x[n]; }
01066 double cdelt(int n) const { return cdelt_x[n]; }
01067 Int theap() const { return theap_x; }
01068 const char *author() const { return author_x; }
01069 const char *referenc() const { return referenc_x; }
01070
01071
01072
01073 int bind(int, FitsBase &);
01074
01075
01076
01077 BinaryTableExtension & operator ++ ();
01078 BinaryTableExtension & operator -- ();
01079 BinaryTableExtension & operator () (int);
01080
01081
01082
01083 int read();
01084
01085 int read(int);
01086
01087 int set_next(int);
01088
01089 int write(FitsOutput &);
01090
01091 int write_binTbl_hdr(FitsOutput &, long, int, const char**,
01092 const char**, const char**, const char*, long );
01093
01094
01095 FitsBase &field(int i) const { return *fld[i]; }
01096
01097 Int currrow() const { return curr_row; }
01098
01099
01100
01101 protected:
01102 BinaryTableExtension(FitsInput &, FITS::HDUType,
01103 FITSErrorHandler errhandler = FITSError::defaultHandler);
01104 BinaryTableExtension(FitsKeywordList &, FITS::HDUType,
01105 FITSErrorHandler errhandler = FITSError::defaultHandler);
01106 BinaryTableExtension(FITS::HDUType,
01107 FITSErrorHandler errhandler = FITSError::defaultHandler);
01108
01109 Int tfields_x;
01110 char **tform_x;
01111 double *tscal_x;
01112 double *tzero_x;
01113 Bool *isatnull_x;
01114 Int *tnull_x;
01115 char **ttype_x;
01116 char **tunit_x;
01117 char **tdisp_x;
01118 char **tdim_x;
01119 char **ctype_x;
01120 double *crpix_x;
01121 double *crota_x;
01122 double *crval_x;
01123 double *cdelt_x;
01124 Int nAxis;
01125 Int theap_x;
01126 char *author_x;
01127 char *referenc_x;
01128
01129
01130
01131 virtual int readrow();
01132 virtual int writerow(FitsOutput &);
01133
01134 unsigned char *fitsrow;
01135 uInt *fits_offset;
01136 uInt fitsrowsize;
01137 Bool isoptimum;
01138
01139
01140 void set_fitsrow(Int);
01141
01142 unsigned char *table;
01143 uInt tablerowsize;
01144 uInt alloc_row;
01145 Int beg_row;
01146 Int end_row;
01147 Int curr_row;
01148 FitsBase **fld;
01149 uInt *table_offset;
01150
01151 void **data_addr;
01152
01153 private:
01154 void bt_assign();
01155 };
01156
01157
01158
01159
01160 class AsciiTableExtension : public BinaryTableExtension {
01161 public:
01162 AsciiTableExtension(FitsInput &,
01163 FITSErrorHandler errhandler = FITSError::defaultHandler);
01164 AsciiTableExtension(FitsKeywordList &,
01165 FITSErrorHandler errhandler = FITSError::defaultHandler);
01166 AsciiTableExtension(FITSErrorHandler errhandler = FITSError::defaultHandler);
01167
01168 ~AsciiTableExtension();
01169
01170
01171
01172 Int tbcol(int n) { return tbcol_x[n]; }
01173
01174 char *tnull(int n) { return tnulla_x[n]; }
01175
01176 int write_ascTbl_hdr( FitsOutput &, long,
01177 long, int, const char **, long *,
01178 const char **, const char **, const char *e);
01179
01180 protected:
01181 Int *tbcol_x;
01182 char **tnulla_x;
01183 uInt *fits_width;
01184 char **format;
01185
01186
01187
01188 int readrow();
01189 int writerow(FitsOutput &);
01190
01191
01192 private:
01193 void at_assign();
01194 };
01195
01196
01197 }
01198
01199 #ifndef CASACORE_NO_AUTO_TEMPLATES
01200 #include <casacore/fits/FITS/hdu.tcc>
01201 #endif //# CASACORE_NO_AUTO_TEMPLATES
01202 # endif