Changeset 2846 in Sophya for trunk/SophyaExt


Ignore:
Timestamp:
Nov 21, 2005, 9:32:49 AM (20 years ago)
Author:
ansari
Message:

Nouveau fits: Codage I/O colonnes string et complex (suite) + prise en charge dans handler FITS - Reza 21/11/2005

Location:
trunk/SophyaExt/FitsIOServer
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaExt/FitsIOServer/fitsblkrw.h

    r2843 r2846  
    99  \ingroup FitsIOServer
    1010  \brief Template class with static methods for handling bloc data
    11   read from / write to fits files
     11  read from / write to fits filesz
    1212*/
    1313
     
    114114};
    115115
     116DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */
     117class FitsBlockRW<std::string> {
     118public:
     119//! Write image HDU with string data type not supported (throws exception)
     120static void WriteImageData(FitsInOutFile& fios, const std::string * d, size_t sz,
     121                           long * fpixel=NULL)
     122{
     123  throw FitsIOException(
     124    "FitsBlockRW<string>::WriteImageData() string data type Unsupported for image HDU");
     125}
     126//! Read image HDU with string data type not supported (throws exception)
     127static void ReadImageData(FitsInOutFile& fios,  std::string * d, size_t sz,
     128                          long * fpixel=NULL)
     129{
     130  throw FitsIOException(
     131    "FitsBlockRW<string>::ReadImageData() string data type Unsupported for image HDU");
     132}
    116133
    117 /*!
    118   Write character string data to binary/ascii HDU data in a fits file.
    119   See cfitsio function fits_write_col() for more detail.
    120   \param colnum : table column number (starting from 1)
    121   \param firstrow : the write operation starting row (starting from 1)
    122   \param firstelem : the firstelem (for vector type columns)
    123   \param d : pointer to string type array to be written
    124   \param sz : number of data elements to be written
    125   \param width : column width
    126 */
    127 void WriteStringColumnData(FitsInOutFile& fios, int colnum, long firstrow,
    128                            long firstelem, const string * d, size_t sz,
    129                            long width=0)
     134//! Write character string data to binary/ascii HDU data in a fits file.
     135static void WriteColumnData(FitsInOutFile& fios, int colnum, long firstrow,
     136                            long firstelem, const std::string * d, size_t sz)
    130137{
    131138  int status = 0;
    132   if (width < 1) width = 16;
     139  char sbuff[1024];
     140  char * cp[4] = {sbuff, sbuff+256, sbuff+512, sbuff+768};
     141  //cout << " --- Getting in WriteColumnData<string>() colnum=" << colnum << endl;
    133142  for(size_t kk=0; kk<sz; kk++) {
    134     char * cp = const_cast<char *>(d[kk].c_str());
     143    strncpy(sbuff, d[kk].c_str(), 1023);
     144    //    char * cp = const_cast<char *>(d[kk].c_str());
     145    sbuff[1023] = '\0';
    135146    status = 0;
    136     fits_write_col(fios.FitsPtr(), FitsTypes::DataType(cp), colnum,
    137                    firstrow+kk, firstelem, 1, &cp, &status);
     147    //cout <<"DBG-Write2Fits : appel a fits_write_col() kk=" << kk << " / sz=" << sz << endl;
     148    fits_write_col(fios.FitsPtr(), FitsTypes::DataType(sbuff), colnum,
     149                   firstrow+kk, firstelem, 1, cp, &status);
    138150    if ( status ) {
    139151      fits_report_error(stderr, status);
    140152      char buff[32];
    141153      fits_get_errstatus(status, buff);
    142       string msg = "WriteStringColumnData Error: " ;
     154      string msg = "FitsBlockRW<std::string>::WriteColumnData() Error: " ;
    143155      msg += buff;
    144156      sprintf(buff," kk=%ld",kk);  msg += buff;
     
    149161}
    150162
    151 /*!
    152   Read character string data to binary/ascii HDU data in a fits file.
    153   See cfitsio function fits_read_col() for more detail.
    154   \param colnum : table column number (starting from 1)
    155   \param firstrow : the read operation starting point (row) (starting from 1)
    156   \param firstelem : the firstelem (for vector type columns)
    157   \param d : pointer to string type array to be read
    158   \param sz : number of data elements to be read
    159   \param width : column width
    160 */
    161 void ReadStringColumnData(FitsInOutFile& fios, int colnum, long firstrow,
    162                           long firstelem, string * d, size_t sz, long width)
     163
     164//! Read character string data to binary/ascii HDU data in a fits file.
     165static void ReadColumnData(FitsInOutFile& fios, int colnum, long firstrow,
     166                           long firstelem, std::string * d, size_t sz)
    163167{
    164168  int status = 0;
    165169  int anynul = 0;
    166   char buff[1024];
     170  char sbuff[1024];
     171  char * cp[4] = {sbuff, sbuff+256, sbuff+512, sbuff+768};
     172  //  cout << " --- Getting in ReadColumnData<string>() colnum=" << colnum << endl;
    167173  for(size_t kk=0; kk<sz; kk++) {
    168     fits_read_col(fios.FitsPtr(), FitsTypes::DataType(buff), colnum,
    169                  firstrow, firstelem+kk, 1, NULL, &buff, &anynul, &status);
    170     d[kk] = buff;
     174    //    cout <<"DBG-ReadFrFits : appel a fits_read_col() kk=" << kk << " / sz=" << sz << endl;
     175    fits_read_col(fios.FitsPtr(), FitsTypes::DataType(sbuff), colnum,
     176                 firstrow+kk, firstelem, 1, NULL, cp, &anynul, &status);
     177    sbuff[1023] = '\0'; d[kk] = sbuff;
    171178    if ( status ) {
    172179      fits_report_error(stderr, status);
    173180      char buff[32];
    174181      fits_get_errstatus(status, buff);
    175       string msg = "ReadStringColumnData Error: " ;
     182      string msg = "FitsBlockRW<std::string>::ReadColumnData() Error: " ;
    176183      msg += buff;
    177184      sprintf(buff," kk=%ld",kk);  msg += buff;
     
    182189}
    183190
     191};  // Fin classe   FitsBlockRW<std::string>
     192
    184193} // Fin du namespace
    185194
  • trunk/SophyaExt/FitsIOServer/fitshdtable.cc

    r2843 r2846  
    2525 
    2626  int tbltyp = os.GetDef_TableType();
     27  string strcoltag;
     28  long strwidth = os.GetDef_StrColWidth();
     29  if (strwidth < 1) strwidth = 16;
     30  char buff[32];
     31  if (tbltyp == ASCII_TBL)
     32    sprintf(buff, "A%ld",strwidth);
     33  else
     34    sprintf(buff, "%ldA",strwidth);
     35  strcoltag = buff;
     36
    2737  vector<string> colnames, tform, tunit;
    2838  for(sa_size_t k=0; k<dobj->NVar(); k++) {
    29     colnames.push_back(dobj->GetColumName(k));
    30     tunit.push_back("");
     39    bool fgoknm = true;
     40    bool fgoktun = true;
    3141    switch ( dobj->GetColumType(k) ) {
    3242    case BaseDataTable::IntegerField :
     
    4353      break;
    4454    case BaseDataTable::DoubleField :
     55    case BaseDataTable::DateTimeField :
    4556      if (tbltyp == ASCII_TBL) tform.push_back("D15.8");
    4657      else tform.push_back("D");
     58      if (dobj->GetColumType(k) == BaseDataTable::DateTimeField ) {
     59        tunit.push_back("Days (DateTimeField)");
     60        fgoktun = false;
     61      }
     62      break;
     63    case BaseDataTable::ComplexField :
     64      if (tbltyp == ASCII_TBL) {
     65        cout << "FitsHandler<BaseDataTable>::Write()/Warning ComplexField not supported for ASCII_TBL "
     66             << endl;
     67        fgoknm = false;
     68      }
     69      else   tform.push_back("C");
     70      break;
     71    case BaseDataTable::DoubleComplexField :
     72      if (tbltyp == ASCII_TBL) {
     73        cout << "FitsHandler<BaseDataTable>::Write()/Warning DoubleComplexField not supported for ASCII_TBL "
     74             << endl;
     75        fgoknm = false;
     76      }
     77      else   tform.push_back("M");
    4778      break;
    4879    case BaseDataTable::StringField :
    49       cout << "FitsHandler<BaseDataTable>::Write() / Warning StringField not yet supported " << endl;
     80      tform.push_back(strcoltag);
    5081      break;
    5182    default:
     
    5384      break;
    5485    }
     86    if (fgoknm) {
     87      colnames.push_back(dobj->GetColumName(k));
     88      if (fgoktun) tunit.push_back("");
     89    }
    5590  }
    5691
    5792  // On cree la table 
    58   string extname = "";
     93  string extname = os.NextExtensionName();
    5994  os.CreateTable(os.GetDef_TableType(), extname, colnames, tform, tunit);
    6095
     
    67102    for(sa_size_t k=0; k<dobj->NVar(); k++) {
    68103      sa_size_t sk = dobj->mNames[k].ser;
     104      //DBG cout << "DBG-A k= " << k << " nom=" << dobj->mNames[k].nom << " ser=" << sk
     105      //DBG   << " type=" << dobj->GetColumType(k) << endl;
    69106      switch ( dobj->GetColumType(k) ) {
    70107      case BaseDataTable::IntegerField :
     
    84121        break;
    85122      case BaseDataTable::DoubleField :
     123      case BaseDataTable::DateTimeField :
    86124        icol++;
    87125        FitsBlockRW<r_8>::WriteColumnData(os, icol, l+1, 1,
    88126                                          dt->mDCols[sk].GetCstSegment(iseg), sz);
    89127        break;
    90         // case BaseDataTable::StringField :
     128      case BaseDataTable::ComplexField :
     129        if (tbltyp == BINARY_TBL) {
     130          icol++;
     131          FitsBlockRW< complex<r_4> >::WriteColumnData(os, icol, l+1, 1,
     132                                                       dt->mYCols[sk].GetCstSegment(iseg), sz);
     133        }
     134        break;
     135      case BaseDataTable::DoubleComplexField :
     136        if (tbltyp == BINARY_TBL) {
     137          icol++;
     138          FitsBlockRW< complex<r_8> >::WriteColumnData(os, icol, l+1, 1,
     139                                                       dt->mZCols[sk].GetCstSegment(iseg), sz);
     140        }
     141        break;
     142      case BaseDataTable::StringField :
     143        icol++;
     144        FitsBlockRW<std::string>::WriteColumnData(os, icol, l+1, 1,
     145                                                  dt->mSCols[sk].GetCstSegment(iseg), sz);
     146        break;
    91147      default:
    92148        break;
     
    99155  MuTyV mtv = dobj->SegmentSize();
    100156  os.WriteKey("SEGMSIZE",mtv," SOPHYA::DataTable SegmentSize");
     157  mtv = "SOPHYA::DataTable";
     158  os.WriteKey("SOPCLSNM",mtv," Object class name ");
    101159}
    102160
     
    114172  if (segsz > 2048) segsz = 2048;
    115173  string key = "SEGMSIZE";
    116   string ssegsz = is.KeyValue(key);
    117   if (ssegsz.length() > 0)  segsz = atoi(ssegsz.c_str());
     174  bool knex = false;
     175  string ssegsz = is.KeyValue(key, knex);
     176  if (!knex && (ssegsz.length() > 0))  segsz = atoi(ssegsz.c_str());
    118177  if (segsz < 16) segsz = 16;
    119178
     
    163222      colpos.push_back(k+1);
    164223      break;
     224    case TCOMPLEX :
     225      dt->AddComplexColumn(colnames[k]);
     226      colpos.push_back(k+1);
     227      break;
     228    case TDBLCOMPLEX :
     229      dt->AddDoubleComplexColumn(colnames[k]);
     230      colpos.push_back(k+1);
     231      break;
     232    case TSTRING :
     233      dt->AddStringColumn(colnames[k]);
     234      colpos.push_back(k+1);
     235      break;
    165236    default:
    166237      cout << "FitsHandler<BaseDataTable>::Read() NOT handled field type "
     
    174245  while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry())
    175246    dobj->Extend();
    176   //  cout << " DBG2 -- dobj->mNSeg = " << dobj->NbSegments() << " SegSize="
    177   //   << dobj->SegmentSize() << " NEntry=" << dobj->NEntry() << endl;
     247  //DBG  cout << " DBG2 -- dobj->mNSeg = " << dobj->NbSegments() << " SegSize="
     248  //DBG   << dobj->SegmentSize() << " NEntry=" << dobj->NEntry() << endl;
    178249
    179250  // Lecture des donnees des colonnes
     
    201272        break;
    202273      case BaseDataTable::DoubleField :
     274      case BaseDataTable::DateTimeField :
    203275        FitsBlockRW<r_8>::ReadColumnData(is, icol, l+1, 1,
    204276                                         dt->mDCols[sk].GetSegment(iseg), sz);
    205277        break;
    206         // case BaseDataTable::StringField :
     278      case BaseDataTable::ComplexField :
     279        FitsBlockRW< complex<r_4> >::ReadColumnData(is, icol, l+1, 1,
     280                                                    dt->mYCols[sk].GetSegment(iseg), sz);
     281        break;
     282      case BaseDataTable::DoubleComplexField :
     283        FitsBlockRW< complex<r_8> >::ReadColumnData(is, icol, l+1, 1,
     284                                                    dt->mZCols[sk].GetSegment(iseg), sz);
     285        break;
     286      case BaseDataTable::StringField :
     287        FitsBlockRW<std::string>::ReadColumnData(is, icol, l+1, 1,
     288                                                 dt->mSCols[sk].GetSegment(iseg), sz);
     289        break;
    207290      default:
    208291        break;
     
    217300
    218301
    219 /*
    220 int toto()
    221 {
    222   DataTable xx;
    223   FitsInOutFile fio("dtoto.fits", FitsInOutFile::Fits_Create);
    224   FitsHandler<BaseDataTable> fh(xx);
    225   //  fio << xx;
    226 }
    227 */
    228 
    229 
     302
     303
Note: See TracChangeset for help on using the changeset viewer.