File: DataItem.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 (131 lines) | stat: -rw-r--r-- 4,017 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
//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      GUI/Model/Data/DataItem.h
//! @brief     Declares class DataItem.
//!
//! @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_DATA_DATAITEM_H
#define BORNAGAIN_GUI_MODEL_DATA_DATAITEM_H

#include <QDateTime>
#include <QXmlStreamReader>
#include <mutex>

class AmplitudeAxisItem;
class BasicAxisItem;
class Datafield;
class Frame;

//! Abstract base class for Data2DItem and Data1DItem. Owns one Datafield.

class DataItem : public QObject {
    Q_OBJECT
protected:
    explicit DataItem(const QString& modelType);

public:
    ~DataItem();

    const QString TYPE{"uninitialized"};

    // Returns datafield, owned by this class
    Datafield* p_field() { return m_datafield.get(); }
    const Datafield* c_field() const { return m_datafield.get(); }

    virtual void setDatafield(const Datafield& data) = 0;

    //! Sets the raw data vector from external source.
    //! Checks only the equality of data size; no dimension checks are applied.
    void setRawDataVector(const std::vector<double>& data);

    QString fname() const { return m_fname; }
    void setFileName(const QString& filename);
    QString dataFullPath(const QString& projectDir) const;

    QDateTime lastModified() const { return m_last_modified; }
    void setLastModified(const QDateTime& dtime);

    void loadDatafield(const QString& projectDir, int rank);
    void saveDatafield(const QString& projectDir) const;

    // Number of bins in data
    int xSize() const;
    int ySize() const;

    // Returns min and max range of x-axis as given by data
    virtual double xMin() const = 0;
    virtual double xMax() const = 0;

    // Returns min and max range of y-axis as given by data
    virtual double yMin() const = 0;
    virtual double yMax() const = 0;

    // Lower and upper zoom ranges of x-axis
    double lowerX() const;
    double upperX() const;
    void setXrange(double lower, double upper);

    // Lower and upper zoom ranges of y-axis
    double lowerY() const;
    double upperY() const;
    void setYrange(double lower, double upper);

    // Adjust zoom range of this item to the other items range
    void alignXranges(DataItem* sourceItem);
    void alignYranges(DataItem* sourceItem);
    void alignXYranges(DataItem* sourceItem);

    bool isArgRangeLocked() const { return m_lock_arg_range; }
    void setArgRangeLocked(bool b) { m_lock_arg_range = b; }

    virtual bool isValAxisLocked() const = 0;
    virtual void setValAxisLocked(bool state) = 0;

    const BasicAxisItem* axItemX() const;
    BasicAxisItem* axItemX();
    const AmplitudeAxisItem* axItemY() const;
    AmplitudeAxisItem* axItemY();

    // Axes titles
    QString xAxisLabel() const;
    QString yAxisLabel() const;

    virtual size_t rank() const = 0;
    virtual size_t axdim(int i) const = 0;

    //! Set axes viewport to original data.
    virtual void resetView() = 0;

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

    bool wasModifiedSinceLastSave() const;

signals:
    void datafieldChanged();
    void updateOtherPlots(DataItem* sender);

protected:
    std::unique_ptr<Datafield> m_datafield; //!< simulation results
    mutable std::mutex m_update_data_mutex;

    QString m_fname;
    bool m_lock_arg_range;
    std::unique_ptr<BasicAxisItem> m_x_axis;
    std::unique_ptr<AmplitudeAxisItem> m_y_axis;

    QDateTime m_last_modified;
    mutable QDateTime m_last_saved;

    void setTheDatafield(const Datafield& data);
};

#endif // BORNAGAIN_GUI_MODEL_DATA_DATAITEM_H