Так как в прошлый раз использовались все данные, т.е. было очень много точек с явными выбросами, решено было хорошенько их проредить: теперь брались лишь те фитсы, которые были получены непосредственно после процедуры фокусировки. И опять получилось то же самое - две явные группы точек:
Зависимость отсчетов фокуса БТА от температуры трубы
Аппроксимация прямой дала значение F = -0.15*T + 39.80 - практически то же самое, что и было раньше. Стандартное отклонение от прямой составляет 1.68 - в общем случае многовато, однако, похоже, что если сделать интерполяцию по группам, то получится лучше. Но уж очень смущает положительный наклон кривой в области отрицательных температур. Явно здесь что-то не так. Чтобы получить более точные значения надо вешать на стакан лазерный дальномер и снимать показания каждый день. Может быть, тогда будет хоть что-то понятно...
Данные по фокусам брались из
базы ASPID. Для начала я посмотрел, на каких дисках архива лежат результаты наблюдений за 2012 год, затем скопировал это к себе (извне такого доступа нет: все данные как минимум 3 года "наружу" не выставляются). После этого долго писал скрипты для разбора данных: дело в том, что фитсы хранятся в архивах, архивы - в директориях (одна директория == 1 наблюдательная ночь), а эти директории с ночами наблюдений собраны в директории ≤4.4ГБ (для записи на болванки). И ладно бы, имена файлов были нормальными: я замучился с тем, что имена имеют то верхний, то нижний регистр; количество цифр в номере ночи тоже сначала было равно семи, потом внезапно стало 8! В общем, проблема решилась так: сначала я рекурсивно (моим скриптиком file2lower) перевел все имена файлов в нижний регистр, а затем после распаковки архивов с данными по нужной ночи тоже переводил их имена в нижний регистр. Хорошо хоть, что в логах имена файлов были в нижнем регистре!
Все-таки, поражаюсь я этой безграмотности псевдооперационной системы с ласковым названием "вантуз": ну вот что за идиотизм делать имена файлов регистронезависимыми? Постоянно при распаковке архивов или перемещении данных на vfat сталкиваюсь с тем, что файлы с одинаковыми именами, но в разных регистрах (есть за мной такой грешок) начинают конфликтовать.
Итак, сами скрипты.
Во-первых, для цветной подсветки вывода я сделал такое общее для остальных скриптов макроопределение (его, конечно, можно было бы оставить лишь в основном скрипте, но на стадии тестирования отдельных скриптиков это было неудобно):
RED="\033[1;31;40m"
GREEN="\033[1;32;40m"
NORM="\033[0m"
Основной скрипт просто заполняет шапку файла отчета и рекурсивно проходит по всем директориям (можно было, конечно, реализовать весь функционал одним скриптом, а "подскрипты" сделать функциями, но в данном случае так было удобней на этапе тестирования):
#!/bin/bash
. ./colors
echo -e "DATE_OBS\tSTART\tFOCUS" > focuses.log
for DIR in cd*; do
echo -e "\n${RED}Processing directory $DIR${NORM}\n"
for D in $(ls $DIR | grep 's\([[:digit:]]\)\{3,\}'); do
echo -e "${GREEN}Archive directory $D$NORM"
./get_filenames $DIR/$D || exit 1
done
done
Скрипт get_filenames занимается следующим: из файла логов SCORPIO выбираются строчки, следующие за текстом "focussing TELESCOPE" (т.е. сведения об изображениях, полученных явно после фокусировки телескопа). К этим записам "пришпиливаются" суффиксы fts (почему-то фитсы со скорпио имеют суффикс не fits, а такой - видимо, наследие DOS'а, хотя было-то это черт-те сколько лет назад!), чтобы получить нужные нам имена файлов. А еще из этих имен "выдираются" две последние цифры и "пришпиливается" суффикс zip, чтобы получить соответствующие имена архивов. Все нужные архивы распаковываются в текущую директорию, имена файлов приводятся к нижнему регистру, а затем уже обрабатываются сами файлы: из них "выдираются" FITS-шапки, а из шапок выбираются нужные данные.
#!/bin/bash
DIR="./"
[ $# = "1" ] && DIR="$1/"
echo "DIR: $DIR"
NAMES=$(grep -A1 "focussing TELESCOPE" ${DIR}/log.txt | grep "s[[:digit:]]\{7\}"|awk '{print $2"="}')
echo "$NAMES"
FILENAMES=$(echo $NAMES | sed 's/=/.FTS\n/g' | sed -e 's/[[:space:]]*//g' | tr [[:upper:]] [[:lower:]])
ARCHNAMES=$(echo $NAMES | sed "s|[[:space:]]*\(s[[:digit:]]\{5,\}\)[[:digit:]]\{2\}=[[:space:]]*|$DIR\1.zip\n|g" |sort -u)
H=$(mktemp -u "header-XXXXXXX")
echo -e "files: $FILENAMES\narchives: $ARCHNAMES"
for AR in $ARCHNAMES; do
unzip $AR
done
file2lower *
for F in $FILENAMES; do
if [ ! -e $F ]; then
echo -e "\n${RED}File $F not found!$NORM\n"
continue
fi
echo -e "${GREEN}Process file $F$NORM"
./make_header $F $H || exit 1
./parce_header $H || exit 1
rm -f $H
done
rm -f *.fts
Следующий скрипт просто выдергивает FITS-шапку (ставится ограничение на 80 записей, но, судя по данным со SCORPIO, этого за глаза хватает). Здесь я тоже столкнулся со сложностью: за год шапка изменилась (в последних фитсах она почему-то стала короче). Поэтому-то пришлось добавлять "обрезание" полученных данных по слову END, сигнализирующему окончание фитс-шапки.
#!/bin/bash
head -c 6400 $1 | tr -d "\n" | sed -e 's/END.*//' -e "s/\(.\{80\}\)/\1\n/g" | sed 's|\([^/]\) /.*|\1|' | grep --binary-files=text -vi history | grep --binary-files=text -vi comment > $2
Ну и последний скрипт просто выдергивает из шапки данные о дате получения файла и значении отсчета фокуса БТА. Заодно происходит проверка: было ли изображение получено на SCORPIO и было ли это изображение снимком объекта (т.к. для калибровок значение фокуса можно установить каким угодно).
#!/bin/bash
eval $(awk -F'=' '{gsub(/\047/, "", $2); for (i=1;i<=NF;i++){gsub(/^ */,"", $i); gsub(/ *$/,"", $i);}; gsub(/-/,"_", $1); print $1 "=\"" $2 "\""}' $1) || exit 1
[ $INSTRUME != "SCORPIO" -o $IMAGETYP != obj ] && exit
echo -e "instr: $INSTRUME\nim. type: $IMAGETYP\ndate: $DATE_OBS\nfoc: $FOCUS\ntime: $START"
echo -e "$DATE_OBS\t$START\t$FOCUS" >> focuses.log
Сама обработка данных практически такая же, как в прошлый раз, разве что файл со значениями фокуса не нужно обрабатывать, т.к. он уже имеет нормальный вид, а данные из него обрабатывались так:
[date time F] = textread('2012-focuses_correct.log', "%s %s %f", 30000, 'headerlines', 1);
L=size(date,1);
for i=1:L; Ftime(i) = mktime(strptime([date{i} " " time{i}], "%Y/%d/%m %X")); endfor
Вчера я сохранил все данные в бинарный файл (т.к. файл с температурами очень большой, считывается он крайне долго, поэтому хотелось ускорить процесс), но, к сожалению, почему-то октава сегфолтится при попытке загрузки этих данных. В общем, точное значение коэффициента корреляции не скажу, но помню, что было что-то около -0.69.
P.S. В среду, выйдя после отпуска на работу, я обнаружил на столе посылочку с элементами (терморезисторы, макетка на STM32F4 с ethernet на борту, АЦП, набор всяких разных пустых макеток). Как только смогу, займусь. Для начала надо будет научиться работать по SPI с АЦП, напаять терморезисторов, подключить два термодатчика с I2C и оставить это все на долговременный мониторинг, тем временем пытаясь поднять стек TCP/IP на новой макетке с STM32.