eddy_em: (Костерок)
[personal profile] eddy_em
Так как в прошлый раз использовались все данные, т.е. было очень много точек с явными выбросами, решено было хорошенько их проредить: теперь брались лишь те фитсы, которые были получены непосредственно после процедуры фокусировки. И опять получилось то же самое — две явные группы точек:
Temp_vs_foc_LR_corr
Зависимость отсчетов фокуса БТА от температуры трубы


Аппроксимация прямой дала значение 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 и было ли это изображение снимком объекта (т.к. для калибровок значение фокуса можно установить каким угодно).
[Error: Irreparable invalid markup ('<pre [...] скрипт>') in entry. Owner must fix manually. Raw contents below.]

Так как в прошлый раз использовались все данные, т.е. было очень много точек с явными выбросами, решено было хорошенько их проредить: теперь брались лишь те фитсы, которые были получены непосредственно после процедуры фокусировки. И опять получилось то же самое — две явные группы точек:
<div style="text-align: center;"><figure><img src="http://ic.pics.livejournal.com/eddy_em/43568408/42903/42903_600.png" alt="Temp_vs_foc_LR_corr" title="Temp_vs_foc_LR_corr" width="600" height="450" /><figcaption>Зависимость отсчетов фокуса БТА от температуры трубы</figcaption></figure></div>

Аппроксимация прямой дала значение <tt>F = -0.15*T + 39.80</tt> — практически то же самое, что и было раньше. Стандартное отклонение от прямой составляет 1.68 — в общем случае многовато, однако, похоже, что если сделать интерполяцию по группам, то получится лучше. Но уж очень смущает положительный наклон кривой в области отрицательных температур. Явно здесь что-то не так. Чтобы получить более точные значения надо вешать на стакан лазерный дальномер и снимать показания каждый день. Может быть, тогда будет хоть что-то понятно...

<lj-cut text="немного кода">
Данные по фокусам брались из <a href="http://alcor.sao.ru/db/aspid/">базы ASPID</a>. Для начала я посмотрел, на каких дисках архива лежат результаты наблюдений за 2012 год, затем скопировал это к себе (извне такого доступа нет: все данные как минимум 3 года "наружу" не выставляются). После этого долго писал скрипты для разбора данных: дело в том, что фитсы хранятся в архивах, архивы — в директориях (одна директория == 1 наблюдательная ночь), а эти директории с ночами наблюдений собраны в директории ≤4.4ГБ (для записи на болванки). И ладно бы, имена файлов были нормальными: я замучился с тем, что имена имеют то верхний, то нижний регистр; количество цифр в номере ночи тоже сначала было равно семи, потом внезапно стало 8! В общем, проблема решилась так: сначала я рекурсивно (моим скриптиком <tt>file2lower</tt>) перевел все имена файлов в нижний регистр, а затем после распаковки архивов с данными по нужной ночи тоже переводил их имена в нижний регистр. Хорошо хоть, что в логах имена файлов были в нижнем регистре!
<div style="border-left: 1px dotted; margin-left: 10px; padding-left: 10px;">
Все-таки, поражаюсь я этой безграмотности псевдооперационной системы с ласковым названием "вантуз": ну вот что за идиотизм делать имена файлов регистронезависимыми? Постоянно при распаковке архивов или перемещении данных на vfat сталкиваюсь с тем, что файлы с одинаковыми именами, но в разных регистрах (есть за мной такой грешок) начинают конфликтовать.
</div>

<b>Итак, сами скрипты</b>.
Во-первых, для цветной подсветки вывода я сделал такое общее для остальных скриптов макроопределение (его, конечно, можно было бы оставить лишь в основном скрипте, но на стадии тестирования отдельных скриптиков это было неудобно):
<code lang="bash"><pre style="border-left: 4px solid; border-top: 1px dashed; border-bottom: 1px dashed; max-height: 300px; overflow: auto; padding: 5px" title="Цветная подсветка вывода - скрипт colors">
RED="\033[1;31;40m"
GREEN="\033[1;32;40m"
NORM="\033[0m"
</pre></code>

