inlib
1.2.0
|
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