Changeset 2663 in Sophya for trunk/SophyaLib/HiStats
- Timestamp:
- Apr 7, 2005, 5:48:30 PM (20 years ago)
- Location:
- trunk/SophyaLib/HiStats
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/HiStats/ntuple.cc
r2615 r2663 8 8 9 9 10 #define BADVAL -1.e1911 10 #define LENNAME 8 12 11 #define LENNAME1 (LENNAME+1) 12 #define BADVAL -1.e19 13 13 14 14 /*! … … 53 53 54 54 /* --Methode-- */ 55 //! Default constructor 55 //! Default constructor 56 56 //++ 57 57 NTuple::NTuple() … … 63 63 mVar = NULL; 64 64 mVarD = NULL; 65 m Names = NULL;65 mFgDouble = true; 66 66 mInfo = NULL; 67 67 } … … 74 74 \param blk : Optional argument specifying number of table lines 75 75 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 76 78 */ 77 79 //++ 78 NTuple::NTuple(int nvar, char** noms, int blk )80 NTuple::NTuple(int nvar, char** noms, int blk, bool fgdouble) 79 81 // 80 82 // Createur d'un ntuple de `nvar' variables dont les … … 86 88 mVar = NULL; 87 89 mVarD = NULL; 88 mNames = NULL;89 90 mInfo = NULL; 90 91 if (nvar <= 0) throw ParmError("NTuple::NTuple(nvar<=0) "); … … 94 95 if (blk < 10) blk = 10; 95 96 mBlk = 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 98 if (fgdouble) { 99 r_8* pt = new r_8[nvar*blk]; 100 mNBlk = 1; 101 mPtrD.push_back(pt); 102 mFgDouble = true; 103 } 104 else { 105 r_4* pt = new r_4[nvar*blk]; 106 mNBlk = 1; 107 mPtr.push_back(pt); 108 mFgDouble = false; 109 } 110 for(int i=0; i<nvar; i++) mNames.push_back(noms[i]); 105 111 return; 106 112 } … … 114 120 //-- 115 121 : mNVar(0), mNEnt(0), mBlk(0), mNBlk(0) 116 , mVar(NULL), mVarD(NULL), m Names(NULL), mInfo(NULL)122 , mVar(NULL), mVarD(NULL), mInfo(NULL) 117 123 { 118 124 if(NT.mNVar<=0) return; // cas ou NT est cree par defaut … … 121 127 mVar = new r_4[NT.mNVar]; 122 128 mVarD = new r_8[NT.mNVar]; 123 mNames = new char[NT.mNVar*LENNAME1]; 129 130 mNames = NT.mNames; 124 131 125 132 int 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)); 133 mFgDouble = NT.mFgDouble; 134 if (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 } 140 else { 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 146 mNames = NT.mNames; 130 147 131 148 if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);} 132 149 133 if(NT.mNEnt<=0) return;134 for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);}135 136 150 return; 137 151 } 138 152 139 /* --Methode-- */153 /* --Methode-- 140 154 //! Constructor with table initialized from a PPF file 141 155 //++ … … 154 168 fiont.Read(s); 155 169 } 170 */ 156 171 157 172 /* --Methode-- */ … … 167 182 if (mVar) delete[] mVar; 168 183 if (mVarD) delete[] mVarD; 169 if (mNames) delete[] mNames;170 184 if (mInfo) delete mInfo; 171 185 int i; 172 if(mNBlk>0) for(i=0; i<mNBlk; i++) delete[] mPtr[i]; 173 mPtr.erase(mPtr.begin(), mPtr.end()); 186 if(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 } 190 if (mFgDouble) mPtrD.erase(mPtrD.begin(), mPtrD.end()); 191 else mPtr.erase(mPtr.begin(), mPtr.end()); 174 192 mNVar = mNEnt = mBlk = mNBlk = 0; 175 193 mVar = NULL; 176 194 mVarD = NULL; 177 mNames = NULL;178 195 mInfo = NULL; 179 196 return; … … 195 212 mVar = new r_4[NT.mNVar]; 196 213 mVarD = new r_8[NT.mNVar]; 197 mNames = new char[NT.mNVar*LENNAME1]; 214 215 mNames = NT.mNames; 198 216 199 217 int 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)); 218 mFgDouble = NT.mFgDouble; 219 if (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 } 225 else { 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 } 204 230 205 231 if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);} 206 232 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 donnees211 // quand l'objet est temporaire... trop complique A FAIRE ! cmv.212 233 return *this; 213 234 } … … 226 247 int numb = mNEnt/mBlk; 227 248 if (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 232 261 int offb = mNEnt-numb*mBlk; 233 memcpy((mPtr[numb]+offb*mNVar), x, mNVar*sizeof(r_4)); 262 if (mFgDouble) 263 for(int i=0; i<mNVar; i++) (mPtrD[numb]+offb*mNVar)[i] = x[i]; 264 else memcpy((mPtr[numb]+offb*mNVar), x, mNVar*sizeof(r_4)); 265 mNEnt++; 266 return; 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 //++ 275 void NTuple::Fill(r_8* x) 276 // 277 // Remplit le ntuple avec le tableau double precision `x'. 278 //-- 279 { 280 int numb = mNEnt/mBlk; 281 if (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 294 int offb = mNEnt-numb*mBlk; 295 if (mFgDouble) 296 memcpy((mPtrD[numb]+offb*mNVar), x, mNVar*sizeof(r_8)); 297 else 298 for(int i=0; i<mNVar; i++) (mPtr[numb]+offb*mNVar)[i] = x[i]; 299 234 300 mNEnt++; 235 301 return; … … 248 314 int numb = n/mBlk; 249 315 int offb = n-numb*mBlk; 250 return(*(mPtr[numb]+offb*mNVar+k)); 316 if ( mFgDouble) return(*(mPtrD[numb]+offb*mNVar+k)); 317 else return(*(mPtr[numb]+offb*mNVar+k)); 251 318 } 252 319 … … 260 327 { 261 328 int i; 329 string snom = nom; 262 330 for(i=0; i<mNVar; i++) 263 if ( strcmp(nom, mNames+i*LENNAME1) == 0) return(i);331 if ( mNames[i] == snom) return(i); 264 332 return(-1); 265 333 } 266 334 267 335 268 static char nomretour[2 *LENNAME1];336 static char nomretour[256]; 269 337 /* --Methode-- */ 270 338 //++ … … 275 343 { 276 344 nomretour[0] = '\0'; 277 if ((k >= 0) && (k < mNVar)) str cpy(nomretour, mNames+k*LENNAME1);345 if ((k >= 0) && (k < mNVar)) strncpy(nomretour, mNames[k].c_str(), 255); 278 346 return(nomretour); 279 347 } … … 296 364 int numb = n/mBlk; 297 365 int offb = n-numb*mBlk; 298 memcpy(ret, (mPtr[numb]+offb*mNVar), mNVar*sizeof(r_4)); 366 if (mFgDouble) for(i=0; i<mNVar; i++) ret[i] = (mPtrD[numb]+offb*mNVar)[i]; 367 else memcpy(ret, (mPtr[numb]+offb*mNVar), mNVar*sizeof(r_4)); 299 368 return(ret); 300 369 } … … 309 378 int i; 310 379 if (ret == NULL) ret = mVarD; 311 float * fr = GetVec(n); 312 for(i=0; i<mNVar; i++) ret[i] = fr[i]; 380 if (n >= mNEnt) { 381 for(i=0; i<mNVar; i++) ret[i] = BADVAL; 382 return(ret); 383 } 384 385 int numb = n/mBlk; 386 int offb = n-numb*mBlk; 387 if (mFgDouble) 388 memcpy(ret, (mPtrD[numb]+offb*mNVar), mNVar*sizeof(r_8)); 389 for(i=0; i<mNVar; i++) ret[i] = (mPtr[numb]+offb*mNVar)[i]; 313 390 return(ret); 314 391 } … … 337 414 338 415 printf("Num "); 339 for(i=0; i<mNVar; i++) printf("%8s ", mNames +i*LENNAME1);416 for(i=0; i<mNVar; i++) printf("%8s ", mNames[i].c_str()); 340 417 putchar('\n'); 341 418 … … 361 438 //-- 362 439 { 363 os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt 440 char * tt = "float"; 441 if (mFgDouble) tt = "double"; 442 os << "NTuple T=" << tt << " : NVar= " << mNVar << " NEnt=" << mNEnt 364 443 << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n"; 365 444 os << " Variables Min Max \n"; … … 369 448 for(i=0; i<mNVar; i++) { 370 449 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); 372 451 os << (string)buff ; 373 452 } … … 404 483 int j,kk; 405 484 int postab, posb; 406 float* xv = new float[NbColumns()];485 double* xv = new double[NbColumns()]; 407 486 408 487 int nlread = 0; … … 492 571 if (i >= mNEnt) break; 493 572 i++; 494 x = *(mPtr[jb]+ib*mNVar+k);573 x = (mFgDouble) ? *(mPtrD[jb]+ib*mNVar+k) : *(mPtr[jb]+ib*mNVar+k); 495 574 if(i==1) {min = x; max = x;} 496 575 if (x < min) min = x; … … 533 612 if (i%5 == 0) rets += "\ndouble "; 534 613 else rets += ","; 535 rets += mNames +i*LENNAME1;614 rets += mNames[i]; 536 615 } 537 616 rets += "; \n"; … … 539 618 char buff[256]; 540 619 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); 542 621 rets += buff; 543 622 if ( (i%3 == 0) && (i > 0) ) rets += "\n"; … … 559 638 string rets=" Num "; 560 639 for(int i=0; i<mNVar; i++) { 561 sprintf(buff, "%8s ", mNames +i*LENNAME1);640 sprintf(buff, "%8s ", mNames[i].c_str()); 562 641 rets += buff; 563 642 } … … 603 682 if (dobj == NULL) return; 604 683 605 // On ecrit cette chaine pour compatibilite avec l 'ancienne version684 // On ecrit cette chaine pour compatibilite avec les anciennes version (1,2) 606 685 string strg = "NTuple"; 607 686 s.Put(strg); 608 687 609 688 // 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 611 692 uint_4 itab[3]; 612 itab[0] = 2; // Numero de version a 1693 itab[0] = 3; // Numero de version a 3 613 694 itab[1] = itab[2] = 0; 614 695 if (dobj->mInfo) itab[1] = 1; 696 if (dobj->mFgDouble) itab[1] += 2; 615 697 s.Put(itab, 3); 616 698 617 699 s.Put(dobj->mNVar); 618 s.PutBytes(dobj->mNames, dobj->mNVar*LENNAME1);700 for(int k=0; k<dobj->mNVar; k++) s.Put(dobj->mNames[k]); 619 701 s.Put(dobj->mNEnt); 620 702 s.Put(dobj->mBlk); 621 703 s.Put(dobj->mNBlk); 704 622 705 if (dobj->mInfo) s << (*(dobj->mInfo)); 623 706 int jb; 624 for(jb=0; jb<dobj->mNBlk; jb++) 625 s.Put(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk); 707 if (dobj->mFgDouble) 708 for(jb=0; jb<dobj->mNBlk; jb++) 709 s.Put(dobj->mPtrD[jb], dobj->mNVar*dobj->mBlk); 710 else 711 for(jb=0; jb<dobj->mNBlk; jb++) 712 s.Put(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk); 626 713 return; 627 714 } … … 642 729 string strg; 643 730 s.Get(strg); 731 uint_4 itab[3] = {0,0,0}; 644 732 if (strg == "NTuple") { 645 uint_4 itab[3];646 733 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; 648 736 } 649 737 else { … … 653 741 if (strncmp(buff+strlen(buff)-7, "HasInfo", 7) == 0) hadinfo = true; 654 742 } 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 } 743 if (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 } 767 else { // 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 675 801 676 802 } -
trunk/SophyaLib/HiStats/ntuple.h
r2479 r2663 20 20 21 21 // Forward class declaration for Fits handler 22 class FITS_ XNTuple;22 class FITS_NTuple; 23 23 24 24 class NTuple : public AnyDataObj , public NTupleInterface { 25 25 26 26 public: 27 // enum {classId = ClassId_NTuple }; 28 29 NTuple(int nvar, char** noms, int blk=512); 30 NTuple(); 27 NTuple(); 28 NTuple(int nvar, char** noms, int blk=512, bool fgdouble=true); 31 29 NTuple(const NTuple& NT); 32 NTuple(char* flnm);30 //A virer NTuple(char* flnm); 33 31 virtual ~NTuple(); 34 32 … … 36 34 37 35 void Fill(r_4* x); 36 void Fill(r_8* x); 38 37 39 38 inline int_4 NEntry() const { return(mNEnt); } … … 80 79 81 80 // pour fichiers FITS 82 friend class FITS_NTuple; 83 81 friend class FITS_NTuple; 84 82 85 83 private: … … 89 87 r_4* mVar; 90 88 r_8* mVarD; 91 char*mNames;89 vector<string> mNames; 92 90 93 vector<r_4*> mPtr; 91 bool mFgDouble; // true -> les donnees sont gardees en double 92 vector<r_4*> mPtr; // Pointeur de tableau float 93 vector<r_8*> mPtrD; // Pointeur de tableau double 94 94 95 95 DVList* mInfo; // Infos (variables) attachees au NTuple
Note:
See TracChangeset
for help on using the changeset viewer.