Skip to content
Snippets Groups Projects
ParameterDistribution.h 3.31 KiB
// ************************************************************************** //
//
//  BornAgain: simulate and fit scattering at grazing incidence
//
//! @file      Core/Tools/ParameterDistribution.h
//! @brief     Declares class ParameterDistribution.
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2015
//! @authors   Scientific Computing Group at MLZ Garching
//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
//
// ************************************************************************** //

#ifndef PARAMETERDISTRIBUTION_H
#define PARAMETERDISTRIBUTION_H

#include "ParameterSample.h"
#include "IParameterized.h"
#include <memory>

class IDistribution1D;

class BA_CORE_API_ ParameterDistribution : public IParameterized
{
public:
    ParameterDistribution(const std::string &par_name,
                          const IDistribution1D &distribution,
                          size_t nbr_samples, double sigma_factor=0.0,
                          const AttLimits &limits = AttLimits());

    ParameterDistribution(const std::string &par_name,
                          const IDistribution1D &distribution,
                          size_t nbr_samples, double xmin, double xmax);

    ParameterDistribution(const ParameterDistribution &other);
    virtual ~ParameterDistribution();

    //! Overload assignment operator
    ParameterDistribution& operator=(const ParameterDistribution &other);

    ParameterDistribution& linkParameter(std::string par_name);

    //! get the main parameter's name
    std::string getMainParameterName() const;

    //! get number of samples for this distribution
    size_t getNbrSamples() const;

    //! get the sigma factor
    double getSigmaFactor() const;

    const IDistribution1D *getDistribution() const;

    //! generate list of sampled values with their weight
    std::vector<ParameterSample> generateSamples() const;

    //! get list of linked parameter names
    std::vector<std::string> getLinkedParameterNames() const;

    AttLimits getLimits() const;

    double getMinValue() const;
    double getMaxValue() const;

protected:
    //! Registers some class members for later access via parameter pool
    virtual void init_parameters();
private:
    std::string m_name;
    std::unique_ptr<IDistribution1D> mP_distribution;
    size_t m_nbr_samples;
    double m_sigma_factor;
    std::vector<std::string> m_linked_par_names;
    AttLimits m_limits;
    double m_xmin;
    double m_xmax;
};

inline std::string ParameterDistribution::getMainParameterName() const
{
    return m_name;
}

inline size_t ParameterDistribution::getNbrSamples() const
{
    return m_nbr_samples;
}

inline double ParameterDistribution::getSigmaFactor() const
{
    return m_sigma_factor;
}

inline const IDistribution1D *ParameterDistribution::getDistribution() const
{
    return mP_distribution.get();
}

inline std::vector<std::string> ParameterDistribution::getLinkedParameterNames() const
{
    return m_linked_par_names;
}

inline AttLimits ParameterDistribution::getLimits() const
{
    return m_limits;
}

inline double ParameterDistribution::getMinValue() const
{
    return m_xmin;
}

inline double ParameterDistribution::getMaxValue() const
{
    return m_xmax;
}

#endif // PARAMETERDISTRIBUTION_H