Soon, we will launch a new and updated customer portal, which is an important step toward providing our customers with one place to learn, interact, and get help.
Learn more.

How to Identify Specific Rays Using Filter Strings

This article explains how to use filter strings to identify and isolate specific rays in a non-sequential system. Examples are given which show how to isolate rays that have undergone surface scattering and bulk scattering, as well as rays that undergo diffraction and fluorescence.
Sanjay Gangadhara
Non Sequential Ray Tracing


Ray paths in a non-sequential system can be very complex, especially when ray splitting is allowed. In many cases, it can be useful to limit the ray paths that are observed either in the Layout plot or on the Detector Viewer.

When Zemax traces a ray, it records exactly what happens to that ray. For example, the ray may reflect from object 13, split into two at object 46, etc. Filter strings allow you to identify specific characteristics of the rays that you want to see.

Zemax offers many filter strings that can be used to provide limitations on ray paths - either during the ray trace itself, or when viewing the results in the Layout plot or Detector Viewer - and supports the ability to combine filter strings using logical operands. More information may be found in section of the Zemax manual entitled “The filter string”, located in the chapter of the manual entitled “Non-Sequential Components”.

In this article, a few examples will be provided to illustrate the use of logical operands in constructing filter strings for isolating specific rays.

A simple example

A simple example of a system where a filter string may be useful to “clean up” the Layout plot is provided in the file “Simple Example.ZMX”. The archive (.ZAR) file for this example is located on the last page of this article.

In this system, a Source Ray object is used to launch rays at a block of BK7 glass. The spectrum of the source is polychromatic, as defined by the three system wavelengths provided in the Wavelength Data dialog box:

Defining wavelengths for a polychromatic source in the Wavelength Data dialog box

The back face of the BK7 glass is specified to be a scattering surface, in which rays scatter according to a Lambertian distribution:

Applying a Lambertian scattering distribution to the back face of the glass

The Scatter Fraction parameter has been set to 0.5, indicating the 50% of the incident energy will be scattered. Ray splitting is also included in this system, so scattering can occur both in transmission and reflection. As a result, the Layout plot for this system is quite messy:

Layout plot for all rays with scattering and splitting turned on

What if we were only interested in seeing those rays that do not have a wavelength of 0.55 microns and that undergo scattering only once before hitting the detector? We can easily create a filter string that will limit the Layout plot to just those rays.

Filter strings that can be used to isolate scattered rays are Sn, Fn, and X_SCATTER(n,b). The Sn and Fn filter strings allow you to target for rays that have scattered from a particular object, while the X_SCATTER(n,b) filter string targets those rays that have scattered "b" times and have hit object "n" (see the section entitled "The filter string" in the chapter of the Zemax manual entitled "Non-Sequential Components"). In our example, we are only interested in those rays that scatter once and then hit the detector, so the appropriate filter string would be X_SCATTER(3,1).

In this system, rays that scatter once may also scatter in reflection. Some of these rays may subsequently be reflected off of the front face of the BK7 glass, and then transmit through the back face of the glass and hit the detector. These rays are said to undergo ghost reflection at the front face of the glass, and can therefore be identified using the Gn filter string. In this case, we do not want to see any rays on the detector that have undergone ghost reflection, so the appropriate filter string would be G0 (this will isolate not only the first order ghost reflections described above, but higher order ghost reflections as well, e.g. when a ray reflects off of the front and back faces multiple times before finally passing through the back face and hitting the detector).

Finally, we also want to limit the rays shown in the Layout plot to those that do not have a wavelength of 0.55 microns. In this case, the Wn filter string can be used to filter for wavelength, since the ray wavelengths are defined explicitly in the Wavelength Data dialog box. The appropriate filter string for isolating rays at a wavelength of 0.55 microns is W2, since this wavelength corresponds to wavelength number 2 in the Wavelength Data dialog box.

We can combine the above filter strings together using the “&” and “!” logical operands to form the desired filter:

Filter string to isolate for single scattered rays with no ghosts and not at wavelength 2

which will isolate those rays of interest in the Layout plot:

Resultant layout plot with combination scatter-no ghost-no wavelength 2 filter applied

Conversely, imagine now that we were interested in seeing only those rays that have a wavelength of 0.55 microns and that do not ever undergo scattering. In this case, we could use the same filter string to isolate those rays with a wavelength of 0.55 microns, and remove the “!” logical operand from in front of the filter string. To filter for those rays that do not undergo scattering, we would use the filter string F2, and place the “!” logical operand in front of it. Combining these together using the “&” logical operand:

