22 from __future__
import absolute_import, division, print_function
24 from builtins
import range
26 from .
import diffimLib
27 from lsst.log
import Log
29 sigma2fwhm = 2. * np.sqrt(2. * np.log(2.))
33 basisDegGauss=
None, metadata=
None):
34 """Generate the appropriate Kernel basis based on the Config"""
35 if config.kernelBasisSet ==
"alard-lupton":
37 referenceFwhmPix=referenceFwhmPix,
38 basisDegGauss=basisDegGauss,
40 elif config.kernelBasisSet ==
"delta-function":
41 kernelSize = config.kernelSize
42 return diffimLib.makeDeltaFunctionBasisList(kernelSize, kernelSize)
44 raise ValueError(
"Cannot generate %s basis set" % (config.kernelBasisSet))
48 basisDegGauss=
None, metadata=
None):
49 """Generate an Alard-Lupton kernel basis based upon the Config and
50 the input FWHM of the science and template images"""
52 if config.kernelBasisSet !=
"alard-lupton":
53 raise RuntimeError(
"Cannot generate %s basis within generateAlardLuptonBasisList" %
54 config.kernelBasisSet)
56 kernelSize = config.kernelSize
57 fwhmScaling = config.kernelSizeFwhmScaling
58 basisNGauss = config.alardNGauss
59 basisSigmaGauss = config.alardSigGauss
60 basisGaussBeta = config.alardGaussBeta
61 basisMinSigma = config.alardMinSig
62 if basisDegGauss
is None:
63 basisDegGauss = config.alardDegGauss
65 if len(basisDegGauss) != basisNGauss:
66 raise ValueError(
"len(basisDegGauss) != basisNGauss : %d vs %d" % (len(basisDegGauss), basisNGauss))
67 if len(basisSigmaGauss) != basisNGauss:
68 raise ValueError(
"len(basisSigmaGauss) != basisNGauss : %d vs %d" %
69 (len(basisSigmaGauss), basisNGauss))
70 if (kernelSize % 2) != 1:
71 raise ValueError(
"Only odd-sized Alard-Lupton bases allowed")
73 if (targetFwhmPix
is None)
or (referenceFwhmPix
is None)
or (
not config.scaleByFwhm):
74 if metadata
is not None:
75 metadata.add(
"ALBasisNGauss", basisNGauss)
76 metadata.add(
"ALBasisDegGauss", basisDegGauss)
77 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
78 metadata.add(
"ALKernelSize", kernelSize)
80 return diffimLib.makeAlardLuptonBasisList(kernelSize//2, basisNGauss, basisSigmaGauss, basisDegGauss)
82 targetSigma = targetFwhmPix / sigma2fwhm
83 referenceSigma = referenceFwhmPix / sigma2fwhm
84 logger = Log.getLogger(
"lsst.ip.diffim.generateAlardLuptonBasisList")
85 logger.debug(
"Generating matching bases for sigma %.2f pix -> %.2f pix", targetSigma, referenceSigma)
94 if targetSigma == referenceSigma:
97 elif referenceSigma > targetSigma:
106 kernelSigma = np.sqrt(referenceSigma**2 - targetSigma**2)
107 if kernelSigma < basisMinSigma:
108 kernelSigma = basisMinSigma
112 basisSigmaGauss.append(kernelSigma)
115 if (kernelSigma/basisGaussBeta) > basisMinSigma:
116 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
117 basisSigmaGauss.append(kernelSigma)
120 basisSigmaGauss.append(kernelSigma)
125 for i
in range(nAppended, basisNGauss):
126 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
128 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
129 kernelSize += 0
if kernelSize%2
else 1
130 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
141 basisNGauss = config.alardNGaussDeconv
142 basisMinSigma = config.alardMinSigDeconv
144 kernelSigma = np.sqrt(targetSigma**2 - referenceSigma**2)
145 if kernelSigma < basisMinSigma:
146 kernelSigma = basisMinSigma
149 if (kernelSigma/basisGaussBeta) > basisMinSigma:
150 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
151 basisSigmaGauss.append(kernelSigma)
154 basisSigmaGauss.append(kernelSigma)
157 for i
in range(nAppended, basisNGauss):
158 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
160 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
161 kernelSize += 0
if kernelSize%2
else 1
162 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
165 sig0 = basisSigmaGauss[0]
166 sig1 = basisSigmaGauss[1]
167 sig2 = basisSigmaGauss[2]
169 for n
in range(1, 3):
171 sigma2jn = (n - j)*sig1**2
172 sigma2jn += j * sig2**2
173 sigma2jn -= (n + 1)*sig0**2
174 sigmajn = np.sqrt(sigma2jn)
175 basisSigmaGauss.append(sigmajn)
177 basisSigmaGauss.sort()
178 basisNGauss = len(basisSigmaGauss)
179 basisDegGauss = [config.alardDegGaussDeconv
for x
in basisSigmaGauss]
181 if metadata
is not None:
182 metadata.add(
"ALBasisNGauss", basisNGauss)
183 metadata.add(
"ALBasisDegGauss", basisDegGauss)
184 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
185 metadata.add(
"ALKernelSize", kernelSize)
187 return diffimLib.makeAlardLuptonBasisList(kernelSize//2, basisNGauss, basisSigmaGauss, basisDegGauss)
def generateAlardLuptonBasisList