gammasimtools 0.6.1__py3-none-any.whl → 0.8.1__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 (353) hide show
  1. gammasimtools-0.8.1.dist-info/METADATA +172 -0
  2. gammasimtools-0.8.1.dist-info/RECORD +346 -0
  3. {gammasimtools-0.6.1.dist-info → gammasimtools-0.8.1.dist-info}/WHEEL +1 -1
  4. gammasimtools-0.8.1.dist-info/entry_points.txt +31 -0
  5. simtools/_version.py +2 -2
  6. simtools/applications/calculate_trigger_rate.py +210 -0
  7. simtools/applications/convert_all_model_parameters_from_simtel.py +372 -0
  8. simtools/applications/{print_array_elements.py → convert_geo_coordinates_of_array_elements.py} +58 -63
  9. simtools/applications/convert_model_parameter_from_simtel.py +119 -0
  10. simtools/applications/{add_file_to_db.py → db_add_file_to_db.py} +70 -60
  11. simtools/applications/db_add_model_parameters_from_repository_to_db.py +184 -0
  12. simtools/applications/db_add_value_from_json_to_db.py +105 -0
  13. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +180 -0
  14. simtools/applications/db_get_array_layouts_from_db.py +162 -0
  15. simtools/applications/{get_file_from_db.py → db_get_file_from_db.py} +30 -34
  16. simtools/applications/db_get_parameter_from_db.py +131 -0
  17. simtools/applications/db_inspect_databases.py +52 -0
  18. simtools/applications/derive_mirror_rnda.py +39 -255
  19. simtools/applications/derive_psf_parameters.py +441 -0
  20. simtools/applications/generate_array_config.py +82 -0
  21. simtools/applications/generate_corsika_histograms.py +52 -52
  22. simtools/applications/generate_default_metadata.py +5 -8
  23. simtools/applications/generate_regular_arrays.py +117 -0
  24. simtools/applications/generate_simtel_array_histograms.py +97 -56
  25. simtools/applications/plot_array_layout.py +345 -115
  26. simtools/applications/production_generate_simulation_config.py +158 -0
  27. simtools/applications/production_scale_events.py +168 -0
  28. simtools/applications/simulate_light_emission.py +478 -0
  29. simtools/applications/simulate_prod.py +97 -175
  30. simtools/applications/submit_data_from_external.py +9 -12
  31. simtools/applications/submit_model_parameter_from_external.py +122 -0
  32. simtools/applications/validate_camera_efficiency.py +35 -102
  33. simtools/applications/validate_camera_fov.py +20 -19
  34. simtools/applications/{compare_cumulative_psf.py → validate_cumulative_psf.py} +45 -44
  35. simtools/applications/validate_file_using_schema.py +113 -47
  36. simtools/applications/validate_optics.py +17 -22
  37. simtools/camera_efficiency.py +193 -202
  38. simtools/configuration/commandline_parser.py +384 -96
  39. simtools/configuration/configurator.py +55 -71
  40. simtools/constants.py +5 -5
  41. simtools/corsika/corsika_config.py +482 -342
  42. simtools/corsika/corsika_histograms.py +226 -204
  43. simtools/corsika/corsika_histograms_visualize.py +23 -24
  44. simtools/corsika/primary_particle.py +159 -0
  45. simtools/data_model/data_reader.py +25 -20
  46. simtools/data_model/format_checkers.py +52 -0
  47. simtools/data_model/metadata_collector.py +210 -184
  48. simtools/data_model/metadata_model.py +115 -37
  49. simtools/data_model/model_data_writer.py +335 -26
  50. simtools/data_model/validate_data.py +366 -154
  51. simtools/db/db_array_elements.py +130 -0
  52. simtools/db/db_from_repo_handler.py +106 -0
  53. simtools/db/db_handler.py +1246 -0
  54. simtools/io_operations/hdf5_handler.py +3 -1
  55. simtools/io_operations/io_handler.py +32 -57
  56. simtools/job_execution/job_manager.py +82 -69
  57. simtools/layout/array_layout.py +325 -537
  58. simtools/layout/geo_coordinates.py +8 -11
  59. simtools/layout/telescope_position.py +163 -86
  60. simtools/model/array_model.py +305 -256
  61. simtools/model/calibration_model.py +50 -0
  62. simtools/model/camera.py +233 -493
  63. simtools/model/mirrors.py +61 -44
  64. simtools/model/model_parameter.py +602 -0
  65. simtools/model/model_utils.py +7 -35
  66. simtools/model/site_model.py +161 -0
  67. simtools/model/telescope_model.py +127 -621
  68. simtools/production_configuration/calculate_statistical_errors_grid_point.py +454 -0
  69. simtools/production_configuration/event_scaler.py +146 -0
  70. simtools/production_configuration/generate_simulation_config.py +193 -0
  71. simtools/production_configuration/interpolation_handler.py +197 -0
  72. simtools/ray_tracing/__init__.py +0 -0
  73. simtools/ray_tracing/mirror_panel_psf.py +280 -0
  74. simtools/{psf_analysis.py → ray_tracing/psf_analysis.py} +133 -47
  75. simtools/ray_tracing/ray_tracing.py +646 -0
  76. simtools/runners/__init__.py +0 -0
  77. simtools/runners/corsika_runner.py +240 -0
  78. simtools/runners/corsika_simtel_runner.py +225 -0
  79. simtools/runners/runner_services.py +307 -0
  80. simtools/runners/simtel_runner.py +224 -0
  81. simtools/schemas/array_elements.yml +137 -0
  82. simtools/schemas/integration_tests_config.metaschema.yml +93 -0
  83. simtools/schemas/metadata.metaschema.yml +6 -0
  84. simtools/schemas/model_parameter.metaschema.yml +78 -0
  85. simtools/schemas/{data.metaschema.yml → model_parameter_and_data_schema.metaschema.yml} +27 -44
  86. simtools/schemas/model_parameters/adjust_gain.schema.yml +37 -0
  87. simtools/schemas/model_parameters/altitude.schema.yml +37 -0
  88. simtools/schemas/model_parameters/array_coordinates.schema.yml +33 -0
  89. simtools/schemas/model_parameters/array_coordinates_UTM.schema.yml +77 -0
  90. simtools/schemas/model_parameters/array_element_position_ground.schema.yml +39 -0
  91. simtools/schemas/model_parameters/array_element_position_utm.schema.yml +39 -0
  92. simtools/schemas/model_parameters/array_layouts.schema.yml +48 -0
  93. simtools/schemas/model_parameters/array_triggers.schema.yml +93 -0
  94. simtools/schemas/model_parameters/asum_clipping.schema.yml +38 -0
  95. simtools/schemas/model_parameters/asum_offset.schema.yml +35 -0
  96. simtools/schemas/model_parameters/asum_shaping.schema.yml +35 -0
  97. simtools/schemas/model_parameters/asum_threshold.schema.yml +38 -0
  98. simtools/schemas/model_parameters/atmospheric_profile.schema.yml +32 -0
  99. simtools/schemas/model_parameters/atmospheric_transmission.schema.yml +35 -0
  100. simtools/schemas/model_parameters/axes_offsets.schema.yml +53 -0
  101. simtools/schemas/model_parameters/camera_body_diameter.schema.yml +40 -0
  102. simtools/schemas/model_parameters/camera_body_shape.schema.yml +45 -0
  103. simtools/schemas/model_parameters/camera_config_file.schema.yml +40 -0
  104. simtools/schemas/model_parameters/camera_config_rotate.schema.yml +36 -0
  105. simtools/schemas/model_parameters/camera_degraded_efficiency.schema.yml +43 -0
  106. simtools/schemas/model_parameters/camera_degraded_map.schema.yml +42 -0
  107. simtools/schemas/model_parameters/camera_depth.schema.yml +42 -0
  108. simtools/schemas/model_parameters/camera_filter.schema.yml +45 -0
  109. simtools/schemas/model_parameters/camera_filter_incidence_angle.schema.yml +29 -0
  110. simtools/schemas/model_parameters/camera_pixels.schema.yml +36 -0
  111. simtools/schemas/model_parameters/camera_transmission.schema.yml +41 -0
  112. simtools/schemas/model_parameters/channels_per_chip.schema.yml +36 -0
  113. simtools/schemas/model_parameters/correct_nsb_spectrum_to_telescope_altitude.schema.yml +35 -0
  114. simtools/schemas/model_parameters/corsika_cherenkov_photon_bunch_size.schema.yml +27 -0
  115. simtools/schemas/model_parameters/corsika_cherenkov_photon_wavelength_range.schema.yml +38 -0
  116. simtools/schemas/model_parameters/corsika_first_interaction_height.schema.yml +28 -0
  117. simtools/schemas/model_parameters/corsika_iact_io_buffer.schema.yml +23 -0
  118. simtools/schemas/model_parameters/corsika_iact_max_bunches.schema.yml +27 -0
  119. simtools/schemas/model_parameters/corsika_iact_split_auto.schema.yml +28 -0
  120. simtools/schemas/model_parameters/corsika_longitudinal_shower_development.schema.yml +27 -0
  121. simtools/schemas/model_parameters/corsika_observation_level.schema.yml +38 -0
  122. simtools/schemas/model_parameters/corsika_particle_kinetic_energy_cutoff.schema.yml +52 -0
  123. simtools/schemas/model_parameters/corsika_starting_grammage.schema.yml +27 -0
  124. simtools/schemas/model_parameters/dark_events.schema.yml +32 -0
  125. simtools/schemas/model_parameters/default_trigger.schema.yml +35 -0
  126. simtools/schemas/model_parameters/design_model.schema.yml +31 -0
  127. simtools/schemas/model_parameters/disc_ac_coupled.schema.yml +32 -0
  128. simtools/schemas/model_parameters/disc_bins.schema.yml +39 -0
  129. simtools/schemas/model_parameters/disc_start.schema.yml +41 -0
  130. simtools/schemas/model_parameters/discriminator_amplitude.schema.yml +42 -0
  131. simtools/schemas/model_parameters/discriminator_fall_time.schema.yml +41 -0
  132. simtools/schemas/model_parameters/discriminator_gate_length.schema.yml +41 -0
  133. simtools/schemas/model_parameters/discriminator_hysteresis.schema.yml +39 -0
  134. simtools/schemas/model_parameters/discriminator_output_amplitude.schema.yml +40 -0
  135. simtools/schemas/model_parameters/discriminator_output_var_percent.schema.yml +41 -0
  136. simtools/schemas/model_parameters/discriminator_pulse_shape.schema.yml +33 -0
  137. simtools/schemas/model_parameters/discriminator_rise_time.schema.yml +42 -0
  138. simtools/schemas/model_parameters/discriminator_scale_threshold.schema.yml +37 -0
  139. simtools/schemas/model_parameters/discriminator_sigsum_over_threshold.schema.yml +44 -0
  140. simtools/schemas/model_parameters/discriminator_threshold.schema.yml +36 -0
  141. simtools/schemas/model_parameters/discriminator_time_over_threshold.schema.yml +45 -0
  142. simtools/schemas/model_parameters/discriminator_var_gate_length.schema.yml +40 -0
  143. simtools/schemas/model_parameters/discriminator_var_sigsum_over_threshold.schema.yml +41 -0
  144. simtools/schemas/model_parameters/discriminator_var_threshold.schema.yml +38 -0
  145. simtools/schemas/model_parameters/discriminator_var_time_over_threshold.schema.yml +38 -0
  146. simtools/schemas/model_parameters/dish_shape_length.schema.yml +41 -0
  147. simtools/schemas/model_parameters/dsum_clipping.schema.yml +38 -0
  148. simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +38 -0
  149. simtools/schemas/model_parameters/dsum_offset.schema.yml +37 -0
  150. simtools/schemas/model_parameters/dsum_pedsub.schema.yml +33 -0
  151. simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +39 -0
  152. simtools/schemas/model_parameters/dsum_prescale.schema.yml +44 -0
  153. simtools/schemas/model_parameters/dsum_presum_max.schema.yml +38 -0
  154. simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +45 -0
  155. simtools/schemas/model_parameters/dsum_shaping.schema.yml +44 -0
  156. simtools/schemas/model_parameters/dsum_shaping_renormalize.schema.yml +32 -0
  157. simtools/schemas/model_parameters/dsum_threshold.schema.yml +43 -0
  158. simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +42 -0
  159. simtools/schemas/model_parameters/effective_focal_length.schema.yml +61 -0
  160. simtools/schemas/model_parameters/epsg_code.schema.yml +37 -0
  161. simtools/schemas/model_parameters/fadc_ac_coupled.schema.yml +35 -0
  162. simtools/schemas/model_parameters/fadc_amplitude.schema.yml +46 -0
  163. simtools/schemas/model_parameters/fadc_bins.schema.yml +40 -0
  164. simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +50 -0
  165. simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +38 -0
  166. simtools/schemas/model_parameters/fadc_err_compensate_pedestal.schema.yml +42 -0
  167. simtools/schemas/model_parameters/fadc_err_pedestal.schema.yml +49 -0
  168. simtools/schemas/model_parameters/fadc_lg_amplitude.schema.yml +47 -0
  169. simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +51 -0
  170. simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +37 -0
  171. simtools/schemas/model_parameters/fadc_lg_err_compensate_pedestal.schema.yml +43 -0
  172. simtools/schemas/model_parameters/fadc_lg_err_pedestal.schema.yml +49 -0
  173. simtools/schemas/model_parameters/fadc_lg_max_signal.schema.yml +43 -0
  174. simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +39 -0
  175. simtools/schemas/model_parameters/fadc_lg_noise.schema.yml +42 -0
  176. simtools/schemas/model_parameters/fadc_lg_pedestal.schema.yml +40 -0
  177. simtools/schemas/model_parameters/fadc_lg_sensitivity.schema.yml +50 -0
  178. simtools/schemas/model_parameters/fadc_lg_sysvar_pedestal.schema.yml +42 -0
  179. simtools/schemas/model_parameters/fadc_lg_var_pedestal.schema.yml +41 -0
  180. simtools/schemas/model_parameters/fadc_lg_var_sensitivity.schema.yml +42 -0
  181. simtools/schemas/model_parameters/fadc_max_signal.schema.yml +43 -0
  182. simtools/schemas/model_parameters/fadc_max_sum.schema.yml +39 -0
  183. simtools/schemas/model_parameters/fadc_mhz.schema.yml +31 -0
  184. simtools/schemas/model_parameters/fadc_noise.schema.yml +41 -0
  185. simtools/schemas/model_parameters/fadc_pedestal.schema.yml +40 -0
  186. simtools/schemas/model_parameters/fadc_pulse_shape.schema.yml +39 -0
  187. simtools/schemas/model_parameters/fadc_sensitivity.schema.yml +50 -0
  188. simtools/schemas/model_parameters/fadc_sum_bins.schema.yml +43 -0
  189. simtools/schemas/model_parameters/fadc_sum_offset.schema.yml +43 -0
  190. simtools/schemas/model_parameters/fadc_sysvar_pedestal.schema.yml +42 -0
  191. simtools/schemas/model_parameters/fadc_var_pedestal.schema.yml +41 -0
  192. simtools/schemas/model_parameters/fadc_var_sensitivity.schema.yml +42 -0
  193. simtools/schemas/model_parameters/flatfielding.schema.yml +37 -0
  194. simtools/schemas/model_parameters/focal_length.schema.yml +45 -0
  195. simtools/schemas/model_parameters/focal_surface_parameters.schema.yml +158 -0
  196. simtools/schemas/model_parameters/focal_surface_ref_radius.schema.yml +29 -0
  197. simtools/schemas/model_parameters/focus_offset.schema.yml +66 -0
  198. simtools/schemas/model_parameters/gain_variation.schema.yml +43 -0
  199. simtools/schemas/model_parameters/geomag_horizontal.schema.yml +34 -0
  200. simtools/schemas/model_parameters/geomag_rotation.schema.yml +37 -0
  201. simtools/schemas/model_parameters/geomag_vertical.schema.yml +34 -0
  202. simtools/schemas/model_parameters/hg_lg_variation.schema.yml +36 -0
  203. simtools/schemas/model_parameters/iobuf_maximum.schema.yml +34 -0
  204. simtools/schemas/model_parameters/iobuf_output_maximum.schema.yml +34 -0
  205. simtools/schemas/model_parameters/laser_events.schema.yml +36 -0
  206. simtools/schemas/model_parameters/laser_external_trigger.schema.yml +35 -0
  207. simtools/schemas/model_parameters/laser_photons.schema.yml +32 -0
  208. simtools/schemas/model_parameters/laser_pulse_exptime.schema.yml +34 -0
  209. simtools/schemas/model_parameters/laser_pulse_offset.schema.yml +34 -0
  210. simtools/schemas/model_parameters/laser_pulse_sigtime.schema.yml +33 -0
  211. simtools/schemas/model_parameters/laser_pulse_twidth.schema.yml +33 -0
  212. simtools/schemas/model_parameters/laser_var_photons.schema.yml +33 -0
  213. simtools/schemas/model_parameters/laser_wavelength.schema.yml +33 -0
  214. simtools/schemas/model_parameters/led_events.schema.yml +34 -0
  215. simtools/schemas/model_parameters/led_photons.schema.yml +34 -0
  216. simtools/schemas/model_parameters/led_pulse_offset.schema.yml +32 -0
  217. simtools/schemas/model_parameters/led_pulse_sigtime.schema.yml +33 -0
  218. simtools/schemas/model_parameters/led_var_photons.schema.yml +34 -0
  219. simtools/schemas/model_parameters/lightguide_efficiency_vs_incidence_angle.schema.yml +41 -0
  220. simtools/schemas/model_parameters/lightguide_efficiency_vs_wavelength.schema.yml +43 -0
  221. simtools/schemas/model_parameters/min_photoelectrons.schema.yml +35 -0
  222. simtools/schemas/model_parameters/min_photons.schema.yml +32 -0
  223. simtools/schemas/model_parameters/mirror_align_random_distance.schema.yml +36 -0
  224. simtools/schemas/model_parameters/mirror_align_random_horizontal.schema.yml +64 -0
  225. simtools/schemas/model_parameters/mirror_align_random_vertical.schema.yml +64 -0
  226. simtools/schemas/model_parameters/mirror_class.schema.yml +41 -0
  227. simtools/schemas/model_parameters/mirror_degraded_reflection.schema.yml +51 -0
  228. simtools/schemas/model_parameters/mirror_focal_length.schema.yml +42 -0
  229. simtools/schemas/model_parameters/mirror_list.schema.yml +38 -0
  230. simtools/schemas/model_parameters/mirror_offset.schema.yml +41 -0
  231. simtools/schemas/model_parameters/mirror_panel_2f_measurements.schema.yml +39 -0
  232. simtools/schemas/model_parameters/mirror_reflection_random_angle.schema.yml +61 -0
  233. simtools/schemas/model_parameters/mirror_reflectivity.schema.yml +40 -0
  234. simtools/schemas/model_parameters/multiplicity_offset.schema.yml +46 -0
  235. simtools/schemas/model_parameters/nsb_autoscale_airmass.schema.yml +51 -0
  236. simtools/schemas/model_parameters/nsb_gain_drop_scale.schema.yml +37 -0
  237. simtools/schemas/model_parameters/nsb_offaxis.schema.yml +79 -0
  238. simtools/schemas/model_parameters/nsb_pixel_rate.schema.yml +47 -0
  239. simtools/schemas/model_parameters/nsb_reference_spectrum.schema.yml +34 -0
  240. simtools/schemas/model_parameters/nsb_reference_value.schema.yml +33 -0
  241. simtools/schemas/model_parameters/nsb_scaling_factor.schema.yml +35 -0
  242. simtools/schemas/model_parameters/nsb_skymap.schema.yml +39 -0
  243. simtools/schemas/model_parameters/nsb_spectrum.schema.yml +50 -0
  244. simtools/schemas/model_parameters/num_gains.schema.yml +34 -0
  245. simtools/schemas/model_parameters/only_triggered_telescopes.schema.yml +33 -0
  246. simtools/schemas/model_parameters/optics_properties.schema.yml +31 -0
  247. simtools/schemas/model_parameters/parabolic_dish.schema.yml +32 -0
  248. simtools/schemas/model_parameters/pedestal_events.schema.yml +32 -0
  249. simtools/schemas/model_parameters/photon_delay.schema.yml +38 -0
  250. simtools/schemas/model_parameters/photons_per_run.schema.yml +33 -0
  251. simtools/schemas/model_parameters/pixel_cells.schema.yml +35 -0
  252. simtools/schemas/model_parameters/pixels_parallel.schema.yml +54 -0
  253. simtools/schemas/model_parameters/pixeltrg_time_step.schema.yml +40 -0
  254. simtools/schemas/model_parameters/pm_average_gain.schema.yml +34 -0
  255. simtools/schemas/model_parameters/pm_collection_efficiency.schema.yml +40 -0
  256. simtools/schemas/model_parameters/pm_gain_index.schema.yml +36 -0
  257. simtools/schemas/model_parameters/pm_photoelectron_spectrum.schema.yml +41 -0
  258. simtools/schemas/model_parameters/pm_transit_time.schema.yml +63 -0
  259. simtools/schemas/model_parameters/pm_voltage_variation.schema.yml +39 -0
  260. simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +42 -0
  261. simtools/schemas/model_parameters/primary_mirror_diameter.schema.yml +33 -0
  262. simtools/schemas/model_parameters/primary_mirror_hole_diameter.schema.yml +33 -0
  263. simtools/schemas/model_parameters/primary_mirror_incidence_angle.schema.yml +29 -0
  264. simtools/schemas/model_parameters/primary_mirror_parameters.schema.yml +168 -0
  265. simtools/schemas/model_parameters/primary_mirror_ref_radius.schema.yml +36 -0
  266. simtools/schemas/model_parameters/primary_mirror_segmentation.schema.yml +34 -0
  267. simtools/schemas/model_parameters/qe_variation.schema.yml +43 -0
  268. simtools/schemas/model_parameters/quantum_efficiency.schema.yml +42 -0
  269. simtools/schemas/model_parameters/random_focal_length.schema.yml +45 -0
  270. simtools/schemas/model_parameters/random_generator.schema.yml +36 -0
  271. simtools/schemas/model_parameters/reference_point_altitude.schema.yml +35 -0
  272. simtools/schemas/model_parameters/reference_point_latitude.schema.yml +36 -0
  273. simtools/schemas/model_parameters/reference_point_longitude.schema.yml +36 -0
  274. simtools/schemas/model_parameters/reference_point_utm_east.schema.yml +34 -0
  275. simtools/schemas/model_parameters/reference_point_utm_north.schema.yml +34 -0
  276. simtools/schemas/model_parameters/sampled_output.schema.yml +31 -0
  277. simtools/schemas/model_parameters/save_pe_with_amplitude.schema.yml +34 -0
  278. simtools/schemas/model_parameters/secondary_mirror_baffle.schema.yml +79 -0
  279. simtools/schemas/model_parameters/secondary_mirror_degraded_map.schema.yml +42 -0
  280. simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +41 -0
  281. simtools/schemas/model_parameters/secondary_mirror_diameter.schema.yml +33 -0
  282. simtools/schemas/model_parameters/secondary_mirror_hole_diameter.schema.yml +36 -0
  283. simtools/schemas/model_parameters/secondary_mirror_incidence_angle.schema.yml +29 -0
  284. simtools/schemas/model_parameters/secondary_mirror_parameters.schema.yml +168 -0
  285. simtools/schemas/model_parameters/secondary_mirror_ref_radius.schema.yml +36 -0
  286. simtools/schemas/model_parameters/secondary_mirror_reflectivity.schema.yml +35 -0
  287. simtools/schemas/model_parameters/secondary_mirror_segmentation.schema.yml +37 -0
  288. simtools/schemas/model_parameters/secondary_mirror_shadow_diameter.schema.yml +40 -0
  289. simtools/schemas/model_parameters/secondary_mirror_shadow_offset.schema.yml +40 -0
  290. simtools/schemas/model_parameters/store_photoelectrons.schema.yml +41 -0
  291. simtools/schemas/model_parameters/tailcut_scale.schema.yml +40 -0
  292. simtools/schemas/model_parameters/telescope_axis_height.schema.yml +31 -0
  293. simtools/schemas/model_parameters/telescope_random_angle.schema.yml +35 -0
  294. simtools/schemas/model_parameters/telescope_random_error.schema.yml +34 -0
  295. simtools/schemas/model_parameters/telescope_sphere_radius.schema.yml +37 -0
  296. simtools/schemas/model_parameters/telescope_transmission.schema.yml +113 -0
  297. simtools/schemas/model_parameters/teltrig_min_sigsum.schema.yml +41 -0
  298. simtools/schemas/model_parameters/teltrig_min_time.schema.yml +36 -0
  299. simtools/schemas/model_parameters/transit_time_calib_error.schema.yml +36 -0
  300. simtools/schemas/model_parameters/transit_time_compensate_error.schema.yml +37 -0
  301. simtools/schemas/model_parameters/transit_time_compensate_step.schema.yml +38 -0
  302. simtools/schemas/model_parameters/transit_time_error.schema.yml +45 -0
  303. simtools/schemas/model_parameters/transit_time_jitter.schema.yml +36 -0
  304. simtools/schemas/model_parameters/trigger_current_limit.schema.yml +32 -0
  305. simtools/schemas/model_parameters/trigger_delay_compensation.schema.yml +53 -0
  306. simtools/schemas/model_parameters/trigger_pixels.schema.yml +40 -0
  307. simtools/simtel/simtel_config_reader.py +353 -0
  308. simtools/simtel/simtel_config_writer.py +244 -63
  309. simtools/simtel/{simtel_events.py → simtel_io_events.py} +26 -25
  310. simtools/simtel/simtel_io_histogram.py +661 -0
  311. simtools/simtel/simtel_io_histograms.py +569 -0
  312. simtools/simtel/simulator_array.py +145 -0
  313. simtools/simtel/{simtel_runner_camera_efficiency.py → simulator_camera_efficiency.py} +76 -52
  314. simtools/simtel/simulator_light_emission.py +473 -0
  315. simtools/simtel/simulator_ray_tracing.py +262 -0
  316. simtools/simulator.py +220 -446
  317. simtools/testing/__init__.py +0 -0
  318. simtools/testing/assertions.py +151 -0
  319. simtools/testing/configuration.py +226 -0
  320. simtools/testing/helpers.py +42 -0
  321. simtools/testing/validate_output.py +240 -0
  322. simtools/utils/general.py +340 -437
  323. simtools/utils/geometry.py +12 -12
  324. simtools/utils/names.py +258 -644
  325. simtools/utils/value_conversion.py +176 -0
  326. simtools/version.py +2 -0
  327. simtools/visualization/legend_handlers.py +135 -152
  328. simtools/visualization/plot_camera.py +379 -0
  329. simtools/visualization/visualize.py +346 -167
  330. gammasimtools-0.6.1.dist-info/METADATA +0 -180
  331. gammasimtools-0.6.1.dist-info/RECORD +0 -91
  332. gammasimtools-0.6.1.dist-info/entry_points.txt +0 -23
  333. simtools/applications/db_development_tools/add_new_parameter_to_db.py +0 -81
  334. simtools/applications/db_development_tools/add_unit_to_parameter_in_db.py +0 -59
  335. simtools/applications/db_development_tools/mark_non_optics_parameters_non_applicable.py +0 -102
  336. simtools/applications/get_parameter.py +0 -92
  337. simtools/applications/make_regular_arrays.py +0 -160
  338. simtools/applications/produce_array_config.py +0 -136
  339. simtools/applications/production.py +0 -313
  340. simtools/applications/sim_showers_for_trigger_rates.py +0 -187
  341. simtools/applications/tune_psf.py +0 -334
  342. simtools/corsika/corsika_default_config.py +0 -282
  343. simtools/corsika/corsika_runner.py +0 -450
  344. simtools/corsika_simtel/corsika_simtel_runner.py +0 -197
  345. simtools/db_handler.py +0 -1480
  346. simtools/ray_tracing.py +0 -525
  347. simtools/simtel/simtel_histograms.py +0 -414
  348. simtools/simtel/simtel_runner.py +0 -244
  349. simtools/simtel/simtel_runner_array.py +0 -293
  350. simtools/simtel/simtel_runner_ray_tracing.py +0 -277
  351. {gammasimtools-0.6.1.dist-info → gammasimtools-0.8.1.dist-info}/LICENSE +0 -0
  352. {gammasimtools-0.6.1.dist-info → gammasimtools-0.8.1.dist-info}/top_level.txt +0 -0
  353. /simtools/{corsika_simtel → db}/__init__.py +0 -0
