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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.