Example notebook for generating masks with pyMOE

In the following we exemplify how to generate masks using the generate module:

  • Circular aperture (binary + save into image file)

  • Rectangular aperture (binary + save into image file)

  • Fresnel Zone Plate (binary + save into image file)

  • Fresnel lens (with arbitrary number of layers)

  • Arbitrary phase function (with arbitrary number of layers)

  • Operations with/ within apertures (multiply, add, rotate, clip, …)

Simple exporting to .gds file of the generated masks is also exemplified, using gdsconverter module.

[1]:
# Notebook display options, change as your preference/system
%matplotlib inline
%config InlineBackend.print_figure_kwargs={'facecolor' : "w",'bbox_inches':None}

import matplotlib as mpl
mpl.rcParams['figure.dpi'] = 120
[2]:
import sys
sys.path.insert(0,'..')
sys.path.insert(0,'../..')

from matplotlib import pyplot as plt
import numpy as np

from scipy.constants import micro, nano, milli
from scipy import ndimage

import pyMOE as moe
from pyMOE.generate import *

Circular aperture

[3]:
#make circular apertures (returns also the 2D array)
npix =64
xsiz =500
ysiz = 500

mask = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)

# Create circular aperture on mask
center=(0, 0 )
mask = moe.generate.circular_aperture(mask, radius=0.5*xsiz*micro, center=center )

moe.plotting.plot_aperture(mask)
moe.plotting.plot_aperture(mask, scale=micro)

# Plot only plot
moe.plotting.plot_aperture(mask, only_plot=True)

../_images/notebooks_Generate_masks_5_0.png
../_images/notebooks_Generate_masks_5_1.png
../_images/notebooks_Generate_masks_5_2.png
[4]:
npix = 64
xsiz = 128
ysiz = 128

center = (0,0)

aper1 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
aper2 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
aper3 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)

mask1 = moe.generate.circular_aperture(aper1, radius=0.5*xsiz*micro, center=center )
mask2 = moe.generate.circular_aperture(aper2, radius=0.25*xsiz*micro, center=center )
mask3 = moe.generate.circular_aperture(aper3, radius=0.125*xsiz*micro, center=center )

moe.plotting.plot_aperture(mask1)
# Saves the plot with xsiz x ysiz pixels
moe.plotting.save_mask_plot(np.abs(mask1.aperture-1), xsiz, ysiz, "circ1.jpg")

moe.plotting.plot_aperture(mask2)
moe.plotting.save_mask_plot(np.abs(mask2.aperture-1), xsiz, ysiz, "circ2.png")

moe.plotting.plot_aperture(mask3)
moe.plotting.save_mask_plot(np.abs(mask3.aperture-1), xsiz, ysiz, "circ3.bmp")
../_images/notebooks_Generate_masks_6_0.png
../_images/notebooks_Generate_masks_6_1.png
../_images/notebooks_Generate_masks_6_2.png

Rectangular aperture

[5]:
#make circular apertures (returns also the 2D array)
npix =64
xsiz = 500
ysiz = 500

mask = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix+1, -ysiz/2*micro, ysiz/2*micro, npix+1,)

# Create circular aperture on mask
center=(0, 0)

partial = 0.5
mask = moe.generate.rectangular_aperture(mask, xsiz*micro*partial, ysiz*micro*partial,  center=center )

moe.plotting.plot_aperture(mask)
moe.plotting.plot_aperture(mask, scale=micro)

# Plot only plot
moe.plotting.plot_aperture(mask, only_plot=True)
../_images/notebooks_Generate_masks_8_0.png
../_images/notebooks_Generate_masks_8_1.png
../_images/notebooks_Generate_masks_8_2.png
[6]:
npix = 64
xsiz = 128
ysiz = 128

aper1 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
aper2 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
aper3 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)

center = (0,0)

partial = 0.98
mask1 = moe.generate.rectangular_aperture(aper1, xsiz*micro*partial, ysiz*micro*partial,  center=center )

partial = 0.5
mask2 = moe.generate.rectangular_aperture(aper2, xsiz*micro*partial, ysiz*micro*partial,  center=center )

partial = 0.25
mask3 = moe.generate.rectangular_aperture(aper3, xsiz*micro*partial, ysiz*micro*partial,  center=center )

moe.plotting.plot_aperture(mask1)
moe.plotting.save_mask_plot(np.abs(mask1.aperture-1), xsiz, ysiz, "rect1.jpg")

