Ignore:
Timestamp:
Jan 9, 2006, 6:32:37 PM (20 years ago)
Author:
ansari
Message:

Mise au point de la classe SwFitsDataTable - Reza 9/01/2006

File:
1 edited

Legend:

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

    r2864 r2889  
    1010#include "fitsblkrw.h"
    1111#include "fitshandler.h"
    12 
    13 // #include "fitshdtable.h"
     12#include "swfitsdtable.h"
    1413
    1514DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */
     
    1817  if (is.CurrentHDUType() == IMAGE_HDU ) return 0;
    1918  string key = "SOPCLSNM";
    20   if (is.KeyValue(key) == "SOPHYA::DataTable")  return 2;
     19  string clsnm = is.KeyValue(key);
     20  if ( (clsnm == "SOPHYA::DataTable") || (clsnm == "SOPHYA::SwFitsDataTable") )
     21    return 2;
    2122  else return 1;
    2223}
     
    3031
    3132  DataTable* dt = dynamic_cast< DataTable *> (dobj);
    32   if (dt == NULL)
    33     throw FitsIOException("FitsHandler<DataTable>::Write() Not a DataTable object");
    34  
     33  SwFitsDataTable* swfdt = dynamic_cast< SwFitsDataTable *> (dobj);
     34
    3535  int tbltyp = os.GetDef_TableType();
     36  if ( swfdt && (tbltyp == ASCII_TBL) )
     37    throw FitsIOException("FitsHandler<DataTable>::Write() ASCII_TBL not supported for SwFitsDataTable");
     38
     39  // On ne reecrit pas la definition d'une SwFitsDataTable dans son fichier de swap
     40  if (swfdt && (swfdt->mSwF.FitsPtr()==os.FitsPtr()) && swfdt->NRows() )  return;
     41
    3642  string strcoltag;
    3743  long strwidth = os.GetDef_StrColWidth();
     
    102108  string extname = os.NextExtensionName();
    103109  os.CreateTable(os.GetDef_TableType(), extname, colnames, tform, tunit);
     110
     111  // On n'ecrit pas les donnees d'une table SwFitsDataTable ds son fichier de swap
     112  if (swfdt && (swfdt->mSwF.FitsPtr()==os.FitsPtr()) )  return;
    104113
    105114  // Ecriture des donnees des colonnes
     
    117126        icol++;
    118127        FitsBlockRW<int_4>::WriteColumnData(os, icol, l+1, 1,
    119                                             dt->mICols[sk].GetCstSegment(iseg), sz);
     128                                            dobj->mIColsP[sk]->GetCstSegment(iseg), sz);
    120129        break;
    121130      case BaseDataTable::LongField :
    122131        icol++;
    123132        FitsBlockRW<int_8>::WriteColumnData(os, icol, l+1, 1,
    124                                             dt->mLCols[sk].GetCstSegment(iseg), sz);
     133                                            dobj->mLColsP[sk]->GetCstSegment(iseg), sz);
    125134        break;
    126135      case BaseDataTable::FloatField :
    127136        icol++;
    128137        FitsBlockRW<r_4>::WriteColumnData(os, icol, l+1, 1,
    129                                           dt->mFCols[sk].GetCstSegment(iseg), sz);
     138                                          dobj->mFColsP[sk]->GetCstSegment(iseg), sz);
    130139        break;
    131140      case BaseDataTable::DoubleField :
     
    133142        icol++;
    134143        FitsBlockRW<r_8>::WriteColumnData(os, icol, l+1, 1,
    135                                           dt->mDCols[sk].GetCstSegment(iseg), sz);
     144                                          dobj->mDColsP[sk]->GetCstSegment(iseg), sz);
    136145        break;
    137146      case BaseDataTable::ComplexField :
     
    139148          icol++;
    140149          FitsBlockRW< complex<r_4> >::WriteColumnData(os, icol, l+1, 1,
    141                                                        dt->mYCols[sk].GetCstSegment(iseg), sz);
     150                                                       dobj->mYColsP[sk]->GetCstSegment(iseg), sz);
    142151        }
    143152        break;
     
    146155          icol++;
    147156          FitsBlockRW< complex<r_8> >::WriteColumnData(os, icol, l+1, 1,
    148                                                        dt->mZCols[sk].GetCstSegment(iseg), sz);
     157                                                       dobj->mZColsP[sk]->GetCstSegment(iseg), sz);
    149158        }
    150159        break;
     
    152161        icol++;
    153162        FitsBlockRW<std::string>::WriteColumnData(os, icol, l+1, 1,
    154                                                   dt->mSCols[sk].GetCstSegment(iseg), sz);
     163                                                  dobj->mSColsP[sk]->GetCstSegment(iseg), sz);
    155164        break;
    156165      default:
     
    159168    }
    160169  }
    161   // Ecriture de SegmentSize et autre elements de DVList
    162  
     170
     171  // Ecriture de SegmentSize et autre elements de DVList 
    163172  os.WriteHeaderRecords(dobj->Info());
    164173  MuTyV mtv = dobj->SegmentSize();
     
    178187    throw FitsIOException("FitsHandler<DataTable>::Read() Not a binary or ascii table HDU");
    179188
     189  // Determination de la taille de segment
    180190  sa_size_t segsz = is.GetNbRows() / 16; // Taille de segment par defaut
    181191  if (segsz > 2048) segsz = 2048;
     
    186196  if (segsz < 16) segsz = 16;
    187197
    188   if (dobj == NULL) { // On cree la table si besoin
    189     dobj = new DataTable(segsz);
    190   }
    191   else {
    192     dobj->Clear();  // On efface la table sinon
    193     dobj->mSegSz = segsz;
    194   }
    195 
    196   // On gere les DataTable pour le moment ...
    197   DataTable* dt = dynamic_cast< DataTable *> (dobj);
    198   if (dt == NULL)
    199     throw FitsIOException("FitsHandler<DataTable>::Read() Not a DataTable object");
    200  
     198  // Nb de lignes et de colonnes
    201199  vector<string> colnames;
    202200  vector<int> coltypes;
     
    204202  vector<long> colpos;
    205203  is.GetColInfo(colnames, coltypes, repcnt, width);
     204  long nbrows = is.GetNbRows();
     205
     206  if (dobj == NULL) { // On cree la table si besoin
     207    string key = "SOPCLSNM";
     208    string clsnm = is.KeyValue(key);
     209    if ( (clsnm == "SOPHYA::SwFitsDataTable") || (nbrows*colnames.size() < 10000000) )
     210      dobj = new DataTable(segsz);
     211    else dobj = new SwFitsDataTable(is, segsz, false);
     212  }
     213  else {
     214    dobj->Clear();  // On efface la table sinon
     215    dobj->mSegSz = segsz;
     216  }
     217
     218  // Type reel de table
     219  DataTable* dt = dynamic_cast< DataTable *> (dobj);
     220  SwFitsDataTable* swfdt = dynamic_cast< SwFitsDataTable *> (dobj);
     221
     222  vector<int_8> swpos;
     223  // Initialize the fits swap stream for SwFitsDataTable if necessary
     224  if (swfdt)  {
     225    if ( swfdt->FitsSwapFile().FitsPtr() != is.FitsPtr() )
     226      swfdt->FitsSwapFile().ShareFitsPtr(is);
     227    int_8 swp = 1;
     228   
     229    while (swp < nbrows) {
     230      swpos.push_back(swp); swp += segsz;
     231    }
     232  }
     233
    206234  // --ATTENTION-- repcnt (contenu=vecteur) pas pris en compte pour le moment
    207235  for(sa_size_t k=0; k<colnames.size(); k++) {
     
    211239    case TUSHORT :
    212240    case TINT :
    213       dt->AddIntegerColumn(colnames[k]);
     241      if (swfdt)
     242        swfdt->AddColRd(BaseDataTable::IntegerField, colnames[k], k+1, &swpos);
     243      else dobj->AddIntegerColumn(colnames[k]);
    214244      colpos.push_back(k+1);
    215245      break;
     
    219249#ifdef TLONGLONG
    220250    case TLONGLONG :
    221 #endif     
    222       dt->AddLongColumn(colnames[k]);
     251#endif
     252      if (swfdt)       
     253        swfdt->AddColRd(BaseDataTable::LongField, colnames[k], k+1, &swpos);     
     254      else dobj->AddLongColumn(colnames[k]);
    223255      colpos.push_back(k+1);
    224256      break;
    225257    case TFLOAT :
    226       dt->AddFloatColumn(colnames[k]);
     258      if (swfdt)       
     259        swfdt->AddColRd(BaseDataTable::FloatField, colnames[k], k+1, &swpos);     
     260      else dobj->AddFloatColumn(colnames[k]);
    227261      colpos.push_back(k+1);
    228262      break;
    229263    case TDOUBLE :
    230       dt->AddDoubleColumn(colnames[k]);
     264      if (swfdt)       
     265        swfdt->AddColRd(BaseDataTable::DoubleField, colnames[k], k+1, &swpos);     
     266      else dobj->AddDoubleColumn(colnames[k]);
    231267      colpos.push_back(k+1);
    232268      break;
    233269    case TCOMPLEX :
    234       dt->AddComplexColumn(colnames[k]);
     270      if (swfdt)       
     271        swfdt->AddColRd(BaseDataTable::ComplexField, colnames[k], k+1, &swpos);     
     272      else dobj->AddComplexColumn(colnames[k]);
    235273      colpos.push_back(k+1);
    236274      break;
    237275    case TDBLCOMPLEX :
    238       dt->AddDoubleComplexColumn(colnames[k]);
     276      if (swfdt)       
     277        swfdt->AddColRd(BaseDataTable::DoubleComplexField, colnames[k], k+1, &swpos);     
     278      else dobj->AddDoubleComplexColumn(colnames[k]);
    239279      colpos.push_back(k+1);
    240280      break;
    241281    case TSTRING :
    242       dt->AddStringColumn(colnames[k]);
     282      if (swfdt)       
     283        swfdt->AddColRd(BaseDataTable::StringField, colnames[k], k+1, &swpos);     
     284      else dobj->AddStringColumn(colnames[k]);
    243285      colpos.push_back(k+1);
    244286      break;
     
    252294  // ------- Mise a jour des champs Nb d'entrees, nb segments ...
    253295  dobj->mNEnt = is.GetNbRows();
     296  // Lecture DVList  (=entete FITS)
     297  is.GetHeaderRecords(dobj->Info());
     298
     299  // On ne doit pas lire les donnees de la table pour un SwFitsDataTable
     300  if (swfdt)  return;
     301
    254302  while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry())
    255303    dobj->Extend();
     
    270318      case BaseDataTable::IntegerField :
    271319        FitsBlockRW<int_4>::ReadColumnData(is, icol, l+1, 1,
    272                                             dt->mICols[sk].GetSegment(iseg), sz);
     320                                            dobj->mIColsP[sk]->GetSegment(iseg), sz);
    273321        break;
    274322      case BaseDataTable::LongField :
    275323        FitsBlockRW<int_8>::ReadColumnData(is, icol, l+1, 1,
    276                                            dt->mLCols[sk].GetSegment(iseg), sz);
     324                                           dobj->mLColsP[sk]->GetSegment(iseg), sz);
    277325        break;
    278326      case BaseDataTable::FloatField :
    279327        FitsBlockRW<r_4>::ReadColumnData(is, icol, l+1, 1,
    280                                          dt->mFCols[sk].GetSegment(iseg), sz);
     328                                         dobj->mFColsP[sk]->GetSegment(iseg), sz);
    281329        break;
    282330      case BaseDataTable::DoubleField :
    283331      case BaseDataTable::DateTimeField :
    284332        FitsBlockRW<r_8>::ReadColumnData(is, icol, l+1, 1,
    285                                          dt->mDCols[sk].GetSegment(iseg), sz);
     333                                         dobj->mDColsP[sk]->GetSegment(iseg), sz);
    286334        break;
    287335      case BaseDataTable::ComplexField :
    288336        FitsBlockRW< complex<r_4> >::ReadColumnData(is, icol, l+1, 1,
    289                                                     dt->mYCols[sk].GetSegment(iseg), sz);
     337                                                    dobj->mYColsP[sk]->GetSegment(iseg), sz);
    290338        break;
    291339      case BaseDataTable::DoubleComplexField :
    292340        FitsBlockRW< complex<r_8> >::ReadColumnData(is, icol, l+1, 1,
    293                                                     dt->mZCols[sk].GetSegment(iseg), sz);
     341                                                    dobj->mZColsP[sk]->GetSegment(iseg), sz);
    294342        break;
    295343      case BaseDataTable::StringField :
    296344        FitsBlockRW<std::string>::ReadColumnData(is, icol, l+1, 1,
    297                                                  dt->mSCols[sk].GetSegment(iseg), sz);
     345                                                 dobj->mSColsP[sk]->GetSegment(iseg), sz);
    298346        break;
    299347      default:
     
    303351  }
    304352
    305   // Mise a jour nombre d'entree
    306   // Lecture DVList   
    307   is.GetHeaderRecords(dobj->Info());
    308353}
    309354
Note: See TracChangeset for help on using the changeset viewer.