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

Last change on this file since 1035 was 1035, checked in by ercodmgr, 25 years ago
  • creation comm newprofe pour profile avec erreur sur mean
  • correction petit bug n/plot pour increment nom histo 1d paw_n_plot1D_??? dans le cas ou on veut faire

"n/plot ..." puis "n/plot ... same"

cmv 7/6/2000

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