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
|