Разбор путей

Синтаксический анализ - это способность разбирать информацию, то есть записывать строки на основе данных, содержащихся в заголовке FITS. Синтаксический анализ путей, введенный в Siril 1.2.0, направлен на придание большей гибкости сценариям за счет использования данных заголовка для записи/чтения имен файлов или путей. На данный момент это используется со следующими командами:

и, конечно же, их аналоги в графическим интерфейсе пользователя.

Пример синтаксиса

Для начала возьмем простой пример. Допустим, у вас есть файл с именем light_00001.fit, и вы хотите найти темновой мастер-кадр из вашей библиотеки мастер-кадров, который соответствует характеристикам указанного снимка. Поскольку вы выбрали соглашение для именования своих темновых мастер-кадров, вы знаете, что правильный темновой кадр должен называться примерно так:

DARK_"exposure"s_G"gain"_O"offset"_T"temperature"C_bin"binning".fit

с терминами в кавычках, замененными на значения, считанные из заголовка вашего снимка. Для экспозиции 120с, температуры -10°C, усиления/смещения 120/30 и биннинга 1, темновой мастер-кадр будет называться:

DARK_120s_G120_O30_T-10C_bin1.fit

Что ж, это именно то, что позволяет делать эта функция. Если вы укажете имя темновому кадру с описанными ниже соглашениями, вы можете сказать Siril открыть снимок, прочитать его заголовок и использовать его значения для записи такой строки (а затем использовать ее для калибровки вашего снимка).

Вы можете прочитать информацию, содержащуюся в заголовке, либо с помощью команды dumpheader, либо щелкнув правой кнопкой мыши по открытому изображению и выбрав Заголовок FITS.... Скорее всего вы получите распечатку, подобную той, что приведена ниже (некоторые строки удалены для краткости):

SIMPLE  =                    T / C# FITS
BITPIX  =                   16 /
NAXIS   =                    2 / Dimensionality
NAXIS1  =                 4144 /
NAXIS2  =                 2822 /
BZERO   =                32768 /
EXTEND  =                    T / Extensions are permitted
IMAGETYP= 'LIGHT'              / Type of exposure
EXPOSURE=                120.0 / [s] Exposure duration
DATE-OBS= '2022-01-24T01:03:34.729' / Time of observation (UTC)
XBINNING=                    1 / X axis binning factor
YBINNING=                    1 / Y axis binning factor
GAIN    =                  120 / Sensor gain
OFFSET  =                   30 / Sensor gain offset
INSTRUME= 'ZWO ASI294MC Pro'   / Imaging instrument name
SET-TEMP=                -10.0 / [degC] CCD temperature setpoint
CCD-TEMP=                -10.0 / [degC] CCD temperature
BAYERPAT= 'RGGB'               / Sensor Bayer pattern
TELESCOP= '61EDPH'             / Name of telescope
FILTER  = 'DualBand'           / Active filter name
OBJECT  = 'Rosette Nebula     '/ Name of the object of interest
OBJCTRA = '06 30 36'           / [H M S] RA of imaged object
OBJCTDEC= '+04 58 51'          / [D M S] Declination of imaged object
RA      =     97.6960081674312 / [deg] RA of telescope
DEC     =     4.99212765957446 / [deg] Declination of telescope
END

Тогда формат, используемый для указания имени темнового кадра, будет следующим:

DARK_$EXPTIME:%d$s_G$GAIN:%d$_O$OFFSET:%d$_T$SET-TEMP:%d$C_bin$XBINNING:%d$.fit

Все термины для разбора формируются следующим образом: $KEY:fmt$

Например, $EXPTIME:%d$ будет преобразовано в 120, если снимок был экспонирован в течение 120с. Но будет преобразовано в 120.0, если вы укажете $EXPTIME:%0.1f$, благодаря спецификатору формата %x.yf.

Таким образом, полное выражение написанное выше будет иметь вид:

DARK_**120**s_G**120**_O**30**_T**-10**C_bin**1**.fit

В этом первом примере мы использовали преобразование только в целые числа с %d. Но есть и другие общепринятые средства форматирования, которые вы можете использовать:

  • %x.yf для десятичных дробей

  • %s для строк

Примечание

Для строк начальные и конечные пробелы всегда удаляются, а пробелы внутри строк заменяются знаками _. Пример: $OBJECT:%s$ будет преобразовано в Rosette_Nebula.

