Ignore:
Timestamp:
Nov 8, 2000, 11:02:58 AM (25 years ago)
Author:
ansari
Message:

classe FITS_AutoReader

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaExt/FitsIOServer/fitsfile.cc

    r1281 r1300  
    104104void FitsIOHandler::Read(FitsInFile& is, int hdunum)
    105105{
    106   is.ReadFInit(hdunum);
     106  is.ReadHeader(hdunum);
    107107  ReadFromFits(is);
    108108}
     
    224224void FitsInFile::InitNull()
    225225{
    226  
    227   bitpix_ = 0;
     226  imageDataType_ = FitsDataType_NULL;
    228227  naxis_ = 0;
    229228  nbData_ = 0;
     
    236235  dvl_.Clear();
    237236 
    238  
    239237}
    240238
     
    268266    {
    269267      typeOfExtension = FitsExtensionType_IMAGE;
    270       int bitpix;
    271       GetImageParameters (fileptr, bitpix, naxis, naxisn);
    272       if(bitpix == DOUBLE_IMG) dataType = FitsDataType_double;
    273       else
    274         if(bitpix == FLOAT_IMG) dataType = FitsDataType_float;
    275         else
    276           if(bitpix == LONG_IMG || bitpix == SHORT_IMG ) dataType = FitsDataType_int;
    277           else
    278             if (bitpix == BYTE_IMG) dataType = FitsDataType_char;
    279             else
    280             {
    281               cout << " bitpix= " << bitpix << endl;
    282               throw PException(" FitsFile::GetBlockType : unsupprted FITS data type");
    283             }
    284      
     268      GetImageParameters (fileptr, dataType, naxis, naxisn);
    285269    }
    286270  else
     
    289273        int nrows = 0;
    290274        vector<string> noms;
    291         vector<char> types;   
     275        vector<FitsDataType> types;   
    292276        vector<int>  taille_des_chaines;
    293277        GetBinTabParameters(fileptr, naxis, nrows, naxisn, noms, types, taille_des_chaines);
     
    302286          {
    303287            typeOfExtension = FitsExtensionType_BINARY_TBL;
    304             if(types[0] == 'D') dataType = FitsDataType_double;
    305             else
    306               if(types[0] == 'E') dataType = FitsDataType_float;
    307               else
    308                 if(types[0] == 'I' ) dataType = FitsDataType_int;
    309                 else
    310                   if(types[0] == 'S' ) dataType = FitsDataType_char;
    311                   else
    312                     {
    313                       cout << " types[0]= " << types[0] << endl;
    314                       throw PException(" FitsFile::GetBlockType : unsupprted FITS data type");
    315             }
     288            dataType = types[0];
    316289          }
    317290      }
     
    327300
    328301
    329 void FitsInFile::ReadFInit(int hdunum)
    330 {
    331   InitNull();
     302void FitsInFile::ReadHeader(int hdunum)
     303{
     304  //  InitNull();
    332305  int status = 0;
    333306
     
    352325
    353326
    354 void FitsInFile::GetImageParameters (fitsfile* fileptr,int& bitpix,int& naxis,vector<int>& naxisn)
     327void FitsInFile::GetImageParameters (fitsfile* fileptr,FitsDataType& dataType,int& naxis,vector<int>& naxisn)
    355328{
    356329  int hdunum=0;
     
    359332
    360333  // bits per pixels
     334  int bitpix=0;
    361335  fits_read_key(fileptr,TINT,"BITPIX",&bitpix,NULL,&status);
    362336  if( status )  printerror( status );
     337  if(bitpix == DOUBLE_IMG) dataType = FitsDataType_double;
     338  else if(bitpix == FLOAT_IMG) dataType = FitsDataType_float;
     339  else if(bitpix == LONG_IMG || bitpix == SHORT_IMG ) dataType = FitsDataType_int;
     340  else if (bitpix == BYTE_IMG) dataType = FitsDataType_char;
     341  else
     342    {
     343      cout << " bitpix= " << bitpix << endl;
     344      throw PException(" FitsFile::GetImageParameters : unsupported FITS data type");
     345    }
    363346
    364347  // number of dimensions in the FITS array
     
    401384void FitsInFile::getHeader()
    402385{
     386  // si hdunum_ > 1 lit le header correspondant
     387  // si hdunum_ = 1 se positionne au (et lit le) premier header qui
     388  //                contient reellement un objet
    403389  int status=0;
    404390  if (hdunum_ < 1)  throw PException(" attempt to read hdunum < 1");
     391   InitNull();
    405392  if (hdunum_ == 1)
    406393    {
     
    412399        {
    413400          hdutype_ = IMAGE_HDU;
    414           GetImageParameters (fptr_, bitpix_, naxis_, naxisn_);
     401          GetImageParameters (fptr_, imageDataType_, naxis_, naxisn_);
    415402          nbData_ =  1;
    416403          int k;
     
    436423      if(hdutype_ == IMAGE_HDU)
    437424        {
    438           GetImageParameters (fptr_, bitpix_, naxis_, naxisn_);
     425          GetImageParameters (fptr_, imageDataType_, naxis_, naxisn_);
    439426          nbData_ =  1;
    440427          int k;
     
    509496  */
    510497
    511 char FitsInFile::ColTypeFromFits(int nocol) const
     498FitsFile::FitsDataType FitsInFile::ColTypeFromFits(int nocol) const
    512499{
    513500  if(hdutype_ != ASCII_TBL && hdutype_ != BINARY_TBL)
     
    548535  for (k=0; k<=nocol; k++)
    549536    {
    550       if (types_[k] == 'S') index++;
     537      if (types_[k] == FitsDataType_char) index++;
    551538    }
    552539  return  taille_des_chaines_[index];
     
    578565      switch (types_[ncol])
    579566        {
    580         case 'D' :
     567        case FitsDataType_double :
    581568          fits_read_col(fptr_,TDOUBLE,ncol+1,NoLine+1,1,1,&dnull,&ddata[dcount++],&anull,&status);
    582569            break;
    583         case 'E' :
     570        case FitsDataType_float :
    584571          fits_read_col(fptr_,TFLOAT,ncol+1,NoLine+1,1,1,&fnull,&fdata[fcount++],&anull,&status);
    585572          break;
    586         case 'I' :
     573        case  FitsDataType_int :
    587574          fits_read_col(fptr_,TINT,ncol+1,NoLine+1,1,1,&inull,&idata[icount++],
    588575                        &anull,&status);
    589576          break;
    590         case 'S' :
     577        case FitsDataType_char :
    591578          fits_read_col(fptr_,TSTRING,ncol+1,NoLine+1,1,1,cnull,&cdata[ccount++],&anull,&status);
    592579          break;
     
    621608      switch (types_[ncol])
    622609        {
    623         case 'D' :
     610        case FitsDataType_double :
    624611          fits_read_col(fptr_,TDOUBLE,ncol+1,NoLine+1,1,1,&dnull,&ligne.ddata_[dcount++],&anull,&status);
    625             break;
    626         case 'E' :
     612          break;
     613        case FitsDataType_float :
    627614          fits_read_col(fptr_,TFLOAT,ncol+1,NoLine+1,1,1,&fnull,&ligne.fdata_[fcount++],&anull,&status);
    628615          break;
    629         case 'I' :
     616        case FitsDataType_int :
    630617          fits_read_col(fptr_,TINT,ncol+1,NoLine+1,1,1,&inull,&ligne.idata_[icount++],
    631618                        &anull,&status);
    632619          break;
    633         case 'S' :
     620        case FitsDataType_char :
    634621          char* chaine = new char[taille_des_chaines_[ccount]];
    635622          fits_read_col(fptr_,TSTRING,ncol+1,NoLine+1,1,1,cnull,&chaine,&anull,&status);
     
    789776      long repeat,width;
    790777      fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status);
    791       if( DTYPE != TSTRING )
    792         {
    793           throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non float");
     778      if( DTYPE != TSTRING &&  DTYPE != TBYTE)
     779        {
     780          throw IOExc("FitsFile::GetBinTabFCol, tentative de lecture non string");
    794781        }
    795782      long nels=nentries;
     
    821808    {
    822809 
    823       if(bitpix_ != DOUBLE_IMG)
     810      if(imageDataType_ != FitsDataType_double)
    824811        {
    825812          cout << " The data type on fits file is not double...";
     
    855842  if(hdutype_ == IMAGE_HDU)
    856843    {
    857       if(bitpix_ != FLOAT_IMG)
     844      if(imageDataType_ != FitsDataType_float)
    858845        {
    859846          cout << " The data type on fits file is not float ";
     
    888875  if(hdutype_ == IMAGE_HDU)
    889876    {
    890       if(bitpix_ != LONG_IMG)
     877      if(imageDataType_ != FitsDataType_int)
    891878        {
    892879          cout << " The data type on fits file is not int ";
     
    916903                                  vector<int>& repeat,
    917904                                  vector<string>& noms,
    918                                   vector<char>& types,   
     905                                  vector<FitsDataType>& types,   
    919906                                  vector<int>&  taille_des_chaines)
    920907{
     
    961948  if( status ) printerror( status,"erreur lecture des noms de colonne");
    962949  int rept=0;
    963   for(ii = 0; ii <  nbcols; ii++)
    964     {
    965       int DTYPE;
    966       long width;
    967       long repete = 0;
    968       fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status);
    969       if( status ) printerror( status,"erreur lecture type de colonne");
    970       rept = repete;
    971       noms.push_back(string(ttype[ii]));
    972       switch (DTYPE)
    973         {
    974         case TDOUBLE :
    975           types.push_back('D');
    976           break;
    977         case TFLOAT :
    978           types.push_back('E');
    979           break;
    980         case TLONG :
    981           types.push_back('I');
    982           break;
    983         case TINT :
    984           types.push_back('I');
    985           break;
    986         case TSHORT :
    987           types.push_back('I');
    988           break;
    989         case TSTRING :
    990           types.push_back('S');
    991           taille_des_chaines.push_back(width);
    992           rept/=width;
    993           break;
    994         default :
    995           cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl;
    996           throw IOExc("FitsFile:: unknown type of field");
    997         }
    998       repeat.push_back(rept);
     950  if(hdutype == ASCII_TBL)
     951    {
     952      for(ii = 0; ii <  nbcols; ii++)
     953        {
     954          int DTYPE;
     955          long width;
     956          long repete = 0;
     957          fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status);
     958          if( status ) printerror( status,"erreur lecture type de colonne");
     959          rept = repete;
     960          noms.push_back(string(ttype[ii]));
     961          switch (DTYPE)
     962            {
     963            case TDOUBLE :
     964              types.push_back(FitsDataType_double);
     965              break;
     966            case TFLOAT :
     967              types.push_back(FitsDataType_float);
     968              break;
     969            case TLONG :
     970              types.push_back(FitsDataType_int);
     971              break;
     972            case TSHORT :
     973              types.push_back(FitsDataType_int);
     974              break;
     975            case TSTRING :
     976              types.push_back(FitsDataType_char);
     977              taille_des_chaines.push_back(width);
     978              rept/=width;
     979              break;
     980            default :
     981              cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl;
     982              throw IOExc("FitsFile::GetBinTabParameters, unsupported data type of field, for ASCII table");
     983            }
     984          repeat.push_back(rept);
     985        }
     986    }
     987  else
     988    {
     989      for(ii = 0; ii <  nbcols; ii++)
     990        {
     991          int DTYPE;
     992          long width;
     993          long repete = 0;
     994          fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status);
     995          if( status ) printerror( status,"erreur lecture type de colonne");
     996          rept = repete;
     997          noms.push_back(string(ttype[ii]));
     998          switch (DTYPE)
     999            {
     1000            case TDOUBLE :
     1001              types.push_back(FitsDataType_double);
     1002              break;
     1003            case TFLOAT :
     1004              types.push_back(FitsDataType_float);
     1005              break;
     1006            case TLONG :
     1007              types.push_back(FitsDataType_int);
     1008              break;
     1009            case TINT :
     1010              types.push_back(FitsDataType_int);
     1011              break;
     1012            case TSHORT :
     1013              types.push_back(FitsDataType_int);
     1014              break;
     1015            case TSTRING :
     1016              types.push_back(FitsDataType_char);
     1017              taille_des_chaines.push_back(width);
     1018              rept/=width;
     1019              break;
     1020            case TBYTE :
     1021              types.push_back(FitsDataType_char);
     1022              taille_des_chaines.push_back(width);
     1023              rept/=width;
     1024              break;
     1025            default :
     1026              cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl;
     1027              throw IOExc("FitsFile::GetBinTabParameters, unsupported data type of field, for BINTABLE");
     1028            }
     1029          repeat.push_back(rept);
     1030        }
    9991031    }
    10001032  for (ii=0; ii < nbcols; ii++) delete [] ttype[ii];
     
    12921324\param <taille_des_chaines> vector containing the number of characters of  data  for each char* typed column, with order of appearance in 'fieldType'
    12931325*/
    1294 void FitsOutFile::makeHeaderBntblOnFits( string fieldType, vector<string> Noms, int nentries, int tfields, DVList* ptr_dvl, string extname, vector<int> taille_des_chaines)
     1326void FitsOutFile::makeHeaderBntblOnFits(string fieldType, vector<string> Noms, int nentries, int tfields, DVList* ptr_dvl, string extname, vector<int> taille_des_chaines)
    12951327{
    12961328  int k;
    12971329  int status = 0;
    12981330  long nrows;
    1299   // verifications de coherence
     1331  // verifications de coherences
    13001332
    13011333  if (fieldType.length() != tfields)
Note: See TracChangeset for help on using the changeset viewer.