Marcin Krzysztof Mazur Działająca przez WWW przeglądarka do plików FITS dla eksperymentu π of the Sky. Praca dyplomowa inżynierska pod kierunkiem doc. dr inż. Tomasza Traczyka Instytut Automatyki i Informatyki Stosowanej Politechniki Warszawskiej Warszawa, Czerwiec 2009 Spis treści Wprowadzenie Cel pracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Motywacja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wymagania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Projekt π of the Sky 1.1 Cel projektu . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Główne działania projektu . . . . . . . . . . . . . . . . 1.2.1 Obserwacja błysków gamma . . . . . . . . . . . . 1.2.2 Wykrywanie pozostałych zjawisk astrofizycznych 1.2.3 Największe osiągnięcie projektu . . . . . . . . . . 1.3 Miejsce tej pracy w projekcie π of the Sky . . . . . . . . 2 Standard FITS 2.1 Struktura plików FITS . . . . . . . . . . . . 2.1.1 Nagłówek bloku danych . . . . . . . 2.1.2 Format wartość przechowywanych w bloku danych . . . . . . . . . . . . . 2.2 Pliki FITS używane w projekcie π of the Sky 2.2.1 Format zapisu obrazu . . . . . . . . . 2.2.2 Fragmenty obrazów . . . . . . . . . . 2.2.3 Używane słowa kluczowe . . . . . . . 2.2.4 Paczki obrazów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabeli podstawowego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Opis zaimplementowanej przeglądarki plików FITS 3.1 Wybrana technologia i wykorzystywane biblioteki . . 3.2 Struktura aplikacji . . . . . . . . . . . . . . . . . . . 3.2.1 Reprezentacja obrazu . . . . . . . . . . . . . . 3.2.2 Przetwarzanie list plików . . . . . . . . . . . . 3.2.3 Pobieranie paczek plików oraz plików FITS . . 3.3 Możliwość rozszerzenia aplikacji . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 6 . 6 . 8 . 8 . 12 . 13 . 14 16 . 16 . 17 . . . . . . 19 20 20 21 21 23 . . . . . . 24 24 26 26 29 30 32 3.4 3.5 Przekazywanie parametrów apletowi . . . . . . . . . . . . . . . . . . 35 Połączenie z bazą danych projektu . . . . . . . . . . . . . . . . . . 36 4 Zastosowane metody i algorytmy 4.1 Korekcja kontrastu obrazu . . . . . . . . . . . . . . . 4.2 Korekcja gamma obrazu . . . . . . . . . . . . . . . . 4.3 Sposób wykonywania operacji graficznych na obrazie 4.4 Algorytm wyznaczania współrzędnych niebieskich . . Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 38 42 45 47 49 2 Wprowadzenie Cel pracy Celem pracy jest stworzenie narzędzia, działającego jako usługa WWW, umożliwiającego przeglądanie obrazów zapisanych w formacie FITS. Format ten stosowany jest w celu przechowywania oraz transmitowania obrazów pozyskanych w celach naukowych. Narzędzie ma pozwolić przede wszystkim na oglądanie zdjęć w szesnastobitowej skali szarości. Aplikacja powinna pozwalać na wykonywanie podstawowych operacji graficznych oraz powinna zapewniać możliwość poprawy jakości wyświetlanych obrazów poprzez udostępnienie odpowiednich metod przetwarzania obrazu. Ponieważ implementowany program tworzony jest na potrzeby eksperymentu π of the Sky musi on być dostosowany do plików FITS, używanych w projekcie oraz do formy ich przechowywania. Program powinien również dać się dostosować do istniejącego już interfejsu WWW projektu. Dodatkowym celem jest zapewnienie możliwości porównania informacji zawartych na przetwarzanym zdjęciu z dotychczas zgromadzonymi przez projekt danymi, przez połączenie z roboczymi bazami danych eksperymentu. Motywacja Istnieje duża liczba programów umożliwiających prezentacje oraz przetwarzanie obrazów zapisanych w formacie FITS. Do najbardziej rozpowszechnionych można zaliczyć takie przeglądarki jak SAOImage ds9, Iris, audela. Oprócz nich istnieją także aplikacje działające przez WWW, np. SIP (Sky Image Processor ) oraz BRT Fits Viewer. Są to w większości ogólnie dostępne darmowe aplikacje. Jednakże nie posiadają one pełnej funkcjonalności zawiązanej z plikami FITS używanymi w projekcie π of the Sky. Przede wszystkim nie dostarczają funkcji związanych z wyznaczaniem współrzędnych niebieskich punktu na obrazie, na podstawie danych zawartych w nagłówkach plików pochodzących z teleskopu eksperymentu, oraz nie są w stanie połączyć się z bazą danych projektu. Głównym zadaniem aplikacji ma być usprawnienie czynności mających na celu weryfikację czy wykry- 3 te przez teleskop projektu zdarzenie jest zjawiskiem astrofizycznym czy też nie. W przypadku używania jednego z wyżej wymienionych programów, osoba analizująca dane zmuszona jest najpierw pobrać tzw. paczkę na lokalny komputer, zdekompresować ją oraz zdearchiwizować. Dopiero wtedy może przeglądać zdjęcia obrazujące zaobserwowane zjawisko astrofizyczne przez ręczny wybór plików wchodzących w skład listy opisującej jedno zjawisko. Zaimplementowana tu przeglądarka robi to tymczasem automatycznie przez pobranie paczki spod danego adresu URL i samodzielne wykonanie procesu dekompresji i dearchiwizacji. Następnie wyświetlane jest okno wyboru plików list pozwalające na dodanie plików znajdujących się na liście do okna nawigacji programu. Dzięki temu użytkownik może przeglądać obrazy przedstawiające wybrane zdarzenia przez wybór pozycji w oknie nawigacji aplikacji. Wymagania Przed aplikacją postawiono następujące wymagania: • Prezentacja obrazu zapisanego w podstawowym bloku pliku FITS: – w szesnastobitowej skali szarości, – w dowolnym formacie lub z możliwością rozszerzenia aplikacji tak, aby można było spełnić tę funkcjonalność. • Wykonywanie następujących operacji graficznych, na aktualnie wyświetlanym obrazie: – skalowania, – odbicia względem osi OX i osi OY kartezjańskiego układu współrzędnych, – powiększania zaznaczanego fragmentu zdjęcia. • Implementacja metod przetwarzania obrazu w celu korekcji kontrastu: – automatycznej metody poprawy kontrastu stosowanej podczas wyświetlania zdjęcia, – metod, które umożliwią ręczną korekcję przez użytkownika. • Wyświetlanie oryginalnej wartości piksela obrazu i odpowiadających mu współrzędnych (x, y) oraz współrzędnych niebieskich. • Otwieranie plików przetwarzanych przez aplikacje spod zadanego adresu URL. 4 • Zapisywanie przetwarzanego obrazu do innych plików graficznych takich jak: JPG, BMP, GIF, PNG. • Przetwarzanie list plików oraz paczek plików: – utworzenie okna nawigacji po plikach w interfejsie użytkownika aplikacji, – utworzenie przycisków w interfejsie użytkownika, umożliwiających nawigację po plikach. • Połączenie z bazą danych projektu i pobranie spisu gwiazd znajdujących się na wyznaczonym obszarze przetwarzanego zdjęcia. Dodatkowym wymaganiem, jakie zostało określone po wyborze technologii wykonania programu, było jego zaimplementowanie w formie apletu Javy oraz w formie analogicznej aplikacji, napisanej również w języku Java. 5 Rozdział 1 Projekt π of the Sky 1.1 Cel projektu Celem projektu π of the Sky jest obserwacja optyczna nieba w krótkich skalach czasowych. Dzięki obserwacji nieba można zarejestrować szereg zjawisk astrofizycznych, które pomagają zrozumieć procesy zachodzące we Wszechświecie oraz są podstawą do wyjaśnienia początku Wszechświata. Podstawowym obiektem zainteresowania projektu jest obserwacja optycznych odpowiedników błysków gamma (ang. Gamma Ray Burst – GRB). Istnienie błysków zostało odkryte przypadkowo przez amerykańskiego satelitę Vela w okresie zimnej wojny. Zadaniem satelity była obserwacja nieba w poszukiwaniu testów broni jądrowej wykonywanych przez Związek Radziecki. Nie wykryto wówczas testów nuklearnych, ale zauważono istnienie źródeł promieniowania gamma w kosmosie. Błyski gamma są dotychczas uważane za zjawiska emitujące największą energię we Wszechświecie, których źródła znajdują się w odległych galaktykach. Dzieli się je na dwie kategorie: krótkie błyski trwające mniej niż 2 s i długie błyski trwające dłużej niż 2 s. Energia emitowana przez krótki błysk szacowana jest na około 1049 erg1 , natomiast energia emitowana podczas długiego błysku szacowana jest na około 1051 erg i można ją porównać do energii jaką emituje Słońce podczas 10 mld lat świecenia. Za przyczynę długiego błysku uważa się eksplozję ogromnych gwiazd, których masa jest nawet 30 razy większa niż masa Słońca. Ich eksplozja jest wynikiem przeważenia ciśnienia wewnątrz gwiazdy powodowanego przez reakcje termojądrowe przez ciśnienie powodowane przez siłę grawitacji gwiazdy. Wskutek tego gwiazda zapada się do swojego wnętrza i następuje gigantyczna eksplozja, podczas której energia emitowana jest między innymi jako promieniowanie gamma. Ma to miejsce gdy gwiazda zbliża się do końca swojego życia i kończy się jej paliwo. Jest to jedna z wersji powstawania supernowej. Po wybuchu gwiazda prze1 Jednostka pracy i energii w układzie miar CGS. [13] 6 kształca się w bardzo gęstą gwiazdę neutronową lub w czarną dziurę. Natomiast krótkie błyski są wynikiem zderzenia się dwóch ciał niebieskich znajdujących się w układzie podwójnym, czyli dwóch obiektów krążących wokół siebie. Mogą to być dwie gwiazdy neutronowe bądź gwiazda neutronowa oraz czarna dziura. Zderzenie zachodzi gdy gwiazdy tracą swoją energie i nie są wstanie zrównoważyć siły grawitacji działającej między nimi. Wskutek zderzenia powstaję masa krytyczna i następuje eksplozja po której powstaje czarna dziura. Od czasów odkrycia błysków gamma poczyniono duże postępy w wyjaśnieniu ich przyczyny, jednakże nadal nie jest wyjaśniony dokładny mechanizm wybuchu. Do poczynienia dalszych postępów niezbędne są dane opisujące błyski, a w szczególności optyczne odpowiedniki błysków, które mogą w znaczny sposób pomóc wytłumaczyć to zjawisko. Z powodu technicznych ograniczeń przez wiele lat optyczne odpowiedniki błysków obserwowane były parę godzin lub dni po zdarzeniu. Mimo, że sytuacja ta zmieniła się, zjawisko to zarejestrowano optycznie w trakcie jego trwania tylko kilkakrotnie. Istnieje również cała gama innych zjawisk astrofizycznych, które można obserwować i których czas trwania może być liczony w sekundach lub dniach. Najważniejszymi z nich, którymi zajmuje się projekt π of the Sky, są: • Nowa klasyczna – zjawisko zachodzące w systemie podwójnym, w którym znajduje się biały karzeł oraz gwiazda z której biały karzeł pobiera materie. Pobrana materia gromadzi się na powierzchni białego karła, po pewnym czasie nagromadzona materia przekracza masę krytyczną i na powierzchni gwiazdy następuje wybuch spowodowany reakcją termojądrową. Zjawisko to może powtarzać się i nazywane jest wtedy jako nowa powrotna. Zdarzenie to jest rejestrowane jako nagły wzrost jasności gwiazdy w porównaniu do wcześniejszych jej obserwacji lub jako pojawienie się nowego obiektu. • Gwiazdy zmienne – gwiazdy, które okresowo zmieniają swoją jasność. Zmienność jasności może mieć wymiar od milisekund do dni i lat. Typowym rodzajem gwiazdy zmiennej jest gwiazda rozbłyskowa, który gwałtownie i nieprzewidzianie zmienia swoją jasność na skutek nieprzewidywalnej eksplozji powiązanej z uwolnieniem energii magnetycznej. Przyczyna eksplozji jest taka sama jak przyczyna rozbłysku słonecznego, jednakże eksplozja gwiazdy zmiennej jest nawet tysiąc krotnie jaśniejsza. Zmienność gwiazdy rozbłyskowej charakteryzuję się gwałtownym, nieregularnym dużym wzrostem jasności w porównaniu do łagodnego spadku jasności. Szacuje się, że gwiazdy rozbłyskowe stanowią około 1% wszystkich gwiazd. • Galaktyki aktywne w szczególności blazary – jest to typ galaktyki, która posiada aktywne jądro, co jest spowodowane absorpcją materii takiej jak pył i gaz międzygwiezdny przez masywną czarną dziurę znajdującą się 7 w jej wnętrzu. W wielu przypadkach obserwowane są strugi materii mogące rozciągać się na bardzo dużą odległość, które są najprawdopodobniej wydzielane w kierunku obrotu czarnej dziury. Jeżeli kierunek strug materii jest skierowany w stronę Ziemi to taka aktywna galaktyka nazywana jest blazarem. Ten typ galaktyki charakteryzuje się szybką zmianą promieniowania w bardzo szerokim zakresie promieniowania elektromagnetycznego. Obserwacja takich obiektów oraz informowanie o ich aktywności jest bardzo ważna dla obserwacji prowadzonych przez duże teleskopy. • Supernowe – procesy związane ze śmiercią masywnych gwiazd powodowane naruszeniem równowagi między ciśnieniem wywoływanym przez siłę grawitacji gwiazdy oraz ciśnieniem powodowanym przez reakcje termojądrowe. Czego skutkiem jest zapadnięcie się gwiazdy powodującej ogromny wybuch o energii równej w przybliżeniu 1051 erg. Rocznie odkrywanych jest około 400 supernowych, lecz większości z nich towarzyszy rozbłysk, który jest niedostrzegalny przez aparaturę projektu. Jednak nie wyklucza to możliwości odkrycia takiego zjawiska. Powyższa lista jest tylko częścią procesów jakie są obiektem obserwacji projektu π of the Sky. W większości przypadków głównym celem obserwacji i analizy optycznej nieba jest odkrycie nowego zjawiska i powiadomienie o jego istnieniu dużych teleskopów mających większe możliwości w zakresie analizy i badania odkrytego obiektu. 1.2 1.2.1 Główne działania projektu Obserwacja błysków gamma Standardowe podejście w obserwacji błysków gamma polega na otrzymywaniu informacji o zaistnieniu zdarzenia i skierowaniu kamer na obszar nieba, w którym wystąpiło zdarzenie. Jednakże wykrycie takiego zjawiska i określenie jego współrzędnych nie jest sprawą oczywistą, ponieważ promieniowanie gamma jest silnie tłumione przez atmosferę ziemską. Powoduje to, że nie można wykryć zdarzenia za pomocą detektorów promieniowania gamma znajdujących się na powierzchni Ziemi. Wykrycie promieniowania gamma możliwe jest dzięki zainstalowaniu detektorów w satelitach okołoziemskich. Pierwsze satelity wyposażone w czujniki promieniowania gamma nie były wstanie określić położenia obiektu, który wyemitował promieniowanie. Sytuacja ta zmieniła się gdy w roku 1991 NASA wystrzeliła na orbitę okołoziemską obserwatorium Comptona CGRO (Compton Gamma Ray Observatory) [9]. Jedną z części satelity był BASTE (Burst And Transient Source 8 Experiment), który składał się z ośmiu bardziej czułych niż stosowane wcześniej detektorów promieniowania gamma znajdujących się na krańcach satelity. Dzięki mu możliwa była obserwacja słabszych błysków gamma oraz określenie pozycji błysku z dokładnością do 1o . BASTE wraz z CGRO znajdował się na orbicie do roku 2000. Przez ten czas zarejestrował 2704 błysków, co w przeliczeniu na dni daje nam jeden błysk dziennie. Dodatkowo, jeżeli weźmiemy pod uwagę to, że nie mógł on wykonywać obserwacji przez cały czas z powodów technicznych oraz że część nieba zasłaniała mu Ziemia, szacuje się że był on wstanie zaobserwować 3 błyski dziennie. Satelita ten jednak miał jedną zasadniczą wadę z punktu widzenia obserwacji błysków gamma: nie potrafił określić w jakiej odległości znajduje się obiekt, który jest źródłem błysku. Problem ten rozwiązał włosko-holenderski satelita Bepposax [10], którego głównym zadaniem była rejestracja zjawisk astrofizycznych za pomocą kamer rentgenowskich. Na podstawie wykonanych przez niego obserwacji błysków gamma stwierdzono, że ich źródło znajduję się w bardzo odległych częściach Wszechświata. Aktualnie wszystkie obserwatoria, których celem jest obserwacja optyczna RGB pobierają informacje o zaistniałych zdarzeniach z GCN (Gamma ray bursts Coordinates Network ) [8]. Jest to globalna sieć, która przekazuje informacje o wykrytych zjawiskach i ich współrzędnych za pomocą poczty elektronicznej, pagerów i gniazd telekomunikacyjnych do zarejestrowanych w niej użytkowników (rysunek 1.1). Dane które są dystrybuowane przez GCN pochodzą z satelitów: Rxte,Ipn, Integral, Swift, Fermi oraz Agile. Istnieje pewne opóźnienie pomiędzy wykryciem przez satelitę RGB a wysłaniem informacji o nim przez sieć, spowodowane czasem jaki jest niezbędny do obliczenia współrzędnych zjawiska. Czas ten wynosi około 5 sekund. Dodatkowo istnieje opóźnienie związane z transmisją danych, które w przypadku najszybszej formy, czyli gniazd telekomunikacyjnych, wynosi od 0.1 sekundy do 1 sekundy. Obserwatoria po otrzymaniu takiej informacji nakierowują swoje kamery na obszar zawierający współrzędne zjawiska, co również zajmuje czas. Z powodu występowania wyżej wymienionych opóźnień, udaje się obserwować błyski gamma jedynie po ich zakończeniu. Jedynie w niewielu przypadkach udało się zarejestrować optyczny odpowiednik błysku w czasie trwania eksplozji. Projekt „Po of the sky” zakłada odmienny sposób obserwacji RGB, polegający na ciągłym śledzeniu dużej części nieba za pomocą kamer wykonanych w technologii CCD, bez konieczności ich zmiany położenia. Aby zrealizować powyższe założenie, niezbędne jest skonstruowanie teleskopu, który będzie mógł stale śledzić duży wycinek nieba, co umożliwi zrejestrowanie zjawisk z dużym prawdopodobieństwem. Niemożliwa jest jednak realizacja tego za pomocą jednej kamery CCD, ponieważ wraz ze wzrostem pola widzenia kamery spada jej czułość i tym samym mniej zjawisk może zostać zaobserwowanych. Rozwiązaniem tego problemu jest instalacja wielu kamer, z których każda będzie pokrywać wybrany wycinek 9 Rysunek 1.1: Schemat sieci GCN nieba, co umożliwi obserwacje dużego obszaru nieba oraz szeroki zakres obserwowanych zjawisk. Jednym z założeń systemu jest możliwość obserwacji zjawisk, których jasność dochodzi do 14-15 mag2 . Docelowy system ma składać się z 2 zestawów zawierających po 16 kamer każdy (rysunek 1.2). Pojedyncza kamera będzie pokrywała obszar widzenia 20o x 20o . W sumie cały teleskop będzie pokrywał pole widzenia jakie posiada satelita Swift czyli około 1/6 całego nieba. Dwa zestawy kamer będą zainstalowane w dwóch oddalonych od siebie o około 100 km obserwatoriach. Umożliwi to odrzucić błyski optyczne spowodowane przez obiekty znajdujące się blisko powierzchni ziemi za pomocą efektu paralaksy3 . System dokonuje akwizycji nieba z czasem naświetlania 10 sekund, jedno zdjęcie zawiera ok. 8 MB danych, co powoduje że jedna kamera generuje około 2,9GB danych w ciągu godziny. W ciągu nocy cały system wytwarza około 1,1TB i jest to zbyt duża ilość danych aby mogła być w całości przechowywana. Dodatkowo informacja o błysku pochodząca z sieci GCN jest otrzymywana z opóźnieniem. Powoduje to, że system musi posiadać moduł umożliwiający automatyczną detekcję rozbłysków i na podstawie jego wyników działania powinien zapisywać zdjęcia zawierające jedynie interesujące obserwacje. Detekcja nagłych pojaśnień odbywa się trzyeta2 Magnitudo – jednostka wielkości gwiazdowej, poza układowej jednostki miary stosowanej do oznaczania blasku gwiazd. Najjaśniejsze gwiazdy mają wielkość 1 mag, najsłabsze, widoczne gołym okiem 6 mag – skala odwrócona [14]. 3 Paralaksa – efekt niepokrywania się dwóch obrazów wynikający z obserwowania obiektów z dwóch różnych kierunków [11]. 10 Rysunek 1.2: Pojedynczy zestaw kamer projektu π of the Sky. powo. Pierwszy etap jest najprostszy, gdyż musi być szybki ze względu na dużą ilość danych jakie musi przetworzyć. Jego głównym celem jest wyselekcjonowanie interesujących danych oraz odrzucenie nieznaczących danych. Zadaniem drugiego poziomu detekcji jest odrzucenie tej części spośród wcześniej wyselekcjonowanych zdjęć, na której wykryte błyski spowodowane były przez obiekty znajdujące się blisko powierzchni Ziemi, takie jak samoloty bądź sztuczne satelity. Trzeci ostatni poziom detekcji polega na bardziej szczegółowej analizie zdjęć, które zostały zaakceptowane przez dwa poprzednie poziomy. W czerwcu 2004 roku został uruchomiony prototyp systemu w Las Campanas Observatory (LCO) w Chile, gdzie może monitorować obszar nieba który jest w polu widzenia satelity Swift. Działa on do dziś, z kilkoma miesiącami przerwy, od czasu kiedy został utworzony. Głównym celem stworzenia prototypu było przetestowanie oprogramowania i sprzętu jaki ma zostać użyty w finalnej wersji systemu. W szczególności bardzo ważne było sprawdzenie efektywności działania algorytmów służących do automatycznej detekcji błysków. Prototyp składa się z dwóch kamer CCD, których konstrukcja została zaczerpnięta z projektu ASAS i ich łączne pole widzenia wynosi 21o x 21o (rysunek 1.3). Dzięki pełnej automatyzacji może być on w pełni kontrolowany za pomocą połączenia internetowego. Dodatkowo system samodzielnie reaguje na informacje o RGB przesyłane za pomocą GCN i sam zmienia położenie kamer aby móc obserwować zjawisko. Montaż na którym znajdują się kamery może zmienić swoje położenie, tak aby obserwować 11 Rysunek 1.3: Kamery prototypu projektu „Pi of the Sky” w LCO w Chile. dowolny punkt na niebie, w czasie krótszym niż minuta. Większość oprogramowania, które jest używane w eksperymencie, została samodzielnie zaprojektowana lub zaczerpnięta z projektu ASAS4 (All Sky Automated Survey). Mimo iż prototyp nie działa bardzo długo ma już na swoim koncie sukcesy w skali światowej. 1.2.2 Wykrywanie pozostałych zjawisk astrofizycznych Wykrywanie nagłych rozbłysków optycznych i ich opis możliwy jest dzięki analizie off-line danych, które zostały wcześniej wykryte przez algorytmy automatycznej detekcji błysków. Pierwszy krok analizy zebranych zdjęć polega na analizie fotometrycznej, dzięki której odnajdywane są gwiazdy na obrazie i określane jest ich pozycja (x, y) oraz ich jasność. Następnym krokiem jest analiza astrometryczna zdjęć, która polega na przeliczeniu wcześniej uzyskanych współrzędnych obiektów (x, y) na współrzędne niebieskie czyli rektascensje 5 i deklinacje 6 . Opis każdego 4 ASAS – polski projekt automatycznych teleskopów stale monitorujących około 107 gwiazd na niebie. Zlokalizowany jest w Obserwatorium Las Campanas w Chile [3]. 5 Rektascensja – kąt dwuścienny pomiędzy południkiem przechodzącym przez punkt Barana, a południkiem przechodzącym przez dany obiekt. Mierzy się ją od punktu równonocy wzdłuż równika i liczy w zakresie od 0o do 360o ale częściej podaje się jej wartość w mierze godzinnej (od 0h do 24h) [4]. 6 Deklinacja – kąt środkowym między kierunkiem na dany obiekt a jego rzutem na płaszczyznę równika. Liczona jest od 0o do 90o dla punktów na półkuli północnej i od od 0o do −90o dla punktów na półkuli południowej [4]. 12 wykrytego obiektu na niebie za pomocą współrzędnych niebieskich zapewnia jego jednoznaczną identyfikacje. Tak uzyskane wyniki są następnie zapisywane w katalogu gwiazd, który jest zorganizowany za pomocą relacyjnej bazy danych DB2 Enterprise 9.5. Struktura bazy danych jest odpowiednio zoptymalizowana pod kątem specyficznych zapytań, które są wykorzystywane przez aplikacje mające za zadanie wykrywanie zjawisk astrofizycznych. Programy te wykorzystują dwa algorytmy. Pierwszy z nich wyszukuje nowe pozycje w bazie danych, które odpowiadają nagłym pojaśnieniom gwiazd, przez co stają się one widoczne. Przykładem takiego zdarzenia może być eksplozja gwiazdy nowej. Drugi z nich poszukuje nagłych zmian jasności gwiazd w stosunku do wcześniej wykonanych obserwacji. Odpowiada to gwieździe rozbłyskowej bądź aktywnej galaktyce, w szczególności blazarowi. 1.2.3 Największe osiągnięcie projektu Teleskop projektu π of the Sky 19 marca 2008 roku otrzymał informację o błysku gamma GRB080319A z sieci GCN, który został wykryty przez satelitę Swift. Standardową procedurą jest nakierowanie przez system kamer na część nieba, w którym miało miejsce zjawisko. Rejestracja zdarzenia zakłada dłuższą obserwację, po jego zajściu, obszaru nieba w którym zdarzenie miało miejsce. W tym właśnie czasie, 28 minut po błysku GRB080319A w polu widzenia, na które był skierowany teleskop, nastąpił drugi błysk GRB080319B i został on wykryty przez systemowy algorytm detekcji błysków. Dwie sekundy później promieniowanie gamma, które towarzyszyło zjawisku zostało zarejestrowane przez satelitę Swift. Informacja o jego wykryciu dotarła przez sieć GCN do innych teleskopów naziemnych dopiero 17 sekund później. Sam Swift wyposażony jest w pokładowy ultrafioletowy i optyczny teleskop pokładowy ”UVOT” [7], jednakże zaczął on filmować zjawisko dopiero 51 sekund po wykryciu promieniowania. Dla porównania Very Large Telescope w Chile zaczął obserwacje zjawiska dopiero godzinę po jego zaistnieniu. Dzięki temu, że drugi błysk gamma miał miejsce w polu widzenia teleskopu projektu, udało się zarejestrować RGB w momencie eksplozji, a nie tylko poświaty optycznej, która zostaje po niej. Nigdy przedtem się to nie zdarzyło i jest to kluczowe do zrozumienia i wytłumaczenia tego zjawiska. Dodatkowo GRB080319B był najjaśniejszym błyskiem, jaki kiedykolwiek został zaobserwowany przez człowieka. Jasność jaką zarejestrował teleskop projektu wynosi 6 w skali magnitudo, co oznacza, że błysk był widoczny gołym okiem. Szacuje się, że eksplozja, która była źródłem błysku, była oddalona od Ziemi o 7,5 miliardów lat świetlnych, co odpowiada połowie odległości do krańców widzialnego Wszechświata. Najprawdopodobniej źródłem zdarzenia była śmierć masywnej gwiazdy, która dała początek czarnej dziurze [2]. Wykrycie powyższego zjawiska potwierdza słuszność metody działania jaką przyjął projekt π of the Sky. Mimo, iż na razie działa jedynie prototyp syste13 mu, to jest on wstanie wykryć bardzo znaczące zjawiska w zakresie zjawisk szybko zmiennych. 1.3 Miejsce tej pracy w projekcie π of the Sky Jednym z najważniejszych problemów z jakim styka się projekt π of the Sky jest wspomniana wcześniej detekcja nagłych pojaśnień w polu widzenia teleskopu, która działa w czasie rzeczywistym. Kluczowym elementem w tym zagadnieniu jest odrzucenie błysków pochodzących od obiektów znajdujących się blisko powierzchni Ziemi. Mogą to być przelatujące samoloty lub sztuczne satelity, które odbiją światło emitowane przez słońce. Co prawda odwzorowanie większości błysków takiej klasy obiektów posiada całkiem inny kształt, niż odwzorowanie błysku spowodowanego przez zjawisko astrofizyczne. Jednak nawet stosunkowo mała część zdarzeń pochodzących od obiektów znajdujących się blisko, może stanowić duży problem. W docelowym systemie rozwiązaniem tego problemu ma być działanie dwóch obserwatoriów oddalonych od siebie o 100 km. Dzięki nim będzie możliwe zastosowanie metody paralaksy do odrzucenia niepożądanych błysków. Pozycja zarejestrowanych zdarzeń spowodowanych przez obiekty nie będące gwiazdami względem pozycji ciał niebieskich, których pozycja jest ogólnie znana, będzie się różniła, jeżeli zostanie zmierzona z dwóch miejsc na Ziemi, oddalonych od siebie o stosunkowo duży dystans. W prototypowej wersji systemu zastosowano powyższą metodę jedynie tylko przez parę nocy. Było to możliwe dzięki współpracy z teleskopem RDOT [1], który znajduje się 30 km od teleskopu projektu π of the Sky. Na podstawie wykonanego eksperymentu potwierdzono poprawność działania powyższej metody: odrzucała ona przypadki błysków spowodowanych przez sztuczne satelity ziemskie. Podczas normalnego działania prototypu nie jest możliwe ciągłe użycie efektu paralaksy do odrzucania błysków pochodzących od satelitów. Dlatego w celu identyfikacji niepożądanych błysków używa się bazy danych, która zawiera trajektorie lotu wszystkich znanych satelitów. Każdej nocy pobierana jest zawartość bazy, która składa się z opisu około 10000 elementów znajdujących się na orbicie okołoziemskiej. Dla każdego wykonanego zdjęcia wyznacza się satelity, które mogą się na nim znajdować oraz ich współrzędne. Każdy błysk, który jest potencjalnym zdarzeniem jest porównywany z wyznaczonymi satelitami. Odrzucone zostają błyski, których odległość kątowa jest mniejsza niż 0, 5o w stosunku do obliczonej pozycji wyznaczonego satelity. Baza danych obiektów znajdujących się na orbicie okołoziemskiej nie jest jednak kompletna. Nie zawiera ona wpisów dotyczących satelitów, których istnienie nie jest ogólnie znane lub jest tajne (np. satelitów szpiegowskich). W takim przypadku istnieje możliwość porównania kilka zdjęć następujących po sobie aby za14 obserwować tor lotu obiektu. W ten sposób odrzucana jest duża liczba samolotów i satelitów nie znajdujących się w bazie danych. Istnieje jednak prawdopodobieństwo, że satelity posiadające własne źródło światła i wykonujące ruch obrotowy wokół własnej osi nie zostaną odrzucone. Ostateczną częścią weryfikacji zjawiska jest jego ocena przez osobę która analizuje dane. Ma ona za zadanie ocenić czy algorytm wykrywania nagłych błysków zadziałał prawidłowo, ponieważ nie ma pewności, że wyżej wymieniony algorytm działa ze stuprocentową poprawnością. Weryfikacja prowadzona jest poprzez odczytywanie dokładnych wartości pikseli obrazu. Mogą one być porównywane z danymi zebranymi w bazie danych w ciągu trwania projektu bądź z danymi udostępnionymi przez inne jednostki badawcze takie jak inne obserwatoria lub satelity. Jest to możliwe dzięki algorytmowi, który wyznacza współrzędne niebieskie każdego piksela na podstawie danych zapisanych w nagłówku pliku FITS. Finalne wyniki obserwacji kopiowane są z obserwatorium na lokalny serwer znajdujący się w Warszawie. Zarówno wyniki obserwacji nieba zapisane w formacie FITS, jak i dane znajdujące się w bazie danych projektu dostępne są poprzez interfejs WWW. Umożliwia to ostateczną ocenę zaobserwowanych zjawisk i ich potwierdzenie w większości przypadków. Nie jest to jednak wystarczające, ponieważ istniejący interfejs nie ma możliwości wyświetlania obrazów oraz danych zapisanych w plikach FITS. Aktualnie obrazy prezentowane są za pomocą formatu JPG co powoduje, że nie ma możliwości pobrania wartości wybranych pikseli i nie da się określić ich współrzędnych niebieskich. Gdy potencjalny błysk wzbudza wątpliwości osoby analizującej zdarzenie, zmuszona jest ona do pobrania serii zdjęć na swój lokalny komputer. Dodatkowo serie obrazów przechowywane są w skompresowanych archiwach tar.gz, co powoduje konieczność wykonywania dodatkowych czynności związanych z ich dekompresją i dearchiwizacją. Dopiero wtedy można rozpocząć analizować zdjęcia w jednej z dostępnych przeglądarek plików FITS. Implementacja przeglądarki działającej przez WWW dla plików astronomicznych uzupełni istniejący interfejs w narzędzie do analizy wykrytych zjawisk przez system i dodatkowo da możliwość publikacji zjawisk wykrytych dla szerszej publiczności, która nie będzie zmuszona do instalacji dodatkowego oprogramowania na swoim komputerze. 15 Rozdział 2 Standard FITS FITS (Flexible Image Transport System) jest formatem, który został stworzony w celu przechowywania oraz transmitowania obrazów pozyskanych w celach naukowych. Głównym powodem jego utworzenia była standaryzacja formy przechowywania danych astronomicznych. Został on wprowadzony w latach siedemdziesiątych przez NASA (National Aeronautics and Space Administration) oraz Międzynarodową Unię Astronomiczną i jest wspierany poprzez te organizacje po dzień dzisiejszy. 2.1 Struktura plików FITS Podstawowymi elementami z których składa się każdy plik są bloki danych (Header and Data Unit – HDU ) zawierające nagłówek oraz obszar danych. Plik posiada jeden lub więcej takich bloków, których długość wyrównana jest do 2880 bajtów. Pierwszym znajdującym się w pliku elementem jest podstawowy blok danych nazywany Primary HDU lub Primary Array. Składa się on z nagłówka oraz podstawowego obszaru danych zawierającego obraz zapisany za pomocą n-wymiarowej tablicy pikseli. Jeżeli plik zawiera tylko jeden blok HDU uznawany jest jako pojedynczy obraz FITS (Single Image FITS – SIF), Natomiast plik zawierający wiele bloków danych określany jest jako FITS posiadający wiele rozszerzeń (Multi-Extension FITS file). Tablica znajdująca się w obszarze danych podstawowego bloku pliku może mieć od 1 do 999 wymiarów. Dane znajdujące się w tablicy prezentowane są jako strumień bitów, którego pierwszy element zapisany jest na pozycji pierwszego bitu podstawowego obszaru danych. Każdy piksel przechowywanego obrazu reprezentowany jest za pomocą pojedynczej komórki tablicy, której wielkość jest ściśle określona. Tablice posiadające więcej niż jeden wymiar zapisane są za pomocą sekwencji, w której indeks pierwszego wymiaru tablicy wzrasta najszybciej, nato16 miast indeks ostatniego wymiaru wzrasta najwolniej, czyli w przypadku tablicy dwuwymiarowej tablica jest zapisywana za pomocą sekwencji wierszy. Nie istnieje wolny obszar ani żaden specjalny znacznik, który oddzielałby zapis poszczególnych wierszy między sobą. Dodatkowo obszar danych każdego bloku HDU musi być wyrównany do długości 2880. Jeżeli tablica nie wypełnia do końca obszaru danych, to powinien on zostać uzupełniony bitami o wartości zero. Indywidualna wartość każdej komórki tablicy powinna być zapisana w konwencji big Endian, czyli najbardziej znaczące bity w bajtach reprezentujących wartość piksela powinny znajdować się na ich pierwszych pozycjach. Zarówno wymiar tablicy jak i rozmiar pojedynczej komórki przechowywany jest w nagłówku podstawowego HDU. Standard zakłada, że każdy z bloków następujących po podstawowym bloku danych posiada jedno z trzech rozszerzeń: • Image Extension – rozszerzenie o podobnej strukturze do podstawowego obszaru danych. Jest używane do przechowywania danych w n wymiarowych tablicach. Każda komórka tablicy przechowuje taką samą ilość danych. • ASCII Table Extension – rozszerzenie umożliwiające przechowywanie katalogów oraz tabel zawierających astronomiczne dane. Obszar danych reprezentuje tabela o ustalonej liczbie kolumn i dowolnej liczbie wierszy. Każda komórka tabeli może zawierać sekwencje znaków ASCII o dowolnej długości. • Binary Table Extension – podobnie jak ASCII Table Extension umożliwia przechowywanie danych astronomicznych w postaci tabeli. Różnica pomiędzy tymi dwoma rozszerzeniami polega na tym, że dane liczbowe znajdujące się w tabeli mogą być przechowywane w postaci binarnej. Dodatkowo każda komórka tabeli może zawierać tablice wartości liczbowych, a nie tylko pojedynczą wartość skalarną. 2.1.1 Nagłówek bloku danych Nagłówek każdego bloku danych składa się z rekordów zawierających słowa kluczowe, które opisują format przechowywanych danych w obszarze danych lub opisują pochodzenie danych. Jego długość jest wyrównana do 2880 bajtów. Każdy rekord nagłówka zawiera 80 znaków ASCII i ma on postać: KEYNAME = value/comment Gdzie KEYNAME jest unikalną nazwą słowa kluczowego w obrębie nagłówka, która składa się maksymalnie z ośmiu znaków ASCII, value jest wartością przypisaną do słowa kluczowego, a comment jest opcjonalnym komentarzem. Przypisywana wartość może mieć następujący format: sekwencji znaków ASCII z zakresu wartości 17 decymalnych 32-126, liczby całkowitej, liczby zmiennoprzecinkowej, stałej logicznej (prawda reprezentowana jest jako znak ‘T’, natomiast fałsz jako znak ‘F’). Słowa kluczowe nagłówka mogą należeć do grupy słów, których znaczenie jest ściśle określone przez standard, lub mogą być dowolnymi opcjonalnymi słowami, których wartości mają znaczenie w konkretnym zastosowaniu. Wymagane jest, aby ostatnim elementem nagłówka było słowo kluczowe END bez przypisanej wartości i bez komentarza oraz aby pozostała część nagłówka potrzebna do wyrównania jego długości do 2880 bajtów została wypełniona znakami spacji. Standard określa zbiory słów kluczowych, które powinny znajdować się w nagłówku podstawowego HDU oraz w nagłówkach HDU posiadających rozszerzenie. Każde ze słów wchodzących w skład tych zbiorów posiada ściśle określone znaczenie oraz ściśle określony format, w jakim prezentowana jest przypisana do niego wartość. Są to słowa wprowadzone w celu jednoznacznego opisu formy, w jakiej zostały zapisane dane w obszarze danych poprzedzającym dany nagłówek, oraz w celu potwierdzenia standardu i ewentualnego określenia rozszerzenia HDU. Zakłada się także, że słowa te powinny znajdować się na początku nagłówka i powinny zostać wymienione w określonej kolejności. W skład słów kluczowych znajdujących się w nagłówku podstawowego obszaru danych wchodzą (słowa wymienione są w kolejności określonej przez standard): • SIMPLE – wartość słowa zawiera stałą logiczną, która określa czy dany plik posiada strukturę zgodną ze standardem. Pole jest obowiązkowe dla podstawowego HDU i nie może występować w nagłówkach bloków następujących po nim. • BITPIX – wartość przypisana do słowa powinna zostać określona za pomocą liczby całkowitej, która przedstawia rozmiar komórki tabeli, znajdującej w obszarze danych poprzedzającym nagłówek. Oznacza ona liczbę pikseli przy pomocy, których zapisany jest pojedynczy element obrazu. Tylko określone wartości mogą zostać przypisane do tego słowa. • NAXIS - Słowo to zawiera nieujemną liczbę całkowitą określającą liczbę wymiarów tabeli która zawiera dane. Może ono przyjmować wartości od 0 do 999. W przypadku zera, nie istnieją żadne dane, które poprzedzają nagłówek w podstawowym HDU. • NAXISn – jest to format w jakim powinne być prezentowane słowa określające wielkość tabeli w każdej jej wymiarze, gdzie n jest indeksem wymiaru. Słowa te powinny być zapisane zgodnie ze wzrastającym indeksem. Rozmiar każdego z wymiarów powinien być przedstawiony za pomocą nieujemnej liczby całkowitej. Jeżeli choć do jednego ze słów przypisana jest wartość 0 oznacza to, że obszar danych następujący po nagłówku nie zawiera danych. 18 • END – słowo nieposiadające przypisanej wartości, oznaczające logiczny koniec nagłówka. Poza przedstawionymi wyżej słowami kluczowymi istnieją także dodatkowe wyrażenia, które muszą być wymienione w nagłówkach bloków danych posiadających rozszerzenie, są to: XTENSION, PCOUNT oraz GCOUNT. Pierwsze z nich określa rozszerzenie HDU i może przyjmować jedynie określone wartości zgodne z ustalonymi oznaczeniami rozszerzeń. Dwa pozostałe słowa opisują struktury danych jakie są zawarte w istniejących rozszerzeniach. Żadne z powyżej wymienionych słów nie może znajdować się w nagłówku podstawowego HDU. Oprócz obowiązkowych słów istnieje także zbiór słów zarezerwowanych. Ich format oraz znaczenie jest określone przez standard. Są one podzielone na następujące kategorie: ogólne słowa opisujące plik, słowa opisujące obserwacje zjawiska zawartego w pliku, słowa bibliograficzne, słowa zawierające komentarz, słowa opisujące tabele przechowujące dane oraz słowa opisujące rozszerzenia. Z punktu widzenia odczytu oraz prezentacji obrazów zawartych w plikach FITS w podstawowym bloku oraz w blokach o rozszerzeniu Image Extension, bardzo ważna jest grupa słów, która opisuje tabele przechowujące piksele obrazów. Niektóre z nich to: • BSCALE – słowo, które jest używane wraz ze słowem BZERO w celu liniowego przeskalowania wartości znajdującej się w każdej komórce tabeli do odpowiadającej jej fizycznej wartości. Wartość ta obliczana jest na podstawie równania 2.1 . Wartość tego słowa powinna być zapisana za pomocą liczby zmiennoprzecinkowej. Jeżeli dane słowo nie występuję w nagłówku przyjmuje się jego domyślną wartość równą 1,0. • BZERO – drugie ze słów służących do liniowego przeskalowania wartości znajdujących się w tabeli do odpowiadających im wartości fizycznych. Przekształcenie wykonywane jest według wzoru 2.1. Słowo to również powinno być reprezentowane za pomocą liczby zmiennoprzecinkowej. y 0 = BZERO + BSCALE ∗ y 2.1.2 (2.1) Format wartość przechowywanych w tabeli podstawowego bloku danych Format danych, w którym zapisane są wartości w pojedynczej komórce tabeli, określony jest za pomocą słowa kluczowego BITPIX. Standard wymienia dozwolone typy danych oraz przypisuje im odpowiadającą wartość słowa BITPIX. Dozwolone wartość słowa to: • 8 – oznacza, że dana zawarta w komórce tabeli zapisana jest za pomocą ośmiobitowej liczby całkowitej bez znaku. 19 • 16 – wartość komórki tabeli zapisana jest za pomocą dwóch bajtów przedstawiających liczbę całkowitą ze znakiem. • 32 – komórka tabeli przedstawia czterobajtową liczbę całkowitą ze znakiem. • 64 – komórka tabeli zawiera ośmiobajtową liczbę całkowitą ze znakiem. • -32 – komórka tabeli zawiera liczbę zmiennoprzecinkową, której reprezentacja zgodna jest ze standardem zapisu określonym przez ANSI/IEEE-754. Zapisana jest ona za pomocą czterech bajtów. • -64 – komórka tabeli zawiera liczbę zmiennoprzecinkową, której reprezentacja zgodna jest ze standardem zapisu określonym przez ANSI/IEEE-754. Liczba zapisana jest za pomocą ośmiu bajtów. Z uwagi na to, że standard FITS nie wspiera zapisu liczb całkowitych bez znaku (z wyjątkiem liczb całkowitych zapisanych za pomocą jednego bajta) niemożliwe jest przechowywanie liczb całkowitych bez znaku zapisanych za pomocą dwóch, czterech lub ośmiu bajtów. Proponowanym rozwiązaniem tego problemu przez standard jest przesuniecie zakresu liczb bez znaku do zakresu liczb ze znakiem. Realizowane jest to poprzez określenie wielkości przesunięcia w słowie kluczowym BZERO oraz przypisaniu słowu kluczowemu BSCALE wartości 1.0. Podczas odczytu prawidłowa wartość liczby powinna zostać określona za pomocą wzoru 2.1. 2.2 Pliki FITS używane w projekcie π of the Sky Wszystkie zdjęcia nieba wykonane przez teleskop projektu π of the Sky zapisywane są za pomocą formatu FITS. Zaliczają się one do kategorii Single Image FITS, czyli zwierają tylko podstawowy blok danych przedstawiający obraz. Wszystkie dane opisujące dokonaną obserwacje zapisywane są za pomocą słów kluczowych, znajdujących się w nagłówku. 2.2.1 Format zapisu obrazu Obraz pochodzący z kamery CCD projektu zapisywany jest za pomocą dwuwymiarowej tablicy danych. Każdy piksel przedstawiony jest w szesnastobitowej skali szarości i reprezentowany jest za pomocą dwubajtowej liczby całkowitej bez znaku. Daje to 65536 możliwych odcieni w skali szarości. Z uwagi na to, że format FITS nie obsługuje liczb całkowitych bez znaku, wartości obrazu są przesuwane w zakres dwubajtowych liczb całkowitych ze znakiem poprzez odjęcie od wartości każdego piksela liczby równej 32768. Dodatkowo obraz przed zapisem może zostać przekształcony przez oprogramowanie kamery. Przekształcenie to polega 20 na wykonaniu odbicia lustrzanego obrazu względem osi OX lub względem osi OY kartezjańskiego układu współrzędnych. Fizyczna wielkość tabeli zawierającej obraz wyrażona w bitach obliczana jest na podstawie iloczyny słów kluczowych NAXIS1, NAXIS2 oraz BITPIX. 2.2.2 Fragmenty obrazów Format plików FITS nie stosuje żadnego rodzaju algorytmu kompresji danych. Powoduje to, że jedno wykonane zdjęcie przez kamerę projektu zapisywane jest w pliku, którego wielkość przekracza 8 MB pamięci. Chcąc zobrazować zjawisko astrofizyczne należy przedstawić obszar nieba, w którym miało ono miejsce za pomocą serii zdjęć, która zawiera zdjęcia pokazujące stan nieba przed, w trakcie, oraz po czasie trwania zdarzenia. Taka seria zdjęć może zawierać kilkanaście elementów. Dodatkowo w trakcie jednej nocy może zostać wykrytych kilkanaście zdarzeń. Przesyłanie takiej dużej ilości danych z obserwatorium na serwer znajdujący się w Warszawie może w znacznym stopniu obciążać łącze internetowe znajdujące się w obserwatorium. W celu redukcji wielkości przesyłanych danych, wykryte zjawisko prezentuje się za pomocą plików FITS zawierających jedynie fragmenty pierwotnych obrazów. Pojedynczy plik posiada prawie takie same wartości słów kluczowych jak odpowiadający mu plik przedstawiający zdjęcie uzyskane bezpośrednio z kamery. Różnią się przede wszystkim wartością dwóch słów kluczowych określających wielkość tablicy przechowującej piksele obrazu. Dla porównania obraz pochodzący bezpośrednio z kamery posiada rozdzielczość równą 2062 x 2048, natomiast fragment obrazu posiada rozdzielczość równą 100 x 100. Dodatkowo w plikach zawierających fragmenty obrazu zdefiniowane są cztery słowa niewystępujące w pierwotnych plikach. Są to: EVTX0, EVTY0, ORGSIZEX oraz ORGSIZEY. Dwa pierwsze z nich określają położenie wycinka obrazu względem początku dużego obrazu. Czyli są to współrzędne odpowiednio x i y pierwszego piksela fragmentu obrazu względem pierwszego piksela dużego obrazu posiadającego współrzędne x i y równe (0, 0). Następne dwa dodatkowe słowa kluczowe zawierają wielkości określające szerokość oraz wysokość oryginalnego obrazu, z którego pochodzi wycinek. 2.2.3 Używane słowa kluczowe Słowa które są używane w plikach projektu można podzielić na następujące kategorie: słowa kluczowe wymagane przez standard, słowa opisujące obserwowany obiekt, słowa opisujące źródło pochodzenia pliku, słowa opisujące kamerę użytą do wykonania zdjęcia, słowa zawierające systemowy identyfikator zdjęcia, słowa opisujące ustawienia kamery, słowa opisujące warunki wykonania zdjęcia, słowa 21 opisujące datę wykonania obserwacji, słowa zwierające dane astrometryczne, słowa zawierające dane fotometryczne oraz słowa opisujące położenie kamery. Pierwsza z powyższych kategorii zawiera wyłącznie słowa zdefiniowane przez standard, natomiast wszystkie pozostałe kategorie składają się ze słów należących do grupy słów opcjonalnych według standardu FITS. Dodatkowa grupa słów została zdefiniowana na potrzeby realizacji projektu. Najważniejszymi z nich z punktu widzenia zaimplementowanej aplikacji są: • RA – słowo zawiera wartość określająca rektascensję wyrażoną w godzinach punktu znajdującego się na środku obrazu. Prezentowana jest ona za pomocą liczby zmiennoprzecinkowej. • DEC – słowo zawiera wartość określającą deklinację wyrażoną w stopniach punktu znajdującego się na środku obrazu. • FLIP – słowo kluczowe określające rodzaj wykonanej operacji odbicia lustrzanego obrazu przed zapisaniem go do pliku. Wartość 0 oznacza brak odbicia lustrzanego obrazu, wartość 2 oznacza odbicie lustrzane obrazu względem osi OY , wartość 3 oznacza odbicie lustrzane obrazu względem osi OX. • AST ORD – słowo kluczowe określające kolejność wykonywania równań stosowanych w procedurze przekształcającej wektor określający przesunięcie wybranego punktu obrazu od jego środka, wyrażony w układzie współrzędnych kartezjańskich, do wektora wyrażonego w układzie współrzędnych niebieskich. Wartość słowa wyrażona jest jako liczba całkowita. • PAR X 0, PAR X 1, . . . , PAR X 20 – słowa kluczowe zawierające współczynnik stosowane w procedurze przekształcenia wektora odległości z kartezjańskiego układu współrzędnych do układu współrzędnych niebieskich. • PAR Y 0, PAR Y 1, . . . , PAR Y 20 – słowa kluczowe zawierające współczynnik stosowane w procedurze przekształcenia wektora odległości z kartezjańskiego układu współrzędnych do układu współrzędnych niebieskich. Dodatkowymi słowami znajdującymi się wyłącznie w plikach obrazujących fragment oryginalnego zdjęcia są: • EVTX0 – słowo określa współrzędną x pierwszego piksela fragmentu obrazu względem pierwszego piksela pierwotnego obrazu. Wartość zapisana jest w formacie liczby całkowitej. • EVTY0 – słowo określa współrzędną y pierwszego piksela fragmentu obrazu względem pierwszego piksela pierwotnego obrazu. Wartość zapisana jest w formacie liczby całkowitej. 22 • ORGSIZEX – słowo określa szerokość pierwotnego obrazu, z którego pochodzi fragment. Zapisana jest w formacie liczby całkowitej. • ORGSIZEY – słowo określa wysokość pierwotnego obrazu, z którego pochodzi fragment. Zapisana jest w formacie liczby całkowitej. 2.2.4 Paczki obrazów Pliki zawierające fragmenty obrazów uzyskanych za pomocą kamer projektu opisywane są za pomocą tzw. list. Jedna lista zawiera spis plików uzyskanych z jednej kamery przedstawiający jedno wykryte zjawisko. Jest ona zpisana jako plik tekstowy, w którym zapisane są nazwy plików FITS. Nazwa każdego z elementów listy zapisywana jest w oddzielnej linii, w kolejności zgodnej z przebiegiem zjawiska. Nie jest dokładnie sprecyzowana nazwa pliku tekstowego zawierającego listę, ale zawiera ona zazwyczaj słowo list oraz cyfrę oznaczającą numer listy opisującej zjawisko. Wymagane jest również, aby wszystkie pliki należące do listy znajdowały się razem z nią w jednym folderze. Oprócz list zawierających fragmenty pozyskanych obrazów za pomocą kamer, mogą również być tworzone spisy plików zawierające obrazy uzyskane poprzez uśrednienie paru kolejnych zdjęć obrazujących zdarzenie. Listy przedstawiające zjawiska zapisywane są razem w tzw. paczce, która jest folderem zawierającym powyższe listy i ich elementy oraz pliki przechowujące wyniki analiz fotometrycznych zdjęć. Paczki są przysyłane oraz przechowywane w formie skompresowanych archiwów tar.gz. 23 Rozdział 3 Opis zaimplementowanej przeglądarki plików FITS 3.1 Wybrana technologia i wykorzystywane biblioteki Głównym kryterium wyboru technologii zaimplementowanej przeglądarki plików FITS było spełnienie wymagania dotyczącego możliwości jej uruchomienia w środowisku przeglądarki internetowej. Drugim branym pod uwagę wymaganiem była prezentacja obrazów zapisanych w szesnastobitowej skali szarości, w możliwie najlepszej jakości. Dodatkowo, aby obsługa aplikacji stała się wygodna ważna, była również dobra interakcja programu z użytkownikiem. Istniały dwie możliwości spełnienia powyższych wymagań. Pierwsza polegała na prezentacji obrazów w kodzie HTML oraz spełnieniu wymagań funkcjonalnych dotyczących aplikacji przy pomocy języka JavaScript i technologii AJAX. Alternatywnym rozwiązaniem była implementacja przeglądarki w formie apletu Javy. Spośród tych możliwości zostało wybrane drugie rozwiązanie, przede wszystkim dlatego, że w przypadku wykonywania operacji graficznych i metod przetwarzania obrazów po stronie serwera niezbędne było by ciągłe pobieranie nowych zdjęć przedstawiających wykonane operacje. Mogło by to być uciążliwe dla użytkownika ponieważ w przypadku dużych zdjęć musiałby długo czekać aby zobaczyć rezultat. Aplikacja została zaimplementowana w języku Java Platform Standard Edition w wersji szóstej, w formie apletu oraz analogicznego programu. Wykorzystuje ona następujące biblioteki: • nom.tam.fits – biblioteka napisana w języku Java, umożliwiająca odczyt i zapis plików FITS. Wspomaga ona obsługę podstawowych HDU oraz bloków danych posiadających rozszerzenia zdefiniowane w standardzie. Obraz zapisany w podstawowym bloku zwracany jest jako tablica obiektów klasy 24 java.lang.Object. Pakiet ten również posiada interfejs umożliwiający pobieranie wartości słów kluczowych nagłówka poprzez podanie ich nazw jako argumentów wywołania funkcji. • com.ice.tar – biblioteka zaimplementowana w języku Java pozwalająca na tworzenie oraz rozpakowywanie archiwów tar. W połączeniu z pakietem java.util.gzip, wchodzącym w skład standardowej biblioteki Javy, możliwa jest również obsługa skompresowanych archiwów tar.gz. • org.apache.commons.httpclient – biblioteka napisana w języku Java, dająca większą funkcjonalność podczas komunikacji za pomocą protokołu HTTP niż standardowa biblioteka java.net. Umożliwia między innymi przesyłanie danych za pomocą metody POST. Z implementacją aplikacji w formie apletu związane są również pewne ograniczenia. Domyślnie każda przeglądarka internetowa nakłada następujące ograniczenia uruchamiając pobrany z sieci aplet [6]: • aplet nie może ładować bibliotek ani definiować natywnych metod, • nie może on czytać ani zapisywać plików na lokalnym komputerze, • nie może komunikować się z innym serwer niż ten, z którego został pobrany, • nie może tworzyć procesów potomnych na lokalnym komputerze, • nie może czytać części zmiennych środowiskowych na lokalnej stacji roboczej, • okna wyświetlane przez aplet wyglądają inaczej niż okna wyświetlane przez aplikacje. Z punktu widzenia wymagań dotyczących zaimplementowanej aplikacji istotne są ograniczenia dotyczące możliwości czytania i zapisywania plików na lokalnej maszynie oraz możliwości komunikowania się z innym serwerem niż ten, z którego został pobrany aplet. W pierwszym przypadku nie istnieje możliwość przetwarzania plików na lokalnym komputerze, natomiast w drugim przypadku niemożliwe jest pobieranie pliku z dowolnego adresu URL. Jednym z rozwiązań pozwalającym na przyznanie pełnych praw apletowi jest jego podpisanie za pomocą certyfikatu. W tym przypadku przeglądarka internetowa podczas uruchamiania apletu wyświetli okno dialogowe, przez które użytkownik będzie mógł zdecydować czy zaufać osobie, która stworzyła certyfikat i zezwolić lub nie na wykonywanie wszystkich operacji dla apletu. Zostało to zrealizowane poprzez wygenerowanie certyfikatu przy użyciu narzędzia keytool oraz podpisanie pliku JAR zawierającego kod programu za pomocą aplikacji jarsigner. Oba użyte narzędzia dostarczane są wraz z JDK przez firmę Sun. 25 3.2 Struktura aplikacji Poniżej zostaną omówione najważniejsze elementy struktury zaimplementowanej aplikacji. W każdym podpunkcie zostanie przedstawiony sposób realizacji danej części programu oraz zostaną wymienione jej funkcje. 3.2.1 Reprezentacja obrazu W celu uniezależnienia wyświetlania obrazu od sposobu jego zapisu w podstawowym bloku HDU zostały użyte następujące dwa wzorce projektowe. Pierwszy z nich to Adapter, natomiast drugi to Metoda Fabrykująca. Celem użycia Adaptera było dostosowanie interfejsu klasy java.awt.BufferedImage do wymagań funkcjonalnych stawianych przed zaimplementowaną przeglądarką. Natomiast celem użycia Metody Fabrykującej było ukrycie wyboru konkretnej klasy adaptującej, która powinna być tworzona w zależności od formatu obrazu przechowywanego w pliku FITS. Jedną z funkcjonalności stworzonej aplikacji jest wyświetlanie oryginalnych wartości pikseli przetwarzanego obrazu. Gdy weźmiemy również pod uwagę możliwość wykonywania operacji graficznych na obrazie oraz możliwość wykonywania procedur przetwarzania obrazu to wartości pikseli obrazu mogą ulegać zmianom. Niezbędne jest przez to przechowywanie obiektu reprezentującego oryginalne wartości obrazu oraz obiektu reprezentującego aktualnie przetwarzany obraz. Jest to nieuniknione, ponieważ operacje przetwarzania obrazu takie jak zmiana odwzorowań poziomów jasności są nieodwracalne i nie można uzyskać oryginalnej wartości na podstawie wartości zmodyfikowanej. Z wyżej wymienionego powodu spośród dwóch sposobów realizacji wzorca projektowego Adapter, z których jeden polega na implementacji klasy adaptującej jako klasy dziedziczącej po klasie adaptowanej, a drugi na implementacji klasy zawierającej obiekt klasy adaptowanej, został zastosowany wariant drugi. Typ danych adaptujący obiekty java.awt.BufferedImage został zrealizowana za pomocą abstrakcyjnej klasy fits.image.FitsImageExtention, oraz dla obrazów zapisanych w szesnastobitowej skali szarości, których wyświetlanie jest jedną z podstawowych funkcjonalności programu, jako klasy fits.image.FitsImageExtention. Rozbicie klasy adaptującej na klasę abstrakcyjną oraz klasę dziedziczącą po klasie abstrakcyjnej miało na celu stworzenie możliwości wyświetlania obrazów zawartych w plikach zapisanych w różnym formacie, gdzie każda z możliwych form zapisu obrazu reprezentowana jest jako osobna klasa pochodna. Dodatkowo klasa abstrakcyjna narzuca interfejs, jaki powinien być implementowany przez klasy dziedziczące oraz zawiera grupę gotowych metod, których realizacja jest wspólna dla wszystkich rodzajów obrazów zawartych w podstawowym bloku plików FITS. Realizacja metod abstrakcyjnych znajdujących się w klasie bazowej jest ściśle uza26 leżniona od typu danych reprezentujących piksel obrazu. Wszystkie metody przetwarzania obrazów oraz operacje graficzne zostały zgromadzone w powyższej klasie abstrakcyjnej oraz klasie dziedziczącej po niej. Miało to na celu oddzielenie danych oraz możliwości ich przetwarzania od sposobu ich prezentacji oraz grupowania ich w postaci tzw. list. Wzorzec Metoda Fabrykująca zrealizowany jest poprzez zaimplementowanie klasy fits.image.FitsImageFactory, która dostarcza metodę statyczną getFitsImageExtention, zwracającą referencję do obiektu typu fits.image.FitsImageExtention. Metoda ta ma za zadanie zwrócić odpowiedni obiekt będący instancją jednej z klas adaptacyjnych dla obrazu zawartego w podstawowym HDU pliku FITS, na podstawie pobranego argumentu wywołania typu java.io.File reprezentującego plik w lokalnym systemie plików. Wybór odpowiedniego wyniku funkcji polega na odczytaniu z nagłówka podstawowego bloku danych słowa kluczowego BITPIX oraz na utworzeniu na podstawie jego wartości instancji odpowiedniej klasy pochodnej. Dodatkową funkcją powyższej metody jest weryfikacja poprawności przetwarzanych plików poprzez sprawdzenie wartości słowa kluczowego SIMPLE, potwierdzającego zgodność z standardem. Jedną ze zrealizowanych funkcjonalności jest także możliwość pobierania zaznaczanego fragmentu obrazu. Umożliwione to zostało poprzez stworzenie obiektu zawierającego fragment obrazu, posiadającego ten sam typ co obiekt reprezentujący obraz z którego pochodzi wycinek. Instancja klasy zawierająca fragment przechowywana jest w formie atrybutu obiektu z którego został pobrany fragment. Metoda createFitsImagePart klasy FitsExtentionImage16bitGray tworzy nowy obiekt klasy reprezentujący obraz w szesnastobitowej skali szarości, zawierający wycinek obrazu opisany przez prostokąt, którego współrzędne są zawarte w argumencie wywołania funkcji typu, java.awt.geom.Rectangle2D. Utworzony obiekt przechowywany jest jako prywatny atrybut. Instancja klasy zawierająca obiekt przedstawiający jej fragment umożliwia sprawdzenie jego istnienia poprzez wywołanie funkcji havePartImage, zwracającej wartość logiczną oraz umożliwia pobranie obiektu zawierającego fragment obrazu poprzez wywołanie metody getPartImage. Zarówno instancja obiektu przechowująca obraz, jak i instancja obiektu przechowująca jego fragment, posiada atrybuty, które wskazują na te same obiekty, które są niezmienne i są takie same dla obu obrazów. Możliwe jest to dzięki implementacji prywatnego konstruktora pobierającego, referencje do wspólnych obiektów. Dzięki wyżej przedstawionemu schematowi tworzenia fragmentów obrazów możliwe jest rekursywne pobieranie wycinków zdjęć oraz powracanie z wybranego fragmentu do całości z której pochodzi fragment. 27 Rysunek 3.1: Diagram klas używanych do reprezentacji obrazów. 28 3.2.2 Przetwarzanie list plików W celu zapewnienia przetwarzania list plików używanych do prezentacji zaobserwowanego zjawiska została zaprojektowana klasa fits.viewer.FitsFileManager. Ma ona za zadanie przechowywać informacje na temat obrazów aktualnie przetwarzanych w programie oraz grupować je we wcześniej wspomniane listy lub przedstawiać je w postaci pojedynczych plików. W przypadku plików zgrupowanych razem istnieje również możliwość przechodzenia po kolejnych elementach należących do grupy. Ponieważ aplikacji umożliwia otwieranie wielu list i wielu plików jednocześnie, aktualnie przetwarzane obrazy nie są przechowywane w pamięci operacyjnej przydzielonej aplikacji, lecz jest przechowywana jedynie informacja o położeniu plików zawierających zdjęcia w systemie plików. W przypadku otwierania paczek lub plików, które są otwierane za pomocą podania adresu URL, obrazy i skompresowane archiwa są pobierane i zapisane w tymczasowym katalogu użytkownika. Powyższe założenia zostały zrealizowane poprzez zaadaptowanie klasy javax.swing.tree.DefaultTreeModel prezentującej model drzewa. Wierzchołkami przechowywanymi w drzewie są obiekty klasy FitsFileManager.FitsListNode, która prezentuje pojedynczy plik poprzez zawieranie dwóch atrybutów jakimi są: obiekt reprezentujący pojedynczy plik w systemie plików oraz wartość logiczna określająca czy dany plik jest plikiem zawierającym obraz czy jest plikiem prezentującym listę. Pojedyncze pliki FITS zawierające obrazy są przechowywane w drzewie jako liście znajdujące się na pierwszym poziomie drzewa, natomiast pliki wchodzące w skład jednej listy prezentowane są jako liście znajdujące się na drugim poziomie drzewa, posiadające wspólnego rodzica. Wspólnym poprzednikiem plików należących do jednej listy jest obiekt przedstawiający plik listy. Zadaniem wyżej prezentowanej klasy jest również zawarcie logiki dotyczącej nawigacji po aktualnie przetwarzanych obrazach w aplikacji. W celu zapewnienia tej funkcji klasa ma jeden atrybut typu FitsImageExtention, będący referencją do obiektu przedstawiającego aktualnie wyświetlony obraz. Poprzez udostępnienie dwóch metod, jakimi są setPreviousImage oraz setNextImage, możliwe jest inicjalizowanie obiektów przedstawiających obrazy znajdujące na tej samej liście plików, odpowiednio przed lub za aktualnie przechowywanym obrazem. Do uzyskania nowych obiektów wykorzystywana jest statyczna funkcja getFitsImageExtention klasy fits.image.FitsImageExtention. Po wywołaniu jednej z wymienionych metod nawigacji wartość referencji wskazującej na aktualnie przetwarzany obraz zostaje uaktualniona tak, aby wskazywać na nowo utworzoną instancję klasy. Aktualizacja interfejsu użytkownika wyświetlającego aktualnie przetwarzany obraz realizowana jest za pomocą wywołania funkcji repaintImage, wchodzącej w skład interfejsu fits.viwer.FitsRepaint. Referencja wskazująca na obiekt implementujący przedstawiony interfejs jest jednym z atrybutów klasy. Dodatkowo zaimplementowane zostały dwie pomocnicze metody, umożliwiające sprawdzenie istnienia plików 29 na liście znajdujących się przed i za aktualnie przetwarzanym elementem na liście, są nimi isNextOnTheList oraz isPreviousOnTheList. Klasa adaptująca obiekt przedstawiający drzewo dostarcza dwie funkcje umożliwiające dodawanie elementów do drzewa. Pierwsza z nich, openFile, dodaje nowy węzeł do drzewa na podstawie pobranego argumentu. Nowy węzeł reprezentuje plik FITS zawierający obraz. Drugą zaimplementowaną funkcją jest openFileList, pobierając jako argument plik przedstawiający listę. Ma ona za zadanie wczytać nazwy plików należących do listy oraz utworzyć w modelu drzewa węzeł przedstawiający listę oraz węzły reprezentujące pliki należące do listy, będące dziećmi węzła listy. Dodatkowo funkcja sprawdza czy wymienione pliki znajdują się w odpowiednim katalogu w systemie plików, czyli w tym samym katalogu co plik listy. Dodatkowo zawartość klasy javax.swing.tree.DefaultTreeModel jest prezentowana za pomocą komponentu graficznego javax.swing.JTree. Komponent ten wchodzi w skład interfejsu użytkownika aplikacji, dzięki czemu został wykorzystany mechanizm zdarzeń umożliwiający dodatkową nawigację po przetwarzanych obrazach (rysunek 3.2). Dzięki implementacji słuchaczy zdarzeń pochodzących z myszki oraz klawiatury możliwe jest wybieranie konkretnego obrazu za pomocą kliknięcia oraz przechodzenie po liście za pomocą strzałek klawiatury. Poprzez dodanie menu kontekstowego umożliwione zostało także zamykanie pojedynczych obrazów lub całych list plików. 3.2.3 Pobieranie paczek plików oraz plików FITS Mechanizm pobierania paczek oraz plików realizowany jest poprzez klasę fits.viewer.FitsFrame.URLWindow, mającą za zadanie wyświetlenie okna dialogowego pobierającego adres URL oraz dane potrzebne do autoryzacji połączenia, jeśli jest to wymagane. Następnie klasa ta tworzy nowy pomocniczy obiekt typu fits.util.FitsURLConnection odpowiedzialny za pobranie zasobu z zadanego adresu oraz zapisanie go w tymczasowym katalogu użytkownika. Pobieranie danych wykonane jest przez użycie obiektu klasy java.lang.URL, zwracającego instancję klasy prezentującą połączenie z zadanym zasobem oraz zwracającą strumień pobieranych danych. Po wywołaniu metody Download() utworzonego obiektu klasy FitsURLConnection następuje inicjalizacja i uruchomienie pobierania zasobu w oddzielnym wątku, który zapisuje dane z utworzonego strumienia do nowego pliku w katalogu tymczasowym. W celu powiadomienia klasy URLWindow o zakończeniu procesu pobierania danych lub o jego przerwaniu z powodu błędu albo przerwaniu go przez użytkownika została wykorzystana kolejka zdarzeń biblioteki AWT poprzez dodanie własnego typu słuchacza oraz własnego zdarzenia: odpowiednio interfejsu fits.util.DownloadListener oraz dziedziczącej po zdarzeniu AWT klasy fits.util.FitsDownloadEvent. Implementująca powyższy interfejs klasa URLWindow po otrzymaniu wygenerowanego zdarzenia sprawdza status operacji po30 Rysunek 3.2: Okno interfejsu użytkownika. 31 bierania danych. W przypadku prawidłowego wykonania zadania wywołuje metodę openFile() obiektu typu fits.viewer.FitsFileManager dla pobranych pojedynczych plików FITS. Dla pobranych skompresowanych archiwów tar.gz wykonywana jest dodatkowo operacja dekompresji oraz dearchiwizacji, realizowane przez wywołanie statycznej metody klasy fits.util.TarGzUnpuck. Operacja ta polega na utworzeniu standardowego strumienia danych, zawierającego pobrane archiwum, i przekształceniu go w strumień reprezentujący zdekompresowane dane. Realizowane jest to przez utworzenie obiektu klasy java.io.FileInputStream i zainicjalizowanie na jego podstawie instancji klasy java.util.zip.GZIPInputStream. Przy pomocy otrzymanego obiektu zostaje skonstruowany obiekt klasy com.ice.tar.TarArchive, który posiada metodę wykonywającą operacje dearchiwizacji pobranego strumienia oraz operacje zapisu przetworzonego strumienia do pliku. Następnie tworzony jest obiekt typu fits.viewer.FitsFrame.FitsListFileChooser, mający za zadanie przeszukać rekurencyjnie otrzymany wcześniej, w procesie dekompresji oraz dearchiwizacji katalog, w celu odnalezienia plików zawierających sekwencje zdjęć. Kryterium wyszukiwania jest wystąpienie w nazwie plików ciągu znaków ”list”. Następnie nazwy znalezionych plików wyświetlane są na liście wielokrotnego wyboru w wyświetlonym oknie dialogowym. Po wyborze elementów wywoływana jest dla każdego z nich metoda openFileList() klasy fits.viewer.FitsFileManager. Wyświetlane okno posiada również dodatkową opcję, dostępną pod przyciskiem ”show all files”, która wyświetla w oknie wyboru wszystkie pliki znajdujące się w pobranym folderze. Część opisanej powyżej procedury, dotyczącej dearchiwizacji i dekompresji paczek plików oraz wyboru list w nich zawartych, jest identyczna dla paczek znajdujących się na lokalnym komputerze użytkownika. 3.3 Możliwość rozszerzenia aplikacji Jednym z założeń podczas tworzenia aplikacji była możliwość jej rozszerzenia, aby mogła wyświetlać obrazy zawarte w plikach FITS, zapisane w dowolnym formacie. Aktualnie istnieje możliwość prezentacji obrazów, których piksele zapisane są za pomocą szesnastu bitów. W celu rozszerzenia aplikacji należy zaimplementować klasę dziedziczącą po klasie fits.image.FitsImageExtention reprezentującą jeden z wybranych pozostałych formatów przechowywania obrazów. Nowa klasa powinna zawierać definicję następujących metod: • autoContrast() – funkcja umożliwiająca automatyczną poprawę kontrastu. Powinna ona zmienić wartości pikseli obrazu przechowywanego jako atrybut currentImage klasy BufferedImage. Nie jest z góry narzucony algorytm, jaki powinien być użyty do wykonania tej czynności. W przypadku zaimplementowanej klasy wykorzystana jest zmiana odwzorowań poziomów jasności. 32 • changeImageValues(int min, int max) – funkcja realizująca algorytm zmiany odwzorowań poziomów jasności obrazu. Powinna ona zmieniać wartości obrazu zapisanego jako atrybut currentImage. Wartość pierwszego argumentu oznacza dolny próg odwzorowania, natomiast druga wartość oznacza górny próg. • createFitsImagePart (Rectangle2D.Double rectangle) – funkcja tworząca obiekt reprezentujący fragment obrazu. Współrzędne nowo tworzonego obrazu są przekazywane jako obiekt reprezentujący prostokąt, znajdujący się wewnątrz zdjęcia z którego pobierany jest fragment. Nowo utworzony obiekt powinien być wskazywany przez atrybut fitsImagePart. • gammaCorrection(double correctionValue) – funkcja realizująca korekcję gamma aktualnie wyświetlanego obrazu. Współczynnik korekcji przekazywany jest jako argument typu double. • getCurrentMinMaxValues() – funkcja zwracająca wartości zmian poziomów odwzorowań jasności poprzez obiekt typu java.awt.geom.Point2D. • getNumberOfValues() – funkcja zwracająca liczbę całkowitą typu int, określającą ilość możliwych poziomów jasności obrazu. • getOriginalPoint(int x, int y) – funkcja zwracająca oryginalne położenie piksela na podstawie położenia jego punktu na wyświetlanym obrazie poprzez obiekt typu java.awt.geom.Point2D. Chodzi tu o możliwość uzyskania współrzędnych punktu oryginalnego obrazu na podstawie współrzędnych obrazu wyświetlanego, który może być przekształcony przez wykonie na nim operacji graficznych takich jak: skalowanie, odbicie lustrzane względem osi OX bądź osi OY . Powyższa funkcja niezbędna jest do określenia oryginalnej wartości piksela na podstawie wskazanego piksela na obrazie, którego wartość mogła ulec zmianie. • getPixelValue(int x, int y) – funkcja zwracająca wartość piksela oryginalnego obrazu na podstawie jego położenia na obrazie. Zwracaną wartością jest liczba całkowita typu int. • pixelsAddValue(float value) – funkcja dodająca do obrazu stałą. Wartość dodawanej stałej przekazywana jest jako argument typu float. • rescalePixelsValue(float value) – funkcja mnożąca wartości obrazu przez wartość przekazaną w argumencie jako liczbę typu float. • resetImage() – funkcja zmieniająca aktualnie wyświetlany obraz, czyli atrybut currentImage, tak aby przedstawiał on stan obraz znajdujący się w stanie 33 takim, jak, jest zapisany w pliku. Nie powinien być poddany żadnej operacji graficznej ani zmianie wartości pikseli, czyli powinien być taki sam jak originalImage. • resetImageValues() – funkcja zmieniająca wartości pikseli obrazu tak, aby były zgodne z wartościami oryginalnego obrazu. W odróżnieniu od poprzedniej funkcji wyniki wykonanych operacji geometrycznych na aktualnie wyświetlanym obrazie powinny pozostać niezmienione. • scale(double scaleX, double scaleY) – funkcja skalująca aktualnie wyświetlany obraz czyli obraz, przedstawiany za pomocą atrybutu currentImage. Metoda pobiera dwa argumenty typu double określające odpowiednio wymiar skalowania w poziomie oraz pionie. • symmetryX() – funkcja realizująca lustrzane odbicie aktualnie wyświetlanego obrazu względem osi współrzędnych OX. • symmetryY() – funkcja realizująca lustrzane odbicie obrazu względem osi współrzędnych OY . Oprócz wymienionych funkcji wprowadzono, także grupę metod zwracających wartości określające aktualny stan obrazu. Miało to na celu umożliwienie zachowania wykonanych operacji geometrycznych w trakcie przeglądania jednej listy plików, tak aby użytkownik wykonując operacje na jednym z obrazów należącym do listy nie musiał powtarzać tej czynności podczas wyświetlania następnego elementu listy. W skład tej grupy funkcji wchodzą: • isSymmetryX() – funkcja zwracająca wartość typu boolean określającą czy dany obraz jest odbity względem osi OX. • isSymmetryY() – funkcja zwracająca wartość typu boolean określającą czy dany obraz jest odbity względem osi OY . • getCurentScale() – funkcja zwracająca wartości określające skalę obrazu w poziomie i w pionie poprzez obiekt typu java.awt.geom.Point2D.Double. Osoba rozszerzająca aplikację powinna również zaimplementować konstruktor tworzonej klasy w celu odczytu wartości obrazów zapisanych w pliku oraz inicjalizacji obiektów przechowujących te wartości. W trakcie konstrukcji obiektów nowych klas powinien zostać wywołany konstruktor klasy nadrzędnej. Oprócz implementacji wyżej wymienionych funkcji należy również zmodyfikować metodę getFitsImageExtention klasy fits.image.FitsImageFactory tak, aby na podstawie wczytanej wartości słowa kluczowego BITPIX o wartości odpowiadającej nowo napisanej klasie, zwracała obiekt nowej klasy. 34 Zaprezentowany sposób rozszerzenia aplikacji o możliwość wyświetlania obrazów zapisanych w innym formacie niż szesnastobitowa skala szarości, nie narzuca sposobu wykonywania operacji graficznych na obrazie oraz pozostawia możliwość implementacji dowolnego algorytmu poprawy kontrastu. W pewien sposób również nie określa biblioteki jaka powinna być użyta do odczytu pliku, ale raczej powinna być to biblioteka nom.tam.fits, ponieważ niezbędne jest przekazanie obiektu klasy Header należącej do tej biblioteki, do konstruktora klasy FitsImageExtention. Zasadniczą rzeczą, jaka powinna być zapewniona jest aby klasą reprezentującą wartości obrazu była klasa java.awt.BufferedImage, ponieważ obiekty tej klasy są używane w graficznym interfejsie użytkownika. 3.4 Przekazywanie parametrów apletowi Zaimplementowana aplikacja w formie apletu posiada możliwość czytania wartości parametrów przekazywanych za pomocą znaczników HTML. Podczas inicjalizacji programu w środowisku przeglądarki internetowej zostają pobrane następujące parametry: • FILE – znacznik posiadający przypisany łańcuch znaków zawierający adres URL pliku FITS. • PACKAGE – znacznik posiadający przypisany łańcuch znaków zawierający adres URL paczki stosowanej w projekcie π of the Sky. • LIST 1, . . . , LIST 10 – znacznik posiadający przypisany łańcuch znaków zawierający relatywną ścieżkę położenia pliku, przedstawiającego listę, względem katalogu który zostaje utworzony w procesie dearchiwizacji paczki przekazanej za pomocą parametru PACKAGE. Wszystkie wymienione wyżej parametry są opcjonalne i mogą występować w różnej konfiguracji, lecz podanie znacznika wskazującego na listę bez wyspecyfikowania paczki zostanie zignorowane. Przykładowe parametry wraz z atrybutami służącymi do jego uruchomienia, umieszczonymi w kodzie HTML, wyglądają w następujący sposób: < applet code =" fits / viewer / FitsViewerAplet . class " archive =" FitsViewerAplet . jar " PACKAGE = " http :// www . fuw . edu . pl /~ mmazur / Frame00754 . tar . gz " FILE = " http :// www . fuw . edu . pl /~ mmazur / e ve nt fr a me 50 4_ ca m er a0 _e v en tn o0 _ cu rr fr am e 50 7 . fit " 35 LIST_1 ="/ Frame00754 / Cam0 / list0 " width =100 height =40 > </ applet > Po pobraniu wartości parametrów zawartych w kodzie HTML następuje taka sama procedura jak podczas pobierania zasobu spod zadanego adresu URL. Jedyna różnica polega na tym, że gdy określimy parametry wskazujące na listy, to podczas operacji otwierania paczki użytkownik nie zostanie poproszony o wskazanie plików zawierających listy. 3.5 Połączenie z bazą danych projektu Aplikacja umożliwia połączenie się z dwoma roboczymi bazami danych projektu w celu pobrania informacji na temat gwiazd znajdujących się na obrazie. Zapytanie, którego wynik zostaje prezentowany przez aplikacje polega na poszukiwaniu gwiazd znajdujących się w zadanym okręgu. Posiada ono trzy parametry, z których dwa określają współrzędne niebieskie piksela będącego środkiem okręgu, natomiast trzeci określa promień poszukiwań. Nie istnieje możliwość bezpośredniego połączenia się poza siecią lokalną z serwerami bazodanowymi. Dlatego też, w celu pobierania danych, został wykorzystany istniejący już wcześniej serwer aplikacji działający poprzez WWW. Został on stworzony na potrzeby innej aplikacji, ale umożliwia on między innymi przesłanie za pomocą metody POST, protokołu HTTP, treści zapytania oraz danych niezbędnych do połączenia z wybraną bazą danych. W odpowiedzi zwracany jest plik tekstowy zawierający wynik zapytania. 36 Rozdział 4 Zastosowane metody i algorytmy W zaimplementowanych metodach poprawy kontrastu, takich jak modyfikacja odwzorowań jasności oraz korekcji gamma została użyta pomocnicza struktura danych, jaką jest tablica pośrednia (ang. Look Up Table – LUT). Reprezentowana jest ona jako jednowymiarowa tabela, przechowująca liczby całkowite, o wielkość równej ilości poziomów jasności jakie mogą występować na przetwarzanym obrazie. Jej indeksy odpowiadają luminancji elementów zdjęcia przed wykonaniem przekształcenia, natomiast odpowiadające im elementy zawierają wartości obrazu po wykonaniu przekształcenia. Obliczenie wynikowego obrazu polega na wykonaniu następującego odwzorowania: q(i, j) = LU T [p(i, j)] (4.1) Przy czym q(i, j) jest wartością piksela wynikowego obrazu w punkcie o współrzędnych (i, j) a p(i, j) jest wartością piksela obrazu wejściowego w punkcie (i, j). Wartości tablicy pośredniej zostają wyznaczone w poniższy sposób: LU T [p(i, j)] = f (p(i, j)) (4.2) Gdzie f jest funkcją 4.4 lub funkcją 4.5, p(i, j) wartością elementu zdjęcia o współrzędnych (i, j), a LU T symbolizuję tablicę pośrednią. W opisanych niżej metodach poprawy jakości wyświetlanego zdjęcia stosowany jest również histogram obrazu. Ma on za zadanie przedstawić rozkład prawdopodobieństwa występowania poszczególnych możliwych jasności na zdjęciu. Wyznaczenie jego wartości można przedstawić za pomocą funkcji P (fi ) = ni /N (4.3) gdzie P (fi ) jest wartością histogramu dla jasności fi , ni jest liczbą pikseli w obrazie o jasności fi , natomiast N jest liczbą wszystkich elementów obrazu. 37 4.1 Korekcja kontrastu obrazu Poprawa jakości wyświetlanych obrazów w zaimplementowanej aplikacji, wykonywana za pomocą korekcji kontrastu, ma przede wszystkim na celu ułatwienie obserwacji zjawisk przedstawianych na przetwarzanych zdjęciach. Obrazy wczytywane z plików i wyświetlane w niezmodyfikowanej formie mało mówią o zaistniałym zdarzeniu, ponieważ trudno jest zaobserwować jakiekolwiek obiekty lub widoczna jest jedynie ich mniejsza część (rysunek 4.1). Podyktowane jest to tym, iż wykonane zdjęcia są podstawowym źródłem danych służących do analizy zjawisk astrofizycznych i nawet niewielkie różnice w wartościach pikseli mogą zawierać ważne informacje, lecz nie są dostrzegalne przez ludzkie oko. Jeśli spojrzymy na histogram obrazu pobranego bezpośrednio z kamery, to możemy zauważyć, że większość pikseli ma wartości znajdujące się w dolnej części skali możliwych poziomów jasności (rysunek 4.2). Takie rozłożenie wartości obrazu powoduje, że trudno jest odróżnić jakiekolwiek elementy znajdujące się na zdjęciu od jego tła. Dostrzegalne są jedynie obiekty posiadające luminancje z górnej części zakresu jasności. Do powszechnie stosowanych algorytmów poprawy kontrastu możemy zaliczyć między innymi: wyrównanie histogramu, korekcję gamma, zmianę odwzorowań poziomów jasności oraz rozciągnięcie histogramu. Wszystkie spośród wymienionych metod zostały wypróbowane podczas implementacji programu. Algorytmem, którego próby zastosowania zostały zaniechane od razu był algorytm rozciągający zakres histogramu. Wynikło to z faktu, że obrazy pochodzące bezpośrednio z kamery zawierają elementy o jasności z całego możliwego zakresu i wymieniona metoda nie dawała żadnych rezultatów. Pierwszą z testowanych metod był algorytm wyrównania histogramu, którego działanie polega na modyfikacji rozkładu poziomów jasności tak, aby jego dystrybuanta była funkcją liniową. W efekcie w histogramie zmodyfikowanego obrazu występuje rozproszenie poziomów jasności tam, gdzie istnieje zgęszczenie w oryginale oraz kompresowanie poziomów jasności w mniej gęstych obszarach. Przy zastosowaniu powyższego algorytmu można zauważyć wiele obiektów przedtem niedostrzegalnych, lecz zbyt duża część pikseli przybiera wysokie wartości, przez co zdjęcie staję się niewyraźne. Efekt wykonania tej metody na wcześniej prezentowanym obrazie przedstawiony jest na rysunku 4.3, a odpowiadający mu histogram na rysunku 4.4. Następną testowaną metodą była korekcja gamma opisana w podrozdziale 4.2. Tutaj także nie uzyskano satysfakcjonujących wyników, ponieważ stosując mały współczynnik korekcji uzyskuje się mało zauważalne wyniki, natomiast przy zwiększaniu jego wartości uzyskuję się ogólny efekt zwiększenia jasności całego obrazu. Na histogramie przedstawionym na rysunku 4.6,uzyskanym przez zastosowanie współczynnika o wartości równej 3, widać że zgęszczenie wartości obrazu głównie przesunęło się w górną część skali jasności i zostało przy tym mało rozproszone (wynikowy obraz przekształcenia pokazany jest na rysunku 4.5). 38 Rysunek 4.1: Obraz pochodzący bezpośrednio z kamery. Rysunek 4.2: Histogram obrazu znajdującego się na rysunku 4.1. 39 Rysunek 4.3: Obraz znajdujący się na rysunku 4.1, zmodyfikowany poprzez wyrównanie histogramu. Rysunek 4.4: Histogram obrazu znajdującego się na rysunku 4.3. 40 Rysunek 4.5: Obraz znajdujący się na rysunku 4.1, zmodyfikowany poprzez korekcję gamma. Rysunek 4.6: Histogram obrazu znajdującego się na rysunku 4.5. 41 Zastosowaną domyślną metodą korekcji kontrastu jest zmiana odwzorowania poziomów jasności obrazu. Zaimplementowane przekształcenie zmieniające wartości obrazu polega na zastosowaniu następującej funkcji: 0 gdy a ∗ i + b < 0 f (i) = a ∗ i + b gdy 0 ¬ a ∗ i + b ¬ imax imax gdy a ∗ i + b > imax (4.4) gdzie i jest przekształcanym poziomem jasności, imax jest maksymalną możliwą wartością obrazu natomiast a i b są stałymi. Jasnościom znajdującym się poniżej pewnego dolnego progu przypisywana jest wartość zero, natomiast jasności znajdujące się powyżej pewnego górnego progu przyjmują maksymalną możliwą luminancję na obrazie. Pozostała część jest przeskalowana na cały dostępny zakres przy pomocy funkcji liniowej, której współczynniki wyznaczane są na podstawie wartości progowych. Dolny próg wyznaczany jest na podstawie histogramu aktualnie przetwarzanego obrazu w ten sposób, że jest ona równy poziomowi jasności, dla którego suma pikseli będących ciemniejszych od niego wynosi 10% liczby wszystkich elementów na obrazie. Podobnie wyznaczana jest górna liczba, z tym że suma ciemniejszych pikseli wynosi 99,8%. Obie wartości procentowe zostały subiektywnie dobrane na podstawie efektów uzyskanych poprzez przetwarzanie kilku zdjęć. Zaprezentowana metoda pozwala dynamicznie wyznaczać przekształcenie kontrastu przez co jest skuteczna zarówno dla zdjęć pochodzących bezpośrednio z kamery, jak i dla obrazów będących ich małymi wycinkami. Rezultat uzyskany dla prezentowanego poprzednio obrazu pokazano na rysunku 4.8, a jego histogram przedstawia ilustracja 4.9. Można zauważyć, że zgęszczenie znajdujące się w dolnej części skali oryginalnego obrazu zostało rozproszone na szeroki zakres, oraz że uzyskano stosunkowo wysokie wartości dla skrajnych poziomów w porównaniu do reszty skali. Wykres przedstawiający wykonane przekształcenie umieszczony został na rysunku 4.7. Zostało również umożliwione ręczne określenie wartości progowych używanych w wyżej przedstawionej metodzie. W tym celu do głównego panelu aplikacji zostały dodane dwa suwaki, z których jeden odpowiada wartości górnej natomiast drugi wartości dolnej. 4.2 Korekcja gamma obrazu Różne urządzenia wizualizacji mogą wprowadzać nieliniowość w odwzorowywaniu poziomów jasności wyświetlanego obrazu. W celu uzyskania zależności liniowej pomiędzy wartością numeryczną znajdującą się w pamięci urządzenia a uzyskiwaną jasnością na ekranie urządzenia, stosuje się korekcję gamma zwaną również 42 Rysunek 4.7: Wykres funkcji użytej do uzyskania obrazu 4.8. Rysunek 4.8: Obraz znajdujący się na rysunku 4.1, zmodyfikowany poprzez zastosowanie domyślnej metody poprawy kontrastu. 43 Rysunek 4.9: Histogram obrazu znajdującego się na rysunku 4.8. kompensacją logarytmiczną. Operacja ta jest realizowana za pomocą funkcji: fi 0 fi = fmax ∗ ( fmax 1 ) gamma (4.5) 0 gdzie fi jest wartością piksela przed wykonaniem operacji, fi wartością piksela po wykonaniu operacji, fmax maksymalnym możliwym poziomem luminancji na obrazie, natomiast gamma jest współczynnikiem korekcji. Przy współczynniku równym jeden uzyskujemy przekształcenie tożsamościowe. Powyższa metoda często jest używana jako jedna ze wstępnych metod poprawy kontrastu, jednakże w stosunku do przetwarzanych obrazów okazała się niewystarczająco skuteczna. Dodatkowo trudno jest dobrać wartość współczynnika korekcji, która jest odpowiednia dla wszystkich obrazów. Operacja ta została dodana do aplikacji jako metoda, która umożliwia ręczną korekcję kontrastu przez użytkownika. W zaimplementowanej aplikacji korekcja gamma dla aktualnie wyświetlanego obrazu jest dostępna w menu->Processing->Gamma correction. Operacja jest wykonywana tylko na aktualnie wyświetlonym obrazie ze współczynnikiem określonym przez użytkownika z zakresu wartości 0.1-5. 44 4.3 Sposób wykonywania operacji graficznych na obrazie Wśród wymagań dotyczących aplikacji znalazły się przekształcenia geometryczne, w których skład wchodzą takie operacje jak skalowanie obrazu oraz odbicia obrazu względem osi OX i OY kartezjańskiego układu współrzędnych. Wszystkie te operacje można zrealizować poprzez wykonanie jednego przekształcenia polegającego na zmianie położenia pikseli wejściowego obrazu według wzoru: 0 P =M∗P h (4.6) iT opisuje położenie elementu na pierwotnym obrazie, gdzie P = xp yp 1 M jest macierzą odzwierciedlającą wykonywaną operację graficzną natomiast h iT 0 P = xk yk 1 jest położeniem elementu na obrazie wyjściowym. Do wykonania skalowania została wykorzystana następująca macierz Sx 0 0 M = 0 Sy 0 0 0 1 gdzie Sx jest skalą obrazu w poziomie, a Sy jest skalą w pionie. Lustrzane odbicie zdjęcia względem osi OX zostało wykonane z użyciem macierzy 1 0 0 M = 0 −1 Ty 0 0 1 przy czym Ty jest wartością przesunięcia obrazu w pionie i jest ona równa wysokości obrazu. Dodatkowe przesunięcie obrazu spowodowane jest tym, że wynik wykonania samego przekształcenia symetrii względem osi OX znajduje się w IV ćwiartce układu współrzędnych, a podczas wyświetlania zawartości obiektu prezentującego obraz brane pod uwagę są jedynie piksele znajdujące się w I ćwiartce układu współrzędnych. Przy pomocy analogicznej macierzy wykonywana jest operacja odbicia względem osi OY −1 0 Tx M= 0 1 0 0 0 1 podobnie jak poprzednio uzyskany wynik jest dodatkowo przesuwany, z tym że w kierunku poziomym o wartość Tx równą szerokości obrazu. W tym przypadku wynik symetrii względem osi OY znajduje się w II ćwiartce układu współrzędnych. 45 W zaimplementowanej aplikacji do wykonania przekształceń geometrycznych wykorzystywana jest klasa java.awt.AffineTransform. Reprezentuje ona macierz przekształcenia geometrycznego o wymiarach 3 × 3, w której wartości dwóch pierwszych wierszy określane są na podstawie argumentów h itypu double konstruktora klasy. Ostatni wiersz jest stały i ma postać 0 0 1 . Sama operacja zwracająca wynik przekształcenia wykonywana jest za pomocą metody filter klasy java.awt.image.AffineTransformOp , która pobiera jako argumenty dwa obiekty klasy java.awt.image.BufferedImage, reprezentujące obraz źródłowy oraz obraz wynikowy. Obiekt klasy, zawierający dokonywane przekształcenie przekazywany jest podczas inicjalizacji instancji klasy wykonującej operację. Zaletą wykorzystania wyżej wymienionych klas do operacji geometrycznych jest to, że możliwe jest przechowywanie obiektu reprezentującego złożenie dotychczas wykonanych operacji geometrycznych na przetwarzanym obrazie, czyli obiektu za pomocą, którego możliwe jest uzyskanie obrazu, na którym wykonano kilka przekształceń geometrycznych poprzez wykonanie jednej operacji będącej ich złożeniem. Posiadając jedną operacje można łatwo wyznaczyć przekształcenie do niej odwrotne co jest ważne ponieważ znając współrzędne piksela na wyświetlanym obrazie można obliczyć jego położenie na obrazie źródłowym. Jest to używane do wyświetlania wartości pikseli oryginalnego obrazu niezależnie od sposobu jego prezentacji. Powyższa operacja realizowana jest poprzez metodę inverseTransform klasy AffineTransform, która pobiera współrzędne punktu i na ich podstawie zwraca współrzędne po wykonaniu przekształcenia odwrotnego do przekształcenia, które reprezentuje. Podczas wykonywania przekształceń może zdarzyć się, że powstaną piksele wynikowego obrazu, dla których nie da się jednoznacznie określić odpowiadającego elementu na obrazie wejściowym. W celu rozwiązania tego problemu klasa java.awt.image.AffineTransformOp umożliwia użycie trzech strategii interpolacji wartości elementów obrazu przekształconego, w przypadku gdy nie da się bezpośrednio określić ich luminancji. Pierwsza z nich nazywana jest interpolacją najbliższego sąsiada (ang. nearest neighbor ) i polega ona na skopiowaniu wartości najbliższego piksela. Jest ona najprostszą i najszybszą metodą. Drugą z nich jest strategia dwuliniowa (ang. bilinear ), biorąca pod uwagę cztery sąsiednie piksele podczas interpolacji. Ostania metoda nazywana jest dwusześcienną i bierze ona pod uwagę wszystkie osiem pikseli znajdujących się w pobliżu obliczanego elementu. Z pośród wymienionych strategii w aplikacji została zastosowana pierwsza z nich. Wybór jej został dokonany na podstawie subiektywnej oceny rezultatów uzyskanych po zastosowaniu każdej z nich dla tego samego obrazu do wykonania jednakowego przekształcenia. 46 4.4 Algorytm wyznaczania współrzędnych niebieskich Procedura transformacji współrzędnych (x, y) piksela znajdującego się na obrazie na odpowiadające współrzędne niebieskie składa się z dwóch kroków. Pierwszy etap polega na obliczeniu odległości danego elementu od środka zdjęcia, wyrażonej w stopniach. Druga część wyznacza rektascensję oraz deklinację piksela na podstawie wcześniej wyznaczonych odległości oraz współrzędnych obrazu, przez wykonanie odpowiednich przekształceń trygonometrycznych. Wyznaczenie różnic rektascensji i deklinacji pomiędzy położeniem danego piksela oraz położeniem środka obrazu wykonywane jest przez zastosowanie następującej transformaty : ∆λ = X Pij ∗ (∆x)i ∗ (∆y)i ∆δ = i,j¬O X Qij ∗ (∆x)i ∗ (∆y)i (4.7) i,j¬O gdzie ∆λ jest różnicą rektascensji wyrażoną w radianach,∆δ jest różnicą deklinacji wyrażoną radianach, ∆x jest odległością w poziomie danego piksela od piksela będącego środkiem obrazu, ∆y jest odległością w pionie od środka, O jest kolejnością wykonania przekształcenia, a Pij i Qij są współczynnikami transformaty. Wartość O jest zapisana w nagłówku pliku zawierającego obraz, jako wartość odpowiadająca słowu kluczowemu AST ORD, natomiast Pij oraz Qij odpowiadają polom nagłówka PAR X 0, PAR X 1, . . . , PAR X 20 oraz PAR Y 0, PAR Y 1, . . . , PAR Y 20. Po wykonaniu powyższej transformaty uzyskane wyniki przeliczane są na stopnie. W drugiej części algorytmu wyznaczane są dokładne wartości współrzędnych niebieskich. Możliwe jest to dzięki znajomości współrzędnych środka obrazu, zapisanych jako pola RA i DEC. Po wykonaniu odpowiednich przekształceń trygonometrycznych zwracany jest wynik w postaci rektascensji wyrażonej w godzinach oraz deklinacji wyrażonej w stopniach. Zarówno rektascensja jak i deklinacja są miarami kąta, ale często druga wartość podawana jest mierze godzinnej (od 0h do 24h). Podczas wykonywania obliczeń trzeba wziąć pod uwagę, że obraz zapisany w pliku może być obrócony, dlatego też trzeba najpierw przekształcić współrzędne (x,y) elementu na wyświetlanym obrazie na odpowiadające im położenie na obrazie nieobróconym. Informacje na temat wykonanego przekształcenia zdjęcia zawarte są w słowie kluczowym FLIP. Należy również policzyć odległość piksela od środka obrazu. W przypadku zdjęcia pochodzącego bezpośrednio z teleskopu projektu jest to oczywiste, ponieważ odejmujemy współrzędne danego piksela od środka obrazu, obliczonego poprzez podzielenie jego wysokości oraz jego szerokości na pół. Natomiast gdy mamy do czynienia z obrazem będącym wycinkiem, należy wyznaczyć odległość danego elementu fragmentu od środka obrazu z którego 47 pochodzi. Możliwe jest to dzięki danym mówiącym o szerokości i wysokości obrazu z którego pochodzi wycinek, zawartym w polach nagłówka ORGSIZEX oraz ORGSIZEY. Do współrzędnych piksela wycinka należy dodać także wartości słów kluczowych EVTX0 oraz EVTY0, tak aby przekształcić je na odpowiadające im położenie na dużym obrazie. Przedstawiona metoda obliczania współrzędnych niebieskich używana w eksperymencie π of the Sky została zaczerpnięta z projektu „ASAS”. 48 Podsumowanie W pracy został przedstawiony sposób realizacji wymagań stawianych w eksperymencie π of the Sky przed przeglądarką plików FITS. Przedstawiona została również charakterystyka samego eksperyment wraz z opisem plików obrazujących wykonane obserwacje przez teleskop projektu oraz opisem formy ich przechowywania. Dodatkowa prezentacja standardu FITS umożliwiła pełne zrozumienie wymagań stawianych przed aplikacją. Dzięki zastosowanej technologii możliwe było zintegrowanie aplikacji z istniejącym interfejsem WWW projektu. Dzięki czytaniu przez aplet parametrów znajdujących się w kodzie HTML, możliwe jest umieszczenie aplikacji domyślnie prezentującej zdjęcia zjawiska na dynamicznie generowanej stronie przeznaczonej do prezentacji zaobserwowanych zjawisk. Dzięki zaimplementowanej przeglądarce osoba, chcąca obejrzeć zaobserwowane zjawisko, nie jest zmuszona do pobrania paczki zawierającej listę opisującą zjawisko z witryny projektu oraz nie jest zmuszona do wykonywania operacji związanych z dekompresją oraz dearchiwizacją pliku zawierającego paczkę. Nie jest również wymagana instalacja specjalnego oprogramowania umożliwiającego wyświetlenie obrazów zawartych w plikach FITS. Jedynym warunkiem uruchomienia aplikacji jest posiadanie zainstalowanego środowiska uruchomieniowego Javy oraz wtyczki Java Plug-in. Zaimplementowana aplikacja dostosowana jest do plików FITS używanych przez projekt, dzięki czemu możliwe jest obliczenie współrzędnych niebieskich pikseli, czego inne ogólnie dostępne przeglądarki, w przypadku przetwarzania plików pochodzących z teleskopu projektu, nie udostępniają. Dzięki określaniu położenia elementów znajdujących się na obrazie zostało umożliwione pobieranie informacji na temat gwiazd znajdujących się na wybranym fragmencie obrazu poprzez zdanie zapytania do jednej z dwóch roboczych baz danych projektu. Zostały w pełni zrealizowane wymagania dotyczące możliwości wykonywania operacji graficznych na obrazie oraz jego przetwarzania w celu poprawy kontrastu przy zachowanej możliwości odczytu wartości pikseli oryginalnego obrazu. Mimo że wartości obrazu mogą być zmieniane przez wykonywanie różnych modyfikacji wyświetlanego obrazu, wskazywana wartość wybranego piksela jest wartością opowiadającego mu piksela oryginalnego obrazu. Podczas wyświetlania każdego 49 zdjęcia wykonywana jest automatyczna metoda korekcji kontrastu, dająca dobre rezultaty dla obrazów pochodzących bezpośrednio z teleskopu jak i dla obrazów będących ich wycinkami. Wynika to z faktu, że współczynniki zaimplementowanego algorytmu poprawy jakości obrazu zostają wyznaczone na podstawie histogramu aktualnie przetwarzanego obrazu. Istnieje również możliwość ręcznej poprawy kontrastu obrazu w przypadku gdy domyślna metoda okaże się niewystarczająca. Aplikacja posiada okno nawigacji pozwalające na analizowanie i oglądanie zdjęć wchodzących w skład wielu list i wielu paczek. Odpowiednie pogrupowanie elementów prezentujących przetwarzane obrazy pozwala na sprawną nawigację po plikach. Dzięki możliwości wyboru list znajdujących się w paczkach, użytkownik może otworzyć dowolny zbiór list wchodzących w skład paczki. 50 Bibliografia [1] Marcin Sokołowski: Investigation of astrophysical phenomena in short time scales with ”Pi of the Sky”. Phd thesis, Instytut Problemów Jądrowych im. Andrzeja Sołtana, 2007. http://grb.fuw.edu.pl/pi/user/msok/doc/phd/thesis.pdf.gz. [2] Strona domowa pojektu π of the Sky. http://grb.fuw.edu.pl/pi/. [3] Strona domowa pojektu ASAS. http://www.astrouw.edu.pl/asas/. [4] Iwona Wytrzyszczak: Podstawy astronomii Układy współrzędnych niebieskich. http://www.nauticalissues.com/astronomy.html. [5] Standard FITS. http://fits.gsfc.nasa.gov/standard30/htmlfiles/fits standard30index.html. [6] Java tutorial. http://java.sun.com/docs/books/tutorial/deployment/applet/ security practical.html. [7] Opis satelity Swift. http://www.nasa.gov/mission pages/swift/spacecraft/index.html. [8] Strona domowa sieci GCN. http://gcn.gsfc.nasa.gov/. [9] Strona internetowa CGRO. http://heasarc.gsfc.nasa.gov/docs/cgro/. [10] Strona internetowa Wikipedii. http://en.wikipedia.org/wiki/BeppoSAX. [11] Strona internetowa Wikipedii. http://pl.wikipedia.org/wiki/Paralaksa. [12] Strona internetowa Wikipedii. http://en.wikipedia.org/wiki/Angular size. [13] Strona internetowa Wikipedii. http://pl.wikipedia.org/wiki/Erg (jednostka). [14] Strona internetowa Wikipedii. http://pl.wikipedia.org/wiki/Magnitudo. 51