Filter string to view all rays with wavelength 2 that never scatter

we find exactly what we expect:

Resultant layout plot with no scatter-wavelength 2 filter applied

The reason that the Fn filter string is used in this case is because ray splitting is on. With ray splitting on, it is very likely that some segment of every ray will undergo scattering (even if that segment was generated after a number of Fresnel reflections in the glass). Thus, the Fn filter string must be used to target segments from a ray that undergo scattering (Sn can only be used to target the ray itself, not any segments of the ray), in this case to isolate those segments out of the Layout plot.

A Diffraction Grating example

Another example of the use of filter strings is provided in the file “Diffraction Grating.ZMX” (the archive file for this example is located on the last page of this article). In this system, the source spectrum has been defined to model the white color seen on computer monitors:

Defining the wavelength spectrum with a source color

More details on source color modeling may be found in the article entitled “How To Perform Stray Light Analysis".

Once the data are saved to a ZRD file, the file may be loaded onto a Detector Viewer:

Applying a filter string in a Detector Viewer

Then - and only then - can a filter string be applied to the data. However, filter strings may also be applied directly during the ray-trace, as seen in the Ray Trace dialog box above. The advantage of applying a filter string directly to the ray-trace is a reduction of the ZRD file size (which can be quite large when a large number of analysis rays are launched). However, once the ZRD is created from a filtered ray-set, the original ray data is lost. Thus, it is often more advantageous to save all rays to the ZRD file, and filter as desired within the Detector Viewer.

A Fluorescent Scattering example

A slightly more complicated system is provided in the sample file “Bulk Scattering.ZMX” (the archive file for this example is located on the last page of this article). In this system, a collimated beam of light at 0.55 microns scatters off of a fold mirror and then passes through a lens. However, the size of the lens is smaller than the size of the scattered beam, so some of the scattered light does not pass through the lens:

Layout for Bulk Scattering example

Light that does pass through the lens will undergo bulk scattering, and all of the rays that do scatter will also fluoresce, i.e. their wavelength will be changed from 0.55 to 0.65 microns:

Modeling fluorescence of light that passes through the lens

You may read more about the wavelength-shifting capabilities of Zemax in the article entitled “How to Model Fluorescence using Bulk Scattering”.

Rays that do and do not pass through the lens are recorded by a Detector Color object (more details are provided in the article entitled “How to Measure and Optimize Color Data"). The true color image of the ray distribution shows both the scattered light at 0.55 microns (green) and the fluorescent light at 0.65 microns (red):

True color distribution of light that scatters and fluoresces

There will be some small percentage of rays that do pass through the lens but do not undergo bulk scattering. They can be isolated using the filter string “!X_WAVESHIFT(1,2) & H3” (X_WAVESHIFT(a,b) filters for those rays that shift from wavelength "a" to "b" during bulk scattering, where "a" and "b" correspond to wave number in the Wavelength Data dialog box; see the section entitled "The filter string" in the chapter of the Zemax manual entitled "Non-Sequential Components"):

Filter string to use to isolate rays that pass through the lens but don't fluoresce

True color distribution of rays that pass through the lens but do not fluoresce

The filter string “X_WAVERANGE(4,0.54,0.56) & H3” could also have been used to yield the same result. If we wanted to eliminate these rays from the detector results, we would use the following filter string: “(X_WAVERANGE(4,0.64,0.66) & H3) | !H3”:

Filter string to eliminate rays that pass through the lens and don't fluoresce from the result

The first term in parentheses looks for those rays that bulk scattered in the lens, and the second term (“!H3”) looks for those rays that do not pass through the lens. Although the results with this filter look similar to the original results:

Resulting true color image of all rays that either: (1) pass through the lens and fluoresce or (2) don't pass through the lens

if you look closely you will see that the total power has been reduced from 258.3 Lumens to 257 Lumens. This reduction of 1.3 Lumens is consistent with the power of those rays that pass through the lens but do not scatter (the numbers may be different if you re-run a ray trace on your computer, but the result will be the same).


Filter strings are a valuable tool for isolating certain ray paths in a complex optical system. Although Zemax provides a number of filter strings, the appropriate filter string may not be directly available for your particular application. However, logical operands can easily be used to make complex combinations of filter strings, which can allow very general filtering of rays to be done in nearly any system.