Changeset 2663 in Sophya for trunk/SophyaLib/HiStats/ntuple.cc


Ignore:
Timestamp:
Apr 7, 2005, 5:48:30 PM (20 years ago)
Author:
ansari
Message:

modification classe NTuple : possibilites d'avoir des NTuples en float et double (defaut=double) - Reza 7 Avril 2005

File:
1 edited

Legend:

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

    r2615 r2663  
    88
    99
    10 #define BADVAL -1.e19
    1110#define LENNAME 8
    1211#define LENNAME1  (LENNAME+1)
     12#define BADVAL -1.e19
    1313
    1414/*!
     
    5353
    5454/* --Methode-- */
    55 //! Default constructor
     55//! Default constructor 
    5656//++
    5757NTuple::NTuple()
     
    6363mVar = NULL;
    6464mVarD = NULL;
    65 mNames = NULL;
     65mFgDouble = true;
    6666mInfo = NULL;
    6767}
     
    7474  \param blk : Optional argument specifying number of table lines
    7575  in a given data block
     76  \param fgdouble : if \b true: internal data kept as double precision values (r_8),
     77  simple precision (r_4) otherwise
    7678 */
    7779//++
    78 NTuple::NTuple(int nvar, char** noms, int blk)
     80NTuple::NTuple(int nvar, char** noms, int blk, bool fgdouble)
    7981//
    8082//      Createur d'un ntuple de `nvar' variables dont les
     
    8688mVar = NULL;
    8789mVarD = NULL;
    88 mNames = NULL;
    8990mInfo = NULL;
    9091if (nvar <= 0)  throw ParmError("NTuple::NTuple(nvar<=0) ");
     
    9495if (blk < 10) blk = 10;
    9596mBlk = blk;
    96 // On prend des noms de LENNAME char pour le moment
    97 mNames = new char[nvar*LENNAME1];
    98 r_4* pt = new r_4[nvar*blk];
    99 mNBlk = 1;
    100 mPtr.push_back(pt);
    101 int i;
    102 for(i=0; i<nvar; i++)
    103   { strncpy(mNames+i*LENNAME1, noms[i], LENNAME); 
    104   mNames[i*LENNAME1+LENNAME] = '\0'; }
     97
     98if (fgdouble) {
     99  r_8* pt = new r_8[nvar*blk];
     100  mNBlk = 1;
     101  mPtrD.push_back(pt);
     102  mFgDouble = true;
     103}
     104else {
     105  r_4* pt = new r_4[nvar*blk];
     106  mNBlk = 1;
     107  mPtr.push_back(pt);
     108  mFgDouble = false;
     109}
     110for(int i=0; i<nvar; i++) mNames.push_back(noms[i]);
    105111return;
    106112}
     
    114120//--
    115121: mNVar(0), mNEnt(0), mBlk(0), mNBlk(0)
    116 , mVar(NULL), mVarD(NULL), mNames(NULL), mInfo(NULL)
     122, mVar(NULL), mVarD(NULL), mInfo(NULL)
    117123{
    118124if(NT.mNVar<=0) return; // cas ou NT est cree par defaut
     
    121127mVar = new r_4[NT.mNVar];
    122128mVarD = new r_8[NT.mNVar];
    123 mNames = new char[NT.mNVar*LENNAME1];
     129
     130mNames = NT.mNames;
    124131
    125132int i;
    126 r_4* pt = new r_4[mNVar*mBlk];
    127 mNBlk = 1; mPtr.push_back(pt);
    128 
    129 for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i));
     133mFgDouble = NT.mFgDouble;
     134if (mFgDouble) {
     135  r_8* pt = new r_8[mNVar*mBlk];
     136  mNBlk = 1; mPtrD.push_back(pt);
     137  if(NT.mNEnt > 0)
     138    for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVecD(i,NULL); Fill(pt);}
     139}
     140else {
     141  r_4* pt = new r_4[mNVar*mBlk];
     142  mNBlk = 1; mPtr.push_back(pt);
     143  for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVec(i,NULL); Fill(pt);}
     144}
     145
     146mNames = NT.mNames;
    130147
    131148if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
    132149
    133 if(NT.mNEnt<=0) return;
    134 for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);}
    135 
    136150return;
    137151}
    138152
    139 /* --Methode-- */
     153/* --Methode--
    140154//! Constructor with table initialized from a PPF file
    141155//++
     
    154168fiont.Read(s);
    155169}
     170*/
    156171
    157172/* --Methode-- */
     
    167182if (mVar) delete[] mVar;
    168183if (mVarD) delete[] mVarD;
    169 if (mNames)  delete[] mNames;
    170184if (mInfo) delete mInfo;
    171185int i;
    172 if(mNBlk>0) for(i=0; i<mNBlk; i++)  delete[] mPtr[i];
    173 mPtr.erase(mPtr.begin(), mPtr.end());
     186if(mNBlk>0) {
     187  if (mFgDouble) for(i=0; i<mNBlk; i++)  delete[] mPtrD[i];
     188  else for(i=0; i<mNBlk; i++)  delete[] mPtr[i];
     189}
     190if (mFgDouble) mPtrD.erase(mPtrD.begin(), mPtrD.end());
     191else mPtr.erase(mPtr.begin(), mPtr.end());
    174192mNVar = mNEnt = mBlk = mNBlk = 0;
    175193mVar = NULL;
    176194mVarD = NULL;
    177 mNames = NULL;
    178195mInfo = NULL;
    179196return;
     
    195212mVar = new r_4[NT.mNVar];
    196213mVarD = new r_8[NT.mNVar];
    197 mNames = new char[NT.mNVar*LENNAME1];
     214
     215mNames = NT.mNames;
    198216
    199217int i;
    200 r_4* pt = new r_4[mNVar*mBlk];
    201 mNBlk = 1; mPtr.push_back(pt);
    202 
    203 for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i));
     218mFgDouble = NT.mFgDouble;
     219if (mFgDouble) {
     220  r_8* pt = new r_8[mNVar*mBlk];
     221  mNBlk = 1; mPtrD.push_back(pt);
     222  if(NT.mNEnt > 0)
     223    for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVecD(i,NULL); Fill(pt);}
     224}
     225else {
     226  r_4* pt = new r_4[mNVar*mBlk];
     227  mNBlk = 1; mPtr.push_back(pt);
     228  for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVec(i,NULL); Fill(pt);}
     229}
    204230
    205231if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
    206232
    207 if(NT.mNEnt<=0) return *this;
    208 for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);}
    209 
    210 // En fait il faudrait un createur par copie qui partage les donnees
    211 // quand l'objet est temporaire... trop complique A FAIRE !  cmv.
    212233return *this;
    213234}
     
    226247int numb = mNEnt/mBlk;
    227248if (numb >= mNBlk) {
    228   r_4* pt = new r_4[mNVar*mBlk];
    229   mNBlk++;
    230   mPtr.push_back(pt);
    231 }
     249  if (mFgDouble) {
     250    r_8* pt = new r_8[mNVar*mBlk];
     251    mNBlk++;
     252    mPtrD.push_back(pt);
     253  }
     254  else {
     255    r_4* pt = new r_4[mNVar*mBlk];
     256    mNBlk++;
     257    mPtr.push_back(pt);
     258  }
     259}
     260
    232261int offb = mNEnt-numb*mBlk;
    233 memcpy((mPtr[numb]+offb*mNVar), x, mNVar*sizeof(r_4));
     262if (mFgDouble)
     263  for(int i=0; i<mNVar; i++) (mPtrD[numb]+offb*mNVar)[i] = x[i];
     264else memcpy((mPtr[numb]+offb*mNVar), x, mNVar*sizeof(r_4));
     265mNEnt++;
     266return;
     267}
     268
     269/* --Methode-- */
     270//! Adds an entry (a line) to the table (double precision)
     271/*!
     272  \param x : content of the line to be appended to the table
     273 */
     274//++
     275void  NTuple::Fill(r_8* x)
     276//
     277//      Remplit le ntuple avec le tableau double precision `x'.
     278//--
     279{
     280int numb = mNEnt/mBlk;
     281if (numb >= mNBlk) {
     282  if (mFgDouble) {
     283    r_8* pt = new r_8[mNVar*mBlk];
     284    mNBlk++;
     285    mPtrD.push_back(pt);
     286  }
     287  else {
     288    r_4* pt = new r_4[mNVar*mBlk];
     289    mNBlk++;
     290    mPtr.push_back(pt);
     291  }
     292}
     293
     294int offb = mNEnt-numb*mBlk;
     295if (mFgDouble)
     296  memcpy((mPtrD[numb]+offb*mNVar), x, mNVar*sizeof(r_8));
     297else
     298  for(int i=0; i<mNVar; i++) (mPtr[numb]+offb*mNVar)[i] = x[i];
     299
    234300mNEnt++;
    235301return;
     
    248314int numb = n/mBlk;
    249315int offb = n-numb*mBlk;
    250 return(*(mPtr[numb]+offb*mNVar+k));
     316if ( mFgDouble) return(*(mPtrD[numb]+offb*mNVar+k));
     317else return(*(mPtr[numb]+offb*mNVar+k));
    251318}
    252319
     
    260327{
    261328int i;
     329string snom = nom;
    262330for(i=0; i<mNVar; i++) 
    263   if ( strcmp(nom, mNames+i*LENNAME1) == 0)  return(i);
     331  if ( mNames[i] == snom)  return(i);
    264332return(-1);
    265333}
    266334
    267335
    268 static char nomretour[2*LENNAME1];
     336static char nomretour[256];
    269337/* --Methode-- */
    270338//++
     
    275343{
    276344nomretour[0] = '\0';
    277 if ((k >= 0) && (k < mNVar))  strcpy(nomretour, mNames+k*LENNAME1);
     345if ((k >= 0) && (k < mNVar))  strncpy(nomretour, mNames[k].c_str(), 255);
    278346return(nomretour);
    279347}
     
    296364int numb = n/mBlk;
    297365int offb = n-numb*mBlk;
    298 memcpy(ret, (mPtr[numb]+offb*mNVar), mNVar*sizeof(r_4));
     366if (mFgDouble) for(i=0; i<mNVar; i++) ret[i] = (mPtrD[numb]+offb*mNVar)[i];
     367else  memcpy(ret, (mPtr[numb]+offb*mNVar), mNVar*sizeof(r_4));
    299368return(ret);
    300369}
     
    309378int i;
    310379if (ret == NULL)   ret = mVarD;
    311 float *  fr = GetVec(n);
    312 for(i=0; i<mNVar; i++)   ret[i] = fr[i];
     380if (n >= mNEnt) {
     381  for(i=0; i<mNVar; i++)   ret[i] = BADVAL;
     382  return(ret);
     383}
     384 
     385int numb = n/mBlk;
     386int offb = n-numb*mBlk;
     387if (mFgDouble)
     388  memcpy(ret, (mPtrD[numb]+offb*mNVar), mNVar*sizeof(r_8));
     389for(i=0; i<mNVar; i++) ret[i] = (mPtr[numb]+offb*mNVar)[i];
    313390return(ret);
    314391}
     
    337414
    338415printf("Num     ");
    339 for(i=0; i<mNVar; i++)  printf("%8s ", mNames+i*LENNAME1);
     416for(i=0; i<mNVar; i++)  printf("%8s ", mNames[i].c_str());
    340417putchar('\n');
    341418
     
    361438//--
    362439{
    363 os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt 
     440char * tt = "float";
     441if (mFgDouble) tt = "double";
     442os << "NTuple T=" << tt << " : NVar= " << mNVar << " NEnt=" << mNEnt 
    364443   << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n";
    365444os << "            Variables       Min      Max       \n";
     
    369448for(i=0; i<mNVar; i++) {
    370449  GetMinMax(i, min, max);
    371   sprintf(buff, "%3d  %16s  %10g  %10g \n", i, mNames+i*LENNAME1, min, max);
     450  sprintf(buff, "%3d  %16s  %10g  %10g \n", i, mNames[i].c_str(), min, max);
    372451  os << (string)buff ;
    373452  }
     
    404483int j,kk;
    405484int postab, posb;
    406 float* xv = new float[NbColumns()];
     485double* xv = new double[NbColumns()];
    407486
    408487int nlread = 0;
     
    492571    if (i >= mNEnt)  break;
    493572    i++;
    494     x = *(mPtr[jb]+ib*mNVar+k);
     573    x = (mFgDouble) ? *(mPtrD[jb]+ib*mNVar+k) : *(mPtr[jb]+ib*mNVar+k);
    495574    if(i==1) {min = x; max = x;}
    496575    if (x < min)  min = x;
     
    533612  if (i%5 == 0)   rets += "\ndouble ";
    534613  else rets += ",";
    535   rets += mNames+i*LENNAME1;
     614  rets += mNames[i];
    536615  }
    537616rets += "; \n";
     
    539618  char buff[256];
    540619  for(i=0; i<mNVar; i++) {
    541     sprintf(buff,"%s=%s[%d]; ",  mNames+i*LENNAME1, nomx, i);
     620    sprintf(buff,"%s=%s[%d]; ",  mNames[i].c_str(), nomx, i);
    542621    rets += buff;
    543622    if ( (i%3 == 0) && (i > 0) )  rets += "\n";
     
    559638string rets=" Num    ";
    560639for(int i=0; i<mNVar; i++) {
    561   sprintf(buff, "%8s ", mNames+i*LENNAME1);
     640  sprintf(buff, "%8s ", mNames[i].c_str());
    562641  rets += buff;
    563642  }
     
    603682if (dobj == NULL)   return;
    604683
    605 // On ecrit cette chaine pour compatibilite avec l'ancienne version
     684// On ecrit cette chaine pour compatibilite avec les anciennes version (1,2)
    606685string strg = "NTuple";
    607686s.Put(strg);
    608687
    609688//  On ecrit 3 uint_4 ....
    610 //  0: Numero de version,  1 : non nul -> has info,  2 : reserve
     689//  [0]: Numero de version ;
     690//  [1] : bit1 non nul -> has info, bit 2 non nul mFgDouble=true
     691//  [2] : reserve
    611692uint_4 itab[3];
    612 itab[0] = 2;  // Numero de version a 1
     693itab[0] = 3;  // Numero de version a 3
    613694itab[1] = itab[2] = 0;
    614695if (dobj->mInfo)  itab[1] = 1;
     696if (dobj->mFgDouble) itab[1] += 2;
    615697s.Put(itab, 3);
    616698
    617699s.Put(dobj->mNVar);
    618 s.PutBytes(dobj->mNames, dobj->mNVar*LENNAME1);
     700for(int k=0; k<dobj->mNVar; k++) s.Put(dobj->mNames[k]);
    619701s.Put(dobj->mNEnt);
    620702s.Put(dobj->mBlk);
    621703s.Put(dobj->mNBlk);
     704
    622705if (dobj->mInfo)  s << (*(dobj->mInfo));
    623706int jb;
    624 for(jb=0; jb<dobj->mNBlk; jb++)
    625   s.Put(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
     707if (dobj->mFgDouble)
     708  for(jb=0; jb<dobj->mNBlk; jb++)
     709    s.Put(dobj->mPtrD[jb], dobj->mNVar*dobj->mBlk);
     710else
     711  for(jb=0; jb<dobj->mNBlk; jb++)
     712    s.Put(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
    626713return;
    627714}
     
    642729string strg;
    643730s.Get(strg);
     731uint_4 itab[3] = {0,0,0};
    644732if (strg == "NTuple") {
    645   uint_4 itab[3];
    646733  s.Get(itab, 3);
    647   if (itab[1] != 0) hadinfo = true;
     734  if ( ((itab[0] < 3) && (itab[1] != 0)) ||
     735       ((itab[0] >= 3) && ((itab[1]&1) == 1)) ) hadinfo = true;
    648736}
    649737else {
     
    653741  if (strncmp(buff+strlen(buff)-7, "HasInfo", 7) == 0)  hadinfo = true;
    654742}
    655 s.Get(dobj->mNVar);
    656 dobj->mNames = new char[dobj->mNVar*LENNAME1];
    657 dobj->mVar = new r_4[dobj->mNVar];
    658 dobj->mVarD = new r_8[dobj->mNVar];
    659 s.GetBytes(dobj->mNames, dobj->mNVar*LENNAME1);
    660 s.Get(dobj->mNEnt);
    661 s.Get(dobj->mBlk);
    662 s.Get(dobj->mNBlk);
    663 
    664 if (hadinfo) {    // Lecture eventuelle du DVList Info
    665   if (dobj->mInfo == NULL)  dobj->mInfo = new DVList;
    666   s >> (*(dobj->mInfo));
    667   }
    668 
    669 int jb;
    670 for(jb=0; jb<dobj->mNBlk; jb++) {
    671   r_4* pt = new r_4[dobj->mNVar*dobj->mBlk];
    672   dobj->mPtr.push_back(pt);
    673   s.Get(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
    674 }
     743if (itab[0] < 3) {  // Lecture version anterieures V= 1 , 2
     744  s.Get(dobj->mNVar);
     745  dobj->mVar = new r_4[dobj->mNVar];
     746  dobj->mVarD = new r_8[dobj->mNVar];
     747 
     748  char * names = new char[dobj->mNVar*LENNAME1];
     749  s.GetBytes(names, dobj->mNVar*LENNAME1);
     750  for(int k=0; k<dobj->mNVar; k++) dobj->mNames.push_back(names+k*LENNAME1);
     751  s.Get(dobj->mNEnt);
     752  s.Get(dobj->mBlk);
     753  s.Get(dobj->mNBlk); 
     754  if (hadinfo) {    // Lecture eventuelle du DVList Info
     755    if (dobj->mInfo == NULL)  dobj->mInfo = new DVList;
     756    s >> (*(dobj->mInfo));
     757  }
     758  // Il n'y avait que des NTuple avec data float pour V < 3
     759  dobj->mFgDouble = false;   
     760  int jb;
     761  for(jb=0; jb<dobj->mNBlk; jb++) {
     762    r_4* pt = new r_4[dobj->mNVar*dobj->mBlk];
     763    dobj->mPtr.push_back(pt);
     764    s.Get(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
     765  }
     766}
     767else {  // Lecture version V 3
     768  s.Get(dobj->mNVar);
     769  dobj->mVar = new r_4[dobj->mNVar];
     770  dobj->mVarD = new r_8[dobj->mNVar];
     771  string nom;
     772  for(int k=0; k<dobj->mNVar; k++) {
     773    s.Get(nom);
     774    dobj->mNames.push_back(nom);
     775  }
     776  s.Get(dobj->mNEnt);
     777  s.Get(dobj->mBlk);
     778  s.Get(dobj->mNBlk); 
     779  if (hadinfo) {    // Lecture eventuelle du DVList Info
     780    if (dobj->mInfo == NULL)  dobj->mInfo = new DVList;
     781    s >> (*(dobj->mInfo));
     782  }
     783  // Il n'y avait que des NTuple avec data float pour V < 3
     784  dobj->mFgDouble =  ((itab[1]&2) == 2) ? true : false;   
     785  int jb;
     786  if (dobj->mFgDouble) {
     787    for(jb=0; jb<dobj->mNBlk; jb++) {
     788      r_8* pt = new r_8[dobj->mNVar*dobj->mBlk];
     789      dobj->mPtrD.push_back(pt);
     790      s.Get(dobj->mPtrD[jb], dobj->mNVar*dobj->mBlk);
     791    }
     792  }
     793  else {
     794    for(jb=0; jb<dobj->mNBlk; jb++) {
     795      r_4* pt = new r_4[dobj->mNVar*dobj->mBlk];
     796      dobj->mPtr.push_back(pt);
     797      s.Get(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
     798    }
     799  }
     800}  // Fin lecture V3
    675801
    676802}
Note: See TracChangeset for help on using the changeset viewer.