@@ -1,3 +1,5 @@
1
+ """Camera efficiency simulations and analysis."""
2
+
1
3
  import logging
2
4
  import re
3
5
  from collections import defaultdict
@@ -6,10 +8,10 @@ import astropy.io.ascii
6
8
  import numpy as np
7
9
  from astropy.table import Table
8
10
 
9
- import simtools.utils.general as gen
10
11
  from simtools.io_operations import io_handler
12
+ from simtools.model.site_model import SiteModel
11
13
  from simtools.model.telescope_model import TelescopeModel
12
- from simtools.simtel.simtel_runner_camera_efficiency import SimtelRunnerCameraEfficiency
14
+ from simtools.simtel.simulator_camera_efficiency import SimulatorCameraEfficiency
13
15
  from simtools.utils import names
14
16
  from simtools.visualization import visualize
15
17
 
@@ -18,167 +20,169 @@ __all__ = ["CameraEfficiency"]
18
20
 
19
21
  class CameraEfficiency:
20
22
  """
21
- Class for handling camera efficiency simulations and analysis.
23
+ Camera efficiency simulations and analysis.
22
24
 
23
25
  Parameters
24
26
  ----------
25
- telescope_model: TelescopeModel
26
- Instance of the TelescopeModel class.
27
- simtel_source_path: str (or Path)
27
+ simtel_path: str (or Path)
28
28
  Location of sim_telarray installation.
29
+ db_config: dict
30
+ Configuration for the database.
29
31
  label: str
30
32
  Instance label, optional.
31
33
  config_data: dict.
32
34
  Dict containing the configurable parameters.
33
- config_file: str or Path
34
- Path of the yaml file containing the configurable parameters.
35
35
  test: bool
36
36
  Is it a test instance (at the moment only affects the location of files).
37
37
  """
