File: FittingTestHelper.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 (63 lines) | stat: -rw-r--r-- 2,022 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
#ifndef BORNAGAIN_TESTS_UNIT_SIM_FITTINGTESTHELPER_H
#define BORNAGAIN_TESTS_UNIT_SIM_FITTINGTESTHELPER_H

#include "Base/Axis/MakeScale.h"
#include "Base/Const/Units.h"
#include "Device/Beam/Beam.h"
#include "Device/Data/Datafield.h"
#include "Device/Detector/SphericalDetector.h"
#include "Fit/Param/Parameters.h"
#include "Sample/Material/MaterialFactoryFuncs.h"
#include "Sample/Multilayer/Layer.h"
#include "Sample/Multilayer/Sample.h"
#include "Sim/Simulation/ScatteringSimulation.h"
#include <memory>

//! Helper class to simplify testing of SimDataPair and FitObjective

class FittingTestHelper {
public:
    FittingTestHelper(size_t nx = 5, size_t ny = 5)
        : m_nx(nx)
        , m_ny(ny)
        , m_builder_calls(0)
    {
    }

    size_t m_nx;
    size_t m_ny;
    const double m_xmin = -1 * Units::deg;
    const double m_xmax = 4 * Units::deg;
    const double m_ymin = 0 * Units::deg;
    const double m_ymax = 4 * Units::deg;

    size_t m_builder_calls;

    std::unique_ptr<ISimulation> createSimulation(const mumufit::Parameters&)
    {
        Sample sample;
        auto material = RefractiveMaterial("Shell", 0.0, 0.0);
        sample.addLayer(Layer(material));
        sample.addLayer(Layer(material));

        SphericalDetector detector(m_nx, m_xmin, m_xmax, m_ny, m_ymin, m_ymax);
        std::unique_ptr<ScatteringSimulation> result(
            new ScatteringSimulation(Beam(1., 1., 0.), sample, detector));

        m_builder_calls++;
        return std::unique_ptr<ISimulation>(result.release());
    }

    std::unique_ptr<Datafield> createTestData(double value)
    {
        std::unique_ptr<Datafield> result(new Datafield(
            std::vector<const Scale*>{newEquiDivision("phi_f (rad)", m_nx, m_xmin, m_xmax),
                                      newEquiDivision("alpha_f (rad)", m_ny, m_ymin, m_ymax)}));
        result->setAllTo(value);
        return result;
    }

    size_t size() const { return m_nx * m_ny; }
};

#endif // BORNAGAIN_TESTS_UNIT_SIM_FITTINGTESTHELPER_H