source: Sophya/trunk/SophyaLib/NTools/ntuple.cc@ 297

Last change on this file since 297 was 297, checked in by ansari, 26 years ago

NTuple: Compatibilite NTupleInterface - Reza 15/5/99

File size: 7.0 KB
Line 
1#include <stdio.h>
2#include <string.h>
3
4#include "perrors.h"
5#include "ntuple.h"
6
7
8#define BADVAL -1.e19
9#define LENNAME 8
10#define LENNAME1 (LENNAME+1)
11
12//++
13// Class NTuple
14// Lib Outils++
15// include ntuple.h
16//
17// Classe de ntuples
18//--
19
20/* --Methode-- */
21//++
22NTuple::NTuple()
23//
24// Createur par defaut
25//--
26{
27mNVar = mNEnt = mBlk = mNBlk = 0;
28mVar = NULL;
29mVarD = NULL;
30mNames = NULL;
31mInfo = NULL;
32}
33
34
35//++
36NTuple::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{
43mNVar = mNEnt = mBlk = mNBlk = 0;
44mVar = NULL;
45mVarD = NULL;
46mNames = NULL;
47mInfo = NULL;
48if (nvar <= 0) THROW(sizeMismatchErr);
49mNVar = nvar;
50mVar = new r_4[nvar];
51mVarD = new r_8[nvar];
52if (blk < 10) blk = 10;
53mBlk = blk;
54// On prend des noms de LENNAME char pour le moment
55mNames = new char[nvar*LENNAME1];
56r_4* pt = new r_4[nvar*blk];
57mNBlk = 1;
58mPtr.push_back(pt);
59int i;
60for(i=0; i<nvar; i++)
61 { strncpy(mNames+i*LENNAME1, noms[i], LENNAME);
62 mNames[i*LENNAME1+LENNAME] = '\0'; }
63return;
64}
65
66/* --Methode-- */
67//++
68NTuple::NTuple(char *flnm)
69//
70// Createur lecture fichier ppersist.
71//--
72{
73mNVar = mNEnt = mBlk = mNBlk = 0;
74mVar = NULL;
75mVarD = NULL;
76mNames = NULL;
77mInfo = NULL;
78PInPersist s(flnm);
79Read(s);
80}
81
82/* --Methode-- */
83NTuple::~NTuple()
84{
85Clean();
86}
87
88/* --Methode-- */
89void NTuple::Clean()
90{
91if (mVar) delete[] mVar;
92if (mVarD) delete[] mVarD;
93if (mNames) delete[] mNames;
94if (mInfo) delete mInfo;
95int i;
96for(i=0; i<mNBlk; i++) delete[] mPtr[i];
97mPtr.erase(mPtr.begin(), mPtr.end());
98mNVar = mNEnt = mBlk = mNBlk = 0;
99mVar = NULL;
100mVarD = NULL;
101mNames = NULL;
102return;
103}
104
105/* --Methode-- */
106//++
107void NTuple::Fill(r_4* x)
108//
109// Remplit le ntuple avec le tableau cd reels `x'.
110//--
111{
112int numb = mNEnt/mBlk;
113if (numb >= mNBlk) {
114 r_4* pt = new r_4[mNVar*mBlk];
115 mNBlk++;
116 mPtr.push_back(pt);
117}
118int offb = mNEnt-numb*mBlk;
119memcpy((mPtr[numb]+offb*mNVar), x, mNVar*sizeof(r_4));
120mNEnt++;
121return;
122}
123
124
125/* --Methode-- */
126//++
127float NTuple::GetVal(int n, int k) const
128//
129// Retourne la valeur de la variable `k' de l'evenement `n'.
130//--
131{
132if (n >= mNEnt) return(BADVAL);
133if ( (k < 0) || (k >= mNVar) ) return(BADVAL);
134int numb = n/mBlk;
135int offb = n-numb*mBlk;
136return(*(mPtr[numb]+offb*mNVar+k));
137}
138
139
140/* --Methode-- */
141//++
142int NTuple::IndexNom(const char* nom) const
143//
144// Retourne le numero de la variable de nom `nom'.
145//--
146{
147int i;
148for(i=0; i<mNVar; i++)
149 if ( strcmp(nom, mNames+i*LENNAME1) == 0) return(i);
150return(-1);
151}
152
153
154static char nomretour[2*LENNAME1];
155/* --Methode-- */
156//++
157char* NTuple::NomIndex(int k) const
158//
159// Retourne le nom de la variable numero 'k'
160//--
161{
162nomretour[0] = '\0';
163if ((k >= 0) && (k < mNVar)) strcpy(nomretour, mNames+k*LENNAME1);
164return(nomretour);
165}
166
167/* --Methode-- */
168//++
169string NTuple::VarList_C(const char* nomx) const
170//
171// Retourne une chaine de caracteres avec la declaration des noms de
172// variables. si "nomx!=NULL" , des instructions d'affectation
173// a partir d'un tableau "nomx[i]" sont ajoutees.
174//--
175{
176string rets;
177int i;
178for(i=0; i<mNVar; i++) {
179 if ( (i%5 == 0) && (i > 0) ) rets += ";";
180 if (i%5 == 0) rets += "\ndouble ";
181 else rets += ",";
182 rets += mNames+i*LENNAME1;
183 }
184rets += "; \n";
185if (nomx) {
186 char buff[256];
187 for(i=0; i<mNVar; i++) {
188 sprintf(buff,"%s=%s[%d]; ", mNames+i*LENNAME1, nomx, i);
189 rets += buff;
190 if ( (i%3 == 0) && (i > 0) ) rets += "\n";
191 }
192 }
193
194return(rets);
195}
196
197
198
199/* --Methode-- */
200//++
201r_4* NTuple::GetVec(int n, r_4* ret) const
202//
203// Retourne l'evenement `n' dans le vecteur `ret'.
204//--
205{
206int i;
207if (ret == NULL) ret = mVar;
208if (n >= mNEnt) {
209 for(i=0; i<mNVar; i++) ret[i] = BADVAL;
210 return(ret);
211}
212
213int numb = n/mBlk;
214int offb = n-numb*mBlk;
215memcpy(ret, (mPtr[numb]+offb*mNVar), mNVar*sizeof(r_4));
216return(ret);
217}
218
219/* --Methode-- */
220//++
221r_8* NTuple::GetVecD(int n, r_8* ret) const
222//
223// Retourne l'evenement `n' dans le vecteur `ret'.
224//--
225{
226int i;
227if (ret == NULL) ret = mVarD;
228float * fr = GetVec(n);
229for(i=0; i<mNVar; i++) ret[i] = fr[i];
230return(ret);
231}
232
233/* --Methode-- */
234//++
235void NTuple::GetMinMax(int k, float& min, float& max) const
236//
237// Retourne le minimum et le maximum de la variable `k'.
238//--
239{
240min = 9.e19; max = -9.e19;
241if ( (k < 0) || (k >= mNVar) ) return;
242int jb,ib,i;
243float x;
244i=0;
245for(jb=0; jb< mNBlk; jb++)
246 for(ib=0; ib< mBlk; ib++) {
247 if (i >= mNEnt) break;
248 i++;
249 x = *(mPtr[jb]+ib*mNVar+k);
250 if(i==1) {min = x; max = x;}
251 if (x < min) min = x;
252 if (x > max) max = x;
253 }
254return;
255}
256
257/* --Methode-- */
258//++
259DVList& NTuple::Info()
260//
261// Renvoie une référence sur l'objet DVList Associé
262//--
263{
264if (mInfo == NULL) mInfo = new DVList;
265return(*mInfo);
266}
267
268/* --Methode-- */
269//++
270void NTuple::Print(int num, int nmax) const
271//
272// Imprime `nmax' evenements a partir du numero `num'.
273//--
274{
275int i,j;
276
277printf("Num ");
278for(i=0; i<mNVar; i++) printf("%8s ", mNames+i*LENNAME1);
279putchar('\n');
280
281if (nmax <= 0) nmax = 1;
282if (num < 0) num = 0;
283nmax += num;
284if (nmax > mNEnt) nmax = mNEnt;
285for(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}
291return;
292}
293
294/* --Methode-- */
295//++
296void NTuple::Show(ostream& os) const
297//
298// Imprime l'information generale sur le ntuple.
299//--
300{
301os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt
302 << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n";
303os << " Variables Min Max \n";
304int i;
305float min, max;
306char buff[128];
307for(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 }
312os << endl;
313}
314
315
316/* --Methode-- */
317//++
318void NTuple::WriteSelf(POutPersist& s) const
319//
320// Ecriture ppersist du ntuple.
321//--
322{
323char strg[256];
324if (mInfo) sprintf(strg, "NVar=%6d NEnt=%9d BlkSz=%6d NBlk=%6d HasInfo",
325 (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk);
326else sprintf(strg, "NVar=%6d NEnt=%9d BlkSz=%6d NBlk=%6d ",
327 (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk);
328s.PutLine(strg);
329s.PutI4(mNVar);
330s.PutBytes(mNames, mNVar*LENNAME1);
331s.PutI4(mNEnt);
332s.PutI4(mBlk);
333s.PutI4(mNBlk);
334if (mInfo) s << (*mInfo);
335int jb;
336for(jb=0; jb<mNBlk; jb++)
337 s.PutR4s(mPtr[jb], mNVar*mBlk);
338return;
339}
340
341/* --Methode-- */
342//++
343void NTuple::ReadSelf(PInPersist& s)
344//
345// Lecture ppersist du ntuple.
346//--
347{
348
349Clean();
350
351char strg[256];
352s.GetLine(strg, 255);
353// Pour savoir s'il y avait un DVList Info associe
354bool hadinfo = false;
355if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0) hadinfo = true;
356
357s.GetI4(mNVar);
358mNames = new char[mNVar*LENNAME1];
359mVar = new r_4[mNVar];
360mVarD = new r_8[mNVar];
361s.GetBytes(mNames, mNVar*LENNAME1);
362s.GetI4(mNEnt);
363s.GetI4(mBlk);
364s.GetI4(mNBlk);
365
366if (hadinfo) { // Lecture eventuelle du DVList Info
367 if (mInfo == NULL) mInfo = new DVList;
368 s >> (*mInfo);
369 }
370
371int jb;
372for(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}
Note: See TracBrowser for help on using the repository browser.