moe.plotting.plot_aperture(mask2)
moe.plotting.save_mask_plot(np.abs(mask2.aperture-1), xsiz, ysiz, "rect2.png")

moe.plotting.plot_aperture(mask3)
moe.plotting.save_mask_plot(np.abs(mask3.aperture-1), xsiz, ysiz, "rect3.bmp")

../_images/notebooks_Generate_masks_9_0.png
../_images/notebooks_Generate_masks_9_1.png
../_images/notebooks_Generate_masks_9_2.png
[7]:
### Rectangular non-centered aperture

# Create empty mask
mask = moe.generate.create_empty_aperture(-500*micro, 1500*micro, 1001, -500*micro, 500*micro, 1001,)

# create rectangular mask
rectangle = moe.generate.rectangular_aperture(mask, 500*micro, 100*micro, center=(-100*micro, -300*micro))
moe.plotting.plot_aperture(rectangle )
# Save the rectangular mask
moe.plotting.save_mask_plot(rectangle.aperture, 2000, 1000, "rectangular1.jpg")

rectangle = moe.generate.rectangular_aperture(mask, 150*micro, 100*micro, )
moe.plotting.plot_aperture(rectangle )
moe.plotting.save_mask_plot(rectangle.aperture, 2000, 1000, "rectangular2.jpg")

rectangle = moe.generate.rectangular_aperture(mask, 150*micro, 500*micro, corner=(100*micro, 250*micro))
moe.plotting.plot_aperture(rectangle )
moe.plotting.save_mask_plot(rectangle.aperture, 2000, 1000, "rectangular3.jpg")
../_images/notebooks_Generate_masks_10_0.png
../_images/notebooks_Generate_masks_10_1.png
../_images/notebooks_Generate_masks_10_2.png

Fresnel Zone Plate

[8]:
####generate a fresnel zone plate

foc = 5000 # focal distance in um
lda = 0.6328 #wavelength in um
npix = 500 # nr of pixels
xsiz = 500 #x-size
ysiz = 500 #y-size
imgfile = 'fresnel_zone_plate.tiff' # name of img file

center = (0,0)

aper1 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
maskfzp = moe.generate.fresnel_zone_plate_aperture(aper1, foc * micro, lda * micro, radius=xsiz/2*micro, center = center)

moe.plotting.plot_aperture(maskfzp )

moe.plotting.save_mask_plot(maskfzp.aperture, xsiz, ysiz, imgfile)
../_images/notebooks_Generate_masks_12_0.png
[9]:
### The truncation operation can also be obtained from the truncate_aperture_radius function

####generate a fresnel zone plate
foc = 5000 # focal distance in um
lda = 0.6328 #wavelength in um
npix = 500 # nr of pixels
xsiz = 500 #x-size
ysiz = 500 #y-size
imgfile = 'fresnel_zone_plate_truncate.tiff' # name of img file


aper1 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)


maskfzp = moe.generate.fresnel_zone_plate_aperture(aper1, foc * micro, lda * micro,)
maskfzp_tr = moe.generate.truncate_aperture_radius(maskfzp, radius=xsiz/2*micro)

moe.plotting.plot_aperture(maskfzp_tr, )


# This gives the "negative" of the previous fresnel lens because of the way the function is defined
# -> it is made to have black (=1) on the border
# So that the image file appears as black for 0 value of the field
# therefore the inversion in the color

../_images/notebooks_Generate_masks_13_0.png
[10]:
#Export the image into a gds using the  export module
#Takes a bit of time

infilxe = 'fresnel_zone_plate.tiff' # name of img file
outfilxe = 'fresnel_zone_plate.gds'
pixelx = 1 #um
pixely = 1 #um
cellname = 'TOP'

moe.export.grayim2gds(infilxe, outfilxe, pixelx, pixely, cellname, 0)
Exported the image file fresnel_zone_plate.tiff into fresnel_zone_plate.gds

Fresnel phase mask

[11]:
####generate a fresnel phase mask and save it into gds
npix = 1001 # nr of pixels
foc = 5000 # focal distance in um
lda = 0.532 #wavelength in um
xsiz = 500 #x-size
ysiz = 500 #y-size
n = 10  # number of gray levels
gdsname = 'fresnel_phase_mask.gds' # name of gds file


