File: HistogramSettings.cpp

package info (click to toggle)
ausaxs 1.1.8-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 72,592 kB
  • sloc: cpp: 49,853; ansic: 6,901; python: 730; makefile: 18
file content (146 lines) | stat: -rw-r--r-- 6,286 bytes parent folder | download
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
// SPDX-License-Identifier: LGPL-3.0-or-later
// Author: Kristian Lytje

#include <hist/detail/SimpleExvModel.h>
#include <hist/detail/data/CompactCoordinatesXYZW.h>
#include <utility/Exceptions.h>
#include <utility/Console.h>
#include <constants/Constants.h>
#include <settings/HistogramSettings.h>
#include <settings/GeneralSettings.h>
#include <settings/ExvSettings.h>
#include <settings/FitSettings.h>
#include <settings/Flags.h>
#include <settings/SettingsIORegistry.h>

using namespace ausaxs;

unsigned int settings::axes::skip = 0;
bool settings::hist::weighted_bins = true;

// qmin
settings::detail::Setting<double> settings::axes::qmin = {
    constants::axes::q_axis.min,
    [](double& new_qmin) {
        if (new_qmin < 0. || new_qmin > constants::axes::q_axis.max) {
            console::print_warning(
                "settings::axes::qmin: qmin must be in the range "
                "[" + std::to_string(constants::axes::q_axis.min) + ", " + std::to_string(settings::axes::qmax) + "]. "
                "Clamping to closest value."
            );
            new_qmin = std::clamp(new_qmin, constants::axes::q_axis.min, settings::axes::qmax.value);
        }
    }
};

// qmax
settings::detail::Setting<double> settings::axes::qmax = {
    0.5,
    [](double& new_qmax) {
        if (new_qmax < 0. || new_qmax > constants::axes::q_axis.max) {
            console::print_warning(
                "settings::axes::qmax: qmax must be in the range" 
                "[" + std::to_string(settings::axes::qmin) + ", " + std::to_string(constants::axes::q_axis.max) + "]. "
                "Clamping to closest value."
            );
            new_qmax = std::clamp(new_qmax, settings::axes::qmin.value, constants::axes::q_axis.max);
        }
    }
};

auto small_d_range_warning = [] (double bin_width, unsigned int bin_count) {
    static bool warned = false;
    if (warned) {return;}
    warned = true;
    console::print_warning(
        "settings::axes::bin_width: The specified bin width (" + std::to_string(bin_width) + "\u212B) and bin count (" + std::to_string(bin_count) + ") "
        "result in a maximum d-value of less than the recommended " + std::to_string(int(constants::axes::d_axis.max)) + "\u212B. "
        "Structures larger than the new minimum of " + std::to_string(int(bin_width*bin_count)) + "\u212B will trigger segmentation faults. "
        "Consider increasing the bin count or bin width to cover a longer range."
    );
};

// bin_width
settings::detail::Setting<double> settings::axes::bin_width = {
    constants::axes::d_axis.width(),
    [](double& new_width) {
        if (new_width*settings::axes::bin_count < constants::axes::d_axis.max) {small_d_range_warning(new_width, settings::axes::bin_count);}
        if (std::abs(constants::axes::d_axis.width() - new_width) < 1e-6) {
            settings::flags::custom_bin_width = false;
        } else {
            settings::flags::custom_bin_width = true;
        }
        settings::flags::inv_bin_width = 1./new_width;
    }
};

// bin_count
settings::detail::Setting<unsigned int> settings::axes::bin_count = {
    constants::axes::d_axis.bins,
    [](unsigned int& new_count) {
        if (new_count*settings::axes::bin_width < constants::axes::d_axis.max) {small_d_range_warning(settings::axes::bin_width, new_count);}
    }
};

namespace ausaxs::settings::io {
    settings::io::SettingSection axes_section("Axes", {
        settings::io::create(axes::skip, "skip"),
        settings::io::create(axes::qmin, "qmin"),
        settings::io::create(axes::qmax, "qmax"),
    });

    settings::io::SettingSection hist_section("Histogram", {
        settings::io::create(settings::hist::weighted_bins, "weighted_bins"),
        settings::io::create(settings::axes::bin_width, "bin_width"),
        settings::io::create(settings::axes::bin_count, "bin_count"),
    });
}

settings::hist::HistogramManagerChoice settings::hist::get_histogram_manager() {
    switch (settings::exv::exv_method) {
        case settings::exv::ExvMethod::Simple:
            // if no multi-threading is enabled, switch to the single-threaded manager
            return settings::general::threads == 1 
                ? settings::hist::HistogramManagerChoice::HistogramManager 
                : settings::hist::HistogramManagerChoice::HistogramManagerMT;

        case settings::exv::ExvMethod::Average: 
            return settings::hist::HistogramManagerChoice::HistogramManagerMTFFAvg;

        case settings::exv::ExvMethod::Fraser:
            return settings::hist::HistogramManagerChoice::HistogramManagerMTFFExplicit;

        case settings::exv::ExvMethod::Grid:
        case settings::exv::ExvMethod::WAXSiS:
            return settings::hist::HistogramManagerChoice::HistogramManagerMTFFGrid;

        case settings::exv::ExvMethod::GridScalable:
            // if no exv fitting is performed, switch to the faster grid manager 
            return settings::fit::fit_excluded_volume 
                ? settings::hist::HistogramManagerChoice::HistogramManagerMTFFGridScalableExv 
                : settings::hist::HistogramManagerChoice::HistogramManagerMTFFGrid;

        case settings::exv::ExvMethod::GridSurface:
            return settings::fit::fit_excluded_volume 
                ? settings::hist::HistogramManagerChoice::HistogramManagerMTFFGridSurface 
                : settings::hist::HistogramManagerChoice::HistogramManagerMTFFGrid;

        case settings::exv::ExvMethod::CRYSOL:
            return settings::hist::HistogramManagerChoice::CrysolManager;

        case settings::exv::ExvMethod::FoXS:
            return settings::hist::HistogramManagerChoice::FoXSManager;
    
        case settings::exv::ExvMethod::Pepsi:
            return settings::hist::HistogramManagerChoice::PepsiManager;

        case settings::exv::ExvMethod::None:
            ausaxs::hist::detail::SimpleExvModel::disable();
            return settings::general::threads == 1 
                ? settings::hist::HistogramManagerChoice::HistogramManager 
                : settings::hist::HistogramManagerChoice::HistogramManagerMT;

        default:
            throw except::unexpected("settings::hist::get_histogram_manager: Unknown ExvMethod. Did you forget to add it to the switch statement?");
    }
}