Functional Coating and Surface Engineering Laboratory (FCSEL)

You are here



IonAssistant is a tool that allows you to:

  • Model the ion beam current density distribution
    • rotating or stationary substrate holder
    • effect of a shadow mask
    • current density history for each substrate
  • Optimize the resulting distribution to
    • maximize total current
    • maximize uniformity
    • find a compromise between both using weighting factors

 IonAssistant is a freely distributable software which was coded in MATLAB language. In order to use it, you will need to:

  • download MATLAB code folder.  MATLAB 2011 or higher is required to run it, plus the following toolboxes
    • Optimization toolbox
    • image toolbox

This program was coded by Martin Caron.

The original idea and supervision - Oleg Zabeida.

The details about the matematics behind can be found in our article:

V.Marushka, O. Zabeida,L. Martinu, "Distribution of ion current density on a rotating spherical cap substrate", J.Vac.Sci.Technol. A 32(6) (2014) 061513.


OpenFilters is a free and open source software, released under the GNU General Public License, for the design of optical interference filters.

It offers multiple tools for the design and optimization of optical interference coatings, including refinement, the needle method, the step method, the Fourier transform method and multiband rugates. It can calculate the transmission, the reflection, the absorption, ellipsometric variables, phase, group delay, group delay dispersion, the circle and admittance diagrams, the electric field distribution and the color of the filter. It can also be used to generate photometric or ellipsometric monitoring curves. It is described in details in the article: Stéphane Larouche and Ludvik Martinu, “OpenFilters: open-source software for the design, optimization, and synthesis of optical filters”, Applied Optics, vol. 47, 2008, pp. C219–C230.

OpenFilters was written by Stéphane Larouche while he was a graduate student at École polytechnique de Montréal under the supervision of Professor Ludvik Martinu.


Main windows of OpenFilters on Windows Fourier transform method dialog on Mac OSX Needle method dialog on Ubuntu


Here are a few recent examples of what can be done with OpenFilters:


All comments, bug reports and questions should be sent to If you want to be informed of the release of new versions of OpenFilters, please indicate it in your email. We will not use your address for any other purpose.


OpenFilters 1.1.1 (2016/12/19)

This is a bug fix release. A complete list of changes can be found in the release notes.


OpenFilters 1.1 (2015/12/18)

OpenFilters 1.1 includes many more optimization targets, a tool to simulate the effect of random fabrication errors, the possibility to import a material or an index profile from a text file, the Sellmeier dispersion model, as well as many bug fixes. A complete list of changes can be found in the release notes.


OpenFilters 1.0.2 (2008/04/04)

This is a bug fix release. A complete list of changes can be found in the release notes.


OpenFilters 1.0.1 (2007/12/08)

This is a bug fix release. A complete list of changes can be found in the release notes.


OpenFilters 1.0 (2007/06/03)

First public release of OpenFilters.


Getting Started


You can download the latest version of OpenFilters on the download page. You may download a Windows installer (32 or 64 bits), a Mac OS X installer, or the source code.

On Windows, it is very easy to install OpenFilters: download the installer and run it.

On Mac OS X, download the disk image (.dmg file), mount it, and install OpenFilters by draging it onto the application folder.

There is no official compiled version of OpenFilters available for other operating systems (such as Linux). In that case you need install Python and wxPython on your system, download the source code, and run the file using Python. We have tested OpenFilters with success on Ubuntu, OpenSUSE, and FreeBSD. We believe it should work on any system where Python and wxPython are installed.


The first time you run OpenFilters, you will be requested to choose a directory for the user materials. User materials are materials created by the user, in addition to those provided by default with OpenFilters. Any advanced use of OpenFilters will require the use of user defined material, so you should not skip this step. Obviously, you should choose a directory where you have write access, or otherwise you will not be able to create new materials.


To demonstrate some of the basic features of OpenFilters as well as a typical workflow, we will design an antireflective (AR) coating for a fused silica lense in the visible spectrum. We will demonstrate the use of refinement.

The first step in using OpenFilters is creating a project (menu item File|New Project). A project is meant to group many filters designed to respect a set of targets.

Once you have created a new project, you can add filters to it (menu item Project|Add Filter). When you add a filter to a project, you are presented a dialog to set some of its basic properties (Fig. 1). You should first set the substrate and medium. For this example, let the substrate be fused silica and the medium be vacuum (void).