###Fresnel phase mask
aperture1 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
mask1 = moe.generate.fresnel_phase(aperture1, foc * micro, lda * micro, )
moe.plotting.plot_aperture(mask1, )


##############
###Fresnel mask with a truncated circular aperture

# Create empty mask
aperture2 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)

# and truncate around radius
mask2 = moe.generate.fresnel_phase(aperture2, foc * micro, lda * micro, radius=xsiz/2*micro)
moe.plotting.plot_aperture(mask2, )


################
###Fresnel phase mask with a displaced center
# Create empty mask
aperture3 = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)

#by default the takes the mask at the center = (0,0)
aperture4 = moe.generate.fresnel_phase(aperture3, foc * micro, lda * micro, radius = xsiz/2*micro)

# and truncate around radius
center = (100*micro, -150*micro)
mask3 = moe.generate.truncate_aperture_radius(aperture4, xsiz/2*micro, center = center)
moe.plotting.plot_aperture(mask3, )


../_images/notebooks_Generate_masks_16_0.png
../_images/notebooks_Generate_masks_16_1.png
../_images/notebooks_Generate_masks_16_2.png

Generate phase mask from arbitrary phase function

[12]:
### Example with a spiral complex phase function

#attention, make sure to have enough pixels
npix = 1000  # number of pixels
xsiz = 1000 #x-size
ysiz = 1000 #y-size
ltop = 1 #topological number

#spiral mask is defined as
#spiral(x,y,x0,y0,ltop)

def spiral(x,y,x0,y0,L):
    """
    returns a spiral COMPLEX PHASE with input meshgrid (x,y) with center at (x0,y0)
    x = x array from meshgrid
    y = y array from meshgrid
    x0 = x-coordinate of center of the lens
    y0 = y-coordinate of center of the lens
    L = topological charge
    """

    theta = np.arctan2((y-y0),(x-x0))
    sp = np.exp(1.0j*L*theta)
    return sp


n =10 # number of gray levels


center = (0, 0)

aperture = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
mask =  moe.generate.arbitrary_aperture_function(aperture, moe.sag.spiral, center=center, L=ltop)
moe.plotting.plot_aperture(mask)

mask.discretize(n)
moe.plotting.plot_aperture(mask)

../_images/notebooks_Generate_masks_18_0.png
../_images/notebooks_Generate_masks_18_1.png
[31]:
ltop = 5

##Here we use the v1.0
##Compare the function with topological number equals to 5
aperture = moe.generate.create_empty_aperture(-xsiz/2*micro, xsiz/2*micro, npix, -ysiz/2*micro, ysiz/2*micro, npix,)
mask =  moe.generate.arbitrary_aperture_function(aperture, moe.sag.spiral, center=center, L=5)
moe.plotting.plot_aperture(mask)

mask.discretize(n)
moe.plotting.plot_aperture(mask)


gdsfile = 'spiral_phase_plate'+str(ltop)+'_v1-0_raster.gds'  #name of gds file

###########################################################
#######Export the mask
# Create GDSMask
gdsmask = moe.GDSMask(mask)

# Create layout and merge polygons together
layout = gdsmask.create_layout(mode="raster")
gdsmask.write_gds(gdsfile)

../_images/notebooks_Generate_masks_19_0.png
../_images/notebooks_Generate_masks_19_1.png
<class 'pyMOE.aperture.Aperture'>
Mask has 1000000 number of points distributed in 10 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:11.674761
[Total time converting to GDS]
Elapsed: 0:00:11.674761
Saving file to spiral_phase_plate5_v1-0_raster.gds
Saved spiral_phase_plate5_v1-0_raster.gds
[Saving GDS file]
Elapsed: 0:00:00.464994
[14]:
### Example with a function defined on the go
#Using v1.0 functions

npix = 1000  # number of pixels
xsiz = 100 #x-size
ysiz = 100 #y-size


##Arbitrarily defined function for exemplification
#corresponds to a blazed grating
def fexample(x,y,a,b):
    """
    returns a COMPLEX function (the function to implement NEEDS to be complex to extract the phase!)
    x = x array from meshgrid
    y = y array from meshgrid
    a = arbitrary parameter
    b  = arbitrary parameter
    """

    sfunc = (- a * (x + y)*1e6  -b)
    func = np.exp(1.0j*sfunc)
    #func = np.imag(func)
    func = np.angle(func)
    return func

