source: Sophya/trunk/SophyaLib/HiStats/ntuple.cc@ 3236

Last change on this file since 3236 was 3236, checked in by ansari, 18 years ago

Ajout namespace SOPHYA ds les fichiers .cc au lieu de include sopnamsp.h en presence de DECL_TEMP_SPEC , cmv+reza 27/04/2007

File size: 18.4 KB
RevLine 
[763]1#include <stdio.h>
2#include <string.h>
3
4#include "strutil.h"
5#include "perrors.h"
6#include "ntuple.h"
7
[3236]8namespace SOPHYA {
[763]9
10#define LENNAME 8
11#define LENNAME1 (LENNAME+1)
[2663]12#define BADVAL -1.e19
[763]13
[1371]14/*!
[3236]15 \class NTuple
[1371]16 \ingroup HiStats
[2667]17 Simple NTuple class (a Table or 2-D data set) with double or
18 single precision floating point value columns.
[1405]19 \sa SOPHYA::ObjFileIO<NTuple>
20
21 \code
22 #include "ntuple.h"
23 // ...
24 char * names[3] = {"XPos", "YPos", "Val"};
[2667]25 // NTuple (Table) creation with 3 columns (double precision)
[1405]26 NTuple nt(3, names);
27 // Filling the NTuple
[2667]28 r_8 x[3];
[1405]29 for(int i=0; i<63; i++) {
30 x[0] = (i%9)-4.; x[1] = (i/9)-3.; x[2] = x[0]*x[0]+x[1]*x[1];
31 nt.Fill(x);
32 }
33 // Printing table info
34 cout << nt ;
35 // Saving object into a PPF file
36 POutPersist po("nt.ppf");
37 po << nt ;
38 \endcode
[1371]39*/
40
[763]41//++
42// Class NTuple
43// Lib Outils++
44// include ntuple.h
45//
46// Classe de ntuples
47//--
48//++
49// Links Parents
50// PPersist
51// NTupleInterface
52//--
53
54/* --Methode-- */
[2808]55//! Default constructor - To be used when reading in an NTuple.
[763]56//++
57NTuple::NTuple()
58//
59// Createur par defaut
60//--
61{
62mNVar = mNEnt = mBlk = mNBlk = 0;
63mVar = NULL;
64mVarD = NULL;
[2663]65mFgDouble = true;
[763]66mInfo = NULL;
67}
68
69
[1405]70//! Constructor with specification of number of columns and column name
71/*!
72 \param nvar : Number of columns in the table
73 \param noms : Array of column names (length(name) < 8 characters)
74 \param blk : Optional argument specifying number of table lines
75 in a given data block
[2663]76 \param fgdouble : if \b true: internal data kept as double precision values (r_8),
77 simple precision (r_4) otherwise
[1405]78 */
[763]79//++
[2663]80NTuple::NTuple(int nvar, char** noms, int blk, bool fgdouble)
[763]81//
82// Createur d'un ntuple de `nvar' variables dont les
[3112]83// noms sont dans le tableau de chaines de caracteres `noms'
[763]84// avec `blk' d'evenements par blocks.
85//--
86{
87mNVar = mNEnt = mBlk = mNBlk = 0;
88mVar = NULL;
89mVarD = NULL;
90mInfo = NULL;
[2507]91if (nvar <= 0) throw ParmError("NTuple::NTuple(nvar<=0) ");
[763]92mNVar = nvar;
93mVar = new r_4[nvar];
94mVarD = new r_8[nvar];
95if (blk < 10) blk = 10;
96mBlk = blk;
[2663]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]);
[763]111return;
112}
113
[3112]114//! Constructor with specification of number of columns and column name
115/*!
116 \param noms : Array of column names (length(name) < 8 characters)
117 \param blk : Optional argument specifying number of table lines
118 in a given data block
119 \param fgdouble : if \b true: internal data kept as double precision values (r_8),
120 simple precision (r_4) otherwise
121 */
122NTuple::NTuple(vector<string>& noms, int blk, bool fgdouble)
123{
124mNVar = mNEnt = mBlk = mNBlk = 0;
125mVar = NULL;
126mVarD = NULL;
127mInfo = NULL;
128int nvar = noms.size();
129if (nvar <= 0) throw ParmError("NTuple::NTuple(nvar<=0) ");
130mNVar = nvar;
131mVar = new r_4[nvar];
132mVarD = new r_8[nvar];
133if (blk < 10) blk = 10;
134mBlk = blk;
135
136if (fgdouble) {
137 r_8* pt = new r_8[nvar*blk];
138 mNBlk = 1;
139 mPtrD.push_back(pt);
140 mFgDouble = true;
141}
142else {
143 r_4* pt = new r_4[nvar*blk];
144 mNBlk = 1;
145 mPtr.push_back(pt);
146 mFgDouble = false;
147}
148for(int i=0; i<nvar; i++) mNames.push_back(noms[i]);
149return;
150}
151
[1405]152//! Copy constructor - Copies the table definition and associated data
[763]153// cmv 8/10/99
154//++
155NTuple::NTuple(const NTuple& NT)
156//
157// Createur par copie (clone).
158//--
159: mNVar(0), mNEnt(0), mBlk(0), mNBlk(0)
[2663]160, mVar(NULL), mVarD(NULL), mInfo(NULL)
[763]161{
162if(NT.mNVar<=0) return; // cas ou NT est cree par defaut
163mNVar = NT.mNVar;
164mBlk = NT.mBlk;
165mVar = new r_4[NT.mNVar];
166mVarD = new r_8[NT.mNVar];
167
[2663]168mNames = NT.mNames;
169
[763]170int i;
[2663]171mFgDouble = NT.mFgDouble;
172if (mFgDouble) {
173 r_8* pt = new r_8[mNVar*mBlk];
174 mNBlk = 1; mPtrD.push_back(pt);
175 if(NT.mNEnt > 0)
176 for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVecD(i,NULL); Fill(pt);}
177}
178else {
179 r_4* pt = new r_4[mNVar*mBlk];
180 mNBlk = 1; mPtr.push_back(pt);
181 for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVec(i,NULL); Fill(pt);}
182}
[763]183
[2663]184mNames = NT.mNames;
[763]185
186if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
187
188return;
189}
190
[2663]191/* --Methode--
[1405]192//! Constructor with table initialized from a PPF file
[763]193//++
194NTuple::NTuple(char *flnm)
195//
196// Createur lecture fichier ppersist.
197//--
198{
199mNVar = mNEnt = mBlk = mNBlk = 0;
200mVar = NULL;
201mVarD = NULL;
202mNames = NULL;
203mInfo = NULL;
204PInPersist s(flnm);
205ObjFileIO<NTuple> fiont(this);
206fiont.Read(s);
207}
[2663]208*/
[763]209
210/* --Methode-- */
211NTuple::~NTuple()
212{
213Clean();
214}
215
216/* --Methode-- */
[1405]217//! Clear the data table definition and deletes the associated data
[763]218void NTuple::Clean()
219{
220if (mVar) delete[] mVar;
221if (mVarD) delete[] mVarD;
222if (mInfo) delete mInfo;
223int i;
[2663]224if(mNBlk>0) {
225 if (mFgDouble) for(i=0; i<mNBlk; i++) delete[] mPtrD[i];
226 else for(i=0; i<mNBlk; i++) delete[] mPtr[i];
227}
228if (mFgDouble) mPtrD.erase(mPtrD.begin(), mPtrD.end());
229else mPtr.erase(mPtr.begin(), mPtr.end());
[763]230mNVar = mNEnt = mBlk = mNBlk = 0;
231mVar = NULL;
232mVarD = NULL;
233mInfo = NULL;
234return;
235}
236
237/* --Methode-- cmv 08/10/99 */
[1405]238//! = operator, copies the data table definition and its contents
[763]239//++
240NTuple& NTuple::operator = (const NTuple& NT)
241//
242// Operateur egal (clone).
243//--
244{
245if(this == &NT) return *this;
246Clean();
247if(NT.mNVar<=0) return *this; // cas ou NT est cree par defaut
248mNVar = NT.mNVar;
249mBlk = NT.mBlk;
250mVar = new r_4[NT.mNVar];
251mVarD = new r_8[NT.mNVar];
252
[2663]253mNames = NT.mNames;
254
[763]255int i;
[2663]256mFgDouble = NT.mFgDouble;
257if (mFgDouble) {
258 r_8* pt = new r_8[mNVar*mBlk];
259 mNBlk = 1; mPtrD.push_back(pt);
260 if(NT.mNEnt > 0)
261 for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVecD(i,NULL); Fill(pt);}
262}
263else {
264 r_4* pt = new r_4[mNVar*mBlk];
265 mNBlk = 1; mPtr.push_back(pt);
266 for(i=0;i<NT.mNEnt;i++) {pt=NT.GetVec(i,NULL); Fill(pt);}
267}
[763]268
269if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
270
271return *this;
272}
273
274/* --Methode-- */
[1405]275//! Adds an entry (a line) to the table
276/*!
277 \param x : content of the line to be appended to the table
278 */
[763]279//++
280void NTuple::Fill(r_4* x)
281//
282// Remplit le ntuple avec le tableau cd reels `x'.
283//--
284{
285int numb = mNEnt/mBlk;
286if (numb >= mNBlk) {
[2663]287 if (mFgDouble) {
288 r_8* pt = new r_8[mNVar*mBlk];
289 mNBlk++;
290 mPtrD.push_back(pt);
291 }
292 else {
293 r_4* pt = new r_4[mNVar*mBlk];
294 mNBlk++;
295 mPtr.push_back(pt);
296 }
[763]297}
[2663]298
[763]299int offb = mNEnt-numb*mBlk;
[2663]300if (mFgDouble)
301 for(int i=0; i<mNVar; i++) (mPtrD[numb]+offb*mNVar)[i] = x[i];
302else memcpy((mPtr[numb]+offb*mNVar), x, mNVar*sizeof(r_4));
[763]303mNEnt++;
304return;
305}
306
[2663]307/* --Methode-- */
308//! Adds an entry (a line) to the table (double precision)
309/*!
310 \param x : content of the line to be appended to the table
311 */
312//++
313void NTuple::Fill(r_8* x)
314//
315// Remplit le ntuple avec le tableau double precision `x'.
316//--
317{
318int numb = mNEnt/mBlk;
319if (numb >= mNBlk) {
320 if (mFgDouble) {
321 r_8* pt = new r_8[mNVar*mBlk];
322 mNBlk++;
323 mPtrD.push_back(pt);
324 }
325 else {
326 r_4* pt = new r_4[mNVar*mBlk];
327 mNBlk++;
328 mPtr.push_back(pt);
329 }
330}
[763]331
[2663]332int offb = mNEnt-numb*mBlk;
333if (mFgDouble)
334 memcpy((mPtrD[numb]+offb*mNVar), x, mNVar*sizeof(r_8));
335else
336 for(int i=0; i<mNVar; i++) (mPtr[numb]+offb*mNVar)[i] = x[i];
337
338mNEnt++;
339return;
340}
341
342
[763]343/* --Methode-- */
344//++
345float NTuple::GetVal(int n, int k) const
346//
347// Retourne la valeur de la variable `k' de l'evenement `n'.
348//--
349{
350if (n >= mNEnt) return(BADVAL);
351if ( (k < 0) || (k >= mNVar) ) return(BADVAL);
352int numb = n/mBlk;
353int offb = n-numb*mBlk;
[2663]354if ( mFgDouble) return(*(mPtrD[numb]+offb*mNVar+k));
355else return(*(mPtr[numb]+offb*mNVar+k));
[763]356}
357
358
359/* --Methode-- */
360//++
361int NTuple::IndexNom(const char* nom) const
362//
363// Retourne le numero de la variable de nom `nom'.
364//--
365{
366int i;
[2663]367string snom = nom;
[763]368for(i=0; i<mNVar; i++)
[2663]369 if ( mNames[i] == snom) return(i);
[763]370return(-1);
371}
372
373
[2663]374static char nomretour[256];
[763]375/* --Methode-- */
376//++
377char* NTuple::NomIndex(int k) const
378//
379// Retourne le nom de la variable numero 'k'
380//--
381{
382nomretour[0] = '\0';
[2663]383if ((k >= 0) && (k < mNVar)) strncpy(nomretour, mNames[k].c_str(), 255);
[763]384return(nomretour);
385}
386
387
388/* --Methode-- */
389//++
390r_4* NTuple::GetVec(int n, r_4* ret) const
391//
392// Retourne l'evenement `n' dans le vecteur `ret'.
393//--
394{
395int i;
396if (ret == NULL) ret = mVar;
397if (n >= mNEnt) {
398 for(i=0; i<mNVar; i++) ret[i] = BADVAL;
399 return(ret);
400}
401
402int numb = n/mBlk;
403int offb = n-numb*mBlk;
[2663]404if (mFgDouble) for(i=0; i<mNVar; i++) ret[i] = (mPtrD[numb]+offb*mNVar)[i];
405else memcpy(ret, (mPtr[numb]+offb*mNVar), mNVar*sizeof(r_4));
[763]406return(ret);
407}
408
409/* --Methode-- */
410//++
411r_8* NTuple::GetVecD(int n, r_8* ret) const
412//
413// Retourne l'evenement `n' dans le vecteur `ret'.
414//--
415{
416int i;
417if (ret == NULL) ret = mVarD;
[2663]418if (n >= mNEnt) {
419 for(i=0; i<mNVar; i++) ret[i] = BADVAL;
420 return(ret);
421}
422
423int numb = n/mBlk;
424int offb = n-numb*mBlk;
[2667]425if (mFgDouble) memcpy(ret, (mPtrD[numb]+offb*mNVar), mNVar*sizeof(r_8));
426else for(i=0; i<mNVar; i++) ret[i] = (mPtr[numb]+offb*mNVar)[i];
[763]427return(ret);
428}
429
430
431
432/* --Methode-- */
433//++
434DVList& NTuple::Info()
435//
436// Renvoie une référence sur l'objet DVList Associé
437//--
438{
439if (mInfo == NULL) mInfo = new DVList;
440return(*mInfo);
441}
442
443/* --Methode-- */
444//++
445void NTuple::Print(int num, int nmax) const
446//
447// Imprime `nmax' evenements a partir du numero `num'.
448//--
449{
450int i,j;
451
452printf("Num ");
[2663]453for(i=0; i<mNVar; i++) printf("%8s ", mNames[i].c_str());
[763]454putchar('\n');
455
456if (nmax <= 0) nmax = 1;
457if (num < 0) num = 0;
458nmax += num;
459if (nmax > mNEnt) nmax = mNEnt;
460for(i=num; i<nmax; i++) {
461 GetVec(i, NULL);
462 printf("%6d ", i);
463 for(j=0; j<mNVar; j++) printf("%8g ", (float)mVar[j]);
464 putchar('\n');
465}
466return;
467}
468
469/* --Methode-- */
[1405]470//! Prints table definition and number of entries
[763]471//++
472void NTuple::Show(ostream& os) const
473//
474// Imprime l'information generale sur le ntuple.
475//--
476{
[2663]477char * tt = "float";
478if (mFgDouble) tt = "double";
479os << "NTuple T=" << tt << " : NVar= " << mNVar << " NEnt=" << mNEnt
[763]480 << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n";
481os << " Variables Min Max \n";
482int i;
483double min, max;
484char buff[128];
485for(i=0; i<mNVar; i++) {
486 GetMinMax(i, min, max);
[2663]487 sprintf(buff, "%3d %16s %10g %10g \n", i, mNames[i].c_str(), min, max);
[763]488 os << (string)buff ;
489 }
490os << endl;
491}
492
493
494/* --Methode-- */
[1405]495//! Fills the table, reading lines from an ascii file
496/*!
497 \param fn : file name
498 \param defval : default value for empty cells in the ascii file
499 */
[763]500//++
501int NTuple::FillFromASCIIFile(string const& fn, float defval)
502//
503// Remplit le ntuple a partir d'un fichier ASCII.
504// Renvoie le nombre de lignes ajoutees.
505//--
506{
507if (NbColumns() < 1) {
508 cout << "NTuple::FillFromASCIIFile() Ntuple has " << NbColumns() << " columns" << endl;
509 return(-1);
510 }
511FILE * fip = fopen(fn.c_str(), "r");
512if (fip == NULL) {
513 cout << "NTuple::FillFromASCIIFile() Error opening file " << fn << endl;
514 return(-2);
515 }
516
517char lineb[4096];
518char *line;
519char* ccp;
[809]520int j,kk;
[763]521int postab, posb;
[2663]522double* xv = new double[NbColumns()];
[763]523
524int nlread = 0;
525int nvar = NbColumns();
526// On boucle sur toutes les lignes
527while (fgets(lineb,4096,fip) != NULL) {
528 lineb[4095] = '\0';
529 j = 0; line = lineb;
530// On enleve les espaces et tab de debut
531 while ( (line[j] != '\0') && ((line[j] == ' ') || (line[j] == '\t')) ) j++;
532 line = lineb+j;
533// Il faut que le premier caractere non-espace soit un digit, ou + ou - ou .
534 if (!( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') )) continue;
535 ccp = line;
536 for(kk=0; kk<nvar; kk++) xv[kk] = defval;
537 for(kk=0; kk<nvar; kk++) {
538// Les mots sont separes par des espaces ou des tab
539 postab = posc(ccp, '\t' );
540 posb = posc(ccp, ' ' );
541 if (postab >= 0) {
542 if (posb < 0) posb = postab;
543 else if (postab < posb) posb = postab;
544 }
545 if (posb >= 0) ccp[posb] = '\0';
546 if ( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') )
547 xv[kk] = atof(ccp);
548 if (posb < 0) break;
549 ccp += posb+1; j = 0;
550 while ( (ccp[j] != '\0') && ((ccp[j] == ' ') || (ccp[j] == '\t')) ) j++;
551 ccp += j;
552 }
553 Fill(xv);
554 nlread++;
555 }
556
557delete[] xv;
558cout << "NTuple::FillFromASCIIFile( " << fn << ") " << nlread << " fill from file " << endl;
559return(nlread);
560}
561
562
563// ------- Implementation de l interface NTuple ---------
564
565/* --Methode-- */
[2682]566sa_size_t NTuple::NbLines() const
[763]567{
568return(NEntry());
569}
570/* --Methode-- */
[2682]571sa_size_t NTuple::NbColumns() const
[763]572{
573return(NVar());
574}
575
576/* --Methode-- */
[2682]577r_8 * NTuple::GetLineD(sa_size_t n) const
[763]578{
579return(GetVecD(n));
580}
581
582/* --Methode-- */
[2682]583r_8 NTuple::GetCell(sa_size_t n, sa_size_t k) const
[763]584{
585return(GetVal(n, k));
586}
587
588/* --Methode-- */
[2682]589r_8 NTuple::GetCell(sa_size_t n, string const & nom) const
[763]590{
591return(GetVal(n, nom.c_str()));
592}
593
594/* --Methode-- */
595//++
[2682]596void NTuple::GetMinMax(sa_size_t k, double& min, double& max) const
[763]597//
598// Retourne le minimum et le maximum de la variable `k'.
599//--
600{
601min = 9.e19; max = -9.e19;
602if ( (k < 0) || (k >= mNVar) ) return;
603int jb,ib,i;
604double x;
605i=0;
606for(jb=0; jb< mNBlk; jb++)
607 for(ib=0; ib< mBlk; ib++) {
608 if (i >= mNEnt) break;
609 i++;
[2663]610 x = (mFgDouble) ? *(mPtrD[jb]+ib*mNVar+k) : *(mPtr[jb]+ib*mNVar+k);
[763]611 if(i==1) {min = x; max = x;}
612 if (x < min) min = x;
613 if (x > max) max = x;
614 }
615return;
616}
617
618/* --Methode-- */
619void NTuple::GetMinMax(string const & nom, double& min, double& max) const
620{
621GetMinMax(IndexNom(nom.c_str()), min, max);
622}
623
624/* --Methode-- */
[2682]625sa_size_t NTuple::ColumnIndex(string const & nom) const
[763]626{
627return(IndexNom(nom.c_str()));
628}
629
630/* --Methode-- */
[2682]631string NTuple::ColumnName(sa_size_t k) const
[763]632{
633return(NomIndex(k));
634}
635
636/* --Methode-- */
637//++
638string NTuple::VarList_C(const char* nomx) const
639//
640// Retourne une chaine de caracteres avec la declaration des noms de
641// variables. si "nomx!=NULL" , des instructions d'affectation
642// a partir d'un tableau "nomx[i]" sont ajoutees.
643//--
644{
645string rets="";
646int i;
647for(i=0; i<mNVar; i++) {
648 if ( (i%5 == 0) && (i > 0) ) rets += ";";
649 if (i%5 == 0) rets += "\ndouble ";
650 else rets += ",";
[2663]651 rets += mNames[i];
[763]652 }
653rets += "; \n";
654if (nomx) {
655 char buff[256];
656 for(i=0; i<mNVar; i++) {
[2663]657 sprintf(buff,"%s=%s[%d]; ", mNames[i].c_str(), nomx, i);
[763]658 rets += buff;
659 if ( (i%3 == 0) && (i > 0) ) rets += "\n";
660 }
661 }
662
663return(rets);
664}
665
666
667/* --Methode-- */
668//++
669string NTuple::LineHeaderToString() const
670// Retourne une chaine de caracteres avec la liste des noms de
671// variables, utilisables pour une impression
672//--
673{
674char buff[32];
675string rets=" Num ";
676for(int i=0; i<mNVar; i++) {
[2663]677 sprintf(buff, "%8s ", mNames[i].c_str());
[763]678 rets += buff;
679 }
680rets += '\n';
681return(rets);
682}
683
684/* --Methode-- */
685//++
[2682]686string NTuple::LineToString(sa_size_t n) const
[763]687// Retourne une chaine de caracteres avec le contenu de la ligne "n"
688// utilisable pour une impression
689//--
690{
691char buff[32];
692double* val;
693val = GetLineD(n);
694sprintf(buff,"%6d: ",n);
695string rets=buff;
696int i;
697for(i=0; i<mNVar; i++) {
698 sprintf(buff, "%8.3g ", val[i]);
699 rets += buff;
700 }
701rets += '\n';
702return(rets);
703}
704
[1405]705/*!
[3236]706 \class ObjFileIO<NTuple>
[1405]707 \ingroup HiStats
708 Persistence (serialisation) handler for class NTuple
709*/
[763]710
[846]711/* --Methode-- */
[763]712//++
[2341]713DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
[763]714void ObjFileIO<NTuple>::WriteSelf(POutPersist& s) const
715//
716// Ecriture ppersist du ntuple.
717//--
718{
[1155]719if (dobj == NULL) return;
720
[2663]721// On ecrit cette chaine pour compatibilite avec les anciennes version (1,2)
[1155]722string strg = "NTuple";
723s.Put(strg);
724
725// On ecrit 3 uint_4 ....
[2663]726// [0]: Numero de version ;
727// [1] : bit1 non nul -> has info, bit 2 non nul mFgDouble=true
728// [2] : reserve
[1155]729uint_4 itab[3];
[2663]730itab[0] = 3; // Numero de version a 3
[1155]731itab[1] = itab[2] = 0;
732if (dobj->mInfo) itab[1] = 1;
[2663]733if (dobj->mFgDouble) itab[1] += 2;
[1155]734s.Put(itab, 3);
735
736s.Put(dobj->mNVar);
[2663]737for(int k=0; k<dobj->mNVar; k++) s.Put(dobj->mNames[k]);
[1155]738s.Put(dobj->mNEnt);
739s.Put(dobj->mBlk);
740s.Put(dobj->mNBlk);
[2663]741
[763]742if (dobj->mInfo) s << (*(dobj->mInfo));
743int jb;
[2663]744if (dobj->mFgDouble)
745 for(jb=0; jb<dobj->mNBlk; jb++)
746 s.Put(dobj->mPtrD[jb], dobj->mNVar*dobj->mBlk);
747else
748 for(jb=0; jb<dobj->mNBlk; jb++)
749 s.Put(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
[763]750return;
751}
752
753/* --Methode-- */
754//++
[2341]755DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
[763]756void ObjFileIO<NTuple>::ReadSelf(PInPersist& s)
757//
758// Lecture ppersist du ntuple.
759//--
760{
761
[1155]762if (dobj == NULL) dobj = new NTuple;
763else dobj->Clean();
[763]764
765bool hadinfo = false;
[1155]766string strg;
767s.Get(strg);
[2663]768uint_4 itab[3] = {0,0,0};
[1155]769if (strg == "NTuple") {
770 s.Get(itab, 3);
[2663]771 if ( ((itab[0] < 3) && (itab[1] != 0)) ||
772 ((itab[0] >= 3) && ((itab[1]&1) == 1)) ) hadinfo = true;
[1155]773}
774else {
775// Ancienne version de PPF NTuple - Pour savoir s'il y avait un DVList Info associe
776 char buff[256];
777 strcpy(buff, strg.c_str());
778 if (strncmp(buff+strlen(buff)-7, "HasInfo", 7) == 0) hadinfo = true;
779}
[2663]780if (itab[0] < 3) { // Lecture version anterieures V= 1 , 2
781 s.Get(dobj->mNVar);
782 dobj->mVar = new r_4[dobj->mNVar];
783 dobj->mVarD = new r_8[dobj->mNVar];
784
785 char * names = new char[dobj->mNVar*LENNAME1];
786 s.GetBytes(names, dobj->mNVar*LENNAME1);
787 for(int k=0; k<dobj->mNVar; k++) dobj->mNames.push_back(names+k*LENNAME1);
788 s.Get(dobj->mNEnt);
789 s.Get(dobj->mBlk);
790 s.Get(dobj->mNBlk);
791 if (hadinfo) { // Lecture eventuelle du DVList Info
792 if (dobj->mInfo == NULL) dobj->mInfo = new DVList;
793 s >> (*(dobj->mInfo));
[763]794 }
[2663]795 // Il n'y avait que des NTuple avec data float pour V < 3
796 dobj->mFgDouble = false;
797 int jb;
798 for(jb=0; jb<dobj->mNBlk; jb++) {
799 r_4* pt = new r_4[dobj->mNVar*dobj->mBlk];
800 dobj->mPtr.push_back(pt);
801 s.Get(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
802 }
[763]803}
[2663]804else { // Lecture version V 3
805 s.Get(dobj->mNVar);
806 dobj->mVar = new r_4[dobj->mNVar];
807 dobj->mVarD = new r_8[dobj->mNVar];
808 string nom;
809 for(int k=0; k<dobj->mNVar; k++) {
810 s.Get(nom);
811 dobj->mNames.push_back(nom);
812 }
813 s.Get(dobj->mNEnt);
814 s.Get(dobj->mBlk);
815 s.Get(dobj->mNBlk);
816 if (hadinfo) { // Lecture eventuelle du DVList Info
817 if (dobj->mInfo == NULL) dobj->mInfo = new DVList;
818 s >> (*(dobj->mInfo));
819 }
820 // Il n'y avait que des NTuple avec data float pour V < 3
821 dobj->mFgDouble = ((itab[1]&2) == 2) ? true : false;
822 int jb;
823 if (dobj->mFgDouble) {
824 for(jb=0; jb<dobj->mNBlk; jb++) {
825 r_8* pt = new r_8[dobj->mNVar*dobj->mBlk];
826 dobj->mPtrD.push_back(pt);
827 s.Get(dobj->mPtrD[jb], dobj->mNVar*dobj->mBlk);
828 }
829 }
830 else {
831 for(jb=0; jb<dobj->mNBlk; jb++) {
832 r_4* pt = new r_4[dobj->mNVar*dobj->mBlk];
833 dobj->mPtr.push_back(pt);
834 s.Get(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
835 }
836 }
837} // Fin lecture V3
[763]838
839}
840
[846]841
[763]842#ifdef __CXX_PRAGMA_TEMPLATES__
843#pragma define_template ObjFileIO<NTuple>
844#endif
845
846#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
[3236]847template class ObjFileIO<NTuple>;
[763]848#endif
[3236]849
850} // FIN namespace SOPHYA
Note: See TracBrowser for help on using the repository browser.