Here is my class constructor :
template <typename ImageT>
SpatialModelKernel<ImageT>::SpatialModelKernel(
detection::Footprint::Ptr const &fpPtr,
MaskedImagePtr const &miToConvolvePtr,
MaskedImagePtr const &miToNotConvolvePtr,
boost::shared_ptr<PsfMatchingFunctor<ImageT> > const &kFunctor,
policy::Policy const &policy,
bool build
) :
diffim::SpatialModelBase<ImageT>(),
_fpPtr(fpPtr),
_miToConvolvePtr(miToConvolvePtr),
_miToNotConvolvePtr(miToNotConvolvePtr),
_kFunctor(kFunctor),
_policy(policy),
_kPtr(boost::shared_ptr<math::Kernel>()),
_kErrPtr(boost::shared_ptr<math::Kernel>()),
_kSum(0.),
_bg(0.),
_bgErr(0.),
_kStats(boost::shared_ptr<ImageStatistics<image::MaskedImage<ImageT> > >())
Now, from Python if I create an instance of this class like so :
model = diffimLib.SpatialModelKernelF(fpPtr,
afwImage.MaskedImageF(templateMaskedImage, fpBBox),
afwImage.MaskedImageF(scienceMaskedImage, fpBBox),
kFunctor,
policy,
False)
I lose track of the information in miToConvolvePtr,miToNotConvolvePtr as soon as I exit the constructor. However, if I say
i1 = afwImage.MaskedImageF(templateMaskedImage, fpBBox)
i2 = afwImage.MaskedImageF(scienceMaskedImage, fpBBox)
model = diffimLib.SpatialModelKernelF(fpPtr,
i1,
i2,
kFunctor,
policy,
False)
it all works fine and dandy.
Another example. This fails:
for i in range(n):
for j in range(n):
subim1 = afwImage.MaskedImageF(mi, bbox)
subim2 = afwImage.MaskedImageF(mi, bbox)
model = ipDiffim.SpatialModelKernelF(fp, subim1, subim2, kFunctor, policy, False)
modelList.push_back(model)
print i, j, j + i*n, 'Im0', type(subim1)
print i, j, j + i*n, 'Im1a', type(model.getMiToConvolvePtr())
print i, j, j + i*n, 'Im1b', type(modelList[j + i*n].getMiToConvolvePtr())
for j in range(n):
print i, j, j + i*n, 'Im2', type(modelList[j + i*n].getMiToConvolvePtr())
---
0 0 0 Im0 <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 0 0 Im1a <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 0 0 Im1b <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 1 1 Im0 <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 1 1 Im1a <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 1 1 Im1b <class 'lsst.afw.image.imageLib.MaskedImageF'>
Segmentation fault
since subim1 and subim2 go out of scope after the j loop. At least I thought that was why...
I figured that if I defined early in the script
subim1 = afwImage.MaskedImageF() subim2 = afwImage.MaskedImageF()
this would fix things. However, it still crashes in one window I am testing it in. In another window the exact same script runs. Clearly a memory problem...
