22 from __future__
import absolute_import, division, print_function
24 __all__ = [
"makeKernelBasisList",
"generateAlardLuptonBasisList"]
26 from builtins
import range
28 from .
import diffimLib
32 sigma2fwhm = 2. * np.sqrt(2. * np.log(2.))
36 basisDegGauss=None, metadata=None):
37 """Generate the appropriate Kernel basis based on the Config""" 38 if config.kernelBasisSet ==
"alard-lupton":
40 referenceFwhmPix=referenceFwhmPix,
41 basisDegGauss=basisDegGauss,
43 elif config.kernelBasisSet ==
"delta-function":
44 kernelSize = config.kernelSize
45 return diffimLib.makeDeltaFunctionBasisList(kernelSize, kernelSize)
47 raise ValueError(
"Cannot generate %s basis set" % (config.kernelBasisSet))
51 basisDegGauss=None, metadata=None):
52 """Generate an Alard-Lupton kernel basis based upon the Config and 53 the input FWHM of the science and template images""" 55 if config.kernelBasisSet !=
"alard-lupton":
56 raise RuntimeError(
"Cannot generate %s basis within generateAlardLuptonBasisList" %
57 config.kernelBasisSet)
59 kernelSize = config.kernelSize
60 fwhmScaling = config.kernelSizeFwhmScaling
61 basisNGauss = config.alardNGauss
62 basisSigmaGauss = config.alardSigGauss
63 basisGaussBeta = config.alardGaussBeta
64 basisMinSigma = config.alardMinSig
65 if basisDegGauss
is None:
66 basisDegGauss = config.alardDegGauss
68 if len(basisDegGauss) != basisNGauss:
69 raise ValueError(
"len(basisDegGauss) != basisNGauss : %d vs %d" % (len(basisDegGauss), basisNGauss))
70 if len(basisSigmaGauss) != basisNGauss:
71 raise ValueError(
"len(basisSigmaGauss) != basisNGauss : %d vs %d" %
72 (len(basisSigmaGauss), basisNGauss))
73 if (kernelSize % 2) != 1:
74 raise ValueError(
"Only odd-sized Alard-Lupton bases allowed")
76 if (targetFwhmPix
is None)
or (referenceFwhmPix
is None)
or (
not config.scaleByFwhm):
77 if metadata
is not None:
78 metadata.add(
"ALBasisNGauss", basisNGauss)
79 metadata.add(
"ALBasisDegGauss", basisDegGauss)
80 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
81 metadata.add(
"ALKernelSize", kernelSize)
83 return diffimLib.makeAlardLuptonBasisList(kernelSize//2, basisNGauss, basisSigmaGauss, basisDegGauss)
85 targetSigma = targetFwhmPix / sigma2fwhm
86 referenceSigma = referenceFwhmPix / sigma2fwhm
87 logger = Log.getLogger(
"lsst.ip.diffim.generateAlardLuptonBasisList")
88 logger.debug(
"Generating matching bases for sigma %.2f pix -> %.2f pix", targetSigma, referenceSigma)
97 if targetSigma == referenceSigma:
100 elif referenceSigma > targetSigma:
109 kernelSigma = np.sqrt(referenceSigma**2 - targetSigma**2)
110 if kernelSigma < basisMinSigma:
111 kernelSigma = basisMinSigma
115 basisSigmaGauss.append(kernelSigma)
118 if (kernelSigma/basisGaussBeta) > basisMinSigma:
119 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
120 basisSigmaGauss.append(kernelSigma)
123 basisSigmaGauss.append(kernelSigma)
128 for i
in range(nAppended, basisNGauss):
129 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
131 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
132 kernelSize += 0
if kernelSize%2
else 1
133 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
144 basisNGauss = config.alardNGaussDeconv
145 basisMinSigma = config.alardMinSigDeconv
147 kernelSigma = np.sqrt(targetSigma**2 - referenceSigma**2)
148 if kernelSigma < basisMinSigma:
149 kernelSigma = basisMinSigma
152 if (kernelSigma/basisGaussBeta) > basisMinSigma:
153 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
154 basisSigmaGauss.append(kernelSigma)
157 basisSigmaGauss.append(kernelSigma)
160 for i
in range(nAppended, basisNGauss):
161 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
163 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
164 kernelSize += 0
if kernelSize%2
else 1
165 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
168 sig0 = basisSigmaGauss[0]
169 sig1 = basisSigmaGauss[1]
170 sig2 = basisSigmaGauss[2]
172 for n
in range(1, 3):
174 sigma2jn = (n - j)*sig1**2
175 sigma2jn += j * sig2**2
176 sigma2jn -= (n + 1)*sig0**2
177 sigmajn = np.sqrt(sigma2jn)
178 basisSigmaGauss.append(sigmajn)
180 basisSigmaGauss.sort()
181 basisNGauss = len(basisSigmaGauss)
182 basisDegGauss = [config.alardDegGaussDeconv
for x
in basisSigmaGauss]
184 if metadata
is not None:
185 metadata.add(
"ALBasisNGauss", basisNGauss)
186 metadata.add(
"ALBasisDegGauss", basisDegGauss)
187 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
188 metadata.add(
"ALKernelSize", kernelSize)
190 return diffimLib.makeAlardLuptonBasisList(kernelSize//2, basisNGauss, basisSigmaGauss, basisDegGauss)
def makeKernelBasisList(config, targetFwhmPix=None, referenceFwhmPix=None, basisDegGauss=None, metadata=None)
def generateAlardLuptonBasisList(config, targetFwhmPix=None, referenceFwhmPix=None, basisDegGauss=None, metadata=None)