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

Last change on this file since 3204 was 3112, checked in by cmv, 19 years ago

ajout constructeur NTuple avec vector<string> cmv 01/12/2006

File size: 18.4 KB
Line 
1#include <stdio.h>
2#include <string.h>
3
4#include "sopnamsp.h"
5#include "strutil.h"
6#include "perrors.h"
7#include "ntuple.h"
8
9
10#define LENNAME 8
11#define LENNAME1 (LENNAME+1)
12#define BADVAL -1.e19
13
14/*!
15 \class SOPHYA::NTuple
16 \ingroup HiStats
17 Simple NTuple class (a Table or 2-D data set) with double or
18 single precision floating point value columns.
19 \sa SOPHYA::ObjFileIO<NTuple>
20
21 \code
22 #include "ntuple.h"
23 // ...
24 char * names[3] = {"XPos", "YPos", "Val"};
25 // NTuple (Table) creation with 3 columns (double precision)
26 NTuple nt(3, names);
27 // Filling the NTuple
28 r_8 x[3];
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
39*/
40
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-- */
55//! Default constructor - To be used when reading in an NTuple.
56//++
57NTuple::NTuple()
58//
59// Createur par defaut
60//--
61{
62mNVar = mNEnt = mBlk = mNBlk = 0;
63mVar = NULL;
64mVarD = NULL;
65mFgDouble = true;
66mInfo = NULL;
67}
68
69
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
76 \param fgdouble : if \b true: internal data kept as double precision values (r_8),
77 simple precision (r_4) otherwise
78 */
79//++
80NTuple::NTuple(int nvar, char** noms, int blk, bool fgdouble)
81//
82// Createur d'un ntuple de `nvar' variables dont les
83// noms sont dans le tableau de chaines de caracteres `noms'
84// avec `blk' d'evenements par blocks.
85//--
86{
87mNVar = mNEnt = mBlk = mNBlk = 0;
88mVar = NULL;
89mVarD = NULL;
90mInfo = NULL;
91if (nvar <= 0) throw ParmError("NTuple::NTuple(nvar<=0) ");
92mNVar = nvar;
93mVar = new r_4[nvar];
94mVarD = new r_8[nvar];
95if (blk < 10) blk = 10;
96mBlk = blk;
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]);
111return;
112}
113
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
152//! Copy constructor - Copies the table definition and associated data
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)
160, mVar(NULL), mVarD(NULL), mInfo(NULL)
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
168mNames = NT.mNames;
169
170int i;
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}
183
184mNames = NT.mNames;
185
186if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
187
188return;
189}
190
191/* --Methode--
192//! Constructor with table initialized from a PPF file
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}
208*/
209
210/* --Methode-- */
211NTuple::~NTuple()
212{
213Clean();
214}
215
216/* --Methode-- */
217//! Clear the data table definition and deletes the associated data
218void NTuple::Clean()
219{
220if (mVar) delete[] mVar;
221if (mVarD) delete[] mVarD;
222if (mInfo) delete mInfo;
223int i;
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());
230mNVar = mNEnt = mBlk = mNBlk = 0;
231mVar = NULL;
232mVarD = NULL;
233mInfo = NULL;
234return;
235}
236
237/* --Methode-- cmv 08/10/99 */
238//! = operator, copies the data table definition and its contents
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
253mNames = NT.mNames;
254
255int i;
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}
268
269if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
270
271return *this;
272}
273
274/* --Methode-- */
275//! Adds an entry (a line) to the table
276/*!
277 \param x : content of the line to be appended to the table
278 */
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) {
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 }
297}
298
299int offb = mNEnt-numb*mBlk;
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));
303mNEnt++;
304return;
305}
306
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}
331
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
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;
354if ( mFgDouble) return(*(mPtrD[numb]+offb*mNVar+k));
355else return(*(mPtr[numb]+offb*mNVar+k));
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;
367string snom = nom;
368for(i=0; i<mNVar; i++)
369 if ( mNames[i] == snom) return(i);
370return(-1);
371}
372
373
374static char nomretour[256];
375/* --Methode-- */
376//++
377char* NTuple::NomIndex(int k) const
378//
379// Retourne le nom de la variable numero 'k'
380//--
381{
382nomretour[0] = '\0';
383if ((k >= 0) && (k < mNVar)) strncpy(nomretour, mNames[k].c_str(), 255);
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;
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));
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;
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;
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];
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 ");
453for(i=0; i<mNVar; i++) printf("%8s ", mNames[i].c_str());
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-- */
470//! Prints table definition and number of entries
471//++
472void NTuple::Show(ostream& os) const
473//
474// Imprime l'information generale sur le ntuple.
475//--
476{
477char * tt = "float";
478if (mFgDouble) tt = "double";
479os << "NTuple T=" << tt << " : NVar= " << mNVar << " NEnt=" << mNEnt
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);
487 sprintf(buff, "%3d %16s %10g %10g \n", i, mNames[i].c_str(), min, max);
488 os << (string)buff ;
489 }
490os << endl;
491}
492
493
494/* --Methode-- */
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 */
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;
520int j,kk;
521int postab, posb;
522double* xv = new double[NbColumns()];
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-- */
566sa_size_t NTuple::NbLines() const
567{
568return(NEntry());
569}
570/* --Methode-- */
571sa_size_t NTuple::NbColumns() const
572{
573return(NVar());
574}
575
576/* --Methode-- */
577r_8 * NTuple::GetLineD(sa_size_t n) const
578{
579return(GetVecD(n));
580}
581
582/* --Methode-- */
583r_8 NTuple::GetCell(sa_size_t n, sa_size_t k) const
584{
585return(GetVal(n, k));
586}
587
588/* --Methode-- */
589r_8 NTuple::GetCell(sa_size_t n, string const & nom) const
590{
591return(GetVal(n, nom.c_str()));
592}
593
594/* --Methode-- */
595//++
596void NTuple::GetMinMax(sa_size_t k, double& min, double& max) const
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++;
610 x = (mFgDouble) ? *(mPtrD[jb]+ib*mNVar+k) : *(mPtr[jb]+ib*mNVar+k);
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-- */
625sa_size_t NTuple::ColumnIndex(string const & nom) const
626{
627return(IndexNom(nom.c_str()));
628}
629
630/* --Methode-- */
631string NTuple::ColumnName(sa_size_t k) const
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 += ",";
651 rets += mNames[i];
652 }
653rets += "; \n";
654if (nomx) {
655 char buff[256];
656 for(i=0; i<mNVar; i++) {
657 sprintf(buff,"%s=%s[%d]; ", mNames[i].c_str(), nomx, i);
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++) {
677 sprintf(buff, "%8s ", mNames[i].c_str());
678 rets += buff;
679 }
680rets += '\n';
681return(rets);
682}
683
684/* --Methode-- */
685//++
686string NTuple::LineToString(sa_size_t n) const
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
705/*!
706 \class SOPHYA::ObjFileIO<NTuple>
707 \ingroup HiStats
708 Persistence (serialisation) handler for class NTuple
709*/
710
711/* --Methode-- */
712//++
713DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
714void ObjFileIO<NTuple>::WriteSelf(POutPersist& s) const
715//
716// Ecriture ppersist du ntuple.
717//--
718{
719if (dobj == NULL) return;
720
721// On ecrit cette chaine pour compatibilite avec les anciennes version (1,2)
722string strg = "NTuple";
723s.Put(strg);
724
725// On ecrit 3 uint_4 ....
726// [0]: Numero de version ;
727// [1] : bit1 non nul -> has info, bit 2 non nul mFgDouble=true
728// [2] : reserve
729uint_4 itab[3];
730itab[0] = 3; // Numero de version a 3
731itab[1] = itab[2] = 0;
732if (dobj->mInfo) itab[1] = 1;
733if (dobj->mFgDouble) itab[1] += 2;
734s.Put(itab, 3);
735
736s.Put(dobj->mNVar);
737for(int k=0; k<dobj->mNVar; k++) s.Put(dobj->mNames[k]);
738s.Put(dobj->mNEnt);
739s.Put(dobj->mBlk);
740s.Put(dobj->mNBlk);
741
742if (dobj->mInfo) s << (*(dobj->mInfo));
743int jb;
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);
750return;
751}
752
753/* --Methode-- */
754//++
755DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
756void ObjFileIO<NTuple>::ReadSelf(PInPersist& s)
757//
758// Lecture ppersist du ntuple.
759//--
760{
761
762if (dobj == NULL) dobj = new NTuple;
763else dobj->Clean();
764
765bool hadinfo = false;
766string strg;
767s.Get(strg);
768uint_4 itab[3] = {0,0,0};
769if (strg == "NTuple") {
770 s.Get(itab, 3);
771 if ( ((itab[0] < 3) && (itab[1] != 0)) ||
772 ((itab[0] >= 3) && ((itab[1]&1) == 1)) ) hadinfo = true;
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}
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));
794 }
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 }
803}
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
838
839}
840
841
842#ifdef __CXX_PRAGMA_TEMPLATES__
843#pragma define_template ObjFileIO<NTuple>
844#endif
845
846#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
847template class SOPHYA::ObjFileIO<NTuple>;
848#endif
Note: See TracBrowser for help on using the repository browser.