Freiburg Vision Test (‘FrACT’)
by Prof. Michael Bach – Manual

Manual of the Freiburg Vision Test   ‘FrACT₁₀’
Version 2020-09-17

Manual of the previous, “classic” FrACT3.10.5:   PDF.

This is free software. There is no warranty for anything.

For those who don’t read manuals: at least follow the checklist for mandatory settings.

Release version of FrACT₁₀ here, preview of the next version here.

Introduction and Background

This manual describes ‘FrACT₁₀’, which appeared in a usable version in April 2020. While not yet as capable, it will eventually supersede the classic FrACT, now at version 3.10.5. FrACT₁₀ is a rewrite that runs on all platforms in all current browsers because it is based on Cappuccino based on JavaScript all the way down. It inherited all algorithms (Bach 1996, 1997, 2007) from the classic FrACT. At the same time, some design decisions were revisited: Now the export format is more systematic, optotype contrast is in Weber units, etc. Also operation on touch devices (if large enough, e.g. tablets) is now possible. FrACT₁₀ is currently on-line only.

This manual assumes that the user has a working knowledge of the principles and practice of the assessment of human visual acuity. FrACT₁₀ is freely accessible here.

Important first step for acuity assessment

Two things need to be calibrated in Settings▸︎General

  1. The observation distance. Measure from screen to eye; enter value at the Settings screen.
  2. The length of the blue ruler line on the Settings screen. This allows the program to calculate the screen resolution (pixels per mm), necessary for visual angle determination.

The above two settings together allow the program to calculate the correct visual angle of the optotypes. Usually, the pixel size limits the maximal acuity, and can be a severe limit for near vision assessment. Thus, on the bottom right “→max possible decimal acuity” shows what can be reached.

How to get rid of “Warning: Calibration…”

FrACT unfortunately has too often been used without calibration. Thus this intentionally annoying message appears on the beginning of every run, unless you have changed both the observer distance entry and the length of the blue calibration ruler (see preceding paragraph). Both are defaulted to numbers that are unlikely to occur in practice (149 mm and 399 cm). So: calibrate! For more see section Calibration.


There are many possibilities to measure the ‘minimum visibile’, a common and sensible approach is to present an “optotype”, be it a Sloan letter, a tumbling E or a Landolt-C.

The basic procedure starts with a very large (= easy to recognize) optotype, and having the participant or patient indicate recognition (e.g., name the letter, name the orientation of the gap in the Landolt C). Depending on the correctness of the response, next an easier or more difficult to recognize optotype is presented, ultimately aiming to determine the spatial resolution limit or threshold. Since there is a gradual loss of likelihood to respond correctly with decreasing size, the threshold must be consider a probability. The best choice is to set the threshold recognition rate in the middle between 100% and the guessing rate (12.5% in the case of 8 choices), 56.25% for this example. This means that at the “acuity value” nearly half the optotypes are not recognized correctly. This may initially appear counter-intuitive.

An additional procedural detail is the “forced choice” principle: The participant needs to respond even if they cannot make out the optotype at all. They have to give their best guess, which may be random. This is a way to reduce the influence of the “response criterion”, that is whether the participant is timid (only responding when absolutely certain) or dashing (making wild guesses). Thus incorrect responses will enter into the procedure, which also may appear counter-intuitive.

To control the sequence of optotype presented and to arrive at a threshold estimate, FrACT₁₀ employs the “Best PEST” procedure. This means that the program determines the most likely estimate of the threshold, given the optotype grades and responses so far, and then presents the optotype exactly at the current threshold estimate, thus maximizing information gain.

In the first 4 trials, the Best Pest is overridden (following EN ISO) by the values 0.1, 0.2, 0.4, 0.8, as long as the responses are correct. This avoids extremely difficult optotypes after a correct initial response.

Acuity assessed with Sloan Letters

Based on Louise Sloan (1959), these 10 letters are used: CDHKNORSVZ. In FrACT₁₀ the Sloan Letters are drawn by vector graphics that I based on the detailed description (Committee on Vision 1980), not on the slightly incorrect “Sloan font”. To respond, the participant (or operator) types the appropriate letter on the keyboard (or touches the corresponding button). Any non-Sloan letter is considered an incorrect response.

