inlib  1.2.0
/Users/barrand/private/dev/softinex/old/inexlib-1.2/inlib/inlib/sg/h2plot
Go to the documentation of this file.
00001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
00002 // See the file inlib.license for terms.
00003 
00004 #ifndef inlib_sg_h2plot
00005 #define inlib_sg_h2plot
00006 
00007 // Connexion inlib/histo to sg/plotter.
00008 
00009 // Inheritance :
00010 #include "plottable"
00011 
00012 #include "../histo/h1d"
00013 #include "../histo/h2d"
00014 #include "../histo/p1d"
00015 #include "../histo/p2d"
00016 
00017 #include "../smanip"
00018 
00019 namespace inlib {
00020 namespace sg {
00021 
00022 class h1d2plot : public virtual bins1D {
00023 public:
00024   static const std::string& s_class() {
00025     static const std::string s_v("inlib::sg::h1d2plot");
00026     return s_v;
00027   }
00028 public:
00029   virtual void* cast(const std::string& a_class) const {
00030     if(void* p = inlib::cmp_cast<h1d2plot>(this,a_class)) {return p;}
00031     return bins1D::cast(a_class);
00032   }
00033 public: //plottable
00034   virtual plottable* copy() const {return new h1d2plot(*this);}
00035   virtual bool is_valid() const {return true;}
00036   virtual std::string name(){return m_name;}
00037   virtual void set_name(const std::string& a_s) {m_name = a_s;}
00038 
00039   virtual std::string title(){return m_data.title();}
00040   virtual std::string legend(){return m_legend;}
00041   virtual void set_legend(const std::string& a_s) {m_legend = a_s;}
00042 
00043   virtual std::string infos(const std::string& a_opts){
00044     std::string f_lf("\n");
00045     std::string sinfos;
00046     std::vector<std::string> words;
00047     inlib::words(a_opts," ",false,words);
00048     std::vector<std::string>::const_iterator it;
00049   
00050     bool show_fit_ndf = false;
00051    {for(it=words.begin();it!=words.end();++it) {
00052       if((*it)=="fit_ndf") {show_fit_ndf = true;break;}
00053     }}
00054 
00055     for(it=words.begin();it!=words.end();++it) {
00056       if(((*it)=="name") && m_name.size()) {
00057         if(sinfos.size()) sinfos += f_lf;
00058         sinfos += "Name";
00059         sinfos += f_lf;
00060         sinfos += m_name;
00061   
00062       } else if((*it)=="entries") {
00063         if(sinfos.size()) sinfos += f_lf;
00064         sinfos += "Entries";
00065         sinfos += f_lf;
00066         sinfos += inlib::to<int>(m_data.all_entries());
00067   
00068       } else if((*it)=="mean") {
00069         if(sinfos.size()) sinfos += f_lf;
00070         sinfos += "Mean";
00071         sinfos += f_lf;
00072         sinfos += inlib::to<double>(m_data.mean());
00073   
00074       } else if((*it)=="rms") {
00075         if(sinfos.size()) sinfos += f_lf;
00076         sinfos += "RMS";
00077         sinfos += f_lf;
00078         sinfos += inlib::to<double>(m_data.rms());
00079   
00080       } else if((*it)=="underflow") {
00081         if(sinfos.size()) sinfos += f_lf;
00082         sinfos += "UDFLW";
00083         sinfos += f_lf;
00084         sinfos += inlib::to<double>
00085           (m_data.bin_height(inlib::histo::axis<double>::UNDERFLOW_BIN));
00086   
00087       } else if((*it)=="overflow") {
00088         if(sinfos.size()) sinfos += f_lf;
00089         sinfos += "OVFLW";
00090         sinfos += f_lf;
00091         sinfos += inlib::to<double>
00092           (m_data.bin_height(inlib::histo::axis<double>::OVERFLOW_BIN));
00093   
00094   
00095 /*
00096       } else if((*it)=="fit_quality") {
00097         //look in m_data annotations for "fit.chi2" and "fit.ndf" keys :
00098         if(show_fit_ndf) {
00099           std::string schi2;
00100           std::string sndf;
00101           if(m_data.annotation("fit.chi2",schi2) &&
00102              m_data.annotation("fit.ndf",sndf)   ){
00103             if(sinfos.size()) sinfos += f_lf;
00104             sinfos += "[h]^2! / ndf";
00105             sinfos += f_lf; 
00106             sinfos += schi2;
00107             sinfos += " / "; 
00108             sinfos += sndf;
00109           }
00110         } else { //show chi2 only.
00111           std::string schi2;
00112           if(m_data.annotation("fit.chi2",schi2)){
00113             if(sinfos.size()) sinfos += f_lf;
00114             sinfos += "[h]^2!";
00115             sinfos += f_lf;
00116             sinfos += schi2;
00117           }
00118         }
00119 
00120       } else if((*it)=="fit_parameters") {
00121         //look in m_data annotations for "fit.param.<name>" keys :
00122         typedef std::map<std::string,std::string> annots_t;
00123         const annots_t& annots = m_data.annotations();
00124         annots_t::const_iterator it;
00125         for(it=annots.begin();it!=annots.end();++it) {
00126           const std::string& key = (*it).first;
00127           if(key.substr(0,10)=="fit.param.") { 
00128             //fit.param.mean 14
00129             //01234567890123
00130             std::string name = key.substr(10,key.size()-10);
00131             if(sinfos.size()) sinfos += f_lf;
00132             sinfos += name;
00133             sinfos += f_lf;
00134             sinfos += (*it).second;
00135           }
00136         }
00137 */
00138       }
00139     }
00140   
00141     return sinfos;
00142   }
00143 public: //bins1D
00144   virtual void bins_Sw_range(float& a_mn,float& a_mx) const {
00145     a_mn = (float)m_data.min_bin_height();
00146     a_mx = (float)m_data.max_bin_height();
00147   }
00148   virtual unsigned int bins() const {return m_data.axis().bins();}
00149   virtual float axis_min() const {
00150     return (float)m_data.axis().lower_edge();
00151   }
00152   virtual float axis_max() const {
00153     return (float)m_data.axis().upper_edge();
00154   }
00155   virtual float bin_lower_edge(int aI) const {
00156     return (float)m_data.axis().bin_lower_edge(aI);
00157   }
00158   virtual float bin_upper_edge(int aI) const {
00159     return (float)m_data.axis().bin_upper_edge(aI);
00160   }
00161 
00162   virtual unsigned int bin_entries(int aI) const {
00163     return m_data.bin_entries(aI);
00164   }
00165 
00166   virtual float bin_Sw(int aI) const {
00167     return (float)m_data.bin_height(aI);
00168   }
00169 
00170   virtual float bin_error(int aI) const {
00171     return (float)m_data.bin_error(aI);
00172   }
00173   virtual bool is_profile() const {return false;}
00174 public:
00175   h1d2plot(const inlib::histo::h1d& a_data)
00176   :m_data(a_data)
00177   {}
00178   virtual ~h1d2plot(){}
00179 protected:
00180   h1d2plot(const h1d2plot& a_from)
00181   :plottable(a_from),bins1D(a_from)
00182   ,m_data(a_from.m_data)
00183   ,m_name(a_from.m_name)
00184   ,m_legend(a_from.m_legend)
00185   {}  
00186 private:
00187   h1d2plot& operator=(const h1d2plot&){return *this;}
00188 private:
00189   const inlib::histo::h1d& m_data;
00190   std::string m_name;
00191   std::string m_legend;
00192 };
00193 
00194 class h2d2plot : public virtual bins2D {
00195 public:
00196   static const std::string& s_class() {
00197     static const std::string s_v("inlib::sg::h2d2plot");
00198     return s_v;
00199   }
00200 public:
00201   virtual void* cast(const std::string& a_class) const {
00202     if(void* p = inlib::cmp_cast<h2d2plot>(this,a_class)) {return p;}
00203     return bins2D::cast(a_class);
00204   }
00205 public: //plottable
00206   virtual plottable* copy() const {return new h2d2plot(*this);}
00207   virtual bool is_valid() const {return true;}
00208   virtual std::string name(){return m_name;}
00209   virtual void set_name(const std::string& a_s) {m_name = a_s;}
00210   virtual std::string title(){return m_data.title();}
00211   virtual std::string legend(){return m_legend;}
00212   virtual void set_legend(const std::string& a_s) {m_legend = a_s;}
00213 
00214   virtual std::string infos(const std::string& a_opts){
00215     std::string f_lf("\n");
00216     std::string sinfos;
00217     std::vector<std::string> words;
00218     inlib::words(a_opts," ",false,words);
00219     std::vector<std::string>::const_iterator it;
00220     for(it=words.begin();it!=words.end();++it) {
00221       if(((*it)=="name") && m_name.size()) {
00222         if(sinfos.size()) sinfos += f_lf;
00223         sinfos += "Name\n";
00224         sinfos += m_name;
00225   
00226       } else if((*it)=="entries") {
00227         if(sinfos.size()) sinfos += f_lf;
00228         sinfos += "Entries\n";
00229         sinfos += inlib::to<int>(m_data.all_entries());
00230 
00231       } else if((*it)=="mean") {
00232         if(sinfos.size()) sinfos += f_lf;
00233         sinfos += "MeanX\n";
00234         sinfos += inlib::to<double>(m_data.mean_x());
00235         sinfos += f_lf;
00236         sinfos += "MeanY\n";
00237         sinfos += inlib::to<double>(m_data.mean_y());
00238 
00239       } else if((*it)=="rms") {
00240         if(sinfos.size()) sinfos += f_lf;
00241         sinfos += "RMS X\n";
00242         sinfos += inlib::to<double>(m_data.rms_x());
00243         sinfos += f_lf;
00244         sinfos += "RMS Y\n";
00245         sinfos += inlib::to<double>(m_data.rms_y());
00246   
00247       }
00248     }
00249   
00250     return sinfos;
00251   }
00252 public: //bins2D
00253   virtual void bins_Sw_range(float& a_mn,float& a_mx) const {
00254     a_mn = (float)m_data.min_bin_height();
00255     a_mx = (float)m_data.max_bin_height();
00256   }
00257   virtual unsigned int x_bins() const {return m_data.axis_x().bins();}
00258   virtual unsigned int y_bins() const {return m_data.axis_y().bins();}
00259   virtual float x_axis_min() const {return (float)m_data.axis_x().lower_edge();}
00260   virtual float x_axis_max() const {return (float)m_data.axis_x().upper_edge();}
00261   virtual float y_axis_min() const {return (float)m_data.axis_y().lower_edge();}
00262   virtual float y_axis_max() const {return (float)m_data.axis_y().upper_edge();}
00263 
00264   virtual float bin_lower_edge_x(int aI) const {
00265     return (float)m_data.axis_x().bin_lower_edge(aI);
00266   }
00267   virtual float bin_upper_edge_x(int aI) const {
00268     return (float)m_data.axis_x().bin_upper_edge(aI);
00269   }
00270   virtual float bin_lower_edge_y(int aI) const {
00271     return (float)m_data.axis_y().bin_lower_edge(aI);
00272   }
00273   virtual float bin_upper_edge_y(int aI) const {
00274     return (float)m_data.axis_y().bin_upper_edge(aI);
00275   }
00276 
00277   virtual unsigned int bin_entries(int aI,int aJ) const {
00278     return m_data.bin_entries(aI,aJ);
00279   }
00280 
00281   virtual float bin_Sw(int aI,int aJ) const {
00282     return (float)m_data.bin_height(aI,aJ);
00283   }
00284 
00285   virtual float bin_error(int aI,int aJ) const {
00286     return (float)m_data.bin_error(aI,aJ);
00287   }
00288 public:
00289   h2d2plot(const inlib::histo::h2d& a_data)
00290   :m_data(a_data)
00291   {}
00292   virtual ~h2d2plot(){}
00293 protected:
00294   h2d2plot(const h2d2plot& a_from)
00295   :plottable(a_from),bins2D(a_from)
00296   ,m_data(a_from.m_data)
00297   ,m_name(a_from.m_name)
00298   ,m_legend(a_from.m_legend)
00299   {}
00300 private:
00301   h2d2plot& operator=(const h2d2plot&){return *this;}
00302 private:
00303   const inlib::histo::h2d& m_data;
00304   std::string m_name;
00305   std::string m_legend;
00306 };
00307 
00308 //NOTE : for the moment, same code as h1d2plot !
00309 class p1d2plot : public virtual bins1D {
00310 public:
00311   static const std::string& s_class() {
00312     static const std::string s_v("inlib::sg::p1d2plot");
00313     return s_v;
00314   }
00315 public:
00316   virtual void* cast(const std::string& a_class) const {
00317     if(void* p = inlib::cmp_cast<p1d2plot>(this,a_class)) {return p;}
00318     return bins1D::cast(a_class);
00319   }
00320 public:
00321   virtual plottable* copy() const {return new p1d2plot(*this);}
00322   virtual bool is_valid() const {return true;}
00323   virtual std::string name(){return m_name;}
00324   virtual void set_name(const std::string& a_s) {m_name = a_s;}
00325   virtual std::string title(){return m_data.title();}
00326   virtual std::string legend(){return m_legend;}
00327   virtual void set_legend(const std::string& a_s) {m_legend = a_s;}
00328 
00329   virtual std::string infos(const std::string& a_opts){
00330     std::string f_lf("\n");
00331     std::string sinfos;
00332     std::vector<std::string> words;
00333     inlib::words(a_opts," ",false,words);
00334     std::vector<std::string>::const_iterator it;
00335     for(it=words.begin();it!=words.end();++it) {
00336       if(((*it)=="name") && m_name.size()) {
00337         if(sinfos.size()) sinfos += f_lf;
00338         sinfos += "Name\n";
00339         sinfos += m_name;
00340   
00341       } else if((*it)=="entries") {
00342         if(sinfos.size()) sinfos += f_lf;
00343         sinfos += "Entries\n";
00344         sinfos += inlib::to<int>(m_data.all_entries());
00345       } else if((*it)=="mean") {
00346         if(sinfos.size()) sinfos += f_lf;
00347         sinfos += "Mean\n";
00348         sinfos += inlib::to<double>(m_data.mean());
00349       } else if((*it)=="rms") {
00350         if(sinfos.size()) sinfos += f_lf;
00351         sinfos += "RMS\n";
00352         sinfos += inlib::to<double>(m_data.rms());
00353   
00354       }
00355     }
00356   
00357     return sinfos;
00358   }
00359 public:
00360   virtual unsigned int bins() const {return m_data.axis().bins();}
00361 
00362   virtual void bins_Sw_range(float& a_mn,float& a_mx) const {
00363     a_mn = (float)m_data.min_bin_height();
00364     a_mx = (float)m_data.max_bin_height();
00365   }
00366 
00367   virtual float axis_min() const {
00368     return (float)m_data.axis().lower_edge();
00369   }
00370   virtual float axis_max() const {
00371     return (float)m_data.axis().upper_edge();
00372   }
00373   virtual float bin_lower_edge(int aI) const {
00374     return (float)m_data.axis().bin_lower_edge(aI);
00375   }
00376   virtual float bin_upper_edge(int aI) const {
00377     return (float)m_data.axis().bin_upper_edge(aI);
00378   }
00379 
00380   virtual unsigned int bin_entries(int aI) const {
00381     return m_data.bin_entries(aI);
00382   }
00383 
00384   virtual float bin_Sw(int aI) const {
00385     return (float)m_data.bin_height(aI);
00386   }
00387 
00388   virtual float bin_error(int aI) const {
00389     return (float)m_data.bin_error(aI);
00390   }
00391 
00392   virtual bool is_profile() const {return true;}
00393 public:
00394   p1d2plot(const inlib::histo::p1d& a_data)
00395   :m_data(a_data)
00396   {}
00397   virtual ~p1d2plot(){}
00398 protected:
00399   p1d2plot(const p1d2plot& a_from)
00400   :plottable(a_from),bins1D(a_from)
00401   ,m_data(a_from.m_data)
00402   ,m_name(a_from.m_name)
00403   ,m_legend(a_from.m_legend)
00404   {}  
00405 private:
00406   p1d2plot& operator=(const p1d2plot&){return *this;}
00407 private:
00408   const inlib::histo::p1d& m_data;
00409   std::string m_name;
00410   std::string m_legend;
00411 };
00412 
00413 /*
00414 class p2d2plot : public virtual SbPlottableBins2D {
00415 public:
00416   static const std::string& s_class() {
00417     static const std::string s_v("inlib::sg::p2d2plot");
00418     return s_v;
00419   }
00420 public:
00421   virtual void* cast(const std::string& a_class) const {
00422     if(void* p = inlib::cmp_cast<p2d2plot>(this,a_class)) {return p;}
00423     return bins2D::cast(a_class);
00424   }
00425 public: //SbPlottableObject
00426   virtual bool is_valid() const {return true;}
00427   virtual const char* name(){return m_name;}
00428   virtual const char* legend(){return m_legend;}
00429 private:
00430   std::string m_name;
00431   std::string m_legend;
00432 public:
00433   virtual int getDimension() const{return 2;}
00434   virtual const char* title(){return m_data.title();}
00435 public: //SbPlottableBins2D
00436   virtual void getBinsSumOfWeightsRange(float& a_mn,float& a_mx) const {
00437     a_mn = (float)m_data.min_bin_height();
00438     a_mx = (float)m_data.max_bin_height();
00439   }
00440   virtual int getAxisNumberOfBinsX() const {return m_data.axis_x().bins();}
00441   virtual int getAxisNumberOfBinsY() const {return m_data.axis_y().bins();}
00442   virtual float getAxisMinimumX() const {return (float)m_data.axis_x().lower_edge();}
00443   virtual float getAxisMaximumX() const {return (float)m_data.axis_x().upper_edge();}
00444   virtual float getAxisMinimumY() const {return (float)m_data.axis_y().lower_edge();}
00445   virtual float getAxisMaximumY() const {return (float)m_data.axis_y().upper_edge();}
00446   virtual float getBinLowerEdgeX(int aI) const {
00447     return (float)m_data.axis_x().bin_lower_edge(aI);
00448   }
00449   virtual float bin_upper_edgeX(int aI) const {
00450     return (float)m_data.axis_x().bin_upper_edge(aI);
00451   }
00452   virtual float getBinLowerEdgeY(int aI) const {
00453     return (float)m_data.axis_y().bin_lower_edge(aI);
00454   }
00455   virtual float bin_upper_edgeY(int aI) const {
00456     return (float)m_data.axis_y().bin_upper_edge(aI);
00457   }
00458   virtual int getBinNumberOfEntries(int aI,int aJ) const {
00459     return m_data.bin_entries(aI,aJ);
00460   }
00461   virtual float getBinSumOfWeights(int aI,int aJ) const {
00462     return (float)m_data.bin_height(aI,aJ);
00463   }
00464   virtual float getBinBar(int aI,int aJ) const {
00465     return (float)m_data.bin_error(aI,aJ);
00466   }
00467 
00468   virtual std::string infos(const std::string& a_opts){
00469     std::string f_lf("\n");
00470     std::string sinfos;
00471     std::vector<std::string> words;
00472     inlib::words(a_opts," ",false,words);
00473     std::vector<std::string>::const_iterator it;
00474     for(it=words.begin();it!=words.end();++it) {
00475       if(((*it)=="name") && m_name.size()) {
00476         if(sinfos.size()) sinfos += f_lf;
00477         sinfos += "Name\n";
00478         sinfos += m_name;
00479   
00480       } else if((*it)=="entries") {
00481         if(sinfos.size()) sinfos += f_lf;
00482         sinfos += "Entries\n";
00483         sinfos += inlib::to<int>(m_data.all_entries());
00484       } else if((*it)=="mean") {
00485         if(sinfos.size()) sinfos += f_lf;
00486         sinfos += "MeanX\n";
00487         sinfos += inlib::to<double>(m_data.mean_x());
00488         sinfos += f_lf;
00489         sinfos += "MeanY\n";
00490         sinfos += inlib::to<double>(m_data.mean_y());
00491       } else if((*it)=="rms") {
00492         if(sinfos.size()) sinfos += f_lf;
00493         sinfos += "RMS X\n";
00494         sinfos += inlib::to<double>(m_data.rms_x());
00495         sinfos += f_lf;
00496         sinfos += "RMS Y\n";
00497         sinfos += inlib::to<double>(m_data.rms_y());
00498   
00499       }
00500     }
00501   
00502     return sinfos;
00503   }
00504 
00505 public:
00506   p2d2plot(const inlib::histo::p2d& a_data)
00507   :m_data(a_data)
00508   {}
00509   virtual ~p2d2plot(){}
00510 protected:
00511   p2d2plot(const p2d2plot& a_from)
00512   :m_name(a_from.m_name),m_data(a_from.m_data){}  
00513 private:
00514   p2d2plot& operator=(const p2d2plot&){return *this;}
00515 private:
00516   const inlib::histo::p2d& m_data;
00517 };
00518 */
00519 
00520 }}
00521 
00522 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines