diff --git a/Core/PythonAPI/inc/ConstKBinAxis.pypp.h b/Core/PythonAPI/inc/ConstKBinAxis.pypp.h new file mode 100644 index 0000000000000000000000000000000000000000..13f436406463c8336a35f9cb5c24e3bbfa6b7e76 --- /dev/null +++ b/Core/PythonAPI/inc/ConstKBinAxis.pypp.h @@ -0,0 +1,11 @@ +// This file has been generated by Py++. + +// BornAgain: simulate and fit scattering at grazing incidence +//! @brief Automatically generated boost::python code for PythonCoreAPI + +#ifndef ConstKBinAxis_hpp__pyplusplus_wrapper +#define ConstKBinAxis_hpp__pyplusplus_wrapper + +void register_ConstKBinAxis_class(); + +#endif//ConstKBinAxis_hpp__pyplusplus_wrapper diff --git a/Core/PythonAPI/inc/PythonCoreList.h b/Core/PythonAPI/inc/PythonCoreList.h index 90ed5b0369e33aa5a9c1aba66dac7f2c329a9aea..edbe239d6b79980a855fae8aa4492eda5c85ba59 100644 --- a/Core/PythonAPI/inc/PythonCoreList.h +++ b/Core/PythonAPI/inc/PythonCoreList.h @@ -9,6 +9,7 @@ #include "FixedBinAxis.h" #include "VariableBinAxis.h" #include "AngleBinAxis.h" +#include "ConstKBinAxis.h" #include "BasicVector3D.h" #include "BAVersion.h" #include "Bin.h" diff --git a/Core/PythonAPI/src/ConstKBinAxis.pypp.cpp b/Core/PythonAPI/src/ConstKBinAxis.pypp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f0c177f1c70fbc5daf4e10143a9b1cbd5701707c --- /dev/null +++ b/Core/PythonAPI/src/ConstKBinAxis.pypp.cpp @@ -0,0 +1,254 @@ +// This file has been generated by Py++. + +// BornAgain: simulate and fit scattering at grazing incidence +//! @brief Automatically generated boost::python code for PythonCoreAPI + +#include "Macros.h" +GCC_DIAG_OFF(unused-parameter) +GCC_DIAG_OFF(missing-field-initializers) +#include "boost/python.hpp" +GCC_DIAG_ON(unused-parameter) +GCC_DIAG_ON(missing-field-initializers) +#include "PythonCoreList.h" +#include "ConstKBinAxis.pypp.h" + +namespace bp = boost::python; + +struct ConstKBinAxis_wrapper : ConstKBinAxis, bp::wrapper< ConstKBinAxis > { + + ConstKBinAxis_wrapper(ConstKBinAxis const & arg ) + : ConstKBinAxis( arg ) + , bp::wrapper< ConstKBinAxis >(){ + // copy constructor + + } + + ConstKBinAxis_wrapper(::std::string name, ::std::size_t nbins, double start, double end ) + : ConstKBinAxis( name, nbins, start, end ) + , bp::wrapper< ConstKBinAxis >(){ + // constructor + + } + + virtual ::ConstKBinAxis * clone( ) const { + if( bp::override func_clone = this->get_override( "clone" ) ) + return func_clone( ); + else + return this->ConstKBinAxis::clone( ); + } + + + ::ConstKBinAxis * default_clone( ) const { + return ConstKBinAxis::clone( ); + } + + virtual ::IAxis * createDoubleBinSize( ) const { + if( bp::override func_createDoubleBinSize = this->get_override( "createDoubleBinSize" ) ) + return func_createDoubleBinSize( ); + else + return this->IAxis::createDoubleBinSize( ); + } + + + ::IAxis * default_createDoubleBinSize( ) const { + return IAxis::createDoubleBinSize( ); + } + + virtual ::std::size_t findClosestIndex( double value ) const { + if( bp::override func_findClosestIndex = this->get_override( "findClosestIndex" ) ) + return func_findClosestIndex( value ); + else + return this->VariableBinAxis::findClosestIndex( value ); + } + + + ::std::size_t default_findClosestIndex( double value ) const { + return VariableBinAxis::findClosestIndex( value ); + } + + virtual ::Bin1D getBin( ::std::size_t index ) const { + if( bp::override func_getBin = this->get_override( "getBin" ) ) + return func_getBin( index ); + else + return this->VariableBinAxis::getBin( index ); + } + + + ::Bin1D default_getBin( ::std::size_t index ) const { + return VariableBinAxis::getBin( index ); + } + + virtual ::std::vector< double > getBinBoundaries( ) const { + if( bp::override func_getBinBoundaries = this->get_override( "getBinBoundaries" ) ) + return func_getBinBoundaries( ); + else + return this->VariableBinAxis::getBinBoundaries( ); + } + + + ::std::vector< double > default_getBinBoundaries( ) const { + return VariableBinAxis::getBinBoundaries( ); + } + + virtual ::std::vector< double > getBinCenters( ) const { + if( bp::override func_getBinCenters = this->get_override( "getBinCenters" ) ) + return func_getBinCenters( ); + else + return this->VariableBinAxis::getBinCenters( ); + } + + + ::std::vector< double > default_getBinCenters( ) const { + return VariableBinAxis::getBinCenters( ); + } + + virtual double getMax( ) const { + if( bp::override func_getMax = this->get_override( "getMax" ) ) + return func_getMax( ); + else + return this->VariableBinAxis::getMax( ); + } + + + double default_getMax( ) const { + return VariableBinAxis::getMax( ); + } + + virtual double getMin( ) const { + if( bp::override func_getMin = this->get_override( "getMin" ) ) + return func_getMin( ); + else + return this->VariableBinAxis::getMin( ); + } + + + double default_getMin( ) const { + return VariableBinAxis::getMin( ); + } + + virtual ::std::size_t getSize( ) const { + if( bp::override func_getSize = this->get_override( "getSize" ) ) + return func_getSize( ); + else + return this->VariableBinAxis::getSize( ); + } + + + ::std::size_t default_getSize( ) const { + return VariableBinAxis::getSize( ); + } + +}; + +void register_ConstKBinAxis_class(){ + + { //::ConstKBinAxis + typedef bp::class_< ConstKBinAxis_wrapper, bp::bases< VariableBinAxis > > ConstKBinAxis_exposer_t; + ConstKBinAxis_exposer_t ConstKBinAxis_exposer = ConstKBinAxis_exposer_t( "ConstKBinAxis", bp::init< std::string, std::size_t, double, double >(( bp::arg("name"), bp::arg("nbins"), bp::arg("start"), bp::arg("end") )) ); + bp::scope ConstKBinAxis_scope( ConstKBinAxis_exposer ); + { //::ConstKBinAxis::clone + + typedef ::ConstKBinAxis * ( ::ConstKBinAxis::*clone_function_type )( ) const; + typedef ::ConstKBinAxis * ( ConstKBinAxis_wrapper::*default_clone_function_type )( ) const; + + ConstKBinAxis_exposer.def( + "clone" + , clone_function_type(&::ConstKBinAxis::clone) + , default_clone_function_type(&ConstKBinAxis_wrapper::default_clone) + , bp::return_value_policy< bp::manage_new_object >() ); + + } + { //::IAxis::createDoubleBinSize + + typedef ::IAxis * ( ::IAxis::*createDoubleBinSize_function_type )( ) const; + typedef ::IAxis * ( ConstKBinAxis_wrapper::*default_createDoubleBinSize_function_type )( ) const; + + ConstKBinAxis_exposer.def( + "createDoubleBinSize" + , createDoubleBinSize_function_type(&::IAxis::createDoubleBinSize) + , default_createDoubleBinSize_function_type(&ConstKBinAxis_wrapper::default_createDoubleBinSize) + , bp::return_value_policy< bp::manage_new_object >() ); + + } + { //::VariableBinAxis::findClosestIndex + + typedef ::std::size_t ( ::VariableBinAxis::*findClosestIndex_function_type )( double ) const; + typedef ::std::size_t ( ConstKBinAxis_wrapper::*default_findClosestIndex_function_type )( double ) const; + + ConstKBinAxis_exposer.def( + "findClosestIndex" + , findClosestIndex_function_type(&::VariableBinAxis::findClosestIndex) + , default_findClosestIndex_function_type(&ConstKBinAxis_wrapper::default_findClosestIndex) + , ( bp::arg("value") ) ); + + } + { //::VariableBinAxis::getBin + + typedef ::Bin1D ( ::VariableBinAxis::*getBin_function_type )( ::std::size_t ) const; + typedef ::Bin1D ( ConstKBinAxis_wrapper::*default_getBin_function_type )( ::std::size_t ) const; + + ConstKBinAxis_exposer.def( + "getBin" + , getBin_function_type(&::VariableBinAxis::getBin) + , default_getBin_function_type(&ConstKBinAxis_wrapper::default_getBin) + , ( bp::arg("index") ) ); + + } + { //::VariableBinAxis::getBinBoundaries + + typedef ::std::vector< double > ( ::VariableBinAxis::*getBinBoundaries_function_type )( ) const; + typedef ::std::vector< double > ( ConstKBinAxis_wrapper::*default_getBinBoundaries_function_type )( ) const; + + ConstKBinAxis_exposer.def( + "getBinBoundaries" + , getBinBoundaries_function_type(&::VariableBinAxis::getBinBoundaries) + , default_getBinBoundaries_function_type(&ConstKBinAxis_wrapper::default_getBinBoundaries) ); + + } + { //::VariableBinAxis::getBinCenters + + typedef ::std::vector< double > ( ::VariableBinAxis::*getBinCenters_function_type )( ) const; + typedef ::std::vector< double > ( ConstKBinAxis_wrapper::*default_getBinCenters_function_type )( ) const; + + ConstKBinAxis_exposer.def( + "getBinCenters" + , getBinCenters_function_type(&::VariableBinAxis::getBinCenters) + , default_getBinCenters_function_type(&ConstKBinAxis_wrapper::default_getBinCenters) ); + + } + { //::VariableBinAxis::getMax + + typedef double ( ::VariableBinAxis::*getMax_function_type )( ) const; + typedef double ( ConstKBinAxis_wrapper::*default_getMax_function_type )( ) const; + + ConstKBinAxis_exposer.def( + "getMax" + , getMax_function_type(&::VariableBinAxis::getMax) + , default_getMax_function_type(&ConstKBinAxis_wrapper::default_getMax) ); + + } + { //::VariableBinAxis::getMin + + typedef double ( ::VariableBinAxis::*getMin_function_type )( ) const; + typedef double ( ConstKBinAxis_wrapper::*default_getMin_function_type )( ) const; + + ConstKBinAxis_exposer.def( + "getMin" + , getMin_function_type(&::VariableBinAxis::getMin) + , default_getMin_function_type(&ConstKBinAxis_wrapper::default_getMin) ); + + } + { //::VariableBinAxis::getSize + + typedef ::std::size_t ( ::VariableBinAxis::*getSize_function_type )( ) const; + typedef ::std::size_t ( ConstKBinAxis_wrapper::*default_getSize_function_type )( ) const; + + ConstKBinAxis_exposer.def( + "getSize" + , getSize_function_type(&::VariableBinAxis::getSize) + , default_getSize_function_type(&ConstKBinAxis_wrapper::default_getSize) ); + + } + } + +} diff --git a/Core/PythonAPI/src/PythonModule.cpp b/Core/PythonAPI/src/PythonModule.cpp index f1ff3cd8d3512f8ca3fdb62f5968686495694148..78ce19edec1603e68d2e69d2a50305725075801a 100644 --- a/Core/PythonAPI/src/PythonModule.cpp +++ b/Core/PythonAPI/src/PythonModule.cpp @@ -54,6 +54,7 @@ GCC_DIAG_ON(missing-field-initializers) #include "StochasticParameter_t.pypp.h" #include "StochasticDoubleGaussian.pypp.h" #include "FormFactorPrism6.pypp.h" +#include "ConstKBinAxis.pypp.h" #include "InterferenceFunction2DLattice.pypp.h" #include "FormFactorPyramid.pypp.h" #include "FormFactorBox.pypp.h" @@ -157,6 +158,8 @@ BOOST_PYTHON_MODULE(libBornAgainCore){ register_Beam_class(); register_Bin1D_class(); register_Bin1DCVector_class(); + register_VariableBinAxis_class(); + register_ConstKBinAxis_class(); register_ICloneable_class(); register_ISample_class(); register_ICompositeSample_class(); @@ -265,7 +268,6 @@ BOOST_PYTHON_MODULE(libBornAgainCore){ register_StochasticDoubleGaussian_class(); register_StochasticSampledParameter_class(); register_ThreadInfo_class(); - register_VariableBinAxis_class(); register_global_variables(); register_free_functions(); diff --git a/Core/Tools/inc/ConstKBinAxis.h b/Core/Tools/inc/ConstKBinAxis.h new file mode 100644 index 0000000000000000000000000000000000000000..819d4b27b576dda5c00695b60311e56fed18387e --- /dev/null +++ b/Core/Tools/inc/ConstKBinAxis.h @@ -0,0 +1,47 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file Tools/inc/AxisBin.h +//! @brief Defines class AxisBin. +//! +//! @homepage http://apps.jcns.fz-juelich.de/BornAgain +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2013 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#ifndef CONSTKBINAXIS_H +#define CONSTKBINAXIS_H + + +#include "VariableBinAxis.h" + +//! @class ConstKBinAxis +//! @ingroup tools +//! @brief Axis with fixed bin size in sin(angle) space. + +class BA_CORE_API_ ConstKBinAxis : public VariableBinAxis +{ +public: + //! @brief ConstKBinAxis constructor + //! @param name Axis name + //! @param nbins number of bins + //! @param start low edge of first bin + //! @param end upper edge of last bin + ConstKBinAxis(std::string name, size_t nbins, double start, double end); + virtual ~ConstKBinAxis() {} + + ConstKBinAxis *clone() const; + +protected: + void print(std::ostream& ostr) const; + + double m_start; + double m_end; +}; + + +#endif diff --git a/Core/Tools/inc/IsGisaxsAxis.h b/Core/Tools/inc/IsGisaxsAxis.h new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Core/Tools/inc/OutputDataIOHelper.h b/Core/Tools/inc/OutputDataIOHelper.h index e267a94537bf891bcdbec7832d04a8a07a05c762..87b9eb286110fb976143f1dd91c95aa4773c53ba 100644 --- a/Core/Tools/inc/OutputDataIOHelper.h +++ b/Core/Tools/inc/OutputDataIOHelper.h @@ -22,16 +22,19 @@ class IAxis; class FixedBinAxis; class VariableBinAxis; +class ConstKBinAxis; template <class T> class OutputData; namespace OutputDataIOHelper { const std::string FixedBinAxisType = "FixedBinAxis"; const std::string VariableBinAxisType = "VariableBinAxis"; +const std::string ConstKBinAxisType = "ConstKBinAxis"; IAxis *createAxis(std::istream &input_stream); FixedBinAxis *createFixedBinAxis(std::string line); VariableBinAxis *createVariableBinAxis(std::string line); +ConstKBinAxis *createConstKBinAxis(std::string line); void fillOutputData(OutputData<double> *data, std::istream &input_stream); diff --git a/Core/Tools/inc/VariableBinAxis.h b/Core/Tools/inc/VariableBinAxis.h index e2a46183e54a113923aa96e6443207f2459058e2..d0d7e802bee04a2c1921bd9c452f03ee7faf199f 100644 --- a/Core/Tools/inc/VariableBinAxis.h +++ b/Core/Tools/inc/VariableBinAxis.h @@ -29,7 +29,7 @@ public: //! @brief VariableBinAxis constructor //! @param name Axis name //! @param nbins number of bins - //! @param bin_edges Array of size nbins+1 containing low-edges for each + //! @param bin_boundaries Array of size nbins+1 containing low-edges for each //! bin and upper edge of last bin. VariableBinAxis(std::string name, size_t nbins, const std::vector<double> &bin_boundaries); virtual ~VariableBinAxis() {} @@ -53,6 +53,8 @@ public: std::vector<double > getBinBoundaries() const; protected: + VariableBinAxis(std::string name); + void print(std::ostream& ostr) const; virtual bool equals(const IAxis& other) const; size_t m_nbins; diff --git a/Core/Tools/src/ConstKBinAxis.cpp b/Core/Tools/src/ConstKBinAxis.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a92766e2a45c2eacfff75ca1ac474e065aa0715f --- /dev/null +++ b/Core/Tools/src/ConstKBinAxis.cpp @@ -0,0 +1,37 @@ +#include "ConstKBinAxis.h" +#include "Exceptions.h" +#include <iomanip> +#include <iostream> + +ConstKBinAxis::ConstKBinAxis(std::string name, size_t nbins, double start, double end) + : VariableBinAxis(name) + , m_start(start) + , m_end(end) +{ + // FIXME How to defend agains angles given in degress by mistake? + if(m_start >= m_end) + throw Exceptions::LogicErrorException("ConstKBinAxis::ConstKBinAxis() -> Error. start >= end is not allowed."); + + m_nbins = nbins; + + double start_sin = std::sin(m_start); + double end_sin = std::sin(m_end); + double step = (end_sin-start_sin)/(m_nbins); + + m_bin_boundaries.resize(m_nbins + 1, 0.0); + for(size_t i=0; i<m_bin_boundaries.size(); ++i) { + m_bin_boundaries[i] = std::asin(start_sin + step*i); + } + +} + +ConstKBinAxis *ConstKBinAxis::clone() const +{ + return new ConstKBinAxis(getName(), m_nbins, m_start, m_end); +} + +void ConstKBinAxis::print(std::ostream &ostr) const +{ + ostr << "ConstKBinAxis(\"" << m_name << "\", " << getSize() << ", " << std::setprecision(std::numeric_limits<double>::digits10+2) << getMin() << ", " << getMax() << ")"; +} + diff --git a/Core/Tools/src/IsGisaxsAxis.cpp b/Core/Tools/src/IsGisaxsAxis.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Core/Tools/src/OutputDataIOHelper.cpp b/Core/Tools/src/OutputDataIOHelper.cpp index b4cac18cedc076a817ade2cc39b593e37ab4f25f..b144b63f655aee5a6a7332697dce2aa2478544cf 100644 --- a/Core/Tools/src/OutputDataIOHelper.cpp +++ b/Core/Tools/src/OutputDataIOHelper.cpp @@ -1,6 +1,7 @@ #include "OutputDataIOHelper.h" #include "FixedBinAxis.h" #include "VariableBinAxis.h" +#include "ConstKBinAxis.h" #include "Exceptions.h" #include "Utils.h" #include "OutputData.h" @@ -23,6 +24,10 @@ IAxis *OutputDataIOHelper::createAxis(std::istream &input_stream) { return createVariableBinAxis(line); } + else if(line.find(ConstKBinAxisType) != std::string::npos) + { + return createConstKBinAxis(line); + } else { throw Exceptions::LogicErrorException("OutputDataIOHelper::createAxis() -> Error. Unknown axis '"+line+"'"); } @@ -83,6 +88,33 @@ VariableBinAxis *OutputDataIOHelper::createVariableBinAxis(std::string line) } +//! Create ConstKBinAxis from string representation +//! ConstKBinAxis("axis0", 10, -1, 1) +ConstKBinAxis *OutputDataIOHelper::createConstKBinAxis(std::string line) +{ + std::vector<std::string> to_replace = boost::assign::list_of(",")("\"")("(")(")"); + Utils::String::replaceItemsFromString(line, to_replace, " "); + + std::string type, name; + size_t nbins(0); + + std::istringstream iss(line); + if( !(iss >> type >> name >> nbins) ) + throw Exceptions::FormatErrorException("OutputDataIOHelper::createConstKBinAxis() -> Error. Can't parse the string."); + + std::vector<double> boundaries; + std::string value; + while( iss >> value) { + boundaries.push_back(std::strtod(value.c_str(), NULL)); + } + + if(boundaries.size() != 2) + throw Exceptions::FormatErrorException("OutputDataIOHelper::createConstKBinAxis() -> Error. Can't parse the string at p2."); + + return new ConstKBinAxis(name, nbins, boundaries[0], boundaries[1]); +} + + //! Fills output data raw buffer from input stream void OutputDataIOHelper::fillOutputData(OutputData<double> *data, std::istream &input_stream) { diff --git a/Core/Tools/src/VariableBinAxis.cpp b/Core/Tools/src/VariableBinAxis.cpp index c9d8e020576f58a51b71efb9bbc4329e3696d265..3a5d2ae2b261f4215930add87b818155d013088a 100644 --- a/Core/Tools/src/VariableBinAxis.cpp +++ b/Core/Tools/src/VariableBinAxis.cpp @@ -29,6 +29,14 @@ VariableBinAxis::VariableBinAxis(std::string name, size_t nbins, const std::vect } +VariableBinAxis::VariableBinAxis(std::string name) + : IAxis(name) + , m_nbins(0) +{ + +} + + VariableBinAxis *VariableBinAxis::clone() const { VariableBinAxis *result = new VariableBinAxis(getName(), m_nbins, m_bin_boundaries); @@ -132,3 +140,5 @@ bool VariableBinAxis::equals(const IAxis& other) const + + diff --git a/Tests/FunctionalTests/TestPyCore/intensitydata_io.py b/Tests/FunctionalTests/TestPyCore/intensitydata_io.py index 265f5ab1b2e2110ac85756a9a4b61ac481f9c03c..9ffdee5fc7a29a050a2f9b224a67367490668cad 100644 --- a/Tests/FunctionalTests/TestPyCore/intensitydata_io.py +++ b/Tests/FunctionalTests/TestPyCore/intensitydata_io.py @@ -67,7 +67,7 @@ class OutputDataIOTest(unittest.TestCase): newdata = OutputDataIOFactory.readIntensityData("tmp.baint") self.assertTrue(is_the_same_data(data, newdata)) - def testB_02_FixedBinAxis_2D(self): + def test_02_FixedBinAxis_2D(self): data = IntensityData() data.addAxis(FixedBinAxis("axis0", 9, -1.00000001, 1.0)) data.addAxis(FixedBinAxis("axis1", 3, -4.0, 5.0)) @@ -76,7 +76,7 @@ class OutputDataIOTest(unittest.TestCase): newdata = OutputDataIOFactory.readIntensityData("tmp.baint") self.assertTrue(is_the_same_data(data, newdata)) - def testC_03_FixedBinAxis_3D(self): + def test_03_FixedBinAxis_3D(self): data = IntensityData() data.addAxis(FixedBinAxis("axis0", 9, -1.00000001, 1.0)) data.addAxis(FixedBinAxis("axis1", 1, -4.0, 5.0)) @@ -86,7 +86,7 @@ class OutputDataIOTest(unittest.TestCase): newdata = OutputDataIOFactory.readIntensityData("tmp.baint") self.assertTrue(is_the_same_data(data, newdata)) - def testD_04_VariableBinAxis_1D(self): + def test_04_VariableBinAxis_1D(self): data = IntensityData() data.addAxis(VariableBinAxis("axis0", 10, get_boundaries_flat_in_sin(10, -5.0, 5.0))) fill_data(data) @@ -112,6 +112,15 @@ class OutputDataIOTest(unittest.TestCase): newdata = OutputDataIOFactory.readIntensityData("tmp.baint") self.assertTrue(is_the_same_data(data, newdata)) + def test_07_ConstKBinAxis_2D(self): + data = IntensityData() + data.addAxis(ConstKBinAxis("axis0", 9, -1.00000001*degree, 1.0*degree)) + data.addAxis(ConstKBinAxis("axis1", 3, -4.0*degree, 5.0*degree)) + fill_data(data) + OutputDataIOFactory.writeIntensityData(data, "tmp.baint") + newdata = OutputDataIOFactory.readIntensityData("tmp.baint") + self.assertTrue(is_the_same_data(data, newdata)) + if __name__ == '__main__': unittest.main() diff --git a/Tests/UnitTests/TestCore/ConstKBinAxisTest.h b/Tests/UnitTests/TestCore/ConstKBinAxisTest.h new file mode 100644 index 0000000000000000000000000000000000000000..68da901dc2bdc5e99bdf89d26858b315cb36eb1e --- /dev/null +++ b/Tests/UnitTests/TestCore/ConstKBinAxisTest.h @@ -0,0 +1,112 @@ +#ifndef CONSTKBINAXISTEST_H +#define CONSTKBINAXISTEST_H + +#include "ConstKBinAxis.h" +#include "OutputDataIOHelper.h" +#include "Units.h" +#include "gtest/gtest.h" +#include <vector> + +class ConstKBinAxisTest: public ::testing::Test +{ +protected: + ConstKBinAxisTest() + : m_nbins(10) + , m_start(-5.0*Units::degree) + , m_end(5.0*Units::degree) + , m_axis("name", m_nbins, m_start, m_end) + { + double start_sin = std::sin(m_start); + double end_sin = std::sin(m_end); + double step = (end_sin-start_sin)/m_nbins; + + for(size_t i=0; i<m_nbins; ++i) { + m_centers.push_back( (std::asin(start_sin + step*i) + std::asin(start_sin + step*(i+1)))/2.0 ); + } + + for(size_t i=0; i<m_nbins+1; ++i) { + m_boundaries.push_back( std::asin(start_sin + step*i) ); + } + + } + + size_t m_nbins; + double m_start; + double m_end; + ConstKBinAxis m_axis; + std::vector<double> m_centers; + std::vector<double> m_boundaries; +}; + + +//[-5.0, -3.99816897832528, -2.9975609824866662, -1.99786732193833, -0.9987818274427882, 0.0, 0.9987818274427874, 1.9978673219383292, 2.997560982486666, 3.998168978325279, 5.0] +TEST_F(ConstKBinAxisTest, TypicalAxis) +{ + EXPECT_EQ(m_nbins, m_axis.getSize()); + EXPECT_EQ(m_start, m_axis.getMin()); + EXPECT_EQ(m_end, m_axis.getMax()); + + for(size_t i=0; i<m_axis.getSize(); ++i) { + EXPECT_DOUBLE_EQ( m_centers[i], m_axis[i]); + } + + for(size_t i=0; i<m_axis.getSize(); ++i) { + EXPECT_DOUBLE_EQ( m_boundaries[i], m_axis.getBin(i).m_lower); + EXPECT_DOUBLE_EQ( m_boundaries[i+1], m_axis.getBin(i).m_upper); + } + +} + + +TEST_F(ConstKBinAxisTest, CheckClone) +{ + ConstKBinAxis *clone=m_axis.clone(); + EXPECT_TRUE(m_axis == *clone); + delete clone; +} + + +TEST_F(ConstKBinAxisTest, IOStream) +{ + std::ostringstream oss; + oss << m_axis; + + ConstKBinAxis *result = OutputDataIOHelper::createConstKBinAxis(oss.str()); + EXPECT_TRUE(m_axis == *result); + delete result; +} + + +//TEST_F(ConstKBinAxisTest, BinCenters) +//{ +// static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0}; +// std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) ); +// VariableBinAxis axis("name", 4, values); + +// std::vector<double> centers = axis.getBinCenters(); +// EXPECT_EQ(4, centers.size()); +// EXPECT_DOUBLE_EQ(-0.75, centers[0]); +// EXPECT_DOUBLE_EQ(0.0, centers[1]); +// EXPECT_DOUBLE_EQ(0.75, centers[2]); +// EXPECT_DOUBLE_EQ(1.5, centers[3]); +//} + + +//TEST_F(ConstKBinAxisTest, BinBoundaries) +//{ +// static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0}; +// std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) ); +// VariableBinAxis axis("name", 4, values); + +// std::vector<double> boundaries = axis.getBinBoundaries(); +// EXPECT_EQ(5, boundaries.size()); +// EXPECT_DOUBLE_EQ(-1.0, boundaries[0]); +// EXPECT_DOUBLE_EQ(-0.5, boundaries[1]); +// EXPECT_DOUBLE_EQ(0.5, boundaries[2]); +// EXPECT_DOUBLE_EQ(1.0, boundaries[3]); +// EXPECT_DOUBLE_EQ(2.0, boundaries[4]); +//} + + + +#endif diff --git a/Tests/UnitTests/TestCore/IsGisaxsAxisTest.h b/Tests/UnitTests/TestCore/IsGisaxsAxisTest.h new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tests/UnitTests/TestCore/main.cpp b/Tests/UnitTests/TestCore/main.cpp index a6d16942a621116b56f07fd843a4d5217f6547fe..d344444a6c38b703ee9a441a986cc46301cff07f 100644 --- a/Tests/UnitTests/TestCore/main.cpp +++ b/Tests/UnitTests/TestCore/main.cpp @@ -42,6 +42,8 @@ #include "VariableBinAxisTest.h" #include "AsymmetricBinAxisTest.h" #include "AngleBinAxisTest.h" +#include "ConstKBinAxisTest.h" +#include "IsGisaxsAxisTest.h" struct ErrorStreamRedirect { ErrorStreamRedirect( std::streambuf * new_buffer ) diff --git a/dev-tools/python-bindings/settings_core.py b/dev-tools/python-bindings/settings_core.py index a2efb9f1761fb28928b6bd9ce91e3f7fcc2e7b75..2f0383881ea1f89256622ec557322c35842d1bf6 100644 --- a/dev-tools/python-bindings/settings_core.py +++ b/dev-tools/python-bindings/settings_core.py @@ -42,6 +42,7 @@ include_classes = [ "FixedBinAxis", "VariableBinAxis", "AngleBinAxis", + "ConstKBinAxis", "BasicVector3D<double>", "BasicVector3D<std::complex<double> >", "Beam",