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.
Files changed (65) hide show
  1. {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/METADATA +3 -3
  2. {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/RECORD +64 -59
  3. {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/WHEEL +1 -1
  4. {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/entry_points.txt +2 -0
  5. simtools/_version.py +2 -2
  6. simtools/applications/convert_all_model_parameters_from_simtel.py +1 -1
  7. simtools/applications/convert_geo_coordinates_of_array_elements.py +8 -9
  8. simtools/applications/convert_model_parameter_from_simtel.py +1 -1
  9. simtools/applications/db_add_model_parameters_from_repository_to_db.py +2 -10
  10. simtools/applications/db_add_value_from_json_to_db.py +1 -9
  11. simtools/applications/db_get_array_layouts_from_db.py +3 -1
  12. simtools/applications/db_get_parameter_from_db.py +1 -1
  13. simtools/applications/derive_mirror_rnda.py +10 -1
  14. simtools/applications/derive_psf_parameters.py +1 -1
  15. simtools/applications/generate_array_config.py +1 -5
  16. simtools/applications/generate_regular_arrays.py +9 -6
  17. simtools/applications/plot_array_layout.py +3 -1
  18. simtools/applications/plot_tabular_data.py +84 -0
  19. simtools/applications/production_scale_events.py +1 -2
  20. simtools/applications/simulate_light_emission.py +2 -2
  21. simtools/applications/simulate_prod.py +24 -59
  22. simtools/applications/simulate_prod_htcondor_generator.py +95 -0
  23. simtools/applications/submit_data_from_external.py +1 -1
  24. simtools/applications/validate_camera_efficiency.py +1 -1
  25. simtools/applications/validate_camera_fov.py +3 -7
  26. simtools/applications/validate_cumulative_psf.py +3 -7
  27. simtools/applications/validate_file_using_schema.py +31 -21
  28. simtools/applications/validate_optics.py +3 -4
  29. simtools/camera_efficiency.py +1 -4
  30. simtools/configuration/commandline_parser.py +7 -13
  31. simtools/configuration/configurator.py +6 -19
  32. simtools/data_model/metadata_collector.py +18 -0
  33. simtools/data_model/metadata_model.py +18 -5
  34. simtools/data_model/model_data_writer.py +1 -1
  35. simtools/data_model/validate_data.py +67 -10
  36. simtools/db/db_handler.py +92 -315
  37. simtools/io_operations/legacy_data_handler.py +61 -0
  38. simtools/job_execution/htcondor_script_generator.py +133 -0
  39. simtools/job_execution/job_manager.py +77 -50
  40. simtools/model/camera.py +4 -2
  41. simtools/model/model_parameter.py +40 -10
  42. simtools/model/site_model.py +1 -1
  43. simtools/ray_tracing/mirror_panel_psf.py +47 -27
  44. simtools/runners/corsika_runner.py +14 -3
  45. simtools/runners/runner_services.py +3 -3
  46. simtools/runners/simtel_runner.py +27 -8
  47. simtools/schemas/integration_tests_config.metaschema.yml +15 -5
  48. simtools/schemas/model_parameter.metaschema.yml +90 -2
  49. simtools/schemas/model_parameters/effective_focal_length.schema.yml +31 -1
  50. simtools/simtel/simtel_table_reader.py +410 -0
  51. simtools/simtel/simulator_camera_efficiency.py +6 -4
  52. simtools/simtel/simulator_light_emission.py +2 -2
  53. simtools/simtel/simulator_ray_tracing.py +1 -2
  54. simtools/simulator.py +80 -33
  55. simtools/testing/configuration.py +12 -8
  56. simtools/testing/helpers.py +5 -5
  57. simtools/testing/validate_output.py +26 -26
  58. simtools/utils/general.py +50 -3
  59. simtools/utils/names.py +2 -2
  60. simtools/utils/value_conversion.py +9 -1
  61. simtools/visualization/plot_tables.py +106 -0
  62. simtools/visualization/visualize.py +43 -5
  63. simtools/db/db_from_repo_handler.py +0 -106
  64. {gammasimtools-0.8.2.dist-info → gammasimtools-0.9.0.dist-info}/LICENSE +0 -0
  65. {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
- if is_model_parameter:
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") != Path(self.data_file_name).stem:
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
- def _validate_data_dict(self):
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
- return [v * c for v, c in zip(value, conversion_factor)], target_unit
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.