Index: trunk/SophyaExt/FitsIOServer/fitsfile.cc
===================================================================
--- trunk/SophyaExt/FitsIOServer/fitsfile.cc	(revision 883)
+++ trunk/SophyaExt/FitsIOServer/fitsfile.cc	(revision 903)
@@ -2,6 +2,6 @@
 #include "pexceptions.h"
 #include "strutil.h"
- 
-
+#include "anydataobj.h" 
+#include "fitsspherehealpix.h"
 FitsFile::FitsFile() 
 {
@@ -17,7 +17,95 @@
 {
   int status = 0;
-  if( fptr_ != NULL) fits_close_file(fptr_,&status);
+  if( fptr_ != NULL)
+    {
+      fits_close_file(fptr_,&status);
+      delete fptr_;
+    }
   if( status )  printerror( status );
 }
+
+
+int FitsFile::NbBlocks(char flnm[])
+{
+  int status = 0;
+  int nbhdu = 0; 
+  fitsfile* fileptr; 
+  fits_open_file(&fileptr,flnm,READONLY,&status);
+  if( status ) printerror( status, "NbBlocks: erreur ouverture fichier" );
+  fits_get_num_hdus(fileptr, &nbhdu, &status); 
+  fits_close_file(fileptr,&status);
+  return nbhdu;
+}
+
+void FitsFile::getBlockType(char flnm[], int hdunum, string& typeOfExtension, int& naxis, vector<int>& naxisn, string& dataType, DVList& dvl )
+{
+  int status = 0;
+  fitsfile* fileptr; 
+  fits_open_file(&fileptr,flnm,READONLY,&status);
+  if( status ) printerror( status, "getBlockType: erreur ouverture fichier" );
+  // move to the specified HDU number
+  int hdutype = 0;
+  fits_movabs_hdu(fileptr,hdunum,&hdutype,&status);
+  if( status ) printerror( status,"getBlockType: erreur movabs");
+  if(hdutype == IMAGE_HDU) 
+    {
+      typeOfExtension = "IMAGE";
+      int bitpix;
+      GetImageParameters (fileptr, bitpix, naxis, naxisn);
+      if(bitpix == DOUBLE_IMG) dataType = "double";
+      else
+	if(bitpix == FLOAT_IMG) dataType = "float";
+	else
+	  if(bitpix == LONG_IMG || bitpix == SHORT_IMG ) dataType = "int";
+	  else 
+	    {
+	      cout << " bitpix= " << bitpix << endl;
+	      throw PException(" FitsFile::getBlockType : unsupprted FITS data type");
+	    }
+      
+    }
+  else
+    if(hdutype == ASCII_TBL  || hdutype == BINARY_TBL) 
+      {
+	int nrows = 0;
+	vector<string> noms; 
+	vector<char> types;   
+	vector<int>  taille_des_chaines;
+	GetBinTabParameters(fileptr, naxis, nrows, naxisn, noms, types, taille_des_chaines);  
+	for (int k=0; k< naxisn.size(); k++) naxisn[k] *= nrows;
+	if(hdutype == ASCII_TBL)
+	  {
+	    typeOfExtension = "ASCII_TBL"; 
+	    dataType = "ASCII";
+	  }
+	else
+	  {
+	    typeOfExtension = "BINARY_TBL";
+	    if(types[0] == 'D') dataType = "double";
+	    else
+	      if(types[0] == 'E') dataType = "float";
+	      else
+		if(types[0] == 'I' ) dataType = "int";
+		else
+		  if(types[0] == 'S' ) dataType = "char*";
+		  else 
+		    {
+		      cout << " types[0]= " << types[0] << endl;
+		      throw PException(" FitsFile::getBlockType : unsupprted FITS data type");
+	    }
+	  }
+      }
+    else
+      {
+	cout << " hdutype= " << hdutype << endl;
+	throw IOExc("FitsFile::getBlockType: this HDU type is unknown");
+      }
+  
+  fits_movabs_hdu(fileptr,hdunum,&hdutype,&status);
+  if( status ) printerror( status,"getBlockType: erreur movabs, pour dvlist");
+  KeywordsIntoDVList(fileptr, dvl);
+  fits_close_file(fileptr,&status);
+}
+
 void FitsFile::ReadF(char flnm[],int hdunum) 
 {
@@ -37,9 +125,17 @@
   if(hdutype_ == IMAGE_HDU) 
     {
-      read_image();
+      GetImageParameters (fptr_, bitpix_, naxis_, naxisn_);
+      nbData_ =  1;
+      for (int k=0; k<naxis_; k++) if (naxisn_[k] > 0) nbData_ *= naxisn_[k];
+      fits_movabs_hdu(fptr_,hdunum,&hdutype,&status);
+      if( status ) printerror( status);
+      KeywordsIntoDVList(fptr_, dvl_);
     }
   if(hdutype_ == ASCII_TBL || hdutype_ == BINARY_TBL)
     {
-      GetBinTabParameters();
+      GetBinTabParameters(fptr_,nbcols_, nrows_,repeat_, noms_, types_, taille_des_chaines_);
+  fits_movabs_hdu(fptr_,hdunum,&hdutype,&status);
+  if( status ) printerror( status);
+  KeywordsIntoDVList(fptr_, dvl_);
     }
   ReadFromFits(*this);
@@ -199,261 +295,40 @@
 
 
-void FitsFile::read_image()
-{
-  cout << " Reading a FITS image in HDU : " << hdunum_ << endl;
+
+void FitsFile::GetImageParameters (fitsfile* fileptr,int& bitpix,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
-  fits_read_key(fptr_,TINT,"BITPIX",&bitpix_,NULL,&status);
+  fits_read_key(fileptr,TINT,"BITPIX",&bitpix,NULL,&status);
   if( status )  printerror( status );
 
   // number of dimensions in the FITS array
-  int naxis= 0;
-  fits_read_key(fptr_,TINT,"NAXIS",&naxis,NULL,&status);
-  if( status ) printerror( status );
-  naxis_ = naxis;
-
-  // read the NAXIS1 and NAXIS2 keyword to get image size
-  long* naxes = new long[naxis_] ;
+  naxis= 0;
+  fits_read_key(fileptr,TINT,"NAXIS",&naxis,NULL,&status);
+  if( status ) printerror( status );
+
+  // read the NAXISn keywords to get image size
+  long* naxes = new long[naxis] ;
   int nfound;
-  fits_read_keys_lng(fptr_,"NAXIS",1,naxis_,naxes,&nfound,&status);
-  if( status ) printerror( status );
-  if (nfound != naxis_ ) 
-    cout << " WARNING : " << nfound << " axes found, expexted naxis= " << naxis_ << endl;
-  int lastSize = naxes[naxis_-1]; 
-  while (lastSize <= 1) 
-    {
-      naxis_--;
-      lastSize = naxes[naxis_-1];
-    }
-
-  nbData_ =  1;
-  for (int k=0; k<naxis_; k++) 
-    {
-      naxisn_.push_back( (int)naxes[k] );
-      if (naxisn_[k] > 0) nbData_ *= naxisn_[k];
-
+  fits_read_keys_lng(fileptr,"NAXIS",1,naxis,naxes,&nfound,&status);
+  if( status ) printerror( status );
+  if (nfound != naxis ) 
+    cout << " WARNING : " << nfound << " axes found, expected naxis= " << naxis << endl;
+  for (int k=0; k<naxis; k++) 
+    {
+      naxisn.push_back( (int)naxes[k] );
     }
   delete [] naxes;
 }
 
- 
-  void FitsFile::GetBinTabFCol(double* valeurs,int nentries, int NoCol) const
-    {
-      int status= 0;
-      int DTYPE;
-      long repeat,width;
-            fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
-      if( DTYPE != TDOUBLE) 
-	{
-	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non double");
-	}
-      long nels=nentries;
-      // no checking for undefined pixels
-      int    anull;
-      float dnull= 0.;
-      fits_read_col(fptr_,TDOUBLE,NoCol+1,1,1,nels,&dnull,valeurs,
-			    &anull,&status);
-      if( status ) printerror( status,"erreur lecture de colonne" );
-    }
-
-  void FitsFile::GetBinTabFCol(float* valeurs,int nentries, int NoCol) const
-    {
-      int status= 0;
-      int DTYPE;
-      long repeat,width;
-      fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
-      if( DTYPE != TFLOAT) 
-	{
-	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non float");
-	}
-      long nels=nentries;
-      // no checking for undefined pixels
-      int    anull;
-      float fnull= 0.;
-      fits_read_col(fptr_,TFLOAT,NoCol+1,1,1,nels,&fnull,valeurs,
-			    &anull,&status);
-      if( status ) printerror( status,"erreur lecture de colonne" );
-    }
-  void FitsFile::GetBinTabFCol(int* valeurs,int nentries, int NoCol) const
-    {
-      int status= 0;
-      int DTYPE;
-      long repeat,width;
-      fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
-      if( DTYPE != TLONG &&  DTYPE != TINT &&  DTYPE != TSHORT ) 
-	{
-	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non entier");
-	}
-      long nels=nentries;
-      // no checking for undefined pixels
-      int    anull;
-      int inull= 0;
-      fits_read_col(fptr_,TINT,NoCol+1,1,1,nels,&inull,valeurs,
-			    &anull,&status);
-      if( status ) printerror( status,"erreur lecture de colonne" );
-    }
-  void FitsFile::GetBinTabFCol(char** valeurs, int nentries, int NoCol) const
-    {
-      int status= 0;
-      int DTYPE;
-      long repeat,width;
-      fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
-      if( DTYPE != TSTRING ) 
-	{
-	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non float");
-	}
-      long nels=nentries;
-      // no checking for undefined pixels
-      int    anull;
-      char* cnull= " ";
-      long frow=1;
-      long felem=1;
-      fits_read_col(fptr_,TSTRING,NoCol+1,frow,felem,nels,cnull,valeurs,
-		    &anull,&status);
-      if( status ) printerror( status,"erreur lecture de colonne" );
-    }
-int  FitsFile::NbColsFromFits() const
-{
-  int status= 0;
-  if(hdutype_ ==  BINARY_TBL) return nbcols_;
-  else
-    if(hdutype_ == ASCII_TBL ||  hdutype_ == IMAGE_HDU) return 1;
-    else
-      {
-	cout << " hdutype= " << hdutype_ << endl;
-	throw PException("FitsFile::NbColsFromFits, this HDU is unknown");
-      }
-}
-
-char FitsFile::ColTypeFromFits(int nocol) const
-{
-  int status= 0;
-  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
-    {
-      throw IOExc("FitsFile::TypeFromFits, this HDU is not an ASCII table nor a binary table");
-    }
-  return types_[nocol];
-}
-int FitsFile::NentriesFromFits(int nocol) const
-{
-  int status= 0;
-  if(hdutype_ == BINARY_TBL  )   return nrows_*repeat_[nocol];
-  else
-    if(hdutype_ == ASCII_TBL) return nrows_;
-    else
-      if(hdutype_ == IMAGE_HDU) return nbData_;
-      else
-	{
-	  cout << "hdutype= " << hdutype_ << endl;
-	  throw PException("FitsFile::NentriesFromFits, this HDU is unknown");
-	}
-}
-
-string FitsFile::ColNameFromFits(int nocol) const
-{
-  int status= 0;
-  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
-    {
-      throw IOExc("FitsFile::TypeFromFits, this HDU is not an ASCII table nor a binary table");
-    }
-  return noms_[nocol];
-}
-int FitsFile::ColStringLengthFromFits(int nocol) const
-{
-  int status= 0;
-  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
-    {
-      throw IOExc("FitsFile::TypeFromFits, this HDU is not an ASCII table nor a binary table");
-    }
-  int index=-1;
-  for (int k=0; k<=nocol; k++) 
-    {
-      if (types_[k] == 'S') index++;
-    }
-  return  taille_des_chaines_[index];
-}
-
-void FitsFile::GetBinTabParameters()
-{
-  int status= 0;
-  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
-    {
-      throw IOExc("FitsFile:: this HDU is not an ASCII table nor a binary table");
-    }
-  if(hdutype_ == ASCII_TBL)
-    cout << " Reading a FITS ascii table in HDU : " << hdunum_ << endl;  
-  if(hdutype_ == BINARY_TBL)
-    cout << " Reading a FITS binary table in HDU : " << hdunum_ << endl;
-
-  // get the number of columns
-  int nbcols = 0;
-  fits_get_num_cols(fptr_, &nbcols,&status);
-  if( status ) printerror( status );
-  nbcols_=nbcols;
-
-  // get the number of rows
-  long naxis2= 0;
-  fits_get_num_rows(fptr_,&naxis2,&status);
-  if( status ) printerror( status );
-  nrows_= (int)naxis2;
-
-  // get the datatype,  names and the repeat count
-  noms_.clear();
-  noms_.reserve(nbcols);
-  types_.clear();
-  types_.reserve(nbcols);
-  repeat_.clear();
-  repeat_.reserve(nbcols);
-  taille_des_chaines_.clear();
-  char **ttype = new char*[nbcols];
-  for (int ii=0; ii < nbcols; ii++) ttype[ii]=new char[FLEN_VALUE];
-  int nfound;
-  fits_read_keys_str(fptr_, "TTYPE",1,nbcols,ttype,&nfound, &status);
-  if( status ) printerror( status,"erreur lecture des noms de colonne");
-  //  int nentries = nrows_;
-  int rept=0;
-  for(int ii = 0; ii <  nbcols; ii++)
-    {
-      int DTYPE;
-      long width;
-      long repeat = 0;
-      fits_get_coltype(fptr_,ii+1,&DTYPE,&repeat,&width,&status);
-      if( status ) printerror( status,"erreur lecture type de colonne");
-      rept = repeat;
-      noms_.push_back(string(ttype[ii]));
-      //      cout << " getparam: nentries= " << nentries << " rept= " << rept << endl;
-      switch (DTYPE)
-	{
-	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");
-	}
-      //    nentries = max(nentries, nrows_*rept);
-      repeat_.push_back(rept);
-    } 
+void FitsFile::KeywordsIntoDVList(fitsfile* fileptr, DVList& dvl)
+{
   // get number of keywords
   int nkeys,keypos;
-  fits_get_hdrpos(fptr_,&nkeys,&keypos,&status);
+  int status = 0;
+  fits_get_hdrpos(fileptr,&nkeys,&keypos,&status);
   if( status ) printerror( status );
 
@@ -470,5 +345,5 @@
   for(int j = num+1; j <= nkeys; j++)
     {
-      fits_read_keyn(fptr_,j,card,strval,NULL,&status);
+      fits_read_keyn(fileptr,j,card,strval,NULL,&status);
       if(status) printerror(status);
 
@@ -488,10 +363,10 @@
 	    { 
 	    case 'C':
-	      dvl_[keyname]= strval;	  
+	      dvl[keyname]= strval;	  
 	      break;
 	    case 'I':
 	      int ival;
-	      fits_read_key(fptr_,TINT,keyname,&ival,NULL,&status);
-	        dvl_[keyname]= (int_4) ival;		// Portage mac DY
+	      fits_read_key(fileptr,TINT,keyname,&ival,NULL,&status);
+	        dvl[keyname]= (int_4) ival;		// Portage mac DY
 	      break;
 	    case 'L':
@@ -499,10 +374,10 @@
 	      if(strncmp(strval,"T",1) == 0) ilog= 1;
 	      else ilog= 0;
-	      dvl_[keyname]= (int_4) ilog;
+	      dvl[keyname]= (int_4) ilog;
 	      break;
 	    case 'F':
 	      double dval;
-	      fits_read_key(fptr_,TDOUBLE,keyname,&dval,NULL,&status);
-	      dvl_[keyname]= dval;
+	      fits_read_key(fileptr,TDOUBLE,keyname,&dval,NULL,&status);
+	      dvl[keyname]= dval;
 	      break;
 	    }
@@ -511,5 +386,232 @@
     } 
   //  dvl_.Print();
-}
+} 
+
+
+ 
+  void FitsFile::GetBinTabFCol(double* valeurs,int nentries, int NoCol) const
+    {
+      int status= 0;
+      int DTYPE;
+      long repeat,width;
+            fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
+      if( DTYPE != TDOUBLE) 
+	{
+	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non double");
+	}
+      long nels=nentries;
+      // no checking for undefined pixels
+      int    anull;
+      float dnull= 0.;
+      fits_read_col(fptr_,TDOUBLE,NoCol+1,1,1,nels,&dnull,valeurs,
+			    &anull,&status);
+      if( status ) printerror( status,"erreur lecture de colonne" );
+    }
+
+  void FitsFile::GetBinTabFCol(float* valeurs,int nentries, int NoCol) const
+    {
+      int status= 0;
+      int DTYPE;
+      long repeat,width;
+      fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
+      if( DTYPE != TFLOAT) 
+	{
+	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non float");
+	}
+      long nels=nentries;
+      // no checking for undefined pixels
+      int    anull;
+      float fnull= 0.;
+      fits_read_col(fptr_,TFLOAT,NoCol+1,1,1,nels,&fnull,valeurs,
+			    &anull,&status);
+      if( status ) printerror( status,"erreur lecture de colonne" );
+    }
+  void FitsFile::GetBinTabFCol(int* valeurs,int nentries, int NoCol) const
+    {
+      int status= 0;
+      int DTYPE;
+      long repeat,width;
+      fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
+      if( DTYPE != TLONG &&  DTYPE != TINT &&  DTYPE != TSHORT ) 
+	{
+	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non entier");
+	}
+      long nels=nentries;
+      // no checking for undefined pixels
+      int    anull;
+      int inull= 0;
+      fits_read_col(fptr_,TINT,NoCol+1,1,1,nels,&inull,valeurs,
+			    &anull,&status);
+      if( status ) printerror( status,"erreur lecture de colonne" );
+    }
+  void FitsFile::GetBinTabFCol(char** valeurs, int nentries, int NoCol) const
+    {
+      int status= 0;
+      int DTYPE;
+      long repeat,width;
+      fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
+      if( DTYPE != TSTRING ) 
+	{
+	  throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non float");
+	}
+      long nels=nentries;
+      // no checking for undefined pixels
+      int    anull;
+      char* cnull= " ";
+      long frow=1;
+      long felem=1;
+      fits_read_col(fptr_,TSTRING,NoCol+1,frow,felem,nels,cnull,valeurs,
+		    &anull,&status);
+      if( status ) printerror( status,"erreur lecture de colonne" );
+    }
+int  FitsFile::NbColsFromFits() const
+{
+  int status= 0;
+  if(hdutype_ ==  BINARY_TBL) return nbcols_;
+  else
+    if(hdutype_ == ASCII_TBL ||  hdutype_ == IMAGE_HDU) return 1;
+    else
+      {
+	cout << " hdutype= " << hdutype_ << endl;
+	throw PException("FitsFile::NbColsFromFits, this HDU is unknown");
+      }
+}
+
+char FitsFile::ColTypeFromFits(int nocol) const
+{
+  int status= 0;
+  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
+    {
+      throw IOExc("FitsFile::TypeFromFits, this HDU is not an ASCII table nor a binary table");
+    }
+  return types_[nocol];
+}
+int FitsFile::NentriesFromFits(int nocol) const
+{
+  int status= 0;
+  if(hdutype_ == BINARY_TBL  )   return nrows_*repeat_[nocol];
+  else
+    if(hdutype_ == ASCII_TBL) return nrows_;
+    else
+      if(hdutype_ == IMAGE_HDU) return nbData_;
+      else
+	{
+	  cout << "hdutype= " << hdutype_ << endl;
+	  throw PException("FitsFile::NentriesFromFits, this HDU is unknown");
+	}
+}
+
+string FitsFile::ColNameFromFits(int nocol) const
+{
+  int status= 0;
+  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
+    {
+      throw IOExc("FitsFile::TypeFromFits, this HDU is not an ASCII table nor a binary table");
+    }
+  return noms_[nocol];
+}
+int FitsFile::ColStringLengthFromFits(int nocol) const
+{
+  int status= 0;
+  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
+    {
+      throw IOExc("FitsFile::TypeFromFits, this HDU is not an ASCII table nor a binary table");
+    }
+  int index=-1;
+  for (int k=0; k<=nocol; k++) 
+    {
+      if (types_[k] == 'S') index++;
+    }
+  return  taille_des_chaines_[index];
+}
+
+
+
+void FitsFile::GetBinTabParameters(fitsfile* fileptr, int& nbcols, int& nrows,
+				  vector<int>& repeat,
+				  vector<string>& noms, 
+				  vector<char>& types,   
+				  vector<int>&  taille_des_chaines)
+{
+  int status= 0;
+  int hdunum=0;
+  int hdutype=0;
+  fits_get_hdu_num(fileptr,&hdunum);
+  fits_get_hdu_type(fileptr, &hdutype, &status);
+
+  if(hdutype != ASCII_TBL && hdutype != BINARY_TBL)
+    {
+      throw IOExc("FitsFile::GetBinTabParameters this HDU is not an ASCII table nor a binary table");
+    }
+  if(hdutype == ASCII_TBL)
+    cout << " Reading a FITS ascii table in HDU : " << hdunum << endl;  
+  if(hdutype == BINARY_TBL)
+    cout << " Reading a FITS binary table in HDU : " << hdunum << endl;
+
+  // get the number of columns
+  fits_get_num_cols(fileptr, &nbcols,&status);
+  if( status ) printerror( status );
+
+  // get the number of rows
+  long naxis2= 0;
+  fits_get_num_rows(fileptr,&naxis2,&status);
+  if( status ) printerror( status );
+  nrows = (int)naxis2;
+
+  // get the datatype,  names and the repeat count
+  noms.clear();
+  noms.reserve(nbcols);
+  types.clear();
+  types.reserve(nbcols);
+  repeat.clear();
+  repeat.reserve(nbcols);
+  taille_des_chaines.clear();
+  char **ttype = new char*[nbcols];
+  for (int ii=0; ii < nbcols; ii++) ttype[ii]=new char[FLEN_VALUE];
+  int nfound;
+  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(int 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('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");
+	}
+      repeat.push_back(rept);
+    } 
+}
+
+
+
 void FitsFile::makeHeaderBntblOnFits( char* fieldType, char** Noms, int nentries, int tfields, DVList &dvl, char* extname, vector<int> taille_des_chaines) const
 { 
@@ -777,5 +879,8 @@
 }
 
-void FitsFile::printerror(int &status) const
+
+
+
+void FitsFile::printerror(int &status) 
   //*****************************************************/
   //* Print out cfitsio error messages and exit program */
@@ -790,5 +895,5 @@
 }
 
-void FitsFile::printerror(int& status, char* texte) const
+void FitsFile::printerror(int& status, char* texte) 
   //*****************************************************/
   //* Print out cfitsio error messages and exit program */
Index: trunk/SophyaExt/FitsIOServer/fitsfile.h
===================================================================
--- trunk/SophyaExt/FitsIOServer/fitsfile.h	(revision 883)
+++ trunk/SophyaExt/FitsIOServer/fitsfile.h	(revision 903)
@@ -12,5 +12,31 @@
 namespace SOPHYA {
 
-
+//
+//! Virtual Class for managing Interface for SOPHYA objects to FITS Format Files (uses cfitsio lib)
+
+/*! 
+
+Each SOPHYA object XXX is associated with a object of class FITS_XXX 
+ (inheriting from FitsFile), to which input/output operations with FITS 
+ files are delegated. A typical example of use is the following : 
+
+\verbatim
+  int m=... ;
+  SphereHEALPix<r_8> sphere1(m);           // definition of the SOPHYA object
+  .... fill the sphere ....
+
+  FITS_SphereHEALPix<r_8> fits_sph1(sphere1); 
+                                           // delegated object
+  fits_sph.Write("myfile.fits");           // writing on FITS file
+
+   FITS_SphereHEALPix<r_8> fits_sph2("myfile.fits"); 
+                                           // load a delegated object 
+                                           // from FITS file
+   SphereHEALPix<r_8> sphere2=(SphereHEALPix<r_8>)fits_sph2; 
+                                           // casting the delegated object
+                                           // into a SOPHYA object
+\endverbatim
+
+*/
 class FitsFile
 {
@@ -19,76 +45,218 @@
 
   FitsFile();
-  //  FitsFile(char flnm[],int iomode,int hdunum= 0);
   virtual ~FitsFile();
-
+  static int NbBlocks(char flnm[]);
+  static void getBlockType(char flnm[], int hdunum, string& typeOfExtension, int& naxis, vector<int>& naxisn, string& dataType, DVList& dvl  );
+/*! return true if the current header  corresponds to a FITS image extension */
 inline bool IsFitsImage() const { return (hdutype_ == IMAGE_HDU);}
+
+/*! return true if the current header  corresponds to a FITS ASCII or BINTABLE extension */
 inline bool IsFitsTable() const {return (hdutype_ == ASCII_TBL || hdutype_ == BINARY_TBL);}
-  void   ReadF(char flnm[],int hdunum= 0); 
+
+/*!
+this method is called from inherited objects : 
+
+moves to header 'hdunum' on file 'flnm'
+
+gets parameters in header 
+
+calls the method 'ReadFromFits' from the inherited delegated object
+
+*/ 
+  void   ReadF(char flnm[],int hdunum= 0);
+ 
+/*!
+this method is called from inherited objects : 
+
+opens a file 'flnm' 
+
+gets parameters in header 
+
+calls the method 'ReadFromFits' from the inherited delegated object
+
+*/ 
   void    WriteF(char flnm[],int hdunum= 0); 
+
+
+  /*!
+fill the array 'map' with double data from the current extension on FITS file.
+If the extension is BINTABLE, the first column is provided. 
+
+\param <nentries>  number of data to be read
+  */
   void    GetSingleColumn(double* map, int nentries) const;
+
+  /*! same as above with float data */
   void    GetSingleColumn(float*  map, int nentries) const;
+
+  /*! same as above with int data */
   void    GetSingleColumn(int* map, int nentries) const;
+
+  /*! number of dimensions of an image extension : NAXIS parameter (in FITS notations)
+   */
 inline int nbDimOfImage() const {return naxis_;}
+
+/*!
+ total number of data in the current IMAGE extension
+ */
 inline int nbOfImageData() const { return nbData_; }
+
+/*! a reference on a vector containing sizes of the NAXIS dimensions : NAXIS1, NAXIS2, NAXIS3 wtc.
+ */
  inline const vector<int>& dimOfImageAxes() const { return naxisn_;}
+
+ /*! return number of columns (return 1 if IMAGE) */
   int     NbColsFromFits() const;
+
+  /*! return a character denoting data type of column number 'nocol' in a BINTABLE :
+
+D : double
+
+E : float 
+
+I : integer
+    
+S : character string 
+
+  */
   char    ColTypeFromFits(int nocol) const;
+
+  /*! number of data in the current IMAGE extension on FITS file, or number
+ of data of column number 'nocol' of the current BINTABLE extension
+  */
   int     NentriesFromFits(int nocol) const;
+
+  /*! name of the column number 'nocol' of the current BINTABLE extension
+   */
   string  ColNameFromFits(int nocol) const;
+
+  
+  /*! number of characters of each data  for the column number 'nocol' (if char* typed) of the current BINTABLE extension
+   */
   int     ColStringLengthFromFits(int nocol) const;
+
+  /*! return a reference on a DVList containing the keywords from FITS file
+   */
   inline const DVList& DVListFromFits() const { return dvl_;}
+
+
+  /*!
+fill the array 'valeurs' with double data from the current BINTABLE extension on FITS file, from column number 'NoCol'
+
+\param <nentries>  number of data to be read
+  */
   void GetBinTabFCol(double* valeurs, int nentries, int NoCol) const;
+
+  /*! same as previous method with float data */
   void GetBinTabFCol(float* valeurs, int nentries, int NoCol) const;
+  /*! same as previous method with int data */
   void GetBinTabFCol(int* valeurs, int nentries,  int NoCol) const;
+  /*! same as previous method with char* data */
   void GetBinTabFCol(char** valeurs,int nentries, int NoCol) const;
   // Write elements into the FITS data array
+
+  /*! write double data from array 'map'on an IMAGE extension 
+\param <nbData>  number of data to be written
+
+   */
   void putImageToFits( int nbData, double* map) const;
+
+  /*! same as previous method with float data */
   void putImageToFits(int nbData, float* map ) const;
+
+  /*! same as previous method with int data */
   void putImageToFits(int nbData, int* map) const;
+
+  /*! write double data from array 'donnees ' on column number 'nocol' of a BINTABLE  extension.
+\param <nentries>  number of data to be written
+
+   */
   void putColToFits(int nocol, int nentries, double* donnees) const;
+
+  /*! same as previous method with float data */
   void putColToFits(int nocol, int nentries, float* donnees) const;
+
+  /*! same as previous method with int data */
   void putColToFits(int nocol, int nentries, int* donnees) const;
+
+  /*! same as previous method with char* data */
   void putColToFits(int nocol, int nentries, char** donnees) const;
-  // Write elements into an ASCII or binary table column
+
+  /*! create an IMAGE header on FITS file.
+\param <type> type of data (see method ColTypeFromFits)
+\param <nbdim>  number of dimensions : 1D, 2D, 3D etc. = NAXIS
+\param <naxisn>  array containind sizes of the different dimensions
+  */
   void makeHeaderImageOnFits(char type, int nbdim, int* naxisn) const;
+
+  /*! create an BINTABLE header on FITS file.
+\param <fieldType> array containing characters denoting types of the different column (see method ColTypeFromFits)
+\param <Noms>  array of the names of columns
+\param <nentries>  number of data of each column
+\param <tfields> number of columns
+\param <dvl> a SOPHYA DVList containing keywords to be appended
+\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 makeHeaderBntblOnFits ( char* fieldType, char** Noms, int nentries, int tfields, DVList &dvl, char* extname,  vector<int> taille_des_chaines) const;
 
   void readheader();
-  void printerror(int&) const;
-  void printerror(int&,char* texte) const;
+static  void printerror(int&) ;
+static  void printerror(int&,char* texte) ;
   protected:  
     virtual void    ReadFromFits(const FitsFile& ff)=0;           
     virtual void    WriteToFits(const FitsFile& ff)=0;           
-    //    virtual void*   getColFromObj(int colNr)=0;
 private:
 
-  void read_image ();
-  void GetBinTabParameters();
+static  void GetImageParameters (fitsfile* fileptr,int& bitpix,int& naxis,vector<int>& naxisn);
+static  void GetBinTabParameters(fitsfile* fileptr, int& nbcols, int& nrows,
+				  vector<int>& repeat,
+				  vector<string>& noms, 
+				  vector<char>& types,   
+				  vector<int>&  taille_des_chaines);
+static void KeywordsIntoDVList(fitsfile* fileptr, DVList& dvl); 
   void writeSignatureOnFits() const; 
 
+  //! pointer to the FITS file, defined in fitsio.h 
+  fitsfile *fptr_; 
   
-  fitsfile *fptr_; // pointer to the FITS file, defined in fitsio.h
-  
-  int hdutype_; // image or bintable ?
-  int hdunum_;  // index of header to read/write
-
-
-  // fits-Image parameters 
+  //!  image or bintable ?
+  int hdutype_;
+
+//! index of header to be read/written
+  int hdunum_;  
+
+
+  //! fits-Image parameter 
   int bitpix_;
+
+  //! fits-Image parameter 
   int naxis_;
+
+  //! fits-Image parameters : sizes of dimensions
   vector<int> naxisn_;
+
+  //! fits-Image parameter: number of data 
   int nbData_;
 
-  // Bintable parameters
+  //! Bintable parameter
   int nrows_;
+
+  //! Bintable parameter
   vector<int> repeat_;
 
+  //! Bintable parameter
   int nbcols_;
-  vector<string> noms_; // column names
-  vector<char> types_;  // types of columns (D: double, E: float, I: integers
-                        // A: char*)
-  vector<int>  taille_des_chaines_; // length of the char* variables
-
-
+
+  //! Bintable parameter: column names
+  vector<string> noms_; 
+ 
+  //! Bintable parameters: types of columns (D: double, E: float, I: integers,  A: char*)
+  vector<char> types_;   
+    
+  //! Bintable parameters:   length of the char* variables                 
+  vector<int>  taille_des_chaines_;
+
+  //! DVList for transferring keywords
   DVList dvl_;
 };