Acuity with the Landolt-C

The Landolt-C is the gold-standard optotype (International Organization for Standardization 2017). It can be presented in one of 8 different orientations. [Or 4, if so chosen in Settings>General]. An advantage of Landolt-Cs is that no literacy is required. With 8 orientations, the guessing rate is 12.5%, close to the 10% with Sloan Letters. When only 4 orientations are employed, more trials are necessary.

Acuity with the Tumbling E

The E shape in the tumbling E has the same basic dimensions as the Landolt C, but is only presented in one out of 4 possible orientations. The Tumbling E is a classic optotype. A slight disadvantage compared to the Landolt-C is a wee more luminance imbalance close to the threshold – this is relevant when considering recognition vs. discrimination acuity.

Acuity with TAO (The Auckland Optotypes)

These optotypes are useful for infant assessment and are available in 10 different shapes. See this this paper: Hamm et al. (2018) for a careful evaluation of TAO (The Auckland Optotypes) results. Currently TAO can only run at 100% contrast, and the response keys are less intuitive; thus there is a legend at the bottom of the test screen.

Vernier acuity

Vernier acuity is nearly 10× better than optotype acuity. In FrACT₁₀, Vernier acuity is based on line-segment alignment, 2-line or 3-line arrangements can be chosen. Since only 2 choices are possible, many trials are necessary; the default setting is the lowest limit, more is better. Enter the displacement of the upper line relative to the lower line through the cursor keys or the digits 4 / 6. Since Vernier acuity is so high, the considerations in “Note on display resolutions” (below) are particularly pertinent – you may need 10× higher distance to your display unit.


There exist (too many) traditions to format visual acuity: LogMAR, decimal, Snellen fraction; FrACT₁₀ caters for these three. Whichever of these measures you prefer, they can be easily converted into each other when distance is known. A detailed discussion and conversion tables are given here.

Limitations in accessible acuity

There are technical limits on the highest and lowest acuity, which depend on the display resolution in pixels per inch, VDU size, and on the distance. For distances of ≥ 3 m the normal monitor resolution (≈ 72 dots per inch) is fine. Lower distances only work with devices that have very high spatial resolution (e.g. OLEDs, readily available now) or in low acuity situations, see the “Note on display resolution” below. If you want to assess low vision (LogMAR 1.0, decimal 0.1 = 20/200 and worse), a distance to the display of 0.5–1.0 m is sufficient (possibly necessary, in addition to a large screen).

Contrast Sensitivity

The term “contrast sensitivity” (CS) lets many people reflexively think of sine-wave gratings. Gratings allow to assess CS for a specific spacial frequency. While this is fine, there is no clinical condition which leads to specific loss of intermediate spatial frequencies, rendering moot the specific measurement at various spatial frequencies.

Rather, like the Pelli-Robson or the Mars charts, FrACT₁₀ assesses contrast using standard optotypes. These are composed of a mixture of low to medium spatial frequencies (as can be determined via a Fourier analysis). At the high spatial frequency end, CS and visual acuity tap the same physiological bottleneck, so acuity alone is sufficient there. This saves precious measurement time.

Thus, FrACT₁₀ assesses contrast sensitivity by displaying medium large optotypes at fixed size. Depending on the responses o the testee, the contrast is reduced following a Best PEST procedure like for visual acuity to assess the threshold using a Bayes-like approach.

Contrast formats

Of the 4 different contrast definitions in use, FrACT reports Weber values in the thresholding contrast test. Contrast based on the Michelson formula:
contrast M = 100% · (lMax – lMin ) / (lMax + lMin ),
where lMax & lMin are the luminances of the bright and dark parts, respectively. Contrast based on the Weber formula:
contrastW = 100% · (lMax – lMin ) / lMax.

Conversion Michelson↔Weber:
contrastW = 2 · contrastM / (1 + contrastM),   contrastM = contrastW / (2 – contrastW).
Thus for low contrasts, the Weber contrast value is close to 2× the Michelson contrast.

