#!/usr/bin/env python3
# -*-coding:utf-8 -*
import os.path as osp
import os
import argparse
from glob import glob
import sys
from urllib import request
# from ecpi.database.interact_caldb import CaldbIo
from ecpi.common import add_path_caldb_eclairs, get_caldb_dir
# TODO: review after simu refactoring
from ecpi.extras.simu.create_bkg_file import create_cxb_shape_based_file
from ecpi.extras.simu.create_bkg_nonuniformity_correction_files import create_nonuniformity_file, create_efficiency_file
URL_DOWNLOAD = 'https://apc.u-paris.fr/Downloads/comput/ECLAIRs/data'
[docs]def dir_path(path):
if os.path.isdir(path):
return path
else:
raise argparse.ArgumentTypeError(f"readable_dir:{path} is not a valid path")
[docs]def add_args():
"""Retrieve command line options."""
parser = argparse.ArgumentParser(
add_help=True,
usage="caldb_init [options]",
description="""Downloads CalDB files into ECPI_ROOT directory.
""",
)
parser.add_argument(
"--simulation",
"-s",
action="store_true",
required=False,
help="Uses simulated files instead of connecting to CalDB"
)
parser.add_argument(
"--caldb_dir",
"-c",
# action="store_true",
required=False,
type=dir_path,
help="Alternative directory to download calibration files "
"This argument must be used in the parameters file in "
"[general]"
"caldb_dir="
)
return parser.parse_args()
[docs]def get_default_caldb_files():
"""Download and/or create needed files in caldb directory
"""
rmf_filename = "ECL-RSP-RMF_2021-10-13_10:36:00.fits"
if not osp.isfile(add_path_caldb_eclairs(rmf_filename)):
request.urlretrieve(osp.join(URL_DOWNLOAD, rmf_filename), add_path_caldb_eclairs(rmf_filename))
print(f"Successfully downloaded the file {rmf_filename}")
arf_filename = "ECL-RSP-ARF_2021-10-12_13:13:00.fits"
if not osp.isfile(add_path_caldb_eclairs(arf_filename)):
request.urlretrieve(osp.join(URL_DOWNLOAD, arf_filename), add_path_caldb_eclairs(arf_filename))
print(f"Successfully downloaded the file {arf_filename}")
efficiency_filename = add_path_caldb_eclairs("efficiency_matrix.fits")
if not osp.isfile(efficiency_filename):
create_efficiency_file(efficiency_filename)
print(f"Successfully created the file {efficiency_filename}")
nonunif_filename = add_path_caldb_eclairs("non_uniformity_matrix.fits")
if not osp.isfile(nonunif_filename):
create_nonuniformity_file(nonunif_filename)
print(f"Successfully created the file {nonunif_filename}")
cxb_filename = add_path_caldb_eclairs("ECL-CXB-BKG_model_per_channel_1s.fits")
if not osp.isfile(cxb_filename):
create_cxb_shape_based_file(cxb_filename)
print(f"Successfully created the file {cxb_filename}")
return True
[docs]def get_last_caldb_files(caldb_dir):
"""Download and/or create needed files in caldb directory
"""
# TODO: Remove when the real CalDB files be available
efficiency_filename = osp.join(caldb_dir, "efficiency_matrix.fits")
if not osp.isfile(efficiency_filename):
create_efficiency_file(efficiency_filename)
print(f"Successfully created the file {efficiency_filename}")
# TODO: Remove when the real CalDB files be available
nonunif_filename = osp.join(caldb_dir, "non_uniformity_matrix.fits")
if not osp.isfile(nonunif_filename):
create_nonuniformity_file(nonunif_filename)
print(f"Successfully created the file {nonunif_filename}")
# We recover the list of files in caldb_dir (if any)
from ecpi.database.interact_caldb import CaldbIo, caldb_files
m_list = glob(osp.join(caldb_dir, "ECL*.fits"))
print(f'Already in place files: {m_list}')
caldb = CaldbIo(use_tokens=True)
dl_files = caldb.save_caldb_last_fits_files(caldb_dir)
print(f'Downloaded files: {dl_files}')
# TODO: Find a robust way to change files
if len(dl_files) == len(caldb_files.keys()):
for file in m_list:
if file in dl_files:
continue
print(f'Removing file: {osp.join(caldb_dir, file)}')
os.remove(osp.join(caldb_dir, file))
return True
# main function for an entry-point must be without argument
# arguments must be added with the add_args function
[docs]def main():
args = add_args()
caldb_dir = get_caldb_dir()
if args.simulation:
if args.caldb_dir:
print(f'--> Error: simulating calibration files is not compatible with --caldb_dir!')
sys.exit(1)
print(f'--> Simulating CalDB files into {get_caldb_dir()}!')
if not get_default_caldb_files():
print(f'--> Error: simulating calibration files!')
sys.exit(1)
sys.exit(0)
if args.caldb_dir:
if not osp.isdir(args.caldb_dir):
print(f'--> Error: Directory {args.caldb_dir} does not exist!')
sys.exit(1)
caldb_dir = args.caldb_dir
rel_env = True
for env_var in ['KC_CLIENT_ID', 'KC_USERNAME', 'KC_PASSWORD']:
if env_var not in os.environ:
print(f'Error: no [{env_var}] variable in environment. Please, set your KC config!')
rel_env = False
if not rel_env:
sys.exit(1)
print('Downloading last version of calibration files from https://fsc.svom.org/caldb !')
if not get_last_caldb_files(caldb_dir):
print(f'--> Error: downloading calibration files!')
sys.exit(1)
sys.exit(0)
if __name__ == '__main__':
main()