// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_osc_streamers #define tools_osc_streamers #include "iobj_const_visitor" #include "iobj_visitor" #include "histo/h1d" #include "histo/h2d" #include "histo/h3d" #include "histo/p1d" #include "histo/p2d" #include "vmanip" #include "sto" namespace tools { namespace osc { inline bool Axis_visit(iobj_const_visitor& a_v, const std::string& /*a_field*/, const histo::axis& a_axis){ //SLASH_STORE_BEGIN(BatchLab::Axis) int version = 1; if(!a_v.visit("fVersion",version)) return false; if(!a_v.visit("fOffset",a_axis.m_offset)) return false; if(!a_v.visit("fNumberOfBins",(int)a_axis.m_number_of_bins)) return false; if(!a_v.visit("fMinimumValue",a_axis.m_minimum_value)) return false; if(!a_v.visit("fMaximumValue",a_axis.m_maximum_value)) return false; if(!a_v.visit("fFixed",a_axis.m_fixed)) return false; if(!a_v.visit("fBinWidth",a_axis.m_bin_width)) return false; if(!a_v.visit("fEdges",a_axis.m_edges)) return false; //if(!a_v.end(*this)) return false; return true; } inline bool Axis_read(iobj_visitor& a_visitor, histo::axis& a_axis){ //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(!a_visitor.visit(a_axis.m_offset)) return false; {int nbin; if(!a_visitor.visit(nbin)) return false; a_axis.m_number_of_bins = nbin;} if(!a_visitor.visit(a_axis.m_minimum_value)) return false; if(!a_visitor.visit(a_axis.m_maximum_value)) return false; if(!a_visitor.visit(a_axis.m_fixed)) return false; if(!a_visitor.visit(a_axis.m_bin_width)) return false; if(!a_visitor.visit(a_axis.m_edges)) return false; //if(!a_visitor.end(*this)) return false; return true; } class Item : public virtual istorable { public: virtual bool visit(iobj_const_visitor& a_visitor) const { //if(!a_visitor.begin(*this,Item::s_class(),Item::s_visit)) return false; int version = 1; if(!a_visitor.visit("fVersion",version)) return false; if(!a_visitor.visit("fKey",fKey)) return false; if(!a_visitor.visit("fValue",fValue)) return false; if(!a_visitor.visit("fSticky",fSticky)) return false; //if(!a_visitor.end(*this)) return false; return true; } public: virtual bool read(iobj_visitor& a_visitor) { //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(!a_visitor.visit(fKey)) return false; if(!a_visitor.visit(fValue)) return false; if(!a_visitor.visit(fSticky)) return false; //if(!a_visitor.end(*this)) return false; return true; } public: Item(){} Item(const std::string& aKey,const std::string& aValue,bool aSticky) :fKey(aKey),fValue(aValue),fSticky(aSticky){} virtual ~Item(){} public: Item(const Item& aFrom) :istorable(aFrom) ,fKey(aFrom.fKey) ,fValue(aFrom.fValue) ,fSticky(aFrom.fSticky) {} Item& operator=(const Item& aFrom) { fKey = aFrom.fKey; fValue = aFrom.fValue; fSticky = aFrom.fSticky; return *this; } public: std::string fKey; std::string fValue; bool fSticky; }; template //T must inherit istorable. inline bool std_vector_visit(iobj_const_visitor& a_visitor, const std::string& /*a_field*/, const std::vector& a_vec) { //if(!a_visitor.begin(*this,"BatchLab::Vector<"+a_field+">",Vector::visit)) // return false; int version = 1; if(!a_visitor.visit("fVersion",version)) return false; unsigned int number = a_vec.size(); if(!a_visitor.visit("fSize",number)) return false; for(unsigned int index=0;index(index),elem)) return false; } //if(!a_visitor.end(*this)) return false; return true; } template inline bool std_vector_read(iobj_visitor& a_visitor, std::vector& a_vec) { a_vec.clear(); //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; unsigned int number; if(!a_visitor.visit(number)) return false; a_vec.resize(number); for(unsigned int index=0;index& a_items) { //if(!a_visitor.begin(*this,Annotation::s_class(),Annotation::s_visit)) // return false; int version = 1; if(!a_visitor.visit("fVersion",version)) return false; if(!std_vector_visit(a_visitor,"fItems",a_items)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool Annotation_read(iobj_visitor& a_visitor) { //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; std::vector fItems; if(!std_vector_read(a_visitor,fItems)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline void map2vec(const std::map& a_in, std::vector& a_out) { a_out.clear(); std::map::const_iterator it; for(it=a_in.begin();it!=a_in.end();++it) { a_out.push_back(Item((*it).first,(*it).second,false)); } } typedef histo::histo_data hd_data; inline bool BaseHistogram_visit(const hd_data& aData, iobj_const_visitor& a_visitor) { //SLASH_STORE_BEGIN(BatchLab::BaseHistogram) int version = 1; if(!a_visitor.visit("fVersion",version)) return false; //if(!a_visitor.visit("fAnnotation",fAnnotation)) return false; std::vector items; map2vec(aData.m_annotations,items); if(!Annotation_visit(a_visitor,items)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool BaseHistogram_read(iobj_visitor& a_visitor){ //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(!Annotation_read(a_visitor)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool visitHistogram(const hd_data& aData, iobj_const_visitor& a_visitor){ if(!a_visitor.visit("fTitle",aData.m_title)) return false; if(!a_visitor.visit("fDimension",(int)aData.m_dimension)) return false; if(!a_visitor.visit("fBinNumber",(int)aData.m_bin_number)) return false; if(!a_visitor.visit("fBinEntries", convert(aData.m_bin_entries))) return false; if(!a_visitor.visit("fBinSw",aData.m_bin_Sw)) return false; if(!a_visitor.visit("fBinSw2",aData.m_bin_Sw2)) return false; if(!a_visitor.visit("fBinSxw",aData.m_bin_Sxw)) return false; if(!a_visitor.visit("fBinSx2w",aData.m_bin_Sx2w)) return false; {for(unsigned int iaxis=0;iaxis(iaxis); //BatchLab::Axis axis; //axis.copy(aData.m_axes[iaxis]); //if(!a_visitor.visit(name,axis)) return false; if(!Axis_visit(a_visitor,name,aData.m_axes[iaxis])) return false; }} {int dummy = 0; if(!a_visitor.visit("fMode",dummy)) return false;} //m_mode if(!a_visitor.visit("fProfile",false)) return false; {std::vector dummy; if(!a_visitor.visit("fBinSvw",dummy)) return false; if(!a_visitor.visit("fBinSv2w",dummy)) return false;} if(!a_visitor.visit("fCutV",false)) return false; {double dummy = 0; if(!a_visitor.visit("fMinV",dummy)) return false; if(!a_visitor.visit("fMaxV",dummy)) return false;} // Not written : //aData.fDoubles //aData.fInts return true; } inline bool readHistogram(hd_data& aData,iobj_visitor& a_visitor){ if(!a_visitor.visit(aData.m_title)) return false; {int dim; if(!a_visitor.visit(dim)) return false; aData.m_dimension = dim;} {int nbin; if(!a_visitor.visit(nbin)) return false; aData.m_bin_number = nbin;} {std::vector vec; if(!a_visitor.visit(vec)) return false; aData.m_bin_entries = convert(vec);} if(!a_visitor.visit(aData.m_bin_Sw)) return false; if(!a_visitor.visit(aData.m_bin_Sw2)) return false; if(!a_visitor.visit(aData.m_bin_Sxw)) return false; if(!a_visitor.visit(aData.m_bin_Sx2w)) return false; aData.m_axes.clear(); for(unsigned int iaxis=0;iaxis baxis; if(!Axis_read(a_visitor,baxis)) return false; aData.m_axes.push_back(baxis); } {int dummy; if(!a_visitor.visit(dummy)) return false;} //m_mode {bool dummy; if(!a_visitor.visit(dummy)) return false;} //m_is_profile {std::vector dummy; if(!a_visitor.visit(dummy)) return false;} //m_bin_Svw {std::vector dummy; if(!a_visitor.visit(dummy)) return false;} //m_bin_Sv2w {bool dummy; if(!a_visitor.visit(dummy)) return false;} //m_cut_v {double dummy; if(!a_visitor.visit(dummy)) return false;} //aData.m_min_v {double dummy; if(!a_visitor.visit(dummy)) return false;} //aData.m_max_v //aData.fDoubles //aData.fInts //aData.m_coords.resize(aData.m_dimension,0); //aData.m_ints.resize(aData.m_dimension,0); return true; } inline bool visit(iobj_const_visitor& a_visitor, const histo::h1d& a_histo) { //SLASH_STORE_BEGIN(BatchLab::Histogram1D) int version = 1; if(!a_visitor.visit("fVersion",version)) return false; if(!BaseHistogram_visit(a_histo.get_histo_data(),a_visitor)) return false; if(!visitHistogram(a_histo.get_histo_data(),a_visitor)) return false; //if(!a_visitor.visit("fAxis",fAxis)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool read(iobj_visitor& a_visitor,histo::h1d& a_histo){ //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(version!=1) { //this may come from an unexpected byteswap. a_visitor.out() << "tools::osc::read :" << " unexpected version " << version << std::endl; return false; } if(!BaseHistogram_read(a_visitor)) return false; hd_data hdata; if(!readHistogram(hdata,a_visitor)) return false; a_histo.copy_from_data(hdata); //fAxis.copy(fHistogram.get_axis(0)); //if(!a_visitor.end(*this)) return false; a_histo.update_fast_getters(); return true; } inline bool visit(iobj_const_visitor& a_visitor, const histo::h2d& a_histo) { //SLASH_STORE_BEGIN(BatchLab::Histogram2D) int version = 1; if(!a_visitor.visit("fVersion",version)) return false; if(!BaseHistogram_visit(a_histo.get_histo_data(),a_visitor)) return false; if(!visitHistogram(a_histo.get_histo_data(),a_visitor)) return false; //if(!a_visitor.visit("fAxisX",fAxisX)) return false; //if(!a_visitor.visit("fAxisY",fAxisY)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool read(iobj_visitor& a_visitor,histo::h2d& a_histo){ //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(version!=1) { //this may come from an unexpected byteswap. a_visitor.out() << "tools::osc::read :" << " unexpected version " << version << std::endl; return false; } if(!BaseHistogram_read(a_visitor)) return false; hd_data hdata; if(!readHistogram(hdata,a_visitor)) return false; a_histo.copy_from_data(hdata); //fAxisX.copy(fHistogram.get_axis(0)); //fAxisY.copy(fHistogram.get_axis(1)); //if(!a_visitor.end(*this)) return false; a_histo.update_fast_getters(); return true; } inline bool visit(iobj_const_visitor& a_visitor, const histo::h3d& a_histo) { //SLASH_STORE_BEGIN(BatchLab::Histogram3D) int version = 1; if(!a_visitor.visit("fVersion",version)) return false; if(!BaseHistogram_visit(a_histo.get_histo_data(),a_visitor)) return false; if(!visitHistogram(a_histo.get_histo_data(),a_visitor)) return false; //if(!a_visitor.visit("fAxisX",fAxisX)) return false; //if(!a_visitor.visit("fAxisY",fAxisY)) return false; //if(!a_visitor.visit("fAxisZ",fAxisY)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool read(iobj_visitor& a_visitor,histo::h3d& a_histo){ //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(version!=1) { //this may come from an unexpected byteswap. a_visitor.out() << "tools::osc::read :" << " unexpected version " << version << std::endl; return false; } if(!BaseHistogram_read(a_visitor)) return false; hd_data hdata; if(!readHistogram(hdata,a_visitor)) return false; a_histo.copy_from_data(hdata); //fAxisX.copy(fHistogram.get_axis(0)); //fAxisY.copy(fHistogram.get_axis(1)); //fAxisZ.copy(fHistogram.get_axis(2)); //if(!a_visitor.end(*this)) return false; a_histo.update_fast_getters(); return true; } typedef histo::profile_data pd_data; inline bool visitProfile(const pd_data& aData, iobj_const_visitor& a_visitor){ if(!a_visitor.visit("fTitle",aData.m_title)) return false; if(!a_visitor.visit("fDimension",(int)aData.m_dimension)) return false; if(!a_visitor.visit("fBinNumber",(int)aData.m_bin_number)) return false; if(!a_visitor.visit("fBinEntries", convert(aData.m_bin_entries))) return false; if(!a_visitor.visit("fBinSw",aData.m_bin_Sw)) return false; if(!a_visitor.visit("fBinSw2",aData.m_bin_Sw2)) return false; if(!a_visitor.visit("fBinSxw",aData.m_bin_Sxw)) return false; if(!a_visitor.visit("fBinSx2w",aData.m_bin_Sx2w)) return false; for(unsigned int iaxis=0;iaxis(iaxis); //BatchLab::Axis axis; //axis.copy(aData.m_axes[iaxis]); //if(!a_visitor.visit(name,axis)) return false; if(!Axis_visit(a_visitor,name,aData.m_axes[iaxis])) return false; } {int dummy = 0; if(!a_visitor.visit("fMode",dummy)) return false;} //m_mode if(!a_visitor.visit("fProfile",true)) return false; if(!a_visitor.visit("fBinSvw",aData.m_bin_Svw)) return false; if(!a_visitor.visit("fBinSv2w",aData.m_bin_Sv2w)) return false; if(!a_visitor.visit("fCutV",aData.m_cut_v)) return false; if(!a_visitor.visit("fMinV",aData.m_min_v)) return false; if(!a_visitor.visit("fMaxV",aData.m_max_v)) return false; // Not written : //aData.fDoubles //aData.fInts return true; } inline bool readProfile(pd_data& aData,iobj_visitor& a_visitor){ if(!a_visitor.visit(aData.m_title)) return false; {int dim; if(!a_visitor.visit(dim)) return false; aData.m_dimension = dim;} {int nbin; if(!a_visitor.visit(nbin)) return false; aData.m_bin_number = nbin;} {std::vector vec; if(!a_visitor.visit(vec)) return false; aData.m_bin_entries = convert(vec);} if(!a_visitor.visit(aData.m_bin_Sw)) return false; if(!a_visitor.visit(aData.m_bin_Sw2)) return false; if(!a_visitor.visit(aData.m_bin_Sxw)) return false; if(!a_visitor.visit(aData.m_bin_Sx2w)) return false; aData.m_axes.clear(); for(unsigned int iaxis=0;iaxis baxis; if(!Axis_read(a_visitor,baxis)) return false; aData.m_axes.push_back(baxis); } {int dummy; if(!a_visitor.visit(dummy)) return false;} //m_mode if(!a_visitor.visit(aData.m_is_profile)) return false; if(!a_visitor.visit(aData.m_bin_Svw)) return false; if(!a_visitor.visit(aData.m_bin_Sv2w)) return false; if(!a_visitor.visit(aData.m_cut_v)) return false; if(!a_visitor.visit(aData.m_min_v)) return false; if(!a_visitor.visit(aData.m_max_v)) return false; // Not written : //aData.fDoubles //aData.fInts //aData.m_coords.resize(aData.m_dimension,0); //aData.m_ints.resize(aData.m_dimension,0); return true; } inline bool visit(iobj_const_visitor& a_visitor, const histo::p1d& a_histo) { //SLASH_STORE_BEGIN(BatchLab::Profile1D) int version = 1; if(!a_visitor.visit("fVersion",version)) return false; if(!BaseHistogram_visit(a_histo.get_histo_data(),a_visitor)) return false; if(!visitProfile(a_histo.get_histo_data(),a_visitor)) return false; //if(!a_visitor.visit("fAxis",fAxis)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool read(iobj_visitor& a_visitor,histo::p1d& a_histo){ //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(version!=1) { //this may come from an unexpected byteswap. a_visitor.out() << "tools::osc::read :" << " unexpected version " << version << std::endl; return false; } if(!BaseHistogram_read(a_visitor)) return false; pd_data hdata; if(!readProfile(hdata,a_visitor)) return false; a_histo.copy_from_data(hdata); //fAxis.copy(fHistogram.get_axis(0)); //if(!a_visitor.end(*this)) return false; a_histo.update_fast_getters(); return true; } inline bool visit(iobj_const_visitor& a_visitor, const histo::p2d& a_histo) { //SLASH_STORE_BEGIN(BatchLab::Profile2D) int version = 1; if(!a_visitor.visit("fVersion",version)) return false; if(!BaseHistogram_visit(a_histo.get_histo_data(),a_visitor)) return false; if(!visitProfile(a_histo.get_histo_data(),a_visitor)) return false; //if(!a_visitor.visit("fAxisX",fAxisX)) return false; //if(!a_visitor.visit("fAxisY",fAxisY)) return false; //if(!a_visitor.end(*this)) return false; return true; } inline bool read(iobj_visitor& a_visitor,histo::p2d& a_histo){ //if(!a_visitor.begin(*this)) return false; int version; if(!a_visitor.visit(version)) return false; if(version!=1) { //this may come from an unexpected byteswap. a_visitor.out() << "tools::osc::read :" << " unexpected version " << version << std::endl; return false; } if(!BaseHistogram_read(a_visitor)) return false; pd_data hdata; if(!readProfile(hdata,a_visitor)) return false; a_histo.copy_from_data(hdata); //fAxisX.copy(a_histo.get_axis(0)); //fAxisY.copy(a_histo.get_axis(1)); //if(!a_visitor.end(*this)) return false; a_histo.update_fast_getters(); return true; } inline const std::string& s_h1d() { static const std::string s_v("BatchLab::Histogram1D"); return s_v; } inline const std::string& s_h2d() { static const std::string s_v("BatchLab::Histogram2D"); return s_v; } inline const std::string& s_h3d() { static const std::string s_v("BatchLab::Histogram3D"); return s_v; } inline const std::string& s_p1d() { static const std::string s_v("BatchLab::Profile1D"); return s_v; } inline const std::string& s_p2d() { static const std::string s_v("BatchLab::Profile2D"); return s_v; } }} #endif