gammasimtools 0.22.0__py3-none-any.whl → 0.24.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 (128) hide show
  1. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/METADATA +2 -1
  2. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/RECORD +128 -125
  3. simtools/_version.py +2 -2
  4. simtools/application_control.py +118 -0
  5. simtools/applications/calculate_incident_angles.py +17 -22
  6. simtools/applications/convert_all_model_parameters_from_simtel.py +28 -43
  7. simtools/applications/convert_geo_coordinates_of_array_elements.py +26 -45
  8. simtools/applications/convert_model_parameter_from_simtel.py +21 -41
  9. simtools/applications/db_add_file_to_db.py +13 -14
  10. simtools/applications/db_add_simulation_model_from_repository_to_db.py +20 -33
  11. simtools/applications/db_add_value_from_json_to_db.py +29 -24
  12. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +20 -35
  13. simtools/applications/db_generate_compound_indexes.py +11 -13
  14. simtools/applications/db_get_array_layouts_from_db.py +20 -40
  15. simtools/applications/db_get_file_from_db.py +15 -17
  16. simtools/applications/db_get_parameter_from_db.py +33 -35
  17. simtools/applications/db_inspect_databases.py +13 -12
  18. simtools/applications/db_upload_model_repository.py +13 -31
  19. simtools/applications/derive_ctao_array_layouts.py +16 -21
  20. simtools/applications/derive_mirror_rnda.py +9 -14
  21. simtools/applications/derive_photon_electron_spectrum.py +7 -10
  22. simtools/applications/derive_psf_parameters.py +13 -20
  23. simtools/applications/derive_trigger_rates.py +6 -9
  24. simtools/applications/docs_produce_array_element_report.py +22 -23
  25. simtools/applications/docs_produce_calibration_reports.py +26 -24
  26. simtools/applications/docs_produce_model_parameter_reports.py +15 -22
  27. simtools/applications/docs_produce_simulation_configuration_report.py +21 -22
  28. simtools/applications/generate_array_config.py +14 -33
  29. simtools/applications/generate_corsika_histograms.py +22 -43
  30. simtools/applications/generate_default_metadata.py +15 -36
  31. simtools/applications/generate_regular_arrays.py +11 -15
  32. simtools/applications/generate_simtel_event_data.py +23 -33
  33. simtools/applications/maintain_simulation_model_add_production.py +20 -37
  34. simtools/applications/maintain_simulation_model_compare_productions.py +10 -12
  35. simtools/applications/maintain_simulation_model_verify_production_tables.py +8 -11
  36. simtools/applications/merge_tables.py +14 -23
  37. simtools/applications/plot_array_layout.py +77 -54
  38. simtools/applications/plot_simtel_events.py +11 -13
  39. simtools/applications/plot_tabular_data.py +17 -38
  40. simtools/applications/plot_tabular_data_for_model_parameter.py +16 -23
  41. simtools/applications/print_version.py +14 -42
  42. simtools/applications/production_derive_corsika_limits.py +5 -9
  43. simtools/applications/production_derive_statistics.py +12 -25
  44. simtools/applications/production_generate_grid.py +20 -48
  45. simtools/applications/production_merge_corsika_limits.py +17 -21
  46. simtools/applications/run_application.py +12 -32
  47. simtools/applications/simulate_flasher.py +21 -25
  48. simtools/applications/simulate_illuminator.py +7 -14
  49. simtools/applications/simulate_pedestals.py +13 -13
  50. simtools/applications/simulate_prod.py +21 -33
  51. simtools/applications/simulate_prod_htcondor_generator.py +11 -25
  52. simtools/applications/submit_array_layouts.py +16 -19
  53. simtools/applications/submit_data_from_external.py +18 -34
  54. simtools/applications/submit_model_parameter_from_external.py +27 -40
  55. simtools/applications/validate_camera_efficiency.py +23 -21
  56. simtools/applications/validate_camera_fov.py +21 -26
  57. simtools/applications/validate_cumulative_psf.py +27 -35
  58. simtools/applications/validate_file_using_schema.py +15 -33
  59. simtools/applications/validate_optics.py +27 -33
  60. simtools/camera/camera_efficiency.py +0 -2
  61. simtools/configuration/commandline_parser.py +39 -13
  62. simtools/configuration/configurator.py +1 -6
  63. simtools/corsika/corsika_config.py +2 -9
  64. simtools/data_model/data_reader.py +0 -2
  65. simtools/data_model/metadata_collector.py +0 -2
  66. simtools/data_model/model_data_writer.py +1 -3
  67. simtools/data_model/schema.py +36 -34
  68. simtools/data_model/validate_data.py +0 -2
  69. simtools/db/db_handler.py +61 -296
  70. simtools/db/db_model_upload.py +1 -1
  71. simtools/db/mongo_db.py +535 -0
  72. simtools/dependencies.py +33 -8
  73. simtools/io/hdf5_handler.py +0 -5
  74. simtools/io/legacy_data_handler.py +0 -5
  75. simtools/job_execution/job_manager.py +0 -3
  76. simtools/layout/array_layout.py +7 -9
  77. simtools/layout/array_layout_utils.py +3 -3
  78. simtools/layout/telescope_position.py +0 -2
  79. simtools/model/array_model.py +38 -71
  80. simtools/model/calibration_model.py +12 -11
  81. simtools/model/camera.py +0 -2
  82. simtools/model/mirrors.py +0 -2
  83. simtools/model/model_parameter.py +200 -140
  84. simtools/model/model_repository.py +159 -35
  85. simtools/model/model_utils.py +3 -8
  86. simtools/model/site_model.py +59 -29
  87. simtools/model/telescope_model.py +21 -15
  88. simtools/production_configuration/calculate_statistical_uncertainties_grid_point.py +0 -2
  89. simtools/production_configuration/derive_production_statistics.py +0 -2
  90. simtools/production_configuration/interpolation_handler.py +0 -2
  91. simtools/ray_tracing/mirror_panel_psf.py +4 -4
  92. simtools/ray_tracing/psf_analysis.py +0 -2
  93. simtools/ray_tracing/psf_parameter_optimisation.py +1 -1
  94. simtools/ray_tracing/ray_tracing.py +0 -2
  95. simtools/reporting/docs_auto_report_generator.py +109 -1
  96. simtools/reporting/docs_read_parameters.py +4 -9
  97. simtools/runners/corsika_runner.py +0 -2
  98. simtools/runners/corsika_simtel_runner.py +0 -2
  99. simtools/runners/simtel_runner.py +0 -2
  100. simtools/schemas/model_parameters/transit_time_random.schema.yml +29 -0
  101. simtools/schemas/simulation_models_info.schema.yml +2 -1
  102. simtools/simtel/simtel_config_reader.py +0 -2
  103. simtools/simtel/simtel_config_writer.py +128 -33
  104. simtools/simtel/simtel_io_metadata.py +3 -3
  105. simtools/simtel/simulator_array.py +9 -21
  106. simtools/simtel/simulator_camera_efficiency.py +0 -2
  107. simtools/simtel/simulator_light_emission.py +1 -3
  108. simtools/simtel/simulator_ray_tracing.py +0 -2
  109. simtools/simulator.py +2 -6
  110. simtools/testing/assertions.py +52 -8
  111. simtools/testing/configuration.py +17 -4
  112. simtools/testing/validate_output.py +4 -8
  113. simtools/utils/general.py +5 -13
  114. simtools/utils/geometry.py +0 -5
  115. simtools/utils/names.py +1 -13
  116. simtools/utils/value_conversion.py +10 -5
  117. simtools/version.py +85 -0
  118. simtools/visualization/plot_array_layout.py +129 -23
  119. simtools/visualization/plot_incident_angles.py +0 -2
  120. simtools/visualization/plot_pixels.py +1 -1
  121. simtools/visualization/plot_psf.py +1 -1
  122. simtools/visualization/plot_simtel_events.py +0 -11
  123. simtools/visualization/plot_tables.py +1 -1
  124. simtools/visualization/visualize.py +0 -12
  125. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/WHEEL +0 -0
  126. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/entry_points.txt +0 -0
  127. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/licenses/LICENSE +0 -0
  128. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/top_level.txt +0 -0