aval = 1
bval = 1
n = 5 # number of gray levels

aperture = moe.generate.create_empty_aperture(-xsiz/2 * micro, xsiz/2 * micro, npix, -ysiz/2 * micro, ysiz/2 *micro, npix,)
mask =  moe.generate.arbitrary_aperture_function(aperture, fexample,a =aval , b = bval,  center=center)
moe.plotting.plot_aperture(mask)

mask.discretize(n)
moe.plotting.plot_aperture(mask)


###########################################################
#######Export the mask
# Create GDSMask
gdsmask = moe.GDSMask(mask)

# Create layout and merge polygons together
gdsmask.create_layout(merge=True)

gdsfile = "blazed_grating.gds"   #name of gds file
gdsmask.write_gds(gdsfile)

../_images/notebooks_Generate_masks_20_0.png
../_images/notebooks_Generate_masks_20_1.png
<class 'pyMOE.aperture.Aperture'>
Mask has 1000000 number of points distributed in 5 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:12.276621
Merging polygons inside layers
Progress: [####################] 100.0%
[Merging polygons]
Elapsed: 0:00:07.632004
[Total time converting to GDS]
Elapsed: 0:00:19.908625
Saving file to blazed_grating.gds
Saved blazed_grating.gds
[Saving GDS file]
Elapsed: 0:00:00.024889
[15]:
## Generate a Dammann Grating
aperture_width = 100*micro
aperture_height = 100*micro
x_pixel = 100
y_pixel = 100

aperture = moe.generate.create_empty_aperture(-aperture_width/2, aperture_width/2, x_pixel, -aperture_height/2, aperture_height/2, y_pixel,)

transitions_x = [0.242, 0.414]
transitions_y = [0.242, 0.414]


period_x = period_y = 10*micro

mask =  moe.generate.arbitrary_aperture_function(aperture, moe.sag.dammann_2d, transitions_x=transitions_x, period_x=period_x, transitions_y=transitions_y, period_y=period_y)

mask.aperture = mask.aperture*np.pi

mask.discretize(2)
moe.plotting.plot_aperture(mask)


###########################################################
#######Export the mask
# Create GDSMask
gdsmask = moe.GDSMask(mask)

# Create layout and merge polygons together
gdsmask.create_layout(merge=True)

gdsfile = "Dammann_2D.gds"   #name of gds file
gdsmask.write_gds(gdsfile)

../_images/notebooks_Generate_masks_21_0.png
<class 'pyMOE.aperture.Aperture'>
Mask has 10000 number of points distributed in 2 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:00.139886
Merging polygons inside layers
Progress: [####################] 100.0%
[Merging polygons]
Elapsed: 0:00:00.056253
[Total time converting to GDS]
Elapsed: 0:00:00.196139
Saving file to Dammann_2D.gds
Saved Dammann_2D.gds
[Saving GDS file]
Elapsed: 0:00:00.013937
[16]:
### Another example with a function defined on the go

npix = 500  # number of pixels
xsiz = 3 #x-size
ysiz = 3 #y-size


## just defined saddle function   (same as in the sag_functions modules)
def funct(x,y,a,b):
    """
    returns a COMPLEX PHASE saddle function
    Args:
        x = x array from meshgrid
        y = y array from meshgrid
        a = arbitrary parameter
        b = arbitrary parameter
    """

    sfunc =  (a * ((x*x - y*y)) -b)
    func = np.exp(1.0j*sfunc)
    func = np.angle(func)

    return func

aval = 1
bval = 1

center = (1.5e-6, 1.5e-6)

n = 5 # number of gray levels

### make the saddle with the just defined function

aperture = moe.generate.create_empty_aperture(0, xsiz * micro, npix, 0, ysiz *micro, npix)

aperture =  moe.generate.arbitrary_aperture_function(aperture, funct, center=center, a=aval,b=bval)
moe.plotting.plot_aperture(aperture)


### use the saddle function from sag_fucntions

aperture = moe.generate.create_empty_aperture(0, xsiz * micro, npix, 0, ysiz *micro, npix)
mask =  moe.generate.arbitrary_aperture_function(aperture, moe.sag.saddle, center=center, a=aval,b=bval)
moe.plotting.plot_aperture(mask)

mask.discretize(n)
moe.plotting.plot_aperture(mask)


###########################################################
#######Export the mask
# Create GDSMask
gdsmask = moe.GDSMask(mask)

# Create layout and merge polygons together
gdsmask.create_layout(merge=True)

gdsfile = "saddle.gds"   #name of gds file
gdsmask.write_gds(gdsfile)
../_images/notebooks_Generate_masks_22_0.png
../_images/notebooks_Generate_masks_22_1.png
../_images/notebooks_Generate_masks_22_2.png
<class 'pyMOE.aperture.Aperture'>
Mask has 250000 number of points distributed in 5 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:03.405056
Merging polygons inside layers
Progress: [####################] 100.0%
[Merging polygons]
Elapsed: 0:00:00.920960
[Total time converting to GDS]
Elapsed: 0:00:04.326514
Saving file to saddle.gds
Saved saddle.gds
[Saving GDS file]
Elapsed: 0:00:00.006400
[17]:
### Another example with a function defined on the go, version 1.0

npix = 500  # number of pixels
xsiz = 3 #x-size
ysiz = 3 #y-size

def fmsaddle(x,y,a,b):
    """
    returns a COMPLEX PHASE monkey saddle function
    Args:
        x = x array from meshgrid
        y = y array from meshgrid
        a = arbitrary parameter
        b  = arbitrary parameter
    """

    sfunc =  (a * ((x*x*x- 3*x*y*y)) -b)
    func = np.exp(1.0j*sfunc)
    func = np.angle(func)

    return func

aval = 0.5
bval = 0
xo = 1.5
yo = 1.5
n = 8 # number of gray levels

center = (xo*1e-6, yo*1e-6)


###make the saddle with the  just defined function

###make the  saddle with the saddle function defined in fexample2
aperture = moe.generate.create_empty_aperture(0, xsiz * micro, npix, 0, ysiz *micro, npix)
mask =  moe.generate.arbitrary_aperture_function(aperture, fmsaddle, center=center, a=aval,b=bval)
moe.plotting.plot_aperture(mask)

mask.discretize(n)
moe.plotting.plot_aperture(mask)


###make the monkey saddle from the function defined in the sag functions
aperture = moe.generate.create_empty_aperture(0, xsiz * micro, npix, 0, ysiz *micro, npix)
mask =  moe.generate.arbitrary_aperture_function(aperture, moe.sag.monkey_saddle, center=center, a=aval,b=bval)
moe.plotting.plot_aperture(mask)

mask.discretize(n)
moe.plotting.plot_aperture(mask)


###########################################################
#######Export the mask
# Create GDSMask
gdsmask = moe.GDSMask(mask)

# Create layout and merge polygons together
gdsmask.create_layout(merge=True)

gdsfile = "arbitrary_function_msaddle.gds"  #name of gds file
gdsmask.write_gds(gdsfile)

../_images/notebooks_Generate_masks_23_0.png
../_images/notebooks_Generate_masks_23_1.png
../_images/notebooks_Generate_masks_23_2.png
../_images/notebooks_Generate_masks_23_3.png
<class 'pyMOE.aperture.Aperture'>
Mask has 250000 number of points distributed in 8 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:02.992368
Merging polygons inside layers
Progress: [####################] 100.0%
[Merging polygons]
Elapsed: 0:00:01.004590
[Total time converting to GDS]
Elapsed: 0:00:03.997455
Saving file to arbitrary_function_msaddle.gds
Saved arbitrary_function_msaddle.gds
[Saving GDS file]
Elapsed: 0:00:00.006969

Generate Alvarez Lenses

[18]:
# Creates an Alvarez lens pair masks
aperture_width = 1000*micro
aperture_height = 500*micro
x_pixel = 1000
y_pixel = 500


# focal range of the Alvarez lenses
f1 = 500*micro
f2 = 15000*micro
tuning_distance = 100*micro
wavelength = 1550*nano


# First lens
aperture = moe.generate.create_empty_aperture(-aperture_width/2, aperture_width/2, x_pixel, -aperture_height/2, aperture_height/2, y_pixel,)
lens1 =  moe.generate.arbitrary_aperture_function(aperture, moe.sag.Alvarez_phase, f1=f1, f2=f2, tuning_distance=tuning_distance, wavelength=wavelength)


# Second lens which is the same but flipped.
aperture2 = moe.generate.create_empty_aperture(-aperture_width/2, aperture_width/2, x_pixel, -aperture_height/2, aperture_height/2, y_pixel,)

lens2 =  moe.generate.arbitrary_aperture_function(aperture2, moe.sag.Alvarez_phase, f1=f1, f2=f2, tuning_distance=tuning_distance, wavelength=wavelength)
lens2.aperture = np.flipud(lens2.aperture)


# initializes an aperture to store the result
result = moe.generate.create_empty_aperture(-aperture_width/2, aperture_width/2, x_pixel, -aperture_height/2, aperture_height/2, y_pixel,)



# displace aperture equally both ways, total displacement is twice displacement
displacement = 50*micro
rollidx = int(np.round(displacement/lens1.pixel_x,))

roll = rollidx
lens1.aperture = np.roll(lens1.aperture, -roll, axis=0)
lens2.aperture = np.roll(lens2.aperture, roll, axis=0)

lens1.aperture[-roll:, :] = 0
lens2.aperture[:roll,:] = 0



# Truncating the phase mask at multiples of 2π
lens1.modulos(2*np.pi)
lens2.modulos(2*np.pi)

n = 20 # number of discrete levels

lens1.discretize(n)
lens2.discretize(n)


# Calculates the resulting aperutre by the sum of both displaced lens1 and lens2
result.aperture = lens1.aperture + lens2.aperture
result.modulos(2*np.pi)

moe.plotting.plot_aperture(lens1)
moe.plotting.plot_aperture(lens2)
moe.plotting.plot_aperture(result)
../_images/notebooks_Generate_masks_25_0.png
../_images/notebooks_Generate_masks_25_1.png
../_images/notebooks_Generate_masks_25_2.png
[19]:
###########################################################
#######Export the mask
# Create GDSMask
gdslens1 = moe.GDSMask(lens1)
gdslens2 = moe.GDSMask(lens2)

# Create layout and merge polygons together
gdslens1.create_layout(merge=True)
gdslens1.write_gds("Alvarez_lens1.gds")

gdslens2.create_layout(merge=True)
gdslens2.write_gds("Alvarez_lens2.gds")

<class 'pyMOE.aperture.Aperture'>
<class 'pyMOE.aperture.Aperture'>
Mask has 500000 number of points distributed in 20 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:06.646332
Merging polygons inside layers
Progress: [####################] 100.0%
[Merging polygons]
Elapsed: 0:00:03.190997
[Total time converting to GDS]
Elapsed: 0:00:09.837328
Saving file to Alvarez_lens1.gds
Saved Alvarez_lens1.gds
[Saving GDS file]
Elapsed: 0:00:00.185188
Mask has 500000 number of points distributed in 20 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:05.824936
Merging polygons inside layers
Progress: [####################] 100.0%
[Merging polygons]
Elapsed: 0:00:03.124286
[Total time converting to GDS]
Elapsed: 0:00:08.949221
Saving file to Alvarez_lens2.gds
Saved Alvarez_lens2.gds
[Saving GDS file]
Elapsed: 0:00:00.182698

Operations between masks

[20]:
##Multiply two masks to obtain a composite mask

aperture1 = moe.generate.create_empty_aperture(-500*micro, 1500*micro, 1001, -500*micro, 500*micro, 1001)
aperture1 = moe.generate.fresnel_phase(aperture1, 50*milli, 532*nano, radius=500*micro)

moe.plotting.plot_aperture(aperture1)

# Create empty mask
rectangle_mask = moe.generate.create_empty_aperture(-500*micro, 1500*micro, 1001, -500*micro, 500*micro, 1001)
rectangle_mask = moe.generate.rectangular_aperture(rectangle_mask, 500*micro, 500*micro, center=(-100*micro, -100*micro))
moe.plotting.plot_aperture(rectangle_mask)

#multiply both masks
aperture3 = moe.generate.aperture_multiply(aperture1, rectangle_mask)
moe.plotting.plot_aperture(aperture3, )

../_images/notebooks_Generate_masks_28_0.png
../_images/notebooks_Generate_masks_28_1.png
../_images/notebooks_Generate_masks_28_2.png
[21]:
aperture1 = moe.generate.create_empty_aperture(-500*micro, 1500*micro, 1001, -500*micro, 500*micro, 1001)
aperture1 = moe.generate.fresnel_phase(aperture1, 50*milli, 532*nano, radius=500*micro)

moe.plotting.plot_aperture(aperture1)

center=(0,0)
n=10

aperture2 = moe.generate.create_empty_aperture(-500*micro, 1500*micro, 1001, -500*micro, 500*micro, 1001)
aperture2 =  moe.generate.arbitrary_aperture_function(aperture2, moe.sag.spiral, center=center, L=8)

moe.plotting.plot_aperture(aperture2)

# Operation of both apertures
aperture3 = moe.generate.aperture_operation(aperture1, aperture2, np.multiply)
moe.plotting.plot_aperture(aperture3)

aperture3.discretize(n)
moe.plotting.plot_aperture(aperture3)
../_images/notebooks_Generate_masks_29_0.png
../_images/notebooks_Generate_masks_29_1.png
../_images/notebooks_Generate_masks_29_2.png
../_images/notebooks_Generate_masks_29_3.png
[22]:
###EXTRA

#Using gdsconverter module to save the result

# Create GDSMask
gdsmask = moe.GDSMask(aperture3)

# Create layout and merge polygons together
gdsmask.create_layout(merge=True)

gdsmask.write_gds("operation.gds")
<class 'pyMOE.aperture.Aperture'>
Mask has 1002001 number of points distributed in 10 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:12.132256
Merging polygons inside layers
Progress: [####################] 100.0%
[Merging polygons]
Elapsed: 0:00:03.998450
[Total time converting to GDS]
Elapsed: 0:00:16.130705
Saving file to operation.gds
Saved operation.gds
[Saving GDS file]
Elapsed: 0:00:00.094588
[23]:
aperture1 = moe.generate.create_empty_aperture(-500*micro, 1500*micro, 1001, -500*micro, 500*micro, 1001,)
aperture1 = moe.generate.fresnel_phase(aperture1, 50*milli, 532*nano, radius=500*micro)

moe.plotting.plot_aperture(aperture1, scale=1e-3)

# Create empty mask
rectangle_mask = moe.generate.create_empty_aperture(-500*micro, 1500*micro, 1001, -500*micro, 500*micro, 1001,)
rectangle_mask = moe.generate.rectangular_aperture(rectangle_mask, 500*micro, 500*micro, center=(-100*micro, -100*micro))
moe.plotting.plot_aperture(rectangle_mask, scale=1e-3)


aperture3 = moe.generate.aperture_multiply(aperture1, rectangle_mask)
moe.plotting.plot_aperture(aperture3, scale=1e-3)

n = 6
aperture3.discretize(n )
moe.plotting.plot_aperture(aperture3)

../_images/notebooks_Generate_masks_31_0.png
../_images/notebooks_Generate_masks_31_1.png
../_images/notebooks_Generate_masks_31_2.png
../_images/notebooks_Generate_masks_31_3.png
[24]:
gdsname = "clipped_mask.gds"

# Create GDSMask
gdsmask = moe.GDSMask(aperture3)

# Create layout and merge polygons together
gdsmask.create_layout()

gdsmask.write_gds(gdsname)
<class 'pyMOE.aperture.Aperture'>
Mask has 1002001 number of points distributed in 6 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:11.645889
[Total time converting to GDS]
Elapsed: 0:00:11.645889
Saving file to clipped_mask.gds
Saved clipped_mask.gds
[Saving GDS file]
Elapsed: 0:00:00.496819
[25]:
# rotation of aperture using ndimage rotation (pixel based -> an interpolation is made)

## without center of rotation
rotated_mask = aperture_rotate(aperture3, 30, background=np.pi)
moe.plotting.plot_aperture(rotated_mask, scale=1e-3)

## with center of rotation
rotated_mask2 = aperture_rotate(aperture3, 30, pivot=(-100*micro, -100*micro), background=np.pi)#  pivot=(-100*micro, -100*micro))
moe.plotting.plot_aperture(rotated_mask2, scale = 1e-3)

rotated_mask_clipped = moe.generate.clip_aperture(rotated_mask,-500*micro, 1500*micro, -500*micro, 500*micro )
moe.plotting.plot_aperture(rotated_mask_clipped, scale = 1e-3 )
../_images/notebooks_Generate_masks_34_0.png
../_images/notebooks_Generate_masks_34_1.png
../_images/notebooks_Generate_masks_34_2.png
[26]:
rotated_mask_clipped = moe.generate.clip_aperture(rotated_mask,-500*micro, 1500*micro, -500*micro, 500*micro )
moe.plotting.plot_aperture(rotated_mask_clipped, scale =1e-3)
../_images/notebooks_Generate_masks_35_0.png
[27]:
### Export

# first discretize to ensure the level correspondence of the levels in the rotated and clipped mask
rotated_mask_clipped.discretize(n )
moe.plotting.plot_aperture(rotated_mask_clipped, 1e-3)

gdsname = "clipped_rotated_mask.gds"

# Create GDSMask
gdsmask = moe.GDSMask(rotated_mask_clipped)

# Create layout and merge polygons together
gdsmask.create_layout()

gdsmask.write_gds(gdsname)
../_images/notebooks_Generate_masks_36_0.png
<class 'pyMOE.aperture.Aperture'>
Mask has 497502 number of points distributed in 6 layers
Creating individual pixel polygons
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
Progress: [####################] 100.0%
[Create Polygons]
Elapsed: 0:00:06.722996
[Total time converting to GDS]
Elapsed: 0:00:06.722996
Saving file to clipped_rotated_mask.gds
Saved clipped_rotated_mask.gds
[Saving GDS file]
Elapsed: 0:00:00.221030
[28]:
rotated_mask_clipped = moe.generate.clip_aperture(rotated_mask,-500*micro, 1500*micro, -500*micro, 500*micro )
moe.plotting.plot_aperture(rotated_mask_clipped, scale = 1e-3 )

rotated_mask_clipped2 = moe.generate.clip_aperture_within(rotated_mask,-500*micro, 1500*micro, -500*micro, 500*micro )
moe.plotting.plot_aperture(rotated_mask_clipped2, scale = 1e-3)

../_images/notebooks_Generate_masks_37_0.png
../_images/notebooks_Generate_masks_37_1.png

Due to pixel based rotation (using scipy ndimage) some pixels in the borders can have mixed levels (even with interpolation order =5). Therefore, if a precise rotation is sought, it is better to first export the unrotated layout and then perform the rotation directly on the layout, see for example notebok GDS_Operations and function rotate_layout on the gds_klops module.

Extra: Zernike polynomials mask

[29]:
# Zernike polynomial from https://github.com/jacopoantonello/zernike

from zernike import RZern
import numpy as np

def makezernike(x,y,L,K, num):
    """
    Adapting code from https://github.com/jacopoantonello/zernike to
    return a COMPLEX PHASE with Zernike polynomial shape of Noll index num
    Args:
        x = x array from meshgrid
        y = y array from meshgrid
        L = number of pixels on x
        K = number of pixels on y
        num = Noll index of the Zernike polynomial
            (see https://en.wikipedia.org/wiki/Zernike_polynomials#Noll's_sequential_indices )
    """

    cart = RZern(num)

    #the way the function works is a bit special
    #because it is between -1 and 1 with a number
    ddx = np.linspace(-1.0, 1.0, K)
    ddy = np.linspace(-1.0, 1.0, L)
    xv, yv = np.meshgrid(ddx, ddy)
    cart.make_cart_grid(xv, yv)

    c = np.zeros(cart.nk)

    for i in range(num, num+1):
        #plt.subplot(1, 1,1)
        c *= 0.0
        c[i] = 1.0
        Phik = cart.eval_grid(c, matrix=True)

        ephik = np.exp( Phik*1.0j*0.55 )
        #AD-HOC * 0.55 factor!! TO BE CORRECTED

        mphi = np.angle(ephik )
        mphi = np.nan_to_num(mphi, copy=True, nan=0.0, posinf=None, neginf=None)
        return mphi
[30]:
###Calculating and exporting a Zernike polynomial function

npix = 1000  # number of pixels
xsiz = 10 #x-size
ysiz = 10 #y-size

aval = 0.5
bval = 0
xo = 1.5
yo = 1.5
n =10 # number of gray levels

center = (0,0 )

aperture = moe.generate.create_empty_aperture(-xsiz*micro, xsiz*micro, npix+1, -ysiz*micro, ysiz*micro, npix+1,)
mask =  moe.generate.arbitrary_aperture_function(aperture, makezernike, center=center, L = npix +1 , K = npix +1 , num=14)
moe.plotting.plot_aperture(mask)

mask.discretize(n)
moe.plotting.plot_aperture(mask)

../_images/notebooks_Generate_masks_41_0.png
../_images/notebooks_Generate_masks_41_1.png
[ ]: