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