source: Sophya/trunk/SophyaPI/PIext/servnobjm.cc@ 1287

Last change on this file since 1287 was 1276, checked in by ercodmgr, 25 years ago

Amelioration de la syntaxe de l'interpreteur, gestion de quotes, ligne suite
Commande linkff2 (2eme groupe de link, pour utilisation par CxxExecutor
Amelioration de la gestion de TMPDIR

Reza 2/11/2000

File size: 46.8 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <ctype.h>
4
5#include <typeinfo>
6#include <iostream.h>
7#include <string>
8#include <list>
9#include <map>
10
11#include "strutil.h"
12
13#include "nobjmgr.h"
14#include "servnobjm.h"
15#include "nomgadapter.h"
16#include "pistdimgapp.h"
17
18#include "fct1dfit.h"
19#include "fct2dfit.h"
20
21#ifdef SANS_EVOLPLANCK
22#include "matrix.h"
23#include "cvector.h"
24#else
25#include "tmatrix.h"
26#include "tvector.h"
27#include "pitvmaad.h"
28#endif
29
30#include "ntuple.h"
31#include "cimage.h"
32
33#include "histos.h"
34#include "histos2.h"
35#include "ntuple.h"
36#include "hisprof.h"
37
38#include "piscdrawwdg.h"
39#include "pisurfdr.h"
40
41#include "pintuple.h"
42#include "pintup3d.h"
43
44#include "pipodrw.h"
45
46
47
48/* --Methode-- */
49Services2NObjMgr::Services2NObjMgr(NamedObjMgr* omg, string& tmpdir)
50{
51SetTmpDir(tmpdir);
52mImgapp = NULL;
53mOmg = omg;
54dynlink = NULL;
55InitGrAttNames();
56}
57
58/* --Methode-- */
59Services2NObjMgr::~Services2NObjMgr()
60{
61CloseDLL();
62}
63
64/* --Methode-- */
65void Services2NObjMgr::RegisterClass(AnyDataObj* o, NObjMgrAdapter* oa)
66{
67ObjAdaptList::iterator it;
68for(it = objadaplist.begin(); it != objadaplist.end(); it++)
69#ifdef SANS_EVOLPLANCK
70 if (typeid(*o) == typeid(*((*it).obj))) THROW(dupIdErr);
71#else
72 if (typeid(*o) == typeid(*((*it).obj)))
73 throw(DuplicateIdExc("Services2NObjMgr::RegisterClass() - Duplicate class"));
74#endif
75dataobj_adapter oba;
76oba.obj = o;
77oba.obja = oa;
78objadaplist.push_back(oba);
79}
80
81/* --Methode-- */
82NObjMgrAdapter* Services2NObjMgr::GetAdapter(AnyDataObj* o)
83{
84ObjAdaptList::iterator it;
85for(it = objadaplist.begin(); it != objadaplist.end(); it++)
86 if (typeid(*o) == typeid(*((*it).obj))) return((*it).obja->Clone(o));
87return(new NObjMgrAdapter(o));
88}
89
90/* --Methode-- */
91void Services2NObjMgr::SetTmpDir(string const & tmpdir)
92{
93TmpDir = tmpdir;
94PDynLinkMgr::SetTmpDir(tmpdir);
95return;
96}
97
98/* --Methode-- */
99void Services2NObjMgr::PlotFunc(string const & expfunc, string & nom, double xmin, double xmax, int np, string dopt)
100{
101FILE *fip;
102string fname = TmpDir + "func1_pia_dl.c";
103string cmd;
104int rc;
105
106if (!mImgapp) return;
107
108cmd = "rm -f " + fname;
109rc = system(cmd.c_str());
110// printf("PlotFunc_Do> %s (Rc=%d)\n", cmd.c_str(), rc);
111
112if ((fip = fopen(fname.c_str(), "w")) == NULL) {
113 string sn = fname;
114 cout << "Services2NObjMgr/PlotFunc_Error: fopen( " << sn << endl;
115 return;
116 }
117
118// constitution du fichier a compiler
119fputs("#include <math.h> \n", fip);
120fputs("double func1_pia_dl_func(double x) \n{\n", fip);
121fprintf(fip,"return(%s); \n}\n", expfunc.c_str());
122fclose(fip);
123
124string func = "func1_pia_dl_func";
125DlFunctionOfX f = (DlFunctionOfX) LinkFunctionFromFile(fname, func);
126if (!f) return;
127PlotFunc(f, nom, xmin, xmax, np, dopt);
128CloseDLL();
129return;
130}
131
132/* --Methode-- */
133void Services2NObjMgr::PlotFunc2D(string const & expfunc, string & nom, double xmin, double xmax,
134 double ymin, double ymax, int npx, int npy, string dopt)
135{
136FILE *fip;
137string fname = TmpDir + "func2_pia_dl.c";
138string cmd;
139int rc;
140
141if (!mImgapp) return;
142
143cmd = "rm " + fname;
144rc = system(cmd.c_str());
145// printf("PlotFunc2D_Do> %s (Rc=%d)\n", cmd.c_str(), rc);
146
147if ((fip = fopen(fname.c_str(), "w")) == NULL) {
148 string sn = fname;
149 cout << "Services2NObjMgr/PlotFunc2D_Error: fopen( " << sn << endl;
150 return;
151 }
152
153// constitution du fichier a compiler
154fputs("#include <math.h> \n", fip);
155fputs("double func2_pia_dl_func(double x, double y) \n{\n", fip);
156fprintf(fip,"return(%s); \n}\n", expfunc.c_str());
157fclose(fip);
158
159string func = "func2_pia_dl_func";
160DlFunctionOfXY f = (DlFunctionOfXY) LinkFunctionFromFile(fname, func);
161if (!f) return;
162PlotFunc2D(f, nom, xmin, xmax, ymin, ymax, npx, npy, dopt);
163CloseDLL();
164return;
165}
166
167/* --Methode-- */
168void Services2NObjMgr::PlotFuncFrCFile(string const & fname, string const & func, string & nom,
169 double xmin, double xmax, int np, string dopt)
170{
171DlFunctionOfX f = (DlFunctionOfX) LinkFunctionFromFile(fname, func);
172if (!f) return;
173PlotFunc(f, nom, xmin, xmax, np, dopt);
174CloseDLL();
175return;
176}
177
178/* --Methode-- */
179void Services2NObjMgr::PlotFunc2DFrCFile(string const & fname, string const & func, string & nom,
180 double xmin, double xmax, double ymin, double ymax, int npx, int npy, string dopt)
181{
182DlFunctionOfXY f = (DlFunctionOfXY) LinkFunctionFromFile(fname, func);
183if (!f) return;
184PlotFunc2D(f, nom, xmin, xmax, ymin, ymax, npx, npy, dopt);
185CloseDLL();
186return;
187}
188
189/* --Methode-- */
190void Services2NObjMgr::PlotFunc(DlFunctionOfX f, string & nom, double xmin, double xmax, int np, string dopt)
191{
192if (!mImgapp) return;
193
194int k;
195if (np < 1) np = 1;
196if (xmax <= xmin) xmax = xmin+1.;
197Vector* vpy = new Vector(np);
198
199double xx;
200double dx = (xmax-xmin)/np;
201
202try {
203 for(k=0; k<np; k++) { xx = xmin+dx*k; (*vpy)(k) = f(xx); }
204}
205#ifdef SANS_EVOLPLANCK
206CATCH(merr) {
207 fflush(stdout);
208 cout << endl;
209 cerr << endl;
210 string es = PeidaExc(merr);
211 cerr << "Services2NObjMgr::PlotFunc() Exception :" << merr << es;
212 delete vpy;
213 vpy = NULL;
214 } ENDTRY;
215#else
216catch ( PException exc ) {
217 fflush(stdout);
218 cout << endl;
219 cerr << endl;
220 cerr << "Services2NObjMgr::PlotFunc() Exception :" << exc.Msg() << endl;
221 delete vpy;
222 vpy = NULL;
223}
224#endif
225
226if (vpy) {
227 string titre;
228 if (nom.length() < 1) {
229 titre = "Function f(x)";
230 nom = "/autoc/f_x";
231 }
232 else titre = nom;
233
234 P1DArrayAdapter* vya = new POVectorAdapter(vpy, false);
235 vya->DefineXCoordinate(xmin, (xmax-xmin)/np);
236 PIYfXDrawer* dr = new PIYfXDrawer(vya, NULL, true) ;
237 bool fgsr = true;
238 dopt = "thinline," + dopt;
239 int opt = DecodeDispOption(dopt, fgsr);
240 int rsid = mImgapp->DispScDrawer(dr, titre, opt);
241 if (fgsr) mImgapp->RestoreGraphicAtt();
242 if (nom.length() > 0) {
243 mOmg->AddObj(vpy, nom);
244 mOmg->AddWRsId(nom, rsid);
245 }
246 }
247
248return;
249}
250
251/* --Methode-- */
252void Services2NObjMgr::PlotFunc2D(DlFunctionOfXY f, string & nom, double xmin, double xmax, double ymin, double ymax,
253 int npx, int npy, string dopt)
254{
255if (!mImgapp) return;
256
257if (npx < 3) npx = 3;
258if (npy < 3) npy = 3;
259if (npx > 250) npx = 250;
260if (npy > 250) npy = 250;
261if (xmax <= xmin) xmax = xmin+1.;
262if (ymax <= ymin) ymax = ymin+1.;
263
264Matrix* mtx = new Matrix(npy, npx);
265
266int i,j;
267double xx, yy;
268double dx = (xmax-xmin)/npx;
269double dy = (ymax-ymin)/npy;
270// printf(" -- DBG -- %d %d , %g %g , %g %g \n", npx, npy, xmin, xmax, ymin, ymax);
271try {
272 for(j=0; j<npy; j++) {
273 yy = ymin+dy*j;
274 for(i=0; i<npx; i++) {
275 xx = xmin+dx*i;
276 (*mtx)(j, i) = f(xx, yy);
277 }
278 }
279}
280#ifdef SANS_EVOLPLANCK
281CATCH(merr) {
282 fflush(stdout);
283 cout << endl;
284 cerr << endl;
285 string es = PeidaExc(merr);
286 cerr << "Services2NObjMgr::PlotFunc2D() Exception :" << merr << es;
287 delete mtx; mtx = NULL;
288 } ENDTRY;
289#else
290catch ( PException exc ) {
291 fflush(stdout);
292 cout << endl;
293 cerr << endl;
294 cerr << "Services2NObjMgr::PlotFunc2D() Exception :" << exc.Msg() << endl;
295 delete mtx; mtx = NULL;
296}
297#endif
298
299if (mtx) {
300 string titre;
301 if (nom.length() < 1) {
302 titre = "Function f(x,y)";
303 nom = "/autoc/f2d_xy";
304 }
305 else titre = nom;
306 bool fgsr = true;
307 int opt = DecodeDispOption(dopt, fgsr);
308 P2DArrayAdapter* arr = new POMatrixAdapter(mtx, false);
309 arr->DefineXYCoordinates(xmin, ymin, dx, dy);
310 PISurfaceDrawer* sdr = new PISurfaceDrawer(arr, true, true, true);
311 int rsid = mImgapp->Disp3DDrawer(sdr, titre, opt);
312 if (fgsr) mImgapp->RestoreGraphicAtt();
313 if (nom.length() > 0) {
314 mOmg->AddObj(mtx, nom);
315 mOmg->AddWRsId(nom, rsid);
316 }
317 }
318
319return;
320}
321
322/* --Methode-- */
323void Services2NObjMgr::DisplayPoints2D(string& nom, string& expx, string& expy,
324 string& experrx, string& experry,
325 string& expcut, string dopt, string loop)
326{
327NObjMgrAdapter* obja=NULL;
328obja = mOmg->GetObjAdapter(nom);
329if (obja == NULL) {
330 cout << "Services2NObjMgr::DisplayPoints2D() Error , No such object " << nom << endl;
331 return;
332 }
333if (!mImgapp) return;
334
335// Creation NTuple
336char* ntn[4] = {"expx","expy","expex","expey",};
337NTuple* nt = NULL;
338bool haserr = false;
339
340if ( (experrx.length() > 0 ) && (experry.length() > 0 ) ) { haserr = true; nt = new NTuple(4, ntn); }
341else { haserr = false; experrx = experry = "0."; nt = new NTuple(2, ntn); }
342
343ComputeExpressions(obja, expx, expy, experrx, experry, expcut, loop, nt, NULL, NULL);
344
345if (nt->NEntry() < 1) {
346 cout << "Services2NObjMgr::DisplayPoints2D() Warning Zero points satisfy cut !" << endl;
347 delete nt;
348 return;
349 }
350
351// nt->Show();
352// nt->Print(0,10);
353PINTuple* pin = new PINTuple(nt, true);
354pin->SetStats(Services2NObjMgr::GetStatsOption(dopt));
355pin->SelectXY(ntn[0], ntn[1]);
356if ( haserr ) pin->SelectErrBar(ntn[2], ntn[3]);
357
358bool fgsr = true;
359dopt = "defline," + dopt;
360int opt = DecodeDispOption(dopt, fgsr);
361string titre = nom + ":" + expy + "%" + expx;
362mImgapp->DispScDrawer( (PIDrawer*)pin, titre, opt);
363if (fgsr) mImgapp->RestoreGraphicAtt();
364return;
365}
366
367/* --Methode-- */
368void Services2NObjMgr::DisplayPoints3D(string& nom, string& expx, string& expy,
369 string& expz, string& expcut, string dopt, string loop)
370{
371NObjMgrAdapter* obja=NULL;
372obja = mOmg->GetObjAdapter(nom);
373if (obja == NULL) {
374 cout << "Services2NObjMgr::DisplayPoints3D() Error , No such object " << nom << endl;
375 return;
376 }
377if (!mImgapp) return;
378
379char* ntn[3] = {"expx","expy","expz"};
380NTuple* nt = new NTuple(3,ntn); // Creation NTuple
381
382string expwt = "1.";
383ComputeExpressions(obja, expx, expy, expz, expwt, expcut, loop, nt, NULL, NULL);
384
385if (nt->NEntry() < 1) {
386 cout << "Services2NObjMgr::DisplayPoints3D() Warning Zero points satisfy cut !" << endl;
387 delete nt;
388 return;
389 }
390nt->Show();
391nt->Print(0,10);
392PINTuple3D* pin = new PINTuple3D(nt, true);
393pin->SelectXYZ(ntn[0], ntn[1], ntn[2]);
394bool fgsr = true;
395dopt = "defline," + dopt;
396int opt = DecodeDispOption(dopt, fgsr);
397
398// Pour plot a partir de DispScDrawer
399// string nomdisp = "_NT3D_";
400// mImgapp->DispScDrawer( (PIDrawer*)pin, nomdisp, opt);
401// Pour plot a partir de Disp3DDrawer
402string titre = nom + ":" + expy + "%" + expx;
403mImgapp->Disp3DDrawer(pin, titre, opt);
404
405if (fgsr) mImgapp->RestoreGraphicAtt();
406return;
407}
408
409/* --Methode-- */
410void Services2NObjMgr::DisplayPoints2DW(string& nom, string& expx, string& expy,
411 string& expwt, string& expcut, string dopt, string loop)
412{
413NObjMgrAdapter* obja=NULL;
414obja = mOmg->GetObjAdapter(nom);
415if (obja == NULL) {
416 cout << "Services2NObjMgr::DisplayPoints2DW() Error , No such object " << nom << endl;
417 return;
418 }
419if (!mImgapp) return;
420
421char* ntn[3] = {"expx","expy","expw"};
422NTuple* nt = new NTuple(3,ntn); // Creation NTuple
423
424string exp = "1.";
425ComputeExpressions(obja, expx, expy, expwt, exp, expcut, loop, nt, NULL, NULL);
426
427if (nt->NEntry() < 1) {
428 cout << "Services2NObjMgr::DisplayPoints2DW() Warning Zero points satisfy cut !" << endl;
429 delete nt;
430 return;
431 }
432
433PINTuple* pin = new PINTuple(nt, true);
434pin->SetStats(Services2NObjMgr::GetStatsOption(dopt));
435pin->SelectXY(ntn[0], ntn[1]);
436pin->SelectWt(ntn[2]);
437
438bool fgsr = true;
439int opt = DecodeDispOption(dopt, fgsr);
440string titre = nom + ":" + expwt + "_" + expy + "%" + expx ;
441mImgapp->DispScDrawer( (PIDrawer*)pin, titre, opt);
442if (fgsr) mImgapp->RestoreGraphicAtt();
443return;
444}
445
446/* --Methode-- */
447void Services2NObjMgr::ProjectH1(string& nom, string& expx, string& expwt,
448 string& expcut, string& nomh1, string dopt, string loop)
449{
450NObjMgrAdapter* obja=NULL;
451obja = mOmg->GetObjAdapter(nom);
452if (obja == NULL) {
453 cout << "Services2NObjMgr::ProjectH1() Error , No such object " << nom << endl;
454 return;
455 }
456if (!mImgapp) return;
457
458Histo* h1 = NULL;
459NTuple* nt = NULL;
460AnyDataObj* oh = NULL;
461if (nomh1.length() > 0) oh=mOmg->GetObj(nomh1);
462else nomh1 = "/tmp/projh1d";
463if ( (oh != NULL) && (typeid(*oh) == typeid(Histo)) ) h1 = (Histo*)oh; // Pas de remise a zero ! h1->Zero();
464else {
465 char* ntn[2]= {"hxval", "hwt"};
466 nt = new NTuple(2,ntn); // Creation NTuple
467 }
468string expz = "0.";
469ComputeExpressions(obja, expx, expwt, expz, expwt, expcut, loop, nt, h1, NULL);
470
471if ((!h1) && (!nt)) return;
472if (!h1) {
473 if (nt->NEntry() < 1) {
474 cout << "Services2NObjMgr::ProjectH1() Warning Zero points satisfy cut !" << endl;
475 delete nt;
476 return;
477 }
478 double xmin, xmax;
479 nt->GetMinMax(0, xmin, xmax);
480 h1 = new Histo(xmin, xmax, 100);
481 int k;
482 float* xn;
483 for(k=0; k<nt->NEntry(); k++) {
484 xn = nt->GetVec(k);
485 h1->Add(xn[0], xn[1]);
486 }
487 delete nt;
488 mOmg->AddObj(h1, nomh1);
489 }
490
491mOmg->DisplayObj(nomh1, dopt);
492return;
493}
494
495/* --Methode-- */
496void Services2NObjMgr::ProjectH2(string& nom, string& expx, string& expy, string& expwt,
497 string& expcut, string& nomh2, string dopt, string loop)
498{
499NObjMgrAdapter* obja=NULL;
500obja = mOmg->GetObjAdapter(nom);
501if (obja == NULL) {
502 cout << "Services2NObjMgr::ProjectH2() Error , No such object " << nom << endl;
503 return;
504 }
505if (!mImgapp) return;
506
507Histo2D* h2 = NULL;
508NTuple* nt = NULL;
509AnyDataObj* oh = NULL;
510if (nomh2.length() > 0) oh=mOmg->GetObj(nomh2);
511else nomh2 = "/tmp/projh2d";
512if ( (oh != NULL) && (typeid(*oh) == typeid(Histo2D)) ) h2 = (Histo2D*)oh; // Pas de remise a zero ! h2->Zero();
513else {
514 char* ntn[3]= {"hxval", "hyval", "hwt"};
515 nt = new NTuple(3,ntn); // Creation NTuple
516 }
517string expz = "0.";
518ComputeExpressions(obja, expx, expy, expwt, expwt, expcut, loop, nt, NULL, h2);
519
520if ((!h2) && (!nt)) return;
521if (!h2) {
522 if (nt->NEntry() < 1) {
523 cout << "Services2NObjMgr::ProjectH2() Warning Zero points satisfy cut !" << endl;
524 delete nt;
525 return;
526 }
527 double xmin, xmax, ymin, ymax;
528 nt->GetMinMax(0, xmin, xmax);
529 nt->GetMinMax(1, ymin, ymax);
530 h2 = new Histo2D(xmin, xmax, 50, ymin, ymax, 50);
531 int k;
532 float* xn;
533 for(k=0; k<nt->NEntry(); k++) {
534 xn = nt->GetVec(k);
535 h2->Add(xn[0], xn[1], xn[2]);
536 }
537 delete nt;
538 mOmg->AddObj(h2, nomh2);
539 }
540
541mOmg->DisplayObj(nomh2, dopt);
542return;
543
544}
545
546/* --Methode-- cmv 13/10/98 */
547void Services2NObjMgr::ProjectHProf(string& nom, string& expx, string& expy, string& expwt,
548 string& expcut, string& nomprof, string dopt, string loop)
549// Pour remplir un ``GeneralFitData'' a partir de divers objets:
550//| nom = nom de l'objet a projeter dans un HProf.
551//| expx = expression X de definition du bin.
552//| expy = expression Y a additionner dans le bin.
553//| expwt = expression W du poids a additionner.
554//| expcut = expression du test de selection.
555//| nomprof = nom du HProf engendre (optionnel). Si l'objet n'existe pas
556//| les limites Xmin,Xmax sont calculees automatiquement.
557//| sinon ce sont celles de l'objet preexistant.
558//| opt = options generales pour le display.
559{
560NObjMgrAdapter* obja=NULL;
561obja = mOmg->GetObjAdapter(nom);
562if (obja == NULL) {
563 cout << "Services2NObjMgr::ProjectHProf() Error , No such object " << nom << endl;
564 return;
565 }
566if (!mImgapp) return;
567
568HProf* hprof = NULL;
569NTuple* nt = NULL;
570AnyDataObj* oh = NULL;
571if (nomprof.length() > 0) oh=mOmg->GetObj(nomprof);
572else nomprof = "/tmp/projprof";
573if( (oh!=NULL) && (typeid(*oh) == typeid(HProf)) ) hprof = (HProf*)oh;
574else {
575 char* ntn[3]= {"hxval", "hyval", "hwt"};
576 nt = new NTuple(3,ntn); // Creation NTuple
577}
578string expz = "0.";
579ComputeExpressions(obja, expx, expy, expwt, expwt, expcut, loop, nt, NULL, NULL, hprof);
580
581if((!hprof) && (!nt)) return;
582if(!hprof) {
583 if (nt->NEntry() < 1) {
584 cout << "Services2NObjMgr::ProjectHProf() Warning Zero points satisfy cut !" << endl;
585 delete nt;
586 return;
587 }
588 r_8 xmin, xmax;
589 nt->GetMinMax(0, xmin, xmax);
590 hprof = new HProf(xmin, xmax, 100);
591 int k;
592 float* xn;
593 for(k=0; k<nt->NEntry(); k++) {
594 xn = nt->GetVec(k);
595 hprof->Add(xn[0], xn[1], xn[2]);
596 }
597 delete nt;
598 mOmg->AddObj(hprof, nomprof);
599 }
600hprof->UpdateHisto();
601
602mOmg->DisplayObj(nomprof, dopt);
603return;
604}
605
606
607/* --Methode-- */
608void Services2NObjMgr::FillVect(string& nom, string& expx, string& expv,
609 string& expcut, string& nomvec, string dopt, string loop)
610{
611NObjMgrAdapter* obja=NULL;
612obja = mOmg->GetObjAdapter(nom);
613if (obja == NULL) {
614 cout << "Services2NObjMgr::FillVect() Error , No such object: " << nom << endl;
615 return;
616 }
617if (!mImgapp) return;
618
619Vector* v1 = NULL;
620AnyDataObj* ov = NULL;
621ov=mOmg->GetObj(nomvec);
622if (ov != NULL) v1 = dynamic_cast<Vector *>(ov);
623if (v1 == NULL) {
624 cout << "Services2NObjMgr::FillVect() Error , No such object or not a vector: " << nomvec << endl;
625 return;
626 }
627
628char* ntn[2]= {"vi", "vv"};
629NTuple* nt = new NTuple(2,ntn); // Creation NTuple
630
631string expz = "0.";
632ComputeExpressions(obja, expx, expv, expz, expz, expcut, loop, nt);
633
634if (!nt) return;
635if (nt->NEntry() < 1) {
636 cout << "Services2NObjMgr::FillVect() Warning Zero points satisfy cut !" << endl;
637 delete nt;
638 return;
639 }
640
641 int i,k;
642 double* xn;
643 for(k=0; k<nt->NEntry(); k++) {
644 xn = nt->GetLineD(k);
645 i = xn[0]+0.5;
646 if ( (i < 0) || i >= v1->NElts() ) continue;
647 (*v1)(i) = xn[1];
648 }
649 delete nt;
650
651
652mOmg->DisplayObj(nomvec, dopt);
653return;
654}
655
656/* --Methode-- */
657void Services2NObjMgr::FillMatx(string& nom, string& expx, string& expy, string& expv,
658 string& expcut, string& nommtx, string dopt, string loop)
659{
660NObjMgrAdapter* obja=NULL;
661obja = mOmg->GetObjAdapter(nom);
662if (obja == NULL) {
663 cout << "Services2NObjMgr::FillMatx() Error , No such objet " << nom << endl;
664 return;
665 }
666if (!mImgapp) return;
667
668Matrix* mtx = NULL;
669AnyDataObj* om = NULL;
670om=mOmg->GetObj(nommtx);
671if (om != NULL) mtx = dynamic_cast<Matrix *>(om);
672if (mtx == NULL) {
673 cout << "Services2NObjMgr::FillMatx() Error , No such object or not a matrix " << nommtx << endl;
674 return;
675 }
676
677char* ntn[3]= {"mi", "mj", "mv"};
678NTuple* nt = new NTuple(3,ntn); // Creation NTuple
679
680string expz = "0.";
681ComputeExpressions(obja, expx, expy, expv, expz, expcut, loop, nt);
682
683if (!nt) return;
684if (nt->NEntry() < 1) {
685 cout << "Services2NObjMgr::FillMatx() Warning Zero points satisfy cut !" << endl;
686 delete nt;
687 return;
688 }
689
690 int ic, jl, k;
691 double* xn;
692 for(k=0; k<nt->NEntry(); k++) {
693 xn = nt->GetLineD(k);
694 ic = xn[0]+0.5;
695 jl = xn[1]+0.5;
696 if ( (ic < 0) || ic >= mtx->NCol() ) continue;
697 if ( (jl < 0) || jl >= mtx->NRows() ) continue;
698 (*mtx)(jl, ic) = xn[2];
699 }
700 delete nt;
701
702
703mOmg->DisplayObj(nommtx, dopt);
704return;
705
706}
707
708/* --Methode-- */
709void Services2NObjMgr::ExpressionToVector(string& nom, string& expx, string& expcut,
710 string& nomvec, string dopt, string loop)
711{
712NObjMgrAdapter* obja=NULL;
713obja = mOmg->GetObjAdapter(nom);
714if (obja == NULL) {
715 cout << "Services2NObjMgr::ExpressionToVector() Error , No such object " << nom << endl;
716 return;
717 }
718if (!mImgapp) return;
719
720NTuple* nt = NULL;
721if (nomvec.length() < 1) nomvec = "/tmp/expvec";
722
723char* ntn[2]= {"vecval", "vecwt"};
724nt = new NTuple(1,ntn); // Creation NTuple
725
726string expwt = "1.";
727string expz = "0.";
728ComputeExpressions(obja, expx, expz, expz, expwt, expcut, loop, nt, NULL, NULL);
729
730if (!nt) return;
731if (nt->NEntry() < 1) {
732 cout << "Services2NObjMgr::ExpressionToVector() Warning Zero points satisfy cut !" << endl;
733 delete nt;
734 return;
735 }
736
737Vector* vec = new Vector(nt->NEntry());
738int k;
739float* xn;
740for(k=0; k<nt->NEntry(); k++) {
741 xn = nt->GetVec(k);
742 (*vec)(k) = xn[0];
743 }
744delete nt;
745mOmg->AddObj(vec, nomvec);
746mOmg->DisplayObj(nomvec, dopt);
747return;
748}
749
750/* --Methode-- */
751void Services2NObjMgr::NtFromASCIIFile(string& nom,string& filename,double def_val)
752// Pour remplir un ntuple "nom" existant a partir du fichier
753// ASCII table "filename". Si il y a plus de variables dans le
754// ntuple que dans le fichier "filename",
755// les sur-numeraires sont mises a "def_val" par defaut.
756{
757AnyDataObj* mobj = mOmg->GetObj(nom);
758if(mobj == NULL)
759 {cout<<"NtFromASCIIFile() Error, object "<<nom<<" not existing"<<endl;
760 return;}
761if(typeid(*mobj) != typeid(NTuple))
762 {cout<<"NtFromASCIIFile() Error, object "<<nom<<" not an NTuple"<<endl;
763 return;}
764if (!mImgapp) return;
765
766NTuple* nt = (NTuple*) mobj;
767nt->FillFromASCIIFile(filename, def_val);
768return;
769}
770
771/* --Methode-- */
772void Services2NObjMgr::FillNT(string& nom, string& expx, string& expy, string& expz,
773 string& expt, string& expcut, string& nomnt, string loop)
774{
775NObjMgrAdapter* obja=NULL;
776obja = mOmg->GetObjAdapter(nom);
777if (obja == NULL) {
778 cout << "Services2NObjMgr::FillNT() Error , No such object " << nom << endl;
779 return;
780 }
781if (!mImgapp) return;
782
783bool fgnnt = false;
784NTuple* nt = NULL;
785AnyDataObj* oh = NULL;
786if (nomnt.length() > 0) oh=mOmg->GetObj(nomnt);
787else nomnt = "/tmp/fillnt";
788if ( (oh != NULL) && (typeid(*oh) == typeid(NTuple)) ) {
789 nt = (NTuple*)oh;
790 if (nt->NVar() > 10) {
791 cout << "Services2NObjMgr::FillNT() Warning , Max 10 var in NTuple -> new NTuple" << endl;
792 nt = NULL;
793 }
794 }
795if (nt == NULL) {
796 char* ntn[4]= {"x", "y","z","t"};
797 nt = new NTuple(4,ntn); // Creation NTuple
798 fgnnt = true;
799 }
800
801ComputeExpressions(obja, expx, expy, expz, expt, expcut, loop, nt, NULL, NULL);
802
803if (fgnnt) mOmg->AddObj(nt, nomnt);
804return;
805
806}
807
808/* --Methode-- */
809void Services2NObjMgr::FillNTFrCFile(string & nom, string const & fname,
810 string const & funcname, string & nomnt, string loop)
811{
812if (!mImgapp) return;
813
814NObjMgrAdapter* obja=NULL;
815obja = mOmg->GetObjAdapter(nom);
816if (obja == NULL) {
817 cout << "Services2NObjMgr::FillNTFrCFile( " << nom << "...) No such object" <<endl;
818 return;
819 }
820bool adel = true;
821NTupleInterface* objnt = obja->GetNTupleInterface(adel);
822if (objnt == NULL) {
823 cout << "Services2NObjMgr::FillNTFrCFile( " << nom << "...) Not an NTupleInterface !" <<endl;
824 return;
825 }
826
827NTLoopExprFunc f = (NTLoopExprFunc)LinkFunctionFromFile(fname, funcname);
828if (!f) {
829 cerr << "Services2NObjMgr::FillNTFrCFile Error Creation NTLoopExprFunc" << endl;
830 if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
831 return;
832 }
833
834bool fgnnt = false;
835NTuple* nt = NULL;
836if (nomnt.length() > 0) {
837 AnyDataObj* oh = NULL;
838 oh=mOmg->GetObj(nomnt);
839 if ( (oh != NULL) && (typeid(*oh) == typeid(NTuple)) ) {
840 nt = (NTuple*)oh;
841 if (nt->NVar() > 10) {
842 cout << "Services2NObjMgr::FillNTFrCFile() Warning , Max 10 var in NTuple -> new NTuple" << endl;
843 nt = NULL;
844 }
845 }
846 if (nt == NULL) {
847 char* ntn[4]= {"x", "y","z","t"};
848 nt = new NTuple(4,ntn); // Creation NTuple
849 fgnnt = true;
850 }
851 }
852
853double xnt[10];
854float fxnt[10];
855
856int i,k;
857for(i=0; i<10; i++) fxnt[i] = xnt[i] = 0.;
858
859
860// $CHECK$ A virer des que possible - Pb blocage application quand trop d'impression
861// redirige - On redirige la sortie sur le terminal
862bool red = mImgapp->HasRedirectedStdOutErr();
863mImgapp->RedirectStdOutErr(false);
864
865int k1,k2,dk;
866k1 = 0; k2 = objnt->NbLines(); dk = 1;
867DecodeLoopParameters(loop, k1, k2, dk);
868if (k1 < 0) k1 = 0;
869if (k2 < 0) k2 = objnt->NbLines();
870if (k2 > objnt->NbLines()) k2 = objnt->NbLines();
871if (dk <= 0) dk = 1;
872
873try {
874 double* xn;
875 int kmax = k2;
876 for(k=k1; k<kmax; k+=dk) {
877 xn = objnt->GetLineD(k);
878 if (f(xn, xnt, xnt+1, xnt+2, xnt+3, k, kmax) != 0) {
879 if (nt) {
880 for(i=0; i<4; i++) fxnt[i] = xnt[i];
881 nt->Fill(fxnt);
882 }
883 }
884 }
885 }
886#ifdef SANS_EVOLPLANCK
887CATCH(merr) {
888 fflush(stdout);
889 cout << endl;
890 cerr << endl;
891 string es = PeidaExc(merr);
892 cerr << "Services2NObjMgr::FillNTFrCFile() Exception :" << merr << es;
893 } ENDTRY;
894#else
895catch ( PException exc ) {
896 fflush(stdout);
897 cout << endl;
898 cerr << endl;
899 cerr << "Services2NObjMgr::FillNTFrCFile() Exception :" << exc.Msg() << endl;
900}
901#endif
902
903if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
904CloseDLL();
905
906// $CHECK$ A virer des que possible On redirige la sortie sur la fenetre PIConsole
907mImgapp->RedirectStdOutErr(red);
908
909if (fgnnt) mOmg->AddObj(nt, nomnt);
910return;
911}
912
913/* --Methode-- */
914void Services2NObjMgr::PrepareNTExpressionCFile(string & nom, string const & fname,
915 string const & funcname)
916{
917NObjMgrAdapter* obja=NULL;
918obja = mOmg->GetObjAdapter(nom);
919if (obja == NULL) {
920 cout << "Services2NObjMgr::PrepareNTExpressionCFile( " << nom << "...) No such object" <<endl;
921 return;
922 }
923bool adel = true;
924NTupleInterface* objnt = obja->GetNTupleInterface(adel);
925if (objnt == NULL) {
926 cout << "Services2NObjMgr::PrepareNTExpressionCFile( " << nom
927 << "...) No NTupleInterface !" <<endl;
928 return;
929 }
930string vardec = objnt->VarList_C("_xnti_");
931
932FILE *fip;
933if ((fip = fopen(fname.c_str(), "w")) == NULL) {
934 cout << "Services2NObjMgr::PrepareNTExpressionCFile()_Error: fopen " << fname << endl;
935 if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
936 return;
937 }
938
939// constitution du fichier des decalarations des variables de l'interface NTuple
940fputs("#include <stdlib.h> \n", fip);
941fputs("#include <stdio.h> \n", fip);
942fputs("#include <math.h> \n\n", fip);
943
944fputs("/* ------ Some random number generators --------- */ \n", fip);
945fputs("#define frand01() ( (float) drand48() ) \n", fip);
946fputs("#define drand01() drand48() \n", fip);
947fputs("#define rand01() drand48() \n", fip);
948fputs("#define frandpm1() ( 2. * frand01() - 1.) \n", fip);
949fputs("#define drandpm1() ( 2. * drand01() - 1.) \n", fip);
950fputs("#define randpm1() ( 2. * drand01() - 1.) \n", fip);
951fputs("double NorRand(void) \n", fip);
952fputs(" { \n double x,A,B; \n LAB10: \n A = drand01(); \n", fip);
953fputs(" if ( A == 0. ) goto LAB10; \n B = drand01(); \n", fip);
954fputs(" x = sqrt(-2.*log(A))*cos(2.*M_PI*B); \n", fip);
955fputs(" return(x); \n } \n", fip);
956fputs("#define GauRand() NorRand() \n", fip);
957fputs("#define gaurand() NorRand() \n\n", fip);
958
959fputs("/* NTupleInterface Variable declaration - Generated by piapp \n", fip);
960fputs(" -- Services2NObjMgr::PrepareNTExpressionCFile() -- */ \n\n", fip);
961fprintf(fip,"int %s(double* _xnti_, double* _rx_, double* _ry_, double* _rz_, \n",
962 funcname.c_str());
963fprintf(fip," double* _rt_, int _n_, int _nmax_) \n");
964fprintf(fip, "{ \n %s \n", vardec.c_str());
965fputs(" if (!1) { /* Cut Expression failed */ \n", fip);
966fputs(" *_rx_ = *_ry_ = *_rz_ = *_rt_ = 0.; return(0);", fip);
967fputs(" } \n /* Cut expression satisfied */ \n", fip);
968fputs(" *_rx_ = 1.; \n *_ry_ = 1.; \n *_rz_ = 1.; \n *_rt_ = 1.; \n", fip);
969fputs(" return(1); \n} \n", fip);
970
971fclose(fip);
972
973if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
974return;
975}
976
977/* --Methode-- cmv 13/10/98 */
978void Services2NObjMgr::FillGFD(string& nom, string& expx, string& expy, string& expz,
979 string& experr, string& expcut, string& nomgfd, string loop)
980// Pour remplir un ``GeneralFitData'' a partir de divers objets:
981//| nom = nom de l'objet a transcrire selon 1D: Z=f(X) ou 2D: Z=f(X,Y) .
982//| Vector,Matrix,Histo,HProf,Histo2D,Image<T>,StarList,NTuple,GeneralFitData
983//| expx = expression X du GeneralFitData (1er abscisse)
984//| expy = expression Y du GeneralFitData (2sd abscisse si non "", Z=f(X,Y))
985//| expz = expression Z du GeneralFitData (valeur de l'ordonnee)
986//| experr = expression de l'erreur sur l'ordonnee Z
987//| expcut = expression du test de selection
988//| nomgfd = nom du GeneralFitData engendre (optionnel)
989{
990NObjMgrAdapter* obja=NULL;
991obja = mOmg->GetObjAdapter(nom);
992if (obja == NULL) {
993 cout << "Services2NObjMgr::FillGFD() Error , No such object "<<nom<<endl;
994 return;
995 }
996if(!mImgapp) return;
997
998// 2D ou 3D?
999int nvar = 2;
1000if(expy.length()<=0) {nvar = 1; expy = "0.";}
1001
1002// Creation NTuple Buffer
1003char* ntn[4]= {"x","y","f","e"};
1004NTuple*nt = new NTuple(4,ntn);
1005
1006// Remplissage NTuple buffer
1007ComputeExpressions(obja, expx, expy, expz, experr, expcut, loop, nt, NULL, NULL);
1008if(nt->NEntry() < 1)
1009 {cout<<"Services2NObjMgr::FillGFD() Warning Zero points satisfy cut !"<<endl;
1010 delete nt; return;}
1011
1012//Remplissage de la structure GeneraFitData
1013if (nt->NEntry() <= 0) {
1014 cout<<"Services2NObjMgr::FillGFD() Warning - NData= " << nt->NEntry() << endl;
1015 delete nt;
1016 return;
1017 }
1018
1019GeneralFitData* gfd = new GeneralFitData(nvar,nt->NEntry(),0);
1020int k;
1021float* xn;
1022for(k=0; k<nt->NEntry(); k++) {
1023 xn = nt->GetVec(k);
1024 gfd->AddData(xn,xn[2],xn[3]);
1025}
1026
1027// Menage et table d'objets
1028delete nt;
1029mOmg->AddObj(gfd, nomgfd);
1030return;
1031}
1032
1033/* --Methode-- cmv 12/07/00 */
1034void Services2NObjMgr::FillGFDfrVec(string nomgfd,string namx,string namy,string namz,string name)
1035// Pour remplir un ``GeneralFitData'' a partir de vecteurs
1036//| gdfrvec nomgd X Y ! !
1037//| gdfrvec nomgd X Y ! EY
1038//| gdfrvec nomgd X Y Z !
1039//| gdfrvec nomgd X Y Z EZ
1040//| - nomgfd = nom du generaldata a remplir
1041//| - namx = nom du vecteur contenant les valeurs X
1042//| - namy = nom du vecteur contenant les valeurs Y
1043//| - namz = nom du vecteur contenant les valeurs Z (ou "!")
1044//| - name = nom du vecteur contenant les valeurs des erreurs EY ou EZ
1045{
1046// Decodage des noms des vecteurs pour le remplissage du generaldata
1047if(nomgfd=="!" || nomgfd.length()<1)
1048 {cout<<"FillGFDfrVec_Error: bad GenaralData name "<<nomgfd<<endl; return;}
1049if(namx=="!" || namx.length()<1)
1050 {cout<<"FillGFDfrVec_Error: bad X vector name "<<namx<<endl; return;}
1051if(namy=="!" || namy.length()<1)
1052 {cout<<"FillGFDfrVec_Error: bad Y vector name "<<namy<<endl; return;}
1053if(namz.length()<1) namz = "!";
1054if(name.length()<1) name = "!";
1055int nvar = 0;
1056if(namz=="!") nvar = 1; else nvar = 2;
1057
1058// Identify data
1059NamedObjMgr omg;
1060AnyDataObj* mobj = NULL;
1061Vector* v;
1062int nel = 0;
1063r_8 *x=NULL, *y=NULL, *z=NULL,* ez=NULL;
1064
1065if( (mobj=omg.GetObj(namx)) == NULL) {
1066 cout<<"FillGFDfrVec_Error: unknown X object "<<namx<<endl; return;
1067} else {
1068 v = (Vector*) mobj; x = v->Data(); nel=v->NElts();
1069}
1070
1071if( (mobj=omg.GetObj(namy)) == NULL) {
1072 cout<<"FillGFDfrVec_Error: unknown Y object "<<namy<<endl; return;
1073} else {
1074 v = (Vector*) mobj; y = z = v->Data(); if(v->NElts()<nel) nel=v->NElts();
1075}
1076
1077if( nvar==2 && (mobj=omg.GetObj(namz)) == NULL) {
1078 cout<<"FillGFDfrVec_Error: unknown Z object "<<namz<<endl; return;
1079} else {
1080 v = (Vector*) mobj; z = v->Data(); if(v->NElts()<nel) nel=v->NElts();
1081}
1082
1083if(name!="!") {
1084 if( (mobj=omg.GetObj(name)) == NULL) {
1085 cout<<"FillGFDfrVec_Error: unknown EZ object "<<name<<endl; return;
1086 } else {
1087 v = (Vector*) mobj; ez = v->Data(); if(v->NElts()<nel) nel=v->NElts();
1088 }
1089}
1090
1091if(nel<=0)
1092 {cout<<"FillGFDfrVec_Error: bad number of elements "<<nel<<endl; return;}
1093
1094// Create GeneralData and fill it with vectors
1095GeneralFitData* gfd = new GeneralFitData(nvar,nel+5,0);
1096if(nvar==1) gfd->SetData1(nel,x,z,ez); // On remplit Y=f(X)
1097else gfd->SetData2(nel,x,y,z,ez); // On remplit Z=f(X,y)
1098
1099// Menage et table d'objets
1100if( omg.GetObj(nomgfd) != NULL ) omg.DelObj(nomgfd);
1101mOmg->AddObj(gfd,nomgfd);
1102return;
1103}
1104
1105/* --Methode-- */
1106void Services2NObjMgr::ComputeExpressions(NObjMgrAdapter* obja, string& expx,
1107 string& expy, string& expz, string& expt, string& expcut, string& loop,
1108 NTuple* nt, Histo* h1, Histo2D* h2, HProf* hp)
1109{
1110if (obja == NULL) return;
1111bool adel = true;
1112NTupleInterface* objnt = obja->GetNTupleInterface(adel);
1113if (objnt == NULL) return;
1114string vardec = objnt->VarList_C("_zz6qi_");
1115
1116PlotExprFunc f = LinkExprFunc(vardec, expx, expy, expz, expt, expcut);
1117if (!f) {
1118 cerr << "Services2NObjMgr::::ComputeExpressions() Error Creation PlotExprFunc " << endl;
1119 if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
1120 return;
1121 }
1122
1123double xnt[10];
1124float fxnt[10];
1125
1126int i,k;
1127for(i=0; i<10; i++) xnt[i] = 0.;
1128int k1,k2,dk;
1129k1 = 0; k2 = objnt->NbLines(); dk = 1;
1130DecodeLoopParameters(loop, k1, k2, dk);
1131if (k1 < 0) k1 = 0;
1132if (k2 < 0) k2 = objnt->NbLines();
1133if (k2 > objnt->NbLines()) k2 = objnt->NbLines();
1134if (dk <= 0) dk = 1;
1135
1136try {
1137 double* xn;
1138 for(k=k1; k<k2; k += dk) {
1139 xn = objnt->GetLineD(k);
1140 if (f(xn, xnt, xnt+1, xnt+2, xnt+3) != 0) {
1141 if (nt) {
1142 for(i=0; i<4; i++) fxnt[i] = xnt[i];
1143 nt->Fill(fxnt);
1144 }
1145 if (h1) h1->Add(xnt[0], xnt[3]);
1146 if (h2) h2->Add(xnt[0], xnt[1], xnt[3]);
1147 if (hp) hp->Add(xnt[0], xnt[1], xnt[3]);
1148 }
1149 }
1150 }
1151#ifdef SANS_EVOLPLANCK
1152CATCH(merr) {
1153 fflush(stdout);
1154 cout << endl;
1155 cerr << endl;
1156 string es = PeidaExc(merr);
1157 cerr << "Services2NObjMgr::ComputeExpressions() Exception :" << merr << es;
1158 } ENDTRY;
1159#else
1160catch ( PException exc ) {
1161 fflush(stdout);
1162 cout << endl;
1163 cerr << endl;
1164 cerr << "Services2NObjMgr::ComputeExpressions() Exception :" << exc.Msg() << endl;
1165}
1166#endif
1167
1168if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
1169// Fermeture du fichier .so
1170CloseDLL();
1171return;
1172}
1173
1174
1175/* --Methode-- */
1176PlotExprFunc Services2NObjMgr::LinkExprFunc(string& vardec, string& expx, string& expy,
1177 string& expz, string& expt, string& cut)
1178{
1179FILE *fip;
1180string fname = TmpDir + "expf_pia_dl.c";
1181string cmd;
1182int rc;
1183
1184cmd = "rm -f " + fname;
1185rc = system(cmd.c_str());
1186//DBG printf("LinkExprFunc_Do> %s (Rc=%d)\n", cmd.c_str(), rc);
1187
1188if ((fip = fopen(fname.c_str(), "w")) == NULL) {
1189 string sn = fname;
1190 cout << "Services2NObjMgr/LinkExprFunc_Error: fopen( " << sn << endl;
1191 return(NULL);
1192 }
1193
1194// constitution du fichier a compiler
1195fputs("#include <stdlib.h> \n", fip);
1196fputs("#include <math.h> \n", fip);
1197
1198fputs("/* ------ Some random number generators --------- */ \n", fip);
1199fputs("#define frand01() ( (float) drand48() ) \n", fip);
1200fputs("#define drand01() drand48() \n", fip);
1201fputs("#define rand01() drand48() \n", fip);
1202fputs("#define frandpm1() ( 2. * frand01() - 1.) \n", fip);
1203fputs("#define drandpm1() ( 2. * drand01() - 1.) \n", fip);
1204fputs("#define randpm1() ( 2. * drand01() - 1.) \n", fip);
1205fputs("double NorRand(void) \n", fip);
1206fputs(" { \n double x,A,B; \n LAB10: \n A = drand01(); \n", fip);
1207fputs(" if ( A == 0. ) goto LAB10; \n B = drand01(); \n", fip);
1208fputs(" x = sqrt(-2.*log(A))*cos(2.*M_PI*B); \n", fip);
1209fputs(" return(x); \n } \n", fip);
1210fputs("#define GauRand() NorRand() \n", fip);
1211fputs("#define gaurand() NorRand() \n\n", fip);
1212
1213fputs("int expf_pia_dl_func(double* _zz6qi_, double* _rx_6q_, double* _ry_6q_, double* _rz_6q_, double* _rt_6q_) \n{\n", fip);
1214fprintf(fip,"%s \n", vardec.c_str());
1215fprintf(fip, "if (!(%s)) { *_rx_6q_ = *_ry_6q_ = *_rz_6q_ = *_rt_6q_ = 0.; return(0); } \n", cut.c_str());
1216fprintf(fip, "*_rx_6q_ = %s ; \n", expx.c_str());
1217fprintf(fip, "*_ry_6q_ = %s ; \n", expy.c_str());
1218fprintf(fip, "*_rz_6q_ = %s ; \n", expz.c_str());
1219fprintf(fip, "*_rt_6q_ = %s ; \n", expt.c_str());
1220fputs("return(1); \n} \n", fip);
1221fclose(fip);
1222string func = "expf_pia_dl_func";
1223return((PlotExprFunc)LinkFunctionFromFile(fname, func));
1224}
1225
1226
1227/* --Methode-- */
1228DlFunction Services2NObjMgr::LinkFunctionFromFile(string const & fname, string const & funcname)
1229{
1230// Le link dynamique
1231CloseDLL();
1232dynlink = PDynLinkMgr::BuildFromCFile(fname);
1233if (dynlink == NULL) {
1234 cerr << "Services2NObjMgr/LinkFunctionFromFile_Erreur: Erreur creation/Ouverture SO " << endl;
1235 return(NULL);
1236 }
1237
1238DlFunction retfunc = dynlink->GetFunction(funcname);
1239if (retfunc == NULL) {
1240 string sn = funcname;
1241 cerr << "Services2NObjMgr/LinkExprFunc_Erreur: Erreur linking " << sn << endl;
1242 CloseDLL();
1243 return(NULL);
1244 }
1245else return(retfunc);
1246}
1247
1248/* --Methode-- */
1249void Services2NObjMgr::CloseDLL()
1250{
1251if (dynlink) delete dynlink; dynlink = NULL;
1252}
1253
1254// Fonction static
1255/* --Methode-- */
1256void Services2NObjMgr::DecodeLoopParameters(string& loop, int& i1, int& i2, int& di)
1257{
1258// Decode des paramatres de boucle for(int i=i1; i<i2; i+=di) specifies
1259// sous forme i1[:i2[:di]]
1260// cout << "LoopParam() " << loop << " I1=" << i1 << " I2=" << i2 << " DI=" << di;
1261size_t l = loop.length();
1262if (l < 1) return;
1263size_t p = loop.find(':');
1264if (p >= l) { i1 = atoi(loop.c_str()); return; }
1265i1 = atoi(loop.substr(0, p).c_str());
1266string aa = loop.substr(p+1);
1267p = aa.find(':');
1268if (p < aa.length() ) {
1269 i2 = atoi(aa.substr(0,p).c_str());
1270 di = atoi(aa.substr(p+1).c_str());
1271 }
1272else i2 = atoi(aa.c_str());
1273// cout << "-> I1= " << i1 << " I2= " << i2 << " DI= " << di << endl;
1274return;
1275}
1276
1277/* --Methode-- */
1278string Services2NObjMgr::FileName2Name(string const & fn)
1279{
1280
1281char fsep[2] = {FILESEP, '\0'};
1282char tsep[2] = {'.', '\0'};
1283size_t p = fn.find_last_of(fsep);
1284size_t l = fn.length();
1285if (p >= l) p = 0;
1286else p++;
1287size_t q = fn.find_first_of(tsep,p);
1288if (q < p) q = l;
1289return(fn.substr(p,q-p));
1290}
1291
1292
1293// Variable pour stocker l'option de stat des drawers
1294static bool stats_option = true;
1295/* --Methode-- */
1296void Services2NObjMgr::SetDefaultStatsOption(bool opt)
1297{
1298 stats_option = opt;
1299}
1300
1301typedef vector<string> GraTok;
1302
1303/* --Methode-- */
1304bool Services2NObjMgr::GetStatsOption(string& gratt)
1305{
1306int ropt = Disp_Next;
1307for(int i=0; i<gratt.length(); i++) gratt[i] = tolower(gratt[i]);
1308// On separe en mots separes par des virgules
1309gratt = ","+gratt;
1310size_t p = 0;
1311size_t q = 0;
1312size_t l = gratt.length();
1313string token;
1314
1315GraTok grt;
1316
1317while (q < l) {
1318 p = gratt.find_first_not_of(" ,",q+1); // au debut d'un token
1319 if (p>=l) break;
1320 q = gratt.find_first_of(" ,",p); // la fin du token;
1321 token = gratt.substr(p,q-p);
1322 grt.push_back(token);
1323 }
1324int k;
1325bool fgsame = false;
1326int option = 0;
1327for(k=0; k<grt.size(); k++) {
1328 if ( (grt[k] == "same") || (grt[k] == "s") ) option = 1;
1329 else if ( (grt[k] == "stat") || (grt[k] == "stats") ) option = 2;
1330 else if ( (grt[k] == "nostat") || (grt[k] == "nostats") ) option = 3;
1331}
1332
1333if (option == 0) return(stats_option);
1334else if ( (option == 1) || (option == 3) ) return(false);
1335else return(true);
1336}
1337
1338/* --Methode-- */
1339int Services2NObjMgr::DecodeDispOption(string& gratt, bool& fgsrgr)
1340{
1341int ropt = Disp_Next;
1342if (!mImgapp) return(ropt);
1343
1344for(int i=0; i<gratt.length(); i++) gratt[i] = tolower(gratt[i]);
1345
1346if (fgsrgr) mImgapp->SaveGraphicAtt();
1347
1348if ( (gratt == "def") || (gratt == "default") ) { // Remise aux valeurs par defaut = non defini
1349 mImgapp->SetColAtt();
1350 mImgapp->SetLineAtt();
1351 mImgapp->SetFontAtt();
1352 mImgapp->SetMarkerAtt();
1353 mImgapp->SetColMapId();
1354 mImgapp->SetZoomAtt();
1355 mImgapp->SetAxesAtt();
1356 mImgapp->SetXYLimits();
1357 mImgapp->UseXYLimits();
1358 mImgapp->SetImageCenterPosition();
1359 mImgapp->UseImageCenter();
1360 mImgapp->SetXLogScale();
1361 mImgapp->SetYLogScale();
1362 mImgapp->SetAutoAddTitle();
1363 stats_option = true;
1364 return(ropt);
1365 }
1366
1367// On separe en mots separes par des virgules
1368gratt = ","+gratt;
1369size_t p = 0;
1370size_t q = 0;
1371size_t l = gratt.length();
1372string token;
1373
1374GraTok grt;
1375
1376while (q < l) {
1377 p = gratt.find_first_not_of(" ,",q+1); // au debut d'un token
1378 if (p>=l) break;
1379 q = gratt.find_first_of(" ,",p); // la fin du token;
1380 token = gratt.substr(p,q-p);
1381 grt.push_back(token);
1382 }
1383
1384
1385static GrAttNames::iterator it;
1386
1387int k;
1388bool fgcont = true;
1389fgsrgr = false;
1390
1391for(k=0; k<grt.size(); k++) {
1392// cout << "--DBG--SetGraphicAttributes() " << grt[k] << endl;
1393
1394 // Decodage option affichage (win, next, etc
1395 fgcont = true;
1396 if ( (grt[k] == "win") || (grt[k] == "w") ) ropt = Disp_Win;
1397 else if ( (grt[k] == "same") || (grt[k] == "s") ) ropt = Disp_Same;
1398 else if ( (grt[k] == "inset") || (grt[k] == "ins") ) ropt = Disp_Inset;
1399 else if ( (grt[k] == "stack") || (grt[k] == "st") ) ropt = Disp_Stack;
1400 else fgcont = false;
1401 if (fgcont) continue;
1402
1403 // Utilisation limites X-Y
1404 if ( grt[k] == "xylimits" ) { mImgapp->UseXYLimits(true); fgsrgr = true; continue; }
1405 if ( grt[k] == "centerimg" ) { mImgapp->UseImageCenter(true); fgsrgr = true; continue; }
1406 // Echelle logarithmique d'axe
1407 if ( grt[k] == "logx" ) { mImgapp->SetXLogScale(true); fgsrgr = true; continue; }
1408 if ( grt[k] == "linx" ) { mImgapp->SetXLogScale(false); fgsrgr = true; continue; }
1409 if ( grt[k] == "logy" ) { mImgapp->SetYLogScale(true); fgsrgr = true; continue; }
1410 if ( grt[k] == "liny" ) { mImgapp->SetYLogScale(false); fgsrgr = true; continue; }
1411 // Ajout automatique de titre
1412 if ( ( grt[k] == "tit" ) || ( grt[k] == "title" ) )
1413 { mImgapp->SetAutoAddTitle(true); fgsrgr = true; continue; }
1414 if ( ( grt[k] == "notit" ) || ( grt[k] == "notitle" ) )
1415 { mImgapp->SetAutoAddTitle(false); fgsrgr = true; continue; }
1416
1417 // Si c'est une couleur
1418 it = GrAcolors.find(grt[k]);
1419 if (it != GrAcolors.end()) { mImgapp->SetColAtt((PIColors)((*it).second.a1)); fgsrgr = true; continue; }
1420 // Si c'est un attribut de lignes
1421 it = GrAlines.find(grt[k]);
1422 if (it != GrAlines.end()) { mImgapp->SetLineAtt((PILineAtt)((*it).second.a1)); fgsrgr = true; continue; }
1423 // Si c'est un attribut de fontes
1424 it = GrAfonts.find(grt[k]);
1425 if (it != GrAfonts.end()) { mImgapp->SetFontAtt((PIFontSize)((*it).second.a2), (PIFontAtt)((*it).second.a1) );
1426 fgsrgr = true; continue; }
1427 // Si c'est un attribut de markers
1428 it = GrAmarkers.find(grt[k]);
1429 if (it != GrAmarkers.end()) { mImgapp->SetMarkerAtt((*it).second.a2, (PIMarker)((*it).second.a1) );
1430 fgsrgr = true; continue; }
1431 // Si c'est un colormap
1432 it = GrAcmap.find(grt[k]);
1433 if (it != GrAcmap.end()) { mImgapp->SetColMapId( (CMapId)((*it).second.a1) ); fgsrgr = true; continue; }
1434 // Si c'est un facteur de zoom
1435 it = GrAzoom.find(grt[k]);
1436 if (it != GrAzoom.end()) { mImgapp->SetZoomAtt( (*it).second.a1 ); fgsrgr = true; continue; }
1437 // Si c'est un attribut d'axe
1438 it = GrAaxes.find(grt[k]);
1439 if (it != GrAaxes.end()) { mImgapp->SetAxesAtt( (*it).second.a1 ); fgsrgr = true; continue; }
1440
1441 }
1442
1443return(ropt);
1444}
1445
1446
1447// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1448// Initialisation des chaines de caracteres designant les attributs graphiques
1449
1450/* --Methode-- */
1451void Services2NObjMgr::InitGrAttNames()
1452{
1453gratt_item gi;
1454// Les couleurs
1455gi.a2 = 0;
1456gi.a1 = PI_NotDefColor;
1457GrAcolors["defcol"] = gi;
1458gi.a1 = PI_Black;
1459GrAcolors["black"] = gi;
1460gi.a1 = PI_White;
1461GrAcolors["white"] = gi;
1462gi.a1 = PI_Grey;
1463GrAcolors["grey"] = gi;
1464gi.a1 = PI_Red;
1465GrAcolors["red"] = gi;
1466gi.a1 = PI_Blue;
1467GrAcolors["blue"] = gi;
1468gi.a1 = PI_Green;
1469GrAcolors["green"] = gi;
1470gi.a1 = PI_Yellow;
1471GrAcolors["yellow"] = gi;
1472gi.a1 = PI_Magenta;
1473GrAcolors["magenta"] = gi;
1474
1475gi.a1 = PI_Cyan;
1476GrAcolors["cyan"] = gi;
1477gi.a1 = PI_Turquoise;
1478GrAcolors["turquoise"] = gi;
1479gi.a1 = PI_NavyBlue;
1480GrAcolors["navyblue"] = gi;
1481gi.a1 = PI_Orange;
1482GrAcolors["orange"] = gi;
1483gi.a1 = PI_SiennaRed;
1484GrAcolors["siennared"] = gi;
1485gi.a1 = PI_Purple;
1486GrAcolors["purple"] = gi;
1487gi.a1 = PI_LimeGreen;
1488GrAcolors["limegreen"] = gi;
1489gi.a1 = PI_Gold;
1490GrAcolors["gold"] = gi;
1491
1492// Les attributs de lignes
1493gi.a2 = 0;
1494gi.a1 = PI_NotDefLineAtt;
1495GrAlines["defline"] = gi;
1496gi.a1 = PI_NormalLine;
1497GrAlines["normalline"] = gi;
1498gi.a1 = PI_ThinLine;
1499GrAlines["thinline"] = gi;
1500gi.a1 = PI_ThickLine;
1501GrAlines["thickline"] = gi;
1502gi.a1 = PI_DashedLine;
1503GrAlines["dashedline"] = gi;
1504gi.a1 = PI_ThinDashedLine;
1505GrAlines["thindashedline"] = gi;
1506gi.a1 = PI_ThickDashedLine;
1507GrAlines["thickdashedline"] = gi;
1508gi.a1 = PI_DottedLine;
1509GrAlines["dottedline"] = gi;
1510gi.a1 = PI_ThinDottedLine;
1511GrAlines["thindottedline"] = gi;
1512gi.a1 = PI_ThickDottedLine;
1513GrAlines["thickdottedline"] = gi;
1514
1515// Les fontes
1516gi.a2 = PI_NotDefFontSize;
1517gi.a1 = PI_NotDefFontAtt;
1518GrAfonts["deffont"] = gi;
1519
1520gi.a2 = PI_NormalSizeFont;
1521gi.a1 = PI_RomanFont;
1522GrAfonts["normalfont"] = gi;
1523gi.a1 = PI_BoldFont;
1524GrAfonts["boldfont"] = gi;
1525gi.a1 = PI_ItalicFont;
1526GrAfonts["italicfont"] = gi;
1527gi.a2 = PI_SmallSizeFont;
1528gi.a1 = PI_RomanFont;
1529GrAfonts["smallfont"] = gi;
1530gi.a1 = PI_BoldFont;
1531GrAfonts["smallboldfont"] = gi;
1532gi.a1 = PI_ItalicFont;
1533GrAfonts["smallitalicfont"] = gi;
1534gi.a2 = PI_BigSizeFont;
1535gi.a1 = PI_RomanFont;
1536GrAfonts["bigfont"] = gi;
1537gi.a1 = PI_BoldFont;
1538GrAfonts["bigboldfont"] = gi;
1539gi.a1 = PI_ItalicFont;
1540GrAfonts["bigitalicfont"] = gi;
1541gi.a2 = PI_HugeSizeFont;
1542gi.a1 = PI_RomanFont;
1543GrAfonts["hugefont"] = gi;
1544gi.a1 = PI_BoldFont;
1545GrAfonts["hugeboldfont"] = gi;
1546gi.a1 = PI_ItalicFont;
1547GrAfonts["hugeitalicfont"] = gi;
1548
1549
1550// Les markers
1551const char* mrkn[11] = { "dotmarker", "plusmarker", "crossmarker",
1552 "circlemarker", "fcirclemarker", "boxmarker", "fboxmarker",
1553 "trianglemarker", "ftrianglemarker", "starmarker", "fstarmarker"};
1554PIMarker mrk[11] = { PI_DotMarker, PI_PlusMarker, PI_CrossMarker,
1555 PI_CircleMarker, PI_FCircleMarker, PI_BoxMarker, PI_FBoxMarker,
1556 PI_TriangleMarker, PI_FTriangleMarker, PI_StarMarker, PI_FStarMarker};
1557
1558gi.a2 = 0;
1559gi.a1 = PI_NotDefMarker;
1560GrAmarkers["defmarker"] = gi;
1561
1562for(int j=0; j<11; j++) {
1563 string smrk;
1564 char buff[16];
1565 for(int m=1; m<10; m+=2) {
1566 sprintf(buff,"%d",m);
1567 smrk = (string)mrkn[j] + (string)buff;
1568 gi.a1 = mrk[j]; gi.a2 = m;
1569 GrAmarkers[smrk] = gi;
1570 }
1571 }
1572
1573// Les tables de couleurs
1574gi.a2 = 0;
1575gi.a1 = CMAP_OTHER;
1576GrAcmap["defcmap"] = gi;
1577for(int kcc=0; kcc<PIColorMap::NumberStandardColorMaps(); kcc++) {
1578 gi.a1 = PIColorMap::GetStandardColorMapId(kcc);
1579 string colname = PIColorMap::GetStandardColorMapName(kcc);
1580 for(int jll=0; jll<colname.length(); jll++)
1581 colname[jll] = tolower(colname[jll]);
1582 GrAcmap[colname] = gi;
1583}
1584
1585
1586// La valeur de zoom
1587gi.a2 = 0;
1588gi.a1 = 0;
1589GrAzoom["defzoom"] = gi;
1590gi.a1 = 1;
1591GrAzoom["zoomx1"] = gi;
1592gi.a1 = 2;
1593GrAzoom["zoomx2"] = gi;
1594gi.a1 = 3;
1595GrAzoom["zoomx3"] = gi;
1596gi.a1 = 4;
1597GrAzoom["zoomx4"] = gi;
1598gi.a1 = 5;
1599GrAzoom["zoomx5"] = gi;
1600gi.a1 = -2;
1601GrAzoom["zoom/2"] = gi;
1602gi.a1 = -3;
1603GrAzoom["zoom/3"] = gi;
1604gi.a1 = -4;
1605GrAzoom["zoom/4"] = gi;
1606gi.a1 = -5;
1607GrAzoom["zoom/5"] = gi;
1608
1609// Attributs d'axes
1610gi.a2 = 0;
1611gi.a1 = (int)(kBoxAxes | kExtTicks | kLabels);
1612GrAaxes["stdaxes"] = gi;
1613GrAaxes["defaxes"] = gi;
1614GrAaxes["boxaxes"] = gi;
1615gi.a1 = (int)kAxesDflt;
1616GrAaxes["simpleaxes"] = gi;
1617gi.a1 = (int)(kBoxAxes | kExtTicks | kLabels | kGridOn);
1618GrAaxes["boxaxesgrid"] = gi;
1619
1620gi.a1 = (int)(kBoxAxes | kTicks | kLabels | kMinTicks | kMajTicks);
1621GrAaxes["fineaxes"] = gi;
1622 gi.a1 = (int)(kBoxAxes | kTicks | kLabels | kMinTicks | kMajTicks | kGridOn);
1623GrAaxes["grid"] = gi;
1624GrAaxes["fineaxesgrid"] = gi;
1625
1626}
1627
1628
1629// SANS_EVOLPLANCK Attention !
1630#ifdef SANS_EVOLPLANCK
1631#include "pclassids.h"
1632
1633/* --Methode-- */
1634char* Services2NObjMgr::PClassIdToClassName(int cid)
1635{
1636switch (cid) {
1637 case ClassId_Poly1 :
1638 return("Poly1");
1639 case ClassId_Poly2 :
1640 return("Poly2");
1641 case ClassId_Matrix :
1642 return("Matrix");
1643 case ClassId_Vector :
1644 return("Vector");
1645
1646 case ClassId_DVList :
1647 return("DVList");
1648
1649 case ClassId_Histo1D :
1650 return("Histo1D");
1651 case ClassId_Histo2D :
1652 return("Histo2D");
1653 case ClassId_HProf :
1654 return("HProf");
1655 case ClassId_NTuple :
1656 return("NTuple");
1657 case ClassId_XNTuple :
1658 return("XNTuple");
1659 case ClassId_GeneralFitData :
1660 return("GeneralFitData");
1661
1662 case ClassId_Image :
1663 return("RzImage");
1664 case ClassId_Image + kuint_1 :
1665 return("ImageU1");
1666 case ClassId_Image + kint_1 :
1667 return("ImageI1");
1668 case ClassId_Image + kuint_2 :
1669 return("ImageU2");
1670 case ClassId_Image + kint_2 :
1671 return("ImageI2");
1672 case ClassId_Image + kuint_4 :
1673 return("ImageU4");
1674 case ClassId_Image + kint_4 :
1675 return("ImageI4");
1676 case ClassId_Image + kr_4 :
1677 return("ImageR4");
1678 case ClassId_Image + kr_8 :
1679 return("ImageR8");
1680 case ClassId_ZFidu :
1681 return("ZFidu");
1682
1683 case ClassId_StarList :
1684 return("StarList");
1685 case ClassId_Transfo :
1686 return("Transfo");
1687 case ClassId_PSF :
1688 return("PSF");
1689
1690
1691// - Ajout objet PPF
1692 default:
1693 return("AnyDataObj");
1694 }
1695}
1696
1697#else
1698char* Services2NObjMgr::PClassIdToClassName(int cid)
1699{
1700 return("AnyDataObj");
1701}
1702#endif
Note: See TracBrowser for help on using the repository browser.