Вы также можете использовать некоторые менее традиционные спецификаторы формата:

  • Чтобы преобразовать дату из ключа заголовка дата-время, можно использовать специальный нестандартный спецификатор формата dm12, который означает дату минус 12 часов. В заголовке выше строка DATE-OBS имеет значение 2022-01-24T01:03:34.729. $DATE-OBS:dm12$ преобразуется в 2022-01-23, что является датой в начале ночи. Можно также использовать спецификатор формата dm0, который просто преобразует дату, не вычитая 12 часов.

  • Чтобы преобразовать дату-время из строки заголовка даты-времени, можно использовать нестандартный спецификатор формата dt, который просто означает дату-время. В заголовке выше строка DATE-OBS имеет значение 2022-01-24T01:03:34.729. $DATE-OBS:dt$ будет преобразована в 2022-01-24_01-03-34.

  • Для преобразования информации RA и DEC из строк заголовка OBJCTRA и OBJCTDEC можно использовать нестандартные спецификаторы формата ra и dec. В заголовке выше строки OBJCTRA и OBJCTDEC имеют значения 06 30 36 и +04 58 51 соответственно. $OBJCTRA:ra$_$OBJCTDEC:dec$ преобразуется в 06h30m36s_+04d58m51s.

  • Чтобы проанализировать информацию RA и DEC из строк заголовка RA и DEC, когда они в десятичном формате, вы можете использовать нестандартные спецификаторы формата ran и decn. В заголовке выше строки RA и DEC имеют значения 97.6960081674312 и 4.99212765957446 соответственно. $RA:ran$_$DEC:decn$ будет преобразовано в 06h30m47s_+04d59m32s.

Чтобы проверить синтаксис, вы можете загрузить изображение и использовать команду parser, как указано ниже.

Командная строка Siril

parse str [-r]
Разбирает строку str, используя информацию из заголовка загруженного в данный момент изображения. Основная цель этой команды — отладка синтаксического анализа путей ключей заголовка, которые могут использоваться другими командами.
Опция -r указывает, что строку необходимо интерпретировать в режиме чтения. В этом режиме все подстановочные знаки, определённые в строке str используются для поиска имени файла, соответствующего шаблону. В противном случае режимом по умолчанию является режим записи, и подстановочные знаки, при наличии, удаляются из анализируемой строки.

Если строка str начинается с префикса $def, он будет распознан как зарезервированное ключевое слово и будет выполнен его поиск в строках, сохранённых в gui_prepro.dark_lib, gui_prepro.flat_lib, gui_prepro.bias_lib или gui_prepro.stack_default для $defdark, $defflat, $defbias или $defstack, соответственно.
Когда загружена последовательность, можно так же использовать ключевое слово $seqname$

Поиск файла с помощью разбора пути

В примере выше мы увидели, что можем найти имя темнового мастер-кадра на основе информации, содержащейся в заголовке калибруемого изображения. Это то, что называется в команде parse, режим чтения.

Это поведение в основном используется в сочетании с командой calibrate и на вкладке Калибровка. В опции -dark= команды или в поле Темновой мастер-кадр графического интерфейса вы можете использовать синтаксис, описанный выше. Так вы будете уверены, что для калибровки изображения будет извлечен соответствующий темновой кадр . То же самое в равной степени применимо к полям Мастер-кардр шума считывания и Мастер-кадр плоского поля. Конечно, вы также можете указать полный (или относительный) путь к файлу. И путь также может содержать подобные выражения.

Например, для кадров плоского поля вы можете указать путь к библиотеке, которая может содержать информацию о фильтре или телескопе, поскольку у вас может быть несколько настроек. Такой путь:

~/astro/masters/flats/$INSTRUME:%s$_$TELESCOP:%s$/$FILTER:%s$/FLAT_bin$XBINNING:%d$.fit

Может быть преобразован так:

~/astro/masters/flats/ZWO_ASI294MC_Pro_61EDPH/DualBand/FLAT_bin1.fit

и является допустимым значением для поля Мастер-кадр плоского поля.

Конечно, если бы вы каждый раз при калибровке писали это как команду в своих скриптах или в поле Мастер-кадр плоского поля графического пользовательского интерфейса, это могло бы стать немного утомительным. Вот тогда на помощь приходят зарезервированные ключевые слова. Для мастер-кадров есть 3 зарезервированных ключевых слова:

  • $defdark

  • $defflat

  • $defbias

