source: Sophya/trunk/SophyaPI/PIext/pawexecut.cc@ 1451

Last change on this file since 1451 was 1268, checked in by ercodmgr, 25 years ago

3ieme argument string& toks pour Execute et ExecuteCommand
preparation gestion TmpDir dans cxxexecutor
suppression de ExecuteCXX ds cxxexecutor et appels
possibilite d'ajouter des userfct.cc ds cxxexecutor

cmv 1/11/00

File size: 51.0 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <ctype.h>
4#include <iostream.h>
5#include <typeinfo>
6
7#include "strutil.h"
8#include "histos.h"
9#include "histos2.h"
10#include "hisprof.h"
11#include "ntuple.h"
12
13#include "pawexecut.h"
14#include "nobjmgr.h"
15#include "servnobjm.h"
16#include "nomgadapter.h"
17#include "pistdimgapp.h"
18
19#ifdef SANS_EVOLPLANCK
20#include "cvector.h"
21#include "matrix.h"
22#else
23#include "tmatrix.h"
24#include "tvector.h"
25#endif
26
27/* Reza + cmv 13/10/99 */
28
29uint_4 PAWExecutor::autoc_counter_ = 0;
30
31/* methode */
32PAWExecutor::PAWExecutor(PIACmd *piac, PIStdImgApp* app)
33: mApp(app)
34{
35string kw, usage;
36string hgrp = "pawCmd";
37
38kw = "reset";
39usage = "Reset histograms vectors or matrix";
40usage += "\n reset nameobj";
41piac->RegisterCommand(kw,usage,this,hgrp);
42
43kw = "n/plot";
44usage = "Plot NTuple variables a la paw";
45usage += "\n n/plot nameobj.x_exp [cut] [w_exp] [loop] [gratt]";
46usage += "\n n/plot nameobj.y_exp%x_exp [cut] [loop] [gratt]";
47usage += "\n n/plot nameobj.z_exp%y_exp%x_exp [cut] [loop] [gratt]";
48usage += "\n for default use ! , loop=i1[:i2[:di]]";
49usage += "\n Related commands: plot2dw plot3d";
50piac->RegisterCommand(kw,usage,this,hgrp);
51
52kw = "n/proj";
53usage = "Project NTuple in histogram (1D or 2D) a la paw";
54usage += "\n n/proj nameproj nameobj.x_exp [cut] [w_exp] [loop] [gratt]";
55usage += "\n n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [loop] [gratt]";
56usage += "\n for default use ! , loop=i1[:i2[:di]]";
57usage += "\n Related commands: projh1d projh2d projprof";
58piac->RegisterCommand(kw,usage,this,hgrp);
59
60kw = "n/scan";
61usage = "Scan NTuple a la paw";
62usage += "\n n/scan nameobj[.exp1%exp2%exp3] cut loop";
63usage += "\n [-f:filename] [list_of_variables]";
64usage += "\n loop : iev1[:iev2[:diev]] or !";
65usage += "\n cut : cut expression or 1. or !";
66usage += "\n list_of_variables : default is all variables";
67usage += "\n : var1 var2 var3 ... varn";
68usage += "\n : var1 : var2 (from var1 to var2)";
69usage += "\n : : var2 (from first variable to var2)";
70usage += "\n : var1 : (from var1 to last variable)";
71usage += "\n ex: \"v1 : v3 v7 v4 : v6 v2 v9 :\"";
72usage += "\n exp1%exp2%exp3 :";
73usage += "\n if given add exp1,exp2,exp3 to the variable list";
74usage += "\n -f:filename : write into \"filename\", Default is to stdout";
75piac->RegisterCommand(kw,usage,this,hgrp);
76
77kw = "h/integ";
78usage = "Integrate a 1D histogram";
79usage += "\n h/integ nameh1d [norm]";
80usage += "\n Related commands: h/deriv";
81piac->RegisterCommand(kw,usage,this,hgrp);
82
83kw = "h/deriv";
84usage = "Derivate a 1D histogram";
85usage += "\n h/deriv nameh1d";
86usage += "\n Related commands: h/integ";
87piac->RegisterCommand(kw,usage,this,hgrp);
88
89kw = "h/rebin";
90usage = "Rebin a 1D histogram or profile";
91usage += "\n h/rebin nameh1d nbin";
92piac->RegisterCommand(kw,usage,this,hgrp);
93
94kw = "h/cadd";
95usage = "Add a constant to an histogram, a vector or a matrix";
96usage += "\n h/cadd namehisto val";
97usage += "\n Related commands: h/cmult h/oper";
98piac->RegisterCommand(kw,usage,this,hgrp);
99
100kw = "h/cmult";
101usage = "Multiply an histogram, a vector or a matrix by a constant";
102usage += "\n h/cmult namehisto val";
103usage += "\n Related commands: h/cadd h/oper";
104piac->RegisterCommand(kw,usage,this,hgrp);
105
106kw = "h/oper";
107usage = "Operation on histograms vectors or matrices";
108usage += "\n h/oper @ h1 h2 hres";
109usage += "\n hres = h1 @ h2 with @ = (+,-,*,/)";
110usage += "\n For vectors and matrices, operations are elements by elements";
111usage += "\n Related commands: h/cadd h/cmult";
112piac->RegisterCommand(kw,usage,this,hgrp);
113
114kw = "h/plot/2d";
115usage = "Specific plot for 2D histogrammes";
116usage += "\n h/plot/2d nameh2d show : infos on 2D histogramme";
117usage += "\n h/plot/2d nameh2d h [dopt] : plot 2D histogramme";
118usage += "\n h/plot/2d nameh2d px [dopt] : plot X projection";
119usage += "\n h/plot/2d nameh2d py [dopt] : plot Y projection";
120usage += "\n h/plot/2d nameh2d bx n [dopt] : plot X band number n";
121usage += "\n h/plot/2d nameh2d by n [dopt] : plot Y band number n";
122usage += "\n h/plot/2d nameh2d sx n [dopt] : plot X slice number n";
123usage += "\n h/plot/2d nameh2d sy n [dopt] : plot Y slice number n";
124usage += "\n n < 0 means Show Info";
125piac->RegisterCommand(kw,usage,this,hgrp);
126
127kw = "h/put_vec";
128usage = "Put content of vector (matrix) into content of histogram 1D or 2D";
129usage += "\n h/put_vec nameh1d namevector [cont,err2]";
130usage += "\n h/put_vec nameh2d namematrix [cont,err2]";
131usage += "\n cont : put into histogramme content";
132usage += "\n err2 : put into histogramme error^2";
133usage += "\n Related commands: h/get_vec";
134piac->RegisterCommand(kw,usage,this,hgrp);
135
136kw = "h/get_vec";
137usage = "Get content of histogram 1D profile or 2D into vector (matrix)";
138usage += "\n h/get_vec nameh1d namevector [cont,err2,absc] [proj]";
139usage += "\n h/get_vec nameh2d namematrix [cont,err2,absc]";
140usage += "\n cont : get histogramme content";
141usage += "\n err2 : get histogramme error^2";
142usage += "\n absc : get histogramme low bin abscissa (1D only)";
143usage += "\n proj :";
144usage += "\n show : show available projections for Histo2D";
145usage += "\n px : get X projection";
146usage += "\n py : get Y projection";
147usage += "\n bx n : get X band number n";
148usage += "\n by n : get Y band number n";
149usage += "\n sx n : get X slice number n";
150usage += "\n sy n : get Y slice number n";
151usage += "\n Related commands: h/put_vec";
152piac->RegisterCommand(kw,usage,this,hgrp);
153
154kw = "h/copy";
155usage = "Copy content of object1 into object2";
156usage += "\n objects are Vector,Matrix,Histo,Histo2D";
157usage += "\n h/copy namefrom nametocopy [i1[:i2]] [j1[:j2]] [ic1[:jc1]]";
158usage += "\n copy obj1Dfrom(i1->i2) into obj1Dto(ic1->)";
159usage += "\n copy obj2Dfrom(i1,j1->i2,j2) into obj2Dto(ic1,jc1->)";
160usage += "\n Warning: elements from i1 to i2 included are copied";
161usage += "\n If obj1Dto does not exist, is is created with size i2-i1+1";
162usage += "\n or obj2Dto with size i2-i1+1,j2-j1+1";
163usage += "\n The adressed content of obj?Dfrom is overwritten";
164usage += "\n The non-adressed content of obj?Dfrom is left unchanged";
165usage += "\n Related commands: copy";
166piac->RegisterCommand(kw,usage,this,hgrp);
167
168kw = "h/set/err";
169usage = "Set Histo,Histo2D errors for range of bins or range of values";
170usage += "\n h/set/err namehisto setvalue i1[:i2] [j1[:j2]]";
171usage += "\n set error to setvalue for bin range i1:i2 j1:j2";
172usage += "\n h/set/err namehisto setvalue v v1:v2";
173usage += "\n set error to setvalue for content values range v1:v2";
174usage += "\n h/set/err namehisto setvalue e e1:e2";
175usage += "\n set error to setvalue for error values range v1:v2";
176usage += "\n Related commands: h/set/cont";
177piac->RegisterCommand(kw,usage,this,hgrp);
178
179kw = "h/set/cont";
180usage = "Set Histo,Histo2D content for range of bins or range of values";
181usage += "\n h/set/cont namehisto setvalue i1[:i2] [j1[:j2]]";
182usage += "\n set content to setvalue for bin range i1:i2 j1:j2";
183usage += "\n h/set/cont namehisto setvalue v v1:v2";
184usage += "\n set content to setvalue for content values range v1:v2";
185usage += "\n h/set/cont namehisto setvalue e e1:e2";
186usage += "\n set content to setvalue for error values range v1:v2";
187usage += "\n Related commands: h/set/err";
188piac->RegisterCommand(kw,usage,this,hgrp);
189
190kw = "h/err";
191usage = "Set Histo,Histo2D error to function of bin content value";
192usage += "\n h/err namehisto expr_func";
193usage += "\n Related commands: h/set/err";
194piac->RegisterCommand(kw,usage,this,hgrp);
195
196}
197
198/* methode */
199PAWExecutor::~PAWExecutor()
200{
201}
202
203/* methode */
204int PAWExecutor::Execute(string& kw, vector<string>& tokens, string& toks)
205{
206if(kw == "reset") {
207 reset(tokens); return(0);
208} else if(kw == "n/plot") {
209 n_plot(tokens); return(0);
210} else if(kw == "n/proj") {
211 n_proj(tokens); return(0);
212} else if(kw == "n/scan") {
213 n_scan(tokens); return(0);
214} else if(kw == "h/integ") {
215 h_integ(tokens); return(0);
216} else if(kw == "h/deriv") {
217 h_deriv(tokens); return(0);
218} else if(kw == "h/rebin") {
219 h_rebin(tokens); return(0);
220} else if(kw == "h/cadd") {
221 h_cadd(tokens); return(0);
222} else if(kw == "h/cmult") {
223 h_cmult(tokens); return(0);
224} else if(kw == "h/oper") {
225 h_oper(tokens); return(0);
226} else if(kw == "h/plot/2d") {
227 h_plot_2d(tokens); return(0);
228} else if(kw == "h/put_vec") {
229 h_put_vec(tokens); return(0);
230} else if(kw == "h/get_vec") {
231 h_get_vec(tokens); return(0);
232} else if(kw == "h/copy") {
233 h_copy(tokens); return(0);
234} else if(kw == "h/set/err") {
235 string dum = "err";
236 h_set(dum,tokens); return(0);
237} else if(kw == "h/set/cont") {
238 string dum = "cont";
239 h_set(dum,tokens); return(0);
240} else if(kw == "h/err") {
241 h_err(tokens); return(0);
242} else return(1);
243}
244
245/* methode */
246void PAWExecutor::reset(vector<string>& tokens)
247// Reset d'histogrammes, vecteurs et matrices
248{
249if(tokens.size() < 1)
250 {cout<<"Usage: reset nameobj"<<endl; return;}
251NamedObjMgr omg;
252AnyDataObj* mobj = omg.GetObj(tokens[0]);
253if(mobj == NULL)
254 {cout<<"PAWExecutor::reset Error , Pas d'objet de nom "<<tokens[0]<<endl;
255 return;}
256string ctyp = typeid(*mobj).name();
257
258#ifdef SANS_EVOLPLANCK
259if(typeid(*mobj)==typeid(Vector)) {Vector* ob=(Vector*) mobj; ob->Zero();}
260else if(typeid(*mobj)==typeid(Matrix)) {Matrix* ob=(Matrix*) mobj; ob->Zero();}
261#else
262 if(typeid(*mobj)==typeid(Vector)) {Vector* ob=(Vector*) mobj; (*ob) = 0.; }
263// ob->DataBlock().Reset(0.);}
264 else if(typeid(*mobj)==typeid(Matrix)) {Matrix* ob=(Matrix*) mobj; (*ob) = 0.; }
265//ob->DataBlock().Reset(0.);}
266#endif
267else if(typeid(*mobj)==typeid(Histo)) {Histo* ob=(Histo*) mobj; ob->Zero();}
268else if(typeid(*mobj)==typeid(HProf)) {HProf* ob=(HProf*) mobj; ob->Zero();}
269else if(typeid(*mobj)==typeid(Histo2D)) {Histo2D* ob=(Histo2D*)mobj; ob->Zero();}
270else {
271 cout<<"PAWExecutor::reset Error , No reset possible on "<<ctyp<<endl;
272 return;
273}
274
275return;
276}
277
278/* methode */
279void PAWExecutor::n_plot(vector<string>& tokens)
280// Equivalent n/plot de paw
281// Plot 1D
282// n/plot nameobj.x_exp [cut] [w_exp] [gratt]
283// Plot 2D (plot2dw)
284// n/plot nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
285// Plot 3D (plot3d)
286// n/plot nameobj.z_exp%y_exp%x_exp [cut] [gratt]
287{
288if(tokens.size() < 1) {
289 cout
290 <<"Usage: n/plot nameobj.x_exp [cut] [w_exp] [loop] [gratt] [nomh1]"<<endl
291 <<" n/plot nameobj.y_exp%x_exp [cut] [loop] [gratt]"<<endl
292 <<" n/plot nameobj.z_exp%y_exp%x_exp [cut] [loop] [gratt]"<<endl
293 <<" for default use ! , loop=i1[:i2[:di]]"<<endl;
294 return;
295}
296string nameobj,expx,expy,expz;
297int_4 nvar = decodepawstring(tokens[0],nameobj,expx,expy,expz);
298string expcut = "1"; string expwt = "1."; string loop = "";
299string dopt = ""; string nameproj="";
300if(tokens.size()>=2) expcut = tokens[1]; if(expcut=="!") expcut="1";
301
302NamedObjMgr omg;
303Services2NObjMgr* srvo = omg.GetServiceObj();
304
305if(nvar<=0) {
306 cout<<"PAWExecutor::n_plot Error: bad coding "<<tokens[0]<<endl;
307} else if(nvar==1) { // c'est un plot 1D
308 if(tokens.size()>=3) expwt = tokens[2]; if(expwt=="!") expwt="1.";
309 if(tokens.size()>=4) loop = tokens[3]; if(loop=="!") loop="";
310 if(tokens.size()>=5) dopt = tokens[4]; if(dopt=="!") dopt="";
311 if(tokens.size()>=6) nameproj = tokens[5];
312 if(nameproj.length()<=0 || nameproj=="!") {
313 nameproj = "/autoc/paw_n_plot1D_";
314 AnyDataObj* mobj = omg.GetObj(nameproj);
315 if(mobj!=NULL) {
316 char buff[16]; autoc_counter_++; sprintf(buff,"%d",autoc_counter_);
317 nameproj += buff;
318 }
319 }
320 srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
321} else if(nvar==2) { // c'est un plot 2D
322 if(tokens.size()>=3) loop = tokens[2]; if(loop=="!") loop="";
323 if(tokens.size()>=4) dopt = tokens[3];
324 string err = "";
325 srvo->DisplayPoints2D(nameobj,expx,expy,err,err,expcut,dopt,loop);
326} else { // c'est un plot 3D
327 if(tokens.size()>=3) loop = tokens[2]; if(loop=="!") loop="";
328 if(tokens.size()>=4) dopt = tokens[3];
329 srvo->DisplayPoints3D(nameobj,expx,expy,expz,expcut,dopt,loop);
330}
331
332return;
333}
334
335/* methode */
336void PAWExecutor::n_proj(vector<string>& tokens)
337// Equivalent n/proj de paw
338// Project NTuple in histogram a la paw
339// Dans un Histo 1D
340// n/proj nameproj nameobj.x_exp [cut] [w_exp] [gratt]
341// Dans un Histo 2D ou un HProf (dans ce cas nameproj doit etre cree).
342// n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
343{
344if(tokens.size()<2)
345 {cout<<"Usage: n/proj nameproj nameobj.[y_exp%]x_exp [cut] [w_exp] [loop] [gratt]"<<endl
346 <<" for default use ! , loop=i1[:i2[:di]]"<<endl; return;}
347string nameproj = tokens[0];
348string nameobj,expx,expy,expz;
349int_4 nvar = decodepawstring(tokens[1],nameobj,expx,expy,expz);
350string expcut = "1"; string expwt = "1."; string loop = ""; string dopt = "";
351if(tokens.size()>=3) expcut = tokens[2]; if(expcut=="!") expcut="1";
352if(tokens.size()>=4) expwt = tokens[3]; if(expwt=="!") expwt="1.";
353if(tokens.size()>=5) loop = tokens[4]; if(loop=="!") loop="";
354if(tokens.size()>=6) dopt = tokens[5];
355
356NamedObjMgr omg;
357Services2NObjMgr* srvo = omg.GetServiceObj();
358
359if(nvar==1) {
360 // c'est une projection dans un histo 1D
361 srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
362} else if(nvar==2) {
363 // c'est une projection dans un histo2D
364 // OU un HProf si nameproj est un HProf un deja defini
365 AnyDataObj* mobj = omg.GetObj(nameproj);
366 if(mobj==NULL)
367 srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
368 else if(dynamic_cast<HProf*>(mobj))
369 srvo->ProjectHProf(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
370 else
371 srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
372} else {
373 cout<<"PAWExecutor::n_proj Error: bad coding "<<tokens[1]<<" nvar="<<nvar<<endl;
374}
375
376return;
377}
378
379/* methode */
380void PAWExecutor::n_scan(vector<string>& tokens)
381{
382if(tokens.size()<3)
383 {cerr<<"Usage: n/scan nameobj[.exp1%exp2%exp3] cut loop\n"
384 <<" [-f:filename] [list_of_variables]"<<endl; return;}
385
386// decodage des premiers arguments
387string nameobj,expr[4];
388int_4 nexpr = decodepawstring(tokens[0],nameobj,expr[0],expr[1],expr[2]);
389if(nexpr<4) {for(int_4 i=nexpr;i<4;i++) expr[i]="1.";}
390string expcut = tokens[1]; if(expcut=="!") expcut="1";
391string loop = tokens[2]; if(loop=="!") loop="";
392FILE* fout = NULL;
393uint_4 ldebvar = 3;
394if(tokens.size()>3) {
395 if(tokens[3].find("-f:") == 0) {
396 string filename = tokens[3].substr(3);
397 if(filename.size()>0) {
398 fout = fopen(filename.c_str(),"w");
399 if(fout==NULL)
400 {cerr<<"PAWExecutor::n_scan Error, file "<<filename
401 <<" not opened"<<endl; return;}
402 }
403 ldebvar++;
404 }
405}
406
407// ntuple adaptateur
408NamedObjMgr omg;
409Services2NObjMgr& srvo = *omg.GetServiceObj();
410NObjMgrAdapter* obja = omg.GetObjAdapter(nameobj); // Ne pas deleter
411if(obja == NULL)
412 {cerr<<"PAWExecutor::n_scan Error, ObjAdapter==NULL for "
413 <<nameobj<<endl; return;}
414bool adel = true;
415NTupleInterface* objnt = obja->GetNTupleInterface(adel);
416if(objnt == NULL)
417 {cerr<<"PAWExecutor::n_scan Error, NTupleInterface==NULL for "
418 <<nameobj<<endl; return;}
419
420// function pour le choix
421string vardec = objnt->VarList_C("_zz6qi_");
422PlotExprFunc f = srvo.LinkExprFunc(vardec,expr[0],expr[1],expr[2],expr[3],expcut);
423if(!f)
424 {cerr<<"PAWExecutor::n_scan Error, Creation PlotExprFunc"<<endl;
425 if(adel) delete objnt; if(fout) fclose(fout); return;}
426
427// variables a imprimer
428// "rien" --> de 0 a ncol-1 (toutes les variables)
429// : v1 --> de 0 a v1
430// v1 : --> de v1 a ncol-1
431// v1 : v2 --> de v1 a v2 (si v2 apres v1)
432// v1 et v2 (si v2 avant v1)
433// v1 v2 v3 v4 --> v1 v2 v3 v4 (ordre indifferent)
434// et toute combinaison : "v1 : v3 v7 v4 : v6 v2 v9 :"
435// --> v1 v2 v3 v7 v4 v5 v6 v2 v9 v10...v(ncol-1)
436int_4 ncol = objnt->NbColumns();
437if(ncol<=0)
438 {cerr<<"PAWExecutor::n_scan Error, no columns for NTuple"<<endl;
439 return;}
440vector<int_4> varnum;
441if(ldebvar>=tokens.size()) { // Toutes les variables
442 for(int_4 i=0;i<ncol;i++) varnum.push_back(i);
443} else { // Choix de certaines variables
444 int_4 k,klast,kk; bool frlast=false;
445 if(tokens[ldebvar]==":") {varnum.push_back(0); frlast=true;}
446 else {k = objnt->ColumnIndex(tokens[ldebvar]); varnum.push_back(k);}
447 ldebvar++;
448 if(ldebvar<tokens.size()) for(uint_4 i=ldebvar;i<tokens.size();i++) {
449 if(tokens[i]!=":") { // pas un separateur
450 k = klast = objnt->ColumnIndex(tokens[i]);
451 if(frlast) klast = varnum[varnum.size()-1] + 1;
452 if(klast>k) klast=k;
453 for(kk=klast;kk<=k;kk++) varnum.push_back(kk);
454 frlast=false;
455 } else if(i==tokens.size()-1) { // separateur a la fin
456 k = ncol-1;
457 klast = varnum[varnum.size()-1] + 1;
458 if(klast>k) klast=k;
459 for(kk=klast;kk<=k;kk++) varnum.push_back(kk);
460 } else frlast=true; // separateur pas a la fin
461 }
462}
463
464vector<string> varname;
465if(varnum.size()>0) for(int_4 i=0;i<(int)varnum.size();i++) {
466 if(varnum[i]<0 || varnum[i]>=ncol)
467 {cerr<<"PAWExecutor::n_scan Error, bad variable name at pos "
468 <<i<<endl; if(adel) delete objnt; if(fout) fclose(fout); return;}
469 string dum = objnt->ColumnName(varnum[i]);
470 varname.push_back(dum);
471}
472
473// evenements a utiliser
474int_4 k1=0, k2=objnt->NbLines(), dk=1;
475srvo.DecodeLoopParameters(loop,k1,k2,dk);
476if (k1<0) k1=0;
477if (k2<0) k2=objnt->NbLines();
478if (k2>(int)objnt->NbLines()) k2=objnt->NbLines();
479if (dk<=0) dk=1;
480
481// boucle sur les evenements et print
482try {
483 int_4 i;
484 if(fout) fprintf(fout,"#ev "); else printf("#ev ");
485 for(i=0;i<(int)varname.size();i++)
486 if(fout) fprintf(fout,"%s ",varname[i].c_str());
487 else printf( "%s ",varname[i].c_str());
488 if(nexpr>0) for(i=0;i<nexpr;i++)
489 if(fout) fprintf(fout,"%s ",expr[i].c_str());
490 else printf( "%s ",expr[i].c_str());
491 if(fout) fprintf(fout,"\n"); else printf("\n");
492
493 double xnt[5]={0,0,0,0,0};
494 double* xn;
495 for(int_4 k=k1; k<k2; k += dk) {
496 xn = objnt->GetLineD(k);
497 if(f(xn,xnt,xnt+1,xnt+2,xnt+3) != 0) {
498 if(fout) fprintf(fout,"%d ",k); else printf("%d ",k);
499 for(i=0;i<(int)varnum.size();i++) {
500 if(fout) fprintf(fout,"%g ",*(xn+varnum[i]));
501 else printf( "%g ",*(xn+varnum[i]));
502 }
503 if(nexpr>0) for(i=0;i<nexpr;i++) {
504 if(fout) fprintf(fout,"%g ",*(xnt+i));
505 else printf( "%g ",*(xnt+i));
506 }
507 if(fout) fprintf(fout,"\n"); else printf("\n");
508 }
509 }
510} // fin du try
511#ifdef SANS_EVOLPLANCK
512CATCH(merr) {
513 fflush(stdout); cout<<endl; cerr<<endl;
514 string es = PeidaExc(merr);
515 cerr<<"Services2NObjMgr::ComputeExpressions() Exception :"<<merr<<es;
516} ENDTRY;
517#else
518catch ( PException exc ) {
519 fflush(stdout); cout<<endl; cerr<<endl;
520 cerr<<"Services2NObjMgr::ComputeExpressions() Exception :"<<exc.Msg()<<endl;
521}
522#endif
523
524if(adel) delete objnt;
525if(fout) fclose(fout);
526srvo.CloseDLL(); // Fermeture du fichier .so
527return;
528}
529
530/* methode */
531void PAWExecutor::h_integ(vector<string>& tokens)
532// Pour remplacer le contenu d'un histo 1D par son integrale
533{
534if(tokens.size()<1)
535 {cout<<"Usage: h/integ nameh1d [norm]"<<endl; return;}
536NamedObjMgr omg;
537AnyDataObj* mobj = omg.GetObj(tokens[0]);
538if(mobj==NULL)
539 {cout<<"PAWExecutor::h_integ Error: unknow object"<<tokens[0]<<endl;
540 return;}
541r_8 norm = 1.;
542if(tokens.size()>=2) norm = atof(tokens[1].c_str());
543// attention: dynamic_cast<Histo*>(HProf)=Vrai!
544Histo* h1 = dynamic_cast<Histo*>(mobj);
545HProf* hp = dynamic_cast<HProf*>(mobj);
546if(hp || !h1)
547 {cout<<"PAWExecutor::h_integ Error: "<<tokens[0]<<" not an Histo"<<endl;
548 return;}
549h1->HInteg(norm);
550}
551
552/* methode */
553void PAWExecutor::h_deriv(vector<string>& tokens)
554// Pour remplacer le contenu d'un histo 1D par sa derivee
555{
556if(tokens.size()<1)
557 {cout<<"Usage: h/deriv nameh1d"<<endl; return;}
558NamedObjMgr omg;
559AnyDataObj* mobj = omg.GetObj(tokens[0]);
560if(mobj==NULL)
561 {cout<<"PAWExecutor::h_deriv Error: unknow object"<<tokens[0]<<endl;
562 return;}
563// attention: dynamic_cast<Histo*>(HProf)=Vrai!
564Histo* h1 = dynamic_cast<Histo*>(mobj);
565HProf* hp = dynamic_cast<HProf*>(mobj);
566if(hp || !h1)
567 {cout<<"PAWExecutor::h_deriv Error: "<<tokens[0]<<" not an Histo"<<endl;
568 return;}
569h1->HDeriv();
570}
571
572/* methode */
573void PAWExecutor::h_rebin(vector<string>& tokens)
574// Pour re-binner un histogramme 1D
575{
576if(tokens.size()<2)
577 {cout<<"Usage: h/rebin nameh1d nbin"<<endl; return;}
578NamedObjMgr omg;
579AnyDataObj* mobj = omg.GetObj(tokens[0]);
580if(mobj==NULL)
581 {cout<<"PAWExecutor::h_rebin Error: unknow object"<<tokens[0]<<endl;
582 return;}
583int_4 nbin = atoi(tokens[1].c_str());
584Histo* h1 = dynamic_cast<Histo*>(mobj);
585// Ca marche aussi pour les HProf, HRebin a ete passe virtuel
586//HProf* hp = dynamic_cast<HProf*>(mobj); if(hp || !h1)
587if(!h1)
588 {cout<<"PAWExecutor::h_rebin Error: "<<tokens[0]<<" not an Histo/HProf"<<endl;
589 return;}
590h1->HRebin(nbin);
591}
592
593/* methode */
594void PAWExecutor::h_cadd(vector<string>& tokens)
595// Additionne une constante a un histogramme
596{
597if(tokens.size()<2)
598 {cout<<"Usage: h/cadd nameh1d val"<<endl; return;}
599NamedObjMgr omg;
600AnyDataObj* mobj = omg.GetObj(tokens[0]);
601if(mobj==NULL)
602 {cout<<"PAWExecutor::h_cadd Error: unknow object"<<tokens[0]<<endl;
603 return;}
604r_8 val = atof(tokens[1].c_str());
605Histo* h1 = dynamic_cast<Histo*>(mobj);
606HProf* hp = dynamic_cast<HProf*>(mobj);
607Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
608Vector* v = dynamic_cast<Vector*>(mobj);
609Matrix* m = dynamic_cast<Matrix*>(mobj);
610if(h1 && !hp) *h1 += val;
611else if(h2) *h2 += val;
612else if(v) *v += val;
613else if(m) *m += val;
614else cout<<"PAWExecutor::h_cadd Error: not implemented for "<<typeid(*mobj).name()<<endl;
615}
616
617/* methode */
618void PAWExecutor::h_cmult(vector<string>& tokens)
619// Multiplie un histogramme par une constante
620{
621if(tokens.size()<2)
622 {cout<<"Usage: h/cmult nameh1d val"<<endl; return;}
623NamedObjMgr omg;
624AnyDataObj* mobj = omg.GetObj(tokens[0]);
625if(mobj==NULL)
626 {cout<<"PAWExecutor::h_cmult Error: unknow object"<<tokens[0]<<endl;
627 return;}
628r_8 val = atof(tokens[1].c_str());
629Histo* h1 = dynamic_cast<Histo*>(mobj);
630HProf* hp = dynamic_cast<HProf*>(mobj);
631Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
632Vector* v = dynamic_cast<Vector*>(mobj);
633Matrix* m = dynamic_cast<Matrix*>(mobj);
634if(h1 && !hp) *h1 *= val;
635else if(h2) *h2 *= val;
636else if(v) *v += val;
637else if(m) *m += val;
638else cout<<"PAWExecutor::h_mult Error: not implemented for "<<typeid(*mobj).name()<<endl;
639}
640
641/* methode */
642void PAWExecutor::h_oper(vector<string>& tokens)
643// Equivalent h/oper/add sub,mul,div de paw
644// Operation entre 2 histogrammes ou 2 vecteurs ou 2 matrices
645// h/oper @ h1 h2 hres
646// hres = h1 @ h2 with @ = (+,-,*,/)
647// Pour les vecteurs et les matrices, il sagit d'operations elements a elements
648{
649if(tokens.size()<4)
650 {cout<<"Usage: n/oper @ h1 h2 hres with @=(+,-,*,/,@)"<<endl;
651 return;}
652
653// Decode arguments
654const char * oper = tokens[0].c_str();
655if( oper[0]!='+' && oper[0]!='-' && oper[0]!='*' && oper[0]!='/' )
656 {cout<<"PAWExecutor::h_oper Error: unknow operation "<<oper<<endl;
657 return;}
658string h1name = tokens[1];
659string h2name = tokens[2];
660string h3name = tokens[3];
661
662// Get objects
663NamedObjMgr omg;
664AnyDataObj* mobjh1 = omg.GetObj(h1name);
665AnyDataObj* mobjh2 = omg.GetObj(h2name);
666if( mobjh1==NULL || mobjh2==NULL )
667 {cout<<"PAWExecutor::h_oper Error: unknow object(s) "<<h1name<<" or "<<h2name<<endl;
668 return;}
669AnyDataObj* mobjh3 = omg.GetObj(h3name);
670
671// Operations on HProf, only + is working
672if( dynamic_cast<HProf*>(mobjh1) != NULL ) {
673 if( oper[0]!='+' )
674 { cout<<"PAWExecutor::h_oper Error: operation "<<oper
675 <<" not implemented for HProf"<<endl; return;}
676 if( dynamic_cast<HProf*>(mobjh2) == NULL )
677 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
678 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
679 return;}
680 HProf* h1 =(HProf*) mobjh1;
681 HProf* h2 =(HProf*) mobjh2;
682 if( h1->NBins() != h2->NBins() )
683 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
684 <<h1->NBins()<<" "<<h2->NBins()<<endl; return;}
685 HProf* h3 = NULL;
686 if( mobjh3 == NULL ) // l'objet n'existe pas, on le cree
687 {h3 = new HProf(*h1); h3->Zero(); omg.AddObj(h3,h3name); mobjh3 = omg.GetObj(h3name);}
688 h3 = dynamic_cast<HProf*>(mobjh3);
689 if(h3 == NULL) // ce n'est pas un HProf
690 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
691 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl; return;}
692 if(h1->NBins() != h3->NBins())
693 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
694 <<h1->NBins()<<" "<<h3->NBins()<<endl; return;}
695 *h3 = *h1 + *h2;
696 h3->UpdateHisto();
697
698// Operations on Histo
699} else if( dynamic_cast<Histo*>(mobjh1) != NULL ) {
700 if( dynamic_cast<Histo*>(mobjh2) == NULL )
701 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
702 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
703 return;}
704 Histo* h1 =(Histo*) mobjh1;
705 Histo* h2 =(Histo*) mobjh2;
706 if( h1->NBins() != h2->NBins() )
707 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
708 <<h1->NBins()<<" "<<h2->NBins()<<endl; return;}
709 Histo* h3 = NULL;
710 if( mobjh3 == NULL ) // l'objet n'existe pas, on le cree
711 {h3 = new Histo(*h1); h3->Zero(); omg.AddObj(h3,h3name); mobjh3 = omg.GetObj(h3name);}
712 h3 = dynamic_cast<Histo*>(mobjh3);
713 if(h3 == NULL) // ce n'est pas un Histo
714 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
715 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl; return;}
716 if(h1->NBins() != h3->NBins())
717 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
718 <<h1->NBins()<<" "<<h3->NBins()<<endl; return;}
719 if( oper[0]=='+') *h3 = *h1 + *h2;
720 else if( oper[0]=='-') *h3 = *h1 - *h2;
721 else if( oper[0]=='*') *h3 = *h1 * *h2;
722 else if( oper[0]=='/') *h3 = *h1 / *h2;
723
724// Operations on Histo2D
725} else if( dynamic_cast<Histo2D*>(mobjh1) != NULL ) {
726 if( dynamic_cast<Histo2D*>(mobjh2) == NULL )
727 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
728 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
729 return;}
730 Histo2D* h1 =(Histo2D*) mobjh1;
731 Histo2D* h2 =(Histo2D*) mobjh2;
732 if( h1->NBinX() != h2->NBinX() || h1->NBinY() != h2->NBinY() )
733 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
734 <<h1->NBinX()<<","<<h1->NBinY()<<" "
735 <<h2->NBinX()<<","<<h2->NBinY()<<endl; return;}
736 Histo2D* h3 = NULL;
737 if( mobjh3 == NULL ) // l'objet n'existe pas, on le cree
738 {h3 = new Histo2D(*h1); h3->Zero(); omg.AddObj(h3,h3name); mobjh3 = omg.GetObj(h3name);}
739 h3 = dynamic_cast<Histo2D*>(mobjh3);
740 if(h3 == NULL) // ce n'est pas un Histo2D
741 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
742 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl; return;}
743 if( h1->NBinX() != h3->NBinX() || h1->NBinY() != h3->NBinY() )
744 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
745 <<h1->NBinX()<<","<<h1->NBinY()<<" "
746 <<h3->NBinX()<<","<<h3->NBinY()<<endl; return;}
747 if( oper[0]=='+') *h3 = *h1 + *h2;
748 else if( oper[0]=='-') *h3 = *h1 - *h2;
749 else if( oper[0]=='*') *h3 = *h1 * *h2;
750 else if( oper[0]=='/') *h3 = *h1 / *h2;
751
752// Operations on Vector
753} else if( dynamic_cast<Vector*>(mobjh1) != NULL ) {
754 if( dynamic_cast<Vector*>(mobjh2) == NULL )
755 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
756 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
757 return;}
758 Vector* h1 =(Vector*) mobjh1;
759 Vector* h2 =(Vector*) mobjh2;
760 if( h1->NElts() != h2->NElts() )
761 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
762 <<h1->NElts()<<" "<<h2->NElts()<<endl; return;}
763 Vector* h3 = NULL;
764 if( mobjh3 == NULL ) { // l'objet n'existe pas, on le cree
765#ifdef SANS_EVOLPLANCK
766 h3 = new Vector(*h1);
767#else
768 h3 = new Vector(*h1,false);
769#endif
770 *h3 = 0.; omg.AddObj(h3,h3name); mobjh3 = omg.GetObj(h3name);
771 }
772 h3 = dynamic_cast<Vector*>(mobjh3);
773 if(h3 == NULL) // ce n'est pas un Vector
774 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
775 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl; return;}
776 if(h1->NElts() != h3->NElts())
777 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
778 <<h1->NElts()<<" "<<h3->NElts()<<endl; return;}
779 if( oper[0]=='+') *h3 = *h1 + *h2;
780 else if( oper[0]=='-') *h3 = *h1 - *h2;
781#ifdef SANS_EVOLPLANCK
782 else if(oper[0]=='*' || oper[0]=='/')
783 cout<<"PAWExecutor::h_oper Error: operation "<<oper[0]
784 <<" not implemented for Vector in Peida"<<endl;
785#else
786 else if( oper[0]=='*') {h3->Clone(*h1); h3->MulElt(*h2);}
787 else if( oper[0]=='/') {h3->Clone(*h1); h3->DivElt(*h2,false,true);}
788#endif
789
790// Operations on Matrix
791} else if( dynamic_cast<Matrix*>(mobjh1) != NULL ) {
792 if( dynamic_cast<Matrix*>(mobjh2) == NULL )
793 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
794 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
795 return;}
796 Matrix* h1 =(Matrix*) mobjh1;
797 Matrix* h2 =(Matrix*) mobjh2;
798 if( h1->NRows() != h2->NRows() || h1->NCol() != h2->NCol() )
799 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
800 <<h1->NRows()<<","<<h1->NCol()<<" "
801 <<h2->NRows()<<","<<h2->NCol()<<endl; return;}
802 Matrix* h3 = NULL;
803 if( mobjh3 == NULL ) { // l'objet n'existe pas, on le cree
804#ifdef SANS_EVOLPLANCK
805 h3 = new Matrix(*h1);
806#else
807 h3 = new Matrix(*h1,false);
808#endif
809 *h3 = 0.; omg.AddObj(h3,h3name); mobjh3 = omg.GetObj(h3name);
810 }
811 h3 = dynamic_cast<Matrix*>(mobjh3);
812 if(h3 == NULL) // ce n'est pas un Matrix
813 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
814 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl; return;}
815 if( h1->NRows() != h3->NRows() || h1->NCol() != h3->NCol() )
816 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
817 <<h1->NRows()<<","<<h1->NCol()<<" "
818 <<h3->NRows()<<","<<h3->NCol()<<endl; return;}
819 if( oper[0]=='+') *h3 = *h1 + *h2;
820 else if( oper[0]=='-') *h3 = *h1 - *h2;
821#ifdef SANS_EVOLPLANCK
822 else if(oper[0]=='*' || oper[0]=='/')
823 cout<<"PAWExecutor::h_oper Error: operation "<<oper[0]
824 <<" not implemented for Vector in Peida"<<endl;
825#else
826 else if( oper[0]=='*') {h3->Clone(*h1); h3->MulElt(*h2);}
827 else if( oper[0]=='/') {h3->Clone(*h1); h3->DivElt(*h2,false,true);}
828#endif
829
830// Doesn't work for other objects
831} else {
832 cout<<"PAWExecutor::h_oper Error: not implemented for "
833 <<typeid(*mobjh1).name()<<endl;
834 return;
835}
836
837return;
838}
839
840/* methode */
841void PAWExecutor::h_plot_2d(vector<string>& tokens)
842// plot for 2D histogramme: plot histo, bandx/y, slicex/y or projx/y
843{
844if(tokens.size()<1)
845 {cout<<"Usage: h/plot/2d nameh2d to_plot [n/s] [dopt]"<<endl; return;}
846string proj = "h"; if(tokens.size()>1) proj = tokens[1];
847NamedObjMgr omg;
848AnyDataObj* mobj = omg.GetObj(tokens[0]);
849if(mobj==NULL)
850 {cout<<"PAWExecutor::h_plot_2d Error: unknow object"<<tokens[0]<<endl;
851 return;}
852Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
853if(!h2)
854 {cout<<"PAWExecutor::h_plot_2d Error: "<<tokens[0]<<" not an Histo2D"<<endl;
855 return;}
856
857Histo* h1p = NULL; string nametoplot = "/autoc/h_plot_2d_h1";
858
859string dopt = ""; if(tokens.size()>=3) dopt = tokens[2];
860if(proj == "show") {
861 h2->ShowProj();
862 h2->ShowBand(2);
863 h2->ShowSli(2);
864 return;
865} else if(proj == "h") {
866 nametoplot = tokens[0];
867} else if(proj == "px") {
868 if((h1p=h2->HProjX())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
869 else {h2->ShowProj(); return;}
870} else if(proj == "py") {
871 if((h1p=h2->HProjY())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
872 else {h2->ShowProj(); return;}
873} else {
874 if(tokens.size()<3)
875 {cout<<"Usage: h/plot/2d nameh2d bx/by/sx/sy n [dopt]"<<endl; return;}
876 int_4 n = atoi(tokens[2].c_str());
877 dopt = ""; if(tokens.size()>=4) dopt = tokens[3];
878 if(proj == "bx") {
879 if((h1p=h2->HBandX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
880 else {h2->ShowBand(); return;}
881 } else if(proj == "by") {
882 if((h1p=h2->HBandY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
883 else {h2->ShowBand(); return;}
884 } else if(proj == "sx") {
885 if((h1p=h2->HSliX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
886 else {h2->ShowSli(); return;}
887 } else if(proj == "sy") {
888 if((h1p=h2->HSliY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
889 else {h2->ShowSli(); return;}
890 }
891}
892
893omg.DisplayObj(nametoplot,dopt);
894}
895
896/* methode */
897int_4 PAWExecutor::decodepawstring(string tokens,string& nameobj
898 ,string& xexp,string& yexp,string& zexp)
899// Decodage general de "nameobj.xexp"
900// "nameobj.yexp%xexp"
901// "nameobj.zexp%yexp%xexp"
902// Return: nombre de variables trouvees, -1 si probleme
903{
904nameobj = ""; xexp= ""; yexp= ""; zexp= "";
905
906int_4 lt = (int) tokens.length();
907if(lt<=0) return -1;
908
909// decodage de la chaine de type PAW.
910char *str = new char[lt+2];
911strcpy(str,tokens.c_str()); strip(str,'B',' '); lt = strlen(str);
912//cout<<"chaine1["<<lt<<"] :"<<str<<":"<<endl;
913char *c[3] = {NULL,NULL,NULL};
914int_4 i, np=0; bool namefound = false;
915for(i=0;i<lt;i++) {
916 if(!namefound && str[i]=='.') {
917 str[i]='\0';
918 namefound=true;
919 c[np] = str+i+1; np++;
920 }
921 if( namefound && str[i]=='%') {
922 str[i]='\0';
923 if(np<3) {c[np] = str+i+1; np++;}
924 }
925}
926//cout<<"chaine2 :"; for(i=0;i<lt;i++) cout<<str[i]; cout<<":"<<endl;
927
928// Remplissage du nom et des variables
929nameobj = str;
930if(np==1) xexp=c[0];
931if(np==2) {yexp=c[0]; xexp=c[1];}
932if(np==3) {zexp=c[0]; yexp=c[1]; xexp=c[2];}
933//cout<<"pawstring str,c[0-2] "<<str<<" "<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
934delete [] str;
935
936// Comptage des variables
937np = -1;
938if(nameobj.length()>0)
939 {np = 0; if(xexp.length()>0)
940 {np++; if(yexp.length()>0)
941 {np++; if(zexp.length()>0) np++;}}}
942//cout<<"pawstring["<<np<<"] name="<<nameobj
943// <<" xexp="<<xexp<<" yexp="<<yexp<<" zexp="<<zexp<<endl;
944return np;
945}
946
947/* methode */
948void PAWExecutor::h_put_vec(vector<string>& tokens)
949// Pour remplir un histo avec le contenu d'un vecteur ou d'une matrice
950// L'histogramme doit deja exister. Le nombre de bins remplit
951// depend des tailles respectives des 2 objets.
952// tokens[2] = "cont" : on remplit les valeurs de l'histogramme (ou "!")
953// = "err2" : on remplit les erreurs de l'histogramme
954{
955if(tokens.size()<2)
956 {cout<<"Usage: h/put_vec namehisto namevector"<<endl;
957 return;}
958string toput = "cont"; if(tokens.size()>2) toput = tokens[2];
959if(toput=="!") toput = "cont";
960if(toput!="cont" && toput!="err2")
961 {cout<<"PAWExecutor::h_put_vec Error: unknow filling "<<toput<<endl;
962 return;}
963string hname = tokens[0];
964string vname = tokens[1];
965
966// Get objects
967NamedObjMgr omg;
968AnyDataObj* mobjh = omg.GetObj(hname);
969AnyDataObj* mobjv = omg.GetObj(vname);
970if( mobjh==NULL || mobjv==NULL )
971 {cout<<"PAWExecutor::h_put_vec Error: unknow object(s) "<<hname<<" or "<<vname<<endl;
972 return;}
973
974// Fill Histo from Vector
975if(typeid(*mobjh) == typeid(Histo) && typeid(*mobjv) == typeid(Vector)) {
976 Histo* h = dynamic_cast<Histo*>(mobjh);
977 Vector* v = dynamic_cast<Vector*>(mobjv);
978 if(toput=="cont") h->PutValue(*v);
979 else if(toput=="err2") h->PutError2(*v);
980
981// Fill Histo2D from Matrix
982} else if(typeid(*mobjh) == typeid(Histo2D) && typeid(*mobjv) == typeid(Matrix)) {
983 Histo2D* h = dynamic_cast<Histo2D*>(mobjh);
984 Matrix* v = dynamic_cast<Matrix*>(mobjv);
985 if(toput=="cont") h->PutValue(*v);
986 else if(toput=="err2") h->PutError2(*v);
987
988} else {
989 cout<<"PAWExecutor::h_put_vec Error: type mismatch between histogram and vector/matrix\n"
990 <<typeid(*mobjh).name()<<" , "<<typeid(*mobjv).name()<<endl;
991 return;
992}
993
994}
995
996/* methode */
997void PAWExecutor::h_get_vec(vector<string>& tokens)
998// Pour copier un histo dans un vecteur ou une matrice
999// Si le vecteur (matrice) n'existe pas, il est cree.
1000// Le vecteur ou la matrice est re-dimensionne correctement.
1001// tokens[2] = "cont" : on copie les valeurs de l'histogramme (ou "!")
1002// = "err2" : on copie les erreurs de l'histogramme
1003// = "absc" : on copie les erreurs de l'histogramme (1D only)
1004// tokens[3[,4]] = show : show available projections for Histo2D
1005// px : get X projection
1006// py : get Y projection
1007// bx n : get X band number n
1008// by n : get Y band number n
1009// sx n : get X slice number n
1010// sy n : get Y slice number n
1011{
1012if(tokens.size()<2)
1013 {cout<<"Usage: h/get_vec namehisto namevector"<<endl;
1014 return;}
1015string toget = "cont"; if(tokens.size()>2) toget = tokens[2];
1016if(toget=="!") toget = "cont";
1017if(toget!="cont" && toget!="err2" && toget!="absc")
1018 {cout<<"PAWExecutor::h_get_vec Error: unknow filling "<<toget<<endl;
1019 return;}
1020string proj = "h"; if(tokens.size()>3) proj = tokens[3];
1021int_4 nproj = -1; if(tokens.size()>4) nproj = atoi(tokens[4].c_str());
1022string hname = tokens[0];
1023string vname = tokens[1];
1024
1025// Get objects
1026NamedObjMgr omg;
1027AnyDataObj* mobjh = omg.GetObj(hname);
1028AnyDataObj* mobjv = omg.GetObj(vname);
1029if( mobjh==NULL)
1030 {cout<<"PAWExecutor::h_put_vec Error: unknow object(s) "<<hname<<endl;
1031 return;}
1032
1033// Copy Histo/Histo2D/Projection to Vector/Matrix
1034Histo* h = dynamic_cast<Histo*>(mobjh);
1035Histo2D* h2 = dynamic_cast<Histo2D*>(mobjh);
1036if( h != NULL ) { // Histo ou HProf
1037 h->UpdateHisto(); // pour le cas ou c'est un HProf
1038 Vector* v = NULL;
1039 if(mobjv==NULL) // le vecteur n'existe pas
1040 {v = new Vector(1); omg.AddObj(v,vname); mobjv = omg.GetObj(vname);}
1041 if(typeid(*mobjv) != typeid(Vector))
1042 {cout<<"PAWExecutor::h_get_vec Error: type mismatch between Histo/HProf and vector\n"
1043 <<typeid(*mobjv).name()<<endl; return;}
1044 v = dynamic_cast<Vector*>(mobjv);
1045 if(toget=="cont") h->GetValue(*v);
1046 else if(toget=="err2") h->GetError2(*v);
1047 else if(toget=="absc") h->GetAbsc(*v);
1048
1049} else if( h2 != NULL) { // Histo2D
1050
1051 if(proj == "h") { // On veut les valeurs de l'histogramme 2D
1052 Matrix* v = NULL;
1053 if(mobjv==NULL) // la matrice n'existe pas
1054 {v = new Matrix(1,1); omg.AddObj(v,vname); mobjv = omg.GetObj(vname);}
1055 if(typeid(*mobjv) != typeid(Matrix))
1056 {cout<<"PAWExecutor::h_get_vec Error: type mismatch between Histo2D and matrix\n"
1057 <<typeid(*mobjv).name()<<endl; return;}
1058 v = dynamic_cast<Matrix*>(mobjv);
1059 if(toget=="cont") h2->GetValue(*v);
1060 else if(toget=="err2") h2->GetError2(*v);
1061 else
1062 {cout<<"PAWExecutor::h_get_vec Error: option "<<toget<<" not valid for Histo2D"<<endl;
1063 return;}
1064
1065 } else { // On veut les valeurs d'une projection de l'histo 2D
1066 h = NULL;
1067 if(proj == "show") {h2->ShowProj(); h2->ShowBand(2); h2->ShowSli(2);}
1068 else if(proj == "px") h = h2->HProjX();
1069 else if(proj == "py") h = h2->HProjY();
1070 else if(proj == "bx") h = h2->HBandX(nproj);
1071 else if(proj == "by") h = h2->HBandY(nproj);
1072 else if(proj == "sx") h = h2->HSliX(nproj);
1073 else if(proj == "sy") h = h2->HSliY(nproj);
1074 if(h==NULL)
1075 {cout<<"PAWExecutor::h_get_vec Error: unknown projection "<<proj
1076 <<" number "<<nproj<<endl; return;}
1077 Vector* v = NULL;
1078 if(mobjv==NULL) // le vecteur n'existe pas
1079 {v = new Vector(1); omg.AddObj(v,vname); mobjv = omg.GetObj(vname);}
1080 if(typeid(*mobjv) != typeid(Vector))
1081 {cout<<"PAWExecutor::h_get_vec Error: type mismatch between Histo2D "<<proj
1082 <<" and vector\n"<<typeid(*mobjv).name()<<endl; return;}
1083 v = dynamic_cast<Vector*>(mobjv);
1084 if(toget=="cont") h->GetValue(*v);
1085 else if(toget=="err2") h->GetError2(*v);
1086 else if(toget=="absc") h->GetAbsc(*v);
1087 }
1088
1089} else {
1090 cout<<"PAWExecutor::h_get_vec Error: type mismatch for histogram\n"
1091 <<typeid(*mobjh).name()<<endl;
1092 return;
1093}
1094
1095}
1096
1097/* methode */
1098void PAWExecutor::h_copy(vector<string>& tokens)
1099// Pour copier un object dans un object
1100// objects are Vector,Matrix,Histo,Histo2D
1101// h/copy namefrom nametocopy [i1[:i2]] [j1[:j2]] [ic1[:jc1]]
1102// copy obj1Dfrom(i1->i2) into obj1Dto(ic1->)
1103// copy obj2Dfrom(i1,j1->i2,j2) into obj2Dto(ic1,jc1->)
1104// Attention: elements depuis i1 jusqu'a i2 COMPRIS
1105// Si obj1Dto n'existe pas, il est cree avec une taille i2-i1+1
1106// ou obj2Dto avec une taille i2-i1+1,j2-j1+1
1107// Le contenu de obj?Dfrom adresse est surecrit
1108// Le contenu de obj?Dfrom non adresse reste le meme
1109{
1110int_4 tks = tokens.size();
1111if(tks<2)
1112 {cout<<"Usage: h_copy namefrom nametocopy [i1[:i2]] [j1[:j2]] [ic1[:jc1]]"<<endl;
1113 return;}
1114
1115NamedObjMgr omg;
1116AnyDataObj* mobjv1 = omg.GetObj(tokens[0]);
1117if( mobjv1==NULL)
1118 {cout<<"PAWExecutor::h_copy Error: unknow object "<<tokens[0]<<endl;
1119 return;}
1120AnyDataObj* mobjv2 = omg.GetObj(tokens[1]);
1121
1122int_4 i1=0,i2=0, j1=0,j2=0, ic1=0,jc1=0, i,ii, j,jj, nx1,ny1, nx2,ny2;
1123
1124// Cas d'un Vector
1125if(typeid(*mobjv1) == typeid(Vector)) {
1126 Vector* v1 = dynamic_cast<Vector*>(mobjv1); nx1 = (int_4)v1->NElts();
1127 i2=nx1-1;
1128 if(tks>2) if(tokens[2]!="!") sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
1129 if(i1<0) i1=0; if(i2>=nx1) i2=nx1-1;
1130 if(i2<i1)
1131 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2<<"] for NElts="
1132 <<nx1<<endl; return;}
1133 Vector* v2 = NULL;
1134 if(mobjv2==NULL)
1135 {v2 = new Vector(i2-i1+1); omg.AddObj(v2,tokens[1]); mobjv2 = omg.GetObj(tokens[1]);}
1136 if(typeid(*mobjv2) != typeid(Vector))
1137 {cout<<"PAWExecutor::h_copy Error: type mismatch for Vector "
1138 <<typeid(*mobjv2).name()<<endl; return;}
1139 v2 = dynamic_cast<Vector*>(mobjv2); nx2 = (int_4)v2->NElts();
1140 if(tks>4) if(tokens[4]!="!") sscanf(tokens[4].c_str(),"%d",&ic1);
1141 if(ic1<0) ic1=0;
1142 if(ic1>=nx2)
1143 {cout<<"PAWExecutor::h_copy Error: wrong pointer to copy ["<<ic1<<"] for NElts="
1144 <<nx2<<endl; return;}
1145 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<") to "<<tokens[1]<<"("<<ic1<<"->...)"<<endl;
1146 for(i=i1,ii=ic1; i<=i2 && i<nx1 && ii<nx2; i++,ii++) (*v2)(ii) = (*v1)(i);
1147 return;
1148}
1149
1150// Cas d'un Histo
1151if(typeid(*mobjv1) == typeid(Histo)) {
1152 Histo* v1 = dynamic_cast<Histo*>(mobjv1); nx1 = (int_4)v1->NBins();
1153 i2=nx1-1;
1154 if(tks>2) if(tokens[2]!="!") sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
1155 if(i1<0) i1=0; if(i2>=nx1) i2=nx1-1;
1156 if(i2<i1)
1157 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2<<"] for NBins="
1158 <<nx1<<endl; return;}
1159 Histo* v2 = NULL;
1160 if(mobjv2==NULL)
1161 {v2 = new Histo(0.,(r_8)(i2-i1+1),i2-i1+1);
1162 omg.AddObj(v2,tokens[1]); mobjv2 = omg.GetObj(tokens[1]);}
1163 if(typeid(*mobjv2) != typeid(Histo))
1164 {cout<<"PAWExecutor::h_copy Error: type mismatch for Histo "
1165 <<typeid(*mobjv2).name()<<endl; return;}
1166 v2 = dynamic_cast<Histo*>(mobjv2); nx2 = (int_4)v2->NBins();
1167 if(v1->HasErrors() && !(v2->HasErrors())) v2->Errors();
1168 if(tks>4) if(tokens[4]!="!") sscanf(tokens[4].c_str(),"%d",&ic1);
1169 if(ic1<0) ic1=0;
1170 if(ic1>=nx2)
1171 {cout<<"PAWExecutor::h_copy Error: wrong pointer to copy ["<<ic1<<"] for NBins="
1172 <<nx2<<endl; return;}
1173 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<") to "<<tokens[1]<<"("<<ic1<<"->...)"<<endl;
1174 for(i=i1,ii=ic1; i<=i2 && i<nx1 && ii<nx2; i++,ii++)
1175 {(*v2)(ii) = (*v1)(i); if(v1->HasErrors()) v2->Error2(ii) = v1->Error2(i);}
1176 return;
1177}
1178
1179// Cas d'une Matrix
1180if(typeid(*mobjv1) == typeid(Matrix)) {
1181 Matrix* v1 = dynamic_cast<Matrix*>(mobjv1); nx1=v1->NRows(); ny1=v1->NCol();
1182 i2=nx1-1; j2=ny1-1;
1183 if(tks>2) if(tokens[2]!="!") sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
1184 if(tks>3) if(tokens[3]!="!") sscanf(tokens[3].c_str(),"%d:%d",&j1,&j2);
1185 if(i1<0) i1=0; if(i2>=nx1) i2=nx1-1; if(j1<0) j1=0; if(j2>=ny1) j2=ny1-1;
1186 if(i2<i1 || j2<j1)
1187 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2
1188 <<"] , ["<<j1<<":"<<j2<<"] for NRows,NCol="
1189 <<nx1<<" , "<<ny1<<endl; return;}
1190 Matrix* v2 = NULL;
1191 if(mobjv2==NULL)
1192 {v2 = new Matrix(i2-i1+1,j2-j1+1);
1193 omg.AddObj(v2,tokens[1]); mobjv2 = omg.GetObj(tokens[1]);}
1194 if(typeid(*mobjv2) != typeid(Matrix))
1195 {cout<<"PAWExecutor::h_copy Error: type mismatch for Matrix "
1196 <<typeid(*mobjv2).name()<<endl; return;}
1197 v2 = dynamic_cast<Matrix*>(mobjv2); nx2=v2->NRows(); ny2=v2->NCol();
1198 if(tks>4) if(tokens[4]!="!") sscanf(tokens[4].c_str(),"%d:%d",&ic1,&jc1);
1199 if(ic1<0) ic1=0; if(jc1<0) jc1=0;
1200 if(ic1>=nx2 || jc1>=ny2)
1201 {cout<<"PAWExecutor::h_copy Error: wrong pointer to copy ["<<ic1<<","<<jc1
1202 <<"] for NRows,NCol="<<nx2<<","<<ny2<<endl; return;}
1203 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<","<<j1<<":"<<j2
1204 <<") to "<<tokens[1]<<"("<<ic1<<","<<jc1<<"->...)"<<endl;
1205 for(i=i1,ii=ic1; i<=i2 && i<nx1 && ii<nx2; i++,ii++)
1206 for(j=j1,jj=jc1; j<=j2 && j<ny1 && jj<ny2; j++,jj++) (*v2)(ii,jj) = (*v1)(i,j);
1207 return;
1208}
1209
1210// Cas d'un Histo2D
1211if(typeid(*mobjv1) == typeid(Histo2D)) {
1212 Histo2D* v1 = dynamic_cast<Histo2D*>(mobjv1); nx1=v1->NBinX(); ny1=v1->NBinY();
1213 i2=nx1-1; j2=ny1-1;
1214 if(tks>2) if(tokens[2]!="!") sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
1215 if(tks>3) if(tokens[3]!="!") sscanf(tokens[3].c_str(),"%d:%d",&j1,&j2);
1216 if(i1<0) i1=0; if(i2>=nx1) i2=nx1-1; if(j1<0) j1=0; if(j2>=ny1) j2=ny1-1;
1217 if(i2<i1 || j2<j1)
1218 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2
1219 <<"] , ["<<j1<<":"<<j2<<"] for NBinX,NBinY="
1220 <<nx1<<" , "<<ny1<<endl; return;}
1221 Histo2D* v2 = NULL;
1222 if(mobjv2==NULL)
1223 {v2 = new Histo2D(0.,(r_8)(i2-i1+1),i2-i1+1,0.,(r_8)(j2-j1+1),j2-j1+1);
1224 omg.AddObj(v2,tokens[1]); mobjv2 = omg.GetObj(tokens[1]);}
1225 if(typeid(*mobjv2) != typeid(Histo2D))
1226 {cout<<"PAWExecutor::h_copy Error: type mismatch for Histo2D"
1227 <<typeid(*mobjv2).name()<<endl; return;}
1228 v2 = dynamic_cast<Histo2D*>(mobjv2); nx2=v2->NBinX(); ny2=v2->NBinY();
1229 if(v1->HasErrors() && !(v2->HasErrors())) v2->Errors();
1230 if(tks>4) sscanf(tokens[4].c_str(),"%d:%d",&ic1,&jc1);
1231 if(ic1<0) ic1=0; if(jc1<0) jc1=0;
1232 if(ic1>=nx2 || jc1>=ny2)
1233 {cout<<"PAWExecutor::h_copy Error: wrong pointer to copy ["<<ic1<<","<<jc1
1234 <<"] for NBinX,NBinY="<<nx2<<","<<ny2<<endl; return;}
1235 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<","<<j1<<":"<<j2
1236 <<") to "<<tokens[1]<<"("<<ic1<<","<<jc1<<"->...)"<<endl;
1237 for(i=i1,ii=ic1; i<=i2 && i<nx1 && ii<nx2; i++,ii++)
1238 for(j=j1,jj=jc1; j<=j2 && j<ny1 && jj<ny2; j++,jj++)
1239 {(*v2)(ii,jj) = (*v1)(i,j); if(v1->HasErrors()) v2->Error2(ii,jj) = v1->Error2(i,j);}
1240 return;
1241}
1242
1243// Cas non prevu
1244cout<<"PAWExecutor::h_copy Error: type mismatch for Vector/Matrix/Histo/Histo2D\n"
1245 <<typeid(*mobjv1).name()<<endl;
1246return;
1247}
1248
1249/* methode */
1250void PAWExecutor::h_set(string dum,vector<string>& tokens)
1251// Mise de valeurs/erreurs d'un histo 1D ou 2D a une valeur donnee
1252// dum = err : on change les valeurs des erreurs
1253// cont : on change les valeurs du contenu des bins
1254// tokens[0] : nom de l'histogramme
1255// tokens[1] : valeur de remplacement
1256// tokens[2-3] : i1:i2 j1:j2 intervalle des bins qui doivent etre remplace
1257// : v v1:v2 remplacement des bins ayant une valeur dans cet intervalle
1258// : e e1:e2 remplacement des bins ayant une erreur dans cet intervalle
1259{
1260int_4 tks = tokens.size();
1261if(tks<3)
1262 {cout<<"Usage: h/set/[err,cont] namehisto setvalue i1[:i2] [j1[:j2]]\n"
1263 <<" v v1:v2\n"
1264 <<" e e1:e2"
1265 <<endl; return;}
1266
1267// Decodage arguments
1268bool replerr = false; if(dum=="err") replerr = true;
1269r_8 setval = atof(tokens[1].c_str());
1270int_4 testcont=0; if(tokens[2]=="v") testcont=1; if(tokens[2]=="e") testcont=2;
1271int_4 i1=-1, i2=-1, j1=-1, j2=-1;
1272r_8 v1=0., v2=0.;
1273if(testcont==0) {
1274 sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
1275 if(tks>3) sscanf(tokens[3].c_str(),"%d:%d",&j1,&j2);
1276} else {
1277 if(tks<=3)
1278 {cout<<"PAWExecutor::h_set Error: h/set/... v v1:v2, please give v1:v2"<<endl;
1279 return;}
1280 sscanf(tokens[3].c_str(),"%lf:%lf",&v1,&v2);
1281}
1282
1283if(replerr) {if(setval<0.) setval = 0.; else setval *= setval;}
1284if(testcont!=0 && v2<v1)
1285 {cout<<"PAWExecutor::h_set Error: bad value range="<<v1<<","<<v2<<endl; return;}
1286
1287// identification objet
1288NamedObjMgr omg;
1289AnyDataObj* mobj = omg.GetObj(tokens[0]);
1290if( mobj==NULL)
1291 {cout<<"PAWExecutor::h_set Error: unknow object "<<tokens[0]<<endl;
1292 return;}
1293
1294// Traitement
1295if(typeid(*mobj) == typeid(Histo)) { // Histo 1D
1296 Histo* h = dynamic_cast<Histo*>(mobj);
1297 if( (replerr || testcont==2) && !(h->HasErrors()) )
1298 {cout<<"PAWExecutor::h_set Error: histogram has no errors"<<endl; return;}
1299 if(testcont!=0) {i1=0; i2=h->NBins()-1;}
1300 if(i1<0 || i1>=h->NBins())
1301 {cout<<"PAWExecutor::h_set Error: bad bin range i1="<<i1<<endl; return;}
1302 if(i2<i1) i2=i1; if(i2>=h->NBins()) i2=h->NBins()-1;
1303 for(int_4 i=i1;i<=i2;i++) {
1304 bool change = true;
1305 if(testcont==1) {if((*h)(i)<v1 || (*h)(i)>v2) change = false;}
1306 else if(testcont==2) {if(h->Error(i)<v1 || h->Error(i)>v2) change = false;}
1307 if(!change) continue;
1308 if(replerr) h->Error2(i) = setval; else (*h)(i) = setval;
1309 }
1310
1311} else if(typeid(*mobj) == typeid(Histo2D)) { // Histo 2D
1312 Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
1313 if( (replerr || testcont==2) && !(h2->HasErrors()) )
1314 {cout<<"PAWExecutor::h_set Error: histogram has no errors"<<endl; return;}
1315 if(testcont!=0) {i1=0; i2=h2->NBinX()-1;j1=0; j2=h2->NBinY()-1;}
1316 if(i1<0 || i1>=h2->NBinX() || j1<0 || j1>=h2->NBinY())
1317 {cout<<"PAWExecutor::h_set Error: bad bin range i1,j1="<<i1<<","<<j1<<endl; return;}
1318 if(i2<i1) i2=i1; if(i2>=h2->NBinX()) i2=h2->NBinX()-1;
1319 if(j2<j1) j2=j1; if(j2>=h2->NBinY()) j2=h2->NBinY()-1;
1320 for(int_4 i=i1;i<=i2;i++) for(int_4 j=j1;j<=j2;j++) {
1321 bool change = true;
1322 if(testcont==1) {if((*h2)(i,j)<v1 || (*h2)(i,j)>v2) change = false;}
1323 else if(testcont==2) {if(h2->Error(i,j)<v1 || h2->Error(i,j)>v2) change = false;}
1324 if(!change) continue;
1325 if(replerr) h2->Error2(i,j) = setval; else (*h2)(i,j) = setval;
1326 }
1327
1328} else {
1329 cout<<"PAWExecutor::h_set Error: type mismatch for Histo/Histo2D\n"
1330 <<typeid(*mobj).name()<<endl;
1331 return;
1332}
1333
1334}
1335
1336/* methode */
1337void PAWExecutor::h_err(vector<string>& tokens)
1338// Mise des erreurs d'un histo 1D ou 2D a une valeur
1339// donnee par une fonction de la valeur du bin
1340// tokens[0] : nom de l'histogramme
1341// tokens[1] : expression de la fonction
1342{
1343if(tokens.size()<2)
1344 {cout<<"Usage: h/err namehisto expr_func"<<endl; return;}
1345
1346// identification objet
1347NamedObjMgr omg;
1348AnyDataObj* mobj = omg.GetObj(tokens[0]);
1349if( mobj==NULL)
1350 {cout<<"PAWExecutor::h_err Error: unknow object "<<tokens[0]<<endl;
1351 return;}
1352
1353// Fonction
1354FILE *fip = NULL;
1355string expfunc = ""; {for(int_4 i=1;i<(int)tokens.size();i++) expfunc += tokens[i];}
1356string fname = "func1or2_pia_dl.c";
1357string func = "func1or2_pia_dl_func";
1358if((fip = fopen(fname.c_str(), "w")) == NULL)
1359 {cout<<"PAWExecutor::h_err Error: open function file "<<fname<<endl;
1360 return;}
1361fprintf(fip,"#include <math.h>\n");
1362fprintf(fip,"double %s(double x) \n{\n",func.c_str());
1363fprintf(fip,"return(%s); \n}\n", expfunc.c_str());
1364fclose(fip);
1365DlFunctionOfX f = (DlFunctionOfX) omg.GetServiceObj()->LinkFunctionFromFile(fname,func);
1366if(!f)
1367 {cout<<"PAWExecutor::h_err Error: bad function "<<func<<","<<fname<<endl;
1368 return;}
1369
1370// Traitement
1371if(typeid(*mobj) == typeid(Histo)) { // Histo 1D
1372 Histo* h = dynamic_cast<Histo*>(mobj);
1373 if(!(h->HasErrors())) h->Errors();
1374 for(int_4 i=0;i<h->NBins();i++) {
1375 r_8 x = (*h)(i);
1376 r_8 e = f(x);
1377 h->SetErr2(i,e*e);
1378 }
1379
1380} else if(typeid(*mobj) == typeid(Histo2D)) { // Histo 2D
1381 Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
1382 if(!(h2->HasErrors())) h2->Errors();
1383 for(int_4 i=0;i<h2->NBinX();i++) for(int_4 j=0;j<h2->NBinY();j++) {
1384 r_8 x = (*h2)(i,j);
1385 r_8 e = f(x);
1386 h2->Error2(i,j) = e*e;
1387 }
1388
1389} else {
1390 cout<<"PAWExecutor::h_err Error: type mismatch for Histo/Histo2D\n"
1391 <<typeid(*mobj).name()<<endl;
1392 return;
1393}
1394
1395}
Note: See TracBrowser for help on using the repository browser.