Skip to content

Commit

Permalink
Merge pull request #975 from gammasim/sonarqube-reduce-complexity
Browse files Browse the repository at this point in the history
refactor complex functions
  • Loading branch information
tobiaskleiner committed Jun 18, 2024
2 parents b2d7447 + 4f98d81 commit ef6979c
Show file tree
Hide file tree
Showing 18 changed files with 1,325 additions and 677 deletions.
88 changes: 65 additions & 23 deletions simtools/applications/db_add_file_to_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,47 +50,60 @@
from simtools.db import db_handler


def main():
_db_tmp = db_handler.DatabaseHandler(mongo_db_config=None)
def _parse():

config = configurator.Configurator(
description="Add file to the DB.",
usage="simtools-add-file-to-db --file_name test_application.dat --db test-data",
)

group = config.parser.add_mutually_exclusive_group(required=True)
group.add_argument(
"--file_name",
help=(
"The file name to upload. "
"A list of files is also allowed, in which case only one -f is necessary, "
"i.e., python applications/db_add_file_to_db.py --file_name file_1.dat file_2.dat "
"file_3.dat. If no path is given, the file is assumed to be in the CWD."
),
help=("The file name to upload. A list of files is also allowed."),
type=str,
nargs="+",
)
group.add_argument(
"--input_path",
help=(
"A directory with files to upload to the DB. "
"All files in the directory with the following extensions "
f"will be uploaded: {', '.join(_db_tmp.ALLOWED_FILE_EXTENSIONS)}"
),
help=("A directory with files to upload to the DB."),
type=Path,
)

config.parser.add_argument(
"--db",
type=str,
help=("The database to insert the files to."),
)
args_dict, db_config = config.initialize(paths=False, db_config=True)

logger = logging.getLogger()
logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
return config.initialize(paths=False, db_config=True)

db = db_handler.DatabaseHandler(mongo_db_config=db_config)

def collect_files_to_insert(args_dict, logger, db):
"""
Collect the files to insert into the database based on the provided arguments.
Parameters
----------
args_dict : dict
Dictionary of parsed command-line arguments.
logger : logging.Logger
Logger object for logging messages.
db : DatabaseHandler
Database handler object.
Returns
-------
list
List of files to be inserted into the database.
Raises
------
ValueError
If no valid files are provided for uploading.
"""
files_to_insert = []

if args_dict.get("file_name", None) is not None:
for file_now in args_dict["file_name"]:
if Path(file_now).suffix in db.ALLOWED_FILE_EXTENSIONS:
Expand All @@ -104,22 +117,51 @@ def main():
for ext_now in db.ALLOWED_FILE_EXTENSIONS:
files_to_insert.extend(Path(args_dict["input_path"]).glob(f"*{ext_now}"))

if len(files_to_insert) < 1:
if not files_to_insert:
raise ValueError("No files were provided to upload")
if len(files_to_insert) == 1:
plural = ""
else:
plural = "s"

return files_to_insert


def confirm_and_insert_files(files_to_insert, args_dict, db, logger):
"""
Confirm the files to be inserted and insert them into the database.
Parameters
----------
files_to_insert : list
List of files to be inserted into the database.
args_dict : dict
Dictionary of parsed command-line arguments.
db : DatabaseHandler
Database handler object.
logger : logging.Logger
Logger object for logging messages.
"""
plural = "" if len(files_to_insert) == 1 else "s"

print(f"Should the following file{plural} be inserted to the {args_dict['db']} DB?:\n")
print(*files_to_insert, sep="\n")
print()

if gen.user_confirm():
for file_to_insert_now in files_to_insert:
db.insert_file_to_db(file_to_insert_now, args_dict["db"])
logger.info(f"File {file_to_insert_now} inserted to {args_dict['db']} DB")
else:
logger.info(f"Aborted, did not insert file {plural} to the {args_dict['db']} DB")
logger.info(f"Aborted, did not insert file{plural} to the {args_dict['db']} DB")


def main():
args_dict, db_config = _parse()

logger = logging.getLogger()
logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))

db = db_handler.DatabaseHandler(mongo_db_config=db_config)

files_to_insert = collect_files_to_insert(args_dict, logger, db)
confirm_and_insert_files(files_to_insert, args_dict, db, logger)


if __name__ == "__main__":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def main():
db.update_parameter_field(
db_name=None,
site=site,
version=version_now,
model_version=version_now,
parameter=par_now,
field="units",
new_value=unit_now,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
from simtools.db import db_handler


def main():
def _parse():
config = configurator.Configurator(
description=(
"Mark all non-structure related parameters in the MST-Structure "
Expand All @@ -31,35 +31,99 @@ def main():
"(see reports repo)."
)
)

config.parser.add_argument(
"--sections",
help="Provide a sections.yml file (see reports repo).",
type=str,
required=True,
)
args_dict, db_config = config.initialize(db_config=True, simulation_model="telescope")
return config.initialize(db_config=True, simulation_model="telescope")

logger = logging.getLogger()
logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))

db = db_handler.DatabaseHandler(mongo_db_config=db_config)
def load_non_optic_parameters(sections_file):
"""
Load non-optic parameters from a YAML file.
with open(args_dict["sections"], encoding="utf-8") as stream:
parameter_catogeries = yaml.safe_load(stream)
Parameters
----------
sections_file : str
Path to the sections YAML file.
non_optic_catagories = [
Returns
-------
list
List of non-optic parameters.
"""
with open(sections_file, encoding="utf-8") as stream:
parameter_categories = yaml.safe_load(stream)

non_optic_categories = [
"Readout electronics",
"Trigger",
"Photon conversion",
"Camera",
"Unnecessary",
]

non_optic_parameters = []
for category in non_optic_catagories:
for par_now in parameter_catogeries[category]:
non_optic_parameters.append(par_now)
for category in non_optic_categories:
non_optic_parameters.extend(parameter_categories[category])
return non_optic_parameters


def process_site_version(db, db_config, non_optic_parameters, site, model_version):
"""
Process non-optic parameters for a specific site and version.
Parameters
----------
db : DatabaseHandler
Database handler object.
db_config : dict
Database configuration dictionary.
non_optic_parameters : list
List of non-optic parameters.
site : str
Site name (e.g., "North", "South").
model_version : str
Model version name (e.g., "prod6", "2024-02-01").
"""
for par_now in non_optic_parameters:
db.update_parameter_field(
db_name=db_config["db_simulation_model"],
telescope=f"{site}-MST-Structure-D",
model_version=model_version,
parameter=par_now,
field="Applicable",
new_value=False,
)

pars = db.read_mongo_db(
db_name=db_config["db_simulation_model"],
telescope_model_name=f"{site}-MST-Structure-D",
model_version=model_version,
run_location="",
collection_name="telescope",
write_files=False,
only_applicable=False,
)

for par_now in non_optic_parameters:
if par_now in pars:
assert pars[par_now]["Applicable"] is False


def main():
args_dict, db_config = _parse()

logger = logging.getLogger()
logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))

db = db_handler.DatabaseHandler(mongo_db_config=db_config)
non_optic_parameters = load_non_optic_parameters(args_dict["sections"])

versions = [
model_versions = [
"default",
"2016-12-20",
"prod3_compatible",
Expand All @@ -74,29 +138,9 @@ def main():
"prod4",
]

for version_now in versions:
for model_version in model_versions:
for site in ["North", "South"]:
for par_now in non_optic_parameters:
db.update_parameter_field(
db_name=db_config["db_simulation_model"],
telescope=f"{site}-MST-Structure-D",
version=version_now,
parameter=par_now,
field="Applicable",
new_value=False,
)
pars = db.read_mongo_db(
db_name=db_config["db_simulation_model"],
telescope_model_name=f"{site}-MST-Structure-D",
model_version=version_now,
run_location="",
collection_name="telescope",
write_files=False,
only_applicable=False,
)
for par_now in non_optic_parameters:
if par_now in pars:
assert pars[par_now]["Applicable"] is False
process_site_version(db, db_config, non_optic_parameters, site, model_version)


if __name__ == "__main__":
Expand Down
Loading

0 comments on commit ef6979c

Please sign in to comment.