gammasimtools 0.22.0__py3-none-any.whl → 0.24.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/METADATA +2 -1
  2. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/RECORD +128 -125
  3. simtools/_version.py +2 -2
  4. simtools/application_control.py +118 -0
  5. simtools/applications/calculate_incident_angles.py +17 -22
  6. simtools/applications/convert_all_model_parameters_from_simtel.py +28 -43
  7. simtools/applications/convert_geo_coordinates_of_array_elements.py +26 -45
  8. simtools/applications/convert_model_parameter_from_simtel.py +21 -41
  9. simtools/applications/db_add_file_to_db.py +13 -14
  10. simtools/applications/db_add_simulation_model_from_repository_to_db.py +20 -33
  11. simtools/applications/db_add_value_from_json_to_db.py +29 -24
  12. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +20 -35
  13. simtools/applications/db_generate_compound_indexes.py +11 -13
  14. simtools/applications/db_get_array_layouts_from_db.py +20 -40
  15. simtools/applications/db_get_file_from_db.py +15 -17
  16. simtools/applications/db_get_parameter_from_db.py +33 -35
  17. simtools/applications/db_inspect_databases.py +13 -12
  18. simtools/applications/db_upload_model_repository.py +13 -31
  19. simtools/applications/derive_ctao_array_layouts.py +16 -21
  20. simtools/applications/derive_mirror_rnda.py +9 -14
  21. simtools/applications/derive_photon_electron_spectrum.py +7 -10
  22. simtools/applications/derive_psf_parameters.py +13 -20
  23. simtools/applications/derive_trigger_rates.py +6 -9
  24. simtools/applications/docs_produce_array_element_report.py +22 -23
  25. simtools/applications/docs_produce_calibration_reports.py +26 -24
  26. simtools/applications/docs_produce_model_parameter_reports.py +15 -22
  27. simtools/applications/docs_produce_simulation_configuration_report.py +21 -22
  28. simtools/applications/generate_array_config.py +14 -33
  29. simtools/applications/generate_corsika_histograms.py +22 -43
  30. simtools/applications/generate_default_metadata.py +15 -36
  31. simtools/applications/generate_regular_arrays.py +11 -15
  32. simtools/applications/generate_simtel_event_data.py +23 -33
  33. simtools/applications/maintain_simulation_model_add_production.py +20 -37
  34. simtools/applications/maintain_simulation_model_compare_productions.py +10 -12
  35. simtools/applications/maintain_simulation_model_verify_production_tables.py +8 -11
  36. simtools/applications/merge_tables.py +14 -23
  37. simtools/applications/plot_array_layout.py +77 -54
  38. simtools/applications/plot_simtel_events.py +11 -13
  39. simtools/applications/plot_tabular_data.py +17 -38
  40. simtools/applications/plot_tabular_data_for_model_parameter.py +16 -23
  41. simtools/applications/print_version.py +14 -42
  42. simtools/applications/production_derive_corsika_limits.py +5 -9
  43. simtools/applications/production_derive_statistics.py +12 -25
  44. simtools/applications/production_generate_grid.py +20 -48
  45. simtools/applications/production_merge_corsika_limits.py +17 -21
  46. simtools/applications/run_application.py +12 -32
  47. simtools/applications/simulate_flasher.py +21 -25
  48. simtools/applications/simulate_illuminator.py +7 -14
  49. simtools/applications/simulate_pedestals.py +13 -13
  50. simtools/applications/simulate_prod.py +21 -33
  51. simtools/applications/simulate_prod_htcondor_generator.py +11 -25
  52. simtools/applications/submit_array_layouts.py +16 -19
  53. simtools/applications/submit_data_from_external.py +18 -34
  54. simtools/applications/submit_model_parameter_from_external.py +27 -40
  55. simtools/applications/validate_camera_efficiency.py +23 -21
  56. simtools/applications/validate_camera_fov.py +21 -26
  57. simtools/applications/validate_cumulative_psf.py +27 -35
  58. simtools/applications/validate_file_using_schema.py +15 -33
  59. simtools/applications/validate_optics.py +27 -33
  60. simtools/camera/camera_efficiency.py +0 -2
  61. simtools/configuration/commandline_parser.py +39 -13
  62. simtools/configuration/configurator.py +1 -6
  63. simtools/corsika/corsika_config.py +2 -9
  64. simtools/data_model/data_reader.py +0 -2
  65. simtools/data_model/metadata_collector.py +0 -2
  66. simtools/data_model/model_data_writer.py +1 -3
  67. simtools/data_model/schema.py +36 -34
  68. simtools/data_model/validate_data.py +0 -2
  69. simtools/db/db_handler.py +61 -296
  70. simtools/db/db_model_upload.py +1 -1
  71. simtools/db/mongo_db.py +535 -0
  72. simtools/dependencies.py +33 -8
  73. simtools/io/hdf5_handler.py +0 -5
  74. simtools/io/legacy_data_handler.py +0 -5
  75. simtools/job_execution/job_manager.py +0 -3
  76. simtools/layout/array_layout.py +7 -9
  77. simtools/layout/array_layout_utils.py +3 -3
  78. simtools/layout/telescope_position.py +0 -2
  79. simtools/model/array_model.py +38 -71
  80. simtools/model/calibration_model.py +12 -11
  81. simtools/model/camera.py +0 -2
  82. simtools/model/mirrors.py +0 -2
  83. simtools/model/model_parameter.py +200 -140
  84. simtools/model/model_repository.py +159 -35
  85. simtools/model/model_utils.py +3 -8
  86. simtools/model/site_model.py +59 -29
  87. simtools/model/telescope_model.py +21 -15
  88. simtools/production_configuration/calculate_statistical_uncertainties_grid_point.py +0 -2
  89. simtools/production_configuration/derive_production_statistics.py +0 -2
  90. simtools/production_configuration/interpolation_handler.py +0 -2
  91. simtools/ray_tracing/mirror_panel_psf.py +4 -4
  92. simtools/ray_tracing/psf_analysis.py +0 -2
  93. simtools/ray_tracing/psf_parameter_optimisation.py +1 -1
  94. simtools/ray_tracing/ray_tracing.py +0 -2
  95. simtools/reporting/docs_auto_report_generator.py +109 -1
  96. simtools/reporting/docs_read_parameters.py +4 -9
  97. simtools/runners/corsika_runner.py +0 -2
  98. simtools/runners/corsika_simtel_runner.py +0 -2
  99. simtools/runners/simtel_runner.py +0 -2
  100. simtools/schemas/model_parameters/transit_time_random.schema.yml +29 -0
  101. simtools/schemas/simulation_models_info.schema.yml +2 -1
  102. simtools/simtel/simtel_config_reader.py +0 -2
  103. simtools/simtel/simtel_config_writer.py +128 -33
  104. simtools/simtel/simtel_io_metadata.py +3 -3
  105. simtools/simtel/simulator_array.py +9 -21
  106. simtools/simtel/simulator_camera_efficiency.py +0 -2
  107. simtools/simtel/simulator_light_emission.py +1 -3
  108. simtools/simtel/simulator_ray_tracing.py +0 -2
  109. simtools/simulator.py +2 -6
  110. simtools/testing/assertions.py +52 -8
  111. simtools/testing/configuration.py +17 -4
  112. simtools/testing/validate_output.py +4 -8
  113. simtools/utils/general.py +5 -13
  114. simtools/utils/geometry.py +0 -5
  115. simtools/utils/names.py +1 -13
  116. simtools/utils/value_conversion.py +10 -5
  117. simtools/version.py +85 -0
  118. simtools/visualization/plot_array_layout.py +129 -23
  119. simtools/visualization/plot_incident_angles.py +0 -2
  120. simtools/visualization/plot_pixels.py +1 -1
  121. simtools/visualization/plot_psf.py +1 -1
  122. simtools/visualization/plot_simtel_events.py +0 -11
  123. simtools/visualization/plot_tables.py +1 -1
  124. simtools/visualization/visualize.py +0 -12
  125. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/WHEEL +0 -0
  126. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/entry_points.txt +0 -0
  127. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/licenses/LICENSE +0 -0
  128. {gammasimtools-0.22.0.dist-info → gammasimtools-0.24.0.dist-info}/top_level.txt +0 -0
