Aktionen

PF

PF:Sterne eines Sternhaufens automatisch zählen

Aus Physik und ihre Didaktik Wiki


Um die Anzahl von Sternen eines Sternhaufens effizient zu bestimmen, bietet sich ein automatisiertes Vorgehen an. In diesem Artikel wird Programmcode vorgestellt, mit dem die Sterne einer FITS-Datei ausgelesen, gezählt und markiert werden. Zusätzlich werden die Positionen der Sterne in einer CSV-Datei gespeichert. Als Programmiersprache wurde Python3 verwendet. Die verwendeten Pakete sind auch in der Übersicht der Astropakete gelistet. Der zugrunde liegende Algorithmus ist der DAOPHOT-Algorithmus, bei welchem so lange Sterne gruppiert und vom Bild abgezogen werden, bis nur Rauschen übrigbleibt. Gleichzeitig wird eine Liste an erkannten Sternen mit x- und y-Koordinaten und einem Flux-Wert, der die Intensität des jeweiligen Sterns angibt, gespeichert. Letzteres wird über die Annahme einer gaußförmigen, radialsymmetrischen Punktspreizfunktion (also die tatsächliche Abbildung eines Sterns als Quasi-Punktquelle) realisiert, über die integriert wird, um die entsprechende Intensität zu erhalten.

Codebeispiel

from astropy.io import fits
from astropy.table import Table
from photutils.detection import IRAFStarFinder
from photutils.psf import IntegratedGaussianPRF, DAOGroup
from photutils.background import MMMBackground,MADStdBackgroundRMS
from astropy.modeling.fitting import LevMarLSQFitter
from astropy.stats import gaussian_sigma_to_fwhm
from photutils.psf import IterativelySubtractedPSFPhotometry
from photutils.psf import BasicPSFPhotometry
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import const # Lädt die Konstanten XMIN, XMAX, YMIN, YMAX (relevanter Bildausschnitt)

def photometry(file, fixedStars):
    image = fits.open(file)[0].data[const.YMIN:const.YMAX,const.XMIN:const.XMAX]

# Auslesen der Clear-Sterndaten für B- und V-Bilder
    if fixedStars:
        clear = pd.read_csv("clear.csv")
        clear = clear[clear['x_fit'] < const.XMAX - const.XMIN]
        clear = clear[clear['y_fit'] < const.YMAX - const.YMIN]
        clear = clear[clear['x_fit'] >= 0]
        clear = clear[clear['y_fit'] >= 0]
    
        pos = Table(names=['x_0', 'y_0'], data=[clear['x_fit'],clear['y_fit']])
    sigma_psf = 2.0
    bkgrms = MADStdBackgroundRMS()
    std = bkgrms(image)
# Bei kleineren Bildausschnitten ist eine kleinere Standardabweichung über Rauschen nötig, da bei größeren Bildern mehr Nicht-Stern-Hintergrund sichtbar ist
    iraffind = IRAFStarFinder(threshold=2.2*std, fwhm=sigma_psf * gaussian_sigma_to_fwhm, minsep_fwhm=0.01, roundhi=5.0, roundlo=-5.0, sharplo=0.0, sharphi=2.0)
    daogroup = DAOGroup(2.0 * sigma_psf *gaussian_sigma_to_fwhm)
    mmm_bkg = MMMBackground()
    fitter = LevMarLSQFitter()
    psf_model = IntegratedGaussianPRF(sigma=sigma_psf)
    # Für B- oder V-Bilder benutze bereits existierende Sternpositionen aus Clear
    if fixedStars:
        psf_model.x_0.fixed = True
        psf_model.y_0.fixed = True
        photometry = BasicPSFPhotometry(group_maker=daogroup,
        bkg_estimator=mmm_bkg,
        psf_model=psf_model,
        fitter=LevMarLSQFitter(),fitshape=(7, 7))
    # Finde die Sternpositionen im Clear-Fall
    else:
        photometry = IterativelySubtractedPSFPhotometry(finder=iraffind, group_maker=daogroup, bkg_estimator=mmm_bkg, psf_model=psf_model,fitter=LevMarLSQFitter(), niters=1, fitshape=(7, 7))
    if fixedStars:
        return image, photometry(image=image, init_guesses=pos)
    else:
        return image, photometry(image=image)
# Bilder laden und Ergebnisse speichern
img1, res1 = photometry('30_06/M13/clear_final.fit', False)
res1.write('clear.csv', format='csv', overwrite=True)

img2, res2 = photometry('30_06/M13/b_final.fit', True)
res2.write('b.csv', format='csv', overwrite=True)

img3, res3 = photometry('30_06/M13/v_final.fit', True)
res3.write('v.csv', format='csv', overwrite=True)


Ergebnisse aus dem Code

Mit obigem Code lassen sich die Sterne digitalisieren und im Anschluss zählen. Auf dem rechten Bild ist der Sternhaufen M13 abgebildet. Links sieht man das gestackte Rohbild, welches mit Python eingelesen und dargestellt wurde. Rechts ist die digitalisierte Version des Sternhaufens abgebildet. Insgesamt konnten mit dieser Methode 3715 Sterne gezählt werden.

Rohbild links und digitalisiertes Bild rechts.


88x31.png Universität Stuttgart, 5. Physikalisches Institut, AG Physik und ihre Didaktik, lizenziert unter CC BY-NC-SA 4.0