Michelson contrast is symmetric around zero, Weber not. This leads to problems, which are circumenvented by redefining the Weber contrast to be point symmetrical around zero:
constrastW’ = 2 · contrastM /(1 + contrastM) [if contrastW ≥ 0], else −(2 · −contrastM /(1 + −contrastM))

Limitations in contrast testing

  1. Assessment of the contrast threshold requires good gamma correction (display linearization). The best approach is to use a dedicated screen calibrator (e.g. Spyder by DataColor) to set system gamma to 1.0 and then set FrACT’s gamma to 1.0 as well (on the screen Settings▸Contrast).
  2. Display limitations. Most current visual display units (LCDs etc.) have a luminance resolution of 8 bit per primary colour. Thus there are only 256 levels, or about half as many after gamma correction. This is insufficient to display a real threshold stimulus for good vision. There are 3 ways to deal with it:
    1. Use dithering. This was done in the “old” FrACT3, not (yet) in FrACT₁₀.
    2. Use colour-bit stealing. This was implemented in FrACT3, but deactivated because it can’t work in colour anopia.
    3. Ignore it. The achievable value for the contrast sensitivity of over 1.6 logCSWeber, which is “good enough” for most purposes. Participants with this value clearly have good contrast vision.
  3. Distance is not so critical as for acuity, since the optotype’s size typically is markedly above the spatial resolution limit. 1 m or more is fine.

Numerous options have been added to FrACT over the years, often on user request. The following list follows the sequence in FrACT₁₀’s “Settings” dialog, which has been expanded into the tabs
«General | Acuity | Contrast».

The # of choices (for acuity and contrast)

The number of optotype directions (or response choices) for Landolt Cs can be selected between 4 and 8, and the threshold algorithm accordingly selects a guessing rate of 25% or 12.5%, respectively. Irrespective of this setting, tumbling E has always 4 choices, Sloan Letters always 10, hyperacuity (Vernier) always 2 choices. {Default: 8}

The # of trials {for 2 / 4 / 8 choices}

The number of trials can be set to any reasonable number. A multiple of 6 (e.g., 18 or 24) is preferred so that the last trial is a “bonus trial” (see below), leaving the participant with a success experience for the last trial. The number of trials is separate for the 4 vs. 8 direction condition, because the latter will require fewer trials for comparable accuracy. For the hyperacuity test, there are only 2 possible choices, and consequently even more trials are necessary. Tumbling E will use the 4 choices selection, the trial number of the Sloan letters will be based on the 8 choices selection (because the guessing rate of 12.5%, and 10% does not differ much). {Default: 42 / 30 / 18}


There are two timeouts, one controls the time the optotype is visible, the other limits reaction time.

Show “operation info” at start of each run

If enabled, a brief explanation of the response keys appears at he beginning of each run. Switch off, of course, when you’re experienced. {Default: on}

Enable touch controls

To enable FrACT₁₀ on tablets without a keyboard, touch buttons can be shown. {Default: on}

Show trial info

When on, shows current trial number, total number of trials, and the current threshold (acuity: in decimal) in tiny letters at top left. {Default: on}

Export results to clipboard

See below for a detailed discussion of exporting. Briefly here: After each run, one can –without quitting FrACT₁₀– switch to a concurrently running spreadsheet and paste-in the run details (see below for a full format specification). When the “full history” option is chosen [does not work yet], for each trial the presented orientation, responded orientation, and reaction time are provided as well. [The clipboard is the place in the computer were any copy or cut operation places its result, ready to be pasted elsewhere.] For correct transfer of data, you must set the appropriate character (for your country) for the decimal mark beforehand (next item)!

When this setting is on, one is reminded after each run to place the result on the clipboard and then one can use the task switcher to select a spreadsheet already running in the background.

When this setting is off, it is still possible to use the button “Export→Clipboard” that will appear on the right after each run. That button can be ignored, of course.

Why are there both options, the “Export results to cleapboard” not set to “none”, and the export button? While the latter would, in principle, suffice, it is very easy to forget, and loosing the result. On the other hand, for a try-out, it’s handy to have the button without a dialog getting into the way,

