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

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

h/copy cmv 13/7/00

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