gammasimtools 0.6.1__py3-none-any.whl → 0.8.2__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 (355) hide show
  1. gammasimtools-0.8.2.dist-info/METADATA +173 -0
  2. gammasimtools-0.8.2.dist-info/RECORD +345 -0
  3. {gammasimtools-0.6.1.dist-info → gammasimtools-0.8.2.dist-info}/WHEEL +1 -1
  4. gammasimtools-0.8.2.dist-info/entry_points.txt +31 -0
  5. simtools/_dev_version/__init__.py +9 -0
  6. simtools/_version.py +2 -2
  7. simtools/applications/calculate_trigger_rate.py +210 -0
  8. simtools/applications/convert_all_model_parameters_from_simtel.py +372 -0
  9. simtools/applications/{print_array_elements.py → convert_geo_coordinates_of_array_elements.py} +58 -63
  10. simtools/applications/convert_model_parameter_from_simtel.py +119 -0
  11. simtools/applications/{add_file_to_db.py → db_add_file_to_db.py} +70 -60
  12. simtools/applications/db_add_model_parameters_from_repository_to_db.py +184 -0
  13. simtools/applications/db_add_value_from_json_to_db.py +105 -0
  14. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +180 -0
  15. simtools/applications/db_get_array_layouts_from_db.py +162 -0
  16. simtools/applications/{get_file_from_db.py → db_get_file_from_db.py} +30 -34
  17. simtools/applications/db_get_parameter_from_db.py +131 -0
  18. simtools/applications/db_inspect_databases.py +52 -0
  19. simtools/applications/derive_mirror_rnda.py +39 -255
  20. simtools/applications/derive_psf_parameters.py +441 -0
  21. simtools/applications/generate_array_config.py +82 -0
  22. simtools/applications/generate_corsika_histograms.py +52 -52
  23. simtools/applications/generate_default_metadata.py +5 -8
  24. simtools/applications/generate_regular_arrays.py +117 -0
  25. simtools/applications/generate_simtel_array_histograms.py +97 -56
  26. simtools/applications/plot_array_layout.py +345 -115
  27. simtools/applications/production_generate_simulation_config.py +158 -0
  28. simtools/applications/production_scale_events.py +168 -0
  29. simtools/applications/simulate_light_emission.py +478 -0
  30. simtools/applications/simulate_prod.py +97 -175
  31. simtools/applications/submit_data_from_external.py +9 -12
  32. simtools/applications/submit_model_parameter_from_external.py +122 -0
  33. simtools/applications/validate_camera_efficiency.py +35 -102
  34. simtools/applications/validate_camera_fov.py +20 -19
  35. simtools/applications/{compare_cumulative_psf.py → validate_cumulative_psf.py} +45 -44
  36. simtools/applications/validate_file_using_schema.py +111 -47
  37. simtools/applications/validate_optics.py +17 -22
  38. simtools/camera_efficiency.py +193 -202
  39. simtools/configuration/commandline_parser.py +384 -96
  40. simtools/configuration/configurator.py +55 -71
  41. simtools/constants.py +5 -5
  42. simtools/corsika/corsika_config.py +482 -342
  43. simtools/corsika/corsika_histograms.py +226 -204
  44. simtools/corsika/corsika_histograms_visualize.py +23 -24
  45. simtools/corsika/primary_particle.py +159 -0
  46. simtools/data_model/data_reader.py +25 -20
  47. simtools/data_model/format_checkers.py +52 -0
  48. simtools/data_model/metadata_collector.py +211 -185
  49. simtools/data_model/metadata_model.py +115 -37
  50. simtools/data_model/model_data_writer.py +335 -26
  51. simtools/data_model/validate_data.py +366 -154
  52. simtools/db/db_array_elements.py +130 -0
  53. simtools/db/db_from_repo_handler.py +106 -0
  54. simtools/db/db_handler.py +1246 -0
  55. simtools/io_operations/hdf5_handler.py +3 -1
  56. simtools/io_operations/io_handler.py +32 -57
  57. simtools/job_execution/job_manager.py +82 -69
  58. simtools/layout/array_layout.py +325 -537
  59. simtools/layout/geo_coordinates.py +8 -11
  60. simtools/layout/telescope_position.py +163 -86
  61. simtools/model/array_model.py +312 -259
  62. simtools/model/calibration_model.py +50 -0
  63. simtools/model/camera.py +277 -523
  64. simtools/model/mirrors.py +68 -49
  65. simtools/model/model_parameter.py +602 -0
  66. simtools/model/model_utils.py +11 -39
  67. simtools/model/site_model.py +161 -0
  68. simtools/model/telescope_model.py +143 -633
  69. simtools/production_configuration/calculate_statistical_errors_grid_point.py +454 -0
  70. simtools/production_configuration/event_scaler.py +146 -0
  71. simtools/production_configuration/generate_simulation_config.py +193 -0
  72. simtools/production_configuration/interpolation_handler.py +197 -0
  73. simtools/ray_tracing/__init__.py +0 -0
  74. simtools/ray_tracing/mirror_panel_psf.py +280 -0
  75. simtools/{psf_analysis.py → ray_tracing/psf_analysis.py} +133 -47
  76. simtools/ray_tracing/ray_tracing.py +646 -0
  77. simtools/runners/__init__.py +0 -0
  78. simtools/runners/corsika_runner.py +240 -0
  79. simtools/runners/corsika_simtel_runner.py +225 -0
  80. simtools/runners/runner_services.py +307 -0
  81. simtools/runners/simtel_runner.py +224 -0
  82. simtools/schemas/array_elements.yml +137 -0
  83. simtools/schemas/integration_tests_config.metaschema.yml +93 -0
  84. simtools/schemas/metadata.metaschema.yml +6 -0
  85. simtools/schemas/model_parameter.metaschema.yml +78 -0
  86. simtools/schemas/{data.metaschema.yml → model_parameter_and_data_schema.metaschema.yml} +27 -44
  87. simtools/schemas/model_parameters/adjust_gain.schema.yml +37 -0
  88. simtools/schemas/model_parameters/altitude.schema.yml +37 -0
  89. simtools/schemas/model_parameters/array_coordinates.schema.yml +33 -0
  90. simtools/schemas/model_parameters/array_coordinates_UTM.schema.yml +77 -0
  91. simtools/schemas/model_parameters/array_element_position_ground.schema.yml +39 -0
  92. simtools/schemas/model_parameters/array_element_position_utm.schema.yml +39 -0
  93. simtools/schemas/model_parameters/array_layouts.schema.yml +48 -0
  94. simtools/schemas/model_parameters/array_triggers.schema.yml +93 -0
  95. simtools/schemas/model_parameters/asum_clipping.schema.yml +38 -0
  96. simtools/schemas/model_parameters/asum_offset.schema.yml +35 -0
  97. simtools/schemas/model_parameters/asum_shaping.schema.yml +35 -0
  98. simtools/schemas/model_parameters/asum_threshold.schema.yml +38 -0
  99. simtools/schemas/model_parameters/atmospheric_profile.schema.yml +32 -0
  100. simtools/schemas/model_parameters/atmospheric_transmission.schema.yml +35 -0
  101. simtools/schemas/model_parameters/axes_offsets.schema.yml +53 -0
  102. simtools/schemas/model_parameters/camera_body_diameter.schema.yml +40 -0
  103. simtools/schemas/model_parameters/camera_body_shape.schema.yml +45 -0
  104. simtools/schemas/model_parameters/camera_config_file.schema.yml +40 -0
  105. simtools/schemas/model_parameters/camera_config_rotate.schema.yml +36 -0
  106. simtools/schemas/model_parameters/camera_degraded_efficiency.schema.yml +43 -0
  107. simtools/schemas/model_parameters/camera_degraded_map.schema.yml +42 -0
  108. simtools/schemas/model_parameters/camera_depth.schema.yml +42 -0
  109. simtools/schemas/model_parameters/camera_filter.schema.yml +45 -0
  110. simtools/schemas/model_parameters/camera_filter_incidence_angle.schema.yml +29 -0
  111. simtools/schemas/model_parameters/camera_pixels.schema.yml +36 -0
  112. simtools/schemas/model_parameters/camera_transmission.schema.yml +41 -0
  113. simtools/schemas/model_parameters/channels_per_chip.schema.yml +36 -0
  114. simtools/schemas/model_parameters/correct_nsb_spectrum_to_telescope_altitude.schema.yml +35 -0
  115. simtools/schemas/model_parameters/corsika_cherenkov_photon_bunch_size.schema.yml +27 -0
  116. simtools/schemas/model_parameters/corsika_cherenkov_photon_wavelength_range.schema.yml +38 -0
  117. simtools/schemas/model_parameters/corsika_first_interaction_height.schema.yml +28 -0
  118. simtools/schemas/model_parameters/corsika_iact_io_buffer.schema.yml +23 -0
  119. simtools/schemas/model_parameters/corsika_iact_max_bunches.schema.yml +27 -0
  120. simtools/schemas/model_parameters/corsika_iact_split_auto.schema.yml +28 -0
  121. simtools/schemas/model_parameters/corsika_longitudinal_shower_development.schema.yml +27 -0
  122. simtools/schemas/model_parameters/corsika_observation_level.schema.yml +38 -0
  123. simtools/schemas/model_parameters/corsika_particle_kinetic_energy_cutoff.schema.yml +52 -0
  124. simtools/schemas/model_parameters/corsika_starting_grammage.schema.yml +27 -0
  125. simtools/schemas/model_parameters/dark_events.schema.yml +32 -0
  126. simtools/schemas/model_parameters/default_trigger.schema.yml +35 -0
  127. simtools/schemas/model_parameters/design_model.schema.yml +31 -0
  128. simtools/schemas/model_parameters/disc_ac_coupled.schema.yml +32 -0
  129. simtools/schemas/model_parameters/disc_bins.schema.yml +39 -0
  130. simtools/schemas/model_parameters/disc_start.schema.yml +41 -0
  131. simtools/schemas/model_parameters/discriminator_amplitude.schema.yml +42 -0
  132. simtools/schemas/model_parameters/discriminator_fall_time.schema.yml +41 -0
  133. simtools/schemas/model_parameters/discriminator_gate_length.schema.yml +41 -0
  134. simtools/schemas/model_parameters/discriminator_hysteresis.schema.yml +39 -0
  135. simtools/schemas/model_parameters/discriminator_output_amplitude.schema.yml +40 -0
  136. simtools/schemas/model_parameters/discriminator_output_var_percent.schema.yml +41 -0
  137. simtools/schemas/model_parameters/discriminator_pulse_shape.schema.yml +33 -0
  138. simtools/schemas/model_parameters/discriminator_rise_time.schema.yml +42 -0
  139. simtools/schemas/model_parameters/discriminator_scale_threshold.schema.yml +37 -0
  140. simtools/schemas/model_parameters/discriminator_sigsum_over_threshold.schema.yml +44 -0
  141. simtools/schemas/model_parameters/discriminator_threshold.schema.yml +36 -0
  142. simtools/schemas/model_parameters/discriminator_time_over_threshold.schema.yml +45 -0
  143. simtools/schemas/model_parameters/discriminator_var_gate_length.schema.yml +40 -0
  144. simtools/schemas/model_parameters/discriminator_var_sigsum_over_threshold.schema.yml +41 -0
  145. simtools/schemas/model_parameters/discriminator_var_threshold.schema.yml +38 -0
  146. simtools/schemas/model_parameters/discriminator_var_time_over_threshold.schema.yml +38 -0
  147. simtools/schemas/model_parameters/dish_shape_length.schema.yml +41 -0
  148. simtools/schemas/model_parameters/dsum_clipping.schema.yml +38 -0
  149. simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +38 -0
  150. simtools/schemas/model_parameters/dsum_offset.schema.yml +37 -0
  151. simtools/schemas/model_parameters/dsum_pedsub.schema.yml +33 -0
  152. simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +39 -0
  153. simtools/schemas/model_parameters/dsum_prescale.schema.yml +44 -0
  154. simtools/schemas/model_parameters/dsum_presum_max.schema.yml +38 -0
  155. simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +45 -0
  156. simtools/schemas/model_parameters/dsum_shaping.schema.yml +44 -0
  157. simtools/schemas/model_parameters/dsum_shaping_renormalize.schema.yml +32 -0
  158. simtools/schemas/model_parameters/dsum_threshold.schema.yml +43 -0
  159. simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +42 -0
  160. simtools/schemas/model_parameters/effective_focal_length.schema.yml +61 -0
  161. simtools/schemas/model_parameters/epsg_code.schema.yml +37 -0
  162. simtools/schemas/model_parameters/fadc_ac_coupled.schema.yml +35 -0
  163. simtools/schemas/model_parameters/fadc_amplitude.schema.yml +46 -0
  164. simtools/schemas/model_parameters/fadc_bins.schema.yml +40 -0
  165. simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +50 -0
  166. simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +38 -0
  167. simtools/schemas/model_parameters/fadc_err_compensate_pedestal.schema.yml +42 -0
  168. simtools/schemas/model_parameters/fadc_err_pedestal.schema.yml +49 -0
  169. simtools/schemas/model_parameters/fadc_lg_amplitude.schema.yml +47 -0
  170. simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +51 -0
  171. simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +37 -0
  172. simtools/schemas/model_parameters/fadc_lg_err_compensate_pedestal.schema.yml +43 -0
  173. simtools/schemas/model_parameters/fadc_lg_err_pedestal.schema.yml +49 -0
  174. simtools/schemas/model_parameters/fadc_lg_max_signal.schema.yml +43 -0
  175. simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +39 -0
  176. simtools/schemas/model_parameters/fadc_lg_noise.schema.yml +42 -0
  177. simtools/schemas/model_parameters/fadc_lg_pedestal.schema.yml +40 -0
  178. simtools/schemas/model_parameters/fadc_lg_sensitivity.schema.yml +50 -0
  179. simtools/schemas/model_parameters/fadc_lg_sysvar_pedestal.schema.yml +42 -0
  180. simtools/schemas/model_parameters/fadc_lg_var_pedestal.schema.yml +41 -0
  181. simtools/schemas/model_parameters/fadc_lg_var_sensitivity.schema.yml +42 -0
  182. simtools/schemas/model_parameters/fadc_max_signal.schema.yml +43 -0
  183. simtools/schemas/model_parameters/fadc_max_sum.schema.yml +39 -0
  184. simtools/schemas/model_parameters/fadc_mhz.schema.yml +31 -0
  185. simtools/schemas/model_parameters/fadc_noise.schema.yml +41 -0
  186. simtools/schemas/model_parameters/fadc_pedestal.schema.yml +40 -0
  187. simtools/schemas/model_parameters/fadc_pulse_shape.schema.yml +39 -0
  188. simtools/schemas/model_parameters/fadc_sensitivity.schema.yml +50 -0
  189. simtools/schemas/model_parameters/fadc_sum_bins.schema.yml +43 -0
  190. simtools/schemas/model_parameters/fadc_sum_offset.schema.yml +43 -0
  191. simtools/schemas/model_parameters/fadc_sysvar_pedestal.schema.yml +42 -0
  192. simtools/schemas/model_parameters/fadc_var_pedestal.schema.yml +41 -0
  193. simtools/schemas/model_parameters/fadc_var_sensitivity.schema.yml +42 -0
  194. simtools/schemas/model_parameters/flatfielding.schema.yml +37 -0
  195. simtools/schemas/model_parameters/focal_length.schema.yml +45 -0
  196. simtools/schemas/model_parameters/focal_surface_parameters.schema.yml +158 -0
  197. simtools/schemas/model_parameters/focal_surface_ref_radius.schema.yml +29 -0
  198. simtools/schemas/model_parameters/focus_offset.schema.yml +66 -0
  199. simtools/schemas/model_parameters/gain_variation.schema.yml +43 -0
  200. simtools/schemas/model_parameters/geomag_horizontal.schema.yml +34 -0
  201. simtools/schemas/model_parameters/geomag_rotation.schema.yml +37 -0
  202. simtools/schemas/model_parameters/geomag_vertical.schema.yml +34 -0
  203. simtools/schemas/model_parameters/hg_lg_variation.schema.yml +36 -0
  204. simtools/schemas/model_parameters/iobuf_maximum.schema.yml +34 -0
  205. simtools/schemas/model_parameters/iobuf_output_maximum.schema.yml +34 -0
  206. simtools/schemas/model_parameters/laser_events.schema.yml +36 -0
  207. simtools/schemas/model_parameters/laser_external_trigger.schema.yml +35 -0
  208. simtools/schemas/model_parameters/laser_photons.schema.yml +32 -0
  209. simtools/schemas/model_parameters/laser_pulse_exptime.schema.yml +34 -0
  210. simtools/schemas/model_parameters/laser_pulse_offset.schema.yml +34 -0
  211. simtools/schemas/model_parameters/laser_pulse_sigtime.schema.yml +33 -0
  212. simtools/schemas/model_parameters/laser_pulse_twidth.schema.yml +33 -0
  213. simtools/schemas/model_parameters/laser_var_photons.schema.yml +33 -0
  214. simtools/schemas/model_parameters/laser_wavelength.schema.yml +33 -0
  215. simtools/schemas/model_parameters/led_events.schema.yml +34 -0
  216. simtools/schemas/model_parameters/led_photons.schema.yml +34 -0
  217. simtools/schemas/model_parameters/led_pulse_offset.schema.yml +32 -0
  218. simtools/schemas/model_parameters/led_pulse_sigtime.schema.yml +33 -0
  219. simtools/schemas/model_parameters/led_var_photons.schema.yml +34 -0
  220. simtools/schemas/model_parameters/lightguide_efficiency_vs_incidence_angle.schema.yml +41 -0
  221. simtools/schemas/model_parameters/lightguide_efficiency_vs_wavelength.schema.yml +43 -0
  222. simtools/schemas/model_parameters/min_photoelectrons.schema.yml +35 -0
  223. simtools/schemas/model_parameters/min_photons.schema.yml +32 -0
  224. simtools/schemas/model_parameters/mirror_align_random_distance.schema.yml +36 -0
  225. simtools/schemas/model_parameters/mirror_align_random_horizontal.schema.yml +64 -0
  226. simtools/schemas/model_parameters/mirror_align_random_vertical.schema.yml +64 -0
  227. simtools/schemas/model_parameters/mirror_class.schema.yml +41 -0
  228. simtools/schemas/model_parameters/mirror_degraded_reflection.schema.yml +51 -0
  229. simtools/schemas/model_parameters/mirror_focal_length.schema.yml +42 -0
  230. simtools/schemas/model_parameters/mirror_list.schema.yml +38 -0
  231. simtools/schemas/model_parameters/mirror_offset.schema.yml +41 -0
  232. simtools/schemas/model_parameters/mirror_panel_2f_measurements.schema.yml +39 -0
  233. simtools/schemas/model_parameters/mirror_reflection_random_angle.schema.yml +61 -0
  234. simtools/schemas/model_parameters/mirror_reflectivity.schema.yml +40 -0
  235. simtools/schemas/model_parameters/multiplicity_offset.schema.yml +46 -0
  236. simtools/schemas/model_parameters/nsb_autoscale_airmass.schema.yml +51 -0
  237. simtools/schemas/model_parameters/nsb_gain_drop_scale.schema.yml +37 -0
  238. simtools/schemas/model_parameters/nsb_offaxis.schema.yml +79 -0
  239. simtools/schemas/model_parameters/nsb_pixel_rate.schema.yml +47 -0
  240. simtools/schemas/model_parameters/nsb_reference_spectrum.schema.yml +34 -0
  241. simtools/schemas/model_parameters/nsb_reference_value.schema.yml +33 -0
  242. simtools/schemas/model_parameters/nsb_scaling_factor.schema.yml +35 -0
  243. simtools/schemas/model_parameters/nsb_skymap.schema.yml +39 -0
  244. simtools/schemas/model_parameters/nsb_spectrum.schema.yml +50 -0
  245. simtools/schemas/model_parameters/num_gains.schema.yml +34 -0
  246. simtools/schemas/model_parameters/only_triggered_telescopes.schema.yml +33 -0
  247. simtools/schemas/model_parameters/optics_properties.schema.yml +31 -0
  248. simtools/schemas/model_parameters/parabolic_dish.schema.yml +32 -0
  249. simtools/schemas/model_parameters/pedestal_events.schema.yml +32 -0
  250. simtools/schemas/model_parameters/photon_delay.schema.yml +38 -0
  251. simtools/schemas/model_parameters/photons_per_run.schema.yml +33 -0
  252. simtools/schemas/model_parameters/pixel_cells.schema.yml +35 -0
  253. simtools/schemas/model_parameters/pixels_parallel.schema.yml +54 -0
  254. simtools/schemas/model_parameters/pixeltrg_time_step.schema.yml +40 -0
  255. simtools/schemas/model_parameters/pm_average_gain.schema.yml +34 -0
  256. simtools/schemas/model_parameters/pm_collection_efficiency.schema.yml +40 -0
  257. simtools/schemas/model_parameters/pm_gain_index.schema.yml +36 -0
  258. simtools/schemas/model_parameters/pm_photoelectron_spectrum.schema.yml +41 -0
  259. simtools/schemas/model_parameters/pm_transit_time.schema.yml +63 -0
  260. simtools/schemas/model_parameters/pm_voltage_variation.schema.yml +39 -0
  261. simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +42 -0
  262. simtools/schemas/model_parameters/primary_mirror_diameter.schema.yml +33 -0
  263. simtools/schemas/model_parameters/primary_mirror_hole_diameter.schema.yml +33 -0
  264. simtools/schemas/model_parameters/primary_mirror_incidence_angle.schema.yml +29 -0
  265. simtools/schemas/model_parameters/primary_mirror_parameters.schema.yml +168 -0
  266. simtools/schemas/model_parameters/primary_mirror_ref_radius.schema.yml +36 -0
  267. simtools/schemas/model_parameters/primary_mirror_segmentation.schema.yml +34 -0
  268. simtools/schemas/model_parameters/qe_variation.schema.yml +43 -0
  269. simtools/schemas/model_parameters/quantum_efficiency.schema.yml +42 -0
  270. simtools/schemas/model_parameters/random_focal_length.schema.yml +45 -0
  271. simtools/schemas/model_parameters/random_generator.schema.yml +36 -0
  272. simtools/schemas/model_parameters/reference_point_altitude.schema.yml +35 -0
  273. simtools/schemas/model_parameters/reference_point_latitude.schema.yml +36 -0
  274. simtools/schemas/model_parameters/reference_point_longitude.schema.yml +36 -0
  275. simtools/schemas/model_parameters/reference_point_utm_east.schema.yml +34 -0
  276. simtools/schemas/model_parameters/reference_point_utm_north.schema.yml +34 -0
  277. simtools/schemas/model_parameters/sampled_output.schema.yml +31 -0
  278. simtools/schemas/model_parameters/save_pe_with_amplitude.schema.yml +34 -0
  279. simtools/schemas/model_parameters/secondary_mirror_baffle.schema.yml +79 -0
  280. simtools/schemas/model_parameters/secondary_mirror_degraded_map.schema.yml +42 -0
  281. simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +41 -0
  282. simtools/schemas/model_parameters/secondary_mirror_diameter.schema.yml +33 -0
  283. simtools/schemas/model_parameters/secondary_mirror_hole_diameter.schema.yml +36 -0
  284. simtools/schemas/model_parameters/secondary_mirror_incidence_angle.schema.yml +29 -0
  285. simtools/schemas/model_parameters/secondary_mirror_parameters.schema.yml +168 -0
  286. simtools/schemas/model_parameters/secondary_mirror_ref_radius.schema.yml +36 -0
  287. simtools/schemas/model_parameters/secondary_mirror_reflectivity.schema.yml +35 -0
  288. simtools/schemas/model_parameters/secondary_mirror_segmentation.schema.yml +37 -0
  289. simtools/schemas/model_parameters/secondary_mirror_shadow_diameter.schema.yml +40 -0
  290. simtools/schemas/model_parameters/secondary_mirror_shadow_offset.schema.yml +40 -0
  291. simtools/schemas/model_parameters/store_photoelectrons.schema.yml +41 -0
  292. simtools/schemas/model_parameters/tailcut_scale.schema.yml +40 -0
  293. simtools/schemas/model_parameters/telescope_axis_height.schema.yml +31 -0
  294. simtools/schemas/model_parameters/telescope_random_angle.schema.yml +35 -0
  295. simtools/schemas/model_parameters/telescope_random_error.schema.yml +34 -0
  296. simtools/schemas/model_parameters/telescope_sphere_radius.schema.yml +37 -0
  297. simtools/schemas/model_parameters/telescope_transmission.schema.yml +113 -0
  298. simtools/schemas/model_parameters/teltrig_min_sigsum.schema.yml +41 -0
  299. simtools/schemas/model_parameters/teltrig_min_time.schema.yml +36 -0
  300. simtools/schemas/model_parameters/transit_time_calib_error.schema.yml +36 -0
  301. simtools/schemas/model_parameters/transit_time_compensate_error.schema.yml +37 -0
  302. simtools/schemas/model_parameters/transit_time_compensate_step.schema.yml +38 -0
  303. simtools/schemas/model_parameters/transit_time_error.schema.yml +45 -0
  304. simtools/schemas/model_parameters/transit_time_jitter.schema.yml +36 -0
  305. simtools/schemas/model_parameters/trigger_current_limit.schema.yml +32 -0
  306. simtools/schemas/model_parameters/trigger_delay_compensation.schema.yml +53 -0
  307. simtools/schemas/model_parameters/trigger_pixels.schema.yml +40 -0
  308. simtools/simtel/simtel_config_reader.py +353 -0
  309. simtools/simtel/simtel_config_writer.py +244 -63
  310. simtools/simtel/{simtel_events.py → simtel_io_events.py} +26 -25
  311. simtools/simtel/simtel_io_histogram.py +661 -0
  312. simtools/simtel/simtel_io_histograms.py +569 -0
  313. simtools/simtel/simulator_array.py +145 -0
  314. simtools/simtel/{simtel_runner_camera_efficiency.py → simulator_camera_efficiency.py} +76 -52
  315. simtools/simtel/simulator_light_emission.py +473 -0
  316. simtools/simtel/simulator_ray_tracing.py +262 -0
  317. simtools/simulator.py +220 -446
  318. simtools/testing/__init__.py +0 -0
  319. simtools/testing/assertions.py +151 -0
  320. simtools/testing/configuration.py +226 -0
  321. simtools/testing/helpers.py +42 -0
  322. simtools/testing/validate_output.py +240 -0
  323. simtools/utils/general.py +340 -437
  324. simtools/utils/geometry.py +12 -12
  325. simtools/utils/names.py +257 -644
  326. simtools/utils/value_conversion.py +176 -0
  327. simtools/version.py +3 -1
  328. simtools/visualization/legend_handlers.py +135 -152
  329. simtools/visualization/plot_camera.py +379 -0
  330. simtools/visualization/visualize.py +346 -167
  331. gammasimtools-0.6.1.dist-info/METADATA +0 -180
  332. gammasimtools-0.6.1.dist-info/RECORD +0 -91
  333. gammasimtools-0.6.1.dist-info/entry_points.txt +0 -23
  334. simtools/_dev_version/scm_version.py +0 -10
  335. simtools/applications/db_development_tools/add_new_parameter_to_db.py +0 -81
  336. simtools/applications/db_development_tools/add_unit_to_parameter_in_db.py +0 -59
  337. simtools/applications/db_development_tools/mark_non_optics_parameters_non_applicable.py +0 -102
  338. simtools/applications/get_parameter.py +0 -92
  339. simtools/applications/make_regular_arrays.py +0 -160
  340. simtools/applications/produce_array_config.py +0 -136
  341. simtools/applications/production.py +0 -313
  342. simtools/applications/sim_showers_for_trigger_rates.py +0 -187
  343. simtools/applications/tune_psf.py +0 -334
  344. simtools/corsika/corsika_default_config.py +0 -282
  345. simtools/corsika/corsika_runner.py +0 -450
  346. simtools/corsika_simtel/corsika_simtel_runner.py +0 -197
  347. simtools/db_handler.py +0 -1480
  348. simtools/ray_tracing.py +0 -525
  349. simtools/simtel/simtel_histograms.py +0 -414
  350. simtools/simtel/simtel_runner.py +0 -244
  351. simtools/simtel/simtel_runner_array.py +0 -293
  352. simtools/simtel/simtel_runner_ray_tracing.py +0 -277
  353. {gammasimtools-0.6.1.dist-info → gammasimtools-0.8.2.dist-info}/LICENSE +0 -0
  354. {gammasimtools-0.6.1.dist-info → gammasimtools-0.8.2.dist-info}/top_level.txt +0 -0
  355. /simtools/{corsika_simtel → db}/__init__.py +0 -0
