File: DistributionItems.h

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (206 lines) | stat: -rw-r--r-- 6,760 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      GUI/Model/Beam/DistributionItems.h
//! @brief     Defines class DistributionItem and several subclasses.
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2022
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
//  ************************************************************************************************

#ifndef BORNAGAIN_GUI_MODEL_BEAM_DISTRIBUTIONITEMS_H
#define BORNAGAIN_GUI_MODEL_BEAM_DISTRIBUTIONITEMS_H

#include "GUI/Model/Descriptor/DoubleProperty.h"
#include <QVector>
#include <memory>

class IDistribution1D;

class DistributionItem {
public:
    virtual ~DistributionItem() = default;
    DistributionItem();

    template <typename T> bool is() const { return dynamic_cast<const T*>(this) != nullptr; }

    virtual std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const = 0;

    uint numberOfSamples() const { return m_number_of_samples; }
    void setNumberOfSamples(uint v) { m_number_of_samples = v; }

    DoubleProperty& relSamplingWidth() { return m_rel_sampling_width; }
    const DoubleProperty& relSamplingWidth() const { return m_rel_sampling_width; }

    virtual DoubleProperty& center() = 0;
    virtual const DoubleProperty& center() const = 0;
    virtual void setCenter(double v) = 0;

    virtual const QString& units() = 0;
    virtual void setUnits(const QString& units) = 0;

    //! Serialization of contents.
    //!
    //! Important: limits will not be serialized here. They have
    //! to be set again by the owner of DistributionItem after reading it
    virtual void writeTo(QXmlStreamWriter* w) const;
    virtual void readFrom(QXmlStreamReader* r);

    virtual DoubleProperties distributionValues(bool withMean = true) = 0;

protected:
    uint m_number_of_samples = 5;

    DoubleProperty m_rel_sampling_width;
};

class SymmetricDistributionItem : public DistributionItem {
public:
    SymmetricDistributionItem(double mean, int decimals = 3, const QString& meanLabel = "Mean");

    DoubleProperty& mean() { return m_mean; }
    const DoubleProperty& mean() const { return m_mean; }

    const QString& units() override;
    void setUnits(const QString& units) override;

    DoubleProperty& center() override { return mean(); }
    const DoubleProperty& center() const override { return mean(); }
    void setCenter(double v) override { m_mean.setDVal(v); }

    void writeTo(QXmlStreamWriter* w) const override;
    void readFrom(QXmlStreamReader* r) override;

protected:
    DoubleProperty m_mean;
};

class DistributionDeltaItem : public SymmetricDistributionItem {
public:
    DistributionDeltaItem();

    std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;

    DoubleProperties distributionValues(bool withMean = true) override;
};

class DistributionGateItem : public DistributionItem {
public:
    DistributionGateItem();

    std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;

    DoubleProperty& center() override { return m_center; }
    const DoubleProperty& center() const override { return m_center; }
    void setCenter(double v) override { m_center.setDVal(v); }

    DoubleProperty& halfwidth() { return m_halfwidth; }
    const DoubleProperty& halfwidth() const { return m_halfwidth; }

    const QString& units() override;
    void setUnits(const QString& units) override;

    void writeTo(QXmlStreamWriter* w) const override;
    void readFrom(QXmlStreamReader* r) override;

    DoubleProperties distributionValues(bool withMean = true) override;

private:
    DoubleProperty m_center;
    DoubleProperty m_halfwidth;
};

class DistributionLorentzItem : public SymmetricDistributionItem {
public:
    DistributionLorentzItem();

    std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;

    DoubleProperty& hwhm() { return m_hwhm; }
    const DoubleProperty& hwhm() const { return m_hwhm; }

    void setUnits(const QString& units) override;

    void writeTo(QXmlStreamWriter* w) const override;
    void readFrom(QXmlStreamReader* r) override;

    DoubleProperties distributionValues(bool withMean = true) override;

private:
    DoubleProperty m_hwhm;
};

class DistributionGaussianItem : public SymmetricDistributionItem {
public:
    DistributionGaussianItem();

    std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;

    DoubleProperty& standardDeviation() { return m_standard_deviation; }
    const DoubleProperty& standardDeviation() const { return m_standard_deviation; }

    void setUnits(const QString& units) override;

    void writeTo(QXmlStreamWriter* w) const override;
    void readFrom(QXmlStreamReader* r) override;

    DoubleProperties distributionValues(bool withMean = true) override;

private:
    DoubleProperty m_standard_deviation;
};

class DistributionLogNormalItem : public DistributionItem {
public:
    DistributionLogNormalItem();

    std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;

    DoubleProperty& median() { return m_median; }
    const DoubleProperty& median() const { return m_median; }

    DoubleProperty& center() override { return median(); }
    const DoubleProperty& center() const override { return median(); }
    void setCenter(double v) override { m_median.setDVal(v); }

    DoubleProperty& scaleParameter() { return m_scale_parameter; }
    const DoubleProperty& scaleParameter() const { return m_scale_parameter; }

    const QString& units() override;
    void setUnits(const QString& units) override;

    void writeTo(QXmlStreamWriter* w) const override;
    void readFrom(QXmlStreamReader* r) override;

    DoubleProperties distributionValues(bool withMean = true) override;

private:
    DoubleProperty m_median;
    DoubleProperty m_scale_parameter;
};

class DistributionCosineItem : public SymmetricDistributionItem {
public:
    DistributionCosineItem();

    std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;

    DoubleProperty& hwhm() { return m_hwhm; }
    const DoubleProperty& hwhm() const { return m_hwhm; }

    void setUnits(const QString& units) override;

    void writeTo(QXmlStreamWriter* w) const override;
    void readFrom(QXmlStreamReader* r) override;

    DoubleProperties distributionValues(bool withMean = true) override;

private:
    DoubleProperty m_hwhm;
};

#endif // BORNAGAIN_GUI_MODEL_BEAM_DISTRIBUTIONITEMS_H