Options are: «none / final results only / full trial history». {Default: off}
[Currently, only the “full trial history” option is not yet implemented.]

Decimal-mark character

Different countries use different number formatting; furthermore different post-processing programs can require different formatting. The setting for the decimal-mark, a dot or a comma, applies both to the clipboard export and to the large result display after a finished run. Be sure to select the right value, otherwise Excel might convert your results to dates! {Default: ‘.’}

Which test on ‘5’

For extended measurements, it can be useful to control everything through the remote keypad (see the note on response keys below). This setting selects which test is started by pressing the central ‘5’ key. Options are: «none | Sloan Letters | Landolt-C | Tumbling E | TAO | Hyperacuity». {Default: none}

Display transformation [NOT YET IMPLEMENTED]

To manipulate observation distance, mirror arrangements (high-quality front surface, of course) or afocal telescopes can be used. Since these can flip the orientation, corrective transformations can be applied. Options are: «normal | mirror horizontally | mirror vertically | rotate by 180°». {Default: normal}


It is usually advised not to give feedback on correctness, sensible for human-human interaction; however this was never tested until Bach & Schäfer K (2016). There we found that for typical clinical trials (up to 6 runs at 24 trials each) feedback does not affect the results nor reproducibility, but markedly enhances participant comfort. So in FrACT₁₀ you have the choice: The participant’s response can be acoustically announced through a short tone, options are: «none | always | on correct | with info». “With info”: two different sounds on correct/incorrect. {Default: «with info»}

The option “Auditory feedback at end” allows to emit a “success sound” when the last trial has been responded to. Options are: «off / on». {Default: «on»}

The slider allows to adjust the sound volume from 1 to 100%. {Default: 20%}

Finally, “Reward pictures at end” allows to present a “nice” picture at the end of a non-aborted run {default: «on»}. Particularly useful for children testing, but I like it too. During presentation of the picture the underlying buttons can still be clicked. When this option is on, the duration of the picture can be adjusted, defaulting to 5 seconds.

In summary, the various feedback actions all default to on, but can all be shut off when deemed to distracting or annoying.

Optotype eccentricity

The optotypes can be displaced relative to the center of the screen. This allows for systematic variation of eccentricity. {Default: (0°, 0°)}

2× ‘5’ aborts [NOT YET IMPLEMENTED, always on]

To abort any run at any time by pressing the key ‘5’ twice (once would not be enough, could be pressed accidentally loosing valuable data). For some situations, users wanted to disable this feature. {Default: on}


‘easy trials’ or ‘bonus trials’

These are trials where the presented optotype is a multiple (1.6×) of the currently assumed threshold, thus are easy. When enabled, every 6 th trial, starting with trial 12, is such a bonus trial. While this motivates many participants, these trials gain little information on the threshold. The number of 6 was chosen on informal experience. {Default: every 6 th }

Optotype color (fore- & background)

This is currently an indicator only, changed by the contrast setting (next item).

Optotype contrast

For acuity testing, the contrast value of the optotype must be near 100% for the standard definition of visual acuity; its value can be set from 1%–100% for specific questions. For precise contrast presentation, stray light must be avoided and VDU-gamma must be set correctly (currently fixed at 1.8). Contrast is entered in Weber (!) format, see appendix. Negative values: inverted optotype (light optotype on dark background). {Default: 100%}


To induce crowding, features can appear next to the optotypes. Options are: «none | flanking rings | row of optotypes | frame (ring) | frame (square) | flanking optotypes». The distance to the flankers can be selected at «2·gapsize | 2.6 arcmin | 30 arcmin | 1 optotype». The “1 optotype” setting renders the presentation akin to the distance on ETDRS charts. {Default: none}

Vernier hyperacuity

Of the various hyperacuities, Verner can be tested with FrACT₁₀. The type can be selected as 2-line or 3-line segment {default: 2}, and size parameters can be set, all measured in arc minutes. The line segments are drawn with a Gaussian profile, thus sub-pixel resolution up to 10× is possible.


Threshold definition

