Changeset 3069 in Sophya for trunk/SophyaExt


Ignore:
Timestamp:
Sep 8, 2006, 4:30:31 PM (19 years ago)
Author:
ansari
Message:

Correction plusieurs bugs lies a SwFitsDataTable - Reza 08/09/2006

Location:
trunk/SophyaExt/FitsIOServer
Files:
5 edited

Legend:

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

    r2963 r3069  
    188188
    189189  // Determination de la taille de segment
    190   sa_size_t segsz = is.GetNbRows() / 16; // Taille de segment par defaut
     190  sa_size_t segsz = is.GetNbRows() / 64; // Taille de segment par defaut
    191191  if (segsz > 2048) segsz = 2048;
    192192  string key = "SEGMSIZE";
    193193  bool knex = false;
    194194  string ssegsz = is.KeyValue(key, knex);
    195   if (!knex && (ssegsz.length() > 0))  segsz = atoi(ssegsz.c_str());
     195  bool fgsss = false;
     196  if (!knex && (ssegsz.length() > 0))  { segsz = atoi(ssegsz.c_str());  fgsss = true; }
    196197  if (segsz < 16) segsz = 16;
    197198
     
    205206
    206207  if (dobj == NULL) { // On cree la table si besoin
     208    /*
     209      Reza, Sep06 : On ne cree pas automatiquement un SwFitsDataTable -
     210      En effet, on ne peut garantir que l'objet FitsInOutFile is reste
     211      valide pendant toute la duree de vie de l'objet SwFitsDataTable
     212
    207213    string key = "SOPCLSNM";
    208214    string clsnm = is.KeyValue(key);
    209     if ( (clsnm == "SOPHYA::SwFitsDataTable") || (nbrows*colnames.size() < 10000000) )
     215        if ( (clsnm == "SOPHYA::SwFitsDataTable") || (nbrows*colnames.size() < 10000000) )
    210216      dobj = new DataTable(segsz);
    211     else dobj = new SwFitsDataTable(is, segsz, false);
     217    else {
     218      dobj = new SwFitsDataTable(segsz);
     219      // dobj = new SwFitsDataTable(is, segsz, false);
     220      // Reza, Sep2006: Ce constructeur de SwFitsDataTable lit l'entete
     221      // et initialise donc l'objet SwFitsDataTable  -> return
     222      // return;
     223    }
     224    */
     225    dobj = new DataTable(segsz);
    212226  }
    213227  else {
    214228    dobj->Clear();  // On efface la table sinon
    215     dobj->mSegSz = segsz;
     229    if (fgsss)  dobj->mSegSz = segsz;
    216230  }
    217231
     
    221235
    222236  vector<int_8> swpos;
     237  segsz = dobj->mSegSz;
     238  int_8 swp = 1;
     239  while (swp < nbrows) {
     240    swpos.push_back(swp); swp += segsz;
     241  }
    223242  // Initialize the fits swap stream for SwFitsDataTable if necessary
    224243  if (swfdt)  {
    225     if ( swfdt->FitsSwapFile().FitsPtr() != is.FitsPtr() )
     244    if ( swfdt->FitsSwapFile().FitsPtr() != is.FitsPtr() ) {
     245      //      swfdt->FitsSwapFile().Close();
     246      //      swfdt->FitsSwapFile().Open(is.FileName().c_str(), FitsInOutFile::Fits_RO);
     247      //      swfdt->FitsSwapFile().MoveAbsToHDU(is.CurrentHDU());
    226248      swfdt->FitsSwapFile().ShareFitsPtr(is);
    227     int_8 swp = 1;
    228    
    229     while (swp < nbrows) {
    230       swpos.push_back(swp); swp += segsz;
    231249    }
    232250  }
     
    303321
    304322  // On ne doit pas lire les donnees de la table pour un SwFitsDataTable
    305   if (swfdt)  return;
     323  if (swfdt) {
     324    swfdt->mNSeg = swpos.size();
     325    return;
     326  }
    306327
    307328  while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry())
  • trunk/SophyaExt/FitsIOServer/fitsinoutfile.cc

    r3047 r3069  
    203203void FitsInOutFile::Close()
    204204{
    205   if (ownfptr == false) return;
    206205  if (fptr_ == NULL) return;
     206  if (ownfptr == false) {
     207    fptr_ = NULL; return;
     208  }
    207209  int status = 0;
    208210  if (mode_ == Fits_Create) {
  • trunk/SophyaExt/FitsIOServer/fitsswapper.h

    r2896 r3069  
    1111#include "fitsinoutfile.h"
    1212#include "fitsblkrw.h"
     13
     14#include "basedtable.h"
    1315
    1416/*!
     
    2527public:
    2628  FITSDataSwapper()
    27     : fcol(0) , rowos(1)
     29    : fcol(0) , rowos(1) , dtp(NULL)
    2830  {
    2931  }
    30   FITSDataSwapper(FitsInOutFile & ios, int col)
    31     : fios(ios) , fcol(col), rowos(1)
     32  FITSDataSwapper(FitsInOutFile & ios, int col, BaseDataTable* dt=NULL)
     33    : fios(ios) , fcol(col), rowos(1) , dtp(dt)
    3234  {
    3335  }
    3436
    3537  inline FitsInOutFile & InOutStream() { return fios; }
     38
    3639  void SetInOutStream(FitsInOutFile & ios, int col)
    3740  {
     
    5356    fcol = a.fcol;
    5457    rowos = a.rowos;
     58    dtp = a.dtp;
    5559  }
    5660
     
    6064    long row = rowos;
    6165    if (osw)  row = oswp;
     66    if (dtp != NULL)
     67       if ((row+sz-1) > dtp->NRows() )  sz = dtp->NRows()-row+1;
    6268    FitsBlockRW<T>::WriteColumnData(fios, fcol, row, 1, d, sz);
    6369    if (!osw) rowos += sz;
     
    6773  virtual void  ReadFromSwap(int_8 idx, int_8 swp, T* d, size_t sz)
    6874  {
     75    long nrows = fios.GetNbRows();
     76    size_t szi = sz;
     77    if ((swp+sz-1) > nrows) sz = nrows-swp+1; 
    6978    FitsBlockRW<T>::ReadColumnData(fios, fcol, swp, 1, d, sz);
     79    if (sz < szi) {
     80      T zz = d[sz-1];
     81      for(size_t k=sz; k<szi; k++)  d[k] = zz;
     82    }
    7083  }
    7184
    7285  virtual DataSwapperInterface<T>* Clone()
    7386  {
    74     FITSDataSwapper<T> * rsw = new FITSDataSwapper<T>(fios, fcol) ;
     87    FITSDataSwapper<T> * rsw = new FITSDataSwapper<T>(fios, fcol, dtp) ;
     88    rsw->rowos = rowos;
     89    rsw->dtp = dtp;   
    7590    return rsw;
    7691  }
     
    8095  int fcol;
    8196  long rowos;
     97  BaseDataTable* dtp;
    8298};
    8399
  • trunk/SophyaExt/FitsIOServer/swfitsdtable.cc

    r3032 r3069  
    7070  mFgCreate = false;
    7171}
    72 /*! Constructor with the specification of the output swap stream -
    73     and optional specification of block (or segment) size
     72/*!
     73  \brief Construcor with specification of the \b FitsInOutFile swap stream.
     74  if fgcreate == true, creates an empty table (the fits file should then be
     75  opened for writing).
     76  if fgcreate == false , the table is initialized (read in) from the current HDU.
    7477*/
    7578SwFitsDataTable::SwFitsDataTable(FitsInOutFile & os, sa_size_t segsz, bool fgcreate)
     
    8285  }
    8386}
     87
     88/*!
     89  \brief Construcor with specification of the FITS file name.
     90  if fgcreate == false , the FITS file is opened and the table is
     91  initialized (read in) from HDU \b hdunum
     92*/
     93SwFitsDataTable::SwFitsDataTable(string fitsname, int hdunum, sa_size_t segsz)
     94  : BaseDataTable(segsz) ,
     95    mSwF(fitsname, FitsInOutFile::Fits_RO)
     96{
     97  // Lecture de la table
     98  FitsHandler<BaseDataTable> fio(*this);
     99  mSwF.MoveAbsToHDU(hdunum);
     100  fio.Read(mSwF);
     101}
     102
    84103//! copy constructor - shares the data
    85104SwFitsDataTable::SwFitsDataTable(SwFitsDataTable const & a)
     
    158177void SwFitsDataTable::SwapOutAll() const
    159178{
     179  if (NRows() < 1) return;
    160180  // Et on vide les buffers de swap
    161181  for (size_t kk=0; kk<mNames.size(); kk++) {
     
    185205      break;
    186206    default:
    187       throw ForbiddenError("SwFitsDataTable::Share() : unknown column type ");
     207      throw ForbiddenError("SwFitsDataTable::SwapOutAll() : unknown column type ");
    188208    break;
    189209    }
     
    261281  {
    262282    ser = mICols.size();
    263     FITSDataSwapper<int_4> ISwapper(mSwF, colidx);
     283    FITSDataSwapper<int_4> ISwapper(mSwF, colidx, this);
    264284    if (swpos)
    265285      mICols.push_back(SwSegDataBlock<int_4>(ISwapper, *swpos, mSegSz));
     
    275295  {
    276296    ser = mLCols.size();
    277     FITSDataSwapper<int_8> LSwapper(mSwF, colidx);
     297    FITSDataSwapper<int_8> LSwapper(mSwF, colidx, this);
    278298    if (swpos)   
    279299      mLCols.push_back(SwSegDataBlock<int_8>(LSwapper, *swpos, mSegSz));
     
    289309  {
    290310    ser = mFCols.size();
    291     FITSDataSwapper<r_4> FSwapper(mSwF, colidx);
     311    FITSDataSwapper<r_4> FSwapper(mSwF, colidx, this);
    292312    if (swpos)   
    293313      mFCols.push_back(SwSegDataBlock<r_4>(FSwapper, *swpos, mSegSz));
     
    304324  {
    305325    ser = mDCols.size();
    306     FITSDataSwapper<r_8> DSwapper(mSwF, colidx);
     326    FITSDataSwapper<r_8> DSwapper(mSwF, colidx, this);
    307327    if (swpos)   
    308328      mDCols.push_back(SwSegDataBlock<r_8>(DSwapper, *swpos, mSegSz));
     
    318338  {
    319339    ser = mYCols.size();
    320     FITSDataSwapper< complex<r_4> > YSwapper(mSwF, colidx);
     340    FITSDataSwapper< complex<r_4> > YSwapper(mSwF, colidx, this);
    321341    if (swpos)   
    322342      mYCols.push_back(SwSegDataBlock< complex<r_4> >(YSwapper, *swpos, mSegSz));
     
    332352  {
    333353    ser = mZCols.size();
    334     FITSDataSwapper< complex<r_8> > ZSwapper(mSwF, colidx);
     354    FITSDataSwapper< complex<r_8> > ZSwapper(mSwF, colidx, this);
    335355    if (swpos)   
    336356      mZCols.push_back(SwSegDataBlock< complex<r_8> >(ZSwapper, *swpos, mSegSz));
     
    346366  {
    347367    ser = mSCols.size();
    348     FITSDataSwapper< string > SSwapper(mSwF, colidx);
     368    FITSDataSwapper< string > SSwapper(mSwF, colidx, this);
    349369    if (swpos)   
    350370      mSCols.push_back(SwSegDataBlock< string >(SSwapper, *swpos, mSegSz));
  • trunk/SophyaExt/FitsIOServer/swfitsdtable.h

    r3032 r3069  
    1111#include "fitsswapper.h"
    1212
     13#include "fitshandler.h"
    1314
    1415namespace SOPHYA {
     
    1920  SwFitsDataTable(sa_size_t segsz=512);
    2021  SwFitsDataTable(FitsInOutFile & os, sa_size_t segsz=512, bool fgcreate=true);
     22  SwFitsDataTable(string fitsname, int hdunum=2, sa_size_t segsz=512);
    2123  SwFitsDataTable(SwFitsDataTable const& a);
    2224
     
    7173  bool mFgCreate; // true -> creation de table, false -> lecture
    7274};
     75
    7376 
    7477} // namespace SOPHYA
Note: See TracChangeset for help on using the changeset viewer.