gammasimtools 0.8.2__py3-none-any.whl → 0.9.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/METADATA +3 -3
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/RECORD +64 -59
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/WHEEL +1 -1
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/entry_points.txt +2 -0
- simtools/_version.py +2 -2
- simtools/applications/convert_all_model_parameters_from_simtel.py +1 -1
- simtools/applications/convert_geo_coordinates_of_array_elements.py +8 -9
- simtools/applications/convert_model_parameter_from_simtel.py +1 -1
- simtools/applications/db_add_model_parameters_from_repository_to_db.py +2 -10
- simtools/applications/db_add_value_from_json_to_db.py +1 -9
- simtools/applications/db_get_array_layouts_from_db.py +3 -1
- simtools/applications/db_get_parameter_from_db.py +1 -1
- simtools/applications/derive_mirror_rnda.py +10 -1
- simtools/applications/derive_psf_parameters.py +1 -1
- simtools/applications/generate_array_config.py +1 -5
- simtools/applications/generate_regular_arrays.py +9 -6
- simtools/applications/plot_array_layout.py +3 -1
- simtools/applications/plot_tabular_data.py +84 -0
- simtools/applications/production_scale_events.py +1 -2
- simtools/applications/simulate_light_emission.py +2 -2
- simtools/applications/simulate_prod.py +24 -59
- simtools/applications/simulate_prod_htcondor_generator.py +95 -0
- simtools/applications/submit_data_from_external.py +1 -1
- simtools/applications/validate_camera_efficiency.py +1 -1
- simtools/applications/validate_camera_fov.py +3 -7
- simtools/applications/validate_cumulative_psf.py +3 -7
- simtools/applications/validate_file_using_schema.py +31 -21
- simtools/applications/validate_optics.py +3 -4
- simtools/camera_efficiency.py +1 -4
- simtools/configuration/commandline_parser.py +7 -13
- simtools/configuration/configurator.py +6 -19
- simtools/data_model/metadata_collector.py +18 -0
- simtools/data_model/metadata_model.py +18 -5
- simtools/data_model/model_data_writer.py +1 -1
- simtools/data_model/validate_data.py +67 -10
- simtools/db/db_handler.py +92 -315
- simtools/io_operations/legacy_data_handler.py +61 -0
- simtools/job_execution/htcondor_script_generator.py +133 -0
- simtools/job_execution/job_manager.py +77 -50
- simtools/model/camera.py +4 -2
- simtools/model/model_parameter.py +40 -10
- simtools/model/site_model.py +1 -1
- simtools/ray_tracing/mirror_panel_psf.py +47 -27
- simtools/runners/corsika_runner.py +14 -3
- simtools/runners/runner_services.py +3 -3
- simtools/runners/simtel_runner.py +27 -8
- simtools/schemas/integration_tests_config.metaschema.yml +15 -5
- simtools/schemas/model_parameter.metaschema.yml +90 -2
- simtools/schemas/model_parameters/effective_focal_length.schema.yml +31 -1
- simtools/simtel/simtel_table_reader.py +410 -0
- simtools/simtel/simulator_camera_efficiency.py +6 -4
- simtools/simtel/simulator_light_emission.py +2 -2
- simtools/simtel/simulator_ray_tracing.py +1 -2
- simtools/simulator.py +80 -33
- simtools/testing/configuration.py +12 -8
- simtools/testing/helpers.py +5 -5
- simtools/testing/validate_output.py +26 -26
- simtools/utils/general.py +50 -3
- simtools/utils/names.py +2 -2
- simtools/utils/value_conversion.py +9 -1
- simtools/visualization/plot_tables.py +106 -0
- simtools/visualization/visualize.py +43 -5
- simtools/db/db_from_repo_handler.py +0 -106
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/LICENSE +0 -0
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/top_level.txt +0 -0
|
@@ -12,6 +12,7 @@ from astropy.table import Column, Table, unique
|
|
|
12
12
|
from astropy.utils.diff import report_diff_values
|
|
13
13
|
|
|
14
14
|
import simtools.utils.general as gen
|
|
15
|
+
from simtools.constants import MODEL_PARAMETER_SCHEMA_PATH
|
|
15
16
|
from simtools.data_model import format_checkers
|
|
16
17
|
from simtools.utils import value_conversion
|
|
17
18
|
|
|
@@ -57,7 +58,7 @@ class DataValidator:
|
|
|
57
58
|
self.data_table = data_table
|
|
58
59
|
self.check_exact_data_type = check_exact_data_type
|
|
59
60
|
|
|
60
|
-
def validate_and_transform(self, is_model_parameter=False):
|
|
61
|
+
def validate_and_transform(self, is_model_parameter=False, lists_as_strings=False):
|
|
61
62
|
"""
|
|
62
63
|
Validate data and data file.
|
|
63
64
|
|
|
@@ -65,6 +66,8 @@ class DataValidator:
|
|
|
65
66
|
----------
|
|
66
67
|
is_model_parameter: bool
|
|
67
68
|
This is a model parameter (add some data preparation)
|
|
69
|
+
lists_as_strings: bool
|
|
70
|
+
Convert lists to strings (as needed for model parameters)
|
|
68
71
|
|
|
69
72
|
Returns
|
|
70
73
|
-------
|
|
@@ -80,13 +83,9 @@ class DataValidator:
|
|
|
80
83
|
if self.data_file_name:
|
|
81
84
|
self.validate_data_file()
|
|
82
85
|
if isinstance(self.data_dict, dict):
|
|
83
|
-
|
|
84
|
-
self._prepare_model_parameter()
|
|
85
|
-
self._validate_data_dict()
|
|
86
|
-
return self.data_dict
|
|
86
|
+
return self._validate_data_dict(is_model_parameter, lists_as_strings)
|
|
87
87
|
if isinstance(self.data_table, Table):
|
|
88
|
-
self._validate_data_table()
|
|
89
|
-
return self.data_table
|
|
88
|
+
return self._validate_data_table()
|
|
90
89
|
self._logger.error("No data or data table to validate")
|
|
91
90
|
raise TypeError
|
|
92
91
|
|
|
@@ -108,25 +107,57 @@ class DataValidator:
|
|
|
108
107
|
|
|
109
108
|
def validate_parameter_and_file_name(self):
|
|
110
109
|
"""Validate that file name and key 'parameter_name' in data dict are the same."""
|
|
111
|
-
if self.data_dict.get("parameter")
|
|
110
|
+
if not str(Path(self.data_file_name).stem).startswith(self.data_dict.get("parameter")):
|
|
112
111
|
raise ValueError(
|
|
113
112
|
f"Parameter name in data dict {self.data_dict.get('parameter')} and "
|
|
114
113
|
f"file name {Path(self.data_file_name).stem} do not match."
|
|
115
114
|
)
|
|
116
115
|
|
|
117
|
-
|
|
116
|
+
@staticmethod
|
|
117
|
+
def validate_model_parameter(par_dict):
|
|
118
|
+
"""
|
|
119
|
+
Validate a simulation model parameter (static method).
|
|
120
|
+
|
|
121
|
+
Parameters
|
|
122
|
+
----------
|
|
123
|
+
par_dict: dict
|
|
124
|
+
Data dictionary
|
|
125
|
+
|
|
126
|
+
Returns
|
|
127
|
+
-------
|
|
128
|
+
dict
|
|
129
|
+
Validated data dictionary
|
|
130
|
+
"""
|
|
131
|
+
data_validator = DataValidator(
|
|
132
|
+
schema_file=MODEL_PARAMETER_SCHEMA_PATH / "f{par_dict['parameter']}.schema.yml",
|
|
133
|
+
data_dict=par_dict,
|
|
134
|
+
check_exact_data_type=False,
|
|
135
|
+
)
|
|
136
|
+
return data_validator.validate_and_transform(is_model_parameter=True)
|
|
137
|
+
|
|
138
|
+
def _validate_data_dict(self, is_model_parameter=False, lists_as_strings=False):
|
|
118
139
|
"""
|
|
119
140
|
Validate values in a dictionary.
|
|
120
141
|
|
|
121
142
|
Handles different types of naming in data dicts (using 'name' or 'parameter'
|
|
122
143
|
keys for name fields).
|
|
123
144
|
|
|
145
|
+
Parameters
|
|
146
|
+
----------
|
|
147
|
+
is_model_parameter: bool
|
|
148
|
+
This is a model parameter (add some data preparation)
|
|
149
|
+
lists_as_strings: bool
|
|
150
|
+
Convert lists to strings (as needed for model parameters)
|
|
151
|
+
|
|
124
152
|
Raises
|
|
125
153
|
------
|
|
126
154
|
KeyError
|
|
127
155
|
if data dict does not contain a 'name' or 'parameter' key.
|
|
128
156
|
|
|
129
157
|
"""
|
|
158
|
+
if is_model_parameter:
|
|
159
|
+
self._prepare_model_parameter()
|
|
160
|
+
|
|
130
161
|
if not (_name := self.data_dict.get("name") or self.data_dict.get("parameter")):
|
|
131
162
|
raise KeyError("Data dict does not contain a 'name' or 'parameter' key.")
|
|
132
163
|
self._data_description = self._read_validation_schema(self.schema_file_name, _name)
|
|
@@ -145,6 +176,11 @@ class DataValidator:
|
|
|
145
176
|
|
|
146
177
|
self._check_version_string(self.data_dict.get("version"))
|
|
147
178
|
|
|
179
|
+
if lists_as_strings:
|
|
180
|
+
self._convert_results_to_model_format()
|
|
181
|
+
|
|
182
|
+
return self.data_dict
|
|
183
|
+
|
|
148
184
|
def _validate_value_and_unit(self, value, unit, index):
|
|
149
185
|
"""
|
|
150
186
|
Validate value, unit, and perform type checking and conversions.
|
|
@@ -191,7 +227,13 @@ class DataValidator:
|
|
|
191
227
|
conversion_factor = [
|
|
192
228
|
1 if v is None else u.Unit(v).to(u.Unit(t)) for v, t in zip(unit, target_unit)
|
|
193
229
|
]
|
|
194
|
-
|
|
230
|
+
try:
|
|
231
|
+
return [
|
|
232
|
+
v * c if not isinstance(v, bool) and not isinstance(v, dict) else v
|
|
233
|
+
for v, c in zip(value, conversion_factor)
|
|
234
|
+
], target_unit
|
|
235
|
+
except TypeError:
|
|
236
|
+
return [None], target_unit
|
|
195
237
|
|
|
196
238
|
def _validate_data_dict_using_json_schema(self, data, json_schema):
|
|
197
239
|
"""
|
|
@@ -228,6 +270,7 @@ class DataValidator:
|
|
|
228
270
|
self._validate_data_columns()
|
|
229
271
|
self._check_data_for_duplicates()
|
|
230
272
|
self._sort_data()
|
|
273
|
+
return self.data_table
|
|
231
274
|
|
|
232
275
|
def _validate_data_columns(self):
|
|
233
276
|
"""
|
|
@@ -726,6 +769,8 @@ class DataValidator:
|
|
|
726
769
|
)
|
|
727
770
|
)
|
|
728
771
|
except IndexError as exc:
|
|
772
|
+
if len(self._data_description) == 1: # all columns are described by the same schema
|
|
773
|
+
return self._data_description[0]
|
|
729
774
|
self._logger.error(
|
|
730
775
|
f"Data column '{column_name}' not found in reference column definition"
|
|
731
776
|
)
|
|
@@ -771,6 +816,18 @@ class DataValidator:
|
|
|
771
816
|
if self.data_dict["unit"] is not None:
|
|
772
817
|
self.data_dict["unit"] = gen.convert_string_to_list(self.data_dict["unit"])
|
|
773
818
|
|
|
819
|
+
def _convert_results_to_model_format(self):
|
|
820
|
+
"""
|
|
821
|
+
Convert results to model format.
|
|
822
|
+
|
|
823
|
+
Convert lists to strings (as needed for model parameters).
|
|
824
|
+
"""
|
|
825
|
+
value = self.data_dict["value"]
|
|
826
|
+
if isinstance(value, list):
|
|
827
|
+
self.data_dict["value"] = gen.convert_list_to_string(value)
|
|
828
|
+
if isinstance(self.data_dict["unit"], list):
|
|
829
|
+
self.data_dict["unit"] = gen.convert_list_to_string(self.data_dict["unit"])
|
|
830
|
+
|
|
774
831
|
def _check_version_string(self, version):
|
|
775
832
|
"""
|
|
776
833
|
Check that version string follows semantic versioning.
|