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

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

added overloading of perator = GLM,FT 19-OCT-99

File size: 7.9 KB
RevLine 
[220]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;
[297]29mVarD = NULL;
[220]30mNames = NULL;
31mInfo = NULL;
32}
33
34
35//++
36NTuple::NTuple(int nvar, char** noms, int blk)
[475]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.
[220]41//--
42{
[475]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;
[220]66}
67
68/* --Methode-- */
69//++
70NTuple::NTuple(char *flnm)
71//
72// Createur lecture fichier ppersist.
73//--
74{
75mNVar = mNEnt = mBlk = mNBlk = 0;
76mVar = NULL;
[297]77mVarD = NULL;
[220]78mNames = NULL;
79mInfo = NULL;
80PInPersist s(flnm);
81Read(s);
82}
83
84/* --Methode-- */
85NTuple::~NTuple()
86{
87Clean();
88}
89
90/* --Methode-- */
91void NTuple::Clean()
92{
93if (mVar) delete[] mVar;
[297]94if (mVarD) delete[] mVarD;
[220]95if (mNames) delete[] mNames;
96if (mInfo) delete mInfo;
97int i;
98for(i=0; i<mNBlk; i++) delete[] mPtr[i];
99mPtr.erase(mPtr.begin(), mPtr.end());
100mNVar = mNEnt = mBlk = mNBlk = 0;
101mVar = NULL;
[297]102mVarD = NULL;
[220]103mNames = NULL;
104return;
105}
106
107/* --Methode-- */
108//++
109void NTuple::Fill(r_4* x)
110//
111// Remplit le ntuple avec le tableau cd reels `x'.
112//--
113{
114int numb = mNEnt/mBlk;
115if (numb >= mNBlk) {
116 r_4* pt = new r_4[mNVar*mBlk];
117 mNBlk++;
118 mPtr.push_back(pt);
119}
120int offb = mNEnt-numb*mBlk;
121memcpy((mPtr[numb]+offb*mNVar), x, mNVar*sizeof(r_4));
122mNEnt++;
123return;
124}
125
126
127/* --Methode-- */
128//++
129float NTuple::GetVal(int n, int k) const
130//
131// Retourne la valeur de la variable `k' de l'evenement `n'.
132//--
133{
134if (n >= mNEnt) return(BADVAL);
135if ( (k < 0) || (k >= mNVar) ) return(BADVAL);
136int numb = n/mBlk;
137int offb = n-numb*mBlk;
138return(*(mPtr[numb]+offb*mNVar+k));
139}
140
141
142/* --Methode-- */
143//++
144int NTuple::IndexNom(const char* nom) const
145//
146// Retourne le numero de la variable de nom `nom'.
147//--
148{
149int i;
150for(i=0; i<mNVar; i++)
151 if ( strcmp(nom, mNames+i*LENNAME1) == 0) return(i);
152return(-1);
153}
154
155
156static char nomretour[2*LENNAME1];
157/* --Methode-- */
158//++
159char* NTuple::NomIndex(int k) const
160//
161// Retourne le nom de la variable numero 'k'
162//--
163{
164nomretour[0] = '\0';
165if ((k >= 0) && (k < mNVar)) strcpy(nomretour, mNames+k*LENNAME1);
166return(nomretour);
167}
168
169/* --Methode-- */
170//++
171string NTuple::VarList_C(const char* nomx) const
172//
173// Retourne une chaine de caracteres avec la declaration des noms de
174// variables. si "nomx!=NULL" , des instructions d'affectation
175// a partir d'un tableau "nomx[i]" sont ajoutees.
176//--
177{
178string rets;
179int i;
180for(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 }
186rets += "; \n";
187if (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
196return(rets);
197}
[297]198
[220]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//++
[297]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//++
[220]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);
[278]334if (mInfo) s << (*mInfo);
[220]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
[475]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;
[220]356
[475]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);
[220]365
[475]366 if (hadinfo) { // Lecture eventuelle du DVList Info
367 if (mInfo == NULL) mInfo = new DVList;
368 s >> (*mInfo);
369 }
[220]370
[475]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);
[220]376 }
377}
378
[475]379NTuple& 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;
[220]422}
Note: See TracBrowser for help on using the repository browser.