[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.9 Optical Imaging

Angora can synthesize numerical optical images created by an ideal imaging system. The image is calculated in the form of a field distribution on a two-dimensional plane in the image space; which is assumed homogeneous. In photolithography, this image distribution is commonly called an aerial image.

The optical axis of the imaging system is currently limited to the z axis. The collection can be either through the +z or -z direction, allowing the simulation of reflection or transmission-mode imaging without changing the illumination scheme. Angora internally utilizes a near-field-to-far-field transformer (NFFFT) (see Near-Field-to-Far-Field Transformer) to calculate the optical image.

In the following figure, a simplified representation is shown for the optical imaging geometry. The illumination scheme is not shown in the figure, and the collection is assumed to be through the upper half space. The entire optical system is represented by a single lens, although the system may comprise multiple lenses, apertures, stops, etc. The only assumptions regarding the optical system is that it satisfies Abbe’s sine condition, and it is telecentric (see Capoglu12b). Telecentricity implies that the entrance pupil is actually at infinity, although it is shown at a finite distance for ease of presentation in the figure.

imaging_geometry

Figure 6.5: A simplified depiction of the optical imaging geometry.

The format used for the optical imaging output is HDF5 (Hierarchical Data Format) (http://www.hdfgroup.org/HDF5/). The HDF5 format was chosen for its standard interface, and the availability of free software tools for inspecting and modifying HDF5 output. The HDF5 content of the optical image file is explained in more detail in Optical Image File HDF5 Content.

Global variable: string imaging_output_dir (default: "imaging/")

This determines the subdirectory in which all the optical-imaging output will be placed. Unless it has a slash ‘/’ up front; this path is interpreted as being relative to output_dir (see section Paths).

 
imaging_output_dir = "imaging";
OpticalImages:
{
        …
        …
};
Global variable: list OpticalImages

Optical images are defined in an OpticalImages list:

 
OpticalImages:
(
    {
        output_data = ["E_x_tot","E_y_tot","E_z_tot",
                       "E_x_sca","E_y_sca","E_z_sca",
                       "E_x_unsca","E_y_unsca","E_z_unsca",
                       "intensity_tot",
                       "intensity_sca",
                       "intensity_unsca"];
        num_of_lambdas = 5;
        lambda_min = 400e-9;
        lambda_max = 700e-9;
        lambda_spacing_type = "k-linear";
        do_not_include_first_lambda = false;
        do_not_include_last_lambda = false;
        ap_half_angle = 36.87;
        magnification = 40.0;
        image_space_refr_index = 1.0;
        image_expansion_factor_x = 1.0;
        image_expansion_factor_y = 1.0;
        image_oversampling_rate_x = 1.0;
        image_oversampling_rate_y = 1.0;
        coll_half_space = "upper";
        nffft_back_margin_x_in_cells = 3;
        nffft_front_margin_x_in_cells = 3;
        nffft_left_margin_y_in_cells = 3;
        nffft_right_margin_y_in_cells = 3;
        nffft_lower_margin_z_in_cells = 3;
        nffft_upper_margin_z_in_cells = 3;
        image_origin_x = 0.0;
        image_origin_y = 0.0;
        image_origin_z = 0.0;
        image_dir = "";
        image_file_name = "Image";
        image_file_extension = "hd5";
        append_group_index_to_file_name = true;
    },
    {
        …
        …
    }
);
Sub-variable of OpticalImages: string-array output_data

This array of strings determines what will be included in the final output file. Any combination of the following strings can be listed in the array.

  • "E_x_sca", "E_y_sca", "E_z_sca": The x, y, and z components of the scattered electric field of the image. This is the electric field that is scattered or generated by the structures inside the simulation grid. The incident beams (see Incident Beams) and the reflections and transmissions from the infinite planar layer interfaces are not included in the scattered field.
  • "E_x_unsca", "E_y_unsca", "E_z_unsca": The x, y, and z components of the unscattered electric field of the image. This is the electric field that would be created at the image plane in the absence of any scatterer inside the simulation grid except the infinite planar layers. The portion of the incident beams (see Incident Beams) and the reflections and transmissions from the infinite planar layer interfaces that fall into the collection aperture contribute to the unscattered field.
  • "E_x_tot", "E_y_tot", "E_z_tot": The x, y, and z components of the total electric field of the image, defined as the sum of the scattered and unscattered fields above.
  • "intensity_sca": The scattered light intensity at the image plane (in W/m^2), defined as $I_{sca}=n_{img}\vert E_{sca}\vert^2/\eta_0$ where $n_{img}$ is the image-side refractive index, and $\eta_0$ is the free-space wave impedance (=376.7303...Ohms). $E_{sca}$ is the scattered electric field vector.
  • "intensity_unsca": The unscattered light intensity at the image plane (in W/m^2), defined as $I_{unsca}=n_{img}\vert E_{unsca}\vert^2/\eta_0$ where $n_{img}$ is the image-side refractive index, and $\eta_0$ is the free-space wave impedance (=376.7303...Ohms). $E_{unsca}$ is the unscattered electric field vector.
  • "intensity_tot": The total light intensity at the image plane (in W/m^2), defined as $I_{tot}=n_{img}\vert E_{tot}\vert^2/\eta_0$ where $n_{img}$ is the image-side refractive index, and $\eta_0$ is the free-space wave impedance (=376.7303...Ohms). $E_{tot}$ is the total electric field vector.

For example, if the output_data array is

 
output_data = ["E_x_sca","intensity_tot"];

then only the x-component of the scattered electric field of the image and the total light intensity of the image are recorded in the output.

Sub-variable of OpticalImages: integer num_of_lambdas

This specifies the number of wavelengths (in vacuum) at which the optical image will be calculated.

Sub-variable of OpticalImages: floating-point lambda_min (units: m)
Sub-variable of OpticalImages: floating-point lambda_min_in_cells

This value sets the lower limit of the wavelength range (in vacuum) over which the optical image is calculated. The optical image may or may not be calculated at the wavelength lambda_min, depending on the variable do_not_include_first_lambda. The units are either in meters or grid cells. For the latter, the _in_cells suffix should be appended to the variable name.

Sub-variable of OpticalImages: floating-point lambda_max (units: m)
Sub-variable of OpticalImages: floating-point lambda_max_in_cells

This value sets the upper limit of the wavelength range (in vacuum) over which the optical image is calculated. The optical image may or may not be calculated at the wavelength lambda_max, depending on the variable do_not_include_last_lambda. The units are either in meters or grid cells. For the latter, the _in_cells suffix should be appended to the variable name.

Sub-variable of OpticalImages: string lambda_spacing_type

This string specifies how the wavelengths will be spaced between the two end points determined by lambda_min, lambda_max, do_not_include_first_lambda, and do_not_include_last_lambda.

  • "lambda-linear": The wavelengths are spaced lineary between the two end points.
  • "k-linear": The wavenumbers $k=2\pi/\lambda$ are spaced linearly between the two end points. Since the wavenumber is also equal to $k=\omega/c$ , where $\omega$ is the radian frequency, this causes the frequencies to be spaced linearly as well.
  • "log": The logarithms of the wavelengths (therefore the logarithms of the wavenumbers) are spaced linearly between the two end points.
Sub-variable of OpticalImages: boolean do_not_include_first_lambda (default: false)
Sub-variable of OpticalImages: boolean do_not_include_last_lambda (default: false)

Let’s assume that lambda_spacing_type is lambda-linear. For k-linear and log, replace lambda_min in the following by $2\pi/$ lambda_min and log(lambda_min), respectively. The same applies to lambda_max.

  • If do_not_include_first_lambda=false and do_not_include_last_lambda=false: The interval between lambda_min and lambda_max is divided into (num_of_lambdas-1) equal intervals. A total of num_of_lambdas wavelengths are placed linearly at the boundaries between the intervals, including both endpoints lambda_min and lambda_max.
  • If do_not_include_first_lambda=true and do_not_include_last_lambda=false: The interval between lambda_min and lambda_max is divided into num_of_lambdas equal intervals. A total of num_of_lambdas wavelengths are placed linearly at the boundaries between the intervals, excluding the endpoint lambda_min.
  • If do_not_include_first_lambda=false and do_not_include_last_lambda=true: The interval between lambda_min and lambda_max is divided into num_of_lambdas equal intervals. A total of num_of_lambdas wavelengths are placed linearly at the boundaries between the intervals, excluding the endpoint lambda_max.
  • If do_not_include_first_lambda=true and do_not_include_last_lambda=true: The interval between lambda_min and lambda_max is divided into num_of_lambdas equal intervals. A total of num_of_lambdas wavelengths are placed at the midpoints of each interval.
Sub-variable of OpticalImages: floating-point ap_half_angle (units: degrees)

This is the half-angle of the collection cone over which the far field is collected. This angle is represented by $\theta_{\rm obj}$ in the above figure.

Sub-variable of OpticalImages: floating-point magnification (default: 1)

This is the absolute value of the lateral magnification of the optical imaging system. If greater than 1, the imaging system shows a magnified image of the object. This is the case in microscopy, where the magnification ranges from 10 to 100. If less than 1, the image is a de-magnified version of the object, This is the case in photolithography, where a de-magnified image of a mask is projected on a photoresist. Typical magnifications in photolithography are 0.1 to 0.25.

Sub-variable of OpticalImages: floating-point image_space_refr_index (default: 1)

This variable specifies the refractive index of the image space, assumed to be homogeneous.

Sub-variable of OpticalImages: floating-point image_expansion_factor_x (default: 1)
Sub-variable of OpticalImages: floating-point image_expansion_factor_y (default: 1)

By default, the optical image will only span the lateral (x-y) dimensions of the FDTD grid. The x and y dimensions of the image can be increased or decreased using these two factors. Setting these factors greater than 1 will reduce the aliasing effects in the numerical computation of the image, but linearly increase the computational burden associated with the far-field computation. This is because the far-field has to be collected at a denser set of observation directions for a larger image. The technical details of this are the subject of sampling theory, and are explained in Capoglu12b.

Sub-variable of OpticalImages: floating-point image_oversampling_rate_x (default: 1)
Sub-variable of OpticalImages: floating-point image_oversampling_rate_y (default: 1)

Angora tries to automatically determine the minimum number of far-field collection directions to accurately synthesize the optical image. By default, the number of pixels in the final image is the same as the number of far-field collection directions. As a result, the image is sampled very economically; causing a pixelated appearance. A finer image can be synthesized by scaling the sampling rate in the x and y directions by modifying image_oversampling_rate_x and image_oversampling_rate_y, respectively. For example, setting image_oversampling_rate_x=10 results in 10 times the default number of pixels in the x direction. Choosing high values for these two factors do not really cause much degradation in performance, since only the post-processing (post-simulation) computational burden is affected. The post-processing burden is usually a small fraction of the burden associated with the whole simulation.

In sampling theory, the minimum number of pixels needed to represent the image is determined by the Nyquist sampling rate for the image (see Capoglu12b). There is a well-defined Nyquist sampling rate associated with every optical image, since they are constrained in spatial frequency content by the wavelength of illumination. If desired, the default image (the one obtained with image_oversampling_rate_x=image_oversampling_rate_y=1) can be made arbitrarily fine through bandlimited interpolation in post-processing.

Sub-variable of OpticalImages: string coll_half_space

Although the collection apparatus seems to be situated in the upper (+z) half space in the above figure, it can also be situated in the lower (-z) half space. This is specified by assigning the string "upper" or "lower" to the coll_half_space variable, respectively. In the following figure, these two imaging geometries are shown separately. Note that the image is inverted, but the image-space coordinates (x’ and y’) are also inverted with respect to the object space.

coll_half_space

Figure 6.6: Collection of the scattered light in the upper half space (left figure), or the lower half space (right figure) for the calculation of the optical image.

Sub-variable of OpticalImages: floating-point nffft_back_margin_x (units:m)
Sub-variable of OpticalImages: floating-point nffft_front_margin_x (units:m)
Sub-variable of OpticalImages: floating-point nffft_left_margin_y (units:m)
Sub-variable of OpticalImages: floating-point nffft_right_margin_y (units:m)
Sub-variable of OpticalImages: floating-point nffft_lower_margin_z (units:m)
Sub-variable of OpticalImages: floating-point nffft_upper_margin_z (units:m)
Sub-variable of OpticalImages: integer nffft_back_margin_x_in_cells (default: 3)
Sub-variable of OpticalImages: integer nffft_front_margin_x_in_cells (default: 3)
Sub-variable of OpticalImages: integer nffft_left_margin_y_in_cells (default: 3)
Sub-variable of OpticalImages: integer nffft_right_margin_y_in_cells (default: 3)
Sub-variable of OpticalImages: integer nffft_lower_margin_z_in_cells (default: 3)
Sub-variable of OpticalImages: integer nffft_upper_margin_z_in_cells (default: 3)

In the collection stage of optical imaging (see the imaging schematic), the far field scattered from the sample is calculated using a near-field-to-far-field transformer (NFFFT). These variables determine the surface over which the near field is collected for the calculation of the far field. For more information, see Near-Field-to-Far-Field Transformer.

Sub-variable of OpticalImages: floating-point image_origin_x (units: m, default: 0)
Sub-variable of OpticalImages: floating-point image_origin_y (units: m, default: 0)
Sub-variable of OpticalImages: floating-point image_origin_z (units: m, default: 0)
Sub-variable of OpticalImages: floating-point image_origin_x_in_cells (default: 0)
Sub-variable of OpticalImages: floating-point image_origin_y_in_cells (default: 0)
Sub-variable of OpticalImages: floating-point image_origin_z_in_cells (default: 0)

These variables set the coordinates of the optical conjugate of the center of the image plane. Changing these values amounts to focusing at different positions and depths in the sample using the focusing knob on a microscope. The coordinates are with respect to the grid origin (see section Coordinate Origin). The units are either in meters or grid cells. For the latter, the _in_cells suffix should be appended to the variable name.

Sub-variable of OpticalImages: string image_dir (default: "")

This determines the subdirectory in which this individual image file will be placed. Unless it has a slash ‘/’ up front; this path is interpreted as being relative to imaging_output_dir (see imaging_output_dir). By default, no subdirectory is created inside imaging_output_dir.

Sub-variable of OpticalImages: string image_file_name (default: "Image")

This determines the base string in the full name of the image file. Other information is appended to the name of the file to differentiate individual image files (see the example below).

Sub-variable of OpticalImages: string image_file_extension (default: "hd5")

This is the extension of the image file name. If assigned the value "", no extension is added to the file.

Here is an example image file name:

 
Image_0_1.hd5

The base string in the name of the file ("Image") is specified by the image_file_name variable. The two integers that follow are the run index (see Multiple Simulation Runs) and the index of the image inside the OpticalImages list. For example, if there are two groups (two images) in the OpticalImages list, the first one will write into

 
Image_0_0.hd5

while the second will write into

 
Image_0_1.hd5

If there are two simulation runs (i.e., number_of_runs is equal to 2 – see Multiple Simulation Runs), then the files created in the second run will have 1 instead of 0 as the first integer in the above file names. Finally, the extension ("hd5") of the movie files is determined by the variable image_file_extension.

Sub-variable of OpticalImages: boolean append_group_index_to_file_name (default: true)

If this is set to false, the second integer in the filename (see above) and the underscore preceding it are not included in the filename. It is set to true by default. If this variable is set to false and there are multiple groups (optical images), there will be a name clash, and the output will be undefined.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.9.1 Optical Image File HDF5 Content

The HDF5 file created as the output of optical imaging can be viewed and modified using freely-available tools. One of these tools is HDFView, provided by the HDF Group. MATLAB also has built-in functions and tools that handle HDF5 files. For reference, a MATLAB script named ‘hdf5_read.m’ is distributed as part of the Angora package, which reads an HDF5 dataset from an HDF5 file into a MATLAB array. This script is installed in the directory ‘$(prefix)/share/angora/’ (see Compilation and Installation). If Angora was installed without any $(prefix) configuration option, the default location is ‘/usr/local/share/angora/’. This script can also be downloaded directly from the Angora website (link here). For example, if you want to read the dataset named lambda from the file ‘my_file.hd5’, use

 
>> lambda = hdf5_read('my_file.hd5','lambda');

In MATLAB R2011a and later, there is a high-level built-in function h5read that could be used for the same purpose.

The HDF5 datasets in the optical image file are the following:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Ilker Rafet Capoglu on December 12, 2012 using texi2html 1.82.