A bracketing threshold strategy (called “psychometric” in the options list) will result in a higher threshold than an ascending strategy (as typical for chart testing, and detailed in EN ISO 859). Furthermore, in EN ISO the threshold criterion is “6 of 10” or 60%, whereas the Best PEST assumes 56.25% (for 8 directions). Assuming a typical psychometric slope, both effects lead to a slight underestimation of “psychometric acuity” by the EN ISO strategy, which can be corrected for by multiplying the results of the bracketing strategy by 0.892. {Default: DIN/ISO corrected}

LogMAR, decimal, Snellen fraction [ft]

There exist too many traditions to format visual acuity; still FrACT₁₀ attempts to cater for them. Available are «decimal VA | logMAR | Snellen fraction [ft]». If all formats are deselected, LogMAR and decimal VA is re-selected. Here are conversion formulas and more details. {Default: LogMAR + decimal VA}

Snellen denominator 20 ft

The Snellen fraction only makes real sense, if the true distance is put into the denominator. However, many are so attached to the “20” scheme, that they use it even with reading acuity. Thus I added this setting on request against my better judgment ;-). {Default: «on»}

Max displayed acuity

Due to the laws of chance, un-physiologically high results can occasionally obtain (“lucky responders”). Not all users have a background in statistics, and they might see this as a defect of FrACT₁₀. So an “acuity ceiling” can be applied, from 1.2 to unlimited – conventional acuity charts implicitly always have such ceilings. Export data will always contain the original value. {Default: 2.0}


‘easy trials’ or ‘bonus trials’

Same as for acuity, but applicable to contrast testing.

Dark on light

Optotype luminance relative to the background. {Default: darker}


Optotype diameter, measured in arc minutes. {Default: 50’}

Fixation timeout and Show fixation mark.

Since an optotype near contrast threshold is near invisible, a blue fixation mark can briefly appear. {Default: On, 500 milliseconds}


There is no gamma calibration in FrACT₁₀ yet. If you know you display chain’s gamma value, enter it here, otherwise the default is a rather typical value. {Default: 1.8}

Maximal logCSWeber

Advice: leave this setting alone :). Background: this needs to be large so the smallest displayable contrast is near the end of the scale. It should be small so that the contrast steps are mostly within the visible range. {Default: 2.4}

Exporting results

To facilitate later in-depth analysis, the FrACT₁₀ results can be exported. Obviously, they are depicted in large friendly letters on the testing screen in a format that you select in Settings. However, I strongly believe that experimental results should never by manually typed, rather automatically transferred as efficiently as possible. For this, currently the following two options exist:

1. Export to clipboard after each run

This is controlled from the Settings▸︎General screen by way of the “Results → clipboard” setting. If enabled, this copying is automatic if you ok it in the export dialog.

If this option is not used, a button “Export→Clipboard” (on the right, below “About”) appears after each run with obvious purpose. The button won’t mind if you simply ignore it.

2. Export via the HTML Web Storage API

Modern browsers can store a limited amount of data across sessions using the “HTML Web Storage API”. This is employed by FrACT₁₀: It stores the same string that can be exported to the clipboard in a localStorage object called “FRACT10-FINAL-RESULT-STRING”. It can be very easily accessed via JavaScript by a concurrent program, here is a trivial HTML file to achieve this:

	<!DOCTYPE html><html lang="en">
			<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
			<title>Read and display FRACT10-FINAL-RESULT-STRING</title>

Try it here. In that HTML file there are also simple JavaScript functions to parse the result string. With code based on this example, FrACT₁₀ can easily be integrated in any data managing environment.

Format of the exported data

The format for the data exported to the clipboard is a string with a key-tab-value-tab format. This has the advantage that it is human-readable, can be directly pasted into a spreadsheet, and is extensible. It starts with a version number, future-proofing parsing. The contents are self-explanatory (at least to me), see examples (tab replaced by space for easier reading):
Vs 2 decimalMark . date 2020-06-11 time 14:15:46 test Acuity_Letters value -0.3391 unit LogMAR 
distanceInCm 400.0 contrastWeber 100.0 nTrials 18 rangeLimitStatus rangeOK↵

Vs 2 decimalMark . date 2020-06-11 time 18:28:33 test Acuity_LandoltC value -0.1930 unit LogMAR 
distanceInCm 400.0 contrastWeber 50.0 nTrials 18 rangeLimitStatus rangeOK↵