Основной скрипт просто заполняет шапку файла отчета и рекурсивно проходит по всем директориям (можно было, конечно, реализовать весь функционал одним скриптом, а "подскрипты" сделать функциями, но в данном случае так было удобней на этапе тестирования):
<code lang="bash"><pre style="border-left: 4px solid; border-top: 1px dashed; border-bottom: 1px dashed; max-height: 300px; overflow: auto; padding: 5px" title="Рекурсивная обработка директорий - скрипт parce_directories">
#!/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
</pre></code>

Скрипт <tt>get_filenames</tt> занимается следующим: из файла логов SCORPIO выбираются строчки, следующие за текстом "focussing TELESCOPE" (т.е. сведения об изображениях, полученных явно после фокусировки телескопа). К этим записам "пришпиливаются" суффиксы <tt>fts</tt> (почему-то фитсы со скорпио имеют суффикс не <tt>fits</tt>, а такой — видимо, наследие DOS'а, хотя было-то это черт-те сколько лет назад!), чтобы получить нужные нам имена файлов. А еще из этих имен "выдираются" две последние цифры и "пришпиливается" суффикс <tt>zip</tt>, чтобы получить соответствующие имена архивов. Все нужные архивы распаковываются в текущую директорию, имена файлов приводятся к нижнему регистру, а затем уже обрабатываются сами файлы: из них "выдираются" FITS-шапки, а из шапок выбираются нужные данные.
<code lang="bash"><pre style="border-left: 4px solid; border-top: 1px dashed; border-bottom: 1px dashed; max-height: 300px; overflow: auto; padding: 5px" title="Получение имен интересующих файлов и обработка их - скрипт get_filenames">
#!/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
</pre></code>

Следующий скрипт просто выдергивает FITS-шапку (ставится ограничение на 80 записей, но, судя по данным со SCORPIO, этого за глаза хватает). Здесь я тоже столкнулся со сложностью: за год шапка изменилась (в последних фитсах она почему-то стала короче). Поэтому-то пришлось добавлять "обрезание" полученных данных по слову <tt>END</tt>, сигнализирующему окончание фитс-шапки.
<code lang="bash"><pre style="border-left: 4px solid; border-top: 1px dashed; border-bottom: 1px dashed; max-height: 300px; overflow: auto; padding: 5px" title="Извлечение заголовка FITS-файла - скрипт make_header">
#!/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
</pre></code>

Ну и последний скрипт просто выдергивает из шапки данные о дате получения файла и значении отсчета фокуса БТА. Заодно происходит проверка: было ли изображение получено на SCORPIO и было ли это изображение снимком объекта (т.к. для калибровок значение фокуса можно установить каким угодно).
<code lang="bash"><pre style="border-left: 4px solid; border-top: 1px dashed; border-bottom: 1px dashed; max-height: 300px; overflow: auto; padding: 5px" title="Обработка" шапки="шапки" -="-" скрипт="скрипт">
#!/bin/bash
eval $(awk -F'=' '{gsub(/\047/, "", $2); for (i=1;i&lt;=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
</pre></code>

Сама обработка данных практически такая же, как в прошлый раз, разве что файл со значениями фокуса не нужно обрабатывать, т.к. он уже имеет нормальный вид, а данные из него обрабатывались так:
<code lang="bash"><pre style="border-left: 4px solid; border-top: 1px dashed; border-bottom: 1px dashed; max-height: 300px; overflow: auto; padding: 5px" title="Чтение данных из файла с фокусами">
[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
</pre></code>

Вчера я сохранил все данные в бинарный файл (т.к. файл с температурами очень большой, считывается он крайне долго, поэтому хотелось ускорить процесс), но, к сожалению, почему-то октава сегфолтится при попытке загрузки этих данных. В общем, точное значение коэффициента корреляции не скажу, но помню, что было что-то около -0.69.
</lj-cut>

P.S. В среду, выйдя после отпуска на работу, я обнаружил на столе посылочку с элементами (терморезисторы, макетка на STM32F4 с ethernet на борту, АЦП, набор всяких разных пустых макеток). Как только смогу, займусь. Для начала надо будет научиться работать по SPI с АЦП, напаять терморезисторов, подключить два термодатчика с I2C и оставить это все на долговременный мониторинг, тем временем пытаясь поднять стек TCP/IP на новой макетке с STM32.

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 23rd, 2025 07:17 am
Powered by Dreamwidth Studios