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

Last change on this file since 545 was 545, checked in by ercodmgr, 26 years ago

modifs TVector/TMatrix pour compil Planck - Reza 3/11/99

File size: 14.7 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 "histos.h"
10#include "histos2.h"
11#include "hisprof.h"
12#include "ntuple.h"
13
14#include "pawexecut.h"
15#include "nobjmgr.h"
16#include "servnobjm.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
29/* methode */
30PAWExecutor::PAWExecutor(PIACmd *piac, PIStdImgApp* app)
31: mApp(app)
32{
33string kw, usage;
34string hgrp = "pawCmd";
35
36kw = "reset";
37usage = "Reset histograms vectors or matrix";
38usage += "\n reset nameobj";
39piac->RegisterCommand(kw,usage,this,hgrp);
40
41kw = "n/plot";
42usage = "Plot NTuple variables a la paw";
43usage += "\n n/plot nameobj.x_exp [cut] [w_exp] [loop] [gratt]";
44usage += "\n n/plot nameobj.y_exp%x_exp [cut] [loop] [gratt]";
45usage += "\n n/plot nameobj.z_exp%y_exp%x_exp [cut] [loop] [gratt]";
46usage += "\n for default use ! , loop=i1[:i2[:di]]";
47usage += "\n Related commands: plot2dw plot3d";
48piac->RegisterCommand(kw,usage,this,hgrp);
49
50kw = "n/proj";
51usage = "Project NTuple in histogram (1D or 2D) a la paw";
52usage += "\n n/proj nameproj nameobj.x_exp [cut] [w_exp] [loop] [gratt]";
53usage += "\n n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [loop] [gratt]";
54usage += "\n for default use ! , loop=i1[:i2[:di]]";
55usage += "\n Related commands: projh1d projh2d projprof";
56piac->RegisterCommand(kw,usage,this,hgrp);
57
58kw = "h/integ";
59usage = "Integrate a 1D histogram or profile";
60usage += "\n h/integ nameh1d [norm]";
61usage += "\n Related commands: h/deriv";
62piac->RegisterCommand(kw,usage,this,hgrp);
63
64kw = "h/deriv";
65usage = "Derivate a 1D histogram or profile";
66usage += "\n h/deriv nameh1d";
67usage += "\n Related commands: h/integ";
68piac->RegisterCommand(kw,usage,this,hgrp);
69
70kw = "h/rebin";
71usage = "Rebin a 1D histogram or profile";
72usage += "\n h/rebin nbin";
73piac->RegisterCommand(kw,usage,this,hgrp);
74
75kw = "h/cadd";
76usage = "Add a constant to an histogramme";
77usage += "\n h/cadd val";
78usage += "\n Related commands: h/cmult";
79piac->RegisterCommand(kw,usage,this,hgrp);
80
81kw = "h/cmult";
82usage = "Multiply an histogramme by a constant";
83usage += "\n h/cmult val";
84usage += "\n Related commands: h/cadd";
85piac->RegisterCommand(kw,usage,this,hgrp);
86
87kw = "h/plot/2d";
88usage = "Specific plot for 2D histogrammes";
89usage += "\n h/plot/2d nameh2d show : infos on 2D histogramme";
90usage += "\n h/plot/2d nameh2d h [dopt] : plot 2D histogramme";
91usage += "\n h/plot/2d nameh2d px [dopt] : plot X projection";
92usage += "\n h/plot/2d nameh2d py [dopt] : plot Y projection";
93usage += "\n h/plot/2d nameh2d bx n [dopt] : plot X band number n";
94usage += "\n h/plot/2d nameh2d by n [dopt] : plot Y band number n";
95usage += "\n h/plot/2d nameh2d sx n [dopt] : plot X slice number n";
96usage += "\n h/plot/2d nameh2d sy n [dopt] : plot Y slice number n";
97usage += "\n n < 0 means Show Info";
98piac->RegisterCommand(kw,usage,this,hgrp);
99}
100
101/* methode */
102PAWExecutor::~PAWExecutor()
103{
104}
105
106/* methode */
107int PAWExecutor::Execute(string& kw, vector<string>& tokens)
108{
109if(kw == "reset") {
110 reset(tokens); return(0);
111} else if(kw == "n/plot") {
112 n_plot(tokens); return(0);
113} else if(kw == "n/proj") {
114 n_proj(tokens); return(0);
115} else if(kw == "h/integ") {
116 h_integ(tokens); return(0);
117} else if(kw == "h/deriv") {
118 h_deriv(tokens); return(0);
119} else if(kw == "h/rebin") {
120 h_rebin(tokens); return(0);
121} else if(kw == "h/cadd") {
122 h_cadd(tokens); return(0);
123} else if(kw == "h/cmult") {
124 h_cmult(tokens); return(0);
125} else if(kw == "h/plot/2d") {
126 h_plot_2d(tokens); return(0);
127} else return(1);
128}
129
130/* methode */
131void PAWExecutor::reset(vector<string>& tokens)
132// Reset d'histogrammes, vecteurs et matrices
133{
134if(tokens.size() < 1)
135 {cout<<"Usage: reset nameobj"<<endl; return;}
136NamedObjMgr omg;
137AnyDataObj* mobj = omg.GetObj(tokens[0]);
138if(mobj == NULL)
139 {cout<<"PAWExecutor::reset Error , Pas d'objet de nom "<<tokens[0]<<endl;
140 return;}
141string ctyp = typeid(*mobj).name();
142
143#ifdef SANS_EVOLPLANCK
144if(typeid(*mobj)==typeid(Vector)) {Vector* ob=(Vector*) mobj; ob->Zero();}
145else if(typeid(*mobj)==typeid(Matrix)) {Matrix* ob=(Matrix*) mobj; ob->Zero();}
146#else
147if(typeid(*mobj)==typeid(Vector)) {Vector* ob=(Vector*) mobj; ob->Reset(0.);}
148else if(typeid(*mobj)==typeid(Matrix)) {Matrix* ob=(Matrix*) mobj; ob->Reset(0.);}
149#endif
150else if(typeid(*mobj)==typeid(Histo)) {Histo* ob=(Histo*) mobj; ob->Zero();}
151else if(typeid(*mobj)==typeid(HProf)) {HProf* ob=(HProf*) mobj; ob->Zero();}
152else if(typeid(*mobj)==typeid(Histo2D)) {Histo2D* ob=(Histo2D*)mobj; ob->Zero();}
153else {
154 cout<<"PAWExecutor::reset Error , No reset possible on "<<ctyp<<endl;
155 return;
156}
157
158return;
159}
160
161/* methode */
162void PAWExecutor::n_plot(vector<string>& tokens)
163// Equivalent n/plot de paw
164// Plot 1D
165// n/plot nameobj.x_exp [cut] [w_exp] [gratt]
166// Plot 2D (plot2dw)
167// n/plot nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
168// Plot 3D (plot3d)
169// n/plot nameobj.z_exp%y_exp%x_exp [cut] [gratt]
170{
171if(tokens.size() < 1) {
172 cout
173 <<"Usage: n/plot nameobj.x_exp [cut] [w_exp] [loop] [gratt]"<<endl
174 <<" n/plot nameobj.y_exp%x_exp [cut] [loop] [gratt]"<<endl
175 <<" n/plot nameobj.z_exp%y_exp%x_exp [cut] [loop] [gratt]"<<endl
176 <<" for default use ! , loop=i1[:i2[:di]]"<<endl;
177 return;
178}
179string nameobj,expx,expy,expz;
180int nvar = decodepawstring(tokens[0],nameobj,expx,expy,expz);
181string expcut = "1"; string expwt = "1."; string loop = ""; string dopt = "";
182if(tokens.size()>=2) expcut = tokens[1]; if(expcut=="!") expcut="1";
183
184NamedObjMgr omg;
185Services2NObjMgr* srvo = omg.GetServiceObj();
186
187if(nvar<=0) {
188 cout<<"PAWExecutor::n_plot Error: bad coding "<<tokens[0]<<endl;
189} else if(nvar==1) { // c'est un plot 1D
190 if(tokens.size()>=3) expwt = tokens[2]; if(expwt=="!") expwt="1.";
191 if(tokens.size()>=4) loop = tokens[3]; if(loop=="!") loop="";
192 if(tokens.size()>=5) dopt = tokens[4];
193 string nameproj = "/autoc/paw_n_plot1D";
194 AnyDataObj* mobj = omg.GetObj(nameproj);
195 if(mobj!=NULL) omg.DelObj(nameproj);
196 srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
197} else if(nvar==2) { // c'est un plot 2D
198 if(tokens.size()>=3) loop = tokens[2]; if(loop=="!") loop="";
199 if(tokens.size()>=4) dopt = tokens[3];
200 string err = "";
201 srvo->DisplayPoints2D(nameobj,expx,expy,err,err,expcut,dopt,loop);
202} else { // c'est un plot 3D
203 if(tokens.size()>=3) loop = tokens[2]; if(loop=="!") loop="";
204 if(tokens.size()>=4) dopt = tokens[3];
205 srvo->DisplayPoints3D(nameobj,expx,expy,expz,expcut,dopt,loop);
206}
207
208return;
209}
210
211/* methode */
212void PAWExecutor::n_proj(vector<string>& tokens)
213// Equivalent n/proj de paw
214// Project NTuple in histogram a la paw
215// Dans un Histo 1D
216// n/proj nameproj nameobj.x_exp [cut] [w_exp] [gratt]
217// Dans un Histo 2D ou un HProf (dans ce cas nameproj doit etre cree).
218// n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
219{
220if(tokens.size()<2)
221 {cout<<"Usage: n/proj nameproj nameobj.[y_exp%]x_exp [cut] [w_exp] [loop] [gratt]"<<endl
222 <<" for default use ! , loop=i1[:i2[:di]]"<<endl; return;}
223string nameproj = tokens[0];
224string nameobj,expx,expy,expz;
225int nvar = decodepawstring(tokens[1],nameobj,expx,expy,expz);
226string expcut = "1"; string expwt = "1."; string loop = ""; string dopt = "";
227if(tokens.size()>=3) expcut = tokens[2]; if(expcut=="!") expcut="1";
228if(tokens.size()>=4) expwt = tokens[3]; if(expwt=="!") expwt="1.";
229if(tokens.size()>=5) loop = tokens[4]; if(loop=="!") loop="";
230if(tokens.size()>=6) dopt = tokens[5];
231
232NamedObjMgr omg;
233Services2NObjMgr* srvo = omg.GetServiceObj();
234
235if(nvar<=0) {
236 cout<<"PAWExecutor::n_proj Error: bad coding "<<tokens[1]<<endl;
237} else if(nvar==1) {
238 // c'est une projection dans un histo 1D
239 srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
240} else {
241 // c'est une projection dans un histo2D
242 // OU un HProf si nameproj est HProf un deja defini
243 AnyDataObj* mobj = omg.GetObj(nameproj);
244 if(mobj==NULL)
245 srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
246 else if(dynamic_cast<HProf*>(mobj))
247 srvo->ProjectHProf(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
248 else
249 srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
250}
251
252return;
253}
254
255/* methode */
256void PAWExecutor::h_integ(vector<string>& tokens)
257// Pour remplacer le contenu d'un histo 1D par son integrale
258{
259if(tokens.size()<1)
260 {cout<<"Usage: h/integ nameh1d [norm]"<<endl; return;}
261NamedObjMgr omg;
262AnyDataObj* mobj = omg.GetObj(tokens[0]);
263if(mobj==NULL)
264 {cout<<"PAWExecutor::h_integ Error: unknow object"<<tokens[0]<<endl;
265 return;}
266double norm = 1.;
267if(tokens.size()>=2) norm = atof(tokens[1].c_str());
268Histo* h1 = dynamic_cast<Histo*>(mobj);
269// Le HProf se fait tout seul avec Histo: dynamic_cast<Histo*>(HProf)=Vrai!
270//HProf* hp = dynamic_cast<HProf*>(mobj);
271if(h1) h1->HInteg(norm);
272//else if(hp) hp->HInteg(norm);
273else cout<<"PAWExecutor::h_integ Error: "<<tokens[0]<<" not an Histo/HProf"<<endl;
274}
275
276/* methode */
277void PAWExecutor::h_deriv(vector<string>& tokens)
278// Pour remplacer le contenu d'un histo 1D par sa derivee
279{
280if(tokens.size()<1)
281 {cout<<"Usage: h/deriv nameh1d"<<endl; return;}
282NamedObjMgr omg;
283AnyDataObj* mobj = omg.GetObj(tokens[0]);
284if(mobj==NULL)
285 {cout<<"PAWExecutor::h_deriv Error: unknow object"<<tokens[0]<<endl;
286 return;}
287Histo* h1 = dynamic_cast<Histo*>(mobj);
288//HProf* hp = dynamic_cast<HProf*>(mobj);
289if(h1) h1->HDeriv();
290//else if(hp) hp->HDeriv();
291else cout<<"PAWExecutor::h_deriv Error: "<<tokens[0]<<" not an Histo/HProf"<<endl;
292}
293
294/* methode */
295void PAWExecutor::h_rebin(vector<string>& tokens)
296// Pour re-binner un histogramme 1D
297{
298if(tokens.size()<2)
299 {cout<<"Usage: h/rebin nameh1d nbin"<<endl; return;}
300NamedObjMgr omg;
301AnyDataObj* mobj = omg.GetObj(tokens[0]);
302if(mobj==NULL)
303 {cout<<"PAWExecutor::h_rebin Error: unknow object"<<tokens[0]<<endl;
304 return;}
305int nbin = atoi(tokens[1].c_str());
306Histo* h1 = dynamic_cast<Histo*>(mobj);
307//HProf* hp = dynamic_cast<HProf*>(mobj);
308if(h1) h1->HRebin(nbin);
309//else if(hp) hp->HRebin(nbin);
310else cout<<"PAWExecutor::h_rebin Error: "<<tokens[0]<<" not an Histo/HProf"<<endl;
311}
312
313/* methode */
314void PAWExecutor::h_cadd(vector<string>& tokens)
315// Additionne une constante a un histogramme
316{
317if(tokens.size()<2)
318 {cout<<"Usage: h/cadd nameh1d val"<<endl; return;}
319NamedObjMgr omg;
320AnyDataObj* mobj = omg.GetObj(tokens[0]);
321if(mobj==NULL)
322 {cout<<"PAWExecutor::h_cadd Error: unknow object"<<tokens[0]<<endl;
323 return;}
324double val = atof(tokens[1].c_str());
325Histo* h1 = dynamic_cast<Histo*>(mobj);
326Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
327if(h1) *h1 += val;
328else if(h2) *h2 += val;
329else cout<<"PAWExecutor::h_cadd Error: "<<tokens[0]<<" not an Histo/HProf/Histo2D"<<endl;
330}
331
332/* methode */
333void PAWExecutor::h_cmult(vector<string>& tokens)
334// Multiplie un histogramme par une constante
335{
336if(tokens.size()<2)
337 {cout<<"Usage: h/cmult nameh1d val"<<endl; return;}
338NamedObjMgr omg;
339AnyDataObj* mobj = omg.GetObj(tokens[0]);
340if(mobj==NULL)
341 {cout<<"PAWExecutor::h_cmult Error: unknow object"<<tokens[0]<<endl;
342 return;}
343double val = atof(tokens[1].c_str());
344Histo* h1 = dynamic_cast<Histo*>(mobj);
345Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
346if(h1) *h1 *= val;
347else if(h2) *h2 *= val;
348else cout<<"PAWExecutor::h_cmult Error: "<<tokens[0]
349 <<" not an Histo/HProf/Histo2D"<<endl;
350}
351
352/* methode */
353void PAWExecutor::h_plot_2d(vector<string>& tokens)
354// plot for 2D histogramme: plot histo, bandx/y, slicex/y or projx/y
355{
356if(tokens.size()<2)
357 {cout<<"Usage: h/plot/2d nameh2d to_plot [n/s] [dopt]"<<endl; return;}
358NamedObjMgr omg;
359AnyDataObj* mobj = omg.GetObj(tokens[0]);
360if(mobj==NULL)
361 {cout<<"PAWExecutor::h_plot_2d Error: unknow object"<<tokens[0]<<endl;
362 return;}
363Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
364if(!h2)
365 {cout<<"PAWExecutor::h_plot_2d Error: "<<tokens[0]<<" not an Histo2D"<<endl;
366 return;}
367
368Histo* h1p = NULL; string nametoplot = "/autoc/h_plot_2d_h1";
369AnyDataObj* mobjh1 = omg.GetObj(nametoplot);
370if(mobjh1!=NULL) omg.DelObj(nametoplot);
371
372string dopt = ""; if(tokens.size()>=3) dopt = tokens[2];
373if(tokens[1] == "show") {
374 h2->ShowProj();
375 h2->ShowBand(2);
376 h2->ShowSli(2);
377 return;
378} else if(tokens[1] == "h") {
379 nametoplot = tokens[0];
380} else if(tokens[1] == "px") {
381 if((h1p=h2->HProjX())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
382 else {h2->ShowProj(); return;}
383} else if(tokens[1] == "py") {
384 if((h1p=h2->HProjY())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
385 else {h2->ShowProj(); return;}
386} else {
387 if(tokens.size()<3)
388 {cout<<"Usage: h/plot/2d nameh2d bx/by/sx/sy n [dopt]"<<endl; return;}
389 int n = atoi(tokens[2].c_str());
390 dopt = ""; if(tokens.size()>=4) dopt = tokens[3];
391 if(tokens[1] == "bx") {
392 if((h1p=h2->HBandX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
393 else {h2->ShowBand(); return;}
394 } else if(tokens[1] == "by") {
395 if((h1p=h2->HBandY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
396 else {h2->ShowBand(); return;}
397 } else if(tokens[1] == "sx") {
398 if((h1p=h2->HSliX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
399 else {h2->ShowSli(); return;}
400 } else if(tokens[1] == "sy") {
401 if((h1p=h2->HSliY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
402 else {h2->ShowSli(); return;}
403 }
404}
405
406omg.DisplayObj(nametoplot,dopt);
407}
408
409/* methode */
410int PAWExecutor::decodepawstring(string tokens,string& nameobj
411 ,string& xexp,string& yexp,string& zexp)
412// Decodage general de "nameobj.xexp"
413// "nameobj.yexp%xexp"
414// "nameobj.zexp%yexp%xexp"
415// Return: nombre de variables trouvees, -1 si probleme
416{
417nameobj = ""; xexp= ""; yexp= ""; zexp= "";
418
419int lt = (int) tokens.length();
420if(lt<=0) return -1;
421
422// decodage de la chaine de type PAW.
423char *str = new char[lt+2];
424strcpy(str,tokens.c_str()); strip(str,'B',' '); lt = strlen(str);
425//cout<<"chaine1["<<lt<<"] :"<<str<<":"<<endl;
426char *c[3] = {NULL,NULL,NULL};
427int i, np=0; bool namefound = false;
428for(int i=0;i<lt;i++) {
429 if(!namefound && str[i]=='.') {
430 str[i]='\0';
431 namefound=true;
432 c[np] = str+i+1; np++;
433 }
434 if( namefound && str[i]=='%') {
435 str[i]='\0';
436 if(np<3) {c[np] = str+i+1; np++;}
437 }
438}
439//cout<<"chaine2 :"; for(i=0;i<lt;i++) cout<<str[i]; cout<<":"<<endl;
440
441// Remplissage du nom et des variables
442nameobj = str;
443if(np==1) xexp=c[0];
444if(np==2) {yexp=c[0]; xexp=c[1];}
445if(np==3) {zexp=c[0]; yexp=c[1]; xexp=c[2];}
446//cout<<"pawstring str,c[0-2] "<<str<<" "<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
447delete [] str;
448
449// Comptage des variables
450np = -1;
451if(nameobj.length()>0)
452 {np = 0; if(xexp.length()>0)
453 {np++; if(yexp.length()>0)
454 {np++; if(zexp.length()>0) np++;}}}
455cout<<"pawstring["<<np<<"] name="<<nameobj
456 <<" xexp="<<xexp<<" yexp="<<yexp<<" zexp="<<zexp<<endl;
457return np;
458}
Note: See TracBrowser for help on using the repository browser.