gammasimtools 0.8.2__py3-none-any.whl → 0.10.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.10.0.dist-info}/METADATA +4 -4
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.10.0.dist-info}/RECORD +119 -105
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.10.0.dist-info}/WHEEL +1 -1
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.10.0.dist-info}/entry_points.txt +4 -1
- simtools/_version.py +2 -2
- simtools/applications/calculate_trigger_rate.py +15 -38
- simtools/applications/convert_all_model_parameters_from_simtel.py +9 -28
- simtools/applications/convert_geo_coordinates_of_array_elements.py +54 -53
- simtools/applications/convert_model_parameter_from_simtel.py +2 -2
- simtools/applications/db_add_file_to_db.py +1 -2
- simtools/applications/db_add_simulation_model_from_repository_to_db.py +110 -0
- simtools/applications/db_add_value_from_json_to_db.py +2 -11
- simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +6 -6
- simtools/applications/db_get_array_layouts_from_db.py +3 -1
- simtools/applications/db_get_file_from_db.py +11 -12
- simtools/applications/db_get_parameter_from_db.py +44 -32
- simtools/applications/derive_mirror_rnda.py +10 -1
- simtools/applications/derive_photon_electron_spectrum.py +99 -0
- simtools/applications/derive_psf_parameters.py +1 -1
- simtools/applications/generate_array_config.py +18 -22
- simtools/applications/generate_regular_arrays.py +24 -21
- simtools/applications/generate_simtel_array_histograms.py +11 -48
- simtools/applications/plot_array_layout.py +3 -1
- simtools/applications/plot_tabular_data.py +84 -0
- simtools/applications/production_generate_simulation_config.py +25 -7
- simtools/applications/production_scale_events.py +3 -4
- simtools/applications/simulate_light_emission.py +2 -2
- simtools/applications/simulate_prod.py +25 -60
- simtools/applications/simulate_prod_htcondor_generator.py +95 -0
- simtools/applications/submit_data_from_external.py +12 -4
- simtools/applications/submit_model_parameter_from_external.py +8 -6
- simtools/applications/validate_camera_efficiency.py +3 -3
- simtools/applications/validate_camera_fov.py +3 -7
- simtools/applications/validate_cumulative_psf.py +3 -7
- simtools/applications/validate_file_using_schema.py +38 -24
- simtools/applications/validate_optics.py +3 -4
- simtools/{camera_efficiency.py → camera/camera_efficiency.py} +1 -4
- simtools/camera/single_photon_electron_spectrum.py +168 -0
- simtools/configuration/commandline_parser.py +14 -13
- simtools/configuration/configurator.py +6 -19
- simtools/constants.py +10 -3
- simtools/corsika/corsika_config.py +8 -7
- simtools/corsika/corsika_histograms.py +1 -1
- simtools/data_model/data_reader.py +0 -3
- simtools/data_model/metadata_collector.py +21 -4
- simtools/data_model/metadata_model.py +8 -111
- simtools/data_model/model_data_writer.py +18 -64
- simtools/data_model/schema.py +213 -0
- simtools/data_model/validate_data.py +73 -51
- simtools/db/db_handler.py +395 -790
- simtools/db/db_model_upload.py +139 -0
- simtools/io_operations/hdf5_handler.py +54 -24
- 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/layout/array_layout.py +33 -28
- simtools/model/array_model.py +13 -7
- simtools/model/camera.py +4 -2
- simtools/model/model_parameter.py +61 -63
- simtools/model/site_model.py +3 -3
- simtools/production_configuration/calculate_statistical_errors_grid_point.py +119 -144
- simtools/production_configuration/event_scaler.py +7 -17
- simtools/production_configuration/generate_simulation_config.py +5 -32
- simtools/production_configuration/interpolation_handler.py +8 -11
- simtools/ray_tracing/mirror_panel_psf.py +47 -27
- simtools/runners/corsika_runner.py +14 -3
- simtools/runners/corsika_simtel_runner.py +3 -1
- simtools/runners/runner_services.py +3 -3
- simtools/runners/simtel_runner.py +27 -8
- simtools/schemas/input/MST_mirror_2f_measurements.schema.yml +39 -0
- simtools/schemas/input/single_pe_spectrum.schema.yml +38 -0
- simtools/schemas/integration_tests_config.metaschema.yml +23 -3
- simtools/schemas/model_parameter.metaschema.yml +95 -2
- simtools/schemas/model_parameter_and_data_schema.metaschema.yml +2 -0
- simtools/schemas/model_parameters/array_element_position_utm.schema.yml +1 -1
- simtools/schemas/model_parameters/array_window.schema.yml +37 -0
- simtools/schemas/model_parameters/asum_clipping.schema.yml +0 -4
- simtools/schemas/model_parameters/channels_per_chip.schema.yml +1 -1
- simtools/schemas/model_parameters/corsika_iact_io_buffer.schema.yml +2 -2
- simtools/schemas/model_parameters/dsum_clipping.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_offset.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_pedsub.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_prescale.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_presum_max.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_shaping.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_shaping_renormalize.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_threshold.schema.yml +0 -2
- simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +0 -2
- simtools/schemas/model_parameters/effective_focal_length.schema.yml +31 -1
- simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_noise.schema.yml +3 -3
- simtools/schemas/model_parameters/fake_mirror_list.schema.yml +33 -0
- simtools/schemas/model_parameters/laser_photons.schema.yml +2 -2
- simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +1 -1
- simtools/schemas/production_configuration_metrics.schema.yml +68 -0
- simtools/schemas/production_tables.schema.yml +41 -0
- simtools/simtel/simtel_config_writer.py +5 -6
- simtools/simtel/simtel_io_histogram.py +32 -67
- simtools/simtel/simtel_io_histograms.py +15 -30
- simtools/simtel/simtel_table_reader.py +410 -0
- simtools/simtel/simulator_array.py +2 -1
- simtools/simtel/simulator_camera_efficiency.py +11 -4
- simtools/simtel/simulator_light_emission.py +5 -3
- simtools/simtel/simulator_ray_tracing.py +2 -2
- simtools/simulator.py +80 -33
- simtools/testing/configuration.py +12 -8
- simtools/testing/helpers.py +9 -16
- simtools/testing/validate_output.py +152 -68
- simtools/utils/general.py +149 -12
- simtools/utils/names.py +25 -21
- simtools/utils/value_conversion.py +9 -1
- simtools/visualization/plot_tables.py +106 -0
- simtools/visualization/visualize.py +43 -5
- simtools/applications/db_add_model_parameters_from_repository_to_db.py +0 -184
- simtools/db/db_array_elements.py +0 -130
- simtools/db/db_from_repo_handler.py +0 -106
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.10.0.dist-info}/LICENSE +0 -0
- {gammasimtools-0.8.2.dist-info → gammasimtools-0.10.0.dist-info}/top_level.txt +0 -0
simtools/layout/array_layout.py
CHANGED
|
@@ -9,7 +9,7 @@ import numpy as np
|
|
|
9
9
|
from astropy.table import QTable
|
|
10
10
|
|
|
11
11
|
import simtools.utils.general as gen
|
|
12
|
-
from simtools.data_model import data_reader
|
|
12
|
+
from simtools.data_model import data_reader, schema
|
|
13
13
|
from simtools.io_operations import io_handler
|
|
14
14
|
from simtools.layout.geo_coordinates import GeoCoordinates
|
|
15
15
|
from simtools.layout.telescope_position import TelescopePosition
|
|
@@ -386,7 +386,9 @@ class ArrayLayout:
|
|
|
386
386
|
with Path(file_name).open("r", encoding="utf-8") as file:
|
|
387
387
|
data = json.load(file)
|
|
388
388
|
|
|
389
|
-
position =
|
|
389
|
+
position = data["value"]
|
|
390
|
+
if isinstance(position, str):
|
|
391
|
+
position = gen.convert_string_to_list(position)
|
|
390
392
|
self.site = data.get("site", None)
|
|
391
393
|
|
|
392
394
|
table = QTable()
|
|
@@ -579,7 +581,12 @@ class ArrayLayout:
|
|
|
579
581
|
|
|
580
582
|
return table
|
|
581
583
|
|
|
582
|
-
def export_one_telescope_as_json(
|
|
584
|
+
def export_one_telescope_as_json(
|
|
585
|
+
self,
|
|
586
|
+
crs_name,
|
|
587
|
+
parameter_version=None,
|
|
588
|
+
schema_version=None,
|
|
589
|
+
):
|
|
583
590
|
"""
|
|
584
591
|
Return a list containing a single telescope in simtools-DB-style json.
|
|
585
592
|
|
|
@@ -587,6 +594,8 @@ class ArrayLayout:
|
|
|
587
594
|
----------
|
|
588
595
|
crs_name: str
|
|
589
596
|
Name of coordinate system to be used for export.
|
|
597
|
+
schema_version: str
|
|
598
|
+
Version of the schema.
|
|
590
599
|
|
|
591
600
|
Returns
|
|
592
601
|
-------
|
|
@@ -596,43 +605,39 @@ class ArrayLayout:
|
|
|
596
605
|
table = self.export_telescope_list_table(crs_name)
|
|
597
606
|
if len(table) != 1:
|
|
598
607
|
raise ValueError("Only one telescope can be exported to json")
|
|
599
|
-
parameter_name =
|
|
608
|
+
parameter_name = value = None
|
|
600
609
|
if crs_name == "ground":
|
|
601
610
|
parameter_name = "array_element_position_ground"
|
|
602
|
-
|
|
603
|
-
[
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
]
|
|
608
|
-
)
|
|
611
|
+
value = [
|
|
612
|
+
table["position_x"][0].value,
|
|
613
|
+
table["position_y"][0].value,
|
|
614
|
+
table["position_z"][0].value,
|
|
615
|
+
]
|
|
609
616
|
elif crs_name == "utm":
|
|
610
617
|
parameter_name = "array_element_position_utm"
|
|
611
|
-
|
|
612
|
-
[
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
]
|
|
617
|
-
)
|
|
618
|
+
value = [
|
|
619
|
+
table["utm_east"][0].value,
|
|
620
|
+
table["utm_north"][0].value,
|
|
621
|
+
table["altitude"][0].value,
|
|
622
|
+
]
|
|
618
623
|
elif crs_name == "mercator":
|
|
619
624
|
parameter_name = "array_element_position_mercator"
|
|
620
|
-
|
|
621
|
-
[
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
)
|
|
625
|
+
value = [
|
|
626
|
+
table["latitude"][0].value,
|
|
627
|
+
table["longitude"][0].value,
|
|
628
|
+
table["altitude"][0].value,
|
|
629
|
+
]
|
|
630
|
+
|
|
627
631
|
return {
|
|
632
|
+
"schema_version": schema.get_model_parameter_schema_version(schema_version),
|
|
628
633
|
"parameter": parameter_name,
|
|
629
634
|
"instrument": table["telescope_name"][0],
|
|
630
635
|
"site": self.site,
|
|
631
|
-
"
|
|
632
|
-
"
|
|
636
|
+
"parameter_version": parameter_version,
|
|
637
|
+
"unique_id": None,
|
|
638
|
+
"value": value,
|
|
633
639
|
"unit": "m",
|
|
634
640
|
"type": "float64",
|
|
635
|
-
"applicable": True,
|
|
636
641
|
"file": False,
|
|
637
642
|
}
|
|
638
643
|
|
simtools/model/array_model.py
CHANGED
|
@@ -6,8 +6,8 @@ from pathlib import Path
|
|
|
6
6
|
import astropy.units as u
|
|
7
7
|
from astropy.table import QTable
|
|
8
8
|
|
|
9
|
-
from simtools.data_model import data_reader
|
|
10
|
-
from simtools.db import
|
|
9
|
+
from simtools.data_model import data_reader, schema
|
|
10
|
+
from simtools.db import db_handler
|
|
11
11
|
from simtools.io_operations import io_handler
|
|
12
12
|
from simtools.model.site_model import SiteModel
|
|
13
13
|
from simtools.model.telescope_model import TelescopeModel
|
|
@@ -290,7 +290,13 @@ class ArrayModel:
|
|
|
290
290
|
}
|
|
291
291
|
|
|
292
292
|
def _get_telescope_position_parameter(
|
|
293
|
-
self,
|
|
293
|
+
self,
|
|
294
|
+
telescope_name: str,
|
|
295
|
+
site: str,
|
|
296
|
+
x: u.Quantity,
|
|
297
|
+
y: u.Quantity,
|
|
298
|
+
z: u.Quantity,
|
|
299
|
+
parameter_version: str | None = None,
|
|
294
300
|
) -> dict:
|
|
295
301
|
"""
|
|
296
302
|
Return dictionary with telescope position parameters (following DB model database format).
|
|
@@ -314,16 +320,17 @@ class ArrayModel:
|
|
|
314
320
|
Dict with telescope position parameters.
|
|
315
321
|
"""
|
|
316
322
|
return {
|
|
323
|
+
"schema_version": schema.get_model_parameter_schema_version(),
|
|
317
324
|
"parameter": "array_element_position_ground",
|
|
318
325
|
"instrument": telescope_name,
|
|
319
326
|
"site": site,
|
|
320
|
-
"
|
|
327
|
+
"parameter_version": parameter_version,
|
|
328
|
+
"unique_id": None,
|
|
321
329
|
"value": general.convert_list_to_string(
|
|
322
330
|
[x.to("m").value, y.to("m").value, z.to("m").value]
|
|
323
331
|
),
|
|
324
332
|
"unit": "m",
|
|
325
333
|
"type": "float64",
|
|
326
|
-
"applicable": True,
|
|
327
334
|
"file": False,
|
|
328
335
|
}
|
|
329
336
|
|
|
@@ -367,9 +374,8 @@ class ArrayModel:
|
|
|
367
374
|
dict
|
|
368
375
|
Dict with array elements.
|
|
369
376
|
"""
|
|
370
|
-
all_elements =
|
|
377
|
+
all_elements = self.db.get_array_elements_of_type(
|
|
371
378
|
array_element_type=array_element_type,
|
|
372
|
-
db=self.db,
|
|
373
379
|
model_version=self.model_version,
|
|
374
380
|
collection="telescopes",
|
|
375
381
|
)
|
simtools/model/camera.py
CHANGED
|
@@ -5,8 +5,6 @@ from pathlib import Path
|
|
|
5
5
|
|
|
6
6
|
import astropy.units as u
|
|
7
7
|
import numpy as np
|
|
8
|
-
from scipy.spatial import cKDTree as KDTree
|
|
9
|
-
from scipy.spatial import distance
|
|
10
8
|
|
|
11
9
|
from simtools.utils.geometry import rotate
|
|
12
10
|
|
|
@@ -304,6 +302,8 @@ class Camera:
|
|
|
304
302
|
float
|
|
305
303
|
The camera fill factor.
|
|
306
304
|
"""
|
|
305
|
+
from scipy.spatial import distance # pylint: disable=import-outside-toplevel
|
|
306
|
+
|
|
307
307
|
if self.pixels["pixel_spacing"] == 9999:
|
|
308
308
|
points = np.array([self.pixels["x"], self.pixels["y"]]).T
|
|
309
309
|
pixel_distances = distance.cdist(points, points, "euclidean")
|
|
@@ -403,6 +403,8 @@ class Camera:
|
|
|
403
403
|
list of lists
|
|
404
404
|
Array of neighbor indices in a list for each pixel
|
|
405
405
|
"""
|
|
406
|
+
from scipy.spatial import cKDTree as KDTree # pylint: disable=import-outside-toplevel
|
|
407
|
+
|
|
406
408
|
tree = KDTree(np.column_stack([x_pos, y_pos]))
|
|
407
409
|
neighbors = tree.query_ball_tree(tree, radius)
|
|
408
410
|
return [list(np.setdiff1d(neigh, [i])) for i, neigh in enumerate(neighbors)]
|
|
@@ -6,10 +6,12 @@ import shutil
|
|
|
6
6
|
from copy import copy
|
|
7
7
|
|
|
8
8
|
import astropy.units as u
|
|
9
|
+
from astropy.table import Table
|
|
9
10
|
|
|
10
11
|
import simtools.utils.general as gen
|
|
11
12
|
from simtools.db import db_handler
|
|
12
13
|
from simtools.io_operations import io_handler
|
|
14
|
+
from simtools.simtel import simtel_table_reader
|
|
13
15
|
from simtools.simtel.simtel_config_writer import SimtelConfigWriter
|
|
14
16
|
from simtools.utils import names
|
|
15
17
|
|
|
@@ -65,7 +67,6 @@ class ModelParameter:
|
|
|
65
67
|
|
|
66
68
|
self._parameters = {}
|
|
67
69
|
self._simulation_config_parameters = {"corsika": {}, "simtel": {}}
|
|
68
|
-
self._derived = None
|
|
69
70
|
self.collection = collection
|
|
70
71
|
self.label = label
|
|
71
72
|
self.model_version = model_version
|
|
@@ -109,12 +110,8 @@ class ModelParameter:
|
|
|
109
110
|
"""
|
|
110
111
|
try:
|
|
111
112
|
return self._parameters[par_name]
|
|
112
|
-
except KeyError:
|
|
113
|
-
pass
|
|
114
|
-
try:
|
|
115
|
-
return self.derived[par_name]
|
|
116
113
|
except (KeyError, ValueError) as e:
|
|
117
|
-
msg = f"Parameter {par_name} was not found in the model"
|
|
114
|
+
msg = f"Parameter {par_name} was not found in the model {self.name}, {self.site}."
|
|
118
115
|
self._logger.error(msg)
|
|
119
116
|
raise InvalidModelParameterError(msg) from e
|
|
120
117
|
|
|
@@ -178,7 +175,10 @@ class ModelParameter:
|
|
|
178
175
|
_value = self.get_parameter_value(par_name, _parameter)
|
|
179
176
|
|
|
180
177
|
try:
|
|
181
|
-
|
|
178
|
+
if isinstance(_parameter.get("unit"), str):
|
|
179
|
+
_unit = [item.strip() for item in _parameter.get("unit").split(",")]
|
|
180
|
+
else:
|
|
181
|
+
_unit = _parameter.get("unit")
|
|
182
182
|
|
|
183
183
|
# if there is only one value or the values share one unit
|
|
184
184
|
if (isinstance(_value, (int | float))) or (len(_value) > len(_unit)):
|
|
@@ -239,33 +239,6 @@ class ModelParameter:
|
|
|
239
239
|
self._logger.debug(f"Parameter {par_name} does not have a file associated with it.")
|
|
240
240
|
return False
|
|
241
241
|
|
|
242
|
-
@property
|
|
243
|
-
def derived(self):
|
|
244
|
-
"""Load the derived values and export them if the class instance hasn't done it yet."""
|
|
245
|
-
if self._derived is None:
|
|
246
|
-
self._load_derived_values()
|
|
247
|
-
self._export_derived_files()
|
|
248
|
-
return self._derived
|
|
249
|
-
|
|
250
|
-
def _load_derived_values(self):
|
|
251
|
-
"""Load derived values from the DB."""
|
|
252
|
-
self._logger.debug("Reading derived values from DB")
|
|
253
|
-
self._derived = self.db.get_derived_values(
|
|
254
|
-
self.site,
|
|
255
|
-
self.name,
|
|
256
|
-
self.model_version,
|
|
257
|
-
)
|
|
258
|
-
|
|
259
|
-
def _export_derived_files(self):
|
|
260
|
-
"""Write to disk a file from the derived values DB."""
|
|
261
|
-
for par_now in self.derived.values():
|
|
262
|
-
if par_now.get("File") or par_now.get("file"):
|
|
263
|
-
self.db.export_file_db(
|
|
264
|
-
db_name=self.db.DB_DERIVED_VALUES,
|
|
265
|
-
dest=self.config_file_directory,
|
|
266
|
-
file_name=(par_now.get("value") or par_now.get("Value")),
|
|
267
|
-
)
|
|
268
|
-
|
|
269
242
|
def print_parameters(self):
|
|
270
243
|
"""Print parameters and their values for debugging purposes."""
|
|
271
244
|
for par in self._parameters:
|
|
@@ -273,7 +246,7 @@ class ModelParameter:
|
|
|
273
246
|
|
|
274
247
|
def _set_config_file_directory_and_name(self):
|
|
275
248
|
"""Set and create the directory and the name of the config file."""
|
|
276
|
-
if self.name is None:
|
|
249
|
+
if self.name is None and self.site is None:
|
|
277
250
|
return
|
|
278
251
|
|
|
279
252
|
self._config_file_directory = self.io_handler.get_output_directory(
|
|
@@ -281,15 +254,14 @@ class ModelParameter:
|
|
|
281
254
|
)
|
|
282
255
|
|
|
283
256
|
# Setting file name and the location
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
self._config_file_path = self.config_file_directory.joinpath(config_file_name)
|
|
257
|
+
config_file_name = names.simtel_config_file_name(
|
|
258
|
+
self.site,
|
|
259
|
+
self.model_version,
|
|
260
|
+
telescope_model_name=self.name,
|
|
261
|
+
label=self.label,
|
|
262
|
+
extra_label=self._extra_label,
|
|
263
|
+
)
|
|
264
|
+
self._config_file_path = self.config_file_directory.joinpath(config_file_name)
|
|
293
265
|
|
|
294
266
|
self._logger.debug(f"Config file path: {self._config_file_path}")
|
|
295
267
|
|
|
@@ -321,10 +293,11 @@ class ModelParameter:
|
|
|
321
293
|
simulation_software=simulation_software,
|
|
322
294
|
)
|
|
323
295
|
)
|
|
324
|
-
except ValueError:
|
|
296
|
+
except ValueError as exc:
|
|
325
297
|
self._logger.warning(
|
|
326
298
|
f"No {simulation_software} parameters found for "
|
|
327
|
-
f"{self.site}, {self.name} (model version {self.model_version})."
|
|
299
|
+
f"{self.site}, {self.name} (model version {self.model_version}). "
|
|
300
|
+
f" (Query {exc})"
|
|
328
301
|
)
|
|
329
302
|
|
|
330
303
|
def _load_parameters_from_db(self):
|
|
@@ -334,15 +307,18 @@ class ModelParameter:
|
|
|
334
307
|
|
|
335
308
|
if self.name is not None:
|
|
336
309
|
self._parameters = self.db.get_model_parameters(
|
|
337
|
-
self.site, self.name, self.
|
|
310
|
+
self.site, self.name, self.collection, self.model_version
|
|
338
311
|
)
|
|
339
312
|
|
|
340
313
|
if self.site is not None:
|
|
341
|
-
|
|
342
|
-
self.
|
|
314
|
+
self._parameters.update(
|
|
315
|
+
self.db.get_model_parameters(
|
|
316
|
+
self.site,
|
|
317
|
+
None,
|
|
318
|
+
"sites",
|
|
319
|
+
self.model_version,
|
|
320
|
+
)
|
|
343
321
|
)
|
|
344
|
-
self._parameters.update(_site_pars)
|
|
345
|
-
|
|
346
322
|
self._load_simulation_software_parameter()
|
|
347
323
|
|
|
348
324
|
def set_extra_label(self, extra_label):
|
|
@@ -368,7 +344,7 @@ class ModelParameter:
|
|
|
368
344
|
"""Return the extra label if defined, if not return ''."""
|
|
369
345
|
return self._extra_label if self._extra_label is not None else ""
|
|
370
346
|
|
|
371
|
-
def get_simtel_parameters(self, parameters=None
|
|
347
|
+
def get_simtel_parameters(self, parameters=None):
|
|
372
348
|
"""
|
|
373
349
|
Get simtel parameters as name and value pairs.
|
|
374
350
|
|
|
@@ -376,10 +352,6 @@ class ModelParameter:
|
|
|
376
352
|
----------
|
|
377
353
|
parameters: dict
|
|
378
354
|
Parameters (simtools) to be renamed (if necessary)
|
|
379
|
-
telescope_model: bool
|
|
380
|
-
If True, telescope model parameters are included.
|
|
381
|
-
site_model: bool
|
|
382
|
-
If True, site model parameters are included.
|
|
383
355
|
|
|
384
356
|
Returns
|
|
385
357
|
-------
|
|
@@ -393,10 +365,7 @@ class ModelParameter:
|
|
|
393
365
|
_simtel_parameter_value = {}
|
|
394
366
|
for key in parameters:
|
|
395
367
|
_par_name = names.get_simulation_software_name_from_parameter_name(
|
|
396
|
-
key,
|
|
397
|
-
simulation_software="sim_telarray",
|
|
398
|
-
search_telescope_parameters=telescope_model,
|
|
399
|
-
search_site_parameters=site_model,
|
|
368
|
+
key, simulation_software="sim_telarray"
|
|
400
369
|
)
|
|
401
370
|
if _par_name is not None:
|
|
402
371
|
_simtel_parameter_value[_par_name] = parameters[key].get("value")
|
|
@@ -512,9 +481,38 @@ class ModelParameter:
|
|
|
512
481
|
for par in self._added_parameter_files:
|
|
513
482
|
pars_from_db.pop(par)
|
|
514
483
|
|
|
515
|
-
self.db.export_model_files(pars_from_db, self.config_file_directory)
|
|
484
|
+
self.db.export_model_files(parameters=pars_from_db, dest=self.config_file_directory)
|
|
516
485
|
self._is_exported_model_files_up_to_date = True
|
|
517
486
|
|
|
487
|
+
def get_model_file_as_table(self, par_name):
|
|
488
|
+
"""
|
|
489
|
+
Return tabular data from file as astropy table.
|
|
490
|
+
|
|
491
|
+
Parameters
|
|
492
|
+
----------
|
|
493
|
+
par_name: str
|
|
494
|
+
Name of the parameter.
|
|
495
|
+
|
|
496
|
+
Returns
|
|
497
|
+
-------
|
|
498
|
+
Table
|
|
499
|
+
Astropy table.
|
|
500
|
+
"""
|
|
501
|
+
_par_entry = {}
|
|
502
|
+
try:
|
|
503
|
+
_par_entry[par_name] = self._parameters[par_name]
|
|
504
|
+
except KeyError as exc:
|
|
505
|
+
raise ValueError(f"Parameter {par_name} not found in the model.") from exc
|
|
506
|
+
self.db.export_model_files(parameters=_par_entry, dest=self.config_file_directory)
|
|
507
|
+
if _par_entry[par_name]["value"].endswith("ecsv"):
|
|
508
|
+
return Table.read(
|
|
509
|
+
self.config_file_directory.joinpath(_par_entry[par_name]["value"]),
|
|
510
|
+
format="ascii.ecsv",
|
|
511
|
+
)
|
|
512
|
+
return simtel_table_reader.read_simtel_table(
|
|
513
|
+
par_name, self.config_file_directory.joinpath(_par_entry[par_name]["value"])
|
|
514
|
+
)
|
|
515
|
+
|
|
518
516
|
def export_config_file(self):
|
|
519
517
|
"""Export the config file used by sim_telarray."""
|
|
520
518
|
# Exporting model file
|
|
@@ -590,7 +588,7 @@ class ModelParameter:
|
|
|
590
588
|
Model directory to export the file to.
|
|
591
589
|
"""
|
|
592
590
|
self.db.export_model_files(
|
|
593
|
-
{
|
|
591
|
+
parameters={
|
|
594
592
|
"nsb_spectrum_at_2200m": {
|
|
595
593
|
"value": self._simulation_config_parameters["simtel"][
|
|
596
594
|
"correct_nsb_spectrum_to_telescope_altitude"
|
|
@@ -598,5 +596,5 @@ class ModelParameter:
|
|
|
598
596
|
"file": True,
|
|
599
597
|
}
|
|
600
598
|
},
|
|
601
|
-
model_directory,
|
|
599
|
+
dest=model_directory,
|
|
602
600
|
)
|
simtools/model/site_model.py
CHANGED
|
@@ -80,7 +80,7 @@ class SiteModel(ModelParameter):
|
|
|
80
80
|
Site-related CORSIKA parameters as dict
|
|
81
81
|
"""
|
|
82
82
|
if config_file_style:
|
|
83
|
-
model_directory = model_directory or Path(
|
|
83
|
+
model_directory = model_directory or Path()
|
|
84
84
|
return {
|
|
85
85
|
"OBSLEV": [
|
|
86
86
|
self.get_parameter_value_with_unit("corsika_observation_level").to_value("cm")
|
|
@@ -151,11 +151,11 @@ class SiteModel(ModelParameter):
|
|
|
151
151
|
Model directory to export the file to.
|
|
152
152
|
"""
|
|
153
153
|
self.db.export_model_files(
|
|
154
|
-
{
|
|
154
|
+
parameters={
|
|
155
155
|
"atmospheric_transmission_file": {
|
|
156
156
|
"value": self.get_parameter_value("atmospheric_profile"),
|
|
157
157
|
"file": True,
|
|
158
158
|
}
|
|
159
159
|
},
|
|
160
|
-
model_directory,
|
|
160
|
+
dest=model_directory,
|
|
161
161
|
)
|