/*************************************************** Created by: Venkat on Mon Aug 15 10:33:23 CDT 2005 ****************************************************/ #ifndef EFFICIENCY_HPP_ #define EFFICIENCY_HPP_ #include #include #include #include "eff_utils/EffInfo.hpp" #include "eff_utils/EffVal.hpp" namespace eff_utils { /* This is the genral efficiency clas. The specific one should inherit from it. See e.g. BinnedEfficiency class. */ class Efficiency { public: Efficiency(); // constructor with an input stream as input. Efficiency( std::istream & fstr, const EffInfo* request=0); virtual ~Efficiency(); bool isValid() const { return _isValid;} // return reference to EffInfo object (meta-data) const EffInfo & Info() const { return _spec;} // copy EffInfo object (meta-data) to the internal one void Info( const EffInfo & spec ) { _spec = spec;} // return object with bin information virtual EffVal Eff( float x) const=0; virtual EffVal Eff( float x, float y) const=0; virtual EffVal Eff( float x, float y, float z)const=0; // any number of dimensions virtual EffVal Eff( const std::vector& value) const=0; // return true if exactly matched request found in file bool isRequestInFile(std::istream& fp, const EffInfo* request) ; virtual void Clear() {_isValid = false ; _spec.Clear();} protected: EffInfo _spec; bool _isValid; virtual void stream( std::ostream & os ) const =0; void doStream( std::ostream & os ) const; virtual bool ParseInputLine( const std::string& , const std::vector & line ) { return false;} bool MakeEfficiency(std::istream& fstr, const EffInfo* request=0); private: // Other members // parser for istream object bool EffParse(std::istream& fstr, const EffInfo* request=0); bool Tokenize(const std::string &, std::string &, std::vector&, const std::string & delimiters = " "); // validation methods bool doValidateInput() const ; virtual bool ValidateInput() const { return true; } friend std::ostream & operator << (std::ostream& os, const Efficiency& s); }; } inline std::ostream& eff_utils::operator << (std::ostream& os, const eff_utils::Efficiency & s) { s.doStream(os); return os; } #endif // EFFICIENCY_HPP