Vs 2 decimalMark . date 2020-06-11 time 18:38:52 test Acuity_TumblingE value 0.1682 unit LogMAR 
distanceInCm 400.0 contrastWeber 100.0 nTrials 24 rangeLimitStatus rangeOK↵

Vs 2 decimalMark . date 2020-06-11 time 18:40:01 test Acuity_TAO value -0.1802 unit LogMAR 
distanceInCm 400.0 contrastWeber 100.0 nTrials 18 rangeLimitStatus rangeOK↵

Vs 2 decimalMark . date 2020-06-11 time 20:36:54 test Acuity_Vernier value 21.0 unit arcsec distanceInCm 400.0 contrastWeber 100.0 nTrials 32 rangeLimitStatus rangeOK↵

If the above appears dense, here it is nicely separated into discrete fields.


Optotype size is measured in terms of visual angle, but rendered by the computer on a pixel raster. The two are easily related through resolution of the screen and observation distance, since VDUs typically have a sufficiently high spatial linearity. In the “Settings” dialog, a blue ruler line appears whose length is measured in mm, and the value entered in a field next to the observation distance in cm. FrACT₁₀ calculates from these measures the highest obtainable acuity, assuming one pixel as the smallest gap size, and displays this next to the distance input field, thus immediately giving feedback whether the distance is suitable to the range of acuities to be measured. To adequately measure normal acuity, this needs to be above decimal 1.2 (VA 1.2 decimal equals –0.08 logMAR or 24/20 Snellen fraction).

A note on display resolution and possible acuity values

A severe limitation for all computer tests is imposed by the properties of the VDU (visual display unit). Typical CRTs (cathode ray tubes) and LCDs (liquid crystal displays) have a “dot pitch” (the distance between the centers of two pixels) of around 0.3/1.35 = 0.2 or 20/100, clearly not sufficient for normal participants.

Simple rule: standard VDUs are fine to assess acuity at a distance of 2 m and higher.

For closer distances, especially reading acuity, special VDUs are required. This is not a problem anymore: either use OLED micro-displays, or other “retina-resolution” type of displays. When calibrating FrACT₁₀, the maximal achievable acuity is given in decimal units below the right end of the blue ruler.

At the low acuity range, the limit is that one optotype fills the entire screen (transcending the definition of acuity). Should you be interested in (ultra) low vision, be sure to recognize possible floor effects (see rangeLimitStatus below).

For Vernier acuity, similar considerations apply, but are more stringent: Since the threshold angle for Vernier resolution is about 10 times smaller than that for standard acuity, one needs to aim for 10× better angle resolution – higher distance, or smaller pixels.

If the VDU limitations have affected the result, this is indicated by “≤” or “≥” respectively in the result display. For export, this is indicated via the rangeLimitStatus parameter, being rangeOK / atFloor / atCeiling.

For contrast there are additional limitations by the common 8 bits per colour; not discussed here.

A note on the response keys (remote response entry)

Response box

I find it advantageous if the participants control the test themselves by pressing the appropriate buttons. They start a run by pressing ‘5’ and use the pertinent response direction keys. For this, a remote numerical USB-keypad is very useful.

image of keypad 1
Two examples; most have only a short cable, for remote entry you will want to add a USB extension cable or a wireless version.
image of keypad 2
This one sports fancy labels.

Another aspect: Some participants tend to press the keys for a prolonged time, triggering keyboard autorepeat, thus causing inadvertent response errors. Here it helps to switch off keyboard repeat using the appropriate facilities of your operating system.


I am lazy and prefer to start actions without mousing, thus I added a number of shortcuts.

LSloan Letter Acuity
CLandolt-C Acuity
ETumbling E
AAuckland Optotypes (TAO) Acuity
VVernier Hyperacuity
FFullscreen toggle
5Start “Which test on five”
55Abort current run

Avoiding more mousing: Use the tab key (⇥) to move between fields in Settings (shift-tab for backwards). The blue 🆗 button is activated by the return key.

Document History

Michael Bach