#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Functions managing the several directory names.
"""
# System modules
import shutil
from pathlib import Path
# Third-party modules
from astropy.io import fits
from astropy.time import Time
# Other templates
from ..config.constants import (DATA_FOLDER, FILE_PREFIX, FITS_EXT,
FITS_FOLDER, FOCUS_EXT, FOCUS_FOLDER, LOG_EXT,
LOG_FOLDER, dateobs, dir_type, frame_number,
imagetyp)
PROJECT_ROOT = Path(__file__).parent.parent.parent
[docs]
def date_folder():
"""Create a date folder string based on astronomical convention
(changes at midday UTC).
"""
now = Time.now()
# If current UTC hour is before midday UTC, the "observing night"
# belongs to the previous calendar date.
if now.datetime.hour < 12:
folder_date_obj = now.datetime.date() - timedelta(days=1)
else:
folder_date_obj = now.datetime.date()
return folder_date_obj.strftime("%Y-%m-%d")
[docs]
def frame_folder(header):
"""
Create a folder depending on the image type in FITS header
"""
frame = header[imagetyp]
if isinstance(frame, int):
folder_name = dir_type[frame]
else:
frame_num_list = [v for k, v in frame_number.items() if k in frame]
if not frame_num_list:
# Fallback if frame type string is not recognized
return "unknown_type"
folder_name = dir_type[frame_num_list[0]]
return folder_name
[docs]
def fits_path(header, dry=False):
"""
Create a fits file path where the file will be stored
"""
root = PROJECT_ROOT / DATA_FOLDER / FITS_FOLDER
date_str = date_folder()
date_path_part = Path(date_str)
frame_path_part = Path(frame_folder(header))
path = root / date_path_part / frame_path_part
if not dry:
path.mkdir(parents=True, exist_ok=True)
return path
[docs]
def log_path(dry=False):
"""
Returns the Path object for the log directory.
Creates it if it doesn't exist (unless dry=True).
"""
path = PROJECT_ROOT / DATA_FOLDER / LOG_FOLDER
if not dry:
path.mkdir(parents=True, exist_ok=True)
# OARPAF.YYYY-MM-DD.foc
outfile = f"{FILE_PREFIX}.{LOG_EXT}"
outpath = path / outfile
return outpath
return outpath
[docs]
def foc_path(timestamp, dry=False):
"""
Create the focus output text file name and its path
"""
path = PROJECT_ROOT / DATA_FOLDER / FOCUS_FOLDER
if not dry:
path.mkdir(parents=True, exist_ok=True)
# OARPAF.YYYY-MM-DD.foc
outfile = f"{FILE_PREFIX}.{timestamp}.{FOCUS_EXT}"
outpath = path / outfile
return outpath
[docs]
def save_filename(infile_path_str):
"""
Save a fits file in its path with an ESO-style filename.
"""
inpath = Path(infile_path_str)
header = fits.getheader(inpath)
# '2021-12-28T20:09:56.163'
date_obs_str = header[dateobs] # DATE-OBS from FITS header
name_for_file = Time(date_obs_str).isot
outfile_name = f"{FILE_PREFIX}.{name_for_file}.{FITS_EXT}"
outfile = Path(outfile_name)
outdir = fits_path(header) # This already creates the directory
outpath = outdir / outfile
shutil.copy2(inpath, outpath)
return str(outpath)