Changeset 2889 in Sophya


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

Location:
trunk/SophyaExt/FitsIOServer
Files:
3 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
  • trunk/SophyaExt/FitsIOServer/swfitsdtable.cc

    r2865 r2889  
    11#include "swfitsdtable.h"
     2#include "fitshdtable.h"
    23#include "sopnamsp.h"
    34#include "pexceptions.h"
     
    1920   - It is not possible to make a complete (deep) copy of a SwFitsDataTable
    2021   Copy constructor and equal operator shares the data.
     22   - The min/max values for column data are not updated when reading from a fits file.
     23   In this case, the Show() method (or ostream& << operator) will compute min/max
     24   values. This operation will take some time for large tables.
    2125
    2226   \sa SOPHYA::MuTyV
     
    2630
    2731   \code
    28    #include "swppfdtable.h"
     32   #include "swfitsdtable.h"
    2933   // ...
    3034   {
    3135   // ---- Creation of the table
    3236   // Create the swap stream
    33    POutPersist so("myswtable.ppf");
    34    SwFitsDataTable dt(so, 64);
     37   FitsInOutFile so("myswtable.fits", FitsInOutFile::Fits_Create);
     38   SwFitsDataTable dt(so, 16);
    3539   // define table columns
    3640   dt.AddFloatColumn("X0_f");
     
    3842   dt.AddDoubleColumn("X0X0pX1X1_d");
    3943   // Fill the table
    40    MuTyV x[5];
     44   r_8 x[5];
    4145   for(int i=0; i<63; i++) {
    4246     x[0] = (i%9)-4.;  x[1] = (i/9)-3.;  x[2] = x[0]*x[0]+x[1]*x[1];
     
    4549   // Printing table info
    4650   cout << dt ;
    47    // Swap out all data and write the table structure to the PPF stream
    48    so << dt ;
    49    // ....
     51   // The destructor will Swap out  data still in memory
    5052   }
    5153   {
    5254   // ---- Accessing information from a previously created table
    5355   SwFitsDataTable dt;
    54    PInPersist si("myswtable.ppf");
     56   FitsInOutFile si("myswtable.fits", FitsInOutFile::Fits_ReadOnly);
     57   // Position the fits file on the first extension (BinTable)
     58   si.MoveAbsToHDU(2); 
     59   // Reading in the table (initialisation)
    5560   si >> dt;
    56    // Printing table info
     61   // Printing table info 
    5762   cout << dt ;   
    5863   }
     
    7277    mSwF(os) , mFgCreate(fgcreate)
    7378{
     79  if (!fgcreate) {   // Lecture de la table
     80    FitsHandler<BaseDataTable> fio(*this);
     81    fio.Read(os);
     82  }
    7483}
    7584//! copy constructor - shares the data
     
    8392SwFitsDataTable::~SwFitsDataTable()
    8493{
    85   if (mFgCreate) SwapOutAll();
     94  if (mFgCreate) {
     95    SwapOutAll();
     96    // Ecriture de SegmentSize et autre elements de DVList 
     97    mSwF.WriteHeaderRecords(Info());
     98    MuTyV mtv = SegmentSize();
     99    mSwF.WriteKey("SEGMSIZE",mtv," SOPHYA::DataTable SegmentSize");
     100    mtv = "SOPHYA::SwFitsDataTable";
     101    mSwF.WriteKey("SOPCLSNM",mtv," Object class name ");
     102  }
    86103}
    87104
     
    213230  mSCols.clear();
    214231
    215   /*
    216   mISwapper.clear();
    217   mLSwapper.clear();
    218   mFSwapper.clear();
    219   mDSwapper.clear();
    220   mYSwapper.clear();
    221   mZSwapper.clear();
    222   mSSwapper.clear();
    223   */
    224232}
    225233
     
    232240sa_size_t SwFitsDataTable::AddColumn(FieldType ft, string const & cnom)
    233241{
    234   return AddColRd(ft, cnom, NULL);
     242  return AddColRd(ft, cnom, -1, NULL);
    235243}
    236244/*!
     
    240248*/
    241249sa_size_t SwFitsDataTable::AddColRd(FieldType ft, string const & cnom,
    242                                     vector<int_8> const * swpos)
     250                                    int colidx, vector<int_8> const * swpos)
    243251{
    244252  if (NEntry() > 0)
     
    247255  sa_size_t ser;
    248256  sa_size_t idx = NVar();
     257  if (colidx < 1) colidx = idx+1;
     258
    249259  switch (ft) {
    250260  case IntegerField :
    251261  {
    252262    ser = mICols.size();
    253     FITSDataSwapper<int_4> ISwapper(mSwF, idx+1);
     263    FITSDataSwapper<int_4> ISwapper(mSwF, colidx);
    254264    if (swpos)
    255265      mICols.push_back(SwSegDataBlock<int_4>(ISwapper, *swpos, mSegSz));
     
    265275  {
    266276    ser = mLCols.size();
    267     FITSDataSwapper<int_8> LSwapper(mSwF, idx+1);
     277    FITSDataSwapper<int_8> LSwapper(mSwF, colidx);
    268278    if (swpos)   
    269279      mLCols.push_back(SwSegDataBlock<int_8>(LSwapper, *swpos, mSegSz));
     
    279289  {
    280290    ser = mFCols.size();
    281     FITSDataSwapper<r_4> FSwapper(mSwF, idx+1);
     291    FITSDataSwapper<r_4> FSwapper(mSwF, colidx);
    282292    if (swpos)   
    283293      mFCols.push_back(SwSegDataBlock<r_4>(FSwapper, *swpos, mSegSz));
     
    294304  {
    295305    ser = mDCols.size();
    296     FITSDataSwapper<r_8> DSwapper(mSwF, idx+1);
     306    FITSDataSwapper<r_8> DSwapper(mSwF, colidx);
    297307    if (swpos)   
    298308      mDCols.push_back(SwSegDataBlock<r_8>(DSwapper, *swpos, mSegSz));
     
    308318  {
    309319    ser = mYCols.size();
    310     FITSDataSwapper< complex<r_4> > YSwapper(mSwF, idx+1);
     320    FITSDataSwapper< complex<r_4> > YSwapper(mSwF, colidx);
    311321    if (swpos)   
    312322      mYCols.push_back(SwSegDataBlock< complex<r_4> >(YSwapper, *swpos, mSegSz));
     
    322332  {
    323333    ser = mZCols.size();
    324     FITSDataSwapper< complex<r_8> > ZSwapper(mSwF, idx+1);
     334    FITSDataSwapper< complex<r_8> > ZSwapper(mSwF, colidx);
    325335    if (swpos)   
    326336      mZCols.push_back(SwSegDataBlock< complex<r_8> >(ZSwapper, *swpos, mSegSz));
     
    336346  {
    337347    ser = mSCols.size();
    338     FITSDataSwapper< string > SSwapper(mSwF, idx+1);
     348    FITSDataSwapper< string > SSwapper(mSwF, colidx);
    339349    if (swpos)   
    340350      mSCols.push_back(SwSegDataBlock< string >(SSwapper, *swpos, mSegSz));
     
    368378/*!
    369379  The min/max values for each column is updated, in addition
    370   to the actions performed by the base class AddLine()
    371 */
    372 sa_size_t SwFitsDataTable::AddLine(const r_8* data)
    373 {
     380  to the actions performed by the base class AddRow()
     381*/
     382sa_size_t SwFitsDataTable::AddRow(const r_8* data)
     383{
     384  if (NRows() == 0) {  // On cree la definition de la table FITS au premier appel
     385    FitsHandler<BaseDataTable> fio(*this);
     386    fio.Write(mSwF);
     387  }
    374388  // On est oblige de calculer les min-max lors du remplissage
    375389  // On ne peut pas en effet 'relire' le swap pendant l'ecriture
     
    380394    mMinMaxNEnt[k]++;
    381395  }
    382   return BaseDataTable::AddLine(data);
    383 }
    384 
    385 //! Adds a line (or row to the table) with input data as an array of MuTyV
     396  return BaseDataTable::AddRow(data);
     397}
     398
     399//! Adds a row (or line to the table) with input data as an array of MuTyV
    386400/*!
    387401  The min/max values for each column is updated, in addition
    388   to the actions performed by the base class AddLine()
    389 */
    390 sa_size_t SwFitsDataTable::AddLine(const MuTyV * data)
    391 {
     402  to the actions performed by the base class AddRow()
     403*/
     404sa_size_t SwFitsDataTable::AddRow(const MuTyV * data)
     405{
     406  if (NRows() == 0) {  // On cree la definition de la table FITS au premier appel
     407    FitsHandler<BaseDataTable> fio(*this);
     408    fio.Write(mSwF);
     409  }
    392410  // On est oblige de calculer les min-max lors du remplissage
    393411  // On ne peut pas en effet 'relire' le swap pendant l'ecriture
     
    398416    mMinMaxNEnt[k]++;
    399417  }
    400   return BaseDataTable::AddLine(data);
    401 }
    402 
     418  return BaseDataTable::AddRow(data);
     419}
     420
  • trunk/SophyaExt/FitsIOServer/swfitsdtable.h

    r2865 r2889  
    2626
    2727  // Filling data structures (adding lines)
    28   virtual sa_size_t AddLine(const r_8* data);
    29   virtual sa_size_t AddLine(const MuTyV * data);
     28  virtual sa_size_t AddRow(const r_8* data);
     29  virtual sa_size_t AddRow(const MuTyV * data);
    3030
    31   //! Equal (copy) operator - Copies the structure and shares the data \b a   
     31   //! Equal (copy) operator - Copies the data and the structure from \b a   
     32  inline  SwFitsDataTable& operator = (BaseDataTable const& a)
     33  { CopyMerge(a, true) ; return *this ; }
     34 //! Equal (copy) operator - Copies the structure and shares the data \b a   
    3235  inline SwFitsDataTable& operator = (SwFitsDataTable const& a)
    3336  { Clear(); Share(a); return *this ; }
    3437
     38  //! Acces the FitsInOutFile swap stream
     39  inline FitsInOutFile& FitsSwapFile() { return mSwF; }
    3540 
    3641  //! Reset(Clear) the table content and structure
     
    4752  void Share(SwFitsDataTable const & a);
    4853  // Methode pour utilisation par FitsHandler<BaseDataTable>
    49   sa_size_t AddColRd(FieldType ft, string const & cnom, vector<int_8> const * swpos=NULL);
     54  sa_size_t AddColRd(FieldType ft, string const & cnom, int colidx=-1,
     55                     vector<int_8> const * swpos=NULL);
    5056
    5157
Note: See TracChangeset for help on using the changeset viewer.