diff --git a/pykat/optics/maps.py b/pykat/optics/maps.py index f013a162ea5554df1eaddc2ca22356ce3b495bd4..88899151894c941a6dd7f60f0c5603b7746dfbce 100644 --- a/pykat/optics/maps.py +++ b/pykat/optics/maps.py @@ -628,6 +628,50 @@ class surfacemap(object): return self.Rc, self.zernikeRemoved + def rmTiltedSurf(self, w=None, xbeta=None, ybeta=None, zOff=None): + + X,Y = np.meshgrid(self.x,self.y) + r2 = X**2 + Y**2 + + if w is not None: + weight = 2/(math.pi*w**2) * np.exp(-2*r2[self.notNan]/w**2) + + def f(p): + # This is used in simtools, why? + #p[0] = p[0]*1.0e-9 + #p[1] = p[1]*1.0e-9 + Z = self.createSurface(0,X,Y,p[2],0,0,p[0],p[1]) + if w is None: + res = math.sqrt(((self.data[self.notNan]-Z[self.notNan])**2).sum())/self.notNan.sum() + else: + # weight = 2/(math.pi*w**2) * np.exp(-2*r2[self.notNan]/w**2) + res = math.sqrt((weight*(self.data[self.notNan]-Z[self.notNan])**2).sum())/weight.sum() + + return res + + if xbeta is None: + xbeta = 0 + if ybeta is None: + ybeta = 0 + if zOff is None: + zOff = 0 + + params = [xbeta,ybeta,zOff] + + opts = {'xtol': 1.0e-8, 'ftol': 1.0e-8, 'maxiter': 2000, 'disp': False} + out = minimize(f, params, method='Nelder-Mead', options=opts) + + xbeta = out['x'][0] + ybeta = out['x'][1] + zOff = out['x'][2] + + Z = self.createSurface(0,X,Y,zOff,0,0,xbeta,ybeta) + self.data[self.notNan] = self.data[self.notNan] - Z[self.notNan] + self.betaRemoved = (xbeta, ybeta) + + return xbeta,ybeta,zOff + + def rmSphericalSurf(self, Rc0, w=None, zOff=None, isCenter=[False,False]): ''' Fits spherical surface to the mirror map and removes it. @@ -995,49 +1039,19 @@ class surfacemap(object): print(' Equivalent tilt in radians: xbeta = {:.2e} rad'.format(xbeta)) print(' ybeta = {:.2e} rad'.format(ybeta)) else: - X,Y = np.meshgrid(self.x,self.y) - r2 = X**2 + Y**2 - - def f(p): - - # This is used in simtools, why? - #p[0] = p[0]*1.0e-9 - #p[1] = p[1]*1.0e-9 - - Z = self.createSurface(0,X,Y,p[2],0,0,p[0],p[1]) - if w is None: - res = math.sqrt(((self.data[self.notNan]-Z[self.notNan])**2).sum())/self.notNan.sum() - else: - weight = 2/(math.pi*w**2) * np.exp(-2*r2[self.notNan]/w**2) - res = math.sqrt((weight*(self.data[self.notNan]-Z[self.notNan])**2).sum())/weight.sum() - - return res - - xbeta = 0 - ybeta = 0 - offset = 0 - params = [xbeta,ybeta,offset] - opts = {'xtol': 1.0e-8, 'ftol': 1.0e-8, 'maxiter': 2000, 'disp': False} - out = minimize(f, params, method='Nelder-Mead', options=opts) - - xbeta = out['x'][0] - ybeta = out['x'][1] - offset = out['x'][2] + xbeta,ybeta,zOff = self.rmTiltedSurf(w) - Z = self.createSurface(0,X,Y,offset,0,0,xbeta,ybeta) - self.data[self.notNan] = self.data[self.notNan] - Z[self.notNan] - self.betaRemoved = (xbeta, ybeta) # Equivalent Zernike amplitude A1 = R*np.tan(np.array([ybeta,xbeta]))/self.scaling self.zernikeRemoved = (-1,1,A1[0]) self.zernikeRemoved = (1,1,A1[1]) - A0 = A0 + offset + A0 = A0 + zOff self.zernikeRemoved = (0,0,A0) print(' Tilted surface removed:') print(' xbeta = {:.2e} rad'.format(xbeta)) print(' ybeta = {:.2e} rad'.format(ybeta)) - print(' z-offset = {:.2e} nm'.format(offset)) + print(' z-offset = {:.2e} nm'.format(zOff)) print(' Equivalent Zernike amplitudes:') print(' A(1,-1) = {:.2f} nm'.format(A1[0])) print(' A(1, 1) = {:.2f} nm'.format(A1[1])) @@ -1062,10 +1076,16 @@ class surfacemap(object): print(' Phase map written to file {:s}'.format(filename)) self.plot() + ''' print(' Writing result information to file...') + # -------------------------------------------------------- filename = self.name + '_finesse_info.txt' self.writeResults(filename) print(' Result written to file {:s}'.format(filename)) + ''' + + + # Add "create aperture map"