@@ -56,18 +56,17 @@ telescope (str, optional)
56
56
  Telescope name (required for full simulation mode).
57
57
  """
58
58
 
59
- import logging
60
- from pathlib import Path
61
-
62
- import simtools.utils.general as gen
59
+ from simtools.application_control import get_application_label, startup_application
63
60
  from simtools.configuration import configurator
64
61
  from simtools.simtel.simulator_light_emission import SimulatorLightEmission
65
62
  from simtools.simulator import Simulator
66
63
 
67
64
 
68
- def _parse(label):
65
+ def _parse():
69
66
  """Parse command line configuration."""
70
- config = configurator.Configurator(label=label, description="Simulate flasher devices.")
67
+ config = configurator.Configurator(
68
+ label=get_application_label(__file__), description="Simulate flasher devices."
69
+ )
71
70
  config.parser.add_argument(
72
71
  "--run_mode",
73
72
  help="Flasher simulation run mode",
@@ -108,35 +107,32 @@ def _parse(label):
108
107
 
109
108
  def main():
110
109
  """Simulate flasher devices."""
111
- label = Path(__file__).stem
112
-
113
- args_dict, db_config = _parse(label)
114
- logger = logging.getLogger()
115
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
110
+ app_context = startup_application(_parse)
116
111
 
117
- logger.info(
118
- f"Flasher simulation for telescope {args_dict['telescope']} "
119
- f" with light source {args_dict['light_source']} "
120
- f" ({args_dict['number_of_events']} events, run mode: {args_dict['run_mode']})"
112
+ app_context.logger.info(
113
+ f"Flasher simulation for telescope {app_context.args['telescope']} "
114
+ f" with light source {app_context.args['light_source']} "
115
+ f" ({app_context.args['number_of_events']} events, "
116
+ f"run mode: {app_context.args['run_mode']})"
121
117
  )
122
118
 
123
- if args_dict["run_mode"] == "full_simulation":
119
+ if app_context.args["run_mode"] == "full_simulation":
124
120
  light_source = SimulatorLightEmission(
125
- light_emission_config=args_dict,
126
- db_config=db_config,
127
- label=args_dict.get("label"),
121
+ light_emission_config=app_context.args,
122
+ db_config=app_context.db_config,
123
+ label=app_context.args.get("label"),
128
124
  )
129
- elif args_dict["run_mode"] == "direct_injection":
125
+ elif app_context.args["run_mode"] == "direct_injection":
130
126
  light_source = Simulator(
131
- args_dict=args_dict,
132
- db_config=db_config,
133
- label=args_dict.get("label"),
127
+ args_dict=app_context.args,
128
+ db_config=app_context.db_config,
129
+ label=app_context.args.get("label"),
134
130
  )
135
131
  else:
136
- raise ValueError(f"Unsupported run_mode: {args_dict['run_mode']}")
132
+ raise ValueError(f"Unsupported run_mode: {app_context.args['run_mode']}")
137
133
 
138
134
  light_source.simulate()
139
- logger.info("Flasher simulation completed.")
135
+ app_context.logger.info("Flasher simulation completed.")
140
136
 
141
137
 
142
138
  if __name__ == "__main__":
@@ -53,18 +53,15 @@ output_prefix (str, optional)
53
53
  Prefix for output files (default: empty).
54
54
  """
