Changeset 2831 in Sophya for trunk/SophyaLib/HiStats


Ignore:
Timestamp:
Nov 8, 2005, 5:16:44 PM (20 years ago)
Author:
ansari
Message:

1/ Prise en charge champ de type DateTimeField ds BaseDataTable , DataTable, SwPPFDataTable
2/ Methodes BaseDataTable completees - en particulier Print/WriteASCII, et
decodage de fichiers ASCII

Reza, 8 Nov 2005

Location:
trunk/SophyaLib/HiStats
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/HiStats/basedtable.cc

    r2827 r2831  
    1111*/
    1212
     13/*!
     14  if fgl == true , return LongForm string
     15  \verbatim
     16  ---------------------------------------------- 
     17  FieldType         ShortForm     LongForm
     18  ---------------------------------------------- 
     19  IntegerField          I         Integer
     20  LongField             L         Long Integer
     21  FloatField            F         Float
     22  DoubleField           D         Double
     23  ComplexField         Zx4        Complex
     24  DoubleComplexField   Zx8        DoubleComplex
     25  StringField           S         String
     26  DateTimeField         T         DateTime
     27  ---------------------------------------------- 
     28  \endverbatim
     29*/
    1330string BaseDataTable::ColTypeToString(FieldType ft, bool fgl)
    1431{
     
    4360    else rs = "S";
    4461    break;
    45   case DateField :
     62  case DateTimeField :
    4663    if (fgl) rs = "DateTime";
    4764    else rs = "T";
     
    5269  }
    5370  return rs;
     71}
     72
     73BaseDataTable::FieldType BaseDataTable::StringToColType(string const & sctyp)
     74{
     75  if ( (sctyp == "Integer") || (sctyp == "I") )  return IntegerField;
     76  else if ( (sctyp == "Long Integer") || (sctyp == "L") )  return LongField;
     77  else if ( (sctyp == "Float") || (sctyp == "F") )  return FloatField;
     78  else if ( (sctyp == "Double") || (sctyp == "D") )  return DoubleField;
     79  else if ( (sctyp == "Complex") || (sctyp == "Zx4") )  return ComplexField;
     80  else if ( (sctyp == "DoubleComplex") || (sctyp == "Zx8") || (sctyp == "Z") ) 
     81    return DoubleComplexField;
     82  else if ( (sctyp == "String") || (sctyp == "S") )  return StringField;
     83  else if ( (sctyp == "DateTime") || (sctyp == "T") )  return DateTimeField;
     84  else return DoubleField;
    5485}
    5586
     
    252283}
    253284
     285#define BADVAL -1.e39
     286
     287TVector<r_8> BaseDataTable::GetColumnD(sa_size_t k) const
     288{
     289  if ((k < 0) || (k >= NVar()))
     290    throw RangeCheckError("BaseDataTable::GetColumnD() out of range column index k");
     291  sa_size_t sk = mNames[k].ser;
     292  sa_size_t i = 0;
     293  TVector<r_8> rv(NEntry());
     294
     295  for (sa_size_t is=0; is<NbSegments(); is++) {
     296    switch (mNames[k].type) {
     297    case IntegerField :
     298      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     299        rv(i) = mIColsP[sk]->GetCstSegment(is)[j];
     300      break;
     301    case LongField :
     302      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     303        rv(i) = mLColsP[sk]->GetCstSegment(is)[j];
     304      break;
     305    case FloatField :
     306      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     307        rv(i) = mFColsP[sk]->GetCstSegment(is)[j];
     308      break;
     309    case DoubleField :
     310    case DateTimeField :
     311      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     312        rv(i) = mDColsP[sk]->GetCstSegment(is)[j];
     313      break;
     314    case ComplexField :
     315      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     316        rv(i) = mYColsP[sk]->GetCstSegment(is)[j].real();
     317      break;
     318    case DoubleComplexField :
     319      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     320        rv(i) = mZColsP[sk]->GetCstSegment(is)[j].real();
     321      break;
     322    case StringField :
     323      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     324        rv = atof(mSColsP[sk]->GetCstSegment(is)[j].c_str());
     325      break;
     326    default:
     327      for(sa_size_t j=0; j<SegmentSize(); j++,i++)  rv(i) = BADVAL;
     328      break;
     329    }
     330  }
     331  return rv ;
     332}
     333
    254334void BaseDataTable::CopyMerge(BaseDataTable const& a, bool cp)
    255335{
     
    276356}
    277357
    278 void BaseDataTable::Print(int num, int nmax) const
    279 {
    280   // A faire
    281   return;
     358/*!
     359  Formatted (text) output of the table, for lines lstart <= l_index < lend , with step lstep
     360  \param os : output stream (formatted output)
     361  \param lstart : start row (line) index
     362  \param lend : end row (line) index
     363  \param lstep : row index increment
     364*/
     365ostream& BaseDataTable::Print(ostream& os, sa_size_t lstart, sa_size_t lend, sa_size_t lstep) const
     366{
     367  os << "##### BaseDataTable::Print() - Table(NRow=" << NEntry() << " , NCol="
     368     << NVar() << ") ##### " << endl;
     369  os << "#! " ;
     370  for (size_t i=0; i<NVar(); i++) {
     371    string nom = mNames[i].nom;
     372    nom += ':'; nom += ColTypeToString(mNames[i].type);
     373    os << setw(12) << nom << " ";
     374  }
     375  os << endl;
     376  os << "##########################################################################" << endl;
     377  for (sa_size_t l=lstart; l<lend; l+=lstep)
     378    os << TableRowToString(l, true) << endl;
     379  return os;
    282380}
    283381
     
    312410}
    313411
    314 //! NOT YET IMPLEMENTED ! - Fills table from an ascii file
    315 int    BaseDataTable::FillFromASCIIFile(string const& fn)
    316 //      Remplit le ntuple a partir d'un fichier ASCII.
    317 //      Renvoie le nombre de lignes ajoutees.
    318 {
    319 // a faire
    320 return(0);
     412//! Fills table from an ascii (text) file
     413/*
     414  Return number of non empt lines (added to table)
     415  \param is : input ascii (text) stream
     416  \param clm : Lines starting with clm are ignored (comments)
     417  \param sep : separator between different fields (columns)
     418*/
     419sa_size_t  BaseDataTable::FillFromASCIIFile(istream& is, char clm, const char* sep)
     420{
     421  string str;
     422  if (mVarMTV == NULL) mVarMTV = new MuTyV[NVar()];
     423  sa_size_t iv, nl;
     424  nl = 0;
     425  while (!is.eof()) {
     426    str = "";
     427    getline(is, str);
     428    if (is.good() || is.eof()) {
     429      size_t l = str.length();
     430      if ((l == 0) || (str[0]==clm)) continue;
     431      for(iv=0; iv<NVar(); iv++) mVarMTV[iv] = 0.;
     432      iv = 0;
     433      size_t q = 0;
     434      size_t p = 0;
     435      while ( (q < l) && (iv < NVar()) ) {
     436        p = str.find_first_not_of(sep,q);
     437        if (p >= l)  break;
     438        if (str[p] == '\'')    {  // Decodage d'un string
     439          q = str.find('\'',p+1);
     440          if (q < l)  {
     441            mVarMTV[iv] = str.substr(p+1,q-p-1);
     442            q++;
     443          }
     444          else mVarMTV[iv] = str.substr(p+1,l-p-1);
     445          iv++;
     446        }
     447        else {
     448          q = str.find_first_of(sep,p);
     449          if (q > l) q = l;
     450          mVarMTV[iv] = str.substr(p,q-p);
     451          iv++;
     452        }
     453        if (mNames[iv-1].type == DateTimeField) {
     454          string tts = (string)mVarMTV[iv-1];
     455          mVarMTV[iv-1] = TimeStamp(tts);
     456        }
     457      }
     458      AddLine(mVarMTV);
     459      nl++;
     460    }
     461  }  // Fin boucle lignes fichier
     462  cout << "BaseDataTable::FillFromASCIIFile()/Info: " << nl << " lines decoded from stream " << endl;
     463  return(nl);
    321464}
    322465
     
    364507}
    365508
    366 #define BADVAL -1.e39
    367509
    368510r_8  BaseDataTable::GetCell(sa_size_t n, sa_size_t k) const
     
    388530    break;
    389531  case DoubleField :
    390   case DateField :
    391    rv = mDColsP[sk]->GetCstSegment(bid)[off];
     532  case DateTimeField :
     533    rv = mDColsP[sk]->GetCstSegment(bid)[off];
    392534    break;
    393535  case ComplexField :
     
    445587    rv = mSColsP[sk]->GetCstSegment(bid)[off];
    446588    break;
     589  case DateTimeField :
     590    rv = TimeStamp(mDColsP[sk]->GetCstSegment(bid)[off]);
     591    break;
    447592  default:
    448593    rv = " ";
     
    511656    break;
    512657  case DoubleField :
     658  case DateTimeField :
    513659    for(size_t is=0; is<mDColsP[sk]->NbSegments(); is++) {
    514660      const r_8* sp = mDColsP[sk]->GetCstSegment(is);
     
    608754  for(int i=0; i<NVar(); i++) {
    609755    s = mNames[i].nom;
    610     s += ' ';
    611756    size_t l = s.length();
    612     for(size_t ii=l; ii<10; ii++) s += ' ';
     757    for(size_t ii=l; ii<12; ii++) s += ' ';
     758    if (i > 0) rets += ' ';   
    613759    rets += s;
    614760  }
     
    616762}
    617763
    618 
    619 string BaseDataTable::LineToString(sa_size_t n) const
     764/*!
     765  Return a table row (line) as a string
     766  \sa TableRowToString()
     767*/
     768string BaseDataTable::LineToString(sa_size_t n) const
     769{
     770  return TableRowToString(n, false);
     771}
     772
     773/*!
     774  \param n : table row index ( 0 ... NEntry()-1)
     775  \param qstr : if true , enclose strings in quotes ''
     776  \param sep : separates fields using \b sep
     777  \param fw : minimum field width
     778 */
     779string BaseDataTable::TableRowToString(sa_size_t n, bool qstr,
     780                                       const char* sep, int fw) const
    620781{
    621782  if ((n < 0) || (n >= NEntry()))
     
    648809    case StringField :
    649810      rv = mSColsP[sk]->GetCstSegment(bid)[off];
    650     break;
     811      break;
     812    case DateTimeField :
     813      rv = TimeStamp(mDColsP[sk]->GetCstSegment(bid)[off]);
     814      break;
    651815    default:
    652816      rv = " ";
    653817      break;
    654818    }
    655     string s = (string)rv;
    656     s += ' ';
     819    string s;
     820    if ( (mNames[k].type == StringField) && (qstr) ) {
     821      s = '\'';  s += (string)rv; s += '\'';
     822    }
     823    else  s= (string)rv;
    657824    size_t l = s.length();
    658     for(size_t ii=l; ii<10; ii++) s += ' ';
     825    for(size_t ii=l; ii<fw; ii++) s += ' ';
     826    if (k > 0) rs += sep;
    659827    rs += s;
    660828  }
  • trunk/SophyaLib/HiStats/basedtable.h

    r2827 r2831  
    1818#include "dvlist.h"
    1919#include "segdatablock.h"
     20#include "tvector.h"
    2021
    2122namespace SOPHYA {
     
    3132                  FloatField=3, DoubleField=4,
    3233                  ComplexField=5, DoubleComplexField=6,
    33                   StringField=7, DateField=8};
     34                  StringField=7, DateTimeField=8};
    3435  // <=====================================================>
    3536
     37  //! Return the column type as a string (long or short depending on fgl=true/false)
    3638  static string     ColTypeToString(FieldType ft, bool fgl=false);
     39  //! Return the column type corresponding to \b sctyp
     40  static FieldType  StringToColType(string const & sctyp);
    3741
    3842  // constructeur , destructeur
     
    8286  inline sa_size_t  AddStringColumn(string const & cnom)
    8387  { return AddColumn(StringField, cnom); }
     88  //! Adds a column holding Date/Time value, named \b cnom
     89  inline sa_size_t  AddDateTimeColumn(const char * cnom)
     90  { return AddColumn(DateTimeField, cnom); }
     91  //! Adds a column holding Date/Time value, named \b cnom
     92  inline sa_size_t  AddDateTimeColumn(string const & cnom)
     93  { return AddColumn(DateTimeField, cnom); }
    8494 
    8595  inline sa_size_t  AddColumn(FieldType ft, const char * cnom)
     
    124134  virtual MuTyV *   GetLine(sa_size_t n) const ;
    125135
     136  //! Return the information stored in column \b k of the table, converted to double
     137  virtual TVector<r_8>  GetColumnD(sa_size_t k) const ;
     138
     139  //! Return the information stored in column named \b nom of the table, converted to double
     140  inline TVector<r_8>  GetColumnD(char const * nom) const
     141  { return  GetColumnD(IndexNom(nom)) ; }
     142  //! Return the information stored in column named \b nom of the table, converted to double
     143  inline TVector<r_8>  GetColumnD(string const & nom) const
     144  { return  GetColumnD(IndexNom(nom)) ; }
     145
    126146  //! Return the index for column name \b nom 
    127147  sa_size_t         IndexNom(char const* nom) const ;
     
    146166  virtual void Clear() = 0;
    147167
    148   //! Prints the table content - NOT YET IMPLEMENTED !
    149   void              Print(int num, int nmax=1) const ;
    150  
    151 //! Prints table definition and number of entries
     168  //! Prints  the table content (ascii dump)
     169  virtual ostream&  Print(ostream& os, sa_size_t lstart, sa_size_t lend,
     170                          sa_size_t lstep=1) const ;
     171  //! Prints  the table content (ascii dump) on stream \b os
     172  inline ostream&   Print(ostream& os) const
     173  { return Print(os, 0, NEntry(), 1); }
     174  //! Prints  the table content (ascii dump) on stream \b os
     175  inline ostream&   WriteASCII(ostream& os) const
     176  { return Print(os, 0, NEntry(), 1); }
     177
     178 
     179  //! Prints table definition and number of entries
    152180  void              Show(ostream& os) const ;
    153181  //! Prints table definition and number of entries on the standard output stream \b cout
    154182  inline void       Show() const { Show(cout) ; }
    155183 
     184  //! Return the associated DVList (info) object.
    156185  DVList&           Info() const ;
    157186 
    158187  // Remplissage depuis fichier ASCII
    159   int               FillFromASCIIFile(string const& fn);
     188  sa_size_t         FillFromASCIIFile(istream& is, char clm='#', const char* sep=" \t");
    160189 
    161190  //-------------------------------------------------------------
     
    175204  virtual string    LineHeaderToString() const;
    176205  virtual string    LineToString(sa_size_t n) const; 
     206
     207  //! Return a table row (line), formatted and converted to a string
     208  virtual string    TableRowToString(sa_size_t n, bool qstr, const char* sep=" ",
     209                                     int fw=12) const;
    177210
    178211  //  Pour la gestion de persistance PPF
  • trunk/SophyaLib/HiStats/datatable.cc

    r2827 r2831  
    7979      break;
    8080    case DoubleField :
     81    case DateTimeField :
    8182      mDCols[sk].Share(a.mDCols[ska]);
    8283      break;
     
    117118      break;
    118119    case DoubleField :
     120    case DateTimeField :
    119121      mDCols[sk].Clone(a.mDCols[ska], true);
    120122      break;
     
    214216    break;
    215217  case DoubleField :
     218  case DateTimeField :
    216219    ser = mDCols.size();
    217220    mDCols.push_back(SegDataBlock<r_8>(mSegSz));
  • trunk/SophyaLib/HiStats/fio_dtable.cc

    r2827 r2831  
    8282        break;
    8383      case BaseDataTable::DoubleField :
     84      case BaseDataTable::DateTimeField :
    8485        s << dt->mDCols[sk];
    8586        break;
     
    114115        break;
    115116      case BaseDataTable::DoubleField :
     117      case BaseDataTable::DateTimeField :
    116118        s.PutPosTagTable(swdt->mDCols[sk].GetSwapPosTagTable());
    117119        break;
     
    216218        break;
    217219      case BaseDataTable::DoubleField :
     220      case BaseDataTable::DateTimeField :
    218221        s >> dt->mDCols[sk];
    219222        break;
     
    255258        break;
    256259      case BaseDataTable::DoubleField :
     260      case BaseDataTable::DateTimeField :
    257261        swpos.clear();
    258262        s.GetPosTagTable(swpos);
  • trunk/SophyaLib/HiStats/swppfdtable.cc

    r2827 r2831  
    1717   \warning
    1818   - When creating a table, the output PPF stream (POutPersist) must not be closed
    19    (destroyed) before the call to the SwPPFDataTable object.
    20    - It is not possible to make a complete (deep) copy of a table SwPPFDataTable
     19   (destroyed) before the SwPPFDataTable object is written to the stream.
     20   - It is not possible to make a complete (deep) copy of a SwPPFDataTable
    2121   Copy constructor and equal operator shares the data.
    22    - Although the destructor  DOES NOT save the
    23    table object itself to the memory. You have to use the << operator on the
    24    output PPF stream being used as swap
     22   - The destructor  DOES NOT save the table object itself to the swap
     23   stream. The << operator should be used on the output PPF stream being
     24   used as swap in order to save the table.
    2525
    2626   \sa SOPHYA::MuTyV
     
    9292  mYSwapper.SetInStream(*pis);
    9393  mZSwapper.SetInStream(*pis);
    94   mDSwapper.SetInStream(*pis);
     94  mSSwapper.SetInStream(*pis);
    9595}
    9696
     
    163163      break;
    164164    case DoubleField :
     165    case DateTimeField :
    165166      mDCols[sk] = a.mDCols[ska];
    166167      break;
     
    196197      break;
    197198    case DoubleField :
     199    case DateTimeField :
    198200      mDCols[sk].SwapOutBuffer();
    199201      break;
     
    293295    break;
    294296  case DoubleField :
     297  case DateTimeField :
    295298    ser = mDCols.size();
    296299    mDCols.push_back(SwSegDataBlock<r_8>( mDSwapper,mSegSz));
     
    317320    break;
    318321  case StringField :
    319     ser = mDCols.size();
     322    ser = mSCols.size();
    320323    mSCols.push_back(SwSegDataBlock<string>(mSSwapper, mSegSz));
    321324    mSColIdx.push_back(idx);
     
    335338  // On est oblige de calculer les min-max lors du remplissage
    336339  // On ne peut pas en effet 'relire' le swap pendant l'ecriture
    337   mMin.push_back(0.);
    338   mMax.push_back(0.);
     340  mMin.push_back(9.E39);
     341  mMax.push_back(-9.E39);
    339342  mMinMaxNEnt.push_back(0);
    340343
Note: See TracChangeset for help on using the changeset viewer.