Их значения задаются в ` разделе Настройки ‣ Предобработка. Вы также можете указать их через скрипты благодаря команде :ref:`set <set>. Они соответствуют значениям gui_prepro.dark_lib, gui_prepro.flat_lib и gui_prepro.bias_lib.

Когда их значения установлены и вы решили использовать их в качестве значений по умолчанию, они будут отображаться в полях вкладки Калибровка. Вы также можете начать писать свои скрипты, используя эти ключевые слова. Шаг калибровки нового универсального скрипта для цветной камеры может выглядеть так:

calibrate light -dark=$defdark -cc=dark -flat=$defflat -cfa -equalizecfa -debayer

Это позволит вам выбирать мастер-файлы непосредственно из ваших библиотек и гарантировать, что вы не перепутаете их на этапе калибровки.

Запись файла с разбором пути

Теперь, когда удобно иметь возможность находить файлы, было бы столь же полезно использовать этот синтаксис для сохранения ваших файлов при укладке изображений. Именно это и есть режим записи. Синтаксис можно использовать в поле -out= команд stack и stackall или в соответствующем поле в графическом интерфейсе пользователя.

Допустим, вы хотите написать общий скрипт, который подготавливает вам темновые мастер-кадры каждый раз, когда вы обновляете свою библиотеку. В строке stack скрипта вы можете написать:

stack dark rej 3 3 -nonorm -out=$defdark

Эта строка гарантирует, что полученный темновой мастер-кадр будет сохранен в правильном месте с правильным именем, который затем можно будет извлечь для калибровки вашего освещения.

Чтобы обеспечить еще большую гибкость при использовании команд stack, есть еще два зарезервированных ключевых слова:

  • $defstack

  • $sequencename$

Что касается настроек по умолчанию, $def stack настраивается в том же разделе Настроек или с помощью команды set в gui_prepro.stack_default. Например, давайте предположим, что вы определили $def stack как:

Result_$OBJECT:%s$_$DATE-OBS:dm12$_$LIVETIME:%d$s

Строка скрипта:

stack r_pp_light rej 3 3 -norm=addscale -output_norm -out=$defstack

сохранит результат укладки в файл с именем:

Result_Rosette_Nebula_2022-01-24_12000s.fit

Начиная с Siril 1.2.0, имя по умолчанию для результата укладки определяется как $sequencename$stacked (знак _ добавляется, если его не указали). Это похоже на поведение в предыдущих версиях, за исключением того, что теперь явно указано, что используется разбор пути.

Использование подстановочных знаков

Возможно, вы хотите использовать какое-то ключевое значение в имени вашего мастера, которое не соответствует ключевому значению в кадрах, которые нужно откалибровать. На примере это может быть немного понятнее. Допустим, вы хотите, чтобы в названиях ваших мастер-кадров плоского поля был указан срок их хранения. Что-то вроде:

FLAT_1.32s_Halpha_G120_O30_bin1.fit

Если вы поместите поле $EXPTIME:%0.2f$ в $defflat, это приведет к ошибке на этапе калибровки. Просто потому, что ключ EXPTIME будет считываться из калибруемого изображения, а не из кадра плоского поля.

Чтобы справиться с этой ситуацией, можно использовать подстановочные знаки в выражениях для разбора:

FLAT_$*EXPTIME:%0.2f$_$FILTER:%s$_G$GAIN:%d$_O$OFFSET:%d$_bin$XBINNING:%d$

Обратите внимание на символ *, расположенный непосредственно перед EXPTIME.

Этот символ означает следующее:

  • В режиме записи, то есть, по сути, при укладке вашего мастер-кадра плоского поля, значение строки EXPOSURE будет использоваться для формирования имени сохраняемого файла. В приведенном выше примере вы бы тогда фактически сохранили в FLAT_1.32s_Halpha_G120_O30_bin1.fit.

  • В режиме чтения, когда калибруются ваши изображения, значение строки EXPOSURE будет заменено на *. При поиске такого файла Siril извлечет все файлы, которые соответствуют шаблону FLAT_*_Halpha_G120_O30_bin1.fit. Надеюсь, ваше соглашение об именовании достаточно продумано, чтобы найти только один соответствующий файл и использовать его для калибровки.

Предупреждение

В случае, если Siril обнаружит более одного файла в режиме чтения, он выдаст предупреждение в консоли и выберет самый последний файл. Поскольку это может не дать желаемого результата, вам следует пересмотреть соглашение об именовании файлов, если это произойдет.