Passed
Pull Request — main (#205)
by Chaitanya
01:35
created

asgardpy.config.tests.test_config   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 213
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 119
dl 0
loc 213
rs 10
c 0
b 0
f 0
wmc 17

8 Functions

Rating   Name   Duplication   Size   Complexity  
A test_config_basic_failsafe() 0 33 4
A test_config_time() 0 17 4
A test_config_update_gammapy() 0 45 1
A test_create_config_from_dict() 0 7 1
A test_config_basic_io() 0 11 1
A test_get_model_template() 0 13 2
A test_write_model_config() 0 33 2
A test_config_update() 0 33 2
1
import pytest
2
3
from asgardpy.config import AsgardpyConfig
4
5
6
def test_config_basic_io(capsys):
7
    """Test on basic IO Config features."""
8
9
    from IPython.display import display
10
11
    config = AsgardpyConfig()
12
    display(config, display_id="test0")
13
    captured = capsys.readouterr()
14
    assert captured.out[:20] == "AsgardpyConfig\n\n    "
15
    assert "AsgardpyConfig\n\n" in str(config)
16
    assert "AsgardpyConfig(general" in repr(config)
17
18
19
def test_config_basic_failsafe(capsys):
20
    """Test on basic failsafe Config features."""
21
22
    config_str_0 = """
23
    general:
24
      n_jobs: 100
25
    """
26
    config_100 = AsgardpyConfig.from_yaml(config_str_0)
27
    assert config_100.general.n_jobs == 100
28
29
    with pytest.raises(ValueError):
30
        config_str_1 = """
31
        fit_params:
32
          fit_range:
33
            min: 10 s
34
            max: 10 TeV
35
        """
36
        AsgardpyConfig.from_yaml(config_str_1)
37
38
    with pytest.raises(ValueError):
39
        config_str_2 = """
40
        general:
41
          outdir: ./bla/
42
        """
43
        AsgardpyConfig.from_yaml(config_str_2)
44
45
    with pytest.raises(ValueError):
46
        config_str_3 = """
47
        target:
48
          sky_position:
49
            lon: 30 TeV
50
        """
51
        AsgardpyConfig.from_yaml(config_str_3)
52
53
54
def test_config_time():
55
    """Test for reading Time inputs."""
56
    from pydantic import ValidationError
57
58
    config = AsgardpyConfig()
59
60
    with pytest.raises(ValidationError):
61
        config.dataset1d.instruments[0].dataset_info.observation.obs_time = [
62
            {"format": "abc", "start": "2000-01-01", "stop": "2001-01-01"}
63
        ]
64
    with pytest.raises(ValueError):
65
        config.dataset1d.instruments[0].dataset_info.observation.obs_time = [
66
            {"format": "iso", "start": "60000", "stop": "2001-01-01"}
67
        ]
68
    with pytest.raises(ValueError):
69
        config.dataset1d.instruments[0].dataset_info.observation.obs_time = [
70
            {"format": "iso", "start": "2001-01-01", "stop": "60000"}
71
        ]
72
73
74
def test_get_model_template():
75
    """Test for reading a model template by a given tag."""
76
77
    from asgardpy.config.operations import get_model_template
78
79
    new_model = get_model_template("eclp")
80
81
    new_config = AsgardpyConfig.read(new_model)
82
83
    assert new_config.target.components[0].spectral.type == "ExpCutoffLogParabolaSpectralModel"
84
85
    with pytest.raises(IOError):
86
        new_config.write(new_model, overwrite=False)
87
88
89
def test_create_config_from_dict():
90
    """Test to create AsgardpyConfig from a simple dict."""
91
92
    gen_dict = {"general": {"log": {"level": "warning"}}}
93
    config = AsgardpyConfig(**gen_dict)
94
95
    assert config.general.log.level == "warning"
96
97
98
def test_config_update_gammapy(gammapy_data_path, base_config_1d):
99
    """Tests to update target model config from Gammapy-based YAML files."""
100
101
    import os
102
103
    from asgardpy.config.generator import gammapy_model_to_asgardpy_model_config
104
105
    main_config = AsgardpyConfig()
106
107
    other_config_path = f"{gammapy_data_path}fermi-3fhl-crab/Fermi-LAT-3FHL_models.yaml"
108
    other_config_path_2 = f"{gammapy_data_path}estimators/pks2155_hess_lc/models.yaml"
109
110
    other_config_1 = gammapy_model_to_asgardpy_model_config(
111
        other_config_path,
112
        recursive_merge=False,
113
    )
114
    other_config_2 = gammapy_model_to_asgardpy_model_config(
115
        other_config_path,
116
        base_config_1d,
117
        recursive_merge=False,
118
    )
119
120
    main_config.write("test_base_config.yaml", overwrite=True)
121
    other_config_3 = gammapy_model_to_asgardpy_model_config(
122
        other_config_path_2,
123
        "test_base_config.yaml",
124
        recursive_merge=False,
125
    )
126
127
    main_config_1 = main_config.update(other_config_1)
128
    main_config_2 = base_config_1d.update(other_config_2)
129
    main_config_3 = main_config.update(other_config_3)
130
131
    new_spectral_model_name = main_config_1.target.components[0].spectral.type
132
    new_spectral_model_name_2 = main_config_2.target.components[0].spectral.type
133
    new_spectral_model_name_3 = main_config_3.target.components[0].spectral.type
134
135
    index_max = main_config_3.target.components[0].spectral.parameters[0].max
136
137
    assert new_spectral_model_name == "LogParabolaSpectralModel"
138
    assert new_spectral_model_name_2 == "LogParabolaSpectralModel"
139
    assert new_spectral_model_name_3 == "PowerLawSpectralModel"
140
    assert index_max == 10.0
141
142
    os.remove("test_base_config.yaml")
143
144
145
def test_config_update():
146
    """Tests to update target model config from other AsgardpyConfig file."""
147
148
    from asgardpy.config.operations import get_model_template
149
150
    main_config = AsgardpyConfig()
151
152
    spec_model_template_file_1 = get_model_template("bpl")
153
    spec_model_template_file_2 = get_model_template("sbpl")
154
155
    other_config_1 = AsgardpyConfig.read(spec_model_template_file_1)
156
    other_config_2 = AsgardpyConfig.read(spec_model_template_file_2)
157
158
    main_config = main_config.update(other_config_1)
159
    new_spectral_model_name_1 = main_config.target.components[0].spectral.type
160
161
    new_config_str = """
162
    general:
163
      n_jobs: 100
164
    """
165
    main_config_2 = main_config.update(new_config_str)
166
167
    main_config = main_config.update(other_config_2, merge_recursive=True)
168
169
    new_spectral_model_name_2 = main_config.target.components[0].spectral.type
170
    spectral_model_params = main_config.target.components[0].spectral.parameters
171
172
    assert new_spectral_model_name_1 == "BrokenPowerLawSpectralModel"
173
    assert main_config_2.general.n_jobs == 100
174
    with pytest.raises(TypeError):
175
        main_config.update(5)
176
    assert new_spectral_model_name_2 == "SmoothBrokenPowerLawSpectralModel"
177
    assert len(spectral_model_params) == 6
178
179
180
def test_write_model_config():
181
    """From a Gammapy Models object, write it as an AsgardpyConfig file."""
182
183
    from gammapy.modeling.models import (
184
        ExpCutoffPowerLaw3FGLSpectralModel,
185
        Models,
186
        SkyModel,
187
    )
188
189
    from asgardpy.analysis import AsgardpyAnalysis
190
    from asgardpy.config.generator import AsgardpyConfig, write_asgardpy_model_to_file
191
    from asgardpy.config.operations import CONFIG_PATH, get_model_template
192
193
    config_ = AsgardpyConfig()
194
    analysis_ = AsgardpyAnalysis(config_)
195
    model_ = SkyModel(name="Template", spectral_model=ExpCutoffPowerLaw3FGLSpectralModel())
196
    model_.spectral_model.index.value = 1.5
197
198
    analysis_.final_model = Models(model_)
199
200
    assert get_model_template("ecpl-3fgl")
201
202
    write_asgardpy_model_to_file(
203
        gammapy_model=model_,
204
        output_file=str(CONFIG_PATH) + "/model_templates/model_template_ecpl-3fgl.yaml",
205
    )
206
207
    with pytest.raises(TypeError):
208
        write_asgardpy_model_to_file()
209
210
    write_asgardpy_model_to_file(
211
        gammapy_model=model_,
212
        output_file=None,
213
    )
214