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.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

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. 30th, 2025 05:22 pm
Powered by Dreamwidth Studios