43 basisDegGauss=
None, metadata=
None):
44 """Generate an Alard-Lupton kernel basis based upon the Config and
45 the input FWHM of the science and template images"""
47 if config.kernelBasisSet !=
"alard-lupton":
48 raise RuntimeError(
"Cannot generate %s basis within generateAlardLuptonBasisList" % config.kernelBasisSet)
50 kernelSize = config.kernelSize
51 fwhmScaling = config.kernelSizeFwhmScaling
52 basisNGauss = config.alardNGauss
53 basisSigmaGauss = config.alardSigGauss
54 basisGaussBeta = config.alardGaussBeta
55 basisMinSigma = config.alardMinSig
56 if basisDegGauss
is None:
57 basisDegGauss = config.alardDegGauss
59 if len(basisDegGauss) != basisNGauss:
60 raise ValueError(
"len(basisDegGauss) != basisNGauss : %d vs %d" % (len(basisDegGauss), basisNGauss))
61 if len(basisSigmaGauss) != basisNGauss:
62 raise ValueError(
"len(basisSigmaGauss) != basisNGauss : %d vs %d" % (len(basisSigmaGauss), basisNGauss))
63 if (kernelSize % 2) != 1:
64 raise ValueError(
"Only odd-sized Alard-Lupton bases allowed")
66 if (targetFwhmPix
is None)
or (referenceFwhmPix
is None)
or (
not config.scaleByFwhm):
67 if metadata
is not None:
68 metadata.add(
"ALBasisNGauss", basisNGauss)
69 metadata.add(
"ALBasisDegGauss", basisDegGauss)
70 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
71 metadata.add(
"ALKernelSize", kernelSize)
73 return diffimLib.makeAlardLuptonBasisList(kernelSize//2, basisNGauss, basisSigmaGauss, basisDegGauss)
75 targetSigma = targetFwhmPix / sigma2fwhm
76 referenceSigma = referenceFwhmPix / sigma2fwhm
77 pexLog.Trace(
"lsst.ip.diffim.generateAlardLuptonBasisList", 2,
78 "Generating matching bases for sigma %.2f pix -> %.2f pix" % (targetSigma, referenceSigma))
87 if targetSigma == referenceSigma:
90 elif referenceSigma > targetSigma:
99 kernelSigma = np.sqrt(referenceSigma**2 - targetSigma**2)
100 if kernelSigma < basisMinSigma:
101 kernelSigma = basisMinSigma
105 basisSigmaGauss.append(kernelSigma)
108 if (kernelSigma/basisGaussBeta) > basisMinSigma:
109 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
110 basisSigmaGauss.append(kernelSigma)
113 basisSigmaGauss.append(kernelSigma)
118 for i
in range(nAppended,basisNGauss):
119 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
121 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
122 kernelSize += 0
if kernelSize%2
else 1
123 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
134 basisNGauss = config.alardNGaussDeconv
135 basisMinSigma = config.alardMinSigDeconv
137 kernelSigma = np.sqrt(targetSigma**2 - referenceSigma**2)
138 if kernelSigma < basisMinSigma:
139 kernelSigma = basisMinSigma
142 if (kernelSigma/basisGaussBeta) > basisMinSigma:
143 basisSigmaGauss.append(kernelSigma/basisGaussBeta)
144 basisSigmaGauss.append(kernelSigma)
147 basisSigmaGauss.append(kernelSigma)
150 for i
in range(nAppended,basisNGauss):
151 basisSigmaGauss.append(basisSigmaGauss[-1]*basisGaussBeta)
153 kernelSize = int(fwhmScaling * basisSigmaGauss[-1])
154 kernelSize += 0
if kernelSize%2
else 1
155 kernelSize = min(config.kernelSizeMax, max(kernelSize, config.kernelSizeMin))
158 sig0 = basisSigmaGauss[0]
159 sig1 = basisSigmaGauss[1]
160 sig2 = basisSigmaGauss[2]
162 for n
in range(1, 3):
164 sigma2jn = (n - j) * sig1**2
165 sigma2jn += j * sig2**2
166 sigma2jn -= (n + 1) * sig0**2
167 sigmajn = np.sqrt(sigma2jn)
168 basisSigmaGauss.append(sigmajn)
170 basisSigmaGauss.sort()
171 basisNGauss = len(basisSigmaGauss)
172 basisDegGauss = [config.alardDegGaussDeconv
for x
in basisSigmaGauss]
174 if metadata
is not None:
175 metadata.add(
"ALBasisNGauss", basisNGauss)
176 metadata.add(
"ALBasisDegGauss", basisDegGauss)
177 metadata.add(
"ALBasisSigGauss", basisSigmaGauss)
178 metadata.add(
"ALKernelSize", kernelSize)
180 return diffimLib.makeAlardLuptonBasisList(kernelSize//2, basisNGauss, basisSigmaGauss, basisDegGauss)
limited backward compatibility to the DC2 run-time trace facilities