23 __all__ = [
"makeKernelBasisList",
"generateAlardLuptonBasisList"]
25 from .
import diffimLib
29 sigma2fwhm = 2. * np.sqrt(2. * np.log(2.))
33 basisDegGauss=None, metadata=None):
34 """Generate the appropriate Kernel basis based on the Config 38 config : TODO: DM-17458 40 targetFwhmPix : TODO: DM-17458, optional 42 referenceFwhmPix : TODO: DM-17458, optional 44 basisDegGauss : TODO: DM-17458, optional 46 metadata : TODO: DM-17458, optional 59 if config.kernelBasisSet ==
"alard-lupton":
61 referenceFwhmPix=referenceFwhmPix,
62 basisDegGauss=basisDegGauss,
64 elif config.kernelBasisSet ==
"delta-function":
65 kernelSize = config.kernelSize
66 return diffimLib.makeDeltaFunctionBasisList(kernelSize, kernelSize)
68 raise ValueError(
"Cannot generate %s basis set" % (config.kernelBasisSet))
72 basisDegGauss=None, metadata=None):
73 """Generate an Alard-Lupton kernel basis based upon the Config and 74 the input FWHM of the science and template images 78 config : TODO: DM-17458 80 targetFwhmPix : `float`, optional 82 referenceFwhmPix : `float`, optional 84 basisDegGauss : TODO: DM-17458, optional 86 metadata : TODO: DM-17458, optional 102 if config.kernelBasisSet !=
"alard-lupton":
103 raise RuntimeError(
"Cannot generate %s basis within generateAlardLuptonBasisList" %
104 config.kernelBasisSet)
106 kernelSize = config.kernelSize
107 fwhmScaling = config.kernelSizeFwhmScaling
108 basisNGauss = config.alardNGauss
109 basisSigmaGauss = config.alardSigGauss
110 basisGaussBeta = config.alardGaussBeta
111 basisMinSigma = config.alardMinSig
112 if basisDegGauss
is None:
113 basisDegGauss = config.alardDegGauss
115 if len(basisDegGauss) != basisNGauss:
116 raise ValueError(
"len(basisDegGauss) != basisNGauss : %d vs %d" % (len(basisDegGauss), basisNGauss))
117 if len(basisSigmaGauss) != basisNGauss:
118 raise ValueError(
"len(basisSigmaGauss) != basisNGauss : %d vs %d" %
119 (len(basisSigmaGauss), basisNGauss))
120 if (kernelSize % 2) != 1:
121 raise ValueError(
"Only odd-sized Alard-Lupton bases allowed")
123 if (targetFwhmPix
is None)
or (referenceFwhmPix
is None)
or (
not config.scaleByFwhm):
124 if metadata
is not None:
125 metadata.add(
"ALBasisNGauss", basisNGauss)
126 metadata.add(
"ALBasisDegGauss", basisDegGauss)
127 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
128 metadata.add(
"ALKernelSize", kernelSize)
130 return diffimLib.makeAlardLuptonBasisList(kernelSize//2, basisNGauss, basisSigmaGauss, basisDegGauss)
132 targetSigma = targetFwhmPix / sigma2fwhm
133 referenceSigma = referenceFwhmPix / sigma2fwhm
134 logger = Log.getLogger(
"lsst.ip.diffim.generateAlardLuptonBasisList")
135 logger.debug(
"Generating matching bases for sigma %.2f pix -> %.2f pix", targetSigma, referenceSigma)
144 if targetSigma == referenceSigma:
147 elif referenceSigma > targetSigma:
156 kernelSigma = np.sqrt(referenceSigma**2 - targetSigma**2)
157 if kernelSigma < basisMinSigma:
158 kernelSigma = basisMinSigma
162 basisSigmaGauss.append(kernelSigma)
165 if (kernelSigma/basisGaussBeta) > basisMinSigma:
166 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
167 basisSigmaGauss.append(kernelSigma)
170 basisSigmaGauss.append(kernelSigma)
175 for i
in range(nAppended, basisNGauss):
176 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
178 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
179 kernelSize += 0
if kernelSize%2
else 1
180 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
191 basisNGauss = config.alardNGaussDeconv
192 basisMinSigma = config.alardMinSigDeconv
194 kernelSigma = np.sqrt(targetSigma**2 - referenceSigma**2)
195 if kernelSigma < basisMinSigma:
196 kernelSigma = basisMinSigma
199 if (kernelSigma/basisGaussBeta) > basisMinSigma:
200 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
201 basisSigmaGauss.append(kernelSigma)
204 basisSigmaGauss.append(kernelSigma)
207 for i
in range(nAppended, basisNGauss):
208 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
210 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
211 kernelSize += 0
if kernelSize%2
else 1
212 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
215 sig0 = basisSigmaGauss[0]
216 sig1 = basisSigmaGauss[1]
217 sig2 = basisSigmaGauss[2]
219 for n
in range(1, 3):
221 sigma2jn = (n - j)*sig1**2
222 sigma2jn += j * sig2**2
223 sigma2jn -= (n + 1)*sig0**2
224 sigmajn = np.sqrt(sigma2jn)
225 basisSigmaGauss.append(sigmajn)
227 basisSigmaGauss.sort()
228 basisNGauss = len(basisSigmaGauss)
229 basisDegGauss = [config.alardDegGaussDeconv
for x
in basisSigmaGauss]
231 if metadata
is not None:
232 metadata.add(
"ALBasisNGauss", basisNGauss)
233 metadata.add(
"ALBasisDegGauss", basisDegGauss)
234 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
235 metadata.add(
"ALKernelSize", kernelSize)
237 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)