PF:Sterne eines Sternhaufens automatisch zählen: Unterschied zwischen den Versionen
Aus Wiki Physik und ihre Didaktik
1>Treinsch Die Seite wurde neu angelegt: „Kategorie:Astronomie <div class="row"> <div class="large-12 columns> In Arbeit. __INHALTSVERZEICHNIS__ </div> <div class="large-0 columns> </div> </div> {| https://i.creativecommons.org/l/by-nc-sa/3.0/de/88x31.png Universität Stuttgart, 5. Physikalisches Institut, AG Physik und ihre Didaktik, lizenziert unter [https://creativecommons.org/licenses/by-nc-sa/4.0/deed.de CC BY-NC-SA 4.0] |}“ |
1>Treinsch Keine Bearbeitungszusammenfassung |
||
| Zeile 11: | Zeile 11: | ||
</div> | </div> | ||
</div> | </div> | ||
= Codebeispiel = | |||
<syntaxhighlight lang=python> | |||
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) | |||
</syntaxhighlight> | |||
Version vom 1. September 2022, 13:58 Uhr
In Arbeit.
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)
Universität Stuttgart, 5. Physikalisches Institut, AG Physik und ihre Didaktik, lizenziert unter CC BY-NC-SA 4.0