From 691e8c6b3d8726ef2e8f735a26119d833551f285 Mon Sep 17 00:00:00 2001 From: ansari <> Date: Wed, 8 Nov 2000 10:02:58 +0000 Subject: [PATCH] classe FITS_AutoReader --- FitsIOServer/fitsbntbllineRW.cc | 13 +- FitsIOServer/fitsbntbllineRW.h | 4 +- FitsIOServer/fitsfile.cc | 210 +++++++++++++++++------------- FitsIOServer/fitsfile.h | 19 +-- FitsIOServer/fitslocalmap.cc | 3 + FitsIOServer/fitsntuple.cc | 12 +- FitsIOServer/fitsspherehealpix.cc | 5 +- FitsIOServer/fitsspherehealpix.h | 1 - FitsIOServer/fitstarray.cc | 7 +- FitsIOServer/fitsxntuple.cc | 22 ++-- 10 files changed, 173 insertions(+), 123 deletions(-) diff --git a/FitsIOServer/fitsbntbllineRW.cc b/FitsIOServer/fitsbntbllineRW.cc index f8731ed..252d31b 100644 --- a/FitsIOServer/fitsbntbllineRW.cc +++ b/FitsIOServer/fitsbntbllineRW.cc @@ -20,7 +20,7 @@ FITS_BntblLineReader::FITS_BntblLineReader(char inputfile[],int hdunum) { InitNull(); inFits_ = new FitsInFile (inputfile); - inFits_->ReadFInit(hdunum); + inFits_->ReadHeader(hdunum); // if (!fn->IsFitsTable()) if (!inFits_->IsFitsTable()) @@ -51,12 +51,11 @@ FITS_BntblLineReader::FITS_BntblLineReader(char inputfile[],int hdunum) vector<int> SfitsCol; for (k=0; k<nbcols;k++) { - // char ss= fn->ColTypeFromFits(k); - char ss= inFits_->ColTypeFromFits(k); - if (ss == 'D') DfitsCol.push_back(k); - else if (ss == 'E') FfitsCol.push_back(k); - else if (ss == 'I') IfitsCol.push_back(k); - else if (ss == 'S') SfitsCol.push_back(k); + FitsFile::FitsDataType ss= inFits_->ColTypeFromFits(k); + if (ss == FitsFile::FitsDataType_double) DfitsCol.push_back(k); + else if (ss == FitsFile::FitsDataType_float) FfitsCol.push_back(k); + else if (ss == FitsFile::FitsDataType_int) IfitsCol.push_back(k); + else if (ss == FitsFile::FitsDataType_char) SfitsCol.push_back(k); else { cout << " FITS_XNTuple: colonne fits " << k << " type= " << ss << endl; throw IOExc("type de champ inconnu"); diff --git a/FitsIOServer/fitsbntbllineRW.h b/FitsIOServer/fitsbntbllineRW.h index c3627a3..906896e 100644 --- a/FitsIOServer/fitsbntbllineRW.h +++ b/FitsIOServer/fitsbntbllineRW.h @@ -47,8 +47,8 @@ inline void InitNull() // attributs de classe FitsInFile* inFits_; - long nextLineToBeRead_; - BnTblLine ligne_; + long nextLineToBeRead_; + BnTblLine ligne_; }; diff --git a/FitsIOServer/fitsfile.cc b/FitsIOServer/fitsfile.cc index 767a469..f3d1919 100644 --- a/FitsIOServer/fitsfile.cc +++ b/FitsIOServer/fitsfile.cc @@ -103,7 +103,7 @@ Read the data on extension hdunum (or primary header, if hdunum=1) from FitsInFI */ void FitsIOHandler::Read(FitsInFile& is, int hdunum) { - is.ReadFInit(hdunum); + is.ReadHeader(hdunum); ReadFromFits(is); } @@ -223,8 +223,7 @@ FitsInFile::FitsInFile(const char * flnm) void FitsInFile::InitNull() { - - bitpix_ = 0; + imageDataType_ = FitsDataType_NULL; naxis_ = 0; nbData_ = 0; nrows_ = 0; @@ -235,7 +234,6 @@ void FitsInFile::InitNull() taille_des_chaines_.clear(); dvl_.Clear(); - } ////////////////////////////////////////////////////////// @@ -267,28 +265,14 @@ void FitsInFile::GetBlockType(char flnm[], int hdunum, FitsExtensionType& typeOf if(hdutype == IMAGE_HDU) { typeOfExtension = FitsExtensionType_IMAGE; - int bitpix; - GetImageParameters (fileptr, bitpix, naxis, naxisn); - if(bitpix == DOUBLE_IMG) dataType = FitsDataType_double; - else - if(bitpix == FLOAT_IMG) dataType = FitsDataType_float; - else - if(bitpix == LONG_IMG || bitpix == SHORT_IMG ) dataType = FitsDataType_int; - else - if (bitpix == BYTE_IMG) dataType = FitsDataType_char; - else - { - cout << " bitpix= " << bitpix << endl; - throw PException(" FitsFile::GetBlockType : unsupprted FITS data type"); - } - + GetImageParameters (fileptr, dataType, naxis, naxisn); } else if(hdutype == ASCII_TBL || hdutype == BINARY_TBL) { int nrows = 0; vector<string> noms; - vector<char> types; + vector<FitsDataType> types; vector<int> taille_des_chaines; GetBinTabParameters(fileptr, naxis, nrows, naxisn, noms, types, taille_des_chaines); int k; @@ -301,18 +285,7 @@ void FitsInFile::GetBlockType(char flnm[], int hdunum, FitsExtensionType& typeOf else { typeOfExtension = FitsExtensionType_BINARY_TBL; - if(types[0] == 'D') dataType = FitsDataType_double; - else - if(types[0] == 'E') dataType = FitsDataType_float; - else - if(types[0] == 'I' ) dataType = FitsDataType_int; - else - if(types[0] == 'S' ) dataType = FitsDataType_char; - else - { - cout << " types[0]= " << types[0] << endl; - throw PException(" FitsFile::GetBlockType : unsupprted FITS data type"); - } + dataType = types[0]; } } else @@ -326,9 +299,9 @@ void FitsInFile::GetBlockType(char flnm[], int hdunum, FitsExtensionType& typeOf } -void FitsInFile::ReadFInit(int hdunum) +void FitsInFile::ReadHeader(int hdunum) { - InitNull(); + // InitNull(); int status = 0; if (hdunum != 0 ) hdunum_ = hdunum; @@ -351,15 +324,25 @@ void FitsInFile::ReadFInit(int hdunum) } -void FitsInFile::GetImageParameters (fitsfile* fileptr,int& bitpix,int& naxis,vector<int>& naxisn) +void FitsInFile::GetImageParameters (fitsfile* fileptr,FitsDataType& dataType,int& naxis,vector<int>& naxisn) { int hdunum=0; cout << " Reading a FITS image in HDU : " << fits_get_hdu_num(fileptr,&hdunum) << endl; int status= 0; // bits per pixels + int bitpix=0; fits_read_key(fileptr,TINT,"BITPIX",&bitpix,NULL,&status); if( status ) printerror( status ); + if(bitpix == DOUBLE_IMG) dataType = FitsDataType_double; + else if(bitpix == FLOAT_IMG) dataType = FitsDataType_float; + else if(bitpix == LONG_IMG || bitpix == SHORT_IMG ) dataType = FitsDataType_int; + else if (bitpix == BYTE_IMG) dataType = FitsDataType_char; + else + { + cout << " bitpix= " << bitpix << endl; + throw PException(" FitsFile::GetImageParameters : unsupported FITS data type"); + } // number of dimensions in the FITS array naxis= 0; @@ -400,8 +383,12 @@ DVList FitsInFile::DVListFromPrimaryHeader() const void FitsInFile::getHeader() { + // si hdunum_ > 1 lit le header correspondant + // si hdunum_ = 1 se positionne au (et lit le) premier header qui + // contient reellement un objet int status=0; if (hdunum_ < 1) throw PException(" attempt to read hdunum < 1"); + InitNull(); if (hdunum_ == 1) { // presence of image ? @@ -411,7 +398,7 @@ void FitsInFile::getHeader() if (naxis > 0 ) // there is an image { hdutype_ = IMAGE_HDU; - GetImageParameters (fptr_, bitpix_, naxis_, naxisn_); + GetImageParameters (fptr_, imageDataType_, naxis_, naxisn_); nbData_ = 1; int k; for (k=0; k<naxis_; k++) if (naxisn_[k] > 0) nbData_ *= naxisn_[k]; @@ -435,7 +422,7 @@ void FitsInFile::getHeader() hdutype_= hdutype; if(hdutype_ == IMAGE_HDU) { - GetImageParameters (fptr_, bitpix_, naxis_, naxisn_); + GetImageParameters (fptr_, imageDataType_, naxis_, naxisn_); nbData_ = 1; int k; for (k=0; k<naxis_; k++) if (naxisn_[k] > 0) nbData_ *= naxisn_[k]; @@ -508,7 +495,7 @@ S : character string */ -char FitsInFile::ColTypeFromFits(int nocol) const +FitsFile::FitsDataType FitsInFile::ColTypeFromFits(int nocol) const { if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL) { @@ -547,7 +534,7 @@ int FitsInFile::ColStringLengthFromFits(int nocol) const int k; for (k=0; k<=nocol; k++) { - if (types_[k] == 'S') index++; + if (types_[k] == FitsDataType_char) index++; } return taille_des_chaines_[index]; } @@ -577,17 +564,17 @@ void FitsInFile::GetBinTabLine(int NoLine, double* ddata, float* fdata, int* id { switch (types_[ncol]) { - case 'D' : + case FitsDataType_double : fits_read_col(fptr_,TDOUBLE,ncol+1,NoLine+1,1,1,&dnull,&ddata[dcount++],&anull,&status); break; - case 'E' : + case FitsDataType_float : fits_read_col(fptr_,TFLOAT,ncol+1,NoLine+1,1,1,&fnull,&fdata[fcount++],&anull,&status); break; - case 'I' : + case FitsDataType_int : fits_read_col(fptr_,TINT,ncol+1,NoLine+1,1,1,&inull,&idata[icount++], &anull,&status); break; - case 'S' : + case FitsDataType_char : fits_read_col(fptr_,TSTRING,ncol+1,NoLine+1,1,1,cnull,&cdata[ccount++],&anull,&status); break; } @@ -620,17 +607,17 @@ void FitsInFile::GetBinTabLine(long NoLine, BnTblLine& ligne) { switch (types_[ncol]) { - case 'D' : + case FitsDataType_double : fits_read_col(fptr_,TDOUBLE,ncol+1,NoLine+1,1,1,&dnull,&ligne.ddata_[dcount++],&anull,&status); - break; - case 'E' : + break; + case FitsDataType_float : fits_read_col(fptr_,TFLOAT,ncol+1,NoLine+1,1,1,&fnull,&ligne.fdata_[fcount++],&anull,&status); break; - case 'I' : + case FitsDataType_int : fits_read_col(fptr_,TINT,ncol+1,NoLine+1,1,1,&inull,&ligne.idata_[icount++], &anull,&status); break; - case 'S' : + case FitsDataType_char : char* chaine = new char[taille_des_chaines_[ccount]]; fits_read_col(fptr_,TSTRING,ncol+1,NoLine+1,1,1,cnull,&chaine,&anull,&status); ligne.cdata_[ccount++] = string(chaine); @@ -788,9 +775,9 @@ void FitsInFile::GetBinTabFCol(char** valeurs, int nentries, int NoCol) const int DTYPE; long repeat,width; fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status); - if( DTYPE != TSTRING ) + if( DTYPE != TSTRING && DTYPE != TBYTE) { - throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non float"); + throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non string"); } long nels=nentries; // no checking for undefined pixels @@ -820,7 +807,7 @@ void FitsInFile::GetSingleColumn(double* map, int nentries) const if(hdutype_ == IMAGE_HDU) { - if(bitpix_ != DOUBLE_IMG) + if(imageDataType_ != FitsDataType_double) { cout << " The data type on fits file is not double..."; cout << " Conversion to double achieved by cfitsio lib" << endl; @@ -854,7 +841,7 @@ void FitsInFile::GetSingleColumn(float* map, int nentries) const int status = 0; if(hdutype_ == IMAGE_HDU) { - if(bitpix_ != FLOAT_IMG) + if(imageDataType_ != FitsDataType_float) { cout << " The data type on fits file is not float "; cout << " Conversion to float achieved by cfitsio lib" << endl; @@ -887,7 +874,7 @@ void FitsInFile::GetSingleColumn( int* map, int nentries) const int status = 0; if(hdutype_ == IMAGE_HDU) { - if(bitpix_ != LONG_IMG) + if(imageDataType_ != FitsDataType_int) { cout << " The data type on fits file is not int "; cout << " Conversion to float achieved by cfitsio lib" << endl; @@ -915,7 +902,7 @@ void FitsInFile::GetSingleColumn( int* map, int nentries) const void FitsInFile::GetBinTabParameters(fitsfile* fileptr, int& nbcols, int& nrows, vector<int>& repeat, vector<string>& noms, - vector<char>& types, + vector<FitsDataType>& types, vector<int>& taille_des_chaines) { int status= 0; @@ -960,42 +947,87 @@ void FitsInFile::GetBinTabParameters(fitsfile* fileptr, int& nbcols, int& nrows, fits_read_keys_str(fileptr, "TTYPE",1,nbcols,ttype,&nfound, &status); if( status ) printerror( status,"erreur lecture des noms de colonne"); int rept=0; - for(ii = 0; ii < nbcols; ii++) + if(hdutype == ASCII_TBL) { - int DTYPE; - long width; - long repete = 0; - fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status); - if( status ) printerror( status,"erreur lecture type de colonne"); - rept = repete; - noms.push_back(string(ttype[ii])); - switch (DTYPE) + for(ii = 0; ii < nbcols; ii++) { - case TDOUBLE : - types.push_back('D'); - break; - case TFLOAT : - types.push_back('E'); - break; - case TLONG : - types.push_back('I'); - break; - case TINT : - types.push_back('I'); - break; - case TSHORT : - types.push_back('I'); - break; - case TSTRING : - types.push_back('S'); - taille_des_chaines.push_back(width); - rept/=width; - break; - default : - cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl; - throw IOExc("FitsFile:: unknown type of field"); + int DTYPE; + long width; + long repete = 0; + fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status); + if( status ) printerror( status,"erreur lecture type de colonne"); + rept = repete; + noms.push_back(string(ttype[ii])); + switch (DTYPE) + { + case TDOUBLE : + types.push_back(FitsDataType_double); + break; + case TFLOAT : + types.push_back(FitsDataType_float); + break; + case TLONG : + types.push_back(FitsDataType_int); + break; + case TSHORT : + types.push_back(FitsDataType_int); + break; + case TSTRING : + types.push_back(FitsDataType_char); + taille_des_chaines.push_back(width); + rept/=width; + break; + default : + cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl; + throw IOExc("FitsFile::GetBinTabParameters, unsupported data type of field, for ASCII table"); + } + repeat.push_back(rept); + } + } + else + { + for(ii = 0; ii < nbcols; ii++) + { + int DTYPE; + long width; + long repete = 0; + fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status); + if( status ) printerror( status,"erreur lecture type de colonne"); + rept = repete; + noms.push_back(string(ttype[ii])); + switch (DTYPE) + { + case TDOUBLE : + types.push_back(FitsDataType_double); + break; + case TFLOAT : + types.push_back(FitsDataType_float); + break; + case TLONG : + types.push_back(FitsDataType_int); + break; + case TINT : + types.push_back(FitsDataType_int); + break; + case TSHORT : + types.push_back(FitsDataType_int); + break; + case TSTRING : + types.push_back(FitsDataType_char); + taille_des_chaines.push_back(width); + rept/=width; + break; + case TBYTE : + types.push_back(FitsDataType_char); + taille_des_chaines.push_back(width); + rept/=width; + break; + default : + cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl; + throw IOExc("FitsFile::GetBinTabParameters, unsupported data type of field, for BINTABLE"); + } + repeat.push_back(rept); } - repeat.push_back(rept); } for (ii=0; ii < nbcols; ii++) delete [] ttype[ii]; delete [] ttype; @@ -1291,12 +1323,12 @@ ining characters denoting types of the different column (see method ColTypeFromF \param <extname> keyword EXTNAME for FITS file \param <taille_des_chaines> vector containing the number of characters of data for each char* typed column, with order of appearance in 'fieldType' */ -void FitsOutFile::makeHeaderBntblOnFits( string fieldType, vector<string> Noms, int nentries, int tfields, DVList* ptr_dvl, string extname, vector<int> taille_des_chaines) +void FitsOutFile::makeHeaderBntblOnFits(string fieldType, vector<string> Noms, int nentries, int tfields, DVList* ptr_dvl, string extname, vector<int> taille_des_chaines) { int k; int status = 0; long nrows; - // verifications de coherence + // verifications de coherences if (fieldType.length() != tfields) { diff --git a/FitsIOServer/fitsfile.h b/FitsIOServer/fitsfile.h index 2610136..937f334 100644 --- a/FitsIOServer/fitsfile.h +++ b/FitsIOServer/fitsfile.h @@ -59,11 +59,12 @@ namespace SOPHYA { FitsExtensionType_BINARY_TBL }; enum FitsDataType { + FitsDataType_NULL, FitsDataType_double, FitsDataType_float, FitsDataType_int, FitsDataType_char, - FitsDataType_ASCII + FitsDataType_ASCII, }; FitsFile() { InitNull(); }; @@ -71,6 +72,7 @@ namespace SOPHYA { static string GetErrStatus(int status); inline int statusF() const { return fits_status_;} inline void firstImageOnPrimaryHeader(bool choice) {imageOnPrimary_=choice;} + inline int currentHeaderIndex() {return hdunum_;} protected: @@ -80,7 +82,6 @@ namespace SOPHYA { static void printerror(int&,char* texte) ; inline void InitNull() {fptr_ = NULL; hdutype_= 0; hdunum_ = 0; fits_status_ = 0; imageOnPrimary_ = true;} - fitsfile *fptr_; /**< pointer to the FITS file, defined in fitsio.h */ int hdutype_; /**< image or bintable ? */ int hdunum_; /**< index of header to be read/written */ @@ -101,7 +102,7 @@ namespace SOPHYA { static int NbBlocks(char flnm[]); static void GetBlockType(char flnm[], int hdunum, FitsExtensionType& typeOfExtension, int& naxis, vector<int>& naxisn, FitsDataType& dataType, DVList& dvl ); - void ReadFInit(int hdunum); + void ReadHeader(int hdunum); /*! \return a reference on a DVList containing the keywords from FITS file */ inline const DVList& DVListFromFits() const { return dvl_;} @@ -138,6 +139,8 @@ inline int nbDimOfImage() const {return naxis_;} /*! \return total number of data in the current IMAGE extension */ inline int nbOfImageData() const { return nbData_; } +/*! \return data type of the current IMAGE extension */ +inline FitsFile::FitsDataType ImageType() const {return imageDataType_;} ////////////////////////////////////////////////////////////////////////// @@ -154,9 +157,9 @@ inline bool IsFitsTable() const {return (hdutype_ == ASCII_TBL || hdutype_ == BI static void GetBinTabParameters(fitsfile* fileptr, int& nbcols, int& nrows, vector<int>& repeat, vector<string>& noms, - vector<char>& types, + vector<FitsDataType>& types, vector<int>& taille_des_chaines); - char ColTypeFromFits(int nocol) const; + FitsDataType ColTypeFromFits(int nocol) const; string ColNameFromFits(int nocol) const; int ColStringLengthFromFits(int nocol) const; void GetBinTabLine(int NoLine, double* ddata, float* fdata, int* idata, char @@ -187,9 +190,9 @@ inline bool IsFitsTable() const {return (hdutype_ == ASCII_TBL || hdutype_ == BI void InitNull(); void getHeader(); static void KeywordsIntoDVList(fitsfile* fileptr, DVList& dvl, int hdunum); -static void GetImageParameters (fitsfile* fileptr,int& bitpix,int& naxis,vector<int>& naxisn); +static void GetImageParameters (fitsfile* fileptr,FitsDataType& dataType,int& naxis,vector<int>& naxisn); - int bitpix_; /**< fits-Image parameter */ + FitsDataType imageDataType_; /**< fits-Image parameter (bitpix)*/ int naxis_; /**< fits-Image parameter */ vector<int> naxisn_; /**< fits-Image parameters : sizes of dimensions */ int nbData_; /*< fits-Image parameter: number of data */ @@ -197,7 +200,7 @@ static void GetImageParameters (fitsfile* fileptr,int& bitpix,int& naxis,vector vector<int> repeat_; /**< Bintable parameter */ int nbcols_; /**< Bintable parameter */ vector<string> noms_; /**< Bintable parameter: column names */ - vector<char> types_; /**< Bintable parameters: types of columns (D: double, E: float, I: integers, A: char*) */ + vector<FitsDataType> types_; /**< Bintable parameters: types of columns (D: double, E: float, I: integers, A: char*) */ DVList dvl_; /**< DVList for transferring keywords */ vector<int> taille_des_chaines_; /**< Bintable parameters: length of the char* variables */ diff --git a/FitsIOServer/fitslocalmap.cc b/FitsIOServer/fitslocalmap.cc index 123fff8..4d58bbd 100644 --- a/FitsIOServer/fitslocalmap.cc +++ b/FitsIOServer/fitslocalmap.cc @@ -158,6 +158,7 @@ void FITS_LocalMap<T>::WriteToFits(FitsOutFile& os) dvl["LCMP"] = 0; } dvl["Content"]= "LocalMap"; + dvl.SetComment("Content", "name of SOPHYA object"); // On ecrit les dataBlocks vector<string> Noms; Noms.push_back(dvl.GetS("Content")); @@ -181,8 +182,10 @@ void FITS_LocalMap<T>::WriteToFits(FitsOutFile& os) #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template FITS_LocalMap<r_8> #pragma define_template FITS_LocalMap<r_4> +#pragma define_template FITS_LocalMap<int_4> #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class FITS_LocalMap<r_8>; template class FITS_LocalMap<r_4>; +template class FITS_LocalMap<int_4>; #endif diff --git a/FitsIOServer/fitsntuple.cc b/FitsIOServer/fitsntuple.cc index c01a59b..c146cfb 100644 --- a/FitsIOServer/fitsntuple.cc +++ b/FitsIOServer/fitsntuple.cc @@ -88,15 +88,15 @@ void FITS_NTuple::ReadFromFits(FitsInFile& is) } for (k=0; k<nbcols;k++) { - char ss= is.ColTypeFromFits(k); + FitsFile::FitsDataType ss= is.ColTypeFromFits(k); string type; - if (ss != 'E') + if (ss != FitsFile::FitsDataType_float) { - if (ss == 'D') type= string("double"); + if (ss == FitsFile::FitsDataType_double) type= string("double"); else - if (ss == 'I') type= string("integer"); + if (ss == FitsFile::FitsDataType_int) type= string("integer"); else - if (ss == 'A') type = string("char*"); + if (ss == FitsFile::FitsDataType_char) type = string("char*"); else type = string("unknown"); cout << " WARNING: the column " << k << " on fits file is not float but : " << type << endl; @@ -158,6 +158,8 @@ void FITS_NTuple::WriteToFits(FitsOutFile& os) // get names and values from the join DVList object DVList dvl= dobj_->Info(); + dvl["Content"]= "NTuple"; + dvl.SetComment("Content", "name of SOPHYA object"); // extension name string extname("NTuple_Binary_tbl"); diff --git a/FitsIOServer/fitsspherehealpix.cc b/FitsIOServer/fitsspherehealpix.cc index da4734f..b7a7bc4 100644 --- a/FitsIOServer/fitsspherehealpix.cc +++ b/FitsIOServer/fitsspherehealpix.cc @@ -96,7 +96,8 @@ void FITS_SphereHEALPix<T>::WriteToFits(FitsOutFile& os) dvl["LASTPIX"]= (int_4) nPix-1; dvl.SetComment("LASTPIX", "Last pixel # (0 based)"); dvl["Content"]= "SphereHEALPix"; - + dvl.SetComment("Content", "name of SOPHYA object"); + // On ecrit les dataBlocks vector<string> Noms; Noms.push_back(dvl.GetS("Content")); @@ -272,8 +273,10 @@ void FITS_SphereHEALPix<T>::sinus_picture_projection(char filename[]) #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template FITS_SphereHEALPix<r_8> #pragma define_template FITS_SphereHEALPix<r_4> +#pragma define_template FITS_SphereHEALPix<int_4> #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class FITS_SphereHEALPix<r_8>; template class FITS_SphereHEALPix<r_4>; +template class FITS_SphereHEALPix<int_4>; #endif diff --git a/FitsIOServer/fitsspherehealpix.h b/FitsIOServer/fitsspherehealpix.h index f31f70b..353831c 100644 --- a/FitsIOServer/fitsspherehealpix.h +++ b/FitsIOServer/fitsspherehealpix.h @@ -7,7 +7,6 @@ #include "spherehealpix.h" #include "anydataobj.h" -#include "ppersist.h" #include "fitsfile.h" namespace SOPHYA { diff --git a/FitsIOServer/fitstarray.cc b/FitsIOServer/fitstarray.cc index 59fc845..011d36b 100644 --- a/FitsIOServer/fitstarray.cc +++ b/FitsIOServer/fitstarray.cc @@ -133,7 +133,10 @@ void FITS_TArray<T>::WriteToFits(FitsOutFile& os) if (naxisn[k] > 0) nbels *= naxisn[k]; } cout << " nombre total d'elements a copier " << nbels << endl; - os.makeHeaderImageOnFits(type, nbdim, naxisn, &dobj_->Info()); + DVList dvl( dobj_->Info() ); + dvl["Content"]= "TArray"; + dvl.SetComment("Content", "name of SOPHYA object"); + os.makeHeaderImageOnFits(type, nbdim, naxisn, &dvl); if (!dobj_->IsPacked()) { cout << " IsPacked() = " << dobj_->IsPacked() << endl; @@ -155,8 +158,10 @@ void FITS_TArray<T>::WriteToFits(FitsOutFile& os) #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template FITS_TArray<r_8> #pragma define_template FITS_TArray<r_4> +#pragma define_template FITS_TArray<int_4> #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class FITS_TArray<r_8>; template class FITS_TArray<r_4>; +template class FITS_TArray<int_4>; #endif diff --git a/FitsIOServer/fitsxntuple.cc b/FitsIOServer/fitsxntuple.cc index 51c4e50..156c40c 100644 --- a/FitsIOServer/fitsxntuple.cc +++ b/FitsIOServer/fitsxntuple.cc @@ -79,11 +79,11 @@ void FITS_XNTuple::ReadFromFits(FitsInFile& is) vector<int> SfitsCol; for (k=0; k<nbcols;k++) { - char ss= is.ColTypeFromFits(k); - if (ss == 'D') DfitsCol.push_back(k); - else if (ss == 'E') FfitsCol.push_back(k); - else if (ss == 'I') IfitsCol.push_back(k); - else if (ss == 'S') SfitsCol.push_back(k); + FitsFile::FitsDataType ss= is.ColTypeFromFits(k); + if (ss == FitsFile::FitsDataType_double) DfitsCol.push_back(k); + else if (ss == FitsFile::FitsDataType_float) FfitsCol.push_back(k); + else if (ss == FitsFile::FitsDataType_int) IfitsCol.push_back(k); + else if (ss == FitsFile::FitsDataType_char) SfitsCol.push_back(k); else { cout << " FITS_XNTuple: colonne fits " << k << " type= " << ss << endl; throw IOExc("type de champ inconnu"); @@ -125,13 +125,15 @@ void FITS_XNTuple::ReadFromFits(FitsInFile& is) { if (ownobj_) { - (*dobj_)= XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName); + (*dobj_)= XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName); } else { - if (DfitsCol.size() != dobj_->NDVar() || FfitsCol.size() != dobj_->NFVar() || IfitsCol.size() != dobj_->NIVar() || SfitsCol.size() != dobj_->NSVar()) - - throw SzMismatchError("FITS_XNTuple : structure incorrecte du ntuple"); + if (DfitsCol.size() != dobj_->NDVar() || FfitsCol.size() != dobj_->NFVar() || IfitsCol.size() != dobj_->NIVar() || SfitsCol.size() != dobj_->NSVar()) + { + cout << " WARNING : FITS_XNTuple : XNTuple reconfigured " << endl; + (*dobj_)= XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName); + } } } @@ -226,6 +228,8 @@ void FITS_XNTuple::WriteToFits(FitsOutFile& os) } vector<int> StringSizes(dobj_->NSVar()); for (k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz; + dvl["Content"]= "XNTuple"; + dvl.SetComment("Content", "name of SOPHYA object"); os.makeHeaderBntblOnFits(types, Noms, nrows, ncols, &dvl, extname,StringSizes); int compt=0; -- GitLab