Changeset 490 in Sophya for trunk/SophyaLib/NTools/ntuple.cc
- Timestamp:
- Oct 21, 1999, 5:25:53 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/ntuple.cc
r475 r490 2 2 #include <string.h> 3 3 4 #include "strutil.h" 4 5 #include "perrors.h" 5 6 #include "ntuple.h" … … 16 17 // 17 18 // Classe de ntuples 19 //-- 20 //++ 21 // Links Parents 22 // PPersist 23 // NTupleInterface 18 24 //-- 19 25 … … 35 41 //++ 36 42 NTuple::NTuple(int nvar, char** noms, int blk) 37 // 38 // Createur d'un ntuple de `nvar' variables dont les 39 // noms sont dans le tableau de cahines de caracteres `noms' 40 // avec `blk' d'evenements par blocks. 41 //-- 42 { 43 mNVar = mNEnt = mBlk = mNBlk = 0; 44 mVar = NULL; 45 mVarD = NULL; 46 mNames = NULL; 47 mInfo = NULL; 48 if (nvar <= 0) THROW(sizeMismatchErr); 49 mNVar = nvar; 50 mVar = new r_4[nvar]; 51 mVarD = new r_8[nvar]; 52 if (blk < 10) blk = 10; 53 mBlk = blk; 54 // On prend des noms de LENNAME char pour le moment 55 mNames = new char[nvar*LENNAME1]; 56 r_4* pt = new r_4[nvar*blk]; 57 mNBlk = 1; 58 mPtr.push_back(pt); 59 int i; 60 for(i=0; i<nvar; i++) 61 { 62 strncpy(mNames+i*LENNAME1, noms[i], LENNAME); 63 mNames[i*LENNAME1+LENNAME] = '\0'; 64 } 65 return; 43 // 44 // Createur d'un ntuple de `nvar' variables dont les 45 // noms sont dans le tableau de cahines de caracteres `noms' 46 // avec `blk' d'evenements par blocks. 47 //-- 48 { 49 mNVar = mNEnt = mBlk = mNBlk = 0; 50 mVar = NULL; 51 mVarD = NULL; 52 mNames = NULL; 53 mInfo = NULL; 54 if (nvar <= 0) THROW(sizeMismatchErr); 55 mNVar = nvar; 56 mVar = new r_4[nvar]; 57 mVarD = new r_8[nvar]; 58 if (blk < 10) blk = 10; 59 mBlk = blk; 60 // On prend des noms de LENNAME char pour le moment 61 mNames = new char[nvar*LENNAME1]; 62 r_4* pt = new r_4[nvar*blk]; 63 mNBlk = 1; 64 mPtr.push_back(pt); 65 int i; 66 for(i=0; i<nvar; i++) 67 { strncpy(mNames+i*LENNAME1, noms[i], LENNAME); 68 mNames[i*LENNAME1+LENNAME] = '\0'; } 69 return; 70 } 71 72 // cmv 8/10/99 73 //++ 74 NTuple::NTuple(const NTuple& NT) 75 // 76 // Createur par copie (clone). 77 //-- 78 : mNVar(0), mNEnt(0), mBlk(0), mNBlk(0) 79 , mVar(NULL), mVarD(NULL), mNames(NULL), mInfo(NULL) 80 { 81 if(NT.mNVar<=0) return; // cas ou NT est cree par defaut 82 mNVar = NT.mNVar; 83 mBlk = NT.mBlk; 84 mVar = new r_4[NT.mNVar]; 85 mVarD = new r_8[NT.mNVar]; 86 mNames = new char[NT.mNVar*LENNAME1]; 87 88 int i; 89 r_4* pt = new r_4[mNVar*mBlk]; 90 mNBlk = 1; mPtr.push_back(pt); 91 92 for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i)); 93 94 if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);} 95 96 if(NT.mNEnt<=0) return; 97 for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);} 98 99 return; 66 100 } 67 101 … … 79 113 mInfo = NULL; 80 114 PInPersist s(flnm); 81 Read(s); 115 ObjFileIO<NTuple> fiont(this); 116 fiont.Read(s); 82 117 } 83 118 … … 96 131 if (mInfo) delete mInfo; 97 132 int i; 98 for(i=0; i<mNBlk; i++) delete[] mPtr[i];133 if(mNBlk>0) for(i=0; i<mNBlk; i++) delete[] mPtr[i]; 99 134 mPtr.erase(mPtr.begin(), mPtr.end()); 100 135 mNVar = mNEnt = mBlk = mNBlk = 0; … … 102 137 mVarD = NULL; 103 138 mNames = NULL; 139 mInfo = NULL; 104 140 return; 141 } 142 143 /* --Methode-- cmv 08/10/99 */ 144 //++ 145 NTuple& NTuple::operator = (const NTuple& NT) 146 // 147 // Operateur egal (clone). 148 //-- 149 { 150 if(this == &NT) return *this; 151 Clean(); 152 if(NT.mNVar<=0) return *this; // cas ou NT est cree par defaut 153 mNVar = NT.mNVar; 154 mBlk = NT.mBlk; 155 mVar = new r_4[NT.mNVar]; 156 mVarD = new r_8[NT.mNVar]; 157 mNames = new char[NT.mNVar*LENNAME1]; 158 159 int i; 160 r_4* pt = new r_4[mNVar*mBlk]; 161 mNBlk = 1; mPtr.push_back(pt); 162 163 for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i)); 164 165 if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);} 166 167 if(NT.mNEnt<=0) return *this; 168 for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);} 169 170 // En fait il faudrait un createur par copie qui partage les donnees 171 // quand l'objet est temporaire... trop complique A FAIRE ! cmv. 172 return *this; 105 173 } 106 174 … … 167 235 } 168 236 169 /* --Methode-- */170 //++171 string NTuple::VarList_C(const char* nomx) const172 //173 // Retourne une chaine de caracteres avec la declaration des noms de174 // variables. si "nomx!=NULL" , des instructions d'affectation175 // a partir d'un tableau "nomx[i]" sont ajoutees.176 //--177 {178 string rets;179 int i;180 for(i=0; i<mNVar; i++) {181 if ( (i%5 == 0) && (i > 0) ) rets += ";";182 if (i%5 == 0) rets += "\ndouble ";183 else rets += ",";184 rets += mNames+i*LENNAME1;185 }186 rets += "; \n";187 if (nomx) {188 char buff[256];189 for(i=0; i<mNVar; i++) {190 sprintf(buff,"%s=%s[%d]; ", mNames+i*LENNAME1, nomx, i);191 rets += buff;192 if ( (i%3 == 0) && (i > 0) ) rets += "\n";193 }194 }195 196 return(rets);197 }198 237 199 238 /* --Methode-- */ … … 231 270 } 232 271 233 /* --Methode-- */ 234 //++ 235 void NTuple::GetMinMax(int k, float& min, float& max) const 272 273 274 /* --Methode-- */ 275 //++ 276 DVList& NTuple::Info() 277 // 278 // Renvoie une référence sur l'objet DVList Associé 279 //-- 280 { 281 if (mInfo == NULL) mInfo = new DVList; 282 return(*mInfo); 283 } 284 285 /* --Methode-- */ 286 //++ 287 void NTuple::Print(int num, int nmax) const 288 // 289 // Imprime `nmax' evenements a partir du numero `num'. 290 //-- 291 { 292 int i,j; 293 294 printf("Num "); 295 for(i=0; i<mNVar; i++) printf("%8s ", mNames+i*LENNAME1); 296 putchar('\n'); 297 298 if (nmax <= 0) nmax = 1; 299 if (num < 0) num = 0; 300 nmax += num; 301 if (nmax > mNEnt) nmax = mNEnt; 302 for(i=num; i<nmax; i++) { 303 GetVec(i, NULL); 304 printf("%6d ", i); 305 for(j=0; j<mNVar; j++) printf("%8g ", (float)mVar[j]); 306 putchar('\n'); 307 } 308 return; 309 } 310 311 /* --Methode-- */ 312 //++ 313 void NTuple::Show(ostream& os) const 314 // 315 // Imprime l'information generale sur le ntuple. 316 //-- 317 { 318 os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt 319 << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n"; 320 os << " Variables Min Max \n"; 321 int i; 322 double min, max; 323 char buff[128]; 324 for(i=0; i<mNVar; i++) { 325 GetMinMax(i, min, max); 326 sprintf(buff, "%3d %16s %10lg %10lg \n", i, mNames+i*LENNAME1, min, max); 327 os << (string)buff ; 328 } 329 os << endl; 330 } 331 332 333 /* --Methode-- */ 334 //++ 335 int NTuple::FillFromASCIIFile(string const& fn, float defval) 336 // 337 // Remplit le ntuple a partir d'un fichier ASCII. 338 // Renvoie le nombre de lignes ajoutees. 339 //-- 340 { 341 if (NbColumns() < 1) { 342 cout << "NTuple::FillFromASCIIFile() Ntuple has " << NbColumns() << " columns" << endl; 343 return(-1); 344 } 345 FILE * fip = fopen(fn.c_str(), "r"); 346 if (fip == NULL) { 347 cout << "NTuple::FillFromASCIIFile() Error opening file " << fn << endl; 348 return(-2); 349 } 350 351 char lineb[4096]; 352 char *line; 353 char buff[64]; 354 char* ccp; 355 int i,j,l,kk; 356 int postab, posb; 357 float* xv = new float[NbColumns()]; 358 359 int nlread = 0; 360 int nvar = NbColumns(); 361 // On boucle sur toutes les lignes 362 while (fgets(lineb,4096,fip) != NULL) { 363 lineb[4095] = '\0'; 364 j = 0; line = lineb; 365 // On enleve les espaces et tab de debut 366 while ( (line[j] != '\0') && ((line[j] == ' ') || (line[j] == '\t')) ) j++; 367 line = lineb+j; 368 // Il faut que le premier caractere non-espace soit un digit, ou + ou - ou . 369 if (!( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') )) continue; 370 ccp = line; 371 for(kk=0; kk<nvar; kk++) xv[kk] = defval; 372 for(kk=0; kk<nvar; kk++) { 373 // Les mots sont separes par des espaces ou des tab 374 postab = posc(ccp, '\t' ); 375 posb = posc(ccp, ' ' ); 376 if (postab >= 0) { 377 if (posb < 0) posb = postab; 378 else if (postab < posb) posb = postab; 379 } 380 if (posb >= 0) ccp[posb] = '\0'; 381 if ( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') ) 382 xv[kk] = atof(ccp); 383 if (posb < 0) break; 384 ccp += posb+1; j = 0; 385 while ( (ccp[j] != '\0') && ((ccp[j] == ' ') || (ccp[j] == '\t')) ) j++; 386 ccp += j; 387 } 388 Fill(xv); 389 nlread++; 390 } 391 392 delete[] xv; 393 cout << "NTuple::FillFromASCIIFile( " << fn << ") " << nlread << " fill from file " << endl; 394 return(nlread); 395 } 396 397 398 // ------- Implementation de l interface NTuple --------- 399 400 /* --Methode-- */ 401 uint_4 NTuple::NbLines() const 402 { 403 return(NEntry()); 404 } 405 /* --Methode-- */ 406 uint_4 NTuple::NbColumns() const 407 { 408 return(NVar()); 409 } 410 411 /* --Methode-- */ 412 r_8 * NTuple::GetLineD(int n) const 413 { 414 return(GetVecD(n)); 415 } 416 417 /* --Methode-- */ 418 r_8 NTuple::GetCell(int n, int k) const 419 { 420 return(GetVal(n, k)); 421 } 422 423 /* --Methode-- */ 424 r_8 NTuple::GetCell(int n, string const & nom) const 425 { 426 return(GetVal(n, nom.c_str())); 427 } 428 429 /* --Methode-- */ 430 //++ 431 void NTuple::GetMinMax(int k, double& min, double& max) const 236 432 // 237 433 // Retourne le minimum et le maximum de la variable `k'. … … 241 437 if ( (k < 0) || (k >= mNVar) ) return; 242 438 int jb,ib,i; 243 floatx;439 double x; 244 440 i=0; 245 441 for(jb=0; jb< mNBlk; jb++) … … 256 452 257 453 /* --Methode-- */ 258 //++ 259 DVList& NTuple::Info() 260 // 261 // Renvoie une référence sur l'objet DVList Associé 262 //-- 263 { 264 if (mInfo == NULL) mInfo = new DVList; 265 return(*mInfo); 266 } 267 268 /* --Methode-- */ 269 //++ 270 void NTuple::Print(int num, int nmax) const 271 // 272 // Imprime `nmax' evenements a partir du numero `num'. 273 //-- 274 { 275 int i,j; 276 277 printf("Num "); 278 for(i=0; i<mNVar; i++) printf("%8s ", mNames+i*LENNAME1); 279 putchar('\n'); 280 281 if (nmax <= 0) nmax = 1; 282 if (num < 0) num = 0; 283 nmax += num; 284 if (nmax > mNEnt) nmax = mNEnt; 285 for(i=num; i<nmax; i++) { 286 GetVec(i, NULL); 287 printf("%6d ", i); 288 for(j=0; j<mNVar; j++) printf("%8g ", (float)mVar[j]); 289 putchar('\n'); 290 } 454 void NTuple::GetMinMax(string const & nom, double& min, double& max) const 455 { 456 GetMinMax(IndexNom(nom.c_str()), min, max); 457 } 458 459 /* --Methode-- */ 460 int NTuple::ColumnIndex(string const & nom) const 461 { 462 return(IndexNom(nom.c_str())); 463 } 464 465 /* --Methode-- */ 466 string NTuple::ColumnName(int k) const 467 { 468 return(NomIndex(k)); 469 } 470 471 /* --Methode-- */ 472 //++ 473 string NTuple::VarList_C(const char* nomx) const 474 // 475 // Retourne une chaine de caracteres avec la declaration des noms de 476 // variables. si "nomx!=NULL" , des instructions d'affectation 477 // a partir d'un tableau "nomx[i]" sont ajoutees. 478 //-- 479 { 480 string rets=""; 481 int i; 482 for(i=0; i<mNVar; i++) { 483 if ( (i%5 == 0) && (i > 0) ) rets += ";"; 484 if (i%5 == 0) rets += "\ndouble "; 485 else rets += ","; 486 rets += mNames+i*LENNAME1; 487 } 488 rets += "; \n"; 489 if (nomx) { 490 char buff[256]; 491 for(i=0; i<mNVar; i++) { 492 sprintf(buff,"%s=%s[%d]; ", mNames+i*LENNAME1, nomx, i); 493 rets += buff; 494 if ( (i%3 == 0) && (i > 0) ) rets += "\n"; 495 } 496 } 497 498 return(rets); 499 } 500 501 502 /* --Methode-- */ 503 //++ 504 string NTuple::LineHeaderToString() const 505 // Retourne une chaine de caracteres avec la liste des noms de 506 // variables, utilisables pour une impression 507 //-- 508 { 509 char buff[32]; 510 string rets=" Num "; 511 for(int i=0; i<mNVar; i++) { 512 sprintf(buff, "%8s ", mNames+i*LENNAME1); 513 rets += buff; 514 } 515 rets += '\n'; 516 return(rets); 517 } 518 519 /* --Methode-- */ 520 //++ 521 string NTuple::LineToString(int n) const 522 // Retourne une chaine de caracteres avec le contenu de la ligne "n" 523 // utilisable pour une impression 524 //-- 525 { 526 char buff[32]; 527 double* val; 528 val = GetLineD(n); 529 sprintf(buff,"%6d: ",n); 530 string rets=buff; 531 int i; 532 for(i=0; i<mNVar; i++) { 533 sprintf(buff, "%8.3g ", val[i]); 534 rets += buff; 535 } 536 rets += '\n'; 537 return(rets); 538 } 539 540 541 /* --Methode-- */ 542 //++ 543 void ObjFileIO<NTuple>::WriteSelf(POutPersist& s) const 544 // 545 // Ecriture ppersist du ntuple. 546 //-- 547 { 548 char strg[256]; 549 if (dobj->mInfo) sprintf(strg, "NVar=%6d NEnt=%9d BlkSz=%6d NBlk=%6d HasInfo", 550 (int)dobj->mNVar, (int)dobj->mNEnt, (int)dobj->mBlk, (int)dobj->mNBlk); 551 else sprintf(strg, "NVar=%6d NEnt=%9d BlkSz=%6d NBlk=%6d ", 552 (int)dobj->mNVar, (int)dobj->mNEnt, (int)dobj->mBlk, (int)dobj->mNBlk); 553 s.PutLine(strg); 554 s.PutI4(dobj->mNVar); 555 s.PutBytes(dobj->mNames, dobj->mNVar*LENNAME1); 556 s.PutI4(dobj->mNEnt); 557 s.PutI4(dobj->mBlk); 558 s.PutI4(dobj->mNBlk); 559 if (dobj->mInfo) s << (*(dobj->mInfo)); 560 int jb; 561 for(jb=0; jb<dobj->mNBlk; jb++) 562 s.PutR4s(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk); 291 563 return; 292 564 } … … 294 566 /* --Methode-- */ 295 567 //++ 296 void NTuple::Show(ostream& os) const 297 // 298 // Imprime l'information generale sur le ntuple. 299 //-- 300 { 301 os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt 302 << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n"; 303 os << " Variables Min Max \n"; 304 int i; 305 float min, max; 306 char buff[128]; 307 for(i=0; i<mNVar; i++) { 308 GetMinMax(i, min, max); 309 sprintf(buff, "%3d %16s %10g %10g \n", i, mNames+i*LENNAME1, min, max); 310 os << (string)buff ; 311 } 312 os << endl; 313 } 314 315 316 /* --Methode-- */ 317 //++ 318 void NTuple::WriteSelf(POutPersist& s) const 319 // 320 // Ecriture ppersist du ntuple. 321 //-- 322 { 568 void ObjFileIO<NTuple>::ReadSelf(PInPersist& s) 569 // 570 // Lecture ppersist du ntuple. 571 //-- 572 { 573 574 dobj->Clean(); 575 323 576 char strg[256]; 324 if (mInfo) sprintf(strg, "NVar=%6d NEnt=%9d BlkSz=%6d NBlk=%6d HasInfo", 325 (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk); 326 else sprintf(strg, "NVar=%6d NEnt=%9d BlkSz=%6d NBlk=%6d ", 327 (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk); 328 s.PutLine(strg); 329 s.PutI4(mNVar); 330 s.PutBytes(mNames, mNVar*LENNAME1); 331 s.PutI4(mNEnt); 332 s.PutI4(mBlk); 333 s.PutI4(mNBlk); 334 if (mInfo) s << (*mInfo); 335 int jb; 336 for(jb=0; jb<mNBlk; jb++) 337 s.PutR4s(mPtr[jb], mNVar*mBlk); 338 return; 339 } 340 341 /* --Methode-- */ 342 //++ 343 void NTuple::ReadSelf(PInPersist& s) 344 // 345 // Lecture ppersist du ntuple. 346 //-- 347 { 348 349 Clean(); 350 351 char strg[256]; 352 s.GetLine(strg, 255); 353 // Pour savoir s'il y avait un DVList Info associe 354 bool hadinfo = false; 355 if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0) hadinfo = true; 356 357 s.GetI4(mNVar); 358 mNames = new char[mNVar*LENNAME1]; 359 mVar = new r_4[mNVar]; 360 mVarD = new r_8[mNVar]; 361 s.GetBytes(mNames, mNVar*LENNAME1); 362 s.GetI4(mNEnt); 363 s.GetI4(mBlk); 364 s.GetI4(mNBlk); 365 366 if (hadinfo) { // Lecture eventuelle du DVList Info 367 if (mInfo == NULL) mInfo = new DVList; 368 s >> (*mInfo); 369 } 370 371 int jb; 372 for(jb=0; jb<mNBlk; jb++) { 373 r_4* pt = new r_4[mNVar*mBlk]; 374 mPtr.push_back(pt); 375 s.GetR4s(mPtr[jb], mNVar*mBlk); 376 } 377 } 378 379 NTuple& NTuple::operator=(const NTuple &ntpl) 380 { 381 mNVar= ntpl.mNVar; 382 mNEnt= ntpl.mNEnt; 383 mBlk = ntpl.mBlk; 384 mNBlk= ntpl.mNBlk; 385 386 mVar= new r_4[mNVar]; 387 for(int k = 0; k < mNVar; k++) 388 mVar[k]= ntpl.mVar[k]; 389 390 mVarD= new r_8[mNVar]; 391 for(int k = 0; k < mNVar; k++) 392 mVarD[k]= ntpl.mVarD[k]; 393 394 mNames = new char[mNVar*LENNAME1]; 395 for(int i = 0; i < mNVar; i++) 396 { 397 strncpy(mNames+i*LENNAME1,(ntpl.mNames)+i*LENNAME1, LENNAME); 398 mNames[i*LENNAME1+LENNAME] = '\0'; 399 } 400 401 for(int k = 0; k < mNBlk; k++) 402 { 403 r_4 *ptr= new r_4[mNVar*mBlk]; 404 for(int i = 0; i < mNVar*mBlk; i++) 405 { 406 *(ptr+i)= *(ntpl.mPtr[k]+i); 407 } 408 mPtr.push_back(ptr); 409 } 410 411 mInfo = new DVList; 412 if(ntpl.mInfo) 413 { 414 *mInfo= *(ntpl.mInfo); 415 } 416 else 417 { 418 mInfo = NULL; 419 } 420 421 return *this; 422 } 577 s.GetLine(strg, 255); 578 // Pour savoir s'il y avait un DVList Info associe 579 bool hadinfo = false; 580 if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0) hadinfo = true; 581 582 s.GetI4(dobj->mNVar); 583 dobj->mNames = new char[dobj->mNVar*LENNAME1]; 584 dobj->mVar = new r_4[dobj->mNVar]; 585 dobj->mVarD = new r_8[dobj->mNVar]; 586 s.GetBytes(dobj->mNames, dobj->mNVar*LENNAME1); 587 s.GetI4(dobj->mNEnt); 588 s.GetI4(dobj->mBlk); 589 s.GetI4(dobj->mNBlk); 590 591 if (hadinfo) { // Lecture eventuelle du DVList Info 592 if (dobj->mInfo == NULL) dobj->mInfo = new DVList; 593 s >> (*(dobj->mInfo)); 594 } 595 596 int jb; 597 for(jb=0; jb<dobj->mNBlk; jb++) { 598 r_4* pt = new r_4[dobj->mNVar*dobj->mBlk]; 599 dobj->mPtr.push_back(pt); 600 s.GetR4s(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk); 601 } 602 603 } 604 605 #ifdef __CXX_PRAGMA_TEMPLATES__ 606 #pragma define_template ObjFileIO<NTuple> 607 #endif 608 609 #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) 610 template class ObjFileIO<NTuple>; 611 #endif
Note:
See TracChangeset
for help on using the changeset viewer.