import piff
import galsim
import ngmix
import numpy as np
# Test a Piff model that was giving errors when doing the ngmix fit.
# https://desar2.cosmology.illinois.edu/DESFiles/desarchive/ACT/finalcut/Y6A2_PIFF/20141228-r5286/D00392686/p01/psf/D00392686_z_c43_r5286p01_piff-model.fits
fname = 'D00392686_z_c43_r5286p01_piff-model.fits'
# Corresponding image is here, but we don't need it for this test script.
# https://desar2.cosmology.illinois.edu/DESFiles/desarchive/OPS/finalcut/Y5A1/r3567/20141228/D00392686/p02/red/immask/D00392686_z_c43_r3567p02_immasked.fits.fz
psf=piff.read(fname)
ibad = 63
ccdnum = 43
bad_star = psf.stars[ibad]
x = bad_star.image_pos.x
y = bad_star.image_pos.y
flux = bad_star.flux
stamp_size=24
b=galsim.BoundsI(int(x)-stamp_size/2, int(x)+stamp_size/2,
int(y)-stamp_size/2, int(y)+stamp_size/2)
model = galsim.ImageF(bounds=b, wcs=psf.wcs[ccdnum].local(bad_star.image_pos))
psf.draw(x=x, y=y, chipnum=ccdnum, flux=flux, image=model)
# The following is excerpted from
# https://github.com/DarkEnergySurvey/despyPIFF/blob/main/python/despyPIFF/piff_qa_utils.py
# with some simplifying modifications by MJ
#
# Setting up priors
#
fwhm = 0.9 # Original version did a calculation here. But that doesn't seem to matter.
flag = 0
dx, dy, g1, g2, flux = 0., 0., 0., 0., 0.
T_guess = (fwhm/ 2.35482)**2 * 2.
T = T_guess
cen = model.true_center - model.origin
pixel_scale = 0.263
seed = 1234 # Doesn't seem to matter
rng=np.random.RandomState(seed)
cen_prior=ngmix.priors.CenPrior(0.0,0.0,pixel_scale,pixel_scale,rng=rng)
gprior=ngmix.priors.GPriorBA(0.1,rng=rng)
Tprior=ngmix.priors.LogNormal(T,0.2,rng=rng)
Fprior=ngmix.priors.FlatPrior(-10.,1.e10,rng=rng)
prior=ngmix.joint_prior.PriorSimpleSep(cen_prior,gprior,Tprior,Fprior)
#
# Putting data in context for NGMIX
#
jac=ngmix.Jacobian(wcs=model.wcs, x=cen.x + x - int(x+0.5), y=cen.y + y -int(y+0.5))
# Original used the weight, but that also doesn't matter
obs=ngmix.Observation(image=model.array, weight=None, jacobian=jac)
psf_fitter = ngmix.fitting.Fitter(model='gauss', prior=prior)
psf_guesser = ngmix.guessers.SimplePSFGuesser(rng=rng, guess_from_moms=True)
# This fails with infinite loop.
psf_runner = ngmix.runners.PSFRunner(fitter=psf_fitter, guesser=psf_guesser, ntry=3)
res = psf_runner.go(obs=obs)
print(res)
ngmix_flag=res['flags']
assert ngmix_flag == 0
Traceback (most recent call last):
File "ngmix_bug.py", line 69, in <module>
res = psf_runner.go(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/runners.py", line 110, in go
return run_psf_fitter(
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/runners.py", line 207, in run_psf_fitter
res = run_fitter(
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/runners.py", line 141, in run_fitter
guess = guesser(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 1034, in __call__
return self._get_guess(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 1038, in _get_guess
T, flux = self._get_T_flux(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 774, in _get_T_flux
T, flux = self._get_T_flux_from_moms(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 818, in _get_T_flux_from_moms
T, flux = self._get_T_flux(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 774, in _get_T_flux
T, flux = self._get_T_flux_from_moms(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 818, in _get_T_flux_from_moms
T, flux = self._get_T_flux(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 774, in _get_T_flux
T, flux = self._get_T_flux_from_moms(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 818, in _get_T_flux_from_moms
T, flux = self._get_T_flux(obs=obs)
... [snip] (Many more of these recursions)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 774, in _get_T_flux
T, flux = self._get_T_flux_from_moms(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 818, in _get_T_flux_from_moms
T, flux = self._get_T_flux(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 774, in _get_T_flux
T, flux = self._get_T_flux_from_moms(obs=obs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/guessers.py", line 806, in _get_T_flux_from_moms
res = wt.get_weighted_moments(obs=obs, maxrad=1.0e9)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/gmix/gmix.py", line 626, in get_weighted_moments
res = self.get_weighted_sums(obs, maxrad)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/ngmix/gmix/gmix.py", line 656, in get_weighted_sums
gmix_nb.get_weighted_sums(
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/dispatcher.py", line 368, in _compile_for_args
argtypes.append(self.typeof_pyval(a))
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/dispatcher.py", line 686, in typeof_pyval
tp = typeof(val, Purpose.argument)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/typing/typeof.py", line 31, in typeof
ty = typeof_impl(val, c)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/functools.py", line 875, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/typing/typeof.py", line 139, in _typeof_numpy_scalar
return numpy_support.map_arrayscalar_type(val)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/np/numpy_support.py", line 213, in map_arrayscalar_type
return from_dtype(dtype)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/np/numpy_support.py", line 93, in from_dtype
return from_struct_dtype(dtype)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/np/numpy_support.py", line 520, in from_struct_dtype
ty = from_dtype(elemdtype)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/np/numpy_support.py", line 111, in from_dtype
return types.NestedArray(subtype, dtype.shape)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/types/abstract.py", line 66, in __call__
inst = type.__call__(cls, *args, **kwargs)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/types/npytypes.py", line 550, in __init__
super(NestedArray, self).__init__(dtype, ndim, 'C', name=name)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/types/npytypes.py", line 432, in __init__
super(Array, self).__init__(dtype, ndim, layout, name=name)
File "/opt/anaconda3/envs/py3.8/lib/python3.8/site-packages/numba/core/types/common.py", line 51, in __init__
if isinstance(dtype, Buffer):
File "/opt/anaconda3/envs/py3.8/lib/python3.8/abc.py", line 98, in __instancecheck__
return _abc_instancecheck(cls, instance)
RecursionError: maximum recursion depth exceeded in comparison