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

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

intro de h/copy cmv 13/7/00

File size: 33.6 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 "pistdimgapp.h"
17
18#ifdef SANS_EVOLPLANCK
19#include "cvector.h"
20#include "matrix.h"
21#else
22#include "tmatrix.h"
23#include "tvector.h"
24#endif
25
26/* Reza + cmv 13/10/99 */
27
28uint_4 PAWExecutor::autoc_counter_ = 0;
29
30/* methode */
31PAWExecutor::PAWExecutor(PIACmd *piac, PIStdImgApp* app)
32: mApp(app)
33{
34string kw, usage;
35string hgrp = "pawCmd";
36
37kw = "reset";
38usage = "Reset histograms vectors or matrix";
39usage += "\n reset nameobj";
40piac->RegisterCommand(kw,usage,this,hgrp);
41
42kw = "n/plot";
43usage = "Plot NTuple variables a la paw";
44usage += "\n n/plot nameobj.x_exp [cut] [w_exp] [loop] [gratt]";
45usage += "\n n/plot nameobj.y_exp%x_exp [cut] [loop] [gratt]";
46usage += "\n n/plot nameobj.z_exp%y_exp%x_exp [cut] [loop] [gratt]";
47usage += "\n for default use ! , loop=i1[:i2[:di]]";
48usage += "\n Related commands: plot2dw plot3d";
49piac->RegisterCommand(kw,usage,this,hgrp);
50
51kw = "n/proj";
52usage = "Project NTuple in histogram (1D or 2D) a la paw";
53usage += "\n n/proj nameproj nameobj.x_exp [cut] [w_exp] [loop] [gratt]";
54usage += "\n n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [loop] [gratt]";
55usage += "\n for default use ! , loop=i1[:i2[:di]]";
56usage += "\n Related commands: projh1d projh2d projprof";
57piac->RegisterCommand(kw,usage,this,hgrp);
58
59kw = "h/integ";
60usage = "Integrate a 1D histogram";
61usage += "\n h/integ nameh1d [norm]";
62usage += "\n Related commands: h/deriv";
63piac->RegisterCommand(kw,usage,this,hgrp);
64
65kw = "h/deriv";
66usage = "Derivate a 1D histogram";
67usage += "\n h/deriv nameh1d";
68usage += "\n Related commands: h/integ";
69piac->RegisterCommand(kw,usage,this,hgrp);
70
71kw = "h/rebin";
72usage = "Rebin a 1D histogram or profile";
73usage += "\n h/rebin nameh1d nbin";
74piac->RegisterCommand(kw,usage,this,hgrp);
75
76kw = "h/cadd";
77usage = "Add a constant to an histogram";
78usage += "\n h/cadd namehisto val";
79usage += "\n Related commands: h/cmult h/oper";
80piac->RegisterCommand(kw,usage,this,hgrp);
81
82kw = "h/cmult";
83usage = "Multiply an histogram by a constant";
84usage += "\n h/cmult namehisto val";
85usage += "\n Related commands: h/cadd h/oper";
86piac->RegisterCommand(kw,usage,this,hgrp);
87
88kw = "h/oper";
89usage = "Operation on histograms";
90usage += "\n h/oper @ h1 h2 hres";
91usage += "\n hres = h1 @ h2 with @ = (+,-,*,/)";
92usage += "\n Related commands: h/cadd h/cmult";
93piac->RegisterCommand(kw,usage,this,hgrp);
94
95kw = "h/plot/2d";
96usage = "Specific plot for 2D histogrammes";
97usage += "\n h/plot/2d nameh2d show : infos on 2D histogramme";
98usage += "\n h/plot/2d nameh2d h [dopt] : plot 2D histogramme";
99usage += "\n h/plot/2d nameh2d px [dopt] : plot X projection";
100usage += "\n h/plot/2d nameh2d py [dopt] : plot Y projection";
101usage += "\n h/plot/2d nameh2d bx n [dopt] : plot X band number n";
102usage += "\n h/plot/2d nameh2d by n [dopt] : plot Y band number n";
103usage += "\n h/plot/2d nameh2d sx n [dopt] : plot X slice number n";
104usage += "\n h/plot/2d nameh2d sy n [dopt] : plot Y slice number n";
105usage += "\n n < 0 means Show Info";
106piac->RegisterCommand(kw,usage,this,hgrp);
107
108kw = "h/put_vec";
109usage = "Put content of vector (matrix) into content of histogram 1D or 2D";
110usage += "\n h/put_vec nameh1d namevector [cont,err2]";
111usage += "\n h/put_vec nameh2d namematrix [cont,err2]";
112usage += "\n cont : put into histogramme content";
113usage += "\n err2 : put into histogramme error^2";
114usage += "\n Related commands: h/get_vec";
115piac->RegisterCommand(kw,usage,this,hgrp);
116
117kw = "h/get_vec";
118usage = "Get content of histogram 1D profile or 2D into vector (matrix)";
119usage += "\n h/get_vec nameh1d namevector [cont,err2,absc] [proj]";
120usage += "\n h/get_vec nameh2d namematrix [cont,err2,absc]";
121usage += "\n cont : get histogramme content";
122usage += "\n err2 : get histogramme error^2";
123usage += "\n absc : get histogramme low bin abscissa (1D only)";
124usage += "\n proj :";
125usage += "\n show : show available projections for Histo2D";
126usage += "\n px : get X projection";
127usage += "\n py : get Y projection";
128usage += "\n bx n : get X band number n";
129usage += "\n by n : get Y band number n";
130usage += "\n sx n : get X slice number n";
131usage += "\n sy n : get Y slice number n";
132usage += "\n Related commands: h/put_vec";
133piac->RegisterCommand(kw,usage,this,hgrp);
134
135kw = "h/copy";
136usage = "Copy content of object1 into objecft2";
137usage += "\n objects are Vector,Matrix,Histo,Histo2D";
138usage += "\n h/copy namefrom nametocopy [i1[:i2]] [j1[:j2]]";
139usage += "\n copy obj1Dfrom(i1->i2) into obj1Dto";
140usage += "\n copy obj2Dfrom(i1:j1->i2:j2) into obj2Dto";
141usage += "\n Warnig: elements from i1 to i2 included are copied";
142usage += "\n Related commands: copy";
143piac->RegisterCommand(kw,usage,this,hgrp);
144
145}
146
147/* methode */
148PAWExecutor::~PAWExecutor()
149{
150}
151
152/* methode */
153int PAWExecutor::Execute(string& kw, vector<string>& tokens)
154{
155if(kw == "reset") {
156 reset(tokens); return(0);
157} else if(kw == "n/plot") {
158 n_plot(tokens); return(0);
159} else if(kw == "n/proj") {
160 n_proj(tokens); return(0);
161} else if(kw == "h/integ") {
162 h_integ(tokens); return(0);
163} else if(kw == "h/deriv") {
164 h_deriv(tokens); return(0);
165} else if(kw == "h/rebin") {
166 h_rebin(tokens); return(0);
167} else if(kw == "h/cadd") {
168 h_cadd(tokens); return(0);
169} else if(kw == "h/cmult") {
170 h_cmult(tokens); return(0);
171} else if(kw == "h/oper") {
172 h_oper(tokens); return(0);
173} else if(kw == "h/plot/2d") {
174 h_plot_2d(tokens); return(0);
175} else if(kw == "h/put_vec") {
176 h_put_vec(tokens); return(0);
177} else if(kw == "h/get_vec") {
178 h_get_vec(tokens); return(0);
179} else if(kw == "h/copy") {
180 h_copy(tokens); return(0);
181} else return(1);
182}
183
184/* methode */
185void PAWExecutor::reset(vector<string>& tokens)
186// Reset d'histogrammes, vecteurs et matrices
187{
188if(tokens.size() < 1)
189 {cout<<"Usage: reset nameobj"<<endl; return;}
190NamedObjMgr omg;
191AnyDataObj* mobj = omg.GetObj(tokens[0]);
192if(mobj == NULL)
193 {cout<<"PAWExecutor::reset Error , Pas d'objet de nom "<<tokens[0]<<endl;
194 return;}
195string ctyp = typeid(*mobj).name();
196
197#ifdef SANS_EVOLPLANCK
198if(typeid(*mobj)==typeid(Vector)) {Vector* ob=(Vector*) mobj; ob->Zero();}
199else if(typeid(*mobj)==typeid(Matrix)) {Matrix* ob=(Matrix*) mobj; ob->Zero();}
200#else
201 if(typeid(*mobj)==typeid(Vector)) {Vector* ob=(Vector*) mobj; (*ob) = 0.; }
202// ob->DataBlock().Reset(0.);}
203 else if(typeid(*mobj)==typeid(Matrix)) {Matrix* ob=(Matrix*) mobj; (*ob) = 0.; }
204//ob->DataBlock().Reset(0.);}
205#endif
206else if(typeid(*mobj)==typeid(Histo)) {Histo* ob=(Histo*) mobj; ob->Zero();}
207else if(typeid(*mobj)==typeid(HProf)) {HProf* ob=(HProf*) mobj; ob->Zero();}
208else if(typeid(*mobj)==typeid(Histo2D)) {Histo2D* ob=(Histo2D*)mobj; ob->Zero();}
209else {
210 cout<<"PAWExecutor::reset Error , No reset possible on "<<ctyp<<endl;
211 return;
212}
213
214return;
215}
216
217/* methode */
218void PAWExecutor::n_plot(vector<string>& tokens)
219// Equivalent n/plot de paw
220// Plot 1D
221// n/plot nameobj.x_exp [cut] [w_exp] [gratt]
222// Plot 2D (plot2dw)
223// n/plot nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
224// Plot 3D (plot3d)
225// n/plot nameobj.z_exp%y_exp%x_exp [cut] [gratt]
226{
227if(tokens.size() < 1) {
228 cout
229 <<"Usage: n/plot nameobj.x_exp [cut] [w_exp] [loop] [gratt] [nomh1]"<<endl
230 <<" n/plot nameobj.y_exp%x_exp [cut] [loop] [gratt]"<<endl
231 <<" n/plot nameobj.z_exp%y_exp%x_exp [cut] [loop] [gratt]"<<endl
232 <<" for default use ! , loop=i1[:i2[:di]]"<<endl;
233 return;
234}
235string nameobj,expx,expy,expz;
236int nvar = decodepawstring(tokens[0],nameobj,expx,expy,expz);
237string expcut = "1"; string expwt = "1."; string loop = "";
238string dopt = ""; string nameproj="";
239if(tokens.size()>=2) expcut = tokens[1]; if(expcut=="!") expcut="1";
240
241NamedObjMgr omg;
242Services2NObjMgr* srvo = omg.GetServiceObj();
243
244if(nvar<=0) {
245 cout<<"PAWExecutor::n_plot Error: bad coding "<<tokens[0]<<endl;
246} else if(nvar==1) { // c'est un plot 1D
247 if(tokens.size()>=3) expwt = tokens[2]; if(expwt=="!") expwt="1.";
248 if(tokens.size()>=4) loop = tokens[3]; if(loop=="!") loop="";
249 if(tokens.size()>=5) dopt = tokens[4]; if(dopt=="!") dopt="";
250 if(tokens.size()>=6) nameproj = tokens[5];
251 if(nameproj.length()<=0 || nameproj=="!") {
252 nameproj = "/autoc/paw_n_plot1D_";
253 AnyDataObj* mobj = omg.GetObj(nameproj);
254 if(mobj!=NULL) {
255 char buff[16]; autoc_counter_++; sprintf(buff,"%d",autoc_counter_);
256 nameproj += buff;
257 }
258 }
259 srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
260} else if(nvar==2) { // c'est un plot 2D
261 if(tokens.size()>=3) loop = tokens[2]; if(loop=="!") loop="";
262 if(tokens.size()>=4) dopt = tokens[3];
263 string err = "";
264 srvo->DisplayPoints2D(nameobj,expx,expy,err,err,expcut,dopt,loop);
265} else { // c'est un plot 3D
266 if(tokens.size()>=3) loop = tokens[2]; if(loop=="!") loop="";
267 if(tokens.size()>=4) dopt = tokens[3];
268 srvo->DisplayPoints3D(nameobj,expx,expy,expz,expcut,dopt,loop);
269}
270
271return;
272}
273
274/* methode */
275void PAWExecutor::n_proj(vector<string>& tokens)
276// Equivalent n/proj de paw
277// Project NTuple in histogram a la paw
278// Dans un Histo 1D
279// n/proj nameproj nameobj.x_exp [cut] [w_exp] [gratt]
280// Dans un Histo 2D ou un HProf (dans ce cas nameproj doit etre cree).
281// n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
282{
283if(tokens.size()<2)
284 {cout<<"Usage: n/proj nameproj nameobj.[y_exp%]x_exp [cut] [w_exp] [loop] [gratt]"<<endl
285 <<" for default use ! , loop=i1[:i2[:di]]"<<endl; return;}
286string nameproj = tokens[0];
287string nameobj,expx,expy,expz;
288int nvar = decodepawstring(tokens[1],nameobj,expx,expy,expz);
289string expcut = "1"; string expwt = "1."; string loop = ""; string dopt = "";
290if(tokens.size()>=3) expcut = tokens[2]; if(expcut=="!") expcut="1";
291if(tokens.size()>=4) expwt = tokens[3]; if(expwt=="!") expwt="1.";
292if(tokens.size()>=5) loop = tokens[4]; if(loop=="!") loop="";
293if(tokens.size()>=6) dopt = tokens[5];
294
295NamedObjMgr omg;
296Services2NObjMgr* srvo = omg.GetServiceObj();
297
298if(nvar<=0) {
299 cout<<"PAWExecutor::n_proj Error: bad coding "<<tokens[1]<<endl;
300} else if(nvar==1) {
301 // c'est une projection dans un histo 1D
302 srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
303} else {
304 // c'est une projection dans un histo2D
305 // OU un HProf si nameproj est HProf un deja defini
306 AnyDataObj* mobj = omg.GetObj(nameproj);
307 if(mobj==NULL)
308 srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
309 else if(dynamic_cast<HProf*>(mobj))
310 srvo->ProjectHProf(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
311 else
312 srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
313}
314
315return;
316}
317
318/* methode */
319void PAWExecutor::h_integ(vector<string>& tokens)
320// Pour remplacer le contenu d'un histo 1D par son integrale
321{
322if(tokens.size()<1)
323 {cout<<"Usage: h/integ nameh1d [norm]"<<endl; return;}
324NamedObjMgr omg;
325AnyDataObj* mobj = omg.GetObj(tokens[0]);
326if(mobj==NULL)
327 {cout<<"PAWExecutor::h_integ Error: unknow object"<<tokens[0]<<endl;
328 return;}
329double norm = 1.;
330if(tokens.size()>=2) norm = atof(tokens[1].c_str());
331// attention: dynamic_cast<Histo*>(HProf)=Vrai!
332Histo* h1 = dynamic_cast<Histo*>(mobj);
333HProf* hp = dynamic_cast<HProf*>(mobj);
334if(hp || !h1)
335 {cout<<"PAWExecutor::h_integ Error: "<<tokens[0]<<" not an Histo"<<endl;
336 return;}
337h1->HInteg(norm);
338}
339
340/* methode */
341void PAWExecutor::h_deriv(vector<string>& tokens)
342// Pour remplacer le contenu d'un histo 1D par sa derivee
343{
344if(tokens.size()<1)
345 {cout<<"Usage: h/deriv nameh1d"<<endl; return;}
346NamedObjMgr omg;
347AnyDataObj* mobj = omg.GetObj(tokens[0]);
348if(mobj==NULL)
349 {cout<<"PAWExecutor::h_deriv Error: unknow object"<<tokens[0]<<endl;
350 return;}
351// attention: dynamic_cast<Histo*>(HProf)=Vrai!
352Histo* h1 = dynamic_cast<Histo*>(mobj);
353HProf* hp = dynamic_cast<HProf*>(mobj);
354if(hp || !h1)
355 {cout<<"PAWExecutor::h_deriv Error: "<<tokens[0]<<" not an Histo"<<endl;
356 return;}
357h1->HDeriv();
358}
359
360/* methode */
361void PAWExecutor::h_rebin(vector<string>& tokens)
362// Pour re-binner un histogramme 1D
363{
364if(tokens.size()<2)
365 {cout<<"Usage: h/rebin nameh1d nbin"<<endl; return;}
366NamedObjMgr omg;
367AnyDataObj* mobj = omg.GetObj(tokens[0]);
368if(mobj==NULL)
369 {cout<<"PAWExecutor::h_rebin Error: unknow object"<<tokens[0]<<endl;
370 return;}
371int nbin = atoi(tokens[1].c_str());
372Histo* h1 = dynamic_cast<Histo*>(mobj);
373// Ca marche aussi pour les HProf, HRebin a ete passe virtuel
374//HProf* hp = dynamic_cast<HProf*>(mobj); if(hp || !h1)
375if(!h1)
376 {cout<<"PAWExecutor::h_rebin Error: "<<tokens[0]<<" not an Histo"<<endl;
377 return;}
378h1->HRebin(nbin);
379}
380
381/* methode */
382void PAWExecutor::h_cadd(vector<string>& tokens)
383// Additionne une constante a un histogramme
384{
385if(tokens.size()<2)
386 {cout<<"Usage: h/cadd nameh1d val"<<endl; return;}
387NamedObjMgr omg;
388AnyDataObj* mobj = omg.GetObj(tokens[0]);
389if(mobj==NULL)
390 {cout<<"PAWExecutor::h_cadd Error: unknow object"<<tokens[0]<<endl;
391 return;}
392double val = atof(tokens[1].c_str());
393Histo* h1 = dynamic_cast<Histo*>(mobj);
394HProf* hp = dynamic_cast<HProf*>(mobj);
395Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
396if(h1 && !hp) *h1 += val;
397else if(h2) *h2 += val;
398else cout<<"PAWExecutor::h_cadd Error: "<<tokens[0]<<" not an Histo/Histo2D"<<endl;
399}
400
401/* methode */
402void PAWExecutor::h_cmult(vector<string>& tokens)
403// Multiplie un histogramme par une constante
404{
405if(tokens.size()<2)
406 {cout<<"Usage: h/cmult nameh1d val"<<endl; return;}
407NamedObjMgr omg;
408AnyDataObj* mobj = omg.GetObj(tokens[0]);
409if(mobj==NULL)
410 {cout<<"PAWExecutor::h_cmult Error: unknow object"<<tokens[0]<<endl;
411 return;}
412double val = atof(tokens[1].c_str());
413Histo* h1 = dynamic_cast<Histo*>(mobj);
414HProf* hp = dynamic_cast<HProf*>(mobj);
415Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
416if(h1 && !hp) *h1 *= val;
417else if(h2) *h2 *= val;
418else cout<<"PAWExecutor::h_cmult Error: "<<tokens[0]
419 <<" not an Histo/Histo2D"<<endl;
420}
421
422/* methode */
423void PAWExecutor::h_oper(vector<string>& tokens)
424// Equivalent h/oper/add sub,mul,div de paw
425// Operation entre 2 histogrammes
426// h/oper @ h1 h2 hres
427// hres = h1 @ h2 with @ = (+,-,*,/)
428{
429if(tokens.size()<4)
430 {cout<<"Usage: n/oper @ h1 h2 hres with @=(+,-,*,/)"<<endl;
431 return;}
432
433// Decode arguments
434const char * oper = tokens[0].c_str();
435if( oper[0]!='+' && oper[0]!='-' && oper[0]!='*' && oper[0]!='/' )
436 {cout<<"PAWExecutor::h_oper Error: unknow operation "<<oper<<endl;
437 return;}
438string h1name = tokens[1];
439string h2name = tokens[2];
440string h3name = tokens[3];
441
442// Get objects
443NamedObjMgr omg;
444AnyDataObj* mobjh1 = omg.GetObj(h1name);
445AnyDataObj* mobjh2 = omg.GetObj(h2name);
446if( mobjh1==NULL || mobjh2==NULL )
447 {cout<<"PAWExecutor::h_oper Error: unknow object(s) "<<h1name<<" or "<<h2name<<endl;
448 return;}
449AnyDataObj* mobjh3 = omg.GetObj(h3name);
450
451// Operations on HProf, only + is working
452if( dynamic_cast<HProf*>(mobjh1) != NULL ) {
453 if( oper[0]!='+' )
454 { cout<<"PAWExecutor::h_oper Error: operation "<<oper
455 <<" not implemented for HProf"<<endl; return;}
456 if( dynamic_cast<HProf*>(mobjh2) == NULL )
457 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
458 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
459 return;}
460 HProf* h1 =(HProf*) mobjh1;
461 HProf* h2 =(HProf*) mobjh2;
462 if( h1->NBins() != h2->NBins() )
463 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
464 <<h1->NBins()<<" "<<h2->NBins()<<endl; return;}
465 HProf* h3 = NULL;
466 if( mobjh3 == NULL ) { // l'objet n'existe pas, on le cree
467 h3 = new HProf(*h1); h3->Zero(); omg.AddObj(h3,h3name);
468 } else { // l'objet existe
469 h3 = dynamic_cast<HProf*>(mobjh3);
470 if(h3 == NULL) // ce n'est pas un HProf
471 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
472 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl;
473 return;}
474 if(h1->NBins() != h3->NBins())
475 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
476 <<h1->NBins()<<" "<<h3->NBins()<<endl; return;}
477 *h3 = *h1 + *h2;
478 h3->UpdateHisto();
479 }
480
481// Operations on Histo
482} else if( dynamic_cast<Histo*>(mobjh1) != NULL ) {
483 if( dynamic_cast<Histo*>(mobjh2) == NULL )
484 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
485 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
486 return;}
487 Histo* h1 =(Histo*) mobjh1;
488 Histo* h2 =(Histo*) mobjh2;
489 if( h1->NBins() != h2->NBins() )
490 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
491 <<h1->NBins()<<" "<<h2->NBins()<<endl; return;}
492 Histo* h3 = NULL;
493 if( mobjh3 == NULL ) { // l'objet n'existe pas, on le cree
494 h3 = new Histo(*h1); h3->Zero(); omg.AddObj(h3,h3name);
495 } else { // l'objet existe
496 h3 = dynamic_cast<Histo*>(mobjh3);
497 if(h3 == NULL) // ce n'est pas un Histo
498 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
499 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl;
500 return;}
501 if(h1->NBins() != h3->NBins())
502 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
503 <<h1->NBins()<<" "<<h3->NBins()<<endl; return;}
504 if( oper[0]=='+') *h3 = *h1 + *h2;
505 else if( oper[0]=='-') *h3 = *h1 - *h2;
506 else if( oper[0]=='*') *h3 = *h1 * *h2;
507 else if( oper[0]=='/') *h3 = *h1 / *h2;
508 }
509
510// Operations on Histo2D
511} else if( dynamic_cast<Histo2D*>(mobjh1) != NULL ) {
512 if( dynamic_cast<Histo2D*>(mobjh2) == NULL )
513 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h2\n"
514 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh2).name()<<endl;
515 return;}
516 Histo2D* h1 =(Histo2D*) mobjh1;
517 Histo2D* h2 =(Histo2D*) mobjh2;
518 if( h1->NBinX() != h2->NBinX() || h1->NBinY() != h2->NBinY() )
519 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h2 "
520 <<h1->NBinX()<<","<<h1->NBinY()<<" "
521 <<h2->NBinX()<<","<<h2->NBinY()<<endl; return;}
522 Histo2D* h3 = NULL;
523 if( mobjh3 == NULL ) { // l'objet n'existe pas, on le cree
524 h3 = new Histo2D(*h1); h3->Zero(); omg.AddObj(h3,h3name);
525 } else { // l'objet existe
526 h3 = dynamic_cast<Histo2D*>(mobjh3);
527 if(h3 == NULL) // ce n'est pas un Histo2D
528 {cout<<"PAWExecutor::h_oper Error: type mismatch between h1 and h3\n"
529 <<typeid(*mobjh1).name()<<" , "<<typeid(*mobjh3).name()<<endl;
530 return;}
531 if( h1->NBinX() != h3->NBinX() || h1->NBinY() != h3->NBinY() )
532 {cout<<"PAWExecutor::h_oper Error: size mismatch between h1, h3 "
533 <<h1->NBinX()<<","<<h1->NBinY()<<" "
534 <<h3->NBinX()<<","<<h3->NBinY()<<endl; return;}
535 if( oper[0]=='+') *h3 = *h1 + *h2;
536 else if( oper[0]=='-') *h3 = *h1 - *h2;
537 else if( oper[0]=='*') *h3 = *h1 * *h2;
538 else if( oper[0]=='/') *h3 = *h1 / *h2;
539 }
540
541// Doesn't work for other objects
542} else {
543 cout<<"PAWExecutor::h_oper Error: not implemented for "
544 <<typeid(*mobjh1).name()<<endl;
545 return;
546}
547
548return;
549}
550
551/* methode */
552void PAWExecutor::h_plot_2d(vector<string>& tokens)
553// plot for 2D histogramme: plot histo, bandx/y, slicex/y or projx/y
554{
555if(tokens.size()<1)
556 {cout<<"Usage: h/plot/2d nameh2d to_plot [n/s] [dopt]"<<endl; return;}
557string proj = "h"; if(tokens.size()>1) proj = tokens[1];
558NamedObjMgr omg;
559AnyDataObj* mobj = omg.GetObj(tokens[0]);
560if(mobj==NULL)
561 {cout<<"PAWExecutor::h_plot_2d Error: unknow object"<<tokens[0]<<endl;
562 return;}
563Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
564if(!h2)
565 {cout<<"PAWExecutor::h_plot_2d Error: "<<tokens[0]<<" not an Histo2D"<<endl;
566 return;}
567
568Histo* h1p = NULL; string nametoplot = "/autoc/h_plot_2d_h1";
569//AnyDataObj* mobjh1 = omg.GetObj(nametoplot);
570
571string dopt = ""; if(tokens.size()>=3) dopt = tokens[2];
572if(proj == "show") {
573 h2->ShowProj();
574 h2->ShowBand(2);
575 h2->ShowSli(2);
576 return;
577} else if(proj == "h") {
578 nametoplot = tokens[0];
579} else if(proj == "px") {
580 if((h1p=h2->HProjX())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
581 else {h2->ShowProj(); return;}
582} else if(proj == "py") {
583 if((h1p=h2->HProjY())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
584 else {h2->ShowProj(); return;}
585} else {
586 if(tokens.size()<3)
587 {cout<<"Usage: h/plot/2d nameh2d bx/by/sx/sy n [dopt]"<<endl; return;}
588 int n = atoi(tokens[2].c_str());
589 dopt = ""; if(tokens.size()>=4) dopt = tokens[3];
590 if(proj == "bx") {
591 if((h1p=h2->HBandX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
592 else {h2->ShowBand(); return;}
593 } else if(proj == "by") {
594 if((h1p=h2->HBandY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
595 else {h2->ShowBand(); return;}
596 } else if(proj == "sx") {
597 if((h1p=h2->HSliX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
598 else {h2->ShowSli(); return;}
599 } else if(proj == "sy") {
600 if((h1p=h2->HSliY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
601 else {h2->ShowSli(); return;}
602 }
603}
604
605omg.DisplayObj(nametoplot,dopt);
606}
607
608/* methode */
609int PAWExecutor::decodepawstring(string tokens,string& nameobj
610 ,string& xexp,string& yexp,string& zexp)
611// Decodage general de "nameobj.xexp"
612// "nameobj.yexp%xexp"
613// "nameobj.zexp%yexp%xexp"
614// Return: nombre de variables trouvees, -1 si probleme
615{
616nameobj = ""; xexp= ""; yexp= ""; zexp= "";
617
618int lt = (int) tokens.length();
619if(lt<=0) return -1;
620
621// decodage de la chaine de type PAW.
622char *str = new char[lt+2];
623strcpy(str,tokens.c_str()); strip(str,'B',' '); lt = strlen(str);
624//cout<<"chaine1["<<lt<<"] :"<<str<<":"<<endl;
625char *c[3] = {NULL,NULL,NULL};
626int i, np=0; bool namefound = false;
627for(i=0;i<lt;i++) {
628 if(!namefound && str[i]=='.') {
629 str[i]='\0';
630 namefound=true;
631 c[np] = str+i+1; np++;
632 }
633 if( namefound && str[i]=='%') {
634 str[i]='\0';
635 if(np<3) {c[np] = str+i+1; np++;}
636 }
637}
638//cout<<"chaine2 :"; for(i=0;i<lt;i++) cout<<str[i]; cout<<":"<<endl;
639
640// Remplissage du nom et des variables
641nameobj = str;
642if(np==1) xexp=c[0];
643if(np==2) {yexp=c[0]; xexp=c[1];}
644if(np==3) {zexp=c[0]; yexp=c[1]; xexp=c[2];}
645//cout<<"pawstring str,c[0-2] "<<str<<" "<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
646delete [] str;
647
648// Comptage des variables
649np = -1;
650if(nameobj.length()>0)
651 {np = 0; if(xexp.length()>0)
652 {np++; if(yexp.length()>0)
653 {np++; if(zexp.length()>0) np++;}}}
654cout<<"pawstring["<<np<<"] name="<<nameobj
655 <<" xexp="<<xexp<<" yexp="<<yexp<<" zexp="<<zexp<<endl;
656return np;
657}
658
659/* methode */
660void PAWExecutor::h_put_vec(vector<string>& tokens)
661// Pour remplir un histo avec le contenu d'un vecteur ou d'une matrice
662// L'histogramme doit deja exister. Le nombre de bins remplit
663// depend des tailles respectives des 2 objets.
664// tokens[2] = "cont" : on remplit les valeurs de l'histogramme (ou "!")
665// = "err2" : on remplit les erreurs de l'histogramme
666{
667if(tokens.size()<2)
668 {cout<<"Usage: h/put_vec namehisto namevector"<<endl;
669 return;}
670string toput = "cont"; if(tokens.size()>2) toput = tokens[2];
671if(toput=="!") toput = "cont";
672if(toput!="cont" && toput!="err2")
673 {cout<<"PAWExecutor::h_put_vec Error: unknow filling "<<toput<<endl;
674 return;}
675string hname = tokens[0];
676string vname = tokens[1];
677
678// Get objects
679NamedObjMgr omg;
680AnyDataObj* mobjh = omg.GetObj(hname);
681AnyDataObj* mobjv = omg.GetObj(vname);
682if( mobjh==NULL || mobjv==NULL )
683 {cout<<"PAWExecutor::h_put_vec Error: unknow object(s) "<<hname<<" or "<<vname<<endl;
684 return;}
685
686// Fill histo from vector
687if(typeid(*mobjh) == typeid(Histo) && typeid(*mobjv) == typeid(Vector)) {
688 Histo* h = dynamic_cast<Histo*>(mobjh);
689 Vector* v = dynamic_cast<Vector*>(mobjv);
690 if(toput=="cont") h->PutValue(*v);
691 else if(toput=="err2") h->PutError2(*v);
692
693} else if(typeid(*mobjh) == typeid(Histo2D) && typeid(*mobjv) == typeid(Matrix)) {
694 Histo2D* h = dynamic_cast<Histo2D*>(mobjh);
695 Matrix* v = dynamic_cast<Matrix*>(mobjv);
696 if(toput=="cont") h->PutValue(*v);
697 else if(toput=="err2") h->PutError2(*v);
698
699} else {
700 cout<<"PAWExecutor::h_put_vec Error: type mismatch between histogram and vector/matrix\n"
701 <<typeid(*mobjh).name()<<" , "<<typeid(*mobjv).name()<<endl;
702 return;
703}
704
705}
706
707/* methode */
708void PAWExecutor::h_get_vec(vector<string>& tokens)
709// Pour copier un histo dans un vecteur ou une matrice
710// Si le vecteur (matrice) n'existe pas, il est cree.
711// Le vecteur ou la matrice est re-dimensionne correctement.
712// tokens[2] = "cont" : on copie les valeurs de l'histogramme (ou "!")
713// = "err2" : on copie les erreurs de l'histogramme
714// = "absc" : on copie les erreurs de l'histogramme (1D only)
715// tokens[3[,4]] = show : show available projections for Histo2D
716// px : get X projection
717// py : get Y projection
718// bx n : get X band number n
719// by n : get Y band number n
720// sx n : get X slice number n
721// sy n : get Y slice number n
722{
723if(tokens.size()<2)
724 {cout<<"Usage: h/get_vec namehisto namevector"<<endl;
725 return;}
726string toget = "cont"; if(tokens.size()>2) toget = tokens[2];
727if(toget=="!") toget = "cont";
728if(toget!="cont" && toget!="err2" && toget!="absc")
729 {cout<<"PAWExecutor::h_get_vec Error: unknow filling "<<toget<<endl;
730 return;}
731string proj = "h"; if(tokens.size()>3) proj = tokens[3];
732int nproj = -1; if(tokens.size()>4) nproj = atoi(tokens[4].c_str());
733string hname = tokens[0];
734string vname = tokens[1];
735
736// Get objects
737NamedObjMgr omg;
738AnyDataObj* mobjh = omg.GetObj(hname);
739AnyDataObj* mobjv = omg.GetObj(vname);
740if( mobjh==NULL)
741 {cout<<"PAWExecutor::h_put_vec Error: unknow object(s) "<<hname<<endl;
742 return;}
743
744// Fill histo from vector
745Histo* h = dynamic_cast<Histo*>(mobjh);
746Histo2D* h2 = dynamic_cast<Histo2D*>(mobjh);
747if( h != NULL ) { // Histo ou HProf
748 HProf* hp = dynamic_cast<HProf*>(mobjh);
749 if(hp!=NULL) if(!(hp->IsOk())) hp->UpdateHisto();
750 Vector* v = NULL;
751 if(mobjv==NULL) // le vecteur n'existe pas
752 {v = new Vector(1); omg.AddObj(v,vname);}
753 AnyDataObj* mobjv = omg.GetObj(vname);
754 if(typeid(*mobjv) != typeid(Vector))
755 {cout<<"PAWExecutor::h_get_vec Error: type mismatch between Histo/HProf and vector\n"
756 <<typeid(*mobjv).name()<<endl; return;}
757 v = dynamic_cast<Vector*>(mobjv);
758 if(toget=="cont") h->GetValue(*v);
759 else if(toget=="err2") h->GetError2(*v);
760 else if(toget=="absc") h->GetAbsc(*v);
761
762} else if( h2 != NULL) { // Histo2D
763
764 if(proj == "h") { // On veut les valeurs de l'histogramme 2D
765 Matrix* v = NULL;
766 if(mobjv==NULL) // la matrice n'existe pas
767 {v = new Matrix(1,1); omg.AddObj(v,vname);}
768 AnyDataObj* mobjv = omg.GetObj(vname);
769 if(typeid(*mobjv) != typeid(Matrix))
770 {cout<<"PAWExecutor::h_get_vec Error: type mismatch between Histo2D and matrix\n"
771 <<typeid(*mobjv).name()<<endl; return;}
772 v = dynamic_cast<Matrix*>(mobjv);
773 if(toget=="cont") h2->GetValue(*v);
774 else if(toget=="err2") h2->GetError2(*v);
775 else
776 {cout<<"PAWExecutor::h_get_vec Error: option "<<toget<<" not valid for Histo2D"<<endl;
777 return;}
778
779 } else { // On veut les valeurs d'une projection de l'histo 2D
780 h = NULL;
781 if(proj == "show") {h2->ShowProj(); h2->ShowBand(2); h2->ShowSli(2);}
782 else if(proj == "px") h = h2->HProjX();
783 else if(proj == "py") h = h2->HProjY();
784 else if(proj == "bx") h = h2->HBandX(nproj);
785 else if(proj == "by") h = h2->HBandY(nproj);
786 else if(proj == "sx") h = h2->HSliX(nproj);
787 else if(proj == "sy") h = h2->HSliY(nproj);
788 if(h==NULL)
789 {cout<<"PAWExecutor::h_get_vec Error: unknown projection "<<proj
790 <<" number "<<nproj<<endl; return;}
791 Vector* v = NULL;
792 if(mobjv==NULL) // le vecteur n'existe pas
793 {v = new Vector(1); omg.AddObj(v,vname);}
794 AnyDataObj* mobjv = omg.GetObj(vname);
795 if(typeid(*mobjv) != typeid(Vector))
796 {cout<<"PAWExecutor::h_get_vec Error: type mismatch between Histo2D "<<proj
797 <<" and vector\n"<<typeid(*mobjv).name()<<endl; return;}
798 v = dynamic_cast<Vector*>(mobjv);
799 if(toget=="cont") h->GetValue(*v);
800 else if(toget=="err2") h->GetError2(*v);
801 else if(toget=="absc") h->GetAbsc(*v);
802 }
803
804} else {
805 cout<<"PAWExecutor::h_get_vec Error: type mismatch for histogram\n"
806 <<typeid(*mobjh).name()<<endl;
807 return;
808}
809
810}
811
812/* methode */
813void PAWExecutor::h_copy(vector<string>& tokens)
814// Pour copier un object dans un object
815// objects are Vector,Matrix,Histo,Histo2D
816// h/copy namefrom nametocopy [i1[:i2]] [j1[:j2]]
817// copy obj1Dfrom(i1->i2) into obj1Dto
818// copy obj2Dfrom(i1:j1->i2:j2) into obj2Dto
819// Attention: elements depuis i1 jusqu'a i2 COMPRIS
820{
821if(tokens.size()<2)
822 {cout<<"Usage: h_copy namefrom nametocopy [i1[:i2]] [j1[:j2]]"<<endl;
823 return;}
824
825NamedObjMgr omg;
826AnyDataObj* mobjv1 = omg.GetObj(tokens[0]);
827if( mobjv1==NULL)
828 {cout<<"PAWExecutor::h_copy Error: unknow object "<<tokens[0]<<endl;
829 return;}
830
831// Cas d'un Vector
832if(typeid(*mobjv1) == typeid(Vector)) {
833 Vector* v1 = dynamic_cast<Vector*>(mobjv1);
834 int_4 i1=0,i2=v1->NElts()-1;
835 if(tokens.size()>2) sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
836 if(i1<0) i1=0; if(i2>=(int_4)v1->NElts()) i2=v1->NElts()-1;
837 if(i2<i1)
838 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2<<"] for NElts="
839 <<v1->NElts()<<endl; return;}
840 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<") to "<<tokens[1]<<endl;
841 Vector* v2 = NULL;
842 AnyDataObj* mobjv2 = omg.GetObj(tokens[1]);
843 if(mobjv2==NULL)
844 {v2 = new Vector(i2-i1+1); omg.AddObj(v2,tokens[1]);}
845 mobjv2 = omg.GetObj(tokens[1]);
846 if(typeid(*mobjv2) != typeid(Vector))
847 {cout<<"PAWExecutor::h_copy Error: type mismatch for Vector "
848 <<typeid(*mobjv2).name()<<endl; return;}
849 v2 = dynamic_cast<Vector*>(mobjv2);
850 if(i2-i1+1>(int_4)v2->NElts())
851 {cout<<"PAWExecutor::h_copy Error: Vector to copy to small "
852 <<v2->NElts()<<endl; return;}
853 for(int i=i1,ii=0;i<=i2;i++,ii++) (*v2)(ii) = (*v1)(i);
854 return;
855}
856
857// Cas d'un Histo
858if(typeid(*mobjv1) == typeid(Histo)) {
859 Histo* v1 = dynamic_cast<Histo*>(mobjv1);
860 int_4 i1=0,i2=v1->NBins()-1;
861 if(tokens.size()>2) sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
862 if(i1<0) i1=0; if(i2>=(int_4)v1->NBins()) i2=v1->NBins()-1;
863 if(i2<i1)
864 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2<<"] for NBins="
865 <<v1->NBins()<<endl; return;}
866 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<") to "<<tokens[1]<<endl;
867 Histo* v2 = NULL;
868 AnyDataObj* mobjv2 = omg.GetObj(tokens[1]);
869 if(mobjv2==NULL)
870 {v2 = new Histo(0.,(float)(i2-i1+1),i2-i1+1); omg.AddObj(v2,tokens[1]);}
871 mobjv2 = omg.GetObj(tokens[1]);
872 if(typeid(*mobjv2) != typeid(Histo))
873 {cout<<"PAWExecutor::h_copy Error: type mismatch for Histo "
874 <<typeid(*mobjv2).name()<<endl; return;}
875 v2 = dynamic_cast<Histo*>(mobjv2);
876 if(i2-i1+1>(int_4)v2->NBins())
877 {cout<<"PAWExecutor::h_copy Error: Histo to copy to small "
878 <<v2->NBins()<<endl; return;}
879 for(int i=i1,ii=0;i<=i2;i++,ii++) (*v2)(ii) = (*v1)(i);
880 return;
881}
882
883// Cas d'une Matrix
884if(typeid(*mobjv1) == typeid(Matrix)) {
885 Matrix* v1 = dynamic_cast<Matrix*>(mobjv1);
886 int_4 i1=0,i2=v1->NRows()-1, j1=0,j2=v1->NCol()-1;
887 if(tokens.size()>2) if(tokens[2]!="!") sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
888 if(tokens.size()>3) sscanf(tokens[3].c_str(),"%d:%d",&j1,&j2);
889 if(i1<0) i1=0; if(i2>=(int_4)v1->NRows()) i2=v1->NRows()-1;
890 if(j1<0) j1=0; if(j2>=(int_4)v1->NCol()) j2=v1->NCol()-1;
891 if(i2<i1 || j2<j1)
892 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2
893 <<"] , ["<<j1<<":"<<j2<<"] for NRows,NCol="
894 <<v1->NRows()<<" , "<<v1->NCol()<<endl; return;}
895 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<","<<j1<<":"<<j2<<") to "<<tokens[1]<<endl;
896 Matrix* v2 = NULL;
897 AnyDataObj* mobjv2 = omg.GetObj(tokens[1]);
898 if(mobjv2==NULL)
899 {v2 = new Matrix(i2-i1+1,j2-j1+1); omg.AddObj(v2,tokens[1]);}
900 mobjv2 = omg.GetObj(tokens[1]);
901 if(typeid(*mobjv2) != typeid(Matrix))
902 {cout<<"PAWExecutor::h_copy Error: type mismatch for Matrix "
903 <<typeid(*mobjv2).name()<<endl; return;}
904 v2 = dynamic_cast<Matrix*>(mobjv2);
905 if(i2-i1+1>(int_4)v2->NRows() || j2-j1+1>(int_4)v2->NCol())
906 {cout<<"PAWExecutor::h_copy Error: Matrix to copy to small "
907 <<v2->NRows()<<","<<v2->NCol()<<endl; return;}
908 for(int i=i1,ii=0;i<=i2;i++,ii++)
909 for(int j=j1,jj=0;j<=j2;j++,jj++) (*v2)(ii,jj) = (*v1)(i,j);
910 return;
911}
912
913// Cas d'un Histo2D
914if(typeid(*mobjv1) == typeid(Histo2D)) {
915 Histo2D* v1 = dynamic_cast<Histo2D*>(mobjv1);
916 int_4 i1=0,i2=v1->NBinX()-1, j1=0,j2=v1->NBinY()-1;
917 if(tokens.size()>2) if(tokens[2]!="!") sscanf(tokens[2].c_str(),"%d:%d",&i1,&i2);
918 if(tokens.size()>3) sscanf(tokens[3].c_str(),"%d:%d",&j1,&j2);
919 if(i1<0) i1=0; if(i2>=(int_4)v1->NBinX()) i2=v1->NBinX()-1;
920 if(j1<0) j1=0; if(j2>=(int_4)v1->NBinY()) j2=v1->NBinY()-1;
921 if(i2<i1 || j2<j1)
922 {cout<<"PAWExecutor::h_copy Error: wrong range ["<<i1<<":"<<i2
923 <<"] , ["<<j1<<":"<<j2<<"] for NBinX,NBinY="
924 <<v1->NBinX()<<" , "<<v1->NBinY()<<endl; return;}
925 cout<<"copy "<<tokens[0]<<"("<<i1<<":"<<i2<<","<<j1<<":"<<j2<<") to "<<tokens[1]<<endl;
926 Histo2D* v2 = NULL;
927 AnyDataObj* mobjv2 = omg.GetObj(tokens[1]);
928 if(mobjv2==NULL)
929 {v2 = new Histo2D(0.,(float)(i2-i1+1),i2-i1+1,0.,(float)(j2-j1+1),j2-j1+1);
930 omg.AddObj(v2,tokens[1]);}
931 mobjv2 = omg.GetObj(tokens[1]);
932 if(typeid(*mobjv2) != typeid(Histo2D))
933 {cout<<"PAWExecutor::h_copy Error: type mismatch for Histo2D"
934 <<typeid(*mobjv2).name()<<endl; return;}
935 v2 = dynamic_cast<Histo2D*>(mobjv2);
936 if(i2-i1+1>(int_4)v2->NBinX() || j2-j1+1>(int_4)v2->NBinY())
937 {cout<<"PAWExecutor::h_copy Error: Histo2D to copy to small "
938 <<v2->NBinX()<<","<<v2->NBinY()<<endl; return;}
939 for(int i=i1,ii=0;i<=i2;i++,ii++)
940 for(int j=j1,jj=0;j<=j2;j++,jj++) (*v2)(ii,jj) = (*v1)(i,j);
941 return;
942}
943
944// Cas non prevu
945cout<<"PAWExecutor::h_copy Error: type mismatch for Vector/Matrix/Histo/Histo2D\n"
946 <<typeid(*mobjv1).name()<<endl;
947return;
948}
Note: See TracBrowser for help on using the repository browser.