@@ -1,360 +1,253 @@
1
+ """Definition of the ArrayModel class."""
2
+
1
3
  import logging
2
- from copy import copy
4
+ from pathlib import Path
5
+
6
+ import astropy.units as u
7
+ from astropy.table import QTable
3
8
 
4
- from simtools import db_handler
9
+ from simtools.data_model import data_reader
10
+ from simtools.db import db_array_elements, db_handler
5
11
  from simtools.io_operations import io_handler
6
- from simtools.layout.array_layout import ArrayLayout
12
+ from simtools.model.site_model import SiteModel
7
13
  from simtools.model.telescope_model import TelescopeModel
8
14
  from simtools.simtel.simtel_config_writer import SimtelConfigWriter
9
- from simtools.utils import names
10
- from simtools.utils.general import collect_data_from_file_or_dict
11
-
12
- __all__ = ["ArrayModel", "InvalidArrayConfigData"]
15
+ from simtools.utils import general, names
13
16
 
14
-
15
- class InvalidArrayConfigData(Exception):
16
- """Exception for invalid array configuration data."""
17
+ __all__ = ["ArrayModel"]
17
18
 
18
19
 
19
20
  class ArrayModel:
20
21
  """
21
- ArrayModel is an abstract representation of the MC model at the array level. It contains the\
22
- list of TelescopeModel's and a ArrayLayout.
22
+ Representation of an observatory consisting of site, telescopes, and further devices.
23
23
 
24
24
  Parameters
25
25
  ----------
26
26
  mongo_db_config: dict
27
27
  MongoDB configuration.
28
- array_config_file: str
29
- Path to a yaml file with the array config data.
30
- array_config_data: dict
31
- Dict with the array config data.
32
- label: str
33
- Instance label. Important for output file naming.
28
+ model_version: str
29
+ Model version.
30
+ label: str, optional
31
+ Instance label. Used for output file naming.
32
+ site: str, optional
33
+ Site name.
34
+ layout_name: str, optional
35
+ Layout name.
36
+ array_elements: Union[str, Path, List[str]], optional
37
+ Array element definitions (list of array element or path to file with
38
+ the array element positions).
34
39
  """
35
40
 
36
- def __init__(self, mongo_db_config, label=None, array_config_file=None, array_config_data=None):
37
- """
38
- Initialize ArrayModel.
39
- """
41
+ def __init__(
42
+ self,
43
+ mongo_db_config: dict,
44
+ model_version: str,
45
+ label: str | None = None,
46
+ site: str | None = None,
47
+ layout_name: str | None = None,
48
+ array_elements: str | Path | list[str] | None = None,
49
+ ):
50
+ """Initialize ArrayModel."""
40
51
  self._logger = logging.getLogger(__name__)
41
52
  self._logger.debug("Init ArrayModel")
42
53
  self.mongo_db_config = mongo_db_config
54
+ self.model_version = model_version
43
55
  self.label = label
44
- self.site = None
45
- self.layout = None
46
- self.layout_name = None
47
- self.model_version = None
56
+ self.layout_name = layout_name
48
57
  self._config_file_path = None
58
+ self._config_file_directory = None
49
59
  self.io_handler = io_handler.IOHandler()
50
- array_config_data = collect_data_from_file_or_dict(array_config_file, array_config_data)
51
- self._load_array_data(array_config_data)
52
- self._set_config_file_directory()
53
- self._build_array_model()
60
+ self.db = db_handler.DatabaseHandler(mongo_db_config=mongo_db_config)
61
+
62
+ self.array_elements, self.site_model, self.telescope_model = self._initialize(
63
+ site, array_elements
64
+ )
65
+
54
66
  self._telescope_model_files_exported = False
55
67
  self._array_model_file_exported = False
56
68
 
57
- @property
58
- def number_of_telescopes(self):
59
- """
60
- Return the number of telescopes.
61
-
62
- Returns
63
- -------
64
- int
65
- Number of telescopes.
69
+ def _initialize(self, site: str, array_elements_config: str | Path | list[str]):
66
70
  """
67
- return self.layout.get_number_of_telescopes()
68
-
69
- def _load_array_data(self, array_config_data):
70
- """Load parameters from array_data.
71
+ Initialize ArrayModel taking different configuration options into account.
71
72
 
72
73
  Parameters
73
74
  ----------
74
- array_config_data: dict
75
- """
76
-
77
- # Validating array_config_data
78
- # Keys 'site', 'layout_name' and 'default' are mandatory.
79
- # 'default' must have 'LST', 'MST' and 'SST' (for South site) keys.
80
- self._validate_array_data(array_config_data)
81
-
82
- # Site
83
- self.site = names.validate_site_name(array_config_data["site"])
75
+ site: str
76
+ Site name.
77
+ array_elements_config: Union[str, Path, List[str]]
78
+ Array element definitions.
84
79
 
85
- # Grabbing layout name and building ArrayLayout
86
- self.layout_name = names.validate_array_layout_name(array_config_data["layout_name"])
87
- self.layout = ArrayLayout.from_array_layout_name(
80
+ Returns
81
+ -------
82
+ dict
83
+ Dict with telescope positions.
84
+ SiteModel
85
+ Site model.
86
+ dict
87
+ Dict with telescope models.
88
+ """
89
+ self._logger.debug(f"Getting site parameters from DB ({site})")
90
+ site_model = SiteModel(
91
+ site=names.validate_site_name(site),
88
92
  mongo_db_config=self.mongo_db_config,
89
- array_layout_name=self.site + "-" + self.layout_name,
93
+ model_version=self.model_version,
90
94
  label=self.label,
91
95
  )
92
96
 
93
- # Model version
94
- if (
95
- "model_version" not in array_config_data.keys()
96
- or array_config_data["model_version"] is None
97
- ):
98
- self._logger.warning("model_version not given in array_config_data - using 'Released'")
99
- self.model_version = "Released"
100
- else:
101
- self.model_version = names.validate_model_version_name(
102
- array_config_data["model_version"]
97
+ array_elements = {}
98
+ # Case 1: array_elements is a file name
99
+ if isinstance(array_elements_config, str | Path):
100
+ array_elements = self._load_array_element_positions_from_file(
101
+ array_elements_config, site
103
102
  )
103
+ # Case 2: array elements is a list of elements
104
+ elif isinstance(array_elements_config, list):
105
+ array_elements = self._get_array_elements_from_list(array_elements_config)
106
+ # Case 3: array elements defined in DB by array layout name
107
+ elif self.layout_name is not None:
108
+ array_elements = self._get_array_elements_from_list(
109
+ site_model.get_array_elements_for_layout(self.layout_name)
110
+ )
111
+ if not array_elements:
112
+ raise ValueError(
113
+ "No array elements found. "
114
+ "Possibly missing valid layout name or missing telescope list."
115
+ )
116
+ telescope_model = self._build_telescope_models(site_model, array_elements)
117
+ return array_elements, site_model, telescope_model
104
118
 
105
- # Removing keys that were stored in attributes and keeping the remaining as a dict
106
- self._array_config_data = {
107
- k: v
108
- for (k, v) in array_config_data.items()
109
- if k not in ["site", "layout_name", "model_version"]
110
- }
111
-
112
- def _validate_array_data(self, array_config_data):
113
- """
114
- Validate array_data by checking the existence of the relevant keys. Searching for the keys:\
115
- 'site', 'array' and 'default'.
119
+ @property
120
+ def number_of_telescopes(self) -> int:
116
121
  """
122
+ Return the number of telescopes.
117
123
 
118
- def run_over_pars(pars, data, parent=None):
119
- """Run over pars and validate it."""
120
- all_keys = data.keys() if parent is None else data[parent].keys()
121
- for pp in pars:
122
- if pp not in all_keys:
123
- key = pp if parent is None else parent + "." + pp
124
- msg = (
125
- f"Key {key} was not found in array_config_data "
126
- + "- impossible to build array model"
127
- )
128
- self._logger.error(msg)
129
- raise InvalidArrayConfigData(msg)
130
-
131
- run_over_pars(["site", "layout_name", "default"], array_config_data)
132
-
133
- def _set_config_file_directory(self):
134
- """Define the variable _config_file_directory and create directories, if needed"""
135
- self._config_file_directory = self.io_handler.get_output_directory(self.label, "model")
136
- if not self._config_file_directory.exists():
137
- self._config_file_directory.mkdir(parents=True, exist_ok=True)
138
- self._logger.info(f"Creating directory {self._config_file_directory}")
139
-
140
- def _build_array_model(self):
124
+ Returns
125
+ -------
126
+ int
127
+ Number of telescopes.
141
128
  """
142
- Build the site parameters and the list of telescope models,
143
- including reading the parameters from the DB.
129
+ return len(self.telescope_model)
144
130
 
131
+ @property
132
+ def site(self) -> str:
145
133
  """
134
+ Return site.
146
135
 
147
- # Getting site parameters from DB
148
- self._logger.debug("Getting site parameters from DB")
149
- db = db_handler.DatabaseHandler(mongo_db_config=self.mongo_db_config)
150
- self._site_parameters = db.get_site_parameters(
151
- self.site, self.model_version, only_applicable=True
152
- )
153
-
154
- # Building telescope models
155
- self._telescope_model = [] # List of telescope models
156
- _all_telescope_model_names = [] # List of telescope names without repetition
157
- _all_pars_to_change = {}
158
- for tel in self.layout:
159
- tel_size = names.get_telescope_class(tel.name)
160
-
161
- # Collecting telescope name and pars to change from array_config_data
162
- tel_model_name, pars_to_change = self._get_single_telescope_info_from_array_config(
163
- tel.name, tel_size
164
- )
165
- if len(pars_to_change) > 0:
166
- _all_pars_to_change[tel.name] = pars_to_change
167
-
168
- self._logger.debug(f"tel_model_name: {tel_model_name}")
169
-
170
- # Building the basic models - no pars to change yet
171
- if tel_model_name not in _all_telescope_model_names:
172
- # First time a telescope name is built
173
- _all_telescope_model_names.append(tel_model_name)
174
- tel_model = TelescopeModel(
175
- site=self.site,
176
- telescope_model_name=tel_model_name,
177
- model_version=self.model_version,
178
- label=self.label,
179
- db=db,
180
- )
181
- else:
182
- # Telescope name already exists.
183
- # Finding the TelescopeModel and copying it.
184
- for tel_now in self._telescope_model:
185
- if tel_now.name != tel_model_name:
186
- continue
187
- self._logger.debug(f"Copying tel model {tel_now.name} already loaded from DB")
188
- tel_model = copy(tel_now)
189
- break
190
-
191
- self._telescope_model.append(tel_model)
192
-
193
- # Checking whether the size of the telescope list and the layout match
194
- if len(self._telescope_model) != len(self.layout):
195
- self._logger.warning(
196
- "Number of telescopes in the list of telescope models does "
197
- "not match the number of telescopes in the ArrayLayout - something is wrong!"
198
- )
199
-
200
- # Changing parameters, if there are any in all_pars_to_change
201
- if len(_all_pars_to_change) > 0:
202
- for tel_data, tel_model in zip(self.layout, self._telescope_model):
203
- if tel_data.name not in _all_pars_to_change:
204
- continue
205
- self._logger.debug(
206
- f"Changing {len(_all_pars_to_change[tel_data.name])} pars of a "
207
- f"{tel_data.name}: {*_all_pars_to_change[tel_data.name],}, ..."
208
- )
209
- tel_model.change_multiple_parameters(**_all_pars_to_change[tel_data.name])
210
- tel_model.set_extra_label(tel_data.name)
136
+ Returns
137
+ -------
138
+ str
139
+ Site name.
140
+ """
141
+ return self.site_model.site
211
142
 
212
- def _get_single_telescope_info_from_array_config(self, tel_name, tel_size):
143
+ def _build_telescope_models(self, site_model: SiteModel, array_elements: dict) -> dict:
213
144
  """
214
- array_config_data contains the default telescope models for each telescope size and the \
215
- list of specific telescopes. For each case, the data can be given only as a name or as a \
216
- dict with 'name' and parameters to change. This function has to identify these two cases\
217
- and collect the telescope name and the dict with the parameters to change.
145
+ Build the the telescope models for all telescopes of this array.
146
+
147
+ Includes reading of telescope model parameters from the DB.
148
+ The array is defined in the telescopes dictionary. Array element positions
149
+ are read from the database if no values are given in this dictionary.
218
150
 
219
151
  Parameters
220
152
  ----------
221
- tel_name: str
222
- Name of the telescope at the layout level (LST-01, MST-05, ...).
223
- tel_size: str
224
- LST, MST or SST.
225
- """
153
+ site_model: SiteModel
154
+ Site model.
155
+ array_elements: dict
156
+ Dict with array elements.
226
157
 
227
- def _proccess_single_telescope(data):
228
- """
229
- Parameters
230
- ----------
231
- data: dict or str
232
- Piece of the array_config_data for one specific telescope.
233
- """
234
-
235
- if isinstance(data, dict):
236
- # Case 0: data is dict
237
- if "name" not in data.keys():
238
- msg = "ArrayConfig has no name for a telescope"
239
- self._logger.error(msg)
240
- raise InvalidArrayConfigData(msg)
241
- tel_name = tel_size + "-" + data["name"]
242
- pars_to_change = {k: v for (k, v) in data.items() if k != "name"}
243
- self._logger.debug(
244
- "Grabbing tel data as dict - "
245
- f"name: {tel_name}, "
246
- f"{len(pars_to_change)} pars to change"
158
+ Returns
159
+ -------
160
+ dict
161
+ Dictionary with telescope models.
162
+ """
163
+ telescope_model = {}
164
+ for element_name, _ in array_elements.items():
165
+ collection = names.get_collection_name_from_array_element_name(element_name)
166
+ if collection == "telescopes":
167
+ telescope_model[element_name] = TelescopeModel(
168
+ site=site_model.site,
169
+ telescope_name=element_name,
170
+ model_version=self.model_version,
171
+ mongo_db_config=self.mongo_db_config,
172
+ label=self.label,
247
173
  )
248
- return tel_name, pars_to_change
249
- if isinstance(data, str):
250
- # Case 1: data is string (only name)
251
- tel_name = tel_size + "-" + data
252
- return tel_name, {}
253
-
254
- # Case 2: data has a wrong type
255
- msg = "ArrayConfig has wrong input for a telescope"
256
- self._logger.error(msg)
257
- raise InvalidArrayConfigData(msg)
258
-
259
- if tel_name in self._array_config_data.keys():
260
- # Specific info for this telescope
261
- return _proccess_single_telescope(self._array_config_data[tel_name])
262
-
263
- # Checking if default option exists in array_config_data
264
- not_contains_default_key = (
265
- "default" not in self._array_config_data.keys()
266
- or tel_size not in self._array_config_data["default"].keys()
267
- )
268
-
269
- if not_contains_default_key:
270
- msg = (
271
- "default option was not given in array_config_data "
272
- + f"for the telescope {tel_name}"
273
- )
274
- self._logger.error(msg)
275
- raise InvalidArrayConfigData(msg)
276
-
277
- # Grabbing the default option
278
- return _proccess_single_telescope(self._array_config_data["default"][tel_size])
174
+ return telescope_model
279
175
 
280
176
  def print_telescope_list(self):
281
- """Print out the list of telescopes for quick inspection."""
282
-
283
- for tel_data, tel_model in zip(self.layout, self._telescope_model):
284
- print(f"Name: {tel_data.name}\t Model: {tel_model.name}")
177
+ """Print list of telescopes."""
178
+ for tel_name, data in self.telescope_model.items():
179
+ print(f"Name: {tel_name}\t Model: {data.name}")
285
180
 
286
181
  def export_simtel_telescope_config_files(self):
287
- """
288
- Export sim_telarray config files for all the telescopes into the output model directory.
289
- """
290
-
182
+ """Export sim_telarray configuration files for all telescopes into the model directory."""
291
183
  exported_models = []
292
- for tel_model in self._telescope_model:
184
+ for _, tel_model in self.telescope_model.items():
293
185
  name = tel_model.name + (
294
186
  "_" + tel_model.extra_label if tel_model.extra_label != "" else ""
295
187
  )
296
188
  if name not in exported_models:
297
- self._logger.debug(f"Exporting config file for tel {name}")
189
+ self._logger.debug(f"Exporting configuration file for telescope {name}")
298
190
  tel_model.export_config_file()
299
191
  exported_models.append(name)
300
192
  else:
301
- self._logger.debug(f"Config file for tel {name} already exists - skipping")
193
+ self._logger.debug(
194
+ f"Configuration file for telescope {name} already exists - skipping"
195
+ )
302
196
 
303
197
  self._telescope_model_files_exported = True
304
198
 
305
199
  def export_simtel_array_config_file(self):
306
- """
307
- Export sim_telarray config file for the array into the output model directory.
308
- """
309
-
200
+ """Export sim_telarray configuration file for the array into the model directory."""
310
201
  # Setting file name and the location
311
- config_file_name = names.simtel_array_config_file_name(
312
- self.layout_name, self.site, self.model_version, self.label
202
+ config_file_name = names.simtel_config_file_name(
203
+ array_name=self.layout_name,
204
+ site=self.site_model.site,
205
+ model_version=self.model_version,
206
+ label=self.label,
313
207
  )
314
- self._config_file_path = self._config_file_directory.joinpath(config_file_name)
208
+ self._config_file_path = self.get_config_directory().joinpath(config_file_name)
315
209
 
316
210
  # Writing parameters to the file
317
- self._logger.info(f"Writing array config file into {self._config_file_path}")
211
+ self._logger.info(f"Writing array configuration file into {self._config_file_path}")
318
212
  simtel_writer = SimtelConfigWriter(
319
- site=self.site,
213
+ site=self.site_model.site,
320
214
  layout_name=self.layout_name,
321
215
  model_version=self.model_version,
322
216
  label=self.label,
323
217
  )
324
218
  simtel_writer.write_array_config_file(
325
219
  config_file_path=self._config_file_path,
326
- layout=self.layout,
327
- telescope_model=self._telescope_model,
328
- site_parameters=self._site_parameters,
220
+ telescope_model=self.telescope_model,
221
+ site_model=self.site_model,
329
222
  )
330
223
  self._array_model_file_exported = True
331
224
 
332
225
  def export_all_simtel_config_files(self):
333
226
  """
334
- Export sim_telarray config file for the array and for each individual telescope into the \
335
- output model directory.
336
- """
227
+ Export sim_telarray config file for the array and for each individual telescope.
337
228
 
229
+ Config files are exported into the output model directory.
230
+ """
338
231
  if not self._telescope_model_files_exported:
339
232
  self.export_simtel_telescope_config_files()
340
233
  if not self._array_model_file_exported:
341
234
  self.export_simtel_array_config_file()
342
235
 
343
- def get_config_file(self):
236
+ def get_config_file(self) -> Path:
344
237
  """
345
- Get the path of the array config file for sim_telarray. The config file is produced if the \
346
- file is not updated.
238
+ Return the path of the array config file for sim_telarray.
239
+
240
+ A new config file is produced if the file is not updated.
347
241
 
348
242
  Returns
349
243
  -------
350
244
  Path
351
245
  Path of the exported config file for sim_telarray.
352
246
  """
353
-
354
247
  self.export_all_simtel_config_files()
355
248
  return self._config_file_path
356
249
 
357
- def get_config_directory(self):
250
+ def get_config_directory(self) -> Path:
358
251
  """
359
252
  Get the path of the array config directory for sim_telarray.
360
253
 
@@ -363,4 +256,164 @@ class ArrayModel:
363
256
  Path
364
257
  Path of the config directory path for sim_telarray.
365
258
  """
259
+ if self._config_file_directory is None:
260
+ self._config_file_directory = self.io_handler.get_output_directory(self.label, "model")
366
261
  return self._config_file_directory
262
+
263
+ def _load_array_element_positions_from_file(
264
+ self, array_elements_file: str | Path, site: str
265
+ ) -> dict:
266
+ """
267
+ Load array element (e.g. telescope) positions from a file into a dict.
268
+
269
+ Dictionary format: {telescope_name: {position_x: x, position_y: y, position_z: z}}
270
+
271
+ Parameters
272
+ ----------
273
+ array_elements_file: Union[str, Path]
274
+ Path to the file with the array element positions.
275
+ site: str
276
+ Site name.
277
+
278
+ Returns
279
+ -------
280
+ dict
281
+ Dict with telescope positions.
282
+ """
283
+ table = data_reader.read_table_from_file(file_name=array_elements_file)
284
+
285
+ return {
286
+ row["telescope_name"]: self._get_telescope_position_parameter(
287
+ row["telescope_name"], site, row["position_x"], row["position_y"], row["position_z"]
288
+ )
289
+ for row in table
290
+ }
291
+
292
+ def _get_telescope_position_parameter(
293
+ self, telescope_name: str, site: str, x: u.Quantity, y: u.Quantity, z: u.Quantity
294
+ ) -> dict:
295
+ """
296
+ Return dictionary with telescope position parameters (following DB model database format).
297
+
298
+ Parameters
299
+ ----------
300
+ telescope_name: str
301
+ Name of the telescope.
302
+ site: str
303
+ Site name.
304
+ x: astropy.Quantity
305
+ X ground position.
306
+ y: astropy.Quantity
307
+ Y ground position.
308
+ z: astropy.Quantity
309
+ Z ground position.
310
+
311
+ Returns
312
+ -------
313
+ dict
314
+ Dict with telescope position parameters.
315
+ """
316
+ return {
317
+ "parameter": "array_element_position_ground",
318
+ "instrument": telescope_name,
319
+ "site": site,
320
+ "version": self.model_version,
321
+ "value": general.convert_list_to_string(
322
+ [x.to("m").value, y.to("m").value, z.to("m").value]
323
+ ),
324
+ "unit": "m",
325
+ "type": "float64",
326
+ "applicable": True,
327
+ "file": False,
328
+ }
329
+
330
+ def _get_array_elements_from_list(self, array_elements_list: list[str]) -> dict:
331
+ """
332
+ Return dictionary with array elements from a list of telescope names.
333
+
334
+ Input list can contain telescope names (e.g, LSTN-01) or a telescope
335
+ type (e.g., MSTN). In the latter case, all telescopes of this specific
336
+ type are added.
337
+
338
+ Parameters
339
+ ----------
340
+ array_elements_list: list
341
+ List of telescope names.
342
+
343
+ Returns
344
+ -------
345
+ dict
346
+ Dict with array elements.
347
+ """
348
+ array_elements_dict = {}
349
+ for name in array_elements_list:
350
+ try:
351
+ array_elements_dict[names.validate_array_element_name(name)] = None
352
+ except ValueError:
353
+ array_elements_dict.update(self._get_all_array_elements_of_type(name))
354
+ return array_elements_dict
355
+
356
+ def _get_all_array_elements_of_type(self, array_element_type: str) -> dict:
357
+ """
358
+ Return all array elements of a specific type using the database.
359
+
360
+ Parameters
361
+ ----------
362
+ array_element_type : str
363
+ Type of the array element (e.g. LSTN, MSTS)
364
+
365
+ Returns
366
+ -------
367
+ dict
368
+ Dict with array elements.
369
+ """
370
+ all_elements = db_array_elements.get_array_elements_of_type(
371
+ array_element_type=array_element_type,
372
+ db=self.db,
373
+ model_version=self.model_version,
374
+ collection="telescopes",
375
+ )
376
+ return self._get_array_elements_from_list(all_elements)
377
+
378
+ def export_array_elements_as_table(self, coordinate_system: str = "ground") -> QTable:
379
+ """
380
+ Export array elements positions to astropy table.
381
+
382
+ Parameters
383
+ ----------
384
+ coordinate_system: str
385
+ Positions are exported in this coordinate system.
386
+
387
+ Returns
388
+ -------
389
+ astropy.table.QTable
390
+ Astropy table with the telescope layout information.
391
+ """
392
+ table = QTable(meta={"array_name": self.layout_name, "site": self.site_model.site})
393
+
394
+ name, pos_x, pos_y, pos_z, tel_r = [], [], [], [], []
395
+ for tel_name, data in self.telescope_model.items():
396
+ name.append(tel_name)
397
+ xyz = data.position(coordinate_system=coordinate_system)
398
+ pos_x.append(xyz[0])
399
+ pos_y.append(xyz[1])
400
+ pos_z.append(xyz[2])
401
+ try:
402
+ # add tests of KeyError after positions calibration_elements are added to DB
403
+ tel_r.append(data.get_parameter_value_with_unit("telescope_sphere_radius"))
404
+ except KeyError: # not all array elements have a sphere radius
405
+ tel_r.append(0.0 * u.m)
406
+
407
+ table["telescope_name"] = name
408
+ if coordinate_system == "ground":
409
+ table["position_x"] = pos_x
410
+ table["position_y"] = pos_y
411
+ table["position_z"] = pos_z
412
+ elif coordinate_system == "utm":
413
+ table["utm_east"] = pos_x
414
+ table["utm_north"] = pos_y
415
+ table["altitude"] = pos_z
416
+ table["sphere_radius"] = tel_r
417
+
418
+ table.sort("telescope_name")
419
+ return table