Fig. 1 - Filter properties dialog for the sample AR coating.

Then, you should set the wavelength range and resolutions. This determines the spectrum where the filter properties will be calculated. Since we want to design a AR coating for the visible, let's set the wavelength range from 380 nm to 780 nm, with an increment of 1 nm. The reference wavelength is the wavelength at which the index profile is shown, and it is used to calculate the optical thickness of the layers. Let us set it to the middle of the visible, 580 nm.

Finally, the lens will need an AR coating on both its front and back sides. However, it is simplier to design them one at a time. Therefore, we will only consider the front surface by unchecking the Consider backside checkbox in the Analysis box at the bottom left.

Other properties apply to graded-index filters, color calculation, and monitoring. They will not be used in this example.

Click OK. You can modify the properties of a filter at a later moment by using the menu item Filter|Properties.

We are now ready to begin adding layers to the filter. A well know way to design a broadband AR coating is to use a quarter wave of a medium index material, followed by a half wave of the hign index material and, finally, a quarter wave of low index material. To add a layer, select the menu item Filter|Add layer and a dialog box shown in Fig. 2 will be shown. Put SiN in the material box and 71.5 in the thickness box. Repeat the operation to add a 120 nm thick layer of TiO2 and a 80 nm thick layer of SiO2.

Fig. 2 - Add Layer dialog to add 71.5 nm of SiN.

Now that you have defined a filter, you can calculate its optical properties. In the present case, we are mainly interested by the reflection, which can be calculated by selecting the menu item Analyse|Calculate Reflection. After you have calculated the reflection, the main window of OpenFilters should look like that shown in Fig. 3.

Fig. 3 - Main window after calculation of the reflection.

The top part of the main window has tabs to show the filters and the targets included in a project. This is also a tab to put a text comment. If you double-click on a filter, you can see the layers of that filter (see Fig. 4). To go back to the list of filters, click the button Back to filter list.

Fig. 4 - Other view of the main window after calculation of the reflection.

We are interested in optimizing a filter that minimizes the reflection in the visible. For that, we can add a continuous target by selecting the menu item Project|Add Target|Add Reflection Spectrum Target. Select a range of wavelength and an increment (from 380 nm to 780 nm by 5 nm) and indicate that you want 2 definition points. Enter 2 points at the two extremes of the visible range with a reflection of 0 (as in Fig. 5}); the reflection for wavelengths in between those 2 points will be interpolated.

Fig. 5 - Add target dialog with a target for a visible AR filter.

Then you can optimize the filter by selecting the menu item Design/Optimize|Refine. You will be presented with the dialog shown in Fig. 6}. Click Go to optimize the filter and Ok when you are done. You can finally calculate the reflection of the optimized filter as you did before and the main window should look like that presented in Fig. 7}. By comparing Figs. 4 and 7, you can see that the reflection is now smaller over most of the visible spectrum.

Fig. 6 - Refinement dialog.
Fig. 7 - Main window after refinement.


Materials can be added or modified only when no project is opened.


Not at this time. You can however consult the short Getting started guide available online. We will also be happy to answer questions sent to


The installer installs everything you need to run OpenFilters on Windows or Mac OSX.


OpenFilters should work on all systems where Python and wxPython are available. We have tested it with many Linux distributions. If they are not installed by default, install Python (2.5 ≤ version < 3.0) and wxPython. Then download OpenFilters's source code, and simply run the file using Python. OpenFilters will complain that the abeles and moremath dynamic libraries cannot be imported; OpenFilters works without them, but is much slower.

If you want to use the abeles and moremath dynamic libraries, you will need to compile them. To do so, you need to make sure that the Python header files are installed (in most distributions, the package is named python-dev or python-devel). You should then be able to compile the libraries simply by running "make" in the OpenFilters main directory. If your version of Python is not 2.7, or if the header and library files are not in a standard location, you may need to modify the Makefiles in the abeles and moremath directories.


If you want to modify OpenFilters's source code, you will need Python (2.5 ≤ version < 3.0) and wxPython. If you want to recompile the abeles and moremath dynamic libraries, you will need a C++ compiler. On Windows, I use MinGW-w64. On Mac OSX, I use clang, which comes by default with Mac OSX (if you don't already have it, you will be prompted to install it the first time you compile the libraries).