55
55
 
56
- import logging
57
- from pathlib import Path
58
-
59
- import simtools.utils.general as gen
56
+ from simtools.application_control import get_application_label, startup_application
60
57
  from simtools.configuration import configurator
61
58
  from simtools.simtel.simulator_light_emission import SimulatorLightEmission
62
59
 
63
60
 
64
- def _parse(label):
61
+ def _parse():
65
62
  """Parse command line configuration."""
66
63
  config = configurator.Configurator(
67
- label=label,
64
+ label=get_application_label(__file__),
68
65
  description=(
69
66
  "Simulate light emission by a calibration light source (not attached to a telescope)."
70
67
  ),
@@ -119,16 +116,12 @@ def _parse(label):
119
116
 
120
117
  def main():
121
118
  """Simulate light emission from illuminator."""
122
- label = Path(__file__).stem
123
-
124
- args_dict, db_config = _parse(label)
125
- logger = logging.getLogger()
126
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
119
+ app_context = startup_application(_parse)
127
120
 
128
121
  light_source = SimulatorLightEmission(
129
- light_emission_config=args_dict,
130
- db_config=db_config,
131
- label=label,
122
+ light_emission_config=app_context.args,
123
+ db_config=app_context.db_config,
124
+ label=app_context.args.get("label"),
132
125
  )
133
126
  light_source.simulate()
134
127
 
@@ -54,17 +54,16 @@ azimuth_angle (float, optional)
54
54
  Azimuth angle in degrees.
55
55
  """
56
56
 
57
- import logging
58
- from pathlib import Path
59
-
60
- import simtools.utils.general as gen
57
+ from simtools.application_control import get_application_label, startup_application
61
58
  from simtools.configuration import configurator
62
59
  from simtools.simulator import Simulator
63
60
 
64
61
 
65
- def _parse(label):
62
+ def _parse():
66
63
  """Parse command line configuration."""
67
- config = configurator.Configurator(label=label, description="Simulate calibration events.")
64
+ config = configurator.Configurator(
65
+ label=get_application_label(__file__), description="Simulate calibration events."
66
+ )
68
67
  config.parser.add_argument(
69
68
  "--run_mode",
70
69
  help="Calibration run mode",
@@ -105,14 +104,15 @@ def _parse(label):
105
104
  )
106
105
 
107
106
 
108
- def main(): # noqa: D103
109
- label = Path(__file__).stem
110
- args_dict, db_config = _parse(label)
107
+ def main():
108
+ """Simulate pedestal events."""
109
+ app_context = startup_application(_parse)
111
110
 
112
- logger = logging.getLogger()
113
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
114
-
115
- simulator = Simulator(label=args_dict.get("label"), args_dict=args_dict, db_config=db_config)
111
+ simulator = Simulator(
112
+ label=app_context.args.get("label"),
113
+ args_dict=app_context.args,
114
+ db_config=app_context.db_config,
115
+ )
116
116
  simulator.simulate()
117
117
 
118
118
 
@@ -67,29 +67,14 @@ r"""
67
67
  will be written to data_directory/label/simtel-data.
68
68
  """
69
69
 
70
- import logging
71
-
72
- import simtools.utils.general as gen
70
+ from simtools.application_control import startup_application
73
71
  from simtools.configuration import configurator
74
72
  from simtools.simulator import Simulator
75
73
 
76
74
 
77
- def _parse(description=None):
78
- """
79
- Parse command line configuration.
80
-
81
- Parameters
82
- ----------
83
- description: str
84
- Application description.
85
-
86
- Returns
87
- -------
88
- CommandLineParser
89
- Command line parser object.
90
-
91
- """
92
- config = configurator.Configurator(description=description)
75
+ def _parse():
76
+ """Parse command line configuration."""
77
+ config = configurator.Configurator(description="Run simulations for productions")
93
78
  config.parser.add_argument(
94
79
  "--data_directory",
95
80
  help=(
@@ -152,27 +137,30 @@ def _parse(description=None):
152
137
  )
153
138
 
154
139
 
155
- def main(): # noqa: D103
156
- args_dict, db_config = _parse(description="Run simulations for productions")
157
-
158
- logger = logging.getLogger()
159
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
140
+ def main():
141
+ """Run simulations for productions."""
142
+ app_context = startup_application(_parse, setup_io_handler=False)
160
143
 
161
- simulator = Simulator(label=args_dict.get("label"), args_dict=args_dict, db_config=db_config)
144
+ simulator = Simulator(
145
+ label=app_context.args.get("label"),
146
+ args_dict=app_context.args,
147
+ db_config=app_context.db_config,
148
+ )
162
149
 
163
150
  simulator.simulate()
164
151
  simulator.validate_metadata()
165
152
 
166
- logger.info(
167
- f"Production run complete for primary {args_dict['primary']} showers "
168
- f"from {args_dict['azimuth_angle']} azimuth and {args_dict['zenith_angle']} zenith "
169
- f"at {args_dict['site']} site, using {args_dict['model_version']} model."
153
+ app_context.logger.info(
154
+ f"Production run complete for primary {app_context.args['primary']} showers "
155
+ f"from {app_context.args['azimuth_angle']} azimuth and "
156
+ f"{app_context.args['zenith_angle']} zenith "
157
+ f"at {app_context.args['site']} site, using {app_context.args['model_version']} model."
170
158
  )
171
- if args_dict["save_reduced_event_lists"]:
159
+ if app_context.args["save_reduced_event_lists"]:
172
160
  simulator.save_reduced_event_lists()
173
- if args_dict.get("pack_for_grid_register"):
174
- simulator.pack_for_register(args_dict["pack_for_grid_register"])
175
- if args_dict["save_file_lists"]:
161
+ if app_context.args.get("pack_for_grid_register"):
162
+ simulator.pack_for_register(app_context.args["pack_for_grid_register"])
163
+ if app_context.args["save_file_lists"]:
176
164
  simulator.save_file_lists()
177
165
 
178
166
 
@@ -45,29 +45,17 @@ priority (int, optional)
45
45
 
46
46
  """
47
47
 
48
- import logging
49
-
50
- import simtools.utils.general as gen
48
+ from simtools.application_control import get_application_label, startup_application
51
49
  from simtools.configuration import configurator
52
50
  from simtools.job_execution import htcondor_script_generator
53
51
 
54
52
 
55
- def _parse(description=None):
56
- """
57
- Parse command line configuration.
58
-
59
- Parameters
60
- ----------
61
- description: str
62
- Application description.
63
-
64
- Returns
65
- -------
66
- CommandLineParser
67
- Command line parser object.
68
-
69
- """
70
- config = configurator.Configurator(description=description)
53
+ def _parse():
54
+ """Parse command line configuration."""
55
+ config = configurator.Configurator(
56
+ label=get_application_label(__file__),
57
+ description="Prepare simulations production for HT Condor job submission",
58
+ )
71
59
  config.parser.add_argument(
72
60
  "--apptainer_image",
73
61
  help="Apptainer image to use for the simulation (full path).",
@@ -88,13 +76,11 @@ def _parse(description=None):
88
76
  )
89
77
 
90
78
 
91
- def main(): # noqa: D103
92
- args_dict, _ = _parse(description="Prepare simulations production for HT Condor job submission")
93
-
94
- logger = logging.getLogger()
95
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
79
+ def main():
80
+ """Generate HT Condor submission script and submit file."""
81
+ app_context = startup_application(_parse)
96
82
 
97
- htcondor_script_generator.generate_submission_script(args_dict)
83
+ htcondor_script_generator.generate_submission_script(app_context.args)
98
84
 
99
85
 
100
86
  if __name__ == "__main__":
@@ -32,19 +32,19 @@ r"""
32
32
 
33
33
  """
34
34
 
35
- import logging
36
- from pathlib import Path
37
-
38
- import simtools.utils.general as gen
35
+ from simtools.application_control import get_application_label, startup_application
39
36
  from simtools.configuration import configurator
40
37
  from simtools.db import db_handler
41
38
  from simtools.io import ascii_handler
42
39
  from simtools.layout.array_layout_utils import validate_array_layouts_with_db, write_array_layouts
43
40
 
44
41
 
45
- def _parse(label, description):
42
+ def _parse():
46
43
  """Parse command line configuration."""
47
- config = configurator.Configurator(label=label, description=description)
44
+ config = configurator.Configurator(
45
+ label=get_application_label(__file__),
46
+ description="Submit and validate array layouts.",
47
+ )
48
48
 
49
49
  config.parser.add_argument(
50
50
  "--array_layouts",
@@ -69,25 +69,22 @@ def _parse(label, description):
69
69
  return config.initialize(output=True, db_config=True, simulation_model=["model_version"])
70
70
 
71
71
 
72
- def main(): # noqa: D103
73
- args_dict, db_config = _parse(
74
- label=Path(__file__).stem,
75
- description="Submit and validate array layouts.",
76
- )
77
-
78
- logger = logging.getLogger()
79
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
72
+ def main():
73
+ """Submit and validate array layouts."""
74
+ app_context = startup_application(_parse)
80
75
 
81
- db = db_handler.DatabaseHandler(mongo_db_config=db_config)
76
+ db = db_handler.DatabaseHandler(db_config=app_context.db_config)
82
77
 
83
78
  array_layouts = validate_array_layouts_with_db(
84
- production_table=db.read_production_table_from_mongo_db(
85
- collection_name="telescopes", model_version=args_dict["model_version"]
79
+ production_table=db.read_production_table_from_db(
80
+ collection_name="telescopes", model_version=app_context.args["model_version"]
86
81
  ),
87
- array_layouts=ascii_handler.collect_data_from_file(args_dict["array_layouts"]),
82
+ array_layouts=ascii_handler.collect_data_from_file(app_context.args["array_layouts"]),
88
83
  )
89
84
 
90
- write_array_layouts(array_layouts=array_layouts, args_dict=args_dict, db_config=db_config)
85
+ write_array_layouts(
86
+ array_layouts=array_layouts, args_dict=app_context.args, db_config=app_context.db_config
87
+ )
91
88
 
92
89
 
93
90
  if __name__ == "__main__":
@@ -36,34 +36,19 @@ r"""
36
36
 
37
37
  """
38
38
 
39
- import logging
40
- from pathlib import Path
41
-
42
39
  import simtools.data_model.model_data_writer as writer
43
- import simtools.utils.general as gen
40
+ from simtools.application_control import get_application_label, startup_application
44
41
  from simtools.configuration import configurator
45
42
  from simtools.data_model import validate_data
46
43
  from simtools.data_model.metadata_collector import MetadataCollector
47
44
 
48
45
 
49
- def _parse(label, description):
50
- """
51
- Parse command line configuration.
52
-
53
- Parameters
54
- ----------
55
- label: str
56
- Label describing application.
57
- description: str
58
- Description of application.
59
-
60
- Returns
61
- -------
62
- CommandLineParser
63
- Command line parser object
64
-
65
- """
66
- config = configurator.Configurator(label=label, description=description)
46
+ def _parse():
47
+ """Parse command line configuration."""
48
+ config = configurator.Configurator(
49
+ label=get_application_label(__file__),
50
+ description="Submit and validate data (e.g., input data to tools, model parameters).",
51
+ )
67
52
 
68
53
  config.parser.add_argument(
69
54
  "--input_meta",
@@ -92,26 +77,25 @@ def _parse(label, description):
92
77
  return config.initialize(output=True)
93
78
 
94
79
 
95
- def main(): # noqa: D103
96
- args_dict, _ = _parse(
97
- label=Path(__file__).stem,
98
- description="Submit and validate data (e.g., input data to tools, model parameters).",
99
- )
80
+ def main():
81
+ """Submit and validate data (e.g., input data to tools, model parameters)."""
82
+ app_context = startup_application(_parse)
100
83
 
101
- logger = logging.getLogger()
102
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
103
-
104
- _metadata = None if args_dict.get("ignore_metadata") else MetadataCollector(args_dict)
84
+ _metadata = (
85
+ None if app_context.args.get("ignore_metadata") else MetadataCollector(app_context.args)
86
+ )
105
87
 
106
88
  data_validator = validate_data.DataValidator(
107
89
  schema_file=(
108
- _metadata.get_data_model_schema_file_name() if _metadata else args_dict.get("schema")
90
+ _metadata.get_data_model_schema_file_name()
91
+ if _metadata
92
+ else app_context.args.get("schema")
109
93
  ),
110
- data_file=args_dict["input"],
94
+ data_file=app_context.args["input"],
111
95
  )
112
96
 
113
97
  writer.ModelDataWriter.dump(
114
- args_dict=args_dict,
98
+ args_dict=app_context.args,
115
99
  metadata=_metadata,
116
100
  product_data=data_validator.validate_and_transform(),
117
101
  )
@@ -38,32 +38,19 @@ r"""
38
38
 
39
39
  """
40
40
 
41
- import logging
42
41
  from pathlib import Path
43
42
 
44
43
  import simtools.data_model.model_data_writer as writer
45
- import simtools.utils.general as gen
44
+ from simtools.application_control import get_application_label, startup_application
46
45
  from simtools.configuration import configurator
47
46
 
48
47
 
49
- def _parse(label, description):
50
- """
51
- Parse command line configuration.
52
-
53
- Parameters
54
- ----------
55
- label: str
56
- Label describing application.
57
- description: str
58
- Description of application.
59
-
60
- Returns
61
- -------
62
- CommandLineParser
63
- Command line parser object
64
-
65
- """
66
- config = configurator.Configurator(label=label, description=description)
48
+ def _parse():
49
+ """Parse command line configuration."""
50
+ config = configurator.Configurator(
51
+ label=get_application_label(__file__),
52
+ description="Submit and validate a model parameter.",
53
+ )
67
54
 
68
55
  config.parser.add_argument(
69
56
  "--parameter", type=str, required=True, help="Parameter for simulation model"
@@ -98,30 +85,30 @@ def _parse(label, description):
98
85
  return config.initialize(output=True, db_config=True)
99
86
 
100
87
 
101
- def main(): # noqa: D103
102
- args_dict, db_config = _parse(
103
- label=Path(__file__).stem,
104
- description="Submit and validate a model parameters).",
105
- )
106
-
107
- logger = logging.getLogger()
108
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
88
+ def main():
89
+ """Submit and validate a model parameter value and metadata."""
90
+ app_context = startup_application(_parse)
109
91
 
110
- output_path = (
111
- Path(args_dict["output_path"]) / args_dict["parameter"]
112
- if args_dict.get("output_path")
113
- else None
114
- )
92
+ if app_context.args.get("output_path"):
93
+ output_path = app_context.io_handler.get_output_directory(
94
+ sub_dir=app_context.args.get("parameter")
95
+ )
96
+ else:
97
+ output_path = None
115
98
 
116
99
  writer.ModelDataWriter.dump_model_parameter(
117
- parameter_name=args_dict["parameter"],
118
- value=args_dict["value"],
119
- instrument=args_dict["instrument"],
120
- parameter_version=args_dict["parameter_version"],
121
- output_file=Path(args_dict["parameter"] + "-" + args_dict["parameter_version"] + ".json"),
100
+ parameter_name=app_context.args["parameter"],
101
+ value=app_context.args["value"],
102
+ instrument=app_context.args["instrument"],
103
+ parameter_version=app_context.args["parameter_version"],
104
+ output_file=Path(
105
+ app_context.args["parameter"] + "-" + app_context.args["parameter_version"] + ".json"
106
+ ),
122
107
  output_path=output_path,
123
- metadata_input_dict=args_dict,
124
- db_config=db_config if args_dict.get("check_parameter_version") else None,
108
+ metadata_input_dict=app_context.args,
109
+ db_config=app_context.db_config
110
+ if app_context.args.get("check_parameter_version")
111
+ else None,
125
112
  )
126
113
 
127
114
 
@@ -44,19 +44,18 @@ r"""
44
44
  The output is saved in simtools-output/validate_camera_efficiency.
45
45
  """
46
46
 
47
- import logging
48
47
  from pathlib import Path
49
48
 
50
49
  import simtools.data_model.model_data_writer as writer
51
- import simtools.utils.general as gen
50
+ from simtools.application_control import get_application_label, startup_application
52
51
  from simtools.camera.camera_efficiency import CameraEfficiency
53
52
  from simtools.configuration import configurator
54
53
 
55
54
 
56
- def _parse(label):
55
+ def _parse():
57
56
  """Parse command line configuration."""
58
57
  config = configurator.Configurator(
59
- label=label,
58
+ label=get_application_label(__file__),
60
59
  description=(
61
60
  "Calculate the camera efficiency and NSB pixel rates. "
62
61
  "Plot the camera efficiency vs wavelength for Cherenkov and NSB light."
@@ -91,29 +90,26 @@ def _parse(label):
91
90
  action="store_true",
92
91
  required=False,
93
92
  )
94
- _args_dict, _db_config = config.initialize(
93
+ args_dict, db_config = config.initialize(
95
94
  db_config=True,
96
95
  simulation_model=["telescope", "model_version", "parameter_version"],
97
96
  simulation_configuration={"corsika_configuration": ["zenith_angle", "azimuth_angle"]},
98
97
  )
99
- if _args_dict["site"] is None or _args_dict["telescope"] is None:
98
+ if args_dict["site"] is None or args_dict["telescope"] is None:
100
99
  config.parser.print_help()
101
100
  print("\n\nSite and telescope must be provided\n\n")
102
101
  raise RuntimeError("Site and telescope must be provided")
103
- return _args_dict, _db_config
102
+ return args_dict, db_config
104
103
 
105
104
 
106
- def main(): # noqa: D103
107
- label = Path(__file__).stem
108
- args_dict, db_config = _parse(label)
109
-
110
- logger = logging.getLogger()
111
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
105
+ def main():
106
+ """Calculate the camera efficiency and NSB pixel rates."""
107
+ app_context = startup_application(_parse)
112
108
 
113
109
  ce = CameraEfficiency(
114
- db_config=db_config,
115
- label=args_dict.get("label", label),
116
- config_data=args_dict,
110
+ db_config=app_context.db_config,
111
+ label=app_context.args.get("label"),
112
+ config_data=app_context.args,
117
113
  )
118
114
  ce.simulate()
119
115
  ce.analyze(force=True)
@@ -123,12 +119,18 @@ def main(): # noqa: D103
123
119
  writer.ModelDataWriter.dump_model_parameter(
124
120
  parameter_name="nsb_pixel_rate",
125
121
  value=ce.get_nsb_pixel_rate(
126
- reference_conditions=args_dict.get("write_reference_nsb_rate_as_parameter", False)
122
+ reference_conditions=app_context.args.get(
123
+ "write_reference_nsb_rate_as_parameter", False
124
+ )
125
+ ),
126
+ instrument=app_context.args["telescope"],
127
+ parameter_version=app_context.args.get("parameter_version", "0.0.0"),
128
+ output_file=Path(
129
+ f"nsb_pixel_rate-{app_context.args.get('parameter_version', '0.0.0')}.json"
127
130
  ),
128
- instrument=args_dict["telescope"],
129
- parameter_version=args_dict.get("parameter_version", "0.0.0"),
130
- output_file=Path(f"nsb_pixel_rate-{args_dict.get('parameter_version', '0.0.0')}.json"),
131
- output_path=Path(args_dict["output_path"]) / args_dict["telescope"] / "nsb_pixel_rate",
131
+ output_path=app_context.io_handler.get_output_directory()
132
+ / app_context.args["telescope"]
133
+ / "nsb_pixel_rate",
132
134
  )
133
135
 
134
136