Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
de:praktikum:photometrie_python [2024/09/19 05:55] – [Einlesen der Bilder] rhainich | de:praktikum:photometrie_python [2025/04/01 11:16] (aktuell) – [Definieren einiger Variablen] rhainich |
---|
workon ost_photometry | workon ost_photometry |
| |
erfolgen. Dies ist auch nötig wenn man sich, z.B. nach einer Unterbrechung der Arbeit, erneut mit a12 verbindet und die Datenauswertung fortsetzen möchte. | erfolgen. Dies ist auch nötig wenn man sich, z.B. nach einer Unterbrechung der Arbeit, erneut mit columba verbindet und die Datenauswertung fortsetzen möchte. |
| |
Die OST-Photometrie-Pipeline kann anschließend in dem terminal mittels //pip// wie folgt installiert werden kann: | Die OST-Photometrie-Pipeline kann anschließend in dem terminal mittels //pip// wie folgt installiert werden kann: |
Um auch mit einer größeren Menge von Daten zurecht zu kommen, gibt es eine //Python//-Routine, die pro Filter die Korrekturen für Darkframe und Flatfield durchführt, anschließend die Bilder pro Filter aufaddiert und zueinander ausrichtet. Die Routine nimmt keine Qualitätskontrolle der Bilder vor, unbrauchbare Beobachtungen müssen also auf jeden Fall vorher aussortiert werden, sonnst kann es zu Problemen bei der Ausrichtung kommen. | Um auch mit einer größeren Menge von Daten zurecht zu kommen, gibt es eine //Python//-Routine, die pro Filter die Korrekturen für Darkframe und Flatfield durchführt, anschließend die Bilder pro Filter aufaddiert und zueinander ausrichtet. Die Routine nimmt keine Qualitätskontrolle der Bilder vor, unbrauchbare Beobachtungen müssen also auf jeden Fall vorher aussortiert werden, sonnst kann es zu Problemen bei der Ausrichtung kommen. |
| |
Man kopiert sich zunächst das //Python//-Skript ''1_add_images.py'' aus dem Verzeichnis ''~/scripts/n2/'' in sein lokales Arbeitsverzeichnis. Danach sollte man diese mit einem beliebigen Texteditor öffnen, um die Pfadangaben für die Bilder entsprechend anzupassen. Um eine größere Menge von Bildern bequem einlesen und verifizieren zu können, erwartet das Programm eine Trennung der Daten in verschiedene Unterverzeichnisse (Variablen: ''bias'', ''darks'', ''flats'', ''imgs''). Es sollte jeweils ein Verzeichnis für die Aufnahmen des Sternhaufens, der Flatfields und der Darkframes existiere. Eine mögliche Verzeichnisstruktur wäre: | Man kopiert sich zunächst das //Python//-Skript ''1_add_images.py'' aus dem Verzeichnis ''~/scripts/n2/'' in sein lokales Arbeitsverzeichnis. Danach sollte man diese mit einem beliebigen Texteditor öffnen, um die Pfadangaben für die Bilder entsprechend anzupassen. Um eine größere Menge von Bildern bequem einlesen und verifizieren zu können, erwartet das Programm eine Trennung der Daten in verschiedene Unterverzeichnisse (Variablen: ''bias'', ''darks'', ''flats'', ''images''). Es sollte jeweils ein Verzeichnis für die Aufnahmen des Sternhaufens, der Flatfields und der Darkframes existiere. Eine mögliche Verzeichnisstruktur wäre: |
| |
/bias/ | /bias/ |
/darks/ | /darks/ |
/flats/ | /flats/ |
/imgs/ | /images/ |
| |
Das //Python//-Skript erkennt automatisch die verwendeten Filter und Belichtungszeiten. Darauf aufbauend ordnet sowie klassifiziert es die Dateien automatisch ohne das weiteres Zutun nötig ist. Ist man sich sicher, dass alle ''FIT-Header'' Schlüsselwörter korrekt gesetzt sind können alle Datei versuchsweise auch in einem einzigen Verzeichnis abgelegt werden. In diesem Fall muss in dem Skript nur der Pfad ''rawfiles'' gesetzt werden. Anderenfalls müssen die Pfade zu den Unterordnern bei den entsprechenden Variablen angegeben werden. | Das //Python//-Skript erkennt automatisch die verwendeten Filter und Belichtungszeiten. Darauf aufbauend ordnet sowie klassifiziert es die Dateien automatisch ohne das weiteres Zutun nötig ist. Ist man sich sicher, dass alle ''FIT-Header'' Schlüsselwörter korrekt gesetzt sind können alle Datei versuchsweise auch in einem einzigen Verzeichnis abgelegt werden. In diesem Fall muss in dem Skript nur der Pfad ''raw_files'' gesetzt werden. Anderenfalls müssen die Pfade zu den Unterordnern bei den entsprechenden Variablen angegeben werden. |
| |
/* | /* |
########################## Individual folders ############################ | ########################## Individual folders ############################ |
### Path to the bias -- If set to '?', bias exposures are not used. | ### Path to the bias -- If set to '?', bias exposures are not used. |
bias = '?' | bias: str = '?' |
| |
### Path to the darks | ### Path to the darks |
darks = '?' | darks: str = '?' |
| |
### Path to the flats | ### Path to the flats |
flats = '?' | flats: str = '?' |
| |
### Path to the images | ### Path to the images |
imgs = '?' | images: str = '?' |
| |
####################### Simple folder structure ########################## | ####################### Simple folder structure ########################## |
rawfiles = '?' | raw_files: str = '?' |
| |
Wurden die Pfandangaben und der Name des Sternhaufens angepasst, kann anschließend das Skript mittels | Wurden die Pfandangaben und der Name des Sternhaufens angepasst, kann anschließend das Skript mittels |
| |
# Images | # Images |
V_path = 'output/combined_trimmed_filter_V.fit' | V_path = 'output/combined_filter_V.fit' |
B_path = 'output/combined_trimmed_filter_B.fit' | B_path = 'output/combined_filter_B.fit' |
| |
Hinweis: Die hier und im weiteren angegeben Variablennamen sind nur beispielhaft und können durch jede beliebige andere Bezeichnung ersetzt werden. | Hinweis: Die hier und im weiteren angegeben Variablennamen sind nur beispielhaft und können durch jede beliebige andere Bezeichnung ersetzt werden. |
Die vom OST erstellten Aufnahmen werden in der Regel ohne ein sogenanntes WCS ausgeliefert. WCS steht für World Coordinate System und ermöglicht es jedem Pixel im Bild eigene Himmelskoordinaten zuzuweisen. In //ds9// werden diese dann z.B. auch beim zeigen mit dem Mauszeiger auf bestimmten Pixel bzw. auf bestimmte Objekte in dem Koordinatenfenster von //ds9// angezeigt. Dies ist sehr hilfreich wenn man z.B. die Positionen von Sternen im eigen Bild mit denen in Sternenkatalogen abgleichen will. Dies könnte bei der späteren Kalibrierung der Sternmagnituden durchaus hilfreich sein ;-). | Die vom OST erstellten Aufnahmen werden in der Regel ohne ein sogenanntes WCS ausgeliefert. WCS steht für World Coordinate System und ermöglicht es jedem Pixel im Bild eigene Himmelskoordinaten zuzuweisen. In //ds9// werden diese dann z.B. auch beim zeigen mit dem Mauszeiger auf bestimmten Pixel bzw. auf bestimmte Objekte in dem Koordinatenfenster von //ds9// angezeigt. Dies ist sehr hilfreich wenn man z.B. die Positionen von Sternen im eigen Bild mit denen in Sternenkatalogen abgleichen will. Dies könnte bei der späteren Kalibrierung der Sternmagnituden durchaus hilfreich sein ;-). |
| |
| /* |
Für die Bestimmung des WCS fehlen uns allerdings noch ein paar Voraussetzungen. Die ungefähren zentralen Koordinaten des abgebildeten Himmelsausschnitt sind zwar bereits in den Header der FIT-Dateien hinterlegt, das genau Gesichtsfeld und die Pixel-Skala der erstellten Aufnahmen müssen allerdings noch ermittelt werden. Dies erzielen wir mit der Funktion ''cal_fov'', der als Argument das bereits angelegt ''image''-Objekt übergeben wird: | Für die Bestimmung des WCS fehlen uns allerdings noch ein paar Voraussetzungen. Die ungefähren zentralen Koordinaten des abgebildeten Himmelsausschnitt sind zwar bereits in den Header der FIT-Dateien hinterlegt, das genau Gesichtsfeld und die Pixel-Skala der erstellten Aufnahmen müssen allerdings noch ermittelt werden. Dies erzielen wir mit der Funktion ''cal_fov'', der als Argument das bereits angelegt ''image''-Objekt übergeben wird: |
| |
Das Gesichtsfeld und die Pixel-Skala wird automatisch im ''image''-Objekt hinterlegt. | Das Gesichtsfeld und die Pixel-Skala wird automatisch im ''image''-Objekt hinterlegt. |
| |
Anschließend kann mittels der Funktion ''find_wcs_astrometry'' die Bestmmung des WCS gestartet werden: | Anschließend kann mittels |
| */ |
| |
| Mittels der Funktion ''find_wcs_astrometry'' kann die Bestimmung des WCS gestartet werden: |
| |
# Find the WCS solution for the images | # Find the WCS solution for the images |
=== Finden der Sterne === | === Finden der Sterne === |
| |
Die Identifikation der Sterne in den beiden Bildern erfolgt mittels der Funktion ''main_extract''. Diese Funktion nimmt als erstes Argument wiederum das ''image''-Objekt. Das zweite Argument charakterisiert die Größe der Beugungsscheibchen. Dieses Sigma kann an Hand der Bilder bestimmt werden. Liegt aber in der Regel um den Wert ''3.0''. Als optionales Argument kann dann noch die Extraaktionsmethode ausgewählt werden (''photometry''). Hier spezifizieren wir '''APER''', und wählen so Apertur-Photometrie aus, bei der der Fluss der einzelnen Objekte und der zugehörigen Himmelshintergründe innerhalb einer fest definierten (hier kreis- bzw. ringförmigen) Apertur ausgelesen wird. Um diese Apertur zu spezifizieren geben wir noch den Radius für die kreisförmige Objektapertur (''rstars'') sowie die beiden Radien für die ringförmige Hintergrundapertur (''rbg_in'' und ''rbg_out'') an. Bewährt haben sich hier ''4'' sowie ''7'' und ''10''. Die Radien sind jeweils in Bogensekunden. | Die Identifikation der Sterne in den beiden Bildern erfolgt mittels der Funktion ''main_extract''. Diese Funktion nimmt als erstes Argument wiederum das ''image''-Objekt. Als optionales Argument kann dann noch die Extraaktionsmethode ausgewählt werden (''photometry''). Hier spezifizieren wir '''APER''', und wählen so Apertur-Photometrie aus, bei der der Fluss der einzelnen Objekte und der zugehörigen Himmelshintergründe innerhalb einer fest definierten (hier kreis- bzw. ringförmigen) Apertur ausgelesen wird. Um diese Apertur zu spezifizieren geben wir noch den Radius für die kreisförmige Objektapertur (''rstars'') sowie die beiden Radien für die ringförmige Hintergrundapertur (''rbg_in'' und ''rbg_out'') an. Bewährt haben sich hier ''4'' sowie ''7'' und ''10''. Die Radien sind jeweils in Bogensekunden. |
| |
# Extract objects | # Extract objects |
main_extract( | main_extract( |
V_image, | V_image, |
sigma, | |
photometry_extraction_method='APER', | photometry_extraction_method='APER', |
radius_aperture=4., | radius_aperture=4., |
main_extract( | main_extract( |
B_image, | B_image, |
sigma, | |
photometry_extraction_method='APER', | photometry_extraction_method='APER', |
radius_aperture=4., | radius_aperture=4., |
| |
# Correlate results from both images | # Correlate results from both images |
id_V, id_B, _, _ = matching.search_around_sky(coords_V, coords_B, 2.*u.arcsec) | id_V, id_B, d2, _ = matching.search_around_sky(coords_V, coords_B, 2.*u.arcsec) |
| |
Die erfolgreich zugeordneten Sterne bekommen jeweils einen Eintrag in ''id_V'' und ''id_B''. Diese beiden Listen (genauer gesagt Numpy arrays) enthalten die Indexwerte, die diese Sterne in den ursprünglich unsortierten Datensätzen hatten. Das heißt wir können diese Indexwerte nutzen, um die ursprünglichen Tabellen mit den Flüssen und Sternpositionen so zu sortieren, dass sie nur noch Sterne enthalten die in beiden Aufnahmen detektiert wurden und das die Reihenfolge der Sterne in beiden Datensätzen die Gleiche ist. Diese Zuordnung ist essentiell für das weitere Vorgehen. | Die erfolgreich zugeordneten Sterne bekommen jeweils einen Eintrag in ''id_V'', ''id_B'' und ''d2''. Diese beiden ersten Listen (genauer gesagt Numpy arrays) enthalten die Indexwerte, die diese Sterne in den ursprünglich unsortierten Datensätzen hatten. Das heißt wir können diese Indexwerte nutzen, um die ursprünglichen Tabellen mit den Flüssen und Sternpositionen so zu sortieren, dass sie nur noch Sterne enthalten die in beiden Aufnahmen detektiert wurden und das die Reihenfolge der Sterne in beiden Datensätzen die Gleiche ist. Diese Zuordnung ist essentiell für das weitere Vorgehen. |
| |
Das Sortieren erfolgt einfach indem man die Arrays mit den Indexwerten in die Tabellen einsetzt. Wir selektieren und gleichzeitig sortieren so die in beiden Aufnahmen identifizierten Sterne. | Bevor dies jedoch geschehen kann, müssen noch potentielle Mehrfachidentifikationen aussortiert werden. Es ist nämlich möglich, dass ''matching.search_around_sky()'' z.B. Objekt 3 aus ''coords_V'' sowohl Objekt 2 als auch Objekt 4 aus ''coords_B'' zuordnet. Das Aussortieren dieser Duplikate erfolgt mit: |
| |
| # Identify and remove duplicate indices |
| id_V, d2, id_B = clear_duplicates( |
| id_V, |
| d2, |
| id_B, |
| ) |
| id_B, _, id_V = clear_duplicates( |
| id_B, |
| d2, |
| id_V, |
| ) |
| |
| Anschließend können die Tabellen mit den photometrischen Werten sortiert werden, indem die Arrays mit den Indexwerten in die entsprechenden Tabellen eingesetzt werden. Auf diese Weise selektieren und sortieren wir gleichzeitig die Sterne, die in den beiden Aufnahmen identifiziert wurden. |
| |
# Sort table with extraction results and SkyCoord object | # Sort table with extraction results and SkyCoord object |
Im nächsten Schritt können wir den Download ausführen. Hierbei nutzen wir die Funktion ''.query_region''. Dieser müssen wir noch die Koordinaten und die Größe des abzufragenden Himmelsbereiches übergeben. Glücklicherweise ist beides bereits bekannt. Die Koordinaten kennen wir aus den FIT-Header der Sternhaufenaufnahmen und für den Radius des abzufragenden Bereichs nehmen wir einfach das Gesichtsfeld, was wir uns bereits oben ausgerechnet haben. Beide Größen können wir z.B. dem ''V_image''-Objekt entnehmen. | Im nächsten Schritt können wir den Download ausführen. Hierbei nutzen wir die Funktion ''.query_region''. Dieser müssen wir noch die Koordinaten und die Größe des abzufragenden Himmelsbereiches übergeben. Glücklicherweise ist beides bereits bekannt. Die Koordinaten kennen wir aus den FIT-Header der Sternhaufenaufnahmen und für den Radius des abzufragenden Bereichs nehmen wir einfach das Gesichtsfeld, was wir uns bereits oben ausgerechnet haben. Beide Größen können wir z.B. dem ''V_image''-Objekt entnehmen. |
| |
calib_tbl = v.query_region(V_image.coord, radius=V_image.fov*u.arcmin)[0] | calib_tbl = v.query_region(V_image.V_image.coordinates_image_center, radius=V_image.field_of_view_x*u.arcmin)[0] |
| |
Die Tabelle ''calib_tbl'' enthält nun alle in dem **APASS**-Katalog enthaltenen Objekte mit ihren ''B''- und ''V''-Magnituden, welche sich in unserem Gesichtsfeld befinden. | Die Tabelle ''calib_tbl'' enthält nun alle in dem **APASS**-Katalog enthaltenen Objekte mit ihren ''B''- und ''V''-Magnituden, welche sich in unserem Gesichtsfeld befinden. |
| |
# Correlate extracted object position with calibration table | # Correlate extracted object position with calibration table |
ind_fit, ind_lit, _, _ = matching.search_around_sky( | ind_fit, ind_lit, d2, _ = matching.search_around_sky( |
coords_objs, | coords_objs, |
coord_calib, | coord_calib, |
2.*u.arcsec, | 2.*u.arcsec, |
| ) |
| |
| Wie ebenfalls oben beschrieben, müssen nun noch die Dubletten aussortiert werden: |
| |
| # Identify and remove duplicate indexes |
| ind_fit, d2, ind_lit = clear_duplicates( |
| ind_fit, |
| d2, |
| ind_lit, |
| ) |
| ind_lit, _, ind_fit = clear_duplicates( |
| ind_lit, |
| d2, |
| ind_fit, |
) | ) |
| |
Eine Möglichkeit, die Validität der Kalibrationssterne zu prüfen ist diese sich auf einer Starmap darzustellen (ähnlich zu dem was die ''main_extract'' oben automatisch macht). In diesem Fall wollen wir aber die heruntergeladenen Sternpositionen als auch die Sterne darstellen, die dann später auch wirklich für die Kalibrierung verwendet wurden. Hierfür bietet die OST-Bibliothek eine geeignete Funktion (''starmap'') an, die solche Plots erstellen kann. Diese Funktion kann über | Eine Möglichkeit, die Validität der Kalibrationssterne zu prüfen ist diese sich auf einer Starmap darzustellen (ähnlich zu dem was die ''main_extract'' oben automatisch macht). In diesem Fall wollen wir aber die heruntergeladenen Sternpositionen als auch die Sterne darstellen, die dann später auch wirklich für die Kalibrierung verwendet wurden. Hierfür bietet die OST-Bibliothek eine geeignete Funktion (''starmap'') an, die solche Plots erstellen kann. Diese Funktion kann über |
| |
from ost_photometry.analyze.plot import starmap | from ost_photometry.analyze.plots import starmap |
| |
eingebunden werden. Da diese Funktion als Eingabe eine Astropy-Tabellen, mit den darzustellenden Daten erwartet, müssen wir zuerst diese erstellen, bevor wir die Starmap plotten können. Die Position der Kalibrationssterne liegen bisher nicht in Pixelkoordinaten vor, da wir diese Information von der Simbad- bzw. Vizier-Datenbank bezogen haben. Daher müssen wir zuerst diese erzeugen. An dieser Stelle ist es wieder praktisch, dass wir zuvor ein ''SkyCoord''-Objekt für diese Sterne erzeugt haben. Mittels ''.to_pixel()'' unter Angabe des WCS des Bildes lassen sich hieraus ganz einfach Pixelkoordinaten erzeugen: | eingebunden werden. Da diese Funktion als Eingabe eine Astropy-Tabellen, mit den darzustellenden Daten erwartet, müssen wir zuerst diese erstellen, bevor wir die Starmap plotten können. Die Position der Kalibrationssterne liegen bisher nicht in Pixelkoordinaten vor, da wir diese Information von der Simbad- bzw. Vizier-Datenbank bezogen haben. Daher müssen wir zuerst diese erzeugen. An dieser Stelle ist es wieder praktisch, dass wir zuvor ein ''SkyCoord''-Objekt für diese Sterne erzeugt haben. Mittels ''.to_pixel()'' unter Angabe des WCS des Bildes lassen sich hieraus ganz einfach Pixelkoordinaten erzeugen: |
label_2='Identified calibration stars', | label_2='Identified calibration stars', |
rts='calibration', | rts='calibration', |
nameobj=name, | |
) | ) |
| |
Hierbei ist das erste Argument unser Ausgabeverzeichnis, das zweite Argument das eigentlich Bild (als //Numpy//-Array), das dritte Argument die Filterbezeichnung, das vierte Argument die erste Tabelle, ''label'' das Label zum ersten Datensatz, ''tbl_2'' die zweite Tabelle, ''label_2'' das Label zum zweiten Datensatz, ''rts'' eine Beschreibung des Plots und ''nameobj'' der Name des Sternhaufens. | Hierbei ist das erste Argument unser Ausgabeverzeichnis, das zweite Argument das eigentlich Bild (als //Numpy//-Array), das dritte Argument die Filterbezeichnung, das vierte Argument die erste Tabelle, ''label'' das Label zum ersten Datensatz, ''tbl_2'' die zweite Tabelle, ''label_2'' das Label zum zweiten Datensatz und ''rts'' eine Beschreibung des Plots. |
| |
**Alternativ** kann man die Starmap auch direkt über ''pyplot'' aus dem ''matplotlib''-Modul erstellen. Dies ist nicht viel aufwendiger bietet aber mehr Möglichkeiten zur Anpassung des Plots. Geladen wird ''pyplot'' mittels: | **Alternativ** kann man die Starmap auch direkt über ''pyplot'' aus dem ''matplotlib''-Modul erstellen. Dies ist nicht viel aufwendiger bietet aber mehr Möglichkeiten zur Anpassung des Plots. Geladen wird ''pyplot'' mittels: |
erstellt. Anschließend kann das eigentliche Bild geladen werden: | erstellt. Anschließend kann das eigentliche Bild geladen werden: |
| |
plt.imshow(image, origin='lower') | plt.imshow(V_image, origin='lower') |
| |
''image'' sind hierbei die eigentlichen Bilddaten und ''origin=lower'' stellt sicher, dass das mit dem überplotten der Koordinaten auch klappt. Daraufhin können die Symbole, die die Sternposition kennzeichnen geplottet werden: | ''image'' sind hierbei die eigentlichen Bilddaten und ''origin=lower'' stellt sicher, dass das mit dem überplotten der Koordinaten auch klappt. Daraufhin können die Symbole, die die Sternposition kennzeichnen geplottet werden: |