38
38
 
39
39
  def __init__(
40
40
  self,
41
- telescope_model,
42
- simtel_source_path,
43
- label=None,
44
- config_data=None,
45
- config_file=None,
41
+ simtel_path,
42
+ config_data,
43
+ label,
44
+ db_config,
46
45
  test=False,
47
46
  ):
48
- """
49
- Initiliaze the CameraEfficiency class.
50
- """
51
-
47
+ """Initialize the CameraEfficiency class."""
52
48
  self._logger = logging.getLogger(__name__)
53
49
 
54
- self._simtel_source_path = simtel_source_path
55
- self._telescope_model = self._validate_telescope_model(telescope_model)
56
- self.label = label if label is not None else self._telescope_model.label
50
+ self._simtel_path = simtel_path
51
+ self.label = label
57
52
  self.test = test
58
53
 
59
54
  self.io_handler = io_handler.IOHandler()
60
- self._base_directory = self.io_handler.get_output_directory(
61
- label=self.label,
62
- sub_dir="camera-efficiency",
63
- dir_type="test" if self.test else "simtools",
55
+ self.telescope_model, self._site_model = self._initialize_simulation_models(
56
+ config_data, db_config
64
57
  )
58
+ self.output_dir = self.io_handler.get_output_directory(self.label, sub_dir="plots")
65
59
 
66
60
  self._results = None
67
61
  self._has_results = False
68
62
 
69
- _config_data_in = gen.collect_data_from_file_or_dict(
70
- config_file, config_data, allow_empty=True
71
- )
72
- _parameter_file = self.io_handler.get_input_data_file(
73
- "parameters", "camera-efficiency_parameters.yml"
74
- )
75
- _parameters = gen.collect_data_from_file_or_dict(_parameter_file, None)
76
- self.config = gen.validate_config_data(_config_data_in, _parameters)
63
+ self.config = self._configuration_from_args_dict(config_data)
64
+ self._file = self._load_files()
77
65
 
78
- self._load_files()
66
+ def __repr__(self):
67
+ """Return string representation of the CameraEfficiency instance."""
68
+ return f"CameraEfficiency(label={self.label})\n"
79
69
 
80
- @classmethod
81
- def from_kwargs(cls, **kwargs):
70
+ def _initialize_simulation_models(self, config_data, db_config):
82
71
  """
83
- Builds a CameraEfficiency object from kwargs only.
84
- The configurable parameters can be given as kwargs, instead of using the
85
- config_data or config_file arguments.
72
+ Initialize site and telescope models.
86
73
 
87
74
  Parameters
88
75
  ----------
89
- kwargs
90
- Containing the arguments and the configurable parameters.
76
+ config_data: dict
77
+ Dict containing the configurable parameters.
91
78
 
92
79
  Returns
93
80
  -------
94
- Instance of this class.
81
+ tuple
82
+ Tuple containing the site and telescope models.
95
83
  """
96
- args, config_data = gen.separate_args_and_config_data(
97
- expected_args=[
98
- "telescope_model",
99
- "label",
100
- "simtel_source_path",
101
- "test",
102
- ],
103
- **kwargs,
84
+ tel_model = TelescopeModel(
85
+ site=config_data["site"],
86
+ telescope_name=config_data["telescope"],
87
+ mongo_db_config=db_config,
88
+ model_version=config_data["model_version"],
89
+ label=self.label,
90
+ )
91
+ site_model = SiteModel(
92
+ site=config_data["site"],
93
+ model_version=config_data["model_version"],
94
+ mongo_db_config=db_config,
104
95
  )
105
- return cls(**args, config_data=config_data)
96
+ return tel_model, site_model
106
97
 
107
- def __repr__(self):
108
- return f"CameraEfficiency(label={self.label})\n"
98
+ def _configuration_from_args_dict(self, config_data):
99
+ """
100
+ Extract the configuration data from the args_dict.
109
101
 
110
- def _validate_telescope_model(self, tel):
111
- """Validate TelescopeModel
102
+ Zenith and azimuth angles are set to default values if not provided.
112
103
 
113
104
  Parameters
114
105
  ----------
115
- tel: TelescopeModel
116
- An assumed instance of the TelescopeModel class.
117
- Raises
118
- ------
119
- ValueError
120
- if tel not of type TelescopeModel
106
+ config_data: dict
107
+ Dict containing the configurable parameters.
121
108
 
109
+ Returns
110
+ -------
111
+ dict
112
+ Configuration data.
122
113
  """
123
- if isinstance(tel, TelescopeModel):
124
- self._logger.debug("TelescopeModel OK")
125
- return tel
114
+ zenith_angle = config_data.get("zenith_angle")
115
+ if zenith_angle is not None:
116
+ zenith_angle = zenith_angle.to("deg").value
117
+ else:
118
+ zenith_angle = 20.0
119
+ self._logger.info(f"Setting zenith angle to default value {zenith_angle} deg")
120
+ azimuth_angle = config_data.get("azimuth_angle")
121
+ if azimuth_angle is not None:
122
+ azimuth_angle = azimuth_angle.to("deg").value
123
+ else:
124
+ azimuth_angle = 0.0
125
+ self._logger.info(f"Setting azimuth angle to default value {azimuth_angle} deg")
126
126
 
127
- msg = "Invalid TelescopeModel"
128
- self._logger.error(msg)
129
- raise ValueError(msg)
127
+ return {
128
+ "zenith_angle": zenith_angle,
129
+ "azimuth_angle": azimuth_angle,
130
+ "nsb_spectrum": config_data.get("nsb_spectrum", None),
131
+ }
130
132
 
131
133
  def _load_files(self):
132
134
  """Define the variables for the file names, including the results, simtel and log file."""
133
- # Results file
134
- file_name_results = names.camera_efficiency_results_file_name(
135
- site=self._telescope_model.site,
136
- telescope_model_name=self._telescope_model.name,
137
- zenith_angle=self.config.zenith_angle,
138
- azimuth_angle=self.config.azimuth_angle,
139
- label=self.label,
140
- )
141
- self._file_results = self._base_directory.joinpath(file_name_results)
142
- # sim_telarray output file
143
- file_name_simtel = names.camera_efficiency_simtel_file_name(
144
- site=self._telescope_model.site,
145
- telescope_model_name=self._telescope_model.name,
146
- zenith_angle=self.config.zenith_angle,
147
- azimuth_angle=self.config.azimuth_angle,
148
- label=self.label,
149
- )
150
- self._file_simtel = self._base_directory.joinpath(file_name_simtel)
151
- # Log file
152
- file_name_log = names.camera_efficiency_log_file_name(
153
- site=self._telescope_model.site,
154
- telescope_model_name=self._telescope_model.name,
155
- zenith_angle=self.config.zenith_angle,
156
- azimuth_angle=self.config.azimuth_angle,
157
- label=self.label,
158
- )
159
- self._file_log = self._base_directory.joinpath(file_name_log)
135
+ _file = {}
136
+ for label, suffix in zip(
137
+ ["results", "simtel", "log"],
138
+ [".ecsv", ".dat", ".log"],
139
+ ):
140
+ file_name = names.generate_file_name(
141
+ file_type=(
142
+ "camera-efficiency-table" if label == "results" else "camera-efficiency"
143
+ ),
144
+ suffix=suffix,
145
+ site=self.telescope_model.site,
146
+ telescope_model_name=self.telescope_model.name,
147
+ zenith_angle=self.config["zenith_angle"],
148
+ azimuth_angle=self.config["azimuth_angle"],
149
+ label=self.label,
150
+ )
160
151
 
161
- def simulate(self, force=False):
162
- """
163
- Simulate camera efficiency using testeff.
152
+ _file[label] = self.io_handler.get_output_directory(
153
+ label=self.label,
154
+ sub_dir="camera-efficiency",
155
+ ).joinpath(file_name)
156
+ return _file
164
157
 
165
- Parameters
166
- ----------
167
- force: bool
168
- Force flag will remove existing files and simulate again.
169
- """
158
+ def simulate(self):
159
+ """Simulate camera efficiency using testeff."""
170
160
  self._logger.info("Simulating CameraEfficiency")
171
161
 
172
- simtel = SimtelRunnerCameraEfficiency(
173
- simtel_source_path=self._simtel_source_path,
174
- telescope_model=self._telescope_model,
175
- zenith_angle=self.config.zenith_angle,
176
- file_simtel=self._file_simtel,
177
- file_log=self._file_log,
162
+ self.export_model_files()
163
+
164
+ simtel = SimulatorCameraEfficiency(
165
+ simtel_path=self._simtel_path,
166
+ telescope_model=self.telescope_model,
167
+ zenith_angle=self.config["zenith_angle"],
168
+ file_simtel=self._file["simtel"],
169
+ file_log=self._file["log"],
178
170
  label=self.label,
179
- nsb_spectrum=self.config.nsb_spectrum,
171
+ nsb_spectrum=self.config["nsb_spectrum"],
172
+ skip_correction_to_nsb_spectrum=self.config.get(
173
+ "skip_correction_to_nsb_spectrum", False
174
+ ),
180
175
  )
181
- simtel.run(test=self.test, force=force)
176
+ simtel.run(test=self.test)
177
+
178
+ def export_model_files(self):
179
+ """Export model and config files to the output directory."""
180
+ self.telescope_model.export_config_file()
181
+ self.telescope_model.export_model_files()
182
+ if not self.config.get("skip_correction_to_nsb_spectrum", False):
183
+ self.telescope_model.export_nsb_spectrum_to_telescope_altitude_correction_file(
184
+ model_directory=self.telescope_model.config_file_directory
185
+ )
182
186
 
183
187
  def analyze(self, export=True, force=False):
184
188
  """
@@ -194,7 +198,7 @@ class CameraEfficiency:
194
198
  """
195
199
  self._logger.info("Analyzing CameraEfficiency")
196
200
 
197
- if self._file_results.exists() and not force:
201
+ if "results" in self._file and not force:
198
202
  self._logger.info("Results file exists and force=False - skipping analyze")
199
203
  self._read_results()
200
204
  return
@@ -233,33 +237,33 @@ class CameraEfficiency:
233
237
 
234
238
  # Search for at least 5 consecutive numbers to see that we are in the table
235
239
  re_table = re.compile("{0}{0}{0}{0}{0}".format(r"[-+]?[0-9]*\.?[0-9]+\s+"))
236
- with open(self._file_simtel, "r", encoding="utf-8") as file:
240
+ with open(self._file["simtel"], encoding="utf-8") as file:
237
241
  for line in file:
238
242
  if re_table.match(line):
239
243
  words = line.split()
240
244
  numbers = [float(w) for w in words]
241
245
  for i in range(len(eff_pars) - 10):
242
246
  _results[eff_pars[i]].append(numbers[i])
243
- C1 = numbers[8] * (400 / numbers[0]) ** 2
244
- C2 = C1 * numbers[4] * numbers[5]
245
- C3 = C2 * numbers[6] * numbers[7]
246
- C4 = C3 * numbers[3]
247
- C4x = C1 * numbers[3] * numbers[6] * numbers[7]
247
+ C1 = numbers[8] * (400 / numbers[0]) ** 2 # noqa: N806
248
+ C2 = C1 * numbers[4] * numbers[5] # noqa: N806
249
+ C3 = C2 * numbers[6] * numbers[7] # noqa: N806
250
+ C4 = C3 * numbers[3] # noqa: N806
251
+ c4x_value = C1 * numbers[3] * numbers[6] * numbers[7]
248
252
  _results["C1"].append(C1)
249
253
  _results["C2"].append(C2)
250
254
  _results["C3"].append(C3)
251
255
  _results["C4"].append(C4)
252
- _results["C4x"].append(C4x)
253
- N1 = numbers[14]
254
- N2 = N1 * numbers[4] * numbers[5]
255
- N3 = N2 * numbers[6] * numbers[7]
256
- N4 = N3 * numbers[3]
257
- N4x = N1 * numbers[3] * numbers[6] * numbers[7]
256
+ _results["C4x"].append(c4x_value)
257
+ N1 = numbers[14] # noqa: N806
258
+ N2 = N1 * numbers[4] * numbers[5] # noqa: N806
259
+ N3 = N2 * numbers[6] * numbers[7] # noqa: N806
260
+ N4 = N3 * numbers[3] # noqa: N806
261
+ n4x_value = N1 * numbers[3] * numbers[6] * numbers[7]
258
262
  _results["N1"].append(N1)
259
263
  _results["N2"].append(N2)
260
264
  _results["N3"].append(N3)
261
265
  _results["N4"].append(N4)
262
- _results["N4x"].append(N4x)
266
+ _results["N4x"].append(n4x_value)
263
267
 
264
268
  self._results = Table(_results)
265
269
  self._has_results = True
@@ -271,31 +275,30 @@ class CameraEfficiency:
271
275
  if export:
272
276
  self.export_results()
273
277
 
274
- # END of analyze
275
-
276
278
  def results_summary(self):
277
279
  """
278
280
  Print a summary of the results.
281
+
279
282
  Include a header for the zenith/azimuth settings and the NSB spectrum file which was used.
280
283
  The summary includes the various CTAO requirements and the final expected NSB pixel rate.
281
284
  """
282
285
  nsb_pixel_pe_per_ns, nsb_rate_ref_conditions = self.calc_nsb_rate()
283
286
  nsb_spectrum_text = (
284
- f"NSB spectrum file: {self.config.nsb_spectrum}"
285
- if self.config.nsb_spectrum
287
+ f"NSB spectrum file: {self.config['nsb_spectrum']}"
288
+ if self.config["nsb_spectrum"]
286
289
  else "default sim_telarray spectrum."
287
290
  )
288
- summary = (
289
- f"Results summary for {self._telescope_model.name} at "
290
- f"zenith={self.config.zenith_angle:.1f} deg, "
291
- f"azimuth={self.config.azimuth_angle:.1f} deg\n"
291
+ return (
292
+ f"Results summary for {self.telescope_model.name} at "
293
+ f"zenith={self.config['zenith_angle']:.1f} deg, "
294
+ f"azimuth={self.config['azimuth_angle']:.1f} deg\n"
292
295
  f"Using the {nsb_spectrum_text}\n"
293
296
  f"\nSpectrum weighted reflectivity: {self.calc_reflectivity():.4f}\n"
294
297
  "Camera nominal efficiency with gaps (B-TEL-1170): "
295
298
  f"{self.calc_camera_efficiency():.4f}\n"
296
299
  "Telescope total efficiency"
297
300
  f" with gaps (was A-PERF-2020): {self.calc_tel_efficiency():.4f}\n"
298
- "Telescope total Cherenkov light efficiency / sqrt(total NSB efficency) "
301
+ "Telescope total Cherenkov light efficiency / sqrt(total NSB efficiency) "
299
302
  "(A-PERF-2025/B-TEL-0090): "
300
303
  f"{self.calc_tot_efficiency(self.calc_tel_efficiency()):.4f}\n"
301
304
  "Expected NSB pixel rate for the provided NSB spectrum: "
@@ -304,19 +307,17 @@ class CameraEfficiency:
304
307
  f"{nsb_rate_ref_conditions:.4f} [p.e./ns]\n"
305
308
  )
306
309
 
307
- return summary
308
-
309
310
  def export_results(self):
310
311
  """Export results to a ecsv file."""
311
312
  if not self._has_results:
312
313
  self._logger.error("Cannot export results because they do not exist")
313
314
  else:
314
- self._logger.info(f"Exporting testeff table to {self._file_results}")
315
+ self._logger.info(f"Exporting testeff table to {self._file['results']}")
315
316
  astropy.io.ascii.write(
316
- self._results, self._file_results, format="basic", overwrite=True
317
+ self._results, self._file["results"], format="basic", overwrite=True
317
318
  )
318
319
  _results_summary_file = (
319
- str(self._file_results).replace(".ecsv", ".txt").replace("-table-", "-summary-")
320
+ str(self._file["results"]).replace(".ecsv", ".txt").replace("-table-", "-summary-")
320
321
  )
321
322
  self._logger.info(f"Exporting summary results to {_results_summary_file}")
322
323
  with open(_results_summary_file, "w", encoding="utf-8") as file:
@@ -324,7 +325,7 @@ class CameraEfficiency:
324
325
 
325
326
  def _read_results(self):
326
327
  """Read existing results file and store it in _results."""
327
- table = astropy.io.ascii.read(self._file_results, format="basic")
328
+ table = astropy.io.ascii.read(self._file["results"], format="basic")
328
329
  self._results = table
329
330
  self._has_results = True
330
331
 
@@ -337,18 +338,15 @@ class CameraEfficiency:
337
338
  tel_efficiency: float
338
339
  Telescope efficiency
339
340
  """
340
-
341
341
  # Sum(C1) from 300 - 550 nm:
342
342
  c1_reduced_wl = self._results["C1"][[299 < wl_now < 551 for wl_now in self._results["wl"]]]
343
343
  c1_sum = np.sum(c1_reduced_wl)
344
344
  # Sum(C4) from 200 - 999 nm:
345
345
  c4_sum = np.sum(self._results["C4"])
346
346
  masts_factor = self._results["masts"][0]
347
- fill_factor = self._telescope_model.camera.get_camera_fill_factor()
348
-
349
- tel_efficiency = fill_factor * (c4_sum / (masts_factor * c1_sum))
347
+ fill_factor = self.telescope_model.camera.get_camera_fill_factor()
350
348
 
351
- return tel_efficiency
349
+ return fill_factor * (c4_sum / (masts_factor * c1_sum))
352
350
 
353
351
  def calc_camera_efficiency(self):
354
352
  """
@@ -359,7 +357,6 @@ class CameraEfficiency:
359
357
  cam_efficiency: float
360
358
  Wavelength-averaged camera efficiency
361
359
  """
362
-
363
360
  # Sum(C1) from 300 - 550 nm:
364
361
  c1_reduced_wl = self._results["C1"][[299 < wl_now < 551 for wl_now in self._results["wl"]]]
365
362
  c1_sum = np.sum(c1_reduced_wl)
@@ -368,12 +365,10 @@ class CameraEfficiency:
368
365
  [299 < wl_now < 551 for wl_now in self._results["wl"]]
369
366
  ]
370
367
  c4x_sum = np.sum(c4x_reduced_wl)
371
- fill_factor = self._telescope_model.camera.get_camera_fill_factor()
368
+ fill_factor = self.telescope_model.camera.get_camera_fill_factor()
372
369
 
373
370
  cam_efficiency_no_gaps = c4x_sum / c1_sum
374
- cam_efficiency = cam_efficiency_no_gaps * fill_factor
375
-
376
- return cam_efficiency
371
+ return cam_efficiency_no_gaps * fill_factor
377
372
 
378
373
  def calc_tot_efficiency(self, tel_efficiency):
379
374
  """
@@ -389,14 +384,13 @@ class CameraEfficiency:
389
384
  Float
390
385
  Telescope total efficiency including gaps
391
386
  """
392
-
393
387
  # Sum(N1) from 300 - 550 nm:
394
388
  n1_reduced_wl = self._results["N1"][[299 < wl_now < 551 for wl_now in self._results["wl"]]]
395
389
  n1_sum = np.sum(n1_reduced_wl)
396
390
  # Sum(N4) from 200 - 999 nm:
397
391
  n4_sum = np.sum(self._results["N4"])
398
392
  masts_factor = self._results["masts"][0]
399
- fill_factor = self._telescope_model.camera.get_camera_fill_factor()
393
+ fill_factor = self.telescope_model.camera.get_camera_fill_factor()
400
394
 
401
395
  tel_efficiency_nsb = fill_factor * (n4_sum / (masts_factor * n1_sum))
402
396
 
@@ -411,16 +405,13 @@ class CameraEfficiency:
411
405
  Float
412
406
  Cherenkov spectrum weighted reflectivity (300-550 nm)
413
407
  """
414
-
415
408
  # Sum(C1) from 300 - 550 nm:
416
409
  c1_reduced_wl = self._results["C1"][[299 < wl_now < 551 for wl_now in self._results["wl"]]]
417
410
  c1_sum = np.sum(c1_reduced_wl)
418
411
  # Sum(C2) from 300 - 550 nm:
419
412
  c2_reduced_wl = self._results["C2"][[299 < wl_now < 551 for wl_now in self._results["wl"]]]
420
413
  c2_sum = np.sum(c2_reduced_wl)
421
- cher_spec_weighted_reflectivity = c2_sum / c1_sum / self._results["masts"][0]
422
-
423
- return cher_spec_weighted_reflectivity
414
+ return c2_sum / c1_sum / self._results["masts"][0]
424
415
 
425
416
  def calc_nsb_rate(self):
426
417
  """
@@ -434,12 +425,11 @@ class CameraEfficiency:
434
425
  NSB pixel rate in p.e./ns for reference conditions
435
426
  (https://jama.cta-observatory.org/perspective.req#/items/26694?projectId=11)
436
427
  """
437
-
438
428
  nsb_rate_provided_spectrum = (
439
429
  np.sum(self._results["N4"])
440
- * self._telescope_model.camera.get_pixel_active_solid_angle()
441
- * self._telescope_model.get_on_axis_eff_optical_area().to("m2").value
442
- / self._telescope_model.get_telescope_transmission_parameters()[0]
430
+ * self.telescope_model.camera.get_pixel_active_solid_angle()
431
+ * self.telescope_model.get_on_axis_eff_optical_area().to("m2").value
432
+ / self.telescope_model.get_parameter_value("telescope_transmission")[0]
443
433
  )
444
434
 
445
435
  # (integral is in ph./(m^2 ns sr) ) from 300 - 650 nm:
@@ -452,29 +442,40 @@ class CameraEfficiency:
452
442
  nsb_integral = 0.0001 * (n1_sum - 0.5 * n1_integral_edges_sum)
453
443
  nsb_rate_ref_conditions = (
454
444
  nsb_rate_provided_spectrum
455
- * self._telescope_model.reference_data["nsb_reference_value"]["Value"]
445
+ * self._site_model.get_parameter_value("nsb_reference_value")
456
446
  / nsb_integral
457
447
  )
458
448
  return nsb_rate_provided_spectrum, nsb_rate_ref_conditions
459
449
 
460
- def plot_cherenkov_efficiency(self):
450
+ def plot_efficiency(self, efficiency_type, save_fig=False):
461
451
  """
462
- Plot Cherenkov efficiency vs wavelength.
452
+ Plot efficiency vs wavelength.
453
+
454
+ Parameters
455
+ ----------
456
+ efficiency_type: str
457
+ The type of efficiency to plot (Cherenkov 'C' or NSB 'N')
458
+ save_fig: bool
459
+ If True, the figure will be saved to a file.
463
460
 
464
461
  Returns
465
462
  -------
466
463
  fig
467
464
  The figure instance of pyplot
468
465
  """
469
- self._logger.info("Plotting Cherenkov efficiency vs wavelength")
466
+ self._logger.info(f"Plotting {efficiency_type} efficiency vs wavelength")
467
+
468
+ _col_type = "C" if efficiency_type == "Cherenkov" else "N"
470
469
 
471
470
  column_titles = {
472
471
  "wl": "Wavelength [nm]",
473
- "C1": r"C1: Cherenkov light on ground",
474
- "C2": r"C2: C1 $\times$ ref. $\times$ masts",
475
- "C3": r"C3: C2 $\times$ filter $\times$ lightguide",
476
- "C4": r"C4: C3 $\times$ q.e.",
477
- "C4x": r"C4x: C1 $\times$ filter $\times$ lightguide $\times$ q.e.",
472
+ f"{_col_type}1": rf"{_col_type}1: Cherenkov light on ground",
473
+ f"{_col_type}2": rf"{_col_type}2: {_col_type}1 $\times$ ref. $\times$ masts",
474
+ f"{_col_type}3": rf"{_col_type}3: {_col_type}2 $\times$ filter $\times$ lightguide",
475
+ f"{_col_type}4": rf"{_col_type}4: {_col_type}3 $\times$ q.e.",
476
+ f"{_col_type}4x": (
477
+ rf"{_col_type}4x: {_col_type}1 $\times$ filter $\times$ lightguide $\times$ q.e."
478
+ ),
478
479
  }
479
480
 
480
481
  table_to_plot = Table([self._results[col_now] for col_now in column_titles])
@@ -482,48 +483,38 @@ class CameraEfficiency:
482
483
  for column_now, column_title in column_titles.items():
483
484
  table_to_plot.rename_column(column_now, column_title)
484
485
 
485
- fig = visualize.plot_table(
486
+ y_title = f"{efficiency_type} light efficiency"
487
+ if efficiency_type == "NSB":
488
+ y_title = r"Diff. ph. rate [$10^{9} \times $ph/(nm s m$^2$ sr)]"
489
+ plot = visualize.plot_table(
486
490
  table_to_plot,
487
- y_title="Cherenkov light efficiency",
488
- title=f"{self._telescope_model.name} response to Cherenkov light",
491
+ y_title=y_title,
492
+ title=f"{self.telescope_model.name} response to {efficiency_type} light",
489
493
  no_markers=True,
490
494
  )
495
+ if efficiency_type == "NSB":
496
+ plot.gca().set_yscale("log")
497
+ ylim = plot.gca().get_ylim()
498
+ plot.gca().set_ylim(1e-3, ylim[1])
499
+ if save_fig:
500
+ self._save_plot(plot, efficiency_type.lower())
501
+ return plot
491
502
 
492
- return fig
493
-
494
- def plot_nsb_efficiency(self):
503
+ def _save_plot(self, fig, plot_title):
495
504
  """
496
- Plot NSB efficiency vs wavelength.
505
+ Save plot to pdf and png file.
497
506
 
498
- Returns
499
- -------
507
+ Parameters
508
+ ----------
500
509
  fig
501
510
  The figure instance of pyplot
511
+ plot_title: str
512
+ The title of the plot
502
513
  """
503
- self._logger.info("Plotting NSB efficiency vs wavelength")
504
- column_titles = {
505
- "wl": "Wavelength [nm]",
506
- "N1": r"N1: NSB light on ground (B\&E)",
507
- "N2": r"N2: N1 $\times$ ref. $\times$ masts",
508
- "N3": r"N3: N2 $\times$ filter $\times$ lightguide",
509
- "N4": r"N4: N3 $\times$ q.e.",
510
- "N4x": r"N4x: N1 $\times$ filter $\times$ lightguide $\times$ q.e.",
511
- }
512
-
513
- table_to_plot = Table([self._results[col_now] for col_now in column_titles])
514
-
515
- for column_now, column_title in column_titles.items():
516
- table_to_plot.rename_column(column_now, column_title)
517
-
518
- plot = visualize.plot_table(
519
- table_to_plot,
520
- y_title="Nightsky background light efficiency",
521
- title=f"{self._telescope_model.name} response to nightsky background light",
522
- no_markers=True,
514
+ plot_file = self.output_dir.joinpath(
515
+ self.label + "_" + self.telescope_model.name + "_" + plot_title
523
516
  )
524
-
525
- plot.gca().set_yscale("log")
526
- ylim = plot.gca().get_ylim()
527
- plot.gca().set_ylim(1e-3, ylim[1])
528
-
529
- return plot
517
+ for f in ["pdf", "png"]:
518
+ fig.savefig(str(plot_file) + "." + f, format=f, bbox_inches="tight")
519
+ self._logger.info(f"Plotted {plot_title} efficiency in {plot_file}")
520
+ fig.clf()