Универсальный пакет для синтеза изображений srhimages
Программа srhimages предоставляет функции для синтеза радиоизображений из данных Сибирского Радиогелиографа (SRH).
Установка
Код Сергея Анфиногентова работает на python 3.10 до 3.12, код Марии Глобы - только на 3.10! Поэтому желательно устанавливать именно 3.10. Для расчётов на удалённых машинах может быть допустимо установить любую версию питона. При расчётах через Dask желательно так же использовать 3.10.
conda env create -n srhsynth python=3.10
conda activate srhsynth
pip install -U "srhimages[all] @ git+https://git.iszf.irk.ru/fedenev/srhimages"
# или [globa], [anfinogentov] вместо [all], чтобы выбрать только конкретный расчётный код
Если производится свежая установка с использованием расчётного кода Марии Глобы, то требуется обновить данные CASA:
python3 -m casaconfig --update-all
Использование уже установленного окружения на сервере ИСЗФ
conda activate /opt/miniconda3/envs/srhsynth/
Интерфейс командной строки
srhimages create_synth_tasks --help
srhimages run_computation --help
Использование в своих скриптах
import srhimages
help(srhimages.create_synth_tasks)
help(srhimages.run_computation)
Запуск интерфейса в браузере
srhimages-standalone
Описание команд и принципы работы
Расчётные задачи
Программа работает в парадигме так называемых расчётных задач ("tasks"). Каждая из задач представляет собой Python-словарь или его JSON-представление и описывает, из каких данных (сырых файлов и сканов внутри них) должно получиться итоговое изображение, куда оно будет сохранено и с какими параметрами синтезировано.
Актуальная спецификация формата расчётной задачи есть в исходном коде в формате jsonschema. Спецификация API для работы с амплитудно-фазовыми калибровками антенн находится в репозитории badary-services.
Интерфейс программы:
-
server_calibrate(task_list, algorithm, save_to=None, search_window="15min")-
Назначение: Обрабатывает список некалиброванных задач, чтобы назначить им калибровки, предоставленные командой SRH и находящиеся на API-сервере.
-
Аргументы:
-
task_list: Список задач для вычисления или путь к файлу JSON с списком задач. -
algorithm: "globa" или "anfinogentov". -
save_to(необязательно): Путь к файлу JSON для сохранения списка задач. -
search_window(необязательно): Временное окно (-search_window/2, +search_window/2), в котором серверная калибровка считается допустимой для использования. По умолчанию: "15min".
-
-
Возвращает:
-
calibrated_tasks: Список задач с доступным объектом ["gains"] в каждой из них, если соответствующие серверные калибровки были найдены, в противном случае – задачи, которые были переданы изначально.
-
-
-
create_synth_tasks(time1, time2=None, cadence="15min", frequencies="all", resample_from=None, save_to=None, average_width=20, average_unit="scans", average_position="after", average_mode = "visibilities",output_polarizations =output_polarizations="IV", naxis=512, cdelt=4.9, clean_disk=True, compressed=True)True, smooth_gains=False)-
Назначение: Создает список (некалиброванных) задач по синтезу радиоизображений с телескопа.
-
Аргументы:
-
time1(str):НачалоВремя начала наблюдения в формате 'YYYY-MM-DDГГГГ-ММ-ДДHH:MM:SS'ЧЧ:ММ:СС'. -
time2(необязательно)str или None, опционально):КонецВремянаблюденияокончания в том же формате. -
cadence(необязательно)str, опционально):ИнтервалВременнойвремениинтервал между каждым наблюдением в формате "NNmin"NNмин" или "NNs"NNс". Поумолчанию:умолчанию "15min"15мин". -
frequencies(list(int) или str, опционально): Список частот для наблюдения в МГц или "all" в виде строки. -
resample_from (save_toнеобязательно)list или str): Список задач или путь к файлу, содержащему список задач в формате JSON, откуда брать калибровки. Доступные частоты в списке resample должны совпадать с запрошенными пользователем частотами. -
save_to (str, опционально): Путь к json файлу
JSONдля сохранения списка задач. -
average_width(необязательно)int или float, опционально): Количество сканов или секунд для усреднения. Поумолчанию:умолчанию 20. -
average_unit(необязательно)str, опционально):МогутМожет быть"scans"'scans' или"seconds"'seconds'. Поумолчанию:умолчанию 'scans'. -
average_position(необязательно)str, опционально): Временное окно для усреднения. Может быть 'after', 'before' или 'center'. Поумолчанию:умолчанию 'after'. -
average_mode(необязательно)str, опционально): Режим усреднения. Может быть"visibilities"'visibilities',"gridding"'gridding' или"images"'images'. Поумолчанию:умолчанию 'visibilities'.Внимание: поддержка данной опции зависит от расчётного кода! -
output_polarizations(необязательно)str, опционально):МогутМожет быть 'IV' или 'RL'. -
naxis(необязательно)int, опционально): Количество пикселей вдоль каждой оси выходного изображения. Поумолчанию:умолчанию 512. -
cdelt(необязательно)float, опционально): Размер каждого пикселя в угловых секундах. Поумолчанию:умолчанию 4.9 для SRH. -
clean_disk(необязательно)bool, опционально): Флаг для включения/отключениявыключенияCLEANочисткидля"грязного"грязной карты.изображения. Поумолчанию:умолчанию True. -
compressed(необязательно)bool, опционально): Флаг для включения/отключениявыключения сжатия FITS выходного изображения. Поумолчанию:умолчанию True. - smooth_gains (bool, опционально): Предпочтение сплайн-интерполяции калибровок вместо ближайших соседей при передискретизации. Используйте True для калибровок за весь день.
-
-
Возвращает:
- Список задач синтеза (каждая задача – Python dict), например, для отправки на кластер или для локального вычисления.
-
-
run_computation(task_list, algorithm, cache_dir="./images/raw/", out_dir="./images/out/", ftp_server="ftp.rao.istp.ac.ru", n_threads=5, calibrate="prefer_server", calibrated_save_to=None, calibrations_search_window="15min", skip_clean=False, input_dir = None, cluster_object="local")-
Назначение: Синтезирует изображения из переданного списка задач (не важно, калиброванного или нет).
-
Аргументы:
-
task_list: Список задач для вычисления или путь к файлу JSON с списком задач. -
algorithm: "globa" or "anfinogentov". -
cache_dir(необязательно): Директория для хранения сырых FITS-файлов с видностями SRH, которые будут загружаться с сервера. -
out_dir(необязательно): Директория для хранения синтезированных изображений. -
ftp_server(необязательно): Адрес FTP сервера для загрузки файлов. По умолчанию без схемы, загрузка осуществляется по HTTPS. -
n_threads(необязательно): Количество потоков для вычислений (по умолчанию: 5). -
calibrate: "prefer_server" или "from_scratch" (принудительная локальная калибровка). -
calibrated_save_to(необязательно): Путь к файлу JSON для сохранения списка откалиброванных задач. -
calibrations_search_window(необязательно): Временное окно (-search_window/2, +search_window/2), в котором серверная калибровка считается допустимой для использования. По умолчанию: "15min". -
skip_clean(необязательно): Только калибровать изображения и не выполнять этап CLEAN и синтеза изображений. По умолчанию: False. -
input_dir(необязательно): Директория, содержащая входные файлы, в случае если NAS SRH смонтирован там. Обычно None. -
cluster_object: Тип объекта кластера для вычислений, 'local' для локальных вычислений (по умолчанию: 'local'). Другие варианты включают передачу любого типа объекта, который принимает метод .map, например, объект Dask SSHCluster, и т.д.
-
-
Возвращает:
-
results: Вычисленные результаты на основе списка задач.
-
-
Примечания:
- Если
task_list– строка или объект pathlib.Path, список задач будет загружен в формате JSON из переданного пути. -
Этапы работы программы:
- Загружает исходные файлы с FTP сервера в кэш-директорию.
- Калибрует задачи, используя серверные калибровки или локально.
- Синтезирует изображения, используя локальный кластер или указанный объект кластера. Если объект
cluster_objectне 'local', он использует указанный объект кластера для вычислений. - В случае ошибки во время вычислений выводится стек трассировки и переданные объекты списка задач с параметром "error"
- Если
-
Пример использования
import srhimages
time1, time2 = "2024-06-01 02:00:00", "2024-06-01 02:00:05"
frequencies = [2800, 3000]
task_list = srhimages.create_synth_tasks(time1, time2, cadence="3s", frequencies=frequencies, save_to="synth_1.json",
average_width=5, average_unit="seconds", average_mode = "visibilities", average_position="after",
output_polarizations = "IV", naxis=512, cdelt=4.9, clean_disk=True,
compressed=True)
results = srhimages.run_computation("./synth_1.json", "globa", calibrated_save_to="./synth_2.json")
# результаты появятся в каталоге ./images/out
Загрузка калибровок на сервер
from srhimages.calibrations import CalibrationsApi
import json
with open("synth_2.json", "r") as fp:
calibrated_tasks = json.load(fp)
cal_api = CalibrationsApi(password="...")
for task in calibrated_tasks:
cal_api.create(task["gains"])