Exemple #1
0
    def calcCRB(self, caller=None):
        from PYME.Analysis import cramerRao
        from PYME.Analysis.PSFGen import fourierHNA
        #print 'b'
        import numpy as np
        try:
            d = self.image.data[:, :, :, 0].squeeze()
            I = d[:, :, int(d.shape[2] / 2)].sum()

            vs = self.image.voxelsize_nm

            #print 'fi'
            FI = cramerRao.CalcFisherInformZn2(d * (2e3 / I) + self.background,
                                               100,
                                               voxelsize=vs)
            #print 'crb'
            self.crb = cramerRao.CalcCramerReoZ(FI)
            #print 'crbd'

            z_ = np.arange(d.shape[2]) * vs.z
            self.z_ = z_ - z_.mean()

            ps_as = fourierHNA.GenAstigPSF(self.z_, dx=vs.x, strength=2)
            I = ps_as[:, :, int(ps_as.shape[2] / 2)].sum()
            self.crb_as = (cramerRao.CalcCramerReoZ(
                cramerRao.CalcFisherInformZn2(ps_as * 2000 / I +
                                              self.background,
                                              500,
                                              voxelsize=vs)))

            self.draw()
        except np.linalg.linalg.LinAlgError:
            # don't hang if we can't compute the CRLB
            import traceback
            traceback.print_exc()
    def OnCalcCRB3DvsBG(self, event):
        from PYME.Analysis import cramerRao
        from PYME.Analysis.PSFGen import fourierHNA
        #print 'b'
        import numpy as np

        vs = 1e3 * np.array([
            self.image.mdh['voxelsize.x'], self.image.mdh['voxelsize.y'],
            self.image.mdh['voxelsize.z']
        ])

        zf = self.image.data.shape[2] / 2
        dz = 500 / vs[2]

        d = self.image.data[:, :, (zf - dz):(zf + dz + 1)]
        I = d[:, :, d.shape[2] / 2].sum()

        bgv = np.logspace(-1, 2)
        z_ = np.arange(d.shape[2]) * vs[2]
        z_ = z_ - z_.mean()

        ps_as = fourierHNA.GenAstigPSF(z_, vs[0], 2)
        Ias = ps_as[:, :, ps_as.shape[2] / 2].sum()

        crb3D = []
        crb3Das = []

        for bg in bgv:
            FI = cramerRao.CalcFisherInformZn2(d * (2e3 / I) + bg,
                                               100,
                                               voxelsize=vs)
            crb = cramerRao.CalcCramerReoZ(FI)
            crb_as = (cramerRao.CalcCramerReoZ(
                cramerRao.CalcFisherInformZn2(ps_as * 2000 / Ias + bg,
                                              500,
                                              voxelsize=vs)))

            crb3D.append(np.sqrt(crb.sum(1)).mean())
            crb3Das.append(np.sqrt(crb_as.sum(1)).mean())

        import pylab

        pylab.figure()
        pylab.plot(bgv, crb3Das, label='Theoretical PSF')
        pylab.plot(bgv, crb3D, label='Measured PSF')
        pylab.legend()

        pylab.xlabel('Background [photons]')
        pylab.ylabel('Average CRB 3D')
        pylab.title('Cramer-Rao bound vs Background')
    def OnCalcCRB(self, event):
        #print 'f'
        from PYME.Analysis import cramerRao
        from PYME.Analysis.PSFGen import fourierHNA
        #print 'b'
        import numpy as np

        d = self.image.data[:, :, :]
        I = d[:, :, d.shape[2] / 2].sum()

        vs = 1e3 * np.array([
            self.image.mdh['voxelsize.x'], self.image.mdh['voxelsize.y'],
            self.image.mdh['voxelsize.z']
        ])

        #print 'fi'
        FI = cramerRao.CalcFisherInformZn2(d * (2e3 / I), 100, voxelsize=vs)
        #print 'crb'
        crb = cramerRao.CalcCramerReoZ(FI)
        #print 'crbd'

        import pylab
        z_ = np.arange(d.shape[2]) * self.image.mdh['voxelsize.z'] * 1.0e3
        z_ = z_ - z_.mean()

        print('p')
        pylab.figure()
        pylab.plot(z_, np.sqrt(crb[:, 0]), label='x')
        pylab.plot(z_, np.sqrt(crb[:, 1]), label='y')
        pylab.plot(z_, np.sqrt(crb[:, 2]), label='z')
        pylab.legend()

        pylab.xlabel('Defocus [nm]')
        pylab.ylabel('Std. Dev. [nm]')
        pylab.title('Cramer-Rao bound for 2000 photons')

        ps_as = fourierHNA.GenAstigPSF(z_, vs[0], 2)
        I = ps_as[:, :, ps_as.shape[2] / 2].sum()
        crb_as = np.sqrt(
            cramerRao.CalcCramerReoZ(
                cramerRao.CalcFisherInformZn2(ps_as * 2000 / I,
                                              500,
                                              voxelsize=vs)))
        pylab.plot(z_, crb_as[:, 0], 'b:')
        pylab.plot(z_, crb_as[:, 1], 'g:')
        pylab.plot(z_, crb_as[:, 2], 'r:')