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_wroot_streamers 00005 #define inlib_wroot_streamers 00006 00007 #include "named" 00008 #include "date" 00009 #include "directory" 00010 #include "file" 00011 #include "../vmanip" //convert 00012 00013 #include "../histo/h1d" 00014 #include "../histo/h2d" 00015 //#include "../histo/h3d" 00016 #include "../histo/p1d" 00017 //#include "../histo/p2d" 00018 00019 namespace inlib { 00020 namespace wroot { 00021 00022 typedef histo::histo_data<double,unsigned int,double> hd_data; 00023 typedef histo::profile_data<double,unsigned int,double,double> pd_data; 00024 00025 inline bool AttAxis_stream(buffer& a_buffer) { 00026 int fNdivisions = 510; //Number of divisions(10000*n3 + 100*n2 + n1) 00027 short fAxisColor = 1; //color of the line axis 00028 short fLabelColor = 1; //color of labels 00029 short fLabelFont = 62; //font for labels 00030 float fLabelOffset = 0.005F; //offset of labels 00031 float fLabelSize = 0.04F; //size of labels 00032 float fTickLength = 0.03F; //length of tick marks 00033 float fTitleOffset = 1; //offset of axis title 00034 float fTitleSize = 0.04F; //size of axis title 00035 short fTitleColor = 1; //color of axis title 00036 short fTitleFont = 62; //font for axis title 00037 00038 // Version 4 streaming (ROOT/v3-00-6). 00039 unsigned int beg; 00040 if(!a_buffer.write_version(4,beg)) return false; 00041 00042 if(!a_buffer.write(fNdivisions)) return false; 00043 if(!a_buffer.write(fAxisColor)) return false; 00044 if(!a_buffer.write(fLabelColor)) return false; 00045 if(!a_buffer.write(fLabelFont)) return false; 00046 if(!a_buffer.write(fLabelOffset)) return false; 00047 if(!a_buffer.write(fLabelSize)) return false; 00048 if(!a_buffer.write(fTickLength)) return false; 00049 if(!a_buffer.write(fTitleOffset)) return false; 00050 if(!a_buffer.write(fTitleSize)) return false; 00051 if(!a_buffer.write(fTitleColor)) return false; 00052 if(!a_buffer.write(fTitleFont)) return false; 00053 00054 if(!a_buffer.set_byte_count(beg)) return false; 00055 return true; 00056 } 00057 00058 inline bool axis_stream(buffer& a_buffer, 00059 const histo::axis<double>& a_axis, 00060 const std::string& a_name) { 00061 // Version 6 streaming (ROOT/v3-00-6). 00062 00063 unsigned int beg; 00064 if(!a_buffer.write_version(6,beg)) return false; 00065 00066 {std::string title; 00067 if(!Named_stream(a_buffer,a_name,title)) return false;} 00068 00069 if(!AttAxis_stream(a_buffer)) return false; 00070 00071 if(!a_buffer.write(a_axis.bins())) return false; 00072 if(!a_buffer.write(a_axis.lower_edge())) return false; 00073 if(!a_buffer.write(a_axis.upper_edge())) return false; 00074 00075 // fXbins 00076 //if(a_axis.m_fixed) { 00077 // std::vector<double> v; 00078 // ArrayT<double> dummy(v); 00079 // if(!dummy.stream(a_buffer)) return false; //TArrayD 00080 //} else { 00081 if(!Array_stream(a_buffer,a_axis.edges())) return false; //TArrayD 00082 //} 00083 00084 if(!a_buffer.write((int)0)) return false; //fFirst 00085 if(!a_buffer.write((int)0)) return false; //fLast 00086 00087 //Bool_t 00088 if(!a_buffer.write((unsigned char)0)) return false; //TimeDisplay 00089 00090 //TString 00091 if(!a_buffer.write(std::string())) return false; //TimeFormat 00092 00093 if(!a_buffer.set_byte_count(beg)) return false; 00094 00095 return true; 00096 } 00097 00098 inline bool List_empty_stream(buffer& a_buffer) { 00099 unsigned int beg; 00100 if(!a_buffer.write_version(4,beg)) return false; 00101 if(!Object_stream(a_buffer)) return false; 00102 std::string name; 00103 if(!a_buffer.write(name)) return false; 00104 int nobjects = 0; 00105 if(!a_buffer.write(nobjects)) return false; 00106 if(!a_buffer.set_byte_count(beg)) return false; 00107 return true; 00108 } 00109 00110 inline bool TH_write_1D(buffer& a_buffer, 00111 const hd_data& a_data, 00112 const std::string& a_name) { 00113 00114 if(!a_buffer.write_version(3)) return false; 00115 00116 if(!Named_stream(a_buffer,a_name,a_data.m_title)) return false; 00117 00118 if(!AttLine_stream(a_buffer)) return false; 00119 if(!AttFill_stream(a_buffer)) return false; 00120 if(!AttMarker_stream(a_buffer)) return false; 00121 00122 if(!a_buffer.write((int)a_data.m_bin_number)) return false; 00123 00124 //fXAxis 00125 {//have a copy because of const. 00126 histo::axis<double> haxis(a_data.m_axes[0]); 00127 if(!axis_stream(a_buffer,haxis,"xaxis")) return false;} 00128 00129 if(a_data.m_dimension==2) { 00130 {histo::axis<double> haxis(a_data.m_axes[1]); 00131 if(!axis_stream(a_buffer,haxis,"yaxis")) return false;} 00132 00133 histo::axis<double> dummy; 00134 dummy.configure(1,0,1); 00135 if(!axis_stream(a_buffer,dummy,"zaxis")) return false; 00136 } else { 00137 histo::axis<double> dummy; 00138 dummy.configure(1,0,1); 00139 if(!axis_stream(a_buffer,dummy,"yaxis")) return false; 00140 if(!axis_stream(a_buffer,dummy,"zaxis")) return false; 00141 } 00142 00143 if(!a_buffer.write((short)(1000 * 0.25))) return false; //fBarOffset 00144 if(!a_buffer.write((short)(1000 * 0.5))) return false; //fBarWidth 00145 00146 if(!a_buffer.write((double)a_data.get_entries())) return false; 00147 if(!a_buffer.write(a_data.get_Sw())) return false; 00148 if(!a_buffer.write(a_data.get_Sw2())) return false; 00149 00150 {double value; 00151 a_data.get_ith_axis_Sxw(0,value); 00152 if(!a_buffer.write(value)) return false;} 00153 00154 {double value; 00155 a_data.get_ith_axis_Sx2w(0,value); 00156 if(!a_buffer.write(value)) return false;} 00157 00158 if(!a_buffer.write((double)-1111)) return false; //fMaximum 00159 if(!a_buffer.write((double)-1111)) return false; //fMinimum 00160 if(!a_buffer.write((double)0)) return false; //NormFactor 00161 00162 if(!Array_stream(a_buffer,std::vector<double>())) 00163 return false; //fContour TArrayD 00164 00165 if(!Array_stream(a_buffer,a_data.m_bin_Sw2)) return false; //fSumw2 TArrayD 00166 00167 // store annotation on fOption 00168 // but try to fool ROOT in order that it does not 00169 // understand fOption as.. ROOT options ! 00170 //{std::string opt = " "+fAnnotation; 00171 // opt[0] = 0; //awfull trick 00172 // if(!a_buffer.write(opt)) return false;} //TString fOption 00173 {std::string opt; 00174 if(!a_buffer.write(opt)) return false;} //TString fOption 00175 00176 if(!List_empty_stream(a_buffer)) return false; //Functions 00177 00178 return true; 00179 } 00180 00181 inline bool TH_write_2D(buffer& a_buffer, 00182 const hd_data& a_data, 00183 const std::string& a_name) { 00184 if(!a_buffer.write_version(3)) return false; 00185 if(!TH_write_1D(a_buffer,a_data,a_name)) return false; 00186 if(!a_buffer.write((double)1)) return false; //ScaleFactor 00187 00188 {double value; 00189 a_data.get_ith_axis_Sxw(1,value); 00190 if(!a_buffer.write(value)) return false;} 00191 00192 {double value; 00193 a_data.get_ith_axis_Sx2w(1,value); 00194 if(!a_buffer.write(value)) return false;} 00195 00196 if(!a_buffer.write((double)0)) return false; //Tsumwxy //FIXME. 00197 00198 return true; 00199 } 00200 00201 inline bool TH1F_stream(buffer& a_buffer, 00202 const histo::h1d& a_h, 00203 const std::string& a_name) { 00204 if(!a_buffer.write_version(1)) return false; 00205 hd_data data = a_h.get_histo_data(); 00206 if(!TH_write_1D(a_buffer,data,a_name)) return false; 00207 if(!Array_stream(a_buffer,convert<double,float>(data.m_bin_Sw))) 00208 return false; //TH1D::TArrayD::fArray 00209 return true; 00210 } 00211 00212 inline bool TH1D_stream(buffer& a_buffer, 00213 const histo::h1d& a_h, 00214 const std::string& a_name) { 00215 if(!a_buffer.write_version(1)) return false; 00216 hd_data data = a_h.get_histo_data(); 00217 if(!TH_write_1D(a_buffer,data,a_name)) return false; 00218 if(!Array_stream(a_buffer,data.m_bin_Sw)) return false; //fArray TArrayD 00219 return true; 00220 } 00221 00222 inline bool TH2F_stream(buffer& a_buffer, 00223 const histo::h2d& a_h, 00224 const std::string& a_name){ 00225 if(!a_buffer.write_version(3)) return false; 00226 hd_data data = a_h.get_histo_data(); 00227 if(!TH_write_2D(a_buffer,data,a_name)) return false; 00228 if(!Array_stream(a_buffer,convert<double,float>(data.m_bin_Sw))) 00229 return false; //fArray TArrayD 00230 return true; 00231 } 00232 00233 inline bool TH2D_stream(buffer& a_buffer, 00234 const histo::h2d& a_h, 00235 const std::string& a_name){ 00236 if(!a_buffer.write_version(3)) return false; 00237 hd_data data = a_h.get_histo_data(); 00238 if(!TH_write_2D(a_buffer,data,a_name)) return false; 00239 if(!Array_stream(a_buffer,data.m_bin_Sw)) return false; //fArray TArrayD 00240 return true; 00241 } 00242 00243 inline bool TProfile_stream(buffer& a_buffer, 00244 const histo::p1d& a_p, 00245 const std::string& a_name){ 00246 if(!a_buffer.write_version(3)) return false; 00247 00248 //WARNING : the mapping histo::p1d / TProfile is not obvious. 00249 //HCL::m_bin_Svw <---> TProfile::fArray 00250 //HCL::m_bin_Sv2w <---> TProfile::fSumw2 00251 //HCL::m_bin_Sw <---> TProfile::fBinEntries 00252 00253 pd_data data = a_p.get_histo_data(); 00254 //NOTE : histo.m_bin_Sw <---> TH1D::TArrayD::fArray 00255 // then have to copy histo.m_bin_Svw on histo.m_bin_Sw 00256 // before streaming. 00257 00258 //save histo.m_bin_Sw on a ::Rio::Array_double : 00259 std::vector<double> vbins; 00260 {unsigned int binn = data.m_bin_number; 00261 vbins.resize(binn); 00262 for(unsigned int index=0;index<binn;index++){ 00263 vbins[index] = data.m_bin_Sw[index]; 00264 }} 00265 00266 // copy histo.m_bin_Svw on histo.m_bin_Sw : 00267 data.m_bin_Sw = data.m_bin_Svw; 00268 00269 //WARNING : should create a valid Rio::TH1D::fHistogram 00270 // being a histo::h1d. 00271 // But the histo::p1d does not inherit histo::h1d. 00272 00273 histo::h1d h("",10,0,1); 00274 h.copy_from_data(data); 00275 h.update_fast_getters(); 00276 if(!TH1D_stream(a_buffer,h,a_name)) return false; 00277 00278 //TProfile specific : 00279 if(!Array_stream(a_buffer,vbins)) return false; //fBinEntries TArrayD 00280 00281 int errorMode = 0; 00282 if(!a_buffer.write(errorMode)) return false; 00283 if(!a_buffer.write(data.m_min_v)) return false; 00284 if(!a_buffer.write(data.m_max_v)) return false; 00285 00286 return true; 00287 } 00288 00289 }} 00290 00291 #endif