Source code for ecpi.scripts.caldb_init

#!/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()