Package: photerr
PhotErrPhotErr is a photometric error model for astronomical imaging surveys.
It implements a generalization of the high-SNR point-source error model fromIvezic (2019)that is more accurate in the low SNR regime and includes errors for extended sources, using the models fromvan den Busch (2020)andKuijken (2019).PhotErr currently includes photometric error models for the Vera C. Rubin Observatory Legacy Survey of Space and Time (LSST), as well as the Euclid and Nancy Grace Roman space telescopes.Getting startedPhotErr is available on PyPI and can be installed with pip:pipinstallphoterrNote that PhotErr requires Python >= 3.8.Once installed, you can import the error models. For example, to use the default LSST error model,fromphoterrimportLsstErrorModelerrModel=LsstErrorModel()catalog_with_errors=errModel(catalog,random_state=42)The error model expects an input catalog in the form of a pandas DataFrame with true magnitudes, and it returns another DataFrame containing observed magnitudes and photometric errors.
Any extraneous columns in the DataFrame (e.g. a redshift column), remain in the new DataFrame - their presence does not effect the error model.If compatibility with Astropy Tables, Ordered Dictionaries, etc., would be useful to you, let me know!You can also calculate limiting magnitudes:errModel.getLimitingMags()# coadded point-source 5-sigma limitserrModel.getLimitingMags(nSigma=1,coadded=False)# single-image point-source 1-sigma limitsTweaking the error modelThere are many parameters you can tweak to fine tune the error model.
To see all available parameters, you can either call help on the error model'sparamsobject,help(errModel.params)or look at the docstring of the corresponding parameters object,fromphoterrimportLsstErrorParamshelp(LsstErrorParams)All model parameters can be overridden using keyword arguments to the error model constructor.
Below, we explain a few of the more commonly tweaked parameters.Changing the observing durationThe example above uses the default settings for the LSST model, which includes 10 years of observing time.
If instead you want to calculate errors for LSST year 1, you can pass thenYrObsargument to the constructor:errModel=LsstErrorModel(nYrObs=1)Changing the band namesAnother parameter you might want to tweak is the name of the bands.
By default, theLsstErrorModelassumes that the LSST bands are namedu,g, etc.
If instead, the bands in your catalog are namedlsst_u,lsst_g, etc., then you can instantiate the error model with a rename dictionary:errModel=LsstErrorModel(renameDict={"u":"lsst_u","g":"lsst_g",...})This tellsLsstErrorModelto use all of the default parameters, but just change the names it gave to all of the bands.
If you are changing other dictionary-parameters at the same time (e.g.nVisYr, which sets the number of visits in each band per year), you can supply those parameters usingeitherthe new or old naming scheme!Directly setting limiting magnitudesBy default, PhotErr tries to use the provided information to calculate limiting magnitudes for you.
If you would like to directly supply your own $5\sigma$ limits, you can do so using them5parameter.
Note PhotErr assumes these are single-visit point-source limiting magnitudes.
If you want to supply coadded depths, you should also setnYrObs=1andnVisYr=1, so that the calculated coadded depths are equal to those you provided.Handling non-detectionsThe other big thing you may want to change is how the error model identifies and handles non-detections.The error model has a parameter namedsigLim, which sets the limit for non-detections.
By default,sigLim=0, which means that only negative fluxes count as non-detections, however if you setsigLim=1, then any magnitudes beyond the 1-sigma limit in each band will count as a non-detection.
You can setsigLimto any non-negative float.ThendModeparameter tells the error model how to handle the non-detections.
By default,ndMode="flag", which means that the model will flag non-detections with the value set byndFlag, which defaults tonp.inf.
However, you can also setndMode="sigLim", in which case the model will set all non-detections to the n-sigma limits set by thesigLimparameter described in the previous paragraph.
Remember thatsigLimalso sets the detection threshold, so in effect, any galaxy magnitudes beyond the detection threshold will be set equal to the detection threshold.One other option is provided by theabsFluxparameter.
IfabsFlux=True, then the absolute value of all fluxes are taken before converting back to magnitudes.
If combined withsigLim=0, this means every galaxy will have an observed flux in every band.
This is useful if you do not want to worry about non-detections, but it results in a non-Gaussian error distribution for low-SNR sources.Errors for extended sourcesPhotErr can be used to calculate errors for extended sources as well.
You just have to passextendedType="auto"orextendedType="gaap"to the constructor (see explanation below for the differences in these models).
PhotErr will then look for columns in the input DataFrame that correspond to the semi-major and -minor axes of the objects, corresponding to half-light radii in arcseconds.
By default, it looks for these in columns titled "major" and "minor", but you can change the names of these columns using themajorColandminorColkeywords.You can also calculate limiting magnitudes for apertures of a given size by passing theaperturekeyword toerrModel.getLimitingMags()Scaling the errorsIf you want to scale up or scale down the errors in any band(s), you can use the keywordscale.
For example,LsstErrorModel(scale={"u": 2, "y": 2})will have all the same properties of the default error model, except the errors in theuandybands will be doubled.
This allows you to answer questions like "what happens to my science if theuband errors are doubled."Note this only scales the band-specific error.
The band-independent systematic error floor,sigmaSysis still the same, and so at high-SNR near the systematic floor, the errors won't scale as you expect.Other error modelsIn addition toLsstErrorModel, which comes with the LSST defaults, PhotErr includesEuclidErrorModelandRomanErrorModel, which come with the Euclid and Roman defaults, respectively.
Each of these models also have corresponding parameter objects:EuclidErrorParamsandRomanErrorParams.You can also start with the base error model,ErrorModel, which is not defaulted for any specific survey.
To instantiateErrorModel, there are several required arguments that you must supply.
To see a list and explanation of these arguments, see the docstring forErrorParams.Explanation of the error modelThe point source modelTo derive theIvezic (2019)error model, we start with the noise-to-signal ratio (NSR) for an object with photon count $C$ and background noise $N_0$ (which depends on seeing, read-out noise, etc.):$$
NSR^2 = \frac{N_0^2 + C}{C^2}.
$$If we define $C = C_5$ when $NSR = 1/5$, then we can solve for $N_0$ and write$$
NSR^2 = \frac{1}{C_5} \left( \frac{C_5}{C} \right) + \left[ \left( \frac{1}{5} \right)^2 - \frac{1}{C_5} \right] \left( \frac{C_5}{C} \right)^2.
$$Defining $x = \frac{C_5}{C} = 10 ^{(m - m_5) / 2.5}$ and $\gamma = \left( \frac{1}{5} \right)^2 - \frac{1}{C_5}$, we have$$
NSR^2 = (0.04 - \gamma) x + \gamma x^2 ~~ (\text{mag}^2).
$$In the high signal-to-noise ratio (SNR) limit, $NSR \ll 1$, and we can approximate$$
\sigma_\text{rand} = 2.5 \log_{10}\left( 1 + NSR \right) \approx NSR.
$$This approximation yields Equation 5 fromIvezic (2019).
In PhotErr, we do not make this approximation so that the error model generalizes to the low SNR regime.
In addition, while the high-SNR model assumes photometric errors are Gaussian in magnitude space, we model errors as Gaussian in flux space.
However, both of these high-SNR approximations can be restored with the keywordhighSNR=True.The LSST error model uses parameters fromIvezic (2019),Bianco 2022, and fromthis Rubin systems engineering notebook.
The Euclid and Roman error models followGraham (2020)in setting $\gamma = 0.04$, which is nearly identical to the values for Rubin (which are all $\sim 0.039$).In addition to the random photometric error above, we include a system error of $\sigma_\text{sys} = 0.005$ which is added in quadrature to random error. Note that the system error can be changed using the keywordsigmaSys.After adding photometric errors to the catalog, PhotErr recalculates the photometric error from the "observed" magnitudes.
This is so that the reported photometric errors do not provide a deterministic link back to the true magnitudes.
This behavior can be disabled by settingdecorrelate=False.The extended source modelTheIvezic (2019)model calculates errors for point sources.
To model errors for extended sources, we use Equation 5 fromvan den Busch (2020):$$
NSR_\text{ext} \propto
NSR_\text{pt} \sqrt{\frac{A_\text{ap}}{A_\text{psf}}},
$$where $A_\text{ap}$ is the area of the source aperture, and $A_\text{psf}$ is the area of the PSF.
We set the proportionality constant to unity, so that when $A_\text{ap} \to A_\text{psf}$, we recover the error for a point source.We include two different models for calculating the aperture area. The "auto" method fromvan den Busch (2020)calculates the semi-major and -minor axes of the aperture ( $a_\text{ap}$ and $b_\text{ap}$) from the semi-major and -minor axes of the galaxy ( $a_\text{gal}$ and $b_\text{gal}$, corresponding to half-light radii):$$
a_\text{ap} = \sqrt{\sigma_\text{psf}^2 + (2.5 a_\text{gal})^2},
\quad
b_\text{ap} = \sqrt{\sigma_\text{psf}^2 + (2.5 b_\text{gal})^2},
$$where $\sigma_\text{psf} = \text{FWHM}_\text{psf} / 2.355$ is the PSF standard deviation.
The formula for the area of an ellipse is then used to calculate the aperture area: $A_\text{ap} = \pi a_\text{ap} b_\text{ap}$.The "gaap" method for extended sources (Kuijken 2019) is nearly identical, except that it adds a minimum aperture diameter in quadrature when calculating $a_\text{ap}$ and $b_\text{ap}$, and then clips aperture diameters above a certain maximum.Calculating errors for extended sources requires columns in the galaxy catalog corresponding to the semi-major and -minor axes of the galaxies (with the length scale corresponding to the half-light radius).
You can set the names of these columns using the keywordsmajorColandminorCol.AuthorsJohn Franklin CrenshawZiang YanContributors guide