gammasimtools 0.12.0__py3-none-any.whl → 0.13.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 (81) hide show
  1. {gammasimtools-0.12.0.dist-info → gammasimtools-0.13.0.dist-info}/METADATA +1 -1
  2. {gammasimtools-0.12.0.dist-info → gammasimtools-0.13.0.dist-info}/RECORD +64 -77
  3. {gammasimtools-0.12.0.dist-info → gammasimtools-0.13.0.dist-info}/WHEEL +1 -1
  4. {gammasimtools-0.12.0.dist-info → gammasimtools-0.13.0.dist-info}/entry_points.txt +2 -1
  5. simtools/_version.py +2 -2
  6. simtools/applications/convert_all_model_parameters_from_simtel.py +77 -88
  7. simtools/applications/convert_geo_coordinates_of_array_elements.py +1 -1
  8. simtools/applications/db_get_parameter_from_db.py +52 -22
  9. simtools/applications/derive_photon_electron_spectrum.py +1 -1
  10. simtools/applications/docs_produce_array_element_report.py +1 -10
  11. simtools/applications/docs_produce_model_parameter_reports.py +4 -17
  12. simtools/applications/plot_tabular_data.py +14 -2
  13. simtools/applications/{production_derive_limits.py → production_derive_corsika_limits.py} +20 -8
  14. simtools/applications/production_extract_mc_event_data.py +125 -0
  15. simtools/applications/run_application.py +9 -10
  16. simtools/applications/submit_data_from_external.py +1 -1
  17. simtools/applications/submit_model_parameter_from_external.py +2 -1
  18. simtools/camera/single_photon_electron_spectrum.py +6 -2
  19. simtools/constants.py +7 -0
  20. simtools/data_model/metadata_collector.py +159 -61
  21. simtools/data_model/model_data_writer.py +11 -55
  22. simtools/data_model/schema.py +2 -1
  23. simtools/data_model/validate_data.py +5 -3
  24. simtools/db/db_handler.py +115 -31
  25. simtools/model/model_parameter.py +0 -31
  26. simtools/production_configuration/derive_corsika_limits.py +260 -0
  27. simtools/production_configuration/extract_mc_event_data.py +253 -0
  28. simtools/ray_tracing/mirror_panel_psf.py +1 -1
  29. simtools/reporting/docs_read_parameters.py +164 -91
  30. simtools/schemas/metadata.metaschema.yml +7 -6
  31. simtools/schemas/model_parameter.metaschema.yml +0 -4
  32. simtools/schemas/model_parameter_and_data_schema.metaschema.yml +13 -5
  33. simtools/schemas/model_parameters/array_coordinates.schema.yml +1 -1
  34. simtools/schemas/model_parameters/array_layouts.schema.yml +3 -0
  35. simtools/schemas/model_parameters/asum_shaping.schema.yml +1 -1
  36. simtools/schemas/model_parameters/atmospheric_profile.schema.yml +1 -1
  37. simtools/schemas/model_parameters/camera_config_file.schema.yml +1 -1
  38. simtools/schemas/model_parameters/camera_degraded_map.schema.yml +1 -1
  39. simtools/schemas/model_parameters/camera_filter.schema.yml +1 -1
  40. simtools/schemas/model_parameters/dsum_shaping.schema.yml +1 -1
  41. simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +1 -1
  42. simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +1 -1
  43. simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +3 -3
  44. simtools/schemas/model_parameters/fadc_max_sum.schema.yml +3 -3
  45. simtools/schemas/model_parameters/fake_mirror_list.schema.yml +1 -1
  46. simtools/schemas/model_parameters/lightguide_efficiency_vs_incidence_angle.schema.yml +1 -1
  47. simtools/schemas/model_parameters/lightguide_efficiency_vs_wavelength.schema.yml +1 -1
  48. simtools/schemas/model_parameters/mirror_list.schema.yml +1 -1
  49. simtools/schemas/model_parameters/nsb_reference_spectrum.schema.yml +1 -1
  50. simtools/schemas/model_parameters/nsb_skymap.schema.yml +1 -1
  51. simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +1 -1
  52. simtools/schemas/model_parameters/primary_mirror_segmentation.schema.yml +1 -1
  53. simtools/schemas/model_parameters/secondary_mirror_degraded_map.schema.yml +1 -1
  54. simtools/schemas/model_parameters/secondary_mirror_segmentation.schema.yml +1 -1
  55. simtools/schemas/plot_configuration.metaschema.yml +162 -0
  56. simtools/schemas/production_tables.schema.yml +1 -1
  57. simtools/simtel/simtel_config_reader.py +85 -34
  58. simtools/simtel/simtel_table_reader.py +4 -0
  59. simtools/utils/general.py +50 -9
  60. simtools/utils/names.py +7 -2
  61. simtools/visualization/plot_tables.py +25 -20
  62. simtools/visualization/visualize.py +71 -23
  63. simtools/_dev_version/__init__.py +0 -9
  64. simtools/applications/__init__.py +0 -0
  65. simtools/configuration/__init__.py +0 -0
  66. simtools/corsika/__init__.py +0 -0
  67. simtools/data_model/__init__.py +0 -0
  68. simtools/db/__init__.py +0 -0
  69. simtools/io_operations/__init__.py +0 -0
  70. simtools/job_execution/__init__.py +0 -0
  71. simtools/layout/__init__.py +0 -0
  72. simtools/model/__init__.py +0 -0
  73. simtools/production_configuration/limits_calculation.py +0 -202
  74. simtools/ray_tracing/__init__.py +0 -0
  75. simtools/runners/__init__.py +0 -0
  76. simtools/simtel/__init__.py +0 -0
  77. simtools/testing/__init__.py +0 -0
  78. simtools/utils/__init__.py +0 -0
  79. simtools/visualization/__init__.py +0 -0
  80. {gammasimtools-0.12.0.dist-info → gammasimtools-0.13.0.dist-info}/LICENSE +0 -0
  81. {gammasimtools-0.12.0.dist-info → gammasimtools-0.13.0.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/python3
2
2
  r"""
3
- Convert all simulation model parameters exported from sim_telarray format using schema files.
3
+ Convert all simulation model parameters exported from sim_telarray format.
4
4
 
5
- Check value, type, and range, convert units, and write json files
5
+ Check value, type, and range, convert units using schema files. Write json files
6
6
  ready to be submitted to the model database. Prints out parameters which are not found
7
7
  in simtel configuration file and parameters which are not found in simtools schema files.
8
8
 
@@ -19,22 +19,15 @@ r"""
19
19
  telescope (str, optional)
20
20
  Telescope model name (e.g. LST-1, SST-D, ...)
21
21
 
22
+ skip_parameter (str, optional)
23
+ List of parameters to be skipped (use sim_telarray names).
24
+
22
25
  Example
23
26
  -------
24
27
 
25
- Extract model parameters with schema files from simtel configuration file
26
- (requires access to the model parameter repository)
27
-
28
- .. code-block:: console
29
-
30
- simtools-convert-all-model-parameters-from-simtel \\
31
- --schema_directory ../model_parameters/schema\\
32
- --simtel_cfg_file all_telescope_config_la_palma.cfg\\
33
- --simtel_telescope_name CT1\\
34
- --telescope LSTN-01\\
35
- --parameter_version "1.0.0"
36
-
37
- The export of the model parameters from sim_telarray for 6.0.0 can be done e.g., as follows:
28
+ To export the model parameters from sim_telarray, first copy and unpack the configuration
29
+ tar ball from sim_telarray (usually called 'sim_telarray_config.tar.gz') to the sim_telarray
30
+ working directory. Extract the configuration using the following command:
38
31
 
39
32
  .. code-block:: console
40
33
 
@@ -42,18 +35,32 @@ r"""
42
35
  -C limits=no-internal -C initlist=no-internal -C list=no-internal \\
43
36
  -C typelist=no-internal -C maximum_telescopes=30 -DNSB_AUTOSCALE \\
44
37
  -DNECTARCAM -DHYPER_LAYOUT -DNUM_TELESCOPES=30 /dev/null \\
45
- 2>|/dev/null | grep '(@cfg)' >| all_telescope_config_la_palma.cfg
38
+ 2>|/dev/null | grep '(@cfg)' | sed 's/^(@cfg) //' >| all_telescope_config_la_palma.cfg
46
39
 
47
40
  ./sim_telarray/bin/sim_telarray -c sim_telarray/cfg/CTA/CTA-PROD6-Paranal.cfg \\
48
41
  -C limits=no-internal -C initlist=no-internal -C list=no-internal \\
49
42
  -C typelist=no-internal -C maximum_telescopes=87 -DNSB_AUTOSCALE \\
50
43
  -DFLASHCAM -DHYPER_LAYOUT -DNUM_TELESCOPES=87 /dev/null \\
51
- 2>|/dev/null | grep '(@cfg)' >| all_telescope_config_paranal.cfg
44
+ 2>|/dev/null | grep '(@cfg)' | sed 's/^(@cfg) //' >| all_telescope_config_paranal.cfg
45
+
46
+
47
+ Extract then model parameters from the simtel_array configuration file for LSTN-01
48
+ (telescopes are named CT1, CT2, ..., in the sim_telarray configuration file and must be
49
+ provided in the "simtel_telescope_name" command line argument)
50
+ and write json files in the same format as the model parameter database:
51
+
52
+ .. code-block:: console
53
+
54
+ simtools-convert-all-model-parameters-from-simtel \\
55
+ --simtel_cfg_file all_telescope_config_la_palma.cfg\\
56
+ --simtel_telescope_name CT1\\
57
+ --telescope LSTN-01\\
58
+ --parameter_version "1.0.0"\\
59
+ --output_path /path/to/output
52
60
 
53
61
  """
54
62
 
55
63
  import logging
56
- import re
57
64
  from pathlib import Path
58
65
 
59
66
  import numpy as np
@@ -63,7 +70,7 @@ import simtools.utils.general as gen
63
70
  from simtools.configuration import configurator
64
71
  from simtools.data_model import schema
65
72
  from simtools.io_operations.io_handler import IOHandler
66
- from simtools.simtel.simtel_config_reader import SimtelConfigReader
73
+ from simtools.simtel import simtel_config_reader
67
74
 
68
75
 
69
76
  def _parse(label=None, description=None):
@@ -85,14 +92,6 @@ def _parse(label=None, description=None):
85
92
  """
86
93
  config = configurator.Configurator(label=label, description=description)
87
94
 
88
- config.parser.add_argument(
89
- "--schema_directory",
90
- help=(
91
- "Directory with schema files for model parameter validation "
92
- "(default: simtools schema directory)"
93
- ),
94
- required=False,
95
- )
96
95
  config.parser.add_argument(
97
96
  "--simtel_cfg_file",
98
97
  help="File name for simtel_array configuration",
@@ -105,36 +104,17 @@ def _parse(label=None, description=None):
105
104
  type=str,
106
105
  required=True,
107
106
  )
107
+ config.parser.add_argument(
108
+ "--skip_parameter",
109
+ help="List of parameters to be skipped.",
110
+ type=str,
111
+ nargs="*",
112
+ default=[],
113
+ )
108
114
  return config.initialize(simulation_model=["telescope", "parameter_version"])
109
115
 
110
116
 
111
- def get_list_of_simtel_parameters(simtel_config_file, logger):
112
- """
113
- Return list of simtel parameters found in simtel configuration file.
114
-
115
- Parameters
116
- ----------
117
- simtel_config_file: str
118
- File name for sim_telarray configuration
119
- logger: logging.Logger
120
- Logger object
121
-
122
- Returns
123
- -------
124
- list
125
- List of parameters found in simtel configuration file.
126
-
127
- """
128
- simtel_parameter_set = set()
129
- with open(simtel_config_file, encoding="utf-8") as file:
130
- for line in file:
131
- parts_of_lines = re.split(r",\s*|\s+", line.strip())
132
- simtel_parameter_set.add(parts_of_lines[1].lower())
133
- logger.info(f"Found {len(simtel_parameter_set)} parameters in simtel configuration file.")
134
- return list(simtel_parameter_set)
135
-
136
-
137
- def read_simtel_config_file(args_dict, logger, schema_file, camera_pixels=None):
117
+ def read_simtel_config_file(args_dict, schema_file, camera_pixels=None):
138
118
  """
139
119
  Read the simtel configuration file.
140
120
 
@@ -142,25 +122,26 @@ def read_simtel_config_file(args_dict, logger, schema_file, camera_pixels=None):
142
122
  ----------
143
123
  args_dict: dict
144
124
  Dictionary with command line arguments.
145
- logger: logging.Logger
146
- Logger object
147
125
  schema_file: str
148
126
  Schema path name.
149
127
  camera_pixels: int
150
128
  Number of camera pixels.
151
129
 
130
+ Returns
131
+ -------
132
+ SimtelConfigReader, None
133
+ SimtelConfigReader object (None if parameter not found)
134
+
152
135
  """
153
- simtel_config_reader = SimtelConfigReader(
136
+ config_reader = simtel_config_reader.SimtelConfigReader(
154
137
  schema_file=schema_file,
155
138
  simtel_config_file=args_dict["simtel_cfg_file"],
156
139
  simtel_telescope_name=args_dict["simtel_telescope_name"],
157
140
  camera_pixels=camera_pixels,
158
141
  )
159
- logger.info(f"Simtel parameter: {simtel_config_reader.parameter_dict}")
160
-
161
- if simtel_config_reader.parameter_dict is None or len(simtel_config_reader.parameter_dict) == 0:
142
+ if config_reader.parameter_dict is None or len(config_reader.parameter_dict) == 0:
162
143
  return None
163
- return simtel_config_reader
144
+ return config_reader
164
145
 
165
146
 
166
147
  def get_number_of_camera_pixel(args_dict, logger):
@@ -184,12 +165,10 @@ def get_number_of_camera_pixel(args_dict, logger):
184
165
 
185
166
  """
186
167
  try:
187
- simtel_config_reader = SimtelConfigReader(
188
- schema_file=schema.get_model_parameter_schema_file("camera_pixels"),
189
- simtel_config_file=args_dict["simtel_cfg_file"],
190
- simtel_telescope_name=args_dict["simtel_telescope_name"],
168
+ config_reader = read_simtel_config_file(
169
+ args_dict, schema.get_model_parameter_schema_file("camera_pixels")
191
170
  )
192
- _camera_pixel = simtel_config_reader.parameter_dict.get(args_dict["simtel_telescope_name"])
171
+ _camera_pixel = config_reader.parameter_dict.get(args_dict["simtel_telescope_name"])
193
172
  except (FileNotFoundError, AttributeError):
194
173
  logger.warning("Failed to read camera pixel parameter.")
195
174
  _camera_pixel = None
@@ -219,13 +198,14 @@ def read_and_export_parameters(args_dict, logger):
219
198
  List of simtools parameter not found in simtel configuration file.
220
199
 
221
200
  """
222
- _parameters, _schema_files = schema.get_get_model_parameter_schema_files(
223
- args_dict.get("schema_directory")
201
+ _parameters, _schema_files = schema.get_get_model_parameter_schema_files()
202
+ _simtel_parameters = simtel_config_reader.get_list_of_simtel_parameters(
203
+ args_dict["simtel_cfg_file"]
224
204
  )
225
- _simtel_parameters = get_list_of_simtel_parameters(args_dict["simtel_cfg_file"], logger)
205
+ logger.info(f"Found {len(_simtel_parameters)} parameters in simtel configuration file.")
226
206
 
227
207
  io_handler = IOHandler()
228
- io_handler.set_paths(output_path=args_dict["output_path"], use_plain_output_path=True)
208
+ io_handler.set_paths(output_path=args_dict["output_path"])
229
209
 
230
210
  _camera_pixel = get_number_of_camera_pixel(args_dict, logger)
231
211
 
@@ -233,27 +213,34 @@ def read_and_export_parameters(args_dict, logger):
233
213
 
234
214
  for _parameter, _schema_file in zip(_parameters, _schema_files):
235
215
  logger.info(f"Parameter: {_parameter} Schema file: {_schema_file}")
236
- simtel_config_reader = read_simtel_config_file(
237
- args_dict, logger, _schema_file, _camera_pixel
238
- )
216
+ if _parameter in args_dict["skip_parameter"]:
217
+ logger.info(f"Skipping {_parameter}")
218
+ continue
219
+ config_reader = read_simtel_config_file(args_dict, _schema_file, _camera_pixel)
239
220
 
240
- if simtel_config_reader is None:
221
+ if config_reader is None:
241
222
  logger.info("Parameter not found in sim_telarray configuration file.")
242
223
  _parameters_not_in_simtel.append(_parameter)
243
224
  continue
244
225
 
226
+ logger.info(f"Simtel parameter: {config_reader.parameter_dict}")
227
+
245
228
  _json_dict = writer.ModelDataWriter.dump_model_parameter(
246
229
  parameter_name=_parameter,
247
- value=simtel_config_reader.parameter_dict.get(args_dict["simtel_telescope_name"]),
230
+ value=config_reader.parameter_dict.get(args_dict["simtel_telescope_name"]),
248
231
  instrument=args_dict["telescope"],
249
232
  parameter_version=args_dict["parameter_version"],
250
- output_file=io_handler.get_output_file(f"{_parameter}.json"),
233
+ output_file=io_handler.get_output_file(
234
+ f"{_parameter}-{args_dict['parameter_version']}.json",
235
+ label=f"{args_dict['telescope']}",
236
+ sub_dir=f"{_parameter}",
237
+ ),
251
238
  )
252
239
 
253
- simtel_config_reader.compare_simtel_config_with_schema()
240
+ config_reader.compare_simtel_config_with_schema()
254
241
 
255
- if simtel_config_reader.simtel_parameter_name.lower() in _simtel_parameters:
256
- _simtel_parameters.remove(simtel_config_reader.simtel_parameter_name.lower())
242
+ if config_reader.simtel_parameter_name.lower() in _simtel_parameters:
243
+ _simtel_parameters.remove(config_reader.simtel_parameter_name.lower())
257
244
 
258
245
  if _json_dict["file"]:
259
246
  logger.info(f"File name for {_parameter} is {_json_dict['value']}")
@@ -263,7 +250,7 @@ def read_and_export_parameters(args_dict, logger):
263
250
 
264
251
  def print_parameters_not_found(_parameters_not_in_simtel, _simtel_parameters, args_dict, logger):
265
252
  """
266
- Print simtel/simtools parameter not found in schema and ocnfiguration files.
253
+ Print simtel/simtools parameter not found in schema and configuration files.
267
254
 
268
255
  For simtel parameters not found, check if the setting for the chose
269
256
  telescope is different from the default values.
@@ -289,29 +276,31 @@ def print_parameters_not_found(_parameters_not_in_simtel, _simtel_parameters, ar
289
276
  logger.info(f"Simtel parameters not found in schema files ({len(_simtel_parameters)}):")
290
277
  for para in sorted(_simtel_parameters):
291
278
  logger.info(f"Simtel parameter: {para}")
292
- simtel_config_reader = SimtelConfigReader(
279
+ config_reader = simtel_config_reader.SimtelConfigReader(
293
280
  schema_file=None,
294
281
  simtel_config_file=args_dict["simtel_cfg_file"],
295
282
  simtel_telescope_name=args_dict["simtel_telescope_name"],
296
283
  parameter_name=para,
297
284
  )
298
- _default = simtel_config_reader.parameter_dict.get("default")
299
- _tel_value = simtel_config_reader.parameter_dict.get(args_dict["simtel_telescope_name"])
285
+ _default = config_reader.parameter_dict.get("default")
286
+ _tel_value = config_reader.parameter_dict.get(args_dict["simtel_telescope_name"])
300
287
  # simple comparison of default value and telescope values, does not work for lists
301
288
  try:
302
289
  if _default == _tel_value or np.isclose(_default, _tel_value):
303
- logger.info(f" Default and telescope values are equal: {_default}")
290
+ logger.info(f" Default and telescope values for {para} are equal: {_default}")
304
291
  continue
305
292
  except (ValueError, TypeError):
306
293
  pass
307
294
  if isinstance(_default, np.ndarray):
308
- logger.warning(f" Default value: {_default} (length: {_default.size})")
295
+ logger.warning(f" Default value ({para}): {_default} (length: {_default.size})")
309
296
  else:
310
- logger.warning(f" Default value: {_default}")
297
+ logger.warning(f" Default value ({para}): {_default}")
311
298
  if isinstance(_tel_value, np.ndarray):
312
- logger.warning(f" Telescope value: {_tel_value} (length: {_tel_value.size})")
299
+ logger.warning(
300
+ f" Telescope value ({para}): {_tel_value} (length: {_tel_value.size})"
301
+ )
313
302
  else:
314
- logger.warning(f" Telescope value: {_tel_value}")
303
+ logger.warning(f" Telescope value ({para}): {_tel_value}")
315
304
 
316
305
 
317
306
  def print_list_of_files(args_dict, logger):
@@ -178,7 +178,7 @@ def main():
178
178
  )
179
179
  writer.ModelDataWriter.dump(
180
180
  args_dict=args_dict,
181
- metadata=metadata.get_top_level_metadata() if metadata else None,
181
+ metadata=metadata,
182
182
  product_data=product_data,
183
183
  validate_schema_file=validate_schema_file,
184
184
  )
@@ -3,22 +3,36 @@
3
3
  r"""
4
4
  Get a parameter entry from DB for a specific telescope or a site.
5
5
 
6
- The application receives a parameter name, a site, a telescope (if applicable) and \
7
- a version. It then prints out the parameter entry.
6
+ The application receives a parameter name, a site, a telescope (if applicable) and
7
+ a version. Allow to print the parameter entry to screen or save it to a file.
8
+ Parameter describing a table file can be written to disk or exported as an astropy table
9
+ (if available).
8
10
 
9
11
  Command line arguments
10
12
  ----------------------
11
13
  parameter (str, required)
12
14
  Parameter name
13
15
 
16
+ parameter_version (str, optional)
17
+ Parameter version
18
+
19
+ model_version (str, required)
20
+ Model version
21
+
14
22
  site (str, required)
15
23
  South or North.
16
24
 
17
25
  telescope (str, optional)
18
26
  Telescope model name (e.g. LST-1, SST-D, ...)
19
27
 
20
- log_level (str, optional)
21
- Log level to print.
28
+ output_file (str, optional)
29
+ Output file name. If not given, print to stdout.
30
+
31
+ export_model_file (bool, optional)
32
+ Export model file (if parameter describes a file).
33
+
34
+ export_model_file_as_table (bool, optional)
35
+ Export model file as astropy table (if parameter describes a file).
22
36
 
23
37
  Raises
24
38
  ------
@@ -35,12 +49,14 @@ r"""
35
49
  --model_version 5.0.0
36
50
 
37
51
  Get the mirror_list parameter using the parameter_version from the DB.
52
+ Write the mirror list to disk.
38
53
 
39
54
  .. code-block:: console
40
55
 
41
56
  simtools-db-get-parameter-from-db --parameter mirror_list \\
42
57
  --site North --telescope LSTN-01 \\
43
- --parameter_version 1.0.0
58
+ --parameter_version 1.0.0 \\
59
+ --export_model_file
44
60
 
45
61
  """
46
62
 
@@ -53,7 +69,6 @@ import simtools.utils.general as gen
53
69
  from simtools.configuration import configurator
54
70
  from simtools.db import db_handler
55
71
  from simtools.io_operations import io_handler
56
- from simtools.utils import names
57
72
 
58
73
 
59
74
  def _parse():
@@ -72,6 +87,18 @@ def _parse():
72
87
  type=str,
73
88
  required=False,
74
89
  )
90
+ config.parser.add_argument(
91
+ "--export_model_file",
92
+ help="Export model file (if parameter describes a file)",
93
+ action="store_true",
94
+ required=False,
95
+ )
96
+ config.parser.add_argument(
97
+ "--export_model_file_as_table",
98
+ help="Export model file as astropy table (if parameter describes a file)",
99
+ action="store_true",
100
+ required=False,
101
+ )
75
102
 
76
103
  return config.initialize(
77
104
  db_config=True, simulation_model=["telescope", "parameter_version", "model_version"]
@@ -86,26 +113,29 @@ def main(): # noqa: D103
86
113
 
87
114
  db = db_handler.DatabaseHandler(mongo_db_config=db_config)
88
115
 
89
- # get parameter using 'parameter_version'
90
- if args_dict["parameter_version"] is not None:
91
- pars = db.get_model_parameter(
116
+ pars = db.get_model_parameter(
117
+ parameter=args_dict["parameter"],
118
+ site=args_dict["site"],
119
+ array_element_name=args_dict.get("telescope"),
120
+ parameter_version=args_dict.get("parameter_version"),
121
+ model_version=args_dict.get("model_version"),
122
+ )
123
+ if args_dict["export_model_file"] or args_dict["export_model_file_as_table"]:
124
+ table = db.export_model_file(
92
125
  parameter=args_dict["parameter"],
93
- parameter_version=args_dict["parameter_version"],
94
126
  site=args_dict["site"],
95
127
  array_element_name=args_dict["telescope"],
128
+ parameter_version=args_dict.get("parameter_version"),
129
+ model_version=args_dict.get("model_version"),
130
+ export_file_as_table=args_dict["export_model_file_as_table"],
96
131
  )
97
- # get parameter using 'model_version'
98
- elif args_dict["model_version"] is not None:
99
- pars = db.get_model_parameters(
100
- site=args_dict["site"],
101
- array_element_name=args_dict.get("telescope"),
102
- model_version=args_dict["model_version"],
103
- collection=names.get_collection_name_from_parameter_name(args_dict["parameter"]),
104
- )
105
- else:
106
- raise ValueError("Either 'parameter_version' or 'model_version' must be provided.")
107
- if args_dict["parameter"] not in pars:
108
- raise KeyError(f"The requested parameter, {args_dict['parameter']}, does not exist.")
132
+ param_value = pars[args_dict["parameter"]]["value"]
133
+ table_file = Path(io_handler.IOHandler().get_output_directory()) / f"{param_value}"
134
+ logger.info(f"Exported model file {param_value} to {table_file}")
135
+ if table and table_file.suffix != ".ecsv":
136
+ table.write(table_file.with_suffix(".ecsv"), format="ascii.ecsv", overwrite=True)
137
+ logger.info(f"Exported model file {param_value} to {table_file.with_suffix('.ecsv')}")
138
+
109
139
  if args_dict["output_file"] is not None:
110
140
  _output_file = (
111
141
  Path(io_handler.IOHandler().get_output_directory()) / args_dict["output_file"]
@@ -81,7 +81,7 @@ def _parse(label):
81
81
  required=False,
82
82
  )
83
83
 
84
- return config.initialize(db_config=False, output=True)
84
+ return config.initialize(db_config=False, output=True, simulation_model=["telescope"])
85
85
 
86
86
 
87
87
  def main(): # noqa: D103
@@ -12,7 +12,6 @@ import logging
12
12
 
13
13
  from simtools.configuration import configurator
14
14
  from simtools.io_operations import io_handler
15
- from simtools.model.telescope_model import TelescopeModel
16
15
  from simtools.reporting.docs_read_parameters import ReadParameters
17
16
  from simtools.utils import general as gen
18
17
 
@@ -46,17 +45,9 @@ def main(): # noqa: D103
46
45
  logger = logging.getLogger()
47
46
  logger.setLevel(gen.get_log_level_from_user(args["log_level"]))
48
47
 
49
- telescope_model = TelescopeModel(
50
- site=args["site"],
51
- telescope_name=args["telescope"],
52
- model_version=args["model_version"],
53
- label=label_name,
54
- mongo_db_config=db_config,
55
- )
56
-
57
48
  ReadParameters(
58
49
  db_config,
59
- telescope_model,
50
+ args,
60
51
  output_path,
61
52
  ).produce_array_element_report()
62
53
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/python3
2
2
 
3
3
  r"""
4
- Produce one file per model parameter for a given array element.
4
+ Produce a model parameter report per array element.
5
5
 
6
6
  The markdown reports include detailed information on each parameter,
7
7
  comparing their values over various model versions.
@@ -12,7 +12,6 @@ import logging
12
12
 
13
13
  from simtools.configuration import configurator
14
14
  from simtools.io_operations import io_handler
15
- from simtools.model.telescope_model import TelescopeModel
16
15
  from simtools.reporting.docs_read_parameters import ReadParameters
17
16
  from simtools.utils import general as gen
18
17
 
@@ -24,9 +23,7 @@ def _parse(label):
24
23
  description=("Produce a markdown report for model parameters."),
25
24
  )
26
25
 
27
- return config.initialize(
28
- db_config=True, simulation_model=["site", "telescope", "model_version"]
29
- )
26
+ return config.initialize(db_config=True, simulation_model=["site", "telescope"])
30
27
 
31
28
 
32
29
  def main(): # noqa: D103
@@ -38,24 +35,14 @@ def main(): # noqa: D103
38
35
  logger = logging.getLogger()
39
36
  logger.setLevel(gen.get_log_level_from_user(args["log_level"]))
40
37
 
41
- telescope_model = TelescopeModel(
42
- site=args["site"],
43
- telescope_name=args["telescope"],
44
- model_version=args["model_version"],
45
- label=label_name,
46
- mongo_db_config=db_config,
47
- )
48
-
49
38
  ReadParameters(
50
39
  db_config,
51
- telescope_model,
40
+ args,
52
41
  output_path,
53
42
  ).produce_model_parameter_reports()
54
43
 
55
44
  logger.info(
56
- f"Markdown report generated for {args['site']}"
57
- f" Telescope {args['telescope']} (v{args['model_version']}):"
58
- f" {output_path}"
45
+ f"Markdown report generated for {args['site']} Telescope {args['telescope']}: {output_path}"
59
46
  )
60
47
 
61
48
 
@@ -17,6 +17,9 @@ from pathlib import Path
17
17
 
18
18
  import simtools.utils.general as gen
19
19
  from simtools.configuration import configurator
20
+ from simtools.constants import PLOT_CONFIG_SCHEMA
21
+ from simtools.data_model import schema
22
+ from simtools.data_model.metadata_collector import MetadataCollector
20
23
  from simtools.io_operations import io_handler
21
24
  from simtools.visualization import plot_tables
22
25
 
@@ -54,7 +57,7 @@ def _parse(label, description, usage):
54
57
  type=str,
55
58
  required=True,
56
59
  )
57
- return config.initialize(db_config=True)
60
+ return config.initialize(db_config=True, simulation_model=["telescope"])
58
61
 
59
62
 
60
63
  def main():
@@ -70,7 +73,10 @@ def main():
70
73
  io_handler_instance = io_handler.IOHandler()
71
74
 
72
75
  plot_config = gen.convert_keys_in_dict_to_lowercase(
73
- gen.collect_data_from_file(args_dict["plot_config"])
76
+ schema.validate_dict_using_schema(
77
+ gen.collect_data_from_file(args_dict["plot_config"]),
78
+ PLOT_CONFIG_SCHEMA,
79
+ )
74
80
  )
75
81
 
76
82
  plot_tables.plot(
@@ -79,6 +85,12 @@ def main():
79
85
  db_config=db_config_,
80
86
  )
81
87
 
88
+ MetadataCollector.dump(
89
+ args_dict,
90
+ io_handler_instance.get_output_file(args_dict["output_file"]),
91
+ add_activity_name=True,
92
+ )
93
+
82
94
 
83
95
  if __name__ == "__main__":
84
96
  main()
@@ -11,6 +11,10 @@ event_data_file (str, required)
11
11
  Path to the file containing the event data.
12
12
  loss_fraction (float, required)
13
13
  Fraction of events to be lost.
14
+ telescope_ids (list of int, optional)
15
+ List of telescope IDs to filter the events (default is None).
16
+ Definition of the telescope IDs can be found
17
+ in the telescope definition file used for simulations.
14
18
 
15
19
 
16
20
  Example
@@ -19,17 +23,17 @@ Derive limits for a given file with a specified loss fraction.
19
23
 
20
24
  .. code-block:: console
21
25
 
22
- simtools-production-derive-limits\\
26
+ simtools-production-derive-corsika-limits\\
23
27
  --event_data_file path/to/event_data_file.hdf5 \\
24
- --loss_fraction 1e-6
28
+ --loss_fraction 1e-6 \\
29
+ --telescope_ids 1 2 3
25
30
  """
26
31
 
27
32
  import logging
28
33
 
29
34
  import simtools.utils.general as gen
30
35
  from simtools.configuration import configurator
31
- from simtools.io_operations.hdf5_handler import read_hdf5
32
- from simtools.production_configuration.limits_calculation import LimitCalculator
36
+ from simtools.production_configuration.derive_corsika_limits import LimitCalculator
33
37
 
34
38
  _logger = logging.getLogger(__name__)
35
39
 
@@ -44,6 +48,10 @@ def _parse():
44
48
  The event data file.
45
49
  loss_fraction: float
46
50
  Loss fraction of events for limit derivation.
51
+ telescope_ids: list of int, optional
52
+ List of telescope IDs to filter the events (default is None).
53
+ Definition of the telescope IDs can be found in the telescope
54
+ definition file used for simulations.
47
55
 
48
56
  Returns
49
57
  -------
@@ -63,6 +71,12 @@ def _parse():
63
71
  config.parser.add_argument(
64
72
  "--loss_fraction", type=float, required=True, help="Fraction of events to be lost."
65
73
  )
74
+ config.parser.add_argument(
75
+ "--telescope_ids",
76
+ type=int,
77
+ nargs="*",
78
+ help="List of telescope IDs to filter the events as used in sim_telarray.",
79
+ )
66
80
  return config.initialize(db_config=False)
67
81
 
68
82
 
@@ -75,11 +89,9 @@ def main():
75
89
 
76
90
  event_data_file_path = args_dict["event_data_file"]
77
91
  loss_fraction = args_dict["loss_fraction"]
92
+ telescope_ids = args_dict.get("telescope_ids")
78
93
 
79
- _logger.info(f"Loading event data file: {event_data_file_path}")
80
- tables = read_hdf5(event_data_file_path)
81
-
82
- calculator = LimitCalculator(tables)
94
+ calculator = LimitCalculator(event_data_file_path, telescope_list=telescope_ids)
83
95
 
84
96
  lower_energy_limit = calculator.compute_lower_energy_limit(loss_fraction)
85
97
  _logger.info(f"Lower energy threshold: {lower_energy_limit}")