@@ -280,7 +280,7 @@ def get_array_layouts_from_db(
280
280
  if layout_name:
281
281
  layout_names = gen.ensure_iterable(layout_name)
282
282
  else:
283
- site_model = SiteModel(site=site, model_version=model_version, mongo_db_config=db_config)
283
+ site_model = SiteModel(site=site, model_version=model_version, db_config=db_config)
284
284
  layout_names = site_model.get_list_of_array_layouts()
285
285
 
286
286
  layouts = []
@@ -373,7 +373,7 @@ def _get_array_layout_dict(
373
373
  ):
374
374
  """Return array layout dictionary for a given telescope list."""
375
375
  array_model = ArrayModel(
376
- mongo_db_config=db_config,
376
+ db_config=db_config,
377
377
  model_version=model_version,
378
378
  site=site,
379
379
  array_elements=telescope_list,
@@ -416,7 +416,7 @@ def get_array_elements_from_db_for_layouts(layouts, site, model_version, db_conf
416
416
  dict
417
417
  Dictionary mapping layout names to telescope IDs.
418
418
  """
419
- site_model = SiteModel(site=site, model_version=model_version, mongo_db_config=db_config)
419
+ site_model = SiteModel(site=site, model_version=model_version, db_config=db_config)
420
420
  layout_names = site_model.get_list_of_array_layouts() if layouts == ["all"] else layouts
421
421
  layout_dict = {}
422
422
  for layout_name in layout_names:
@@ -6,8 +6,6 @@ import astropy.units as u
6
6
  import numpy as np
7
7
  import pyproj
8
8
 
9
- __all__ = ["InvalidCoordSystemErrorError", "TelescopePosition"]
10
-
11
9
 
12
10
  class InvalidCoordSystemErrorError(Exception):
13
11
  """Exception for invalid coordinate system."""
@@ -7,7 +7,6 @@ import astropy.units as u
7
7
  from astropy.table import QTable
8
8
 
9
9
  from simtools.data_model import data_reader, schema
10
- from simtools.db import db_handler
11
10
  from simtools.io import io_handler
12
11
  from simtools.model.calibration_model import CalibrationModel
13
12
  from simtools.model.site_model import SiteModel
@@ -15,8 +14,6 @@ from simtools.model.telescope_model import TelescopeModel
15
14
  from simtools.simtel.simtel_config_writer import SimtelConfigWriter
16
15
  from simtools.utils import general, names
17
16
 
18
- __all__ = ["ArrayModel"]
19
-
20
17
 
21
18
  class ArrayModel:
22
19
  """
@@ -24,8 +21,8 @@ class ArrayModel:
24
21
 
25
22
  Parameters
26
23
  ----------
27
- mongo_db_config: dict
28
- MongoDB configuration.
24
+ db_config: dict
25
+ Database configuration.
29
26
  model_version: str
30
27
  Model version.
31
28
  label: str, optional
@@ -37,30 +34,33 @@ class ArrayModel:
37
34
  array_elements: Union[str, Path, List[str]], optional
38
35
  Array element definitions (list of array element or path to file with
39
36
  the array element positions).
37
+ calibration_device_types: List[str], optional
38
+ List of calibration device types (e.g., 'flat_fielding') attached to each telescope.
40
39
  sim_telarray_seeds : dict, optional
41
40
  Dictionary with configuration for sim_telarray random instrument setup.
42
41
  simtel_path: str, Path, optional
43
42
  Path to the sim_telarray installation directory.
44
- calibration_device_types: List[str], optional
45
- List of calibration device types (e.g., 'flat_fielding') attached to each telescope.
43
+ overwrite_model_parameters: str, optional
44
+ File name to overwrite model parameters from DB with provided values.
46
45
  """
47
46
 
48
47
  def __init__(
49
48
  self,
50
- mongo_db_config,
49
+ db_config,
51
50
  model_version,
52
51
  label=None,
53
52
  site=None,
54
53
  layout_name=None,
55
54
  array_elements=None,
55
+ calibration_device_types=None,
56
56
  sim_telarray_seeds=None,
57
57
  simtel_path=None,
58
- calibration_device_types=None,
58
+ overwrite_model_parameters=None,
59
59
  ):
60
60
  """Initialize ArrayModel."""
61
61
  self._logger = logging.getLogger(__name__)
62
62
  self._logger.debug("Init ArrayModel")
63
- self.mongo_db_config = mongo_db_config
63
+ self.db_config = db_config
64
64
  self.model_version = model_version
65
65
  self.label = label
66
66
  self.layout_name = (
@@ -71,7 +71,8 @@ class ArrayModel:
71
71
  self._config_file_path = None
72
72
  self._config_file_directory = None
73
73
  self.io_handler = io_handler.IOHandler()
74
- self.db = db_handler.DatabaseHandler(mongo_db_config=mongo_db_config)
74
+
75
+ self.overwrite_model_parameters = overwrite_model_parameters
75
76
 
76
77
  self.array_elements, self.site_model, self.telescope_models, self.calibration_models = (
77
78
  self._initialize(site, array_elements, calibration_device_types)
@@ -107,9 +108,10 @@ class ArrayModel:
107
108
  self._logger.debug(f"Getting site parameters from DB ({site})")
108
109
  site_model = SiteModel(
109
110
  site=names.validate_site_name(site),
110
- mongo_db_config=self.mongo_db_config,
111
+ db_config=self.db_config,
111
112
  model_version=self.model_version,
112
113
  label=self.label,
114
+ overwrite_model_parameters=self.overwrite_model_parameters,
113
115
  )
114
116
 
115
117
  # Case 1: array_elements is a file name
@@ -119,7 +121,7 @@ class ArrayModel:
119
121
  )
120
122
  # Case 2: array elements is a list of elements
121
123
  elif isinstance(array_elements_config, list):
122
- array_elements = self._get_array_elements_from_list(array_elements_config)
124
+ array_elements = self._get_array_elements_from_list(array_elements_config, site_model)
123
125
  # Case 3: array elements defined in DB by array layout name
124
126
  elif self.layout_name is not None:
125
127
  array_elements = self._get_array_elements_from_list(
@@ -170,7 +172,7 @@ class ArrayModel:
170
172
  return len(self.telescope_models)
171
173
 
172
174
  @property
173
- def site(self) -> str:
175
+ def site(self):
174
176
  """
175
177
  Return site.
176
178
 
@@ -181,34 +183,6 @@ class ArrayModel:
181
183
  """
182
184
  return self.site_model.site
183
185
 
184
- @property
185
- def model_version(self):
186
- """Model version."""
187
- return self._model_version
188
-
189
- @model_version.setter
190
- def model_version(self, model_version):
191
- """
192
- Set model version.
193
-
194
- Parameters
195
- ----------
196
- _model_version: str or list
197
- Model version (e.g., "6.0.0").
198
- If a list is passed, it must contain exactly one element,
199
- and only that element will be used.
200
-
201
- Raises
202
- ------
203
- ValueError
204
- If more than one model version is passed.
205
- """
206
- if isinstance(model_version, list):
207
- raise ValueError(
208
- f"Only one model version can be passed to {self.__class__.__name__}, not a list."
209
- )
210
- self._model_version = model_version
211
-
212
186
  def _build_telescope_models(self, site_model, array_elements, calibration_device_types):
213
187
  """
214
188
  Build telescope models for all telescopes of this array.
@@ -245,8 +219,9 @@ class ArrayModel:
245
219
  site=site_model.site,
246
220
  telescope_name=element_name,
247
221
  model_version=self.model_version,
248
- mongo_db_config=self.mongo_db_config,
222
+ db_config=self.db_config,
249
223
  label=self.label,
224
+ overwrite_model_parameters=self.overwrite_model_parameters,
250
225
  )
251
226
  calibration_models[element_name] = self._build_calibration_models(
252
227
  telescope_models[element_name],
@@ -276,9 +251,10 @@ class ArrayModel:
276
251
  calibration_models[device_name] = CalibrationModel(
277
252
  site=site_model.site,
278
253
  calibration_device_model_name=device_name,
279
- mongo_db_config=self.mongo_db_config,
254
+ db_config=self.db_config,
280
255
  model_version=self.model_version,
281
256
  label=self.label,
257
+ overwrite_model_parameters=self.overwrite_model_parameters,
282
258
  )
283
259
  return calibration_models
284
260
 
@@ -291,9 +267,7 @@ class ArrayModel:
291
267
  """Export sim_telarray configuration files for all telescopes into the model directory."""
292
268
  exported_models = []
293
269
  for tel_model in self.telescope_models.values():
294
- name = tel_model.name + (
295
- "_" + tel_model.extra_label if tel_model.extra_label != "" else ""
296
- )
270
+ name = tel_model.name
297
271
  if name not in exported_models:
298
272
  self._logger.debug(f"Exporting configuration file for telescope {name}")
299
273
  tel_model.write_sim_telarray_config_file(
@@ -338,7 +312,7 @@ class ArrayModel:
338
312
  if not self._array_model_file_exported:
339
313
  self.export_sim_telarray_config_file()
340
314
 
341
- def get_config_directory(self) -> Path:
315
+ def get_config_directory(self):
342
316
  """
343
317
  Get the path of the array config directory for sim_telarray.
344
318
 
@@ -367,14 +341,12 @@ class ArrayModel:
367
341
  self._logger.warning("No model files found to pack.")
368
342
  return None
369
343
 
370
- archive_name = self.get_config_directory() / "model_files.tar.gz"
371
- general.pack_tar_file(archive_name, model_files)
344
+ archive_name = self.get_config_directory() / f"model_files_{self.model_version}.tar.gz"
345
+ general.pack_tar_file(archive_name, model_files, sub_dir=f"model/{self.model_version}")
372
346
  self._logger.info(f"Packed model files into {archive_name}")
373
347
  return archive_name
374
348
 
375
- def _load_array_element_positions_from_file(
376
- self, array_elements_file: str | Path, site: str
377
- ) -> dict:
349
+ def _load_array_element_positions_from_file(self, array_elements_file, site):
378
350
  """
379
351
  Load array element (e.g. telescope) positions from a file into a dict.
380
352
 
@@ -402,14 +374,8 @@ class ArrayModel:
402
374
  }
403
375
 
404
376
  def _get_telescope_position_parameter(
405
- self,
406
- telescope_name: str,
407
- site: str,
408
- x: u.Quantity,
409
- y: u.Quantity,
410
- z: u.Quantity,
411
- parameter_version: str | None = None,
412
- ) -> dict:
377
+ self, telescope_name, site, x, y, z, parameter_version=None
378
+ ):
413
379
  """
414
380
  Return dictionary with telescope position parameters (following DB model database format).
415
381
 
@@ -446,7 +412,7 @@ class ArrayModel:
446
412
  "model_parameter_schema_version": "0.1.0",
447
413
  }
448
414
 
449
- def _get_array_elements_from_list(self, array_elements_list: list[str]) -> dict:
415
+ def _get_array_elements_from_list(self, array_elements_list, site_model=None):
450
416
  """
451
417
  Return dictionary with array elements from a list of telescope names.
452
418
 
@@ -458,6 +424,8 @@ class ArrayModel:
458
424
  ----------
459
425
  array_elements_list: list
460
426
  List of telescope names.
427
+ site_model: SiteModel
428
+ Site model.
461
429
 
462
430
  Returns
463
431
  -------
@@ -469,31 +437,30 @@ class ArrayModel:
469
437
  try:
470
438
  array_elements_dict[names.validate_array_element_name(name)] = None
471
439
  except ValueError:
472
- array_elements_dict.update(self._get_all_array_elements_of_type(name))
440
+ array_elements_dict.update(self._get_all_array_elements_of_type(name, site_model))
473
441
  return array_elements_dict
474
442
 
475
- def _get_all_array_elements_of_type(self, array_element_type: str) -> dict:
443
+ def _get_all_array_elements_of_type(self, array_element_type, site_model):
476
444
  """
477
- Return all array elements of a specific type using the database.
445
+ Return all array elements of a specific type.
478
446
 
479
447
  Parameters
480
448
  ----------
481
449
  array_element_type : str
482
450
  Type of the array element (e.g. LSTN, MSTS)
451
+ site_model: SiteModel
452
+ Site model.
483
453
 
484
454
  Returns
485
455
  -------
486
456
  dict
487
457
  Dict with array elements.
488
458
  """
489
- all_elements = self.db.get_array_elements_of_type(
490
- array_element_type=array_element_type,
491
- model_version=self.model_version,
492
- collection="telescopes",
459
+ return self._get_array_elements_from_list(
460
+ site_model.get_array_elements_of_type(array_element_type)
493
461
  )
494
- return self._get_array_elements_from_list(all_elements)
495
462
 
496
- def export_array_elements_as_table(self, coordinate_system: str = "ground") -> QTable:
463
+ def export_array_elements_as_table(self, coordinate_system="ground"):
497
464
  """
498
465
  Export array elements positions to astropy table.
499
466
 
@@ -4,8 +4,6 @@ import logging
4
4
 
5
5
  from simtools.model.model_parameter import ModelParameter
6
6
 
7
- __all__ = ["CalibrationModel"]
8
-
9
7
 
10
8
  class CalibrationModel(ModelParameter):
11
9
  """
@@ -19,31 +17,34 @@ class CalibrationModel(ModelParameter):
19
17
  Site name (e.g., South or North).
20
18
  calibration_device_model_name: str
21
19
  Calibration device model name (ex. ILLS-01, ILLN-01, ...).
22
- mongo_db_config: dict
23
- MongoDB configuration.
20
+ db_config: dict
21
+ Database configuration.
24
22
  model_version: str
25
23
  Model version.
26
24
  label: str, optional
27
25
  Instance label. Important for output file naming.
26
+ overwrite_model_parameters: str, optional
27
+ File name to overwrite model parameters from DB with provided values.
28
28
  """
29
29
 
30
30
  def __init__(
31
31
  self,
32
- site: str,
33
- calibration_device_model_name: str,
34
- mongo_db_config: dict,
35
- model_version: str,
36
- label: str | None = None,
32
+ site,
33
+ calibration_device_model_name,
34
+ db_config,
35
+ model_version,
36
+ label=None,
37
+ overwrite_model_parameters=None,
37
38
  ):
38
39
  """Initialize CalibrationModel."""
39
40
  super().__init__(
40
41
  site=site,
41
42
  array_element_name=calibration_device_model_name,
42
43
  collection="calibration_devices",
43
- mongo_db_config=mongo_db_config,
44
+ db_config=db_config,
44
45
  model_version=model_version,
45
- db=None,
46
46
  label=label,
47
+ overwrite_model_parameters=overwrite_model_parameters,
47
48
  )
48
49
 
49
50
  self._logger = logging.getLogger(__name__)
simtools/model/camera.py CHANGED
@@ -8,8 +8,6 @@ import numpy as np
8
8
 
9
9
  from simtools.utils.geometry import rotate
10
10
 
11
- __all__ = ["Camera"]
12
-
13
11
 
14
12
  class Camera:
15
13
  """
simtools/model/mirrors.py CHANGED
@@ -8,8 +8,6 @@ import astropy.units as u
8
8
  import numpy as np
9
9
  from astropy.table import Table
10
10
 
11
- __all__ = ["InvalidMirrorListFileError", "Mirrors"]
12
-
13
11
 
14
12
  class InvalidMirrorListFileError(Exception):
15
13
  """Exception for invalid mirror list file."""