Changeset 1218 in Sophya for trunk/SophyaExt/FitsIOServer/fitsfile.h
- Timestamp:
- Oct 3, 2000, 2:14:14 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/FitsIOServer/fitsfile.h
r1209 r1218 10 10 #define LEN_KEYWORD 9 11 11 12 // classes for saving/loading SOPHYA objects to/from FITS files... 13 // Guy le Meur (september 2000) 14 15 12 16 namespace SOPHYA { 13 17 14 struct BnTblLine 15 { 16 BnTblLine() {} 17 void setFormat(int dc, int fc, int ic, int cc, vector<string> names) 18 { 19 int nbcols = dc + fc + ic + cc; 20 int maxName = names.size(); 21 if (nbcols != maxName) 22 { 23 cout << " WARNING: BnTblLine:: length of vector of column names not equal to total number of columns" << endl; 24 maxName = nbcols < maxName ? nbcols : maxName; 25 } 26 ColName_ = vector<string>(nbcols); 27 for (int k=0; k < maxName; k++) ColName_[k] = names[k]; 28 if (dc >0) ddata_ = vector<double>(dc); 29 if (fc >0) fdata_ = vector<float>(fc); 30 if (ic >0) idata_ = vector<int>(fc); 31 if (cc >0) cdata_ = vector<string>(fc); 32 } 33 34 bool sameFormat(const BnTblLine& btl) const 35 { 36 if (btl.ddata_.size() == ddata_.size() && btl.fdata_.size() == fdata_.size() && btl.idata_.size() == idata_.size() && btl.cdata_.size() == cdata_.size()) return true; 37 else return false; 38 } 39 40 void Print() 41 { 42 int k; 43 cout << " ********* ligne ************* " << endl; 44 cout << " *** noms de variables " << endl; 45 for (k=0; k < ColName_.size(); k++) cout << ColName_[k] << " "; 46 cout << endl; 47 cout << " *** variables doubles " << endl; 48 for (k=0; k < ddata_.size(); k++) cout << ddata_[k] << " "; 49 cout << endl; 50 cout << " *** variables float " << endl; 51 for (k=0; k < fdata_.size(); k++) cout << fdata_[k] << " "; 52 cout << endl; 53 cout << " *** variables int " << endl; 54 for (k=0; k < idata_.size(); k++) cout << idata_[k] << " "; 55 cout << endl; 56 cout << " *** variables string " << endl; 57 for (k=0; k < cdata_.size(); k++) cout << cdata_[k] << " "; 58 cout << endl; 59 cout << " ***************************** " << endl; 60 } 61 vector<double> ddata_; 62 vector<float> fdata_; 63 vector<int> idata_; 64 vector<string> cdata_; 65 vector<string> ColName_; 66 67 }; 68 69 class FitsFile; 70 class FitsInFile; 71 class FitsOutFile; 72 enum WriteMode {append, clear, unknown}; 73 18 struct BnTblLine; 19 class FitsFile; 20 class FitsInFile; 21 class FitsOutFile; 22 enum WriteMode {append, clear, unknown}; 23 74 24 75 25 // 76 26 //! Class for managing Interface for SOPHYA objects to FITS Format Files (uses cfitsio lib) 77 27 78 /*! 79 The class structure is analogous to Sophya-PPersist system : 80 Each SOPHYA object XXX is associated with a object of class FITS_XXX 81 (inheriting from FitsFileHandler), to which input/output operations with FITS 82 files are delegated (through a class Hierarchy : FitsFile (virtual), 83 FitsInFile, FitsOutFile) . A typical example of use is the following : 84 85 \verbatim 86 int m=... ; 87 SphereHEALPix<r_8> sphere1(m); // definition of the SOPHYA object 88 .... fill the sphere .... 89 90 FITS_SphereHEALPix<r_8> fits_sph1(sphere1); 91 // delegated object 92 fits_sph.Write("myfile.fits"); // writing on FITS file 93 94 FITS_SphereHEALPix<r_8> fits_sph2("myfile.fits"); 95 // load a delegated object 96 // from FITS file 97 SphereHEALPix<r_8> sphere2=(SphereHEALPix<r_8>)fits_sph2; 98 // casting the delegated object 99 // into a SOPHYA object 100 \endverbatim 101 102 */ 103 104 class FitsIOHandler { 105 106 107 public: 108 109 virtual ~FitsIOHandler() {} 110 /*! 111 this method is called from inherited objects : 112 113 opens a file 'flnm' 114 115 gets parameters in extension-header (hdunum) 116 117 calls the method 'ReadFromFits' from the inherited object 118 119 120 */ 121 void Read(char flnm[],int hdunum= 0); 122 /*! 123 this method is called from inherited objects : 124 125 for writing a new object in a new fits-extension : 126 127 ??? 128 129 at the end of 130 131 the existing file (flnm), if OldFile=true. 132 133 If OldFile=false, an exception occurs 28 class FitsIOHandler { 29 30 31 public: 32 33 virtual ~FitsIOHandler() {} 34 void Read(char flnm[],int hdunum= 0); 35 void Write(char flnm[]) ; 36 void Read(FitsInFile& ifts, int hdunum=0); 37 void Write(FitsOutFile& ofts) ; 38 39 40 protected: 41 42 virtual void ReadFromFits(FitsInFile& is)=0; 43 virtual void WriteToFits(FitsOutFile& os) =0; 44 45 friend class FitsInFile; 46 friend class FitsOutFile; 47 }; 48 49 50 //! Class (virtual) for managing FITS format files 51 class FitsFile { 52 53 public: 54 55 FitsFile() { InitNull(); }; 56 virtual ~FitsFile(); 57 static string GetErrStatus(int status); 58 inline int statusF() const { return fits_status_;} 134 59 135 By convention, primary header does not contain fits-image data : i.e. 136 all data are fits-extensions. The first relevant header will have hdunum=2. 137 For switching off this convention use the method : 138 139 firstImageOnPrimaryHeader() (see below) 140 141 In that case do not forget to precise hdunum=1 when reading data on primary header. 142 143 calls the method 'WriteToFits' from the inherited object 144 145 */ 146 void Write(char flnm[]) ; 147 148 /*! 149 Read the data on extension hdunum (or primary header, if hdunum=1) from FitsInFIle. With default value for hdunum, one reads the next extension, with respect to the current position. 150 */ 151 void Read(FitsInFile& ifts, int hdunum=0); 152 void Write(FitsOutFile& ofts) ; 153 154 155 protected: 156 virtual void ReadFromFits(FitsInFile& is)=0; 157 virtual void WriteToFits(FitsOutFile& os) =0; 158 friend class FitsInFile; 159 friend class FitsOutFile; 160 private : 161 }; 162 163 164 165 class FitsFile 166 { 167 168 public: 169 170 FitsFile() 171 { 172 InitNull(); 173 }; 174 virtual ~FitsFile(); 175 176 static string GetErrStatus(int status); 177 178 179 180 181 inline int statusF() const { return fits_status_;} 182 183 184 protected: 185 186 void ResetStatus(int& status) ; 60 61 protected: 62 63 void ResetStatus(int& status) ; 187 64 static void printerror(int&) ; 188 65 static void printerror(int&,char* texte) ; 189 inline void InitNull() {fptr_ = NULL; hdutype_= 0; hdunum_ = 1;66 inline void InitNull() {fptr_ = NULL; hdutype_= 0; hdunum_ = 1; 190 67 fits_status_ = 0;} 191 68 192 //! pointer to the FITS file, defined in fitsio.h 193 fitsfile *fptr_; 194 195 //! image or bintable ? 196 int hdutype_; 197 198 //! index of header to be read/written 199 int hdunum_; 200 201 //! last status returned by fitsio library. updated only by several methods 202 int fits_status_; 203 204 205 }; 206 69 fitsfile *fptr_; /**< pointer to the FITS file, defined in fitsio.h */ 70 int hdutype_; /**< image or bintable ? */ 71 int hdunum_; /**< index of header to be read/written */ 72 int fits_status_; /**< last status returned by fitsio library. updated only by several methods */ 73 74 }; 75 76 //! Class for saving SOPHYA objects on FITS Format Files (uses cfitsio lib) 207 77 208 78 class FitsInFile : public FitsFile { … … 210 80 public: 211 81 FitsInFile(); 212 // FitsInFile(char flnm[], int hdunum=0);213 82 FitsInFile(char flnm[]); 214 83 ~FitsInFile() { ; }; 215 84 216 217 ////////////////////////////////////////////////////////// 218 // methods with general purpose 219 /////////////////////////////////////// 220 221 222 223 static int NbBlocks(char flnm[]); 224 static void GetBlockType(char flnm[], int hdunum, string& typeOfExtension, int& naxis, vector<int>& naxisn, string& dataType, DVList& dvl ); 225 226 227 228 // void ReadFInit(char flnm[],int hdunum=0); 229 void ReadFInit(int hdunum); 85 static int NbBlocks(char flnm[]); 86 static void GetBlockType(char flnm[], int hdunum, string& typeOfExtension, int& naxis, vector<int>& naxisn, string& dataType, DVList& dvl ); 87 void ReadFInit(int hdunum); 230 88 231 /*! return a reference on a DVList containing the keywords from FITS file 232 */ 233 inline const DVList& DVListFromFits() const { return dvl_;} 234 235 /* get the keywords of primary header in a DVList */ 236 DVList DVListFromPrimaryHeader() const; 237 238 void moveToFollowingHeader(); 89 /*! \return a reference on a DVList containing the keywords from FITS file */ 90 inline const DVList& DVListFromFits() const { return dvl_;} 91 92 DVList DVListFromPrimaryHeader() const; 93 void moveToFollowingHeader(); 94 95 239 96 240 97 … … 242 99 /////// methods for managing extensions //////////////// 243 100 ////////////////////////////////////////////////////////// 244 245 101 246 102 … … 250 106 251 107 252 /*! return true if the current header corresponds to a FITS image extension */ 108 109 /*! \return true if the current header corresponds to a FITS image extension */ 253 110 inline bool IsFitsImage() const { return (hdutype_ == IMAGE_HDU);} 254 111 255 112 256 113 257 /*! number of dimensions of an image extension : NAXIS parameter (in FITS notations) 258 */ 114 /*! \return number of dimensions of an image extension : NAXIS parameter (in FITS notations) */ 259 115 inline int nbDimOfImage() const {return naxis_;} 260 /*! a reference on a vector containing sizes of the NAXIS dimensions : NAXIS1, NAXIS2, NAXIS3 wtc. 261 */116 117 /*! \return a reference on a vector containing sizes of the NAXIS dimensions : NAXIS1, NAXIS2, NAXIS3 etc. */ 262 118 inline const vector<int>& dimOfImageAxes() const { return naxisn_;} 263 /*! 264 total number of data in the current IMAGE extension 265 */119 120 121 /*! \return total number of data in the current IMAGE extension */ 266 122 inline int nbOfImageData() const { return nbData_; } 267 123 … … 275 131 276 132 277 /*! return true if the current header corresponds to a FITS ASCII or BINTABLE extension */133 /*! \return true if the current header corresponds to a FITS ASCII or BINTABLE extension */ 278 134 inline bool IsFitsTable() const {return (hdutype_ == ASCII_TBL || hdutype_ == BINARY_TBL);} 279 135 280 136 281 static void GetBinTabParameters(fitsfile* fileptr, int& nbcols, int& nrows,137 static void GetBinTabParameters(fitsfile* fileptr, int& nbcols, int& nrows, 282 138 vector<int>& repeat, 283 139 vector<string>& noms, 284 140 vector<char>& types, 285 141 vector<int>& taille_des_chaines); 286 287 288 289 /*! return a character denoting data type of column number 'nocol' in a BINTABLE : 290 291 D : double 292 293 E : float 294 295 I : integer 296 297 S : character string 298 299 */ 300 char ColTypeFromFits(int nocol) const; 301 /*! name of the column number 'nocol' of the current BINTABLE extension 302 */ 303 string ColNameFromFits(int nocol) const; 304 305 /*! number of characters of each data for the column number 'nocol' (if char* typed) of the current BINTABLE extension 306 */ 307 int ColStringLengthFromFits(int nocol) const; 308 309 310 311 /*! 312 Get the NoLine-th 'line' from the current BINTABLE extension on FITS file, 313 */ 314 void GetBinTabLine(int NoLine, double* ddata, float* fdata, int* idata, char 142 char ColTypeFromFits(int nocol) const; 143 string ColNameFromFits(int nocol) const; 144 int ColStringLengthFromFits(int nocol) const; 145 void GetBinTabLine(int NoLine, double* ddata, float* fdata, int* idata, char 315 146 ** cdata) ; 316 /*! 317 Get the NoLine-th 'line' from the current BINTABLE extension on FITS file, 318 */ 319 void GetBinTabLine(long NoLine, BnTblLine& ligne) ; 320 321 /*! 322 Get the NoLine-th 'line' from the current BINTABLE extension on FITS file, 323 */ 324 void GetBinTabLine(int NoLine, float* fdata) ; 325 326 /*! 327 fill the array 'valeurs' with double data from the current BINTABLE extension on FITS file, from column number 'NoCol' 328 329 \param <nentries> number of data to be read 330 */ 331 void GetBinTabFCol(double* valeurs, int nentries, int NoCol) const; 332 333 /*! same as previous method with float data */ 334 void GetBinTabFCol(float* valeurs, int nentries, int NoCol) const; 335 /*! same as previous method with int data */ 336 void GetBinTabFCol(int* valeurs, int nentries, int NoCol) const; 337 /*! same as previous method with char* data */ 338 void GetBinTabFCol(char** valeurs,int nentries, int NoCol) const; 339 // Write elements into the FITS data array 147 void GetBinTabLine(long NoLine, BnTblLine& ligne) ; 148 void GetBinTabLine(int NoLine, float* fdata) ; 149 void GetBinTabFCol(double* valeurs, int nentries, int NoCol) const; 150 void GetBinTabFCol(float* valeurs, int nentries, int NoCol) const; 151 void GetBinTabFCol(int* valeurs, int nentries, int NoCol) const; 152 void GetBinTabFCol(char** valeurs,int nentries, int NoCol) const; 340 153 341 154 ///////////////////////////////////////////////////////////// … … 343 156 //////////////////////////////////////////////////////// 344 157 345 /*! return number of columns (return 1 if IMAGE) */346 158 int NbColsFromFits() const; 347 /*! number of data in the current IMAGE extension on FITS file, or number348 of data of column number 'nocol' of the current BINTABLE extension349 */350 159 int NentriesFromFits(int nocol) const; 351 160 352 161 353 /*!354 fill the array 'map' with double data from the current extension on FITS file.355 If the extension is BINTABLE, the first column is provided.356 357 \param <nentries> number of data to be read358 */359 162 void GetSingleColumn(double* map, int nentries) const; 360 163 361 /*! same as above with float data */362 164 void GetSingleColumn(float* map, int nentries) const; 363 165 364 /*! same as above with int data */365 166 void GetSingleColumn(int* map, int nentries) const; 366 167 … … 371 172 static void GetImageParameters (fitsfile* fileptr,int& bitpix,int& naxis,vector<int>& naxisn); 372 173 373 374 375 376 //! fits-Image parameter 377 int bitpix_; 378 379 //! fits-Image parameter 380 int naxis_; 381 382 //! fits-Image parameters : sizes of dimensions 383 vector<int> naxisn_; 384 385 //! fits-Image parameter: number of data 386 int nbData_; 387 388 //! Bintable parameter 389 int nrows_; 390 391 //! Bintable parameter 392 vector<int> repeat_; 393 394 //! Bintable parameter 395 int nbcols_; 396 397 //! Bintable parameter: column names 398 vector<string> noms_; 399 400 //! Bintable parameters: types of columns (D: double, E: float, I: integers, A: char*) 401 vector<char> types_; 402 403 //! Bintable parameters: length of the char* variables 404 vector<int> taille_des_chaines_; 405 406 //! DVList for transferring keywords 407 DVList dvl_; 408 409 410 }; 411 174 int bitpix_; /**< fits-Image parameter */ 175 int naxis_; /**< fits-Image parameter */ 176 vector<int> naxisn_; /**< fits-Image parameters : sizes of dimensions */ 177 int nbData_; /*< fits-Image parameter: number of data */ 178 int nrows_; /**< Bintable parameter */ 179 vector<int> repeat_; /**< Bintable parameter */ 180 int nbcols_; /**< Bintable parameter */ 181 vector<string> noms_; /**< Bintable parameter: column names */ 182 vector<char> types_; /**< Bintable parameters: types of columns (D: double, E: float, I: integers, A: char*) */ 183 DVList dvl_; /**< DVList for transferring keywords */ 184 vector<int> taille_des_chaines_; /**< Bintable parameters: length of the char* variables */ 185 186 }; 187 188 //! Class for loading SOPHYA objects from FITS Format Files (uses cfitsio lib) 412 189 413 190 class FitsOutFile : public FitsFile { … … 417 194 418 195 FitsOutFile(); 419 /*!420 \param <WriteMode> enum , WriteMode = clear -> if alreadyy exists, the file will be overwritten (else created) ; WriteMode = append -> further objects will be appended to the file if it exists (else : file created). WriteMode = unknown -> file created if does not exist, else : exception. (the last situation is the default)421 422 */423 196 FitsOutFile(char flnm[], WriteMode wrm = unknown ); 424 197 ~FitsOutFile() { ;}; … … 437 210 438 211 inline void firstImageOnPrimaryHeader() {imageOnPrimary_=true;} 439 440 /*! create an IMAGE header on FITS file. 441 \param <type> type of data (see method ColTypeFromFits) 442 \param <nbdim> number of dimensions : 1D, 2D, 3D etc. = NAXIS 443 \param <naxisn> array containind sizes of the different dimensions 444 */ 445 void makeHeaderImageOnFits(char type, int nbdim, int* naxisn, DVList &dvl) ; 446 447 448 /*! write double data from array 'map'on an IMAGE extension 449 \param <nbData> number of data to be written 450 451 */ 452 void PutImageToFits( int nbData, double* map) const; 453 454 /*! same as previous method with float data */ 455 void PutImageToFits(int nbData, float* map ) const; 456 457 /*! same as previous method with int data */ 458 void PutImageToFits(int nbData, int* map) const; 212 void makeHeaderImageOnFits(char type, int nbdim, int* naxisn, DVList &dvl) ; 213 void PutImageToFits( int nbData, double* map) const; 214 void PutImageToFits(int nbData, float* map ) const; 215 void PutImageToFits(int nbData, int* map) const; 459 216 460 217 … … 466 223 467 224 468 /*! create an BINTABLE header on FITS file.469 \param <fieldType> array conta470 ining characters denoting types of the different column (see method ColTypeFromFits)471 \param <Noms> array of the names of columns472 \param <nentries> number of data of each column473 \param <tfields> number of columns474 \param <dvl> a SOPHYA DVList containing keywords to be appended475 \param <extname> keyword EXTNAME for FITS file476 \param <taille_des_chaines> vector containing the number of characters of data for each char* typed column, with order of appearance in 'fieldType'477 */478 225 void makeHeaderBntblOnFits ( string fieldType, vector<string> Noms, int nentries, int tfields, DVList &dvl, string extname, vector<int> taille_des_chaines) ; 479 480 /*! write double data from array 'donnees ' on column number 'nocol' of a BINTABLE extension. 481 \param <nentries> number of data to be written 482 483 */ 484 void PutColToFits(int nocol, int nentries, double* donnees) const; 485 486 /*! same as previous method with float data */ 487 void PutColToFits(int nocol, int nentries, float* donnees) const; 488 489 /*! same as previous method with int data */ 490 void PutColToFits(int nocol, int nentries, int* donnees) const; 491 492 /*! same as previous method with char* data */ 493 void PutColToFits(int nocol, int nentries, char** donnees) const; 494 495 void PutBinTabLine(long NoLine, BnTblLine& ligne) const; 226 void PutColToFits(int nocol, int nentries, double* donnees) const; 227 void PutColToFits(int nocol, int nentries, float* donnees) const; 228 void PutColToFits(int nocol, int nentries, int* donnees) const; 229 void PutColToFits(int nocol, int nentries, char** donnees) const; 230 void PutBinTabLine(long NoLine, BnTblLine& ligne) const; 496 231 497 232 … … 501 236 502 237 503 /* Put keywords from a DVList into the primary header of the fits-file */504 238 void DVListIntoPrimaryHeader(DVList& dvl) const; 505 239 … … 515 249 }; 516 250 251 struct BnTblLine 252 { 253 BnTblLine() {} 254 void setFormat(int dc, int fc, int ic, int cc, vector<string> names); 255 bool sameFormat(const BnTblLine& btl) const; 256 257 void Print(); 258 259 vector<double> ddata_; 260 vector<float> fdata_; 261 vector<int> idata_; 262 vector<string> cdata_; 263 vector<string> ColName_; 264 265 }; 517 266 518 267
Note:
See TracChangeset
for help on using the changeset viewer.