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
@@ -0,0 +1,602 @@
1
+ #!/usr/bin/python3
2
+ """Base class for simulation model parameters."""
3
+
4
+ import logging
5
+ import shutil
6
+ from copy import copy
7
+
8
+ import astropy.units as u
9
+
10
+ import simtools.utils.general as gen
11
+ from simtools.db import db_handler
12
+ from simtools.io_operations import io_handler
13
+ from simtools.simtel.simtel_config_writer import SimtelConfigWriter
14
+ from simtools.utils import names
15
+
16
+ __all__ = ["InvalidModelParameterError", "ModelParameter"]
17
+
18
+
19
+ class InvalidModelParameterError(Exception):
20
+ """Exception for invalid model parameter."""
21
+
22
+
23
+ class ModelParameter:
24
+ """
25
+ Base class for simulation model parameters.
26
+
27
+ Provides methods to read and manipulate parameters from DB.
28
+
29
+ Parameters
30
+ ----------
31
+ db: DatabaseHandler
32
+ Database handler.
33
+ model_version: str
34
+ Version of the model (ex. 5.0.0).
35
+ site: str
36
+ Site name (e.g., South or North).
37
+ array_element_name: str
38
+ Array element name (e.g., LSTN-01, LSTN-design, ILLN-01).
39
+ collection: str
40
+ instrument class (e.g. telescopes, calibration_devices)
41
+ as stored under collection in the DB.
42
+ mongo_db_config: dict
43
+ MongoDB configuration.
44
+ label: str
45
+ Instance label. Important for output file naming.
46
+
47
+ """
48
+
49
+ def __init__(
50
+ self,
51
+ mongo_db_config,
52
+ model_version,
53
+ site=None,
54
+ array_element_name=None,
55
+ collection="telescopes",
56
+ db=None,
57
+ label=None,
58
+ ):
59
+ self._logger = logging.getLogger(__name__)
60
+ self._extra_label = None
61
+ self.io_handler = io_handler.IOHandler()
62
+ self.db = (
63
+ db if db is not None else db_handler.DatabaseHandler(mongo_db_config=mongo_db_config)
64
+ )
65
+
66
+ self._parameters = {}
67
+ self._simulation_config_parameters = {"corsika": {}, "simtel": {}}
68
+ self._derived = None
69
+ self.collection = collection
70
+ self.label = label
71
+ self.model_version = model_version
72
+ self.site = names.validate_site_name(site) if site is not None else None
73
+ self.name = (
74
+ names.validate_array_element_name(array_element_name)
75
+ if array_element_name is not None
76
+ else None
77
+ )
78
+ self._config_file_directory = None
79
+ self._config_file_path = None
80
+ self._load_parameters_from_db()
81
+
82
+ self.simtel_config_writer = None
83
+ self._added_parameter_files = None
84
+ self._is_config_file_up_to_date = False
85
+ self._is_exported_model_files_up_to_date = False
86
+
87
+ def _get_parameter_dict(self, par_name):
88
+ """
89
+ Get model parameter dictionary as stored in the DB.
90
+
91
+ No conversion to values are applied for the use in simtools
92
+ (e.g., no conversion from the string representation of lists
93
+ to lists).
94
+
95
+ Parameters
96
+ ----------
97
+ par_name: str
98
+ Name of the parameter.
99
+
100
+ Returns
101
+ -------
102
+ dict
103
+ Dictionary with complete DB entry for the given parameter.
104
+
105
+ Raises
106
+ ------
107
+ InvalidModelParameterError
108
+ If par_name does not match any parameter in this model.
109
+ """
110
+ try:
111
+ return self._parameters[par_name]
112
+ except KeyError:
113
+ pass
114
+ try:
115
+ return self.derived[par_name]
116
+ except (KeyError, ValueError) as e:
117
+ msg = f"Parameter {par_name} was not found in the model"
118
+ self._logger.error(msg)
119
+ raise InvalidModelParameterError(msg) from e
120
+
121
+ def get_parameter_value(self, par_name, parameter_dict=None):
122
+ """
123
+ Get the value of a model parameter.
124
+
125
+ List of values stored in strings are returns as lists, so that no knowledge
126
+ of the database structure is needed when accessing the model parameters.
127
+
128
+ Parameters
129
+ ----------
130
+ par_name: str
131
+ Name of the parameter.
132
+ parameter_dict: dict
133
+ Dictionary with complete DB entry for the given parameter
134
+ (including the 'value', 'units' fields).
135
+
136
+ Returns
137
+ -------
138
+ Value of the parameter.
139
+
140
+ Raises
141
+ ------
142
+ KeyError
143
+ If par_name does not match any parameter in this model.
144
+ """
145
+ parameter_dict = parameter_dict if parameter_dict else self._get_parameter_dict(par_name)
146
+ try:
147
+ _parameter = parameter_dict["value"]
148
+ except KeyError as exc:
149
+ self._logger.error(f"Parameter {par_name} does not have a value")
150
+ raise exc
151
+ if isinstance(_parameter, str):
152
+ _is_float = False
153
+ try:
154
+ _is_float = self.get_parameter_type(par_name).startswith("float")
155
+ except (InvalidModelParameterError, TypeError): # float - in case we don't know
156
+ _is_float = True
157
+ _parameter = gen.convert_string_to_list(_parameter, is_float=_is_float)
158
+ _parameter = _parameter if len(_parameter) > 1 else _parameter[0]
159
+
160
+ return _parameter
161
+
162
+ def get_parameter_value_with_unit(self, par_name):
163
+ """
164
+ Get the value of an existing parameter of the model as an Astropy Quantity with its unit.
165
+
166
+ Parameters
167
+ ----------
168
+ par_name: str
169
+ Name of the parameter.
170
+
171
+ Returns
172
+ -------
173
+ Astropy quantity with the value of the parameter multiplied by its unit.
174
+ If no unit is provided in the model, the value is returned without a unit.
175
+
176
+ """
177
+ _parameter = self._get_parameter_dict(par_name)
178
+ _value = self.get_parameter_value(par_name, _parameter)
179
+
180
+ try:
181
+ _unit = [item.strip() for item in _parameter.get("unit").split(",")]
182
+
183
+ # if there is only one value or the values share one unit
184
+ if (isinstance(_value, (int | float))) or (len(_value) > len(_unit)):
185
+ return _value * u.Unit(_unit[0])
186
+
187
+ # entries with 'null' units should be returned as dimensionless
188
+ _astropy_units = [
189
+ u.Unit(item) if item != "null" else u.dimensionless_unscaled for item in _unit
190
+ ]
191
+
192
+ return [_value[i] * _astropy_units[i] for i in range(len(_value))]
193
+
194
+ except (KeyError, TypeError, AttributeError) as exc:
195
+ self._logger.debug(f"{exc} encountered, returning only value without units.")
196
+ return _value # if unit is NoneType
197
+
198
+ def get_parameter_type(self, par_name):
199
+ """
200
+ Get the type of existing parameter of the model (value of 'type' field of DB entry).
201
+
202
+ Parameters
203
+ ----------
204
+ par_name: str
205
+ Name of the parameter.
206
+
207
+ Returns
208
+ -------
209
+ str or None
210
+ type of the parameter (None if no type is defined)
211
+
212
+ """
213
+ parameter_dict = self._get_parameter_dict(par_name)
214
+ try:
215
+ return parameter_dict["type"]
216
+ except KeyError:
217
+ self._logger.debug(f"Parameter {par_name} does not have a type.")
218
+ return None
219
+
220
+ def get_parameter_file_flag(self, par_name):
221
+ """
222
+ Get value of parameter file flag of this database entry (boolean 'file' field of DB entry).
223
+
224
+ Parameters
225
+ ----------
226
+ par_name: str
227
+ Name of the parameter.
228
+
229
+ Returns
230
+ -------
231
+ bool
232
+ True if file flag is set.
233
+
234
+ """
235
+ parameter_dict = self._get_parameter_dict(par_name)
236
+ try:
237
+ return parameter_dict["file"]
238
+ except KeyError:
239
+ self._logger.debug(f"Parameter {par_name} does not have a file associated with it.")
240
+ return False
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
+ def print_parameters(self):
270
+ """Print parameters and their values for debugging purposes."""
271
+ for par in self._parameters:
272
+ print(f"{par} = {self.get_parameter_value(par)}")
273
+
274
+ def _set_config_file_directory_and_name(self):
275
+ """Set and create the directory and the name of the config file."""
276
+ if self.name is None:
277
+ return
278
+
279
+ self._config_file_directory = self.io_handler.get_output_directory(
280
+ label=self.label, sub_dir="model"
281
+ )
282
+
283
+ # Setting file name and the location
284
+ if self.site is not None and self.name is not None:
285
+ config_file_name = names.simtel_config_file_name(
286
+ self.site,
287
+ self.model_version,
288
+ telescope_model_name=self.name,
289
+ label=self.label,
290
+ extra_label=self._extra_label,
291
+ )
292
+ self._config_file_path = self.config_file_directory.joinpath(config_file_name)
293
+
294
+ self._logger.debug(f"Config file path: {self._config_file_path}")
295
+
296
+ def get_simulation_software_parameters(self, simulation_software):
297
+ """
298
+ Get simulation software parameters.
299
+
300
+ Parameters
301
+ ----------
302
+ simulation_software: str
303
+ Simulation software name.
304
+
305
+ Returns
306
+ -------
307
+ dict
308
+ Simulation software parameters.
309
+ """
310
+ return self._simulation_config_parameters.get(simulation_software)
311
+
312
+ def _load_simulation_software_parameter(self):
313
+ """Read simulation software parameters from DB."""
314
+ for simulation_software in self._simulation_config_parameters:
315
+ try:
316
+ self._simulation_config_parameters[simulation_software] = (
317
+ self.db.get_simulation_configuration_parameters(
318
+ site=self.site,
319
+ array_element_name=self.name,
320
+ model_version=self.model_version,
321
+ simulation_software=simulation_software,
322
+ )
323
+ )
324
+ except ValueError:
325
+ self._logger.warning(
326
+ f"No {simulation_software} parameters found for "
327
+ f"{self.site}, {self.name} (model version {self.model_version})."
328
+ )
329
+
330
+ def _load_parameters_from_db(self):
331
+ """Read parameters from DB and store them in _parameters."""
332
+ if self.db is None:
333
+ return
334
+
335
+ if self.name is not None:
336
+ self._parameters = self.db.get_model_parameters(
337
+ self.site, self.name, self.model_version, self.collection, only_applicable=True
338
+ )
339
+
340
+ if self.site is not None:
341
+ _site_pars = self.db.get_site_parameters(
342
+ self.site, self.model_version, only_applicable=True
343
+ )
344
+ self._parameters.update(_site_pars)
345
+
346
+ self._load_simulation_software_parameter()
347
+
348
+ def set_extra_label(self, extra_label):
349
+ """
350
+ Set an extra label for the name of the config file.
351
+
352
+ Notes
353
+ -----
354
+ The config file directory name is not affected by the extra label. Only the file name is \
355
+ changed. This is important for the ArrayModel class to export multiple config files in the\
356
+ same directory.
357
+
358
+ Parameters
359
+ ----------
360
+ extra_label: str
361
+ Extra label to be appended to the original label.
362
+ """
363
+ self._extra_label = extra_label
364
+ self._set_config_file_directory_and_name()
365
+
366
+ @property
367
+ def extra_label(self):
368
+ """Return the extra label if defined, if not return ''."""
369
+ return self._extra_label if self._extra_label is not None else ""
370
+
371
+ def get_simtel_parameters(self, parameters=None, telescope_model=True, site_model=True):
372
+ """
373
+ Get simtel parameters as name and value pairs.
374
+
375
+ Parameters
376
+ ----------
377
+ parameters: dict
378
+ 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
+
384
+ Returns
385
+ -------
386
+ dict
387
+ simtel parameters as dict (sorted by parameter names)
388
+
389
+ """
390
+ if parameters is None:
391
+ parameters = self._parameters
392
+
393
+ _simtel_parameter_value = {}
394
+ for key in parameters:
395
+ _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,
400
+ )
401
+ if _par_name is not None:
402
+ _simtel_parameter_value[_par_name] = parameters[key].get("value")
403
+ return dict(sorted(_simtel_parameter_value.items()))
404
+
405
+ def change_parameter(self, par_name, value):
406
+ """
407
+ Change the value of an existing parameter.
408
+
409
+ This function does not modify the DB, it affects only the current instance.
410
+
411
+ Parameters
412
+ ----------
413
+ par_name: str
414
+ Name of the parameter.
415
+ value:
416
+ Value of the parameter.
417
+
418
+ Raises
419
+ ------
420
+ InvalidModelParameterError
421
+ If the parameter to be changed does not exist in this model.
422
+ """
423
+ if par_name not in self._parameters:
424
+ msg = f"Parameter {par_name} not in the model"
425
+ self._logger.error(msg)
426
+ raise InvalidModelParameterError(msg)
427
+
428
+ if isinstance(value, str):
429
+ value = gen.convert_string_to_list(value)
430
+
431
+ if not gen.validate_data_type(
432
+ reference_dtype=self.get_parameter_type(par_name),
433
+ value=value,
434
+ dtype=None,
435
+ allow_subtypes=True,
436
+ ):
437
+ raise ValueError(
438
+ f"Could not cast {value} of type {type(value)} "
439
+ f"to {self.get_parameter_type(par_name)}."
440
+ )
441
+
442
+ self._logger.debug(
443
+ f"Changing parameter {par_name} "
444
+ f"from {self.get_parameter_value(par_name)} to {value}"
445
+ )
446
+ self._parameters[par_name]["value"] = value
447
+
448
+ # In case parameter is a file, the model files will be outdated
449
+ if self.get_parameter_file_flag(par_name):
450
+ self._is_exported_model_files_up_to_date = False
451
+
452
+ self._is_config_file_up_to_date = False
453
+
454
+ def change_multiple_parameters_from_file(self, file_name):
455
+ """
456
+ Change values of multiple existing parameters in the model from a file.
457
+
458
+ This function does not modify the DB, it affects only the current instance.
459
+ This feature is intended for developers and lacks validation.
460
+
461
+ Parameters
462
+ ----------
463
+ file_name: str
464
+ File containing the parameters to be changed.
465
+ """
466
+ self._logger.warning(
467
+ "Changing multiple parameters from file is a feature for developers."
468
+ "Insufficient validation of parameters."
469
+ )
470
+ self._logger.debug(f"Changing parameters from file {file_name}")
471
+ self.change_multiple_parameters(**gen.collect_data_from_file(file_name=file_name))
472
+
473
+ def change_multiple_parameters(self, **kwargs):
474
+ """
475
+ Change the value of multiple existing parameters in the model.
476
+
477
+ This function does not modify the DB, it affects only the current instance.
478
+
479
+ Parameters
480
+ ----------
481
+ **kwargs
482
+ Parameters should be passed as parameter_name=value.
483
+
484
+ """
485
+ for par, value in kwargs.items():
486
+ if par in self._parameters:
487
+ self.change_parameter(par, value)
488
+
489
+ self._is_config_file_up_to_date = False
490
+
491
+ def export_parameter_file(self, par_name, file_path):
492
+ """
493
+ Export a file to the config file directory.
494
+
495
+ Parameters
496
+ ----------
497
+ par_name: str
498
+ Name of the parameter.
499
+ file_path: str
500
+ Path of the file to be added to the config file directory.
501
+ """
502
+ if self._added_parameter_files is None:
503
+ self._added_parameter_files = []
504
+ self._added_parameter_files.append(par_name)
505
+ shutil.copy(file_path, self.config_file_directory)
506
+
507
+ def export_model_files(self):
508
+ """Export the model files into the config file directory."""
509
+ # Removing parameter files added manually (which are not in DB)
510
+ pars_from_db = copy(self._parameters)
511
+ if self._added_parameter_files is not None:
512
+ for par in self._added_parameter_files:
513
+ pars_from_db.pop(par)
514
+
515
+ self.db.export_model_files(pars_from_db, self.config_file_directory)
516
+ self._is_exported_model_files_up_to_date = True
517
+
518
+ def export_config_file(self):
519
+ """Export the config file used by sim_telarray."""
520
+ # Exporting model file
521
+ if not self._is_exported_model_files_up_to_date:
522
+ self.export_model_files()
523
+
524
+ # Using SimtelConfigWriter to write the config file.
525
+ self._load_simtel_config_writer()
526
+ self.simtel_config_writer.write_telescope_config_file(
527
+ config_file_path=self.config_file_path,
528
+ parameters=self.get_simtel_parameters(parameters=self._parameters),
529
+ config_parameters=self.get_simtel_parameters(
530
+ parameters=self._simulation_config_parameters["simtel"]
531
+ ),
532
+ )
533
+
534
+ @property
535
+ def config_file_directory(self):
536
+ """Directory for configure files. Configure, if necessary."""
537
+ if self._config_file_directory is None:
538
+ self._set_config_file_directory_and_name()
539
+ return self._config_file_directory
540
+
541
+ @property
542
+ def config_file_path(self):
543
+ """Path of the config file. Configure, if necessary."""
544
+ if self._config_file_path is None:
545
+ self._set_config_file_directory_and_name()
546
+ return self._config_file_path
547
+
548
+ def get_config_file(self, no_export=False):
549
+ """
550
+ Get the path of the config file for sim_telarray.
551
+
552
+ The config file is produced if the file is not up to date.
553
+
554
+ Parameters
555
+ ----------
556
+ no_export: bool
557
+ Turn it on if you do not want the file to be exported.
558
+
559
+ Returns
560
+ -------
561
+ Path
562
+ Path of the exported config file for sim_telarray.
563
+ """
564
+ if not self._is_config_file_up_to_date and not no_export:
565
+ self.export_config_file()
566
+ return self.config_file_path
567
+
568
+ def _load_simtel_config_writer(self):
569
+ """Load the SimtelConfigWriter object."""
570
+ if self.simtel_config_writer is None:
571
+ self.simtel_config_writer = SimtelConfigWriter(
572
+ site=self.site,
573
+ telescope_model_name=self.name,
574
+ model_version=self.model_version,
575
+ label=self.label,
576
+ )
577
+
578
+ def export_nsb_spectrum_to_telescope_altitude_correction_file(self, model_directory):
579
+ """
580
+ Export the NSB spectrum to the telescope altitude correction file.
581
+
582
+ This method is needed because testeff corrects the NSB spectrum from the original altitude
583
+ used in the Benn & Ellison model to the telescope altitude.
584
+ This is done internally in testeff, but the NSB spectrum is not written out to the model
585
+ directory. This method allows to export it explicitly.
586
+
587
+ Parameters
588
+ ----------
589
+ model_directory: Path
590
+ Model directory to export the file to.
591
+ """
592
+ self.db.export_model_files(
593
+ {
594
+ "nsb_spectrum_at_2200m": {
595
+ "value": self._simulation_config_parameters["simtel"][
596
+ "correct_nsb_spectrum_to_telescope_altitude"
597
+ ]["value"],
598
+ "file": True,
599
+ }
600
+ },
601
+ model_directory,
602
+ )
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/python3
2
+ """Helper functions calculations related to model parameters."""
2
3
 
3
4
  import math
4
5
 
@@ -7,41 +8,19 @@ from simtools.utils import names
7
8
  __all__ = [
8
9
  "compute_telescope_transmission",
9
10
  "is_two_mirror_telescope",
10
- "split_simtel_parameter",
11
11
  ]
12
12
 
13
13
 
14
- def split_simtel_parameter(value):
14
+ def compute_telescope_transmission(pars: list[float], off_axis: float) -> float:
15
15
  """
16
- Some array parameters are stored in sim_telarray model as string separated by comma or spaces.\
17
- This functions turns this string into a list of floats. The delimiter is identified \
18
- automatically.
16
+ Compute telescope transmission (0 < T < 1) for a given off-axis angle.
19
17
 
20
- Parameters
21
- ----------
22
- value: str
23
- String with the array of floats separated by comma or spaces.
24
-
25
- Returns
26
- -------
27
- list
28
- Array of floats.
29
- """
30
-
31
- delimiter = "," if "," in value else " "
32
- float_values = [float(v) for v in value.split(delimiter)]
33
- return float_values
34
-
35
-
36
- def compute_telescope_transmission(pars, off_axis):
37
- """
38
- Compute telescope transmission (0 < T < 1) for a given set of parameters as defined by \
39
- the MC model and for a given off-axis angle.
18
+ The telescope transmission depends on the MC model used.
40
19
 
41
20
  Parameters
42
21
  ----------
43
22
  pars: list of float
44
- Parameters of the telescope transmission. Len(pars) should be 4.
23
+ Parameters of the telescope transmission. Len(pars) should be 5 or 6.
45
24
  off_axis: float
46
25
  Off-axis angle in deg.
47
26
 
@@ -50,7 +29,6 @@ def compute_telescope_transmission(pars, off_axis):
50
29
  float
51
30
  Telescope transmission.
52
31
  """
53
-
54
32
  _deg_to_rad = math.pi / 180.0
55
33
  if pars[1] == 0:
56
34
  return pars[0]
@@ -59,27 +37,21 @@ def compute_telescope_transmission(pars, off_axis):
59
37
  return pars[0] / (1.0 + pars[2] * t ** pars[4])
60
38
 
61
39
 
62
- def is_two_mirror_telescope(telescope_model_name):
40
+ def is_two_mirror_telescope(telescope_model_name: str) -> bool:
63
41
  """
64
- Check if the telescope is a two mirror design.
42
+ Determine if the telescope model is a two-mirror telescope.
65
43
 
66
44
  Parameters
67
45
  ----------
68
46
  telescope_model_name: str
69
- Telescope model name (ex. LST-1).
47
+ Name of the telescope model.
70
48
 
71
49
  Returns
72
50
  -------
73
51
  bool
74
- True if the telescope is a two mirror one.
52
+ True if it is a two-mirror telescope.
75
53
  """
76
- tel_class, tel_type, _ = names.split_telescope_model_name(telescope_model_name)
77
- if tel_class == "SST":
78
- # Only 1M is False
79
- return "1M" not in tel_type
80
- if tel_class == "SCT":
81
- # SCT always two mirrors
54
+ tel_type = names.get_array_element_type_from_name(telescope_model_name)
55
+ if "SST" in tel_type or "SCT" in tel_type:
82
56
  return True
83
-
84
- # All MSTs and LSTs
85
57
  return False