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

Last change on this file since 2952 was 2924, checked in by ansari, 19 years ago

prise en compte option nodisp dans PlotFunc (utilise pour newvec) suite modifs commandes FFT de sopiamodule.cc - Reza 28/3/2006

File size: 41.7 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <ctype.h>
4
5#include <typeinfo>
6#include <iostream>
7#include <string>
8#include <list>
9#include <map>
10
11#include "sopnamsp.h"
12#include "strutil.h"
13
14#include "nobjmgr.h"
15#include "servnobjm.h"
16#include "nomgadapter.h"
17#include "pistdimgapp.h"
18
19#include "fct1dfit.h"
20#include "fct2dfit.h"
21
22#ifdef SANS_EVOLPLANCK
23#include "matrix.h"
24#include "cvector.h"
25#else
26#include "tmatrix.h"
27#include "tvector.h"
28#include "matharr.h"
29#include "pitvmaad.h"
30#endif
31
32#include "ntuple.h"
33#include "cimage.h"
34
35#include "histos.h"
36#include "histos2.h"
37#include "hisprof.h"
38#include "ntuple.h"
39#include "datatable.h"
40
41#include "piyfxdrw.h"
42#include "pisurfdr.h"
43
44#include "pintuple.h"
45#include "pintup3d.h"
46
47#include "pipodrw.h"
48
49
50
51/* --Methode-- */
52Services2NObjMgr::Services2NObjMgr(string& tmpdir)
53{
54SetTmpDir(tmpdir);
55mImgapp = NULL;
56mOmg = NULL;
57dynlink = NULL;
58}
59
60/* --Methode-- */
61Services2NObjMgr::~Services2NObjMgr()
62{
63CloseDLL();
64if (mOmg) delete mOmg;
65}
66
67/* --Methode-- */
68void Services2NObjMgr::RegisterClass(AnyDataObj* o, NObjMgrAdapter* oa)
69{
70ObjAdaptList::iterator it;
71for(it = objadaplist.begin(); it != objadaplist.end(); it++)
72#ifdef SANS_EVOLPLANCK
73 if (typeid(*o) == typeid(*((*it).obj))) THROW(dupIdErr);
74#else
75 if (typeid(*o) == typeid(*((*it).obj)))
76 throw(DuplicateIdExc("Services2NObjMgr::RegisterClass() - Duplicate class"));
77#endif
78dataobj_adapter oba;
79oba.obj = o;
80oba.obja = oa;
81objadaplist.push_back(oba);
82}
83
84/* --Methode-- */
85NObjMgrAdapter* Services2NObjMgr::GetAdapter(AnyDataObj* o)
86{
87ObjAdaptList::iterator it;
88for(it = objadaplist.begin(); it != objadaplist.end(); it++)
89 if (typeid(*o) == typeid(*((*it).obj))) return((*it).obja->Clone(o));
90return(new NObjMgrAdapter(o));
91}
92
93/* --Methode-- */
94void Services2NObjMgr::SetTmpDir(string const & tmpdir)
95{
96TmpDir = tmpdir;
97PDynLinkMgr::SetTmpDir(tmpdir);
98return;
99}
100
101/* --Methode-- */
102void Services2NObjMgr::PlotFunc(string const & expfunc, string & nom, double xmin, double xmax, int np, string dopt)
103{
104FILE *fip;
105string fname = TmpDir + "func1_pia_dl.c";
106string cmd;
107int rc;
108
109if (!mImgapp) return;
110
111// Pour synchronisation d'execution simultanee
112ZSync zs(mutx_dynlink); zs.NOp();
113
114cmd = "rm -f " + fname;
115rc = system(cmd.c_str());
116// printf("PlotFunc_Do> %s (Rc=%d)\n", cmd.c_str(), rc);
117
118if ((fip = fopen(fname.c_str(), "w")) == NULL) {
119 string sn = fname;
120 cout << "Services2NObjMgr/PlotFunc_Error: fopen( " << sn << endl;
121 return;
122 }
123
124// constitution du fichier a compiler
125fputs("#include <math.h> \n", fip);
126fputs("double func1_pia_dl_func(double x) \n{\n", fip);
127fprintf(fip,"return(%s); \n}\n", expfunc.c_str());
128fclose(fip);
129
130string func = "func1_pia_dl_func";
131DlFunctionOfX f = (DlFunctionOfX) LinkFunctionFromFile(fname, func);
132if (!f) return;
133PlotFunc(f, nom, xmin, xmax, np, dopt);
134CloseDLL();
135return;
136}
137
138/* --Methode-- */
139void Services2NObjMgr::PlotFunc2D(string const & expfunc, string & nom, double xmin, double xmax,
140 double ymin, double ymax, int npx, int npy, string dopt)
141{
142FILE *fip;
143string fname = TmpDir + "func2_pia_dl.c";
144string cmd;
145int rc;
146
147if (!mImgapp) return;
148// Pour synchronisation d'execution simultanee
149ZSync zs(mutx_dynlink); zs.NOp();
150
151cmd = "rm " + fname;
152rc = system(cmd.c_str());
153// printf("PlotFunc2D_Do> %s (Rc=%d)\n", cmd.c_str(), rc);
154
155if ((fip = fopen(fname.c_str(), "w")) == NULL) {
156 string sn = fname;
157 cout << "Services2NObjMgr/PlotFunc2D_Error: fopen( " << sn << endl;
158 return;
159 }
160
161// constitution du fichier a compiler
162fputs("#include <math.h> \n", fip);
163fputs("double func2_pia_dl_func(double x, double y) \n{\n", fip);
164fprintf(fip,"return(%s); \n}\n", expfunc.c_str());
165fclose(fip);
166
167string func = "func2_pia_dl_func";
168DlFunctionOfXY f = (DlFunctionOfXY) LinkFunctionFromFile(fname, func);
169if (!f) return;
170PlotFunc2D(f, nom, xmin, xmax, ymin, ymax, npx, npy, dopt);
171CloseDLL();
172return;
173}
174
175/* --Methode-- */
176void Services2NObjMgr::PlotFuncFrCFile(string const & fname, string const & func, string & nom,
177 double xmin, double xmax, int np, string dopt)
178{
179// Pour synchronisation d'execution simultanee
180ZSync zs(mutx_dynlink); zs.NOp();
181DlFunctionOfX f = (DlFunctionOfX) LinkFunctionFromFile(fname, func);
182if (!f) return;
183PlotFunc(f, nom, xmin, xmax, np, dopt);
184CloseDLL();
185return;
186}
187
188/* --Methode-- */
189void Services2NObjMgr::PlotFunc2DFrCFile(string const & fname, string const & func, string & nom,
190 double xmin, double xmax, double ymin, double ymax, int npx, int npy, string dopt)
191{
192// Pour synchronisation d'execution simultanee
193ZSync zs(mutx_dynlink); zs.NOp();
194DlFunctionOfXY f = (DlFunctionOfXY) LinkFunctionFromFile(fname, func);
195if (!f) return;
196PlotFunc2D(f, nom, xmin, xmax, ymin, ymax, npx, npy, dopt);
197CloseDLL();
198return;
199}
200
201/* --Methode-- */
202void Services2NObjMgr::PlotFunc(DlFunctionOfX f, string & nom, double xmin, double xmax, int np, string dopt)
203{
204if (!mImgapp) return;
205
206int k;
207if (np < 1) np = 1;
208if (xmax <= xmin) xmax = xmin+1.;
209Vector* vpy = new Vector(np);
210
211double xx;
212double dx = (xmax-xmin)/np;
213
214try {
215 for(k=0; k<np; k++) { xx = xmin+dx*k; (*vpy)(k) = f(xx); }
216}
217#ifdef SANS_EVOLPLANCK
218CATCH(merr) {
219 fflush(stdout);
220 cout << endl;
221 cerr << endl;
222 string es = PeidaExc(merr);
223 cerr << "Services2NObjMgr::PlotFunc() Exception :" << merr << es;
224 delete vpy;
225 vpy = NULL;
226 } ENDTRY;
227#else
228catch ( PException exc ) {
229 fflush(stdout);
230 cout << endl;
231 cerr << endl;
232 cerr << "Services2NObjMgr::PlotFunc() Exception :" << exc.Msg() << endl;
233 delete vpy;
234 vpy = NULL;
235}
236#endif
237
238if (vpy) {
239 string titre;
240 if (nom.length() < 1) {
241 titre = "Function f(x)";
242 nom = "/autoc/f_x";
243 }
244 else titre = nom;
245
246 MyObjMgr()->AddObj(vpy, nom);
247
248 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
249
250 P1DArrayAdapter* vya = new POVectorAdapter(vpy, false);
251 vya->DefineXCoordinate(xmin, (xmax-xmin)/np);
252 PIYfXDrawer* dr = new PIYfXDrawer(vya, NULL, true) ;
253 dopt = "thinline " + dopt;
254 int rsid = mImgapp->DispScDrawer(dr, titre, dopt);
255 MyObjMgr()->AddWRsId(nom, rsid);
256}
257return;
258}
259
260/* --Methode-- */
261void Services2NObjMgr::PlotFunc2D(DlFunctionOfXY f, string & nom, double xmin, double xmax, double ymin, double ymax,
262 int npx, int npy, string dopt)
263{
264if (!mImgapp) return;
265
266if (npx < 2) npx = 2;
267if (npy < 2) npy = 2;
268//if (npx > 250) npx = 250;
269//if (npy > 250) npy = 250;
270if (xmax <= xmin) xmax = xmin+1.;
271if (ymax <= ymin) ymax = ymin+1.;
272
273Matrix* mtx = new Matrix(npy, npx);
274
275int i,j;
276double xx, yy;
277double dx = (xmax-xmin)/npx;
278double dy = (ymax-ymin)/npy;
279// printf(" -- DBG -- %d %d , %g %g , %g %g \n", npx, npy, xmin, xmax, ymin, ymax);
280try {
281 for(j=0; j<npy; j++) {
282 yy = ymin+dy*j;
283 for(i=0; i<npx; i++) {
284 xx = xmin+dx*i;
285 (*mtx)(j, i) = f(xx, yy);
286 }
287 }
288}
289#ifdef SANS_EVOLPLANCK
290CATCH(merr) {
291 fflush(stdout);
292 cout << endl;
293 cerr << endl;
294 string es = PeidaExc(merr);
295 cerr << "Services2NObjMgr::PlotFunc2D() Exception :" << merr << es;
296 delete mtx; mtx = NULL;
297 } ENDTRY;
298#else
299catch ( PException exc ) {
300 fflush(stdout);
301 cout << endl;
302 cerr << endl;
303 cerr << "Services2NObjMgr::PlotFunc2D() Exception :" << exc.Msg() << endl;
304 delete mtx; mtx = NULL;
305}
306#endif
307
308if (mtx) {
309 string titre;
310 if (nom.length() < 1) {
311 titre = "Function f(x,y)";
312 nom = "/autoc/f2d_xy";
313 }
314 else titre = nom;
315 int rsid = 0;
316 P2DArrayAdapter* arr = new POMatrixAdapter(mtx, false);
317 arr->DefineXYCoordinates(xmin, ymin, dx, dy);
318 if ( (npx <= 200) && (npy <= 200) ) {
319 PISurfaceDrawer* sdr = new PISurfaceDrawer(arr, true, true, true);
320 rsid = mImgapp->Disp3DDrawer(sdr, titre, dopt);
321 }
322 else rsid = mImgapp->DispImage(arr, titre, dopt);
323
324 if (nom.length() > 0) {
325 MyObjMgr()->AddObj(mtx, nom);
326 MyObjMgr()->AddWRsId(nom, rsid);
327 }
328 }
329
330return;
331}
332
333/* --Methode-- */
334void Services2NObjMgr::ExpVal(string expval,string resultvarname)
335{
336 // Fill C-file to be executed
337 FILE *fip;
338 string func = "eval_pia_dl_func";
339 string fname = TmpDir + func; fname += ".c";
340 string cmd = "rm -f " + fname; system(cmd.c_str());
341 if((fip=fopen(fname.c_str(), "w"))==NULL) {
342 cout << "Services2NObjMgr/EvalExp_Error: fopen("<<fname<<")"<<endl;
343 return;
344 }
345 fprintf(fip,"#include <math.h>\n");
346 fprintf(fip,"double %s(double ___dummy_variable___) \n{\n",func.c_str());
347 // Add all variables already declared
348 DVList& varlist = MyObjMgr()->GetVarList();
349 DVList::ValList::const_iterator it;
350 for(it = varlist.Begin(); it != varlist.End(); it++) {
351#ifdef SANS_EVOLPLANCK
352 MuTyV mtv = (*it).second;
353 double value = (double)(mtv);
354#else
355 double value = (double)((*it).second.elval);
356#endif
357 string name_var = (*it).first;
358 fprintf(fip,"double %s = %.17f;\n",name_var.c_str(),value);
359 }
360 fprintf(fip,"return %s;\n}\n",expval.c_str());
361 fclose(fip);
362
363 // Dynamically link function
364 DlFunctionOfX f = (DlFunctionOfX) LinkFunctionFromFile(fname,func);
365 if(!f) {
366 cout<<"Services2NObjMgr/EvalExp_Error: linking DlFunctionOfX"<<endl;
367 cout<<"...expval = "<<expval<<endl;
368 return;
369 }
370
371 // Evaluate function and close dynamic link
372 double result;
373 try {
374 result = f(0.);
375 CloseDLL();
376 } catch ( ... ) {
377 cout<<"Services2NObjMgr/EvalExp_Error: Arithmetic exception"<<endl;
378 CloseDLL();
379 return;
380 }
381
382 // Eventually store the result into variable or just print it
383 if(resultvarname.size()>0) {
384 if(MyObjMgr()->HasVar(resultvarname)) MyObjMgr()->DeleteVar(resultvarname);
385 char str[512];
386 if(result==0.) sprintf(str,"%f",result);
387 else {
388 double lr = log10(fabs(result));
389 if(lr>-17. && lr<17.) sprintf(str,"%17f",result);
390 else sprintf(str,"%.17e",result);
391 }
392 MyObjMgr()->SetVar(resultvarname,(string)str);
393 } else cout<<result<<" = "<<expval<<endl;
394
395}
396
397/* --Methode-- */
398void Services2NObjMgr::DisplayPoints2D(string& nom, string& expx, string& expy,
399 string& experrx, string& experry,
400 string& expcut, string dopt, string loop)
401{
402NObjMgrAdapter* obja=NULL;
403obja = MyObjMgr()->GetObjAdapter(nom);
404if (obja == NULL) {
405 cout << "Services2NObjMgr::DisplayPoints2D() Error , No such object " << nom << endl;
406 return;
407 }
408if (!mImgapp) return;
409
410// Creation NTuple
411char* ntn[4] = {"expx","expy","expex","expey",};
412NTuple* nt = NULL;
413bool haserr = false;
414
415if ( (experrx.length() > 0 ) && (experry.length() > 0 ) ) { haserr = true; nt = new NTuple(4, ntn); }
416else { haserr = false; experrx = experry = "0."; nt = new NTuple(2, ntn); }
417
418ComputeExpressions(obja, expx, expy, experrx, experry, expcut, loop, nt, NULL, NULL);
419
420if (nt->NEntry() < 1) {
421 cout << "Services2NObjMgr::DisplayPoints2D() Warning Zero points satisfy cut !" << endl;
422 delete nt;
423 return;
424 }
425
426// nt->Show();
427// nt->Print(0,10);
428PINTuple* pin = new PINTuple(nt, true);
429pin->SelectXY(ntn[0], ntn[1]);
430if ( haserr ) pin->SelectErrBar(ntn[2], ntn[3]);
431
432dopt = "defline " + dopt;
433string titre = nom + ":" + expy + "%" + expx;
434mImgapp->DispScDrawer( (PIDrawer*)pin, titre, dopt);
435return;
436}
437
438/* --Methode-- */
439void Services2NObjMgr::DisplayPoints3D(string& nom, string& expx, string& expy,
440 string& expz, string& expcut, string dopt, string loop)
441{
442NObjMgrAdapter* obja=NULL;
443obja = MyObjMgr()->GetObjAdapter(nom);
444if (obja == NULL) {
445 cout << "Services2NObjMgr::DisplayPoints3D() Error , No such object " << nom << endl;
446 return;
447 }
448if (!mImgapp) return;
449
450char* ntn[3] = {"expx","expy","expz"};
451NTuple* nt = new NTuple(3,ntn); // Creation NTuple
452
453string expwt = "1.";
454ComputeExpressions(obja, expx, expy, expz, expwt, expcut, loop, nt, NULL, NULL);
455
456if (nt->NEntry() < 1) {
457 cout << "Services2NObjMgr::DisplayPoints3D() Warning Zero points satisfy cut !" << endl;
458 delete nt;
459 return;
460 }
461//DBG nt->Show();
462//DBG nt->Print(0,10);
463PINTuple3D* pin = new PINTuple3D(nt, true);
464pin->SelectXYZ(ntn[0], ntn[1], ntn[2]);
465dopt = "defline " + dopt;
466
467// Pour plot a partir de DispScDrawer
468// string nomdisp = "_NT3D_";
469// mImgapp->DispScDrawer( (PIDrawer*)pin, nomdisp, opt);
470// Pour plot a partir de Disp3DDrawer
471string titre = nom + ":" + expy + "%" + expx;
472mImgapp->Disp3DDrawer(pin, titre, dopt);
473
474return;
475}
476
477/* --Methode-- */
478void Services2NObjMgr::DisplayPoints2DW(string& nom, string& expx, string& expy,
479 string& expwt, string& expcut, string dopt, string loop)
480{
481NObjMgrAdapter* obja=NULL;
482obja = MyObjMgr()->GetObjAdapter(nom);
483if (obja == NULL) {
484 cout << "Services2NObjMgr::DisplayPoints2DW() Error , No such object " << nom << endl;
485 return;
486 }
487if (!mImgapp) return;
488
489char* ntn[3] = {"expx","expy","expw"};
490NTuple* nt = new NTuple(3,ntn); // Creation NTuple
491
492string exp = "1.";
493ComputeExpressions(obja, expx, expy, expwt, exp, expcut, loop, nt, NULL, NULL);
494
495if (nt->NEntry() < 1) {
496 cout << "Services2NObjMgr::DisplayPoints2DW() Warning Zero points satisfy cut !" << endl;
497 delete nt;
498 return;
499 }
500
501PINTuple* pin = new PINTuple(nt, true);
502pin->SelectXY(ntn[0], ntn[1]);
503pin->SelectWt(ntn[2]);
504
505string titre = nom + ":" + expwt + "_" + expy + "%" + expx ;
506mImgapp->DispScDrawer( (PIDrawer*)pin, titre, dopt);
507return;
508}
509
510/* --Methode-- */
511void Services2NObjMgr::ProjectH1(string& nom, string& expx, string& expwt,
512 string& expcut, string& nomh1, string dopt, string loop)
513{
514NObjMgrAdapter* obja=NULL;
515obja = MyObjMgr()->GetObjAdapter(nom);
516if (obja == NULL) {
517 cout << "Services2NObjMgr::ProjectH1() Error , No such object " << nom << endl;
518 return;
519}
520if (!mImgapp) return;
521
522Histo* h1 = NULL;
523NTuple* nt = NULL;
524AnyDataObj* oh = NULL;
525bool h1_already_exist = false;
526if (nomh1.length() > 0) oh=MyObjMgr()->GetObj(nomh1);
527else nomh1 = "/tmp/projh1d";
528if ( (oh != NULL) && (typeid(*oh) == typeid(Histo)) ) {
529 h1 = (Histo*)oh;
530 h1_already_exist = true;
531 // Pas de remise a zero ! h1->Zero();
532} else {
533 char* ntn[2]= {"hxval", "hwt"};
534 nt = new NTuple(2,ntn); // Creation NTuple
535}
536string expz = "0.";
537ComputeExpressions(obja, expx, expwt, expz, expwt, expcut, loop, nt, h1, NULL);
538
539if ((!h1) && (!nt)) return;
540if (!h1) {
541 if (nt->NEntry() < 1) {
542 cout << "Services2NObjMgr::ProjectH1() Warning Zero points satisfy cut !" << endl;
543 delete nt;
544 return;
545 }
546 double xmin, xmax;
547 nt->GetMinMax(0, xmin, xmax);
548 h1 = new Histo(xmin, xmax, 100);
549 int k;
550 float* xn;
551 for(k=0; k<nt->NEntry(); k++) {
552 xn = nt->GetVec(k);
553 h1->Add(xn[0], xn[1]);
554 }
555 delete nt;
556 MyObjMgr()->AddObj(h1, nomh1);
557}
558
559if(!h1_already_exist || dopt.size()>0) MyObjMgr()->DisplayObj(nomh1, dopt);
560return;
561}
562
563/* --Methode-- */
564void Services2NObjMgr::ProjectH2(string& nom, string& expx, string& expy, string& expwt,
565 string& expcut, string& nomh2, string dopt, string loop)
566{
567NObjMgrAdapter* obja=NULL;
568obja = MyObjMgr()->GetObjAdapter(nom);
569if (obja == NULL) {
570 cout << "Services2NObjMgr::ProjectH2() Error , No such object " << nom << endl;
571 return;
572}
573if (!mImgapp) return;
574
575Histo2D* h2 = NULL;
576NTuple* nt = NULL;
577AnyDataObj* oh = NULL;
578bool h2_already_exist = false;
579if (nomh2.length() > 0) oh=MyObjMgr()->GetObj(nomh2);
580else nomh2 = "/tmp/projh2d";
581if ( (oh != NULL) && (typeid(*oh) == typeid(Histo2D)) ) {
582 h2 = (Histo2D*)oh;
583 h2_already_exist = true;
584 // Pas de remise a zero ! h2->Zero();
585} else {
586 char* ntn[3]= {"hxval", "hyval", "hwt"};
587 nt = new NTuple(3,ntn); // Creation NTuple
588}
589string expz = "0.";
590ComputeExpressions(obja, expx, expy, expwt, expwt, expcut, loop, nt, NULL, h2);
591
592if ((!h2) && (!nt)) return;
593if (!h2) {
594 if (nt->NEntry() < 1) {
595 cout << "Services2NObjMgr::ProjectH2() Warning Zero points satisfy cut !" << endl;
596 delete nt;
597 return;
598 }
599 double xmin, xmax, ymin, ymax;
600 nt->GetMinMax(0, xmin, xmax);
601 nt->GetMinMax(1, ymin, ymax);
602 h2 = new Histo2D(xmin, xmax, 50, ymin, ymax, 50);
603 int k;
604 float* xn;
605 for(k=0; k<nt->NEntry(); k++) {
606 xn = nt->GetVec(k);
607 h2->Add(xn[0], xn[1], xn[2]);
608 }
609 delete nt;
610 MyObjMgr()->AddObj(h2, nomh2);
611}
612
613if(!h2_already_exist || dopt.size()>0) MyObjMgr()->DisplayObj(nomh2, dopt);
614return;
615
616}
617
618/* --Methode-- cmv 13/10/98 */
619void Services2NObjMgr::ProjectHProf(string& nom, string& expx, string& expy, string& expwt,
620 string& expcut, string& nomprof, string dopt, string loop)
621// Pour remplir un ``GeneralFitData'' a partir de divers objets:
622//| nom = nom de l'objet a projeter dans un HProf.
623//| expx = expression X de definition du bin.
624//| expy = expression Y a additionner dans le bin.
625//| expwt = expression W du poids a additionner.
626//| expcut = expression du test de selection.
627//| nomprof = nom du HProf engendre (optionnel). Si l'objet n'existe pas
628//| les limites Xmin,Xmax sont calculees automatiquement.
629//| sinon ce sont celles de l'objet preexistant.
630//| opt = options generales pour le display.
631{
632NObjMgrAdapter* obja=NULL;
633obja = MyObjMgr()->GetObjAdapter(nom);
634if (obja == NULL) {
635 cout << "Services2NObjMgr::ProjectHProf() Error , No such object " << nom << endl;
636 return;
637}
638if (!mImgapp) return;
639
640HProf* hprof = NULL;
641NTuple* nt = NULL;
642AnyDataObj* oh = NULL;
643bool hp_already_exist = false;
644if (nomprof.length() > 0) oh=MyObjMgr()->GetObj(nomprof);
645else nomprof = "/tmp/projprof";
646if( (oh!=NULL) && (typeid(*oh) == typeid(HProf)) ) {
647 hprof = (HProf*)oh;
648 hp_already_exist = true;
649} else {
650 char* ntn[3]= {"hxval", "hyval", "hwt"};
651 nt = new NTuple(3,ntn); // Creation NTuple
652}
653string expz = "0.";
654ComputeExpressions(obja, expx, expy, expwt, expwt, expcut, loop, nt, NULL, NULL, hprof);
655
656if((!hprof) && (!nt)) return;
657if(!hprof) {
658 if (nt->NEntry() < 1) {
659 cout << "Services2NObjMgr::ProjectHProf() Warning Zero points satisfy cut !" << endl;
660 delete nt;
661 return;
662 }
663 r_8 xmin, xmax;
664 nt->GetMinMax(0, xmin, xmax);
665 hprof = new HProf(xmin, xmax, 100);
666 int k;
667 float* xn;
668 for(k=0; k<nt->NEntry(); k++) {
669 xn = nt->GetVec(k);
670 hprof->Add(xn[0], xn[1], xn[2]);
671 }
672 delete nt;
673 MyObjMgr()->AddObj(hprof, nomprof);
674}
675hprof->UpdateHisto();
676
677if(!hp_already_exist || dopt.size()>0) MyObjMgr()->DisplayObj(nomprof, dopt);
678return;
679}
680
681
682/* --Methode-- */
683void Services2NObjMgr::FillVect(string& nom, string& expx, string& expv,
684 string& expcut, string& nomvec, string dopt, string loop)
685{
686NObjMgrAdapter* obja=NULL;
687obja = MyObjMgr()->GetObjAdapter(nom);
688if (obja == NULL) {
689 cout << "Services2NObjMgr::FillVect() Error , No such object: " << nom << endl;
690 return;
691 }
692if (!mImgapp) return;
693
694Vector* v1 = NULL;
695AnyDataObj* ov = NULL;
696ov=MyObjMgr()->GetObj(nomvec);
697if (ov != NULL) v1 = dynamic_cast<Vector *>(ov);
698if (v1 == NULL) {
699 cout << "Services2NObjMgr::FillVect() Error , No such object or not a vector: " << nomvec << endl;
700 return;
701 }
702
703char* ntn[2]= {"vi", "vv"};
704NTuple* nt = new NTuple(2,ntn); // Creation NTuple
705
706string expz = "0.";
707ComputeExpressions(obja, expx, expv, expz, expz, expcut, loop, nt);
708
709if (!nt) return;
710if (nt->NEntry() < 1) {
711 cout << "Services2NObjMgr::FillVect() Warning Zero points satisfy cut !" << endl;
712 delete nt;
713 return;
714 }
715
716 int i,k;
717 double* xn;
718 for(k=0; k<nt->NEntry(); k++) {
719 xn = nt->GetLineD(k);
720 i = int(xn[0]+0.5);
721 if ( (i < 0) || i >= v1->NElts() ) continue;
722 (*v1)(i) = xn[1];
723 }
724 delete nt;
725
726
727MyObjMgr()->DisplayObj(nomvec, dopt);
728return;
729}
730
731/* --Methode-- */
732void Services2NObjMgr::FillMatx(string& nom, string& expx, string& expy, string& expv,
733 string& expcut, string& nommtx, string dopt, string loop)
734{
735NObjMgrAdapter* obja=NULL;
736obja = MyObjMgr()->GetObjAdapter(nom);
737if (obja == NULL) {
738 cout << "Services2NObjMgr::FillMatx() Error , No such objet " << nom << endl;
739 return;
740 }
741if (!mImgapp) return;
742
743Matrix* mtx = NULL;
744AnyDataObj* om = NULL;
745om=MyObjMgr()->GetObj(nommtx);
746if (om != NULL) mtx = dynamic_cast<Matrix *>(om);
747if (mtx == NULL) {
748 cout << "Services2NObjMgr::FillMatx() Error , No such object or not a matrix " << nommtx << endl;
749 return;
750 }
751
752char* ntn[3]= {"mi", "mj", "mv"};
753NTuple* nt = new NTuple(3,ntn); // Creation NTuple
754
755string expz = "0.";
756ComputeExpressions(obja, expx, expy, expv, expz, expcut, loop, nt);
757
758if (!nt) return;
759if (nt->NEntry() < 1) {
760 cout << "Services2NObjMgr::FillMatx() Warning Zero points satisfy cut !" << endl;
761 delete nt;
762 return;
763 }
764
765 int ic, jl, k;
766 double* xn;
767 for(k=0; k<nt->NEntry(); k++) {
768 xn = nt->GetLineD(k);
769 ic = int(xn[0]+0.5);
770 jl = int(xn[1]+0.5);
771 if ( (ic < 0) || ic >= mtx->NCol() ) continue;
772 if ( (jl < 0) || jl >= mtx->NRows() ) continue;
773 (*mtx)(jl, ic) = xn[2];
774 }
775 delete nt;
776
777
778MyObjMgr()->DisplayObj(nommtx, dopt);
779return;
780
781}
782
783/* --Methode-- */
784void Services2NObjMgr::ExpressionToVector(string& nom, string& expx, string& expcut,
785 string& nomvec, string dopt, string loop)
786{
787NObjMgrAdapter* obja=NULL;
788obja = MyObjMgr()->GetObjAdapter(nom);
789if (obja == NULL) {
790 cout << "Services2NObjMgr::ExpressionToVector() Error , No such object " << nom << endl;
791 return;
792 }
793if (!mImgapp) return;
794
795NTuple* nt = NULL;
796// if (nomvec.length() < 1) nomvec = "/tmp/expvec";
797
798char* ntn[2]= {"vecval", "vecwt"};
799nt = new NTuple(1,ntn); // Creation NTuple
800
801string expwt = "1.";
802string expz = "0.";
803string dumexpcut = expcut; if(dumexpcut.size()<=0) dumexpcut = "1.";
804ComputeExpressions(obja,expx,expz,expz,expwt,dumexpcut,loop,nt,NULL,NULL);
805
806if (!nt) return;
807if (nt->NEntry() < 1) {
808 cout << "Services2NObjMgr::ExpressionToVector() Warning Zero points satisfy cut !" << endl;
809 delete nt;
810 return;
811 }
812
813Vector* vec = new Vector(nt->NEntry());
814int k;
815float* xn;
816for(k=0; k<nt->NEntry(); k++) {
817 xn = nt->GetVec(k);
818 (*vec)(k) = xn[0];
819 }
820delete nt;
821if (nomvec.size() > 0) {
822 MyObjMgr()->AddObj(vec, nomvec);
823 MyObjMgr()->DisplayObj(nomvec, dopt);
824}
825else {
826// On calcule et on affiche mean/sigma + min/max
827 double min, max, mean, sigma;
828 vec->MinMax(min, max);
829 MathArray<r_8> ma;
830 ma.MeanSigma(*vec, mean, sigma);
831 cout << "Size= " << vec->Size() << " Mean= " << mean << " Sigma= " << sigma
832 << " Min= " << min << " Max= " << max << endl;
833 delete vec;
834}
835return;
836}
837
838/* --Methode-- */
839void Services2NObjMgr::NtFromASCIIFile(string& nom,string& filename,double def_val)
840// Pour remplir un NTuple/DataTable "nom" existant a partir du fichier
841// ASCII table "filename". Si il y a plus de variables dans le
842// ntuple que dans le fichier "filename",
843// les sur-numeraires numeriques sont mises a "def_val" par defaut.
844{
845AnyDataObj* mobj = MyObjMgr()->GetObj(nom);
846if(mobj == NULL) {
847 cout<<"NtFromASCIIFile() Error, object "<<nom<<" not existing"<<endl;
848 return;
849}
850
851NTuple* nt = NULL;
852DataTable* dt = NULL;
853if(typeid(*mobj) == typeid(NTuple)) nt = (NTuple*) mobj;
854else if(typeid(*mobj) == typeid(DataTable)) dt = (DataTable*) mobj;
855
856if(nt==NULL && dt==NULL) {
857 cout<<"NtFromASCIIFile() Error, object "<<nom<<" not an NTuple nor a DataTable"<<endl;
858 return;
859}
860if (!mImgapp) return;
861
862if(nt) nt->FillFromASCIIFile(filename, def_val);
863else if(dt) {
864 ifstream is(filename.c_str());
865 dt->FillFromASCIIFile(is);
866}
867return;
868}
869
870/* --Methode-- */
871void Services2NObjMgr::FillNT(string& nom, string& expx, string& expy, string& expz,
872 string& expt, string& expcut, string& nomnt, string loop)
873{
874NObjMgrAdapter* obja=NULL;
875obja = MyObjMgr()->GetObjAdapter(nom);
876if (obja == NULL) {
877 cout << "Services2NObjMgr::FillNT() Error , No such object " << nom << endl;
878 return;
879 }
880if (!mImgapp) return;
881
882bool fgnnt = false;
883NTuple* nt = NULL;
884AnyDataObj* oh = NULL;
885if (nomnt.length() > 0) oh=MyObjMgr()->GetObj(nomnt);
886else nomnt = "/tmp/fillnt";
887if ( (oh != NULL) && (typeid(*oh) == typeid(NTuple)) ) {
888 nt = (NTuple*)oh;
889 if (nt->NVar() > 10) {
890 cout << "Services2NObjMgr::FillNT() Warning , Max 10 var in NTuple -> new NTuple" << endl;
891 nt = NULL;
892 }
893 }
894if (nt == NULL) {
895 char* ntn[4]= {"x", "y","z","t"};
896 nt = new NTuple(4,ntn); // Creation NTuple
897 fgnnt = true;
898 }
899
900ComputeExpressions(obja, expx, expy, expz, expt, expcut, loop, nt, NULL, NULL);
901
902if (fgnnt) MyObjMgr()->AddObj(nt, nomnt);
903return;
904
905}
906
907/* --Methode-- */
908void Services2NObjMgr::FillNTFrCFile(string & nom, string const & fname,
909 string const & funcname, string & nomnt, string loop)
910{
911if (!mImgapp) return;
912
913NObjMgrAdapter* obja=NULL;
914obja = MyObjMgr()->GetObjAdapter(nom);
915if (obja == NULL) {
916 cout << "Services2NObjMgr::FillNTFrCFile( " << nom << "...) No such object" <<endl;
917 return;
918 }
919bool adel = true;
920NTupleInterface* objnt = obja->GetNTupleInterface(adel);
921if (objnt == NULL) {
922 cout << "Services2NObjMgr::FillNTFrCFile( " << nom << "...) Not an NTupleInterface !" <<endl;
923 return;
924 }
925
926// Pour synchronisation d'execution simultanee
927ZSync zs(mutx_dynlink); zs.NOp();
928
929NTLoopExprFunc f = (NTLoopExprFunc)LinkFunctionFromFile(fname, funcname);
930if (!f) {
931 cerr << "Services2NObjMgr::FillNTFrCFile Error Creation NTLoopExprFunc" << endl;
932 if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
933 return;
934 }
935
936bool fgnnt = false;
937NTuple* nt = NULL;
938if (nomnt.length() > 0) {
939 AnyDataObj* oh = NULL;
940 oh=MyObjMgr()->GetObj(nomnt);
941 if ( (oh != NULL) && (typeid(*oh) == typeid(NTuple)) ) {
942 nt = (NTuple*)oh;
943 if (nt->NVar() > 10) {
944 cout << "Services2NObjMgr::FillNTFrCFile() Warning , Max 10 var in NTuple -> new NTuple" << endl;
945 nt = NULL;
946 }
947 }
948 if (nt == NULL) {
949 char* ntn[4]= {"x", "y","z","t"};
950 nt = new NTuple(4,ntn); // Creation NTuple
951 fgnnt = true;
952 }
953 }
954
955double xnt[10];
956
957int i,k;
958for(i=0; i<10; i++) xnt[i] = 0.;
959
960
961// $CHECK$ A virer des que possible - Pb blocage application quand trop d'impression
962// redirige - On redirige la sortie sur le terminal
963bool red = mImgapp->HasRedirectedStdOutErr();
964mImgapp->RedirectStdOutErr(false);
965
966int_8 k1,k2,dk;
967k1 = 0; k2 = objnt->NbLines(); dk = 1;
968DecodeLoopParameters(loop, k1, k2, dk);
969if (k1 < 0) k1 = 0;
970if (k2 < 0) k2 = objnt->NbLines();
971if (k2 > (int_8)objnt->NbLines()) k2 = objnt->NbLines();
972if (dk <= 0) dk = 1;
973
974try {
975 double* xn;
976 int_8 kstart = k1, kend = k2;
977 for(k=kstart; k<kend; k+=dk) {
978 xn = objnt->GetLineD(k);
979 if (f((int_8_exprf)k, xn, xnt, xnt+1, xnt+2, xnt+3, (int_8_exprf)kstart,(int_8_exprf) kend) != 0) {
980 if (nt) nt->Fill(xnt);
981 }
982 }
983 }
984#ifdef SANS_EVOLPLANCK
985CATCH(merr) {
986 fflush(stdout);
987 cout << endl;
988 cerr << endl;
989 string es = PeidaExc(merr);
990 cerr << "Services2NObjMgr::FillNTFrCFile() Exception :" << merr << es;
991 } ENDTRY;
992#else
993catch ( PException exc ) {
994 fflush(stdout);
995 cout << endl;
996 cerr << endl;
997 cerr << "Services2NObjMgr::FillNTFrCFile() Exception :" << exc.Msg() << endl;
998}
999#endif
1000
1001if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
1002CloseDLL();
1003
1004// $CHECK$ A virer des que possible On redirige la sortie sur la fenetre PIConsole
1005mImgapp->RedirectStdOutErr(red);
1006
1007if (fgnnt) MyObjMgr()->AddObj(nt, nomnt);
1008return;
1009}
1010
1011/* --Methode-- */
1012void Services2NObjMgr::PrepareNTExpressionCFile(string & nom, string const & fname,
1013 string const & funcname)
1014{
1015NObjMgrAdapter* obja=NULL;
1016obja = MyObjMgr()->GetObjAdapter(nom);
1017if (obja == NULL) {
1018 cout << "Services2NObjMgr::PrepareNTExpressionCFile( " << nom << "...) No such object" <<endl;
1019 return;
1020 }
1021bool adel = true;
1022NTupleInterface* objnt = obja->GetNTupleInterface(adel);
1023if (objnt == NULL) {
1024 cout << "Services2NObjMgr::PrepareNTExpressionCFile( " << nom
1025 << "...) No NTupleInterface !" <<endl;
1026 return;
1027 }
1028string vardec = objnt->VarList_C("_xnti_");
1029
1030FILE *fip;
1031if ((fip = fopen(fname.c_str(), "w")) == NULL) {
1032 cout << "Services2NObjMgr::PrepareNTExpressionCFile()_Error: fopen " << fname << endl;
1033 if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
1034 return;
1035 }
1036
1037// constitution du fichier des decalarations des variables de l'interface NTuple
1038fputs("#include <stdlib.h> \n", fip);
1039fputs("#include <stdio.h> \n", fip);
1040fputs("#include <math.h> \n\n", fip);
1041
1042fputs("/* ------ Compare bits on double --------- */ \n", fip);
1043fputs("typedef long long int_8_exprf;\n", fip);
1044fputs("int_8_exprf BitCmp64(double v,int_8_exprf flg)\n", fip);
1045fputs("{return ((int_8_exprf)((v<0.) ? v-0.1 : v+0.1))&flg;}\n", fip);
1046fputs("/* ------ Some random number generators --------- */ \n", fip);
1047fputs("#if defined(__ppc__) && defined(__MACH__) \n",fip);
1048fputs("#include <limits.h> \n", fip);
1049fputs("#define drand48() ((double)(random())/LONG_MAX) \n",fip);
1050fputs("#endif \n",fip);
1051fputs("#define frand01() ( (float) drand48() ) \n", fip);
1052fputs("#define drand01() drand48() \n", fip);
1053fputs("#define rand01() drand48() \n", fip);
1054fputs("#define frandpm1() ( 2. * frand01() - 1.) \n", fip);
1055fputs("#define drandpm1() ( 2. * drand01() - 1.) \n", fip);
1056fputs("#define randpm1() ( 2. * drand01() - 1.) \n", fip);
1057fputs("double NorRand(void) \n", fip);
1058fputs(" { \n double x,A,B; \n LAB10: \n A = drand01(); \n", fip);
1059fputs(" if ( A == 0. ) goto LAB10; \n B = drand01(); \n", fip);
1060fputs(" x = sqrt(-2.*log(A))*cos(2.*M_PI*B); \n", fip);
1061fputs(" return(x); \n } \n", fip);
1062fputs("#define GauRand() NorRand() \n", fip);
1063fputs("#define gaurand() NorRand() \n\n", fip);
1064
1065fputs("/* NTupleInterface Variable declaration - Generated by piapp */\n", fip);
1066fputs("/* -- Services2NObjMgr::PrepareNTExpressionCFile() -- */ \n", fip);
1067fputs("/* _nl line number or sequential index : _nstart <= _nl < _nend */ \n\n", fip);
1068fprintf(fip,"int %s(int_8_exprf _nl, double* _xnti_, double* _rx_, double* _ry_, double* _rz_, \n",
1069 funcname.c_str());
1070fprintf(fip," double* _rt_, int_8_exprf _nstart, int_8_exprf _nend) \n");
1071fprintf(fip, "{ \n %s \n", vardec.c_str());
1072fputs(" if (!1) { /* Cut Expression failed */ \n", fip);
1073fputs(" *_rx_ = *_ry_ = *_rz_ = *_rt_ = 0.; return(0);", fip);
1074fputs(" } \n /* Cut expression satisfied */ \n", fip);
1075fputs(" *_rx_ = 1.; \n *_ry_ = 1.; \n *_rz_ = 1.; \n *_rt_ = 1.; \n", fip);
1076fputs(" return(1); \n} \n", fip);
1077
1078fclose(fip);
1079
1080if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
1081return;
1082}
1083
1084/* --Methode-- cmv 13/10/98 */
1085void Services2NObjMgr::FillGFD(string& nom, string& expx, string& expy, string& expz,
1086 string& experr, string& expcut, string& nomgfd, string loop)
1087// Pour remplir un ``GeneralFitData'' a partir de divers objets:
1088//| nom = nom de l'objet a transcrire selon 1D: Z=f(X) ou 2D: Z=f(X,Y) .
1089//| Vector,Matrix,Histo,HProf,Histo2D,Image<T>,StarList,NTuple,GeneralFitData
1090//| expx = expression X du GeneralFitData (1er abscisse)
1091//| expy = expression Y du GeneralFitData (2sd abscisse si non "", Z=f(X,Y))
1092//| expz = expression Z du GeneralFitData (valeur de l'ordonnee)
1093//| experr = expression de l'erreur sur l'ordonnee Z
1094//| expcut = expression du test de selection
1095//| nomgfd = nom du GeneralFitData engendre (optionnel)
1096{
1097NObjMgrAdapter* obja=NULL;
1098obja = MyObjMgr()->GetObjAdapter(nom);
1099if (obja == NULL) {
1100 cout << "Services2NObjMgr::FillGFD() Error , No such object "<<nom<<endl;
1101 return;
1102 }
1103if(!mImgapp) return;
1104
1105// 2D ou 3D?
1106int nvar = 2;
1107if(expy.length()<=0) {nvar = 1; expy = "0.";}
1108
1109// Creation NTuple Buffer
1110char* ntn[4]= {"x","y","f","e"};
1111NTuple*nt = new NTuple(4,ntn);
1112
1113// Remplissage NTuple buffer
1114ComputeExpressions(obja, expx, expy, expz, experr, expcut, loop, nt, NULL, NULL);
1115if(nt->NEntry() < 1)
1116 {cout<<"Services2NObjMgr::FillGFD() Warning Zero points satisfy cut !"<<endl;
1117 delete nt; return;}
1118
1119//Remplissage de la structure GeneraFitData
1120if (nt->NEntry() <= 0) {
1121 cout<<"Services2NObjMgr::FillGFD() Warning - NData= " << nt->NEntry() << endl;
1122 delete nt;
1123 return;
1124 }
1125
1126GeneralFitData* gfd = new GeneralFitData(nvar,nt->NEntry(),0);
1127int k;
1128float* xn;
1129for(k=0; k<nt->NEntry(); k++) {
1130 xn = nt->GetVec(k);
1131 gfd->AddData(xn,xn[2],xn[3]);
1132}
1133
1134// Menage et table d'objets
1135delete nt;
1136MyObjMgr()->AddObj(gfd, nomgfd);
1137return;
1138}
1139
1140/* --Methode-- cmv 12/07/00 */
1141void Services2NObjMgr::FillGFDfrVec(string nomgfd,string namx,string namy,string namz,string name)
1142// Pour remplir un ``GeneralFitData'' a partir de vecteurs
1143//| gdfrvec nomgd X Y ! !
1144//| gdfrvec nomgd X Y ! EY
1145//| gdfrvec nomgd X Y Z !
1146//| gdfrvec nomgd X Y Z EZ
1147//| - nomgfd = nom du generaldata a remplir
1148//| - namx = nom du vecteur contenant les valeurs X
1149//| - namy = nom du vecteur contenant les valeurs Y
1150//| - namz = nom du vecteur contenant les valeurs Z (ou "!")
1151//| - name = nom du vecteur contenant les valeurs des erreurs EY ou EZ
1152{
1153// Decodage des noms des vecteurs pour le remplissage du generaldata
1154if(nomgfd=="!" || nomgfd.length()<1)
1155 {cout<<"FillGFDfrVec_Error: bad GenaralData name "<<nomgfd<<endl; return;}
1156if(namx=="!" || namx.length()<1)
1157 {cout<<"FillGFDfrVec_Error: bad X vector name "<<namx<<endl; return;}
1158if(namy=="!" || namy.length()<1)
1159 {cout<<"FillGFDfrVec_Error: bad Y vector name "<<namy<<endl; return;}
1160if(namz.length()<1) namz = "!";
1161if(name.length()<1) name = "!";
1162int nvar = 0;
1163if(namz=="!") nvar = 1; else nvar = 2;
1164
1165// Identify data
1166NamedObjMgr omg;
1167AnyDataObj* mobj = NULL;
1168Vector* v;
1169int nel = 0;
1170r_8 *x=NULL, *y=NULL, *z=NULL,* ez=NULL;
1171
1172if( (mobj=omg.GetObj(namx)) == NULL) {
1173 cout<<"FillGFDfrVec_Error: unknown X object "<<namx<<endl; return;
1174} else {
1175 v = (Vector*) mobj; x = v->Data(); nel=v->NElts();
1176}
1177
1178if( (mobj=omg.GetObj(namy)) == NULL) {
1179 cout<<"FillGFDfrVec_Error: unknown Y object "<<namy<<endl; return;
1180} else {
1181 v = (Vector*) mobj; y = z = v->Data(); if(v->NElts()<nel) nel=v->NElts();
1182}
1183
1184if( nvar==2 && (mobj=omg.GetObj(namz)) == NULL) {
1185 cout<<"FillGFDfrVec_Error: unknown Z object "<<namz<<endl; return;
1186} else {
1187 v = (Vector*) mobj; z = v->Data(); if(v->NElts()<nel) nel=v->NElts();
1188}
1189
1190if(name!="!") {
1191 if( (mobj=omg.GetObj(name)) == NULL) {
1192 cout<<"FillGFDfrVec_Error: unknown EZ object "<<name<<endl; return;
1193 } else {
1194 v = (Vector*) mobj; ez = v->Data(); if(v->NElts()<nel) nel=v->NElts();
1195 }
1196}
1197
1198if(nel<=0)
1199 {cout<<"FillGFDfrVec_Error: bad number of elements "<<nel<<endl; return;}
1200
1201// Create GeneralData and fill it with vectors
1202GeneralFitData* gfd = new GeneralFitData(nvar,nel+5,0);
1203if(nvar==1) gfd->SetData1(nel,x,z,ez); // On remplit Y=f(X)
1204else gfd->SetData2(nel,x,y,z,ez); // On remplit Z=f(X,y)
1205
1206// Menage et table d'objets
1207if( omg.GetObj(nomgfd) != NULL ) omg.DelObj(nomgfd);
1208MyObjMgr()->AddObj(gfd,nomgfd);
1209return;
1210}
1211
1212/* --Methode-- */
1213void Services2NObjMgr::ComputeExpressions(NObjMgrAdapter* obja, string& expx,
1214 string& expy, string& expz, string& expt, string& expcut, string& loop,
1215 NTuple* nt, Histo* h1, Histo2D* h2, HProf* hp)
1216{
1217if (obja == NULL) return;
1218bool adel = true;
1219NTupleInterface* objnt = obja->GetNTupleInterface(adel);
1220if (objnt == NULL) return;
1221string vardec = objnt->VarList_C("_zz6qi_");
1222
1223// Pour synchronisation d'execution simultanee
1224ZSync zs(mutx_dynlink); zs.NOp();
1225
1226PlotExprFunc f = LinkExprFunc(vardec, expx, expy, expz, expt, expcut);
1227if (!f) {
1228 cerr << "Services2NObjMgr::::ComputeExpressions() Error Creation PlotExprFunc " << endl;
1229 if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
1230 return;
1231 }
1232
1233double xnt[10];
1234
1235int_8 k;
1236for(k=0; k<10; k++) xnt[k] = 0.;
1237int_8 k1,k2,dk;
1238k1 = 0; k2 = objnt->NbLines(); dk = 1;
1239DecodeLoopParameters(loop, k1, k2, dk);
1240if (k1 < 0) k1 = 0;
1241if (k2 < 0) k2 = objnt->NbLines();
1242if (k2 > (int_8)objnt->NbLines()) k2 = objnt->NbLines();
1243if (dk <= 0) dk = 1;
1244
1245try {
1246 double* xn;
1247 for(k=k1; k<k2; k += dk) {
1248 xn = objnt->GetLineD(k);
1249 if (f((int_8_exprf)k,xn, xnt, xnt+1, xnt+2, xnt+3) != 0) {
1250 if (nt) nt->Fill(xnt);
1251 if (h1) h1->Add(xnt[0], xnt[3]);
1252 if (h2) h2->Add(xnt[0], xnt[1], xnt[3]);
1253 if (hp) hp->Add(xnt[0], xnt[1], xnt[3]);
1254 }
1255 }
1256 }
1257#ifdef SANS_EVOLPLANCK
1258CATCH(merr) {
1259 fflush(stdout);
1260 cout << endl;
1261 cerr << endl;
1262 string es = PeidaExc(merr);
1263 cerr << "Services2NObjMgr::ComputeExpressions() Exception :" << merr << es;
1264 } ENDTRY;
1265#else
1266catch ( PException exc ) {
1267 fflush(stdout);
1268 cout << endl;
1269 cerr << endl;
1270 cerr << "Services2NObjMgr::ComputeExpressions() Exception :" << exc.Msg() << endl;
1271}
1272#endif
1273
1274if (adel) delete objnt; // Delete de l'objet NTupleInterface si necessaire
1275// Fermeture du fichier .so
1276CloseDLL();
1277return;
1278}
1279
1280
1281/* --Methode-- */
1282PlotExprFunc Services2NObjMgr::LinkExprFunc(string& vardec, string& expx, string& expy,
1283 string& expz, string& expt, string& cut)
1284{
1285FILE *fip;
1286string fname = TmpDir + "expf_pia_dl.c";
1287string cmd;
1288int rc;
1289
1290cmd = "rm -f " + fname;
1291rc = system(cmd.c_str());
1292//DBG printf("LinkExprFunc_Do> %s (Rc=%d)\n", cmd.c_str(), rc);
1293
1294if ((fip = fopen(fname.c_str(), "w")) == NULL) {
1295 string sn = fname;
1296 cout << "Services2NObjMgr/LinkExprFunc_Error: fopen( " << sn << endl;
1297 return(NULL);
1298 }
1299
1300// constitution du fichier a compiler
1301fputs("#include <stdlib.h> \n", fip);
1302fputs("#include <math.h> \n", fip);
1303
1304fputs("/* ------ Compare bits on double --------- */ \n", fip);
1305fputs("typedef long long int_8_exprf;\n", fip);
1306fputs("int_8_exprf BitCmp64(double v,int_8_exprf flg)\n", fip);
1307fputs("{return ((int_8_exprf)((v<0.) ? v-0.1 : v+0.1))&flg;}\n", fip);
1308fputs("/* ------ Some random number generators --------- */ \n", fip);
1309fputs("#if defined(__ppc__) && defined(__MACH__) \n",fip);
1310fputs("#include <limits.h> \n", fip);
1311fputs("#define drand48() ((double)(random())/LONG_MAX) \n",fip);
1312fputs("#endif \n",fip);
1313fputs("#define frand01() ( (float) drand48() ) \n", fip);
1314fputs("#define drand01() drand48() \n", fip);
1315fputs("#define rand01() drand48() \n", fip);
1316fputs("#define frandpm1() ( 2. * frand01() - 1.) \n", fip);
1317fputs("#define drandpm1() ( 2. * drand01() - 1.) \n", fip);
1318fputs("#define randpm1() ( 2. * drand01() - 1.) \n", fip);
1319fputs("double NorRand(void) \n", fip);
1320fputs(" { \n double x,A,B; \n LAB10: \n A = drand01(); \n", fip);
1321fputs(" if ( A == 0. ) goto LAB10; \n B = drand01(); \n", fip);
1322fputs(" x = sqrt(-2.*log(A))*cos(2.*M_PI*B); \n", fip);
1323fputs(" return(x); \n } \n", fip);
1324fputs("#define GauRand() NorRand() \n", fip);
1325fputs("#define gaurand() NorRand() \n\n", fip);
1326
1327fputs("int expf_pia_dl_func(int_8_exprf _nl, double* _zz6qi_, double* _rx_6q_, double* _ry_6q_, double* _rz_6q_, double* _rt_6q_) \n{\n", fip);
1328fprintf(fip,"%s \n", vardec.c_str());
1329fprintf(fip, "if (!(%s)) { *_rx_6q_ = *_ry_6q_ = *_rz_6q_ = *_rt_6q_ = 0.; return(0); } \n", cut.c_str());
1330fprintf(fip, "*_rx_6q_ = %s ; \n", expx.c_str());
1331fprintf(fip, "*_ry_6q_ = %s ; \n", expy.c_str());
1332fprintf(fip, "*_rz_6q_ = %s ; \n", expz.c_str());
1333fprintf(fip, "*_rt_6q_ = %s ; \n", expt.c_str());
1334fputs("return(1); \n} \n", fip);
1335fclose(fip);
1336string func = "expf_pia_dl_func";
1337return((PlotExprFunc)LinkFunctionFromFile(fname, func));
1338}
1339
1340
1341/* --Methode-- */
1342DlFunction Services2NObjMgr::LinkFunctionFromFile(string const & fname, string const & funcname)
1343{
1344// Le link dynamique
1345CloseDLL();
1346dynlink = PDynLinkMgr::BuildFromCFile(fname);
1347if (dynlink == NULL) {
1348 cerr << "Services2NObjMgr/LinkFunctionFromFile_Erreur: Erreur creation/Ouverture SO " << endl;
1349 return(NULL);
1350 }
1351
1352DlFunction retfunc = dynlink->GetFunction(funcname);
1353if (retfunc == NULL) {
1354 string sn = funcname;
1355 cerr << "Services2NObjMgr/LinkExprFunc_Erreur: Erreur linking " << sn << endl;
1356 CloseDLL();
1357 return(NULL);
1358 }
1359else return(retfunc);
1360}
1361
1362/* --Methode-- */
1363void Services2NObjMgr::CloseDLL()
1364{
1365if (dynlink) delete dynlink; dynlink = NULL;
1366}
1367
1368/* --Methode-- */
1369int Services2NObjMgr::ExecuteCommand(string line)
1370{
1371 if (mImgapp == NULL) return(99);
1372 return(mImgapp->CmdInterpreter()->Interpret(line));
1373}
1374
1375// Fonction static
1376/* --Methode-- */
1377void Services2NObjMgr::DecodeLoopParameters(string& loop, int_8& i1, int_8& i2, int_8& di)
1378{
1379// Decode des paramatres de boucle for(int i=i1; i<i2; i+=di) specifies
1380// sous forme i1[:i2[:di]]
1381// cout << "LoopParam() " << loop << " I1=" << i1 << " I2=" << i2 << " DI=" << di;
1382size_t l = loop.length();
1383if (l < 1) return;
1384size_t p = loop.find(':');
1385if (p >= l) { i1 = atol(loop.c_str()); return; }
1386i1 = atol(loop.substr(0, p).c_str());
1387string aa = loop.substr(p+1);
1388p = aa.find(':');
1389if (p < aa.length() ) {
1390 i2 = atol(aa.substr(0,p).c_str());
1391 di = atol(aa.substr(p+1).c_str());
1392 }
1393else i2 = atol(aa.c_str());
1394// cout << "-> I1= " << i1 << " I2= " << i2 << " DI= " << di << endl;
1395return;
1396}
1397
1398/* --Methode-- */
1399string Services2NObjMgr::FileName2Name(string const & fn)
1400{
1401
1402char fsep[2] = {FILESEP, '\0'};
1403char tsep[2] = {'.', '\0'};
1404size_t p = fn.find_last_of(fsep);
1405size_t l = fn.length();
1406if (p >= l) p = 0;
1407else p++;
1408size_t q = fn.find_first_of(tsep,p);
1409if (q < p) q = l;
1410return(fn.substr(p,q-p));
1411}
1412
1413
1414
1415
1416// SANS_EVOLPLANCK Attention !
1417#ifdef SANS_EVOLPLANCK
1418#include "pclassids.h"
1419
1420/* --Methode-- */
1421char* Services2NObjMgr::PClassIdToClassName(int cid)
1422{
1423switch (cid) {
1424 case ClassId_Poly1 :
1425 return("Poly1");
1426 case ClassId_Poly2 :
1427 return("Poly2");
1428 case ClassId_Matrix :
1429 return("Matrix");
1430 case ClassId_Vector :
1431 return("Vector");
1432
1433 case ClassId_DVList :
1434 return("DVList");
1435
1436 case ClassId_Histo1D :
1437 return("Histo1D");
1438 case ClassId_Histo2D :
1439 return("Histo2D");
1440 case ClassId_HProf :
1441 return("HProf");
1442 case ClassId_HistoErr :
1443 return("HistoErr");
1444 case ClassId_NTuple :
1445 return("NTuple");
1446 case ClassId_XNTuple :
1447 return("XNTuple");
1448 case ClassId_GeneralFitData :
1449 return("GeneralFitData");
1450
1451 case ClassId_Image :
1452 return("RzImage");
1453 case ClassId_Image + kuint_1 :
1454 return("ImageU1");
1455 case ClassId_Image + kint_1 :
1456 return("ImageI1");
1457 case ClassId_Image + kuint_2 :
1458 return("ImageU2");
1459 case ClassId_Image + kint_2 :
1460 return("ImageI2");
1461 case ClassId_Image + kuint_4 :
1462 return("ImageU4");
1463 case ClassId_Image + kint_4 :
1464 return("ImageI4");
1465 case ClassId_Image + kr_4 :
1466 return("ImageR4");
1467 case ClassId_Image + kr_8 :
1468 return("ImageR8");
1469 case ClassId_ZFidu :
1470 return("ZFidu");
1471
1472 case ClassId_StarList :
1473 return("StarList");
1474 case ClassId_Transfo :
1475 return("Transfo");
1476 case ClassId_PSF :
1477 return("PSF");
1478
1479
1480// - Ajout objet PPF
1481 default:
1482 return("AnyDataObj");
1483 }
1484}
1485
1486#else
1487char* Services2NObjMgr::PClassIdToClassName(int cid)
1488{
1489 return("AnyDataObj");
1490}
1491#endif
Note: See TracBrowser for help on using the repository browser.