File: SourceItems.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 (133 lines) | stat: -rw-r--r-- 4,342 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
//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      GUI/Model/Beam/SourceItems.h
//! @brief     Defines BeamItem hierarchy.
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
//  ************************************************************************************************

#ifndef BORNAGAIN_GUI_MODEL_BEAM_SOURCEITEMS_H
#define BORNAGAIN_GUI_MODEL_BEAM_SOURCEITEMS_H

#include "GUI/Model/Beam/FootprintCatalog.h"
#include "GUI/Model/Beam/FootprintItems.h"
#include "GUI/Model/Beam/ScanTypeCatalog.h"
#include "GUI/Model/Beam/ScanTypeItems.h"
#include "GUI/Model/Descriptor/DoubleProperty.h"
#include "GUI/Model/Descriptor/PolyPtr.h"
#include <functional>
#include <heinz/Vectors3D.h>

class BasicAxisItem;
class Beam;
class BeamDistributionItem;
class BeamScan;
class Frame;
class PointwiseAxisItem;
class Scale;

//! Base class for BeamItem and ScanItem. Name refers to radiation source.
class SourceItem {
public:
    DoubleProperty& intensity() { return m_intensity; }
    const DoubleProperty& intensity() const { return m_intensity; }
    void setIntensity(double v) { m_intensity.setDVal(v); }

    BeamDistributionItem* wavelengthItem() const;
    void setWavelength(double value);

    BeamDistributionItem* grazingAngleItem() const;
    void setGrazingAngle(double value);

    BeamDistributionItem* azimuthalAngleItem() const;
    void setAzimuthalAngle(double value);

    PolyPtr<FootprintItem, FootprintCatalog>& footprintSelection() { return m_footprint; }
    void setFootprintItem(const IFootprint* footprint);
    void setGaussianFootprint(double value);
    void setSquareFootprint(double value);

    bool expandBeamParameters = true;
    bool expandFootprint = true;

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

protected:
    SourceItem();

    DoubleProperty m_intensity;
    std::unique_ptr<BeamDistributionItem> m_wavelength_item;
    std::unique_ptr<BeamDistributionItem> m_grazing_angle_item;
    std::unique_ptr<BeamDistributionItem> m_azimuthal_angle_item;
    PolyPtr<FootprintItem, FootprintCatalog> m_footprint;
};

class BeamItem : public SourceItem {
public:
    BeamItem();
    std::unique_ptr<Beam> createBeam() const;
};

class ScanItem : public SourceItem {
public:
    ScanItem();

    void setScan(const BeamScan* scan);

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

    PolyPtr<ScanTypeItem, ScanTypeCatalog>& scanTypeSelection() { return m_scan_type; }
    const PolyPtr<ScanTypeItem, ScanTypeCatalog>& scanTypeSelection() const { return m_scan_type; }

    BeamDistributionItem* scanDistributionItem() const { return m_scan_distribution_item.get(); }

    void updateToData(const Scale& axis);

    int nBins() const;

    //! The currently selected axis
    BasicAxisItem* currentAxisItem() const;

    Scale* newUniformScale() const;
    Scale* newPointwiseScale() const;

    //! True if a pointwise axis was defined.
    //!
    //! It still is no necessarily the selected axis!
    //! Not to be confused with pointwiseAxisSelected
    bool pointwiseAxisDefined() const;

    //! True if pointwise axis is selected.
    //!
    //! Not to be confused with pointwiseAxisDefined
    bool pointwiseAxisSelected() const { return !m_current_axis_is_uniform_axis; }

    //! True if uniform axis is selected.
    bool uniformAxisSelected() const { return m_current_axis_is_uniform_axis; }

    void selectUniformAxis();
    void selectListScan();

    void initUniformAxis(const Scale& axis);
    void initListScan(const Scale& axis);
    void updateAxIndicators(const Frame& frame);

private:
    void setAxisPresentationDefaults(BasicAxisItem* axisItem) const;

    PolyPtr<ScanTypeItem, ScanTypeCatalog> m_scan_type;
    bool m_current_axis_is_uniform_axis;
    std::unique_ptr<BasicAxisItem> m_uniform_axis;
    std::unique_ptr<PointwiseAxisItem> m_pointwise_axis;
    std::unique_ptr<BeamDistributionItem> m_scan_distribution_item;
};

#endif // BORNAGAIN_GUI_MODEL_BEAM_SOURCEITEMS_H