def endOfIteration(self):
        #print self.obj0
        self.iter += 1
        if (self.iter % self.saveRate) == 0:
            print 'saving...'
            (obj1, self.ct, self.St, self.grt, self.Jt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True)
            dim2 = self.dim**2
            A = [np.zeros([self.Tsize, self.dim, self.dim]), np.zeros([self.Tsize, self.dim])]
            if self.affineDim > 0:
                for t in range(self.Tsize):
                    AB = np.dot(self.affineBasis, Afft[t])
                    A[0][t] = AB[0:dim2].reshape([self.dim, self.dim])
                    A[1][t] = AB[dim2:dim2+self.dim]
            (ct, St, grt)  = evol.gaussianDiffeonsEvolutionEuler(self.c0, self.S0, self.at, self.param.sigmaKernel, affine=A, withPointSet= self.gr0Fine)
 	    # (ct, St, grt, Jt)  = evol.gaussianDiffeonsEvolutionEuler(self.c0, self.S0, self.at, self.param.sigmaKernel, affine=A,
            #                                                         withPointSet = self.fv0Fine.vertices, withJacobian=True)
            imDef = diffeo.gridScalars(grid = self.im1)
            for kk in range(self.Tsize+1):
                imDef.data = diffeo.multilinInterp(self.im1.data, grt[kk, ...].transpose(range(-1, self.grt.ndim-2)))
                imDef.saveImg(self.outputDir +'/'+ self.saveFile+str(kk)+'.png', normalize=True)
                if self.dim==3:
                    gd.saveDiffeons(self.outputDir +'/'+ self.saveFile+'Diffeons'+str(kk)+'.vtk', self.ct[kk,...], self.St[kk,...])
                elif self.dim==2:
                    (R, detR) = gd.multiMatInverse1(self.St[kk,...], isSym=True)
                    diffx = self.gr1[..., np.newaxis, :] - self.ct[kk, ...]
                    betax = (R*diffx[..., np.newaxis, :]).sum(axis=-1)
                    dst = (betax * diffx).sum(axis=-1)
                    diffIm = np.minimum((255*(1-dst)*(dst < 1)).astype(float).sum(axis=-1), 255)
                    out = Image.fromarray(diffIm.astype(np.uint8))
                    out.save(self.outputDir +'/'+ self.saveFile+'Diffeons'+str(kk)+'.png')
        else:
            (obj1, self.ct, self.St, self.grt, self.Jt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True)
    def endOfIteration(self):
        #print self.obj0
        self.iter += 1
        if (self.iter % self.saveRate == 0) :
            if self.dcurr:
                print 'saving...'
                (obj1, self.ct, self.St, self.bt, self.xt, self.xSt, Jt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True, withJacobian=True)
                dim2 = self.dim**2
                A = [np.zeros([self.Tsize, self.dim, self.dim]), np.zeros([self.Tsize, self.dim])]
                if self.affineDim > 0:
                    for t in range(self.Tsize):
                        AB = np.dot(self.affineBasis, Afft[t])
                        A[0][t] = AB[0:dim2].reshape([self.dim, self.dim])
                        A[1][t] = AB[dim2:dim2+self.dim]
		(ct, St, xt, Jt)  = evol.gaussianDiffeonsEvolutionEuler(self.c0, self.S0, self.at, self.param.sigmaKernel, affine=A,
                                                                        withPointSet = self.fv0Fine.vertices, withJacobian=True)
                fvDef = surfaces.Surface(surf=self.fv0Fine)
                for kk in range(self.Tsize+1):
                    self.fvDef.updateVertices(np.squeeze(self.xt[kk, :, :]))
                    fvDef.updateVertices(np.squeeze(xt[kk, :, :]))
                    # foo = (gd.diffeonCurrentNormDef(self.xt[kk], self.xSt[kk], self.bt[kk], self.fvDef, self.param.KparDist.sigma)
                    #        + gd.diffeonCurrentNorm0(self.fvDef, self.param.KparDist))/ (self.param.sigmaError**2)
                    # print foo
                    fvDef.saveVTK(self.outputDir +'/'+ self.saveFile+str(kk)+'.vtk', scalars = Jt[kk, :], scal_name='Jacobian')
                    gd.saveDiffeons(self.outputDir +'/'+ self.saveFile+'Diffeons'+str(kk)+'.vtk', self.ct[kk,:,:], self.St[kk,:,:,:])
                    self.saveB(self.outputDir +'/'+ self.saveFile+'Bt'+str(kk)+'.vtk', self.xt[kk,:,:], self.bt[kk,:,:])
            else:
                (obj1, self.ct, self.St, self.xt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True)
                self.fvDef.updateVertices(np.squeeze(self.xt[-1, :, :]))
                dim2 = self.dim**2
                A = [np.zeros([self.Tsize, self.dim, self.dim]), np.zeros([self.Tsize, self.dim])]
                if self.affineDim > 0:
                    for t in range(self.Tsize):
                        AB = np.dot(self.affineBasis, Afft[t])
                        A[0][t] = AB[0:dim2].reshape([self.dim, self.dim])
                        A[1][t] = AB[dim2:dim2+self.dim]
		(ct, St, xt, Jt)  = evol.gaussianDiffeonsEvolutionEuler(self.c0, self.S0, self.at, self.param.sigmaKernel, affine=A,
                                                                        withPointSet = self.fv0Fine.vertices, withJacobian=True)
                fvDef = surfaces.Surface(surf=self.fv0Fine)
                for kk in range(self.Tsize+1):
                    fvDef.updateVertices(np.squeeze(xt[kk, :, :]))
                    fvDef.saveVTK(self.outputDir +'/'+ self.saveFile+str(kk)+'.vtk', scalars = Jt[kk, :], scal_name='Jacobian')
                        #self.fvDef.saveVTK(self.outputDir +'/'+ self.saveFile+str(kk)+'.vtk', scalars = self.idx, scal_name='Labels')
                    gd.saveDiffeons(self.outputDir +'/'+ self.saveFile+'Diffeons'+str(kk)+'.vtk', self.ct[kk,:,:], self.St[kk,:,:,:])

            #print self.bt

        else:
            if self.dcurr:
                (obj1, self.ct, self.St, self.bt, self.xt, self.xSt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True)
            else:
                (obj1, self.ct, self.St, self.xt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True)
                self.fvDef.updateVertices(np.squeeze(self.xt[-1, :, :]))