Source code for species.core.species_init

"""
Module for setting up species in the working folder.
"""

import json
import os
import socket
import urllib.request

from configparser import ConfigParser
from importlib.util import find_spec
from typeguard import typechecked

import h5py
import species


[docs] class SpeciesInit: """ Class for initiating species by creating the database and configuration file in case they are not present in the working folder, and creating the data folder for storage of input data. """ @typechecked def __init__(self) -> None: """ Returns ------- NoneType None """ species_version = species.__version__ species_msg = f"species v{species_version}" print(len(species_msg) * "=") print(species_msg) print(len(species_msg) * "=") try: pypi_url = "https://pypi.org/pypi/species/json" with urllib.request.urlopen(pypi_url, timeout=1.0) as open_url: url_content = open_url.read() url_data = json.loads(url_content) latest_version = url_data["info"]["version"] except (urllib.error.URLError, socket.timeout): latest_version = None if latest_version is not None and species_version != latest_version: print(f"\n -> A new version ({latest_version}) is available!") print(" -> It is recommended to update to the latest version") print(" -> See https://github.com/tomasstolker/species for details") working_folder = os.path.abspath(os.getcwd()) print(f"\nWorking folder: {working_folder}") config_file = os.path.join(working_folder, "species_config.ini") if os.path.isfile(config_file): print(f"\nConfiguration file: {config_file}") else: print("\nCreating species_config.ini...", end="", flush=True) with open(config_file, "w", encoding="utf-8") as file_obj: file_obj.write("[species]\n\n") file_obj.write("; File with the HDF5 database\n") file_obj.write("database = species_database.hdf5\n\n") file_obj.write("; Folder where data will be downloaded\n") file_obj.write("data_folder = ./data/\n\n") file_obj.write("; Magnitude of Vega for all filters\n") file_obj.write("vega_mag = 0.03\n") print(" [DONE]") config = ConfigParser() config.read(config_file) if "database" in config["species"]: database_file = os.path.abspath(config["species"]["database"]) else: database_file = "species_database.hdf5" with open(config_file, "a", encoding="utf-8") as file_obj: file_obj.write("\n; File with the HDF5 database\n") file_obj.write("database = species_database.hdf5\n") if "data_folder" in config["species"]: data_folder = os.path.abspath(config["species"]["data_folder"]) else: data_folder = "./data/" with open(config_file, "a", encoding="utf-8") as file_obj: file_obj.write("\n; Folder where data will be downloaded\n") file_obj.write("data_folder = ./data/\n") if "vega_mag" in config["species"]: vega_mag = config["species"]["vega_mag"] else: vega_mag = 0.03 with open(config_file, "a", encoding="utf-8") as file_obj: file_obj.write("\n; Magnitude of Vega for all filters\n") file_obj.write("vega_mag = 0.03\n") if os.path.isfile(database_file): print(f"Database file: {database_file}") else: print("Creating species_database.hdf5...", end="", flush=True) h5_file = h5py.File(database_file, "w") h5_file.close() print(" [DONE]") if os.path.exists(data_folder): print(f"Data folder: {data_folder}") else: print("Creating data folder...", end="", flush=True) os.makedirs(data_folder) print(" [DONE]") print("\nConfiguration settings:") print(f" - Database: {database_file}") print(f" - Data folder: {data_folder}") print(f" - Magnitude of Vega: {vega_mag}") if find_spec("mpi4py") is None: print("\nMultiprocessing: mpi4py not installed") else: from mpi4py import MPI # Rank of this process in a communicator mpi_rank = MPI.COMM_WORLD.Get_rank() # Number of processes in a communicator mpi_size = MPI.COMM_WORLD.Get_size() print("\nMultiprocessing: mpi4py installed") print(f"Process number {mpi_rank+1:d} out of {mpi_size:d}...")