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

→FrACT10
→‘classic’ FrACT 3.10.5

This is the free, multi-platform Freiburg Visual Acuity Test + Contrast Test + Vernier Test (+ Grating) Test. For reliable results please observe the checklist. Your feedback is welcome and has frequently led to improvements and extensions. FrACT was employed in hundreds of papers and cited in well over 1000 papers.


There are two (2) versions

(1)  FrACT3.10.5   –   long-standing, well-tested, widely deployed, downloadable app
classic FrACT

This image of classic FrACT shows the app’s main screen after downloading the stand-alone version and allowing it to run. Flash is not needed.
Only critical maintenance will occur here, going forward.

(2)  FrACT10   –   new, all platforms, beta stage, on-line only

This new version runs on all platforms, including Android and iOS; tablets are fine, smartphones too small. [Here it is alone, allowing full-screen operation.] Try out below:


What is it?

“FrACT” is a widely used visual test battery in form of a free computer program. It uses psychometric methods combined with anti-aliasing and dithering to provide automated, self-paced assessment of visual acuity (Bach 1996), contrast sensitivity and vernier acuity. The progression of optotypes relies on a Bayesian approach and is determined by a modified “Best PEST” strategy (Lieberman & Pentland, see General Pertinent Sources below). FrACT complies with the European Norm for acuity testing (EN ISO 8596) and is endorsed by the DOG. It is employed all over the world in vision labs, by optometrists, ophthalmologists and in clinical trials (→Who used FrACT) and has been verified by independent laboratories (→Descriptions & Validations).

One particular advantage of FrACT is its ultra-wide range
Where can I get it?

→Downloads

Where can I learn more?
Where to use?
What equipment do I need?

Just about any state-of-the-art computer (be it running the Macintosh operating system, Linux or Windows). For remote input see the response box below in Usage Details.

If you are using an LCD and want to measure contrast thresholds, be sure the display is not of the 6-bit type (as it is was in many laptops; more in Usage Details); for acuity those would be fine. Make certain that the best possible color depth is chosen. Older versions of FrACT remain available and run just fine on older equipment.

What does it cost?

Nothing; but feedback is warmly appreciated. And please cite it when you’ve used it in scientific settings.

How do I cite it?

If you used FrACT for your research, please cite it. The “generic” publication is:

Bach M (1996) The “Freiburg Visual Acuity Test” – Automatic measurement of visual acuity. Optometry and Vision Science 73:49–53   [pubmed]  [→PDF],
or, more recent:
Bach M (2007) The Freiburg Visual Acuity Test – Variability unchanged by post-hoc re-analysis. Graefe’s Arch Clin Exp Ophthalmol 245:965–971   [DOI] [→PDF]

The briefest way to refer to the present page (its URL):  <https://michaelbach.de/fract/>.

Usage Details

If you ran a previous version, all selections in “SETTINGS” may automatically be defaulted in order to update internal structures (depends on the exact versions).

How to calibrate?

Enter the width of the calibration bar & the observation distance in the “SETTINGS” interface. Be sure to have enough distance from the screen, so pixel resolution does not limit acuity. Also ponder about every entry in the SETTINGS interface and set them appropriately; the defaults can not be optimal for every situation. The Checklist is a must-read, in the FrACT₁₀ Manual or classic FrACT3.x Manual [PDF] all settings are explained in more detail than you probably wished…

For the Contrast Test, you also need to go to “SETTINGS>Luminance Linearisation” to linearise luminance (“gamma correction”) before testing. But see below for a cautionary note on the difficulties of contrast testing.

All selections in SETTINGS are automatically saved.

Starting the test

Apart from using the obvious buttons a test run can also conveniently be started from the numerical keypad (digit “5”). Enter the position of the appearing optotypes orientation via the numerical digit keys, or use the alternatives. The digit key “5”, pressed twice, aborts an ongoing test run (and inhibits display of the premature result).

Response box

Working with patients you may want to enter results yourself. In lengthy vision experiments, subjects are used to enter responses themselves.

image of keypad 1
For direct response entry by the subject, these keypads are useful. They come in various versions. Most have only a short cable, for remote entry you will want to add a USB extension cable.
image of keypad 2
This one even sports fancy labels.

4 or 8 gap positions?

Sloan Letters have 10 alternaties, Tumbling E has possible 4 orientations, the Landolt-C allows 4 or 8. Depending on your application, you may wish to use only the 4 primary Landolt gap positions or to supplement it with the four oblique directions; FrACT allows both. Briefly: 4 directions are less easily confused, but guessing probability is higher making more trials necessary; 8 positions allow more rapid determination of visual acuity(less trials) as the guessing probability is lower. Final outcome should be identical, but the number of runs must be adequately chosen; see next item.

Number of trials?

Default: 24 trials with 8 gap orientation choices, 30 trials with 4 gap orientations (because the guessing rate is higher). For ‘real’ scientific applications choose 8/30, or, better, repeat each condition (e.g. each eye at 18 trials, ideally in an ABBA scheme) and take the mean. Why are all these numbers divisible by 6? Because every 6th trial is a “bonus trial”, where the optotype is presented at 3 times its current threshold estimate. This keeps your subjects happy, especially since the last trial is thus always a ‘success’.

Keeping different Settings

Often one wants different sets of SETTINGS, e.g., for training vs. assessment, for near vs. far vision, for different age ranges, with vs. w/o crowding etc. Rather than change the settings each time (with the danger to forget something), be informed that the SETTINGS state is stored per FrACT file. Thus, if you duplicate (appropriately renaming it) or put a copy in a different location, each will have their ‘personal’ SETTINGS; to switch between different sets of SETTINGS, just quit/exit and start the other version.
This does not work with FrACT₁₀.

Results Export

The test result is presented on the screen. Additionally, the result can be transferred to the clipboard (in a simple, final-result-only or full-history fashion); so just switching to a spreadsheet program running in the background allows pasting the result. As of version 3.6, TCP/IP-based result transmission is also available, using a standard URL-request GET call (update: no longer, but in FrACT₁₀ export via the HTML Web Storage API).

What is special about the Contrast Test?

Experience taught me that contrast testing is technically much more demanding than acuity testing.

Shortcuts
KeyAction
5start a test as defined in SETTINGS
astart Acuity
lstart Acuity Letters
cstart Contrast
vstart Vernier Acuity
e start Acuity Tumbling E
baBout
hHelp
uSETTINGS
q or xQuit = eXit
 55 or <esc> abort running test

Mirroring, or more general “Display transformation”

In narrow environments the standard 4 m distance may be difficult to achieve. In such conditions, high-quality front surface mirrors can be employed. See FrACT₁₀ Manual or classic FrACT3.x Manual [PDF].

Shortcuts

I am lazy and prefer to start actions without mousing, thus I added a number of shortcuts, see FrACT₁₀ Manual or classic FrACT3.x Manual [PDF].

Who used FrACT?

Over 1000 studies cite FrACT. Previously I occasionally found the time to systematically analyse whether FrACT was actually used, and found that 30%–50% of the citing papers did indeed.

General Pertinent Sources
Version history of classic FrACT
2020-04-053.10.5 · Vernier: contrast now adjustable, higher max possible values,
  better shape parameterisation (for MBH & JR)
· reward pictures also for Letter and Vernier acuity
· no more "contrast screening"
· masking now works again (thanks, DH)
· corrected “VA Snellen Letters” to “VA Sloan Letters” (thanks, KW)
· [internal: 'var' → 'const' where possible]
2019-05-103.10.2 · added "bonusEmoji" [Settings>reward pictures (top right). Recommended]
· block-randomiser, now fully ISO/DIN compatible for oblique directions
· added ETDRS to crowding, crowding choices also now work for Letters
· stimulus sequence, all VAs: 0.1 / 0.2 / 0.4 now also 0.8, same ×2 for contrast
· added ceiling/floor detection for acuities: rangeOK, atFloor, atCeiling
· added field for possible range limit in 1st results line
· added "secondsPresentation" to results export
· added cpd info to contrast grating results
· added contrast info to acuity results
· removed feedback info from results (no longer necessary)
· added header line for full history in results
· Vernier ceiling: 1000 → 3000 arcmin (request by MBH)
· fixed occasional Øsaving in luminance linearisation (thanks, SPH)
· partial fix of crashes in FrameCalCheck after any test (thanks, OKolbe)
2018-02-143.9.9a· button Settings>Kg. → to ESU (Einschulungsuntersuchung)
· now ignoring the modifiers: command, control, shift, tab
· for ContrastLandolt choice of fixed pedestal luminance (for SPH)
· Spezial Aalen: fester Visus (deactivated in standard edition)
· fixed: in Contrast Grating, the #of choices was always 4 (thanks, SJAnderson)
· CHANGE: inappropriate keys now interpreted as incorrect response
· fixed regression in persistent history (3.9.8→3.9.9)
· moved "Kindergarten" to a button in Settings, pertinent code → Prefs
· added "FrACT3_lastTrialResult.sol" (for Leipzig collab.)
· displayTransform: works with contrast-C, (2) & letter "S"
2016-10-273.9.8· trialInfoFontSize: default→9, kindergarten→24,
· Quit/eXit via "Q" or "X"
· more selections for spatial frequeny (on request by Zeiss)
· more crowding options
· Vernier: contrast can be inverted, added type (3-line etc.) & scale (for low vision)
· added sounds for stimulus on/off
· shape corrections for Sloan letters K and S (error in Pelli's Sloan font)
· rewrote the squarewave grating for less aliasing
2015-06-013.9.3· "z" entry could be interpreted incorrectly in Letter Acuity depending on locale (was a QWERTZ vs. QWERTY problem)
2015-04-243.9.2· more options for crowding
· added logCS(Weber) to optotype contrast results
· improved color picker behaviour (minor bugfix)
2015-01-283.9.1· corrected incomplete random assignment for letters
· added one more option to crowding (now first is better names as “flanking rings”)
· corrected missing result info on normal trial exit (a regression in 3.9)
2014-11-243.9· added optional incomplete runs (→modified format of export2clipboard)
· VA tracking now works (no longer using Pest, thanks Ross!)
· added kVersionPraeventiometer
· added “Kindergarten” screening preset
2014-04-153.8.2· harmonised choices in “Which test on 5”
· systematic treatment of exentric presentation across tests
· maxVAdecimal now takes the thresholdtype setting into account (a little higher if not DIN)
2013-11-293.8.1 · extended & generalised visual feedback situation
· feedback optotype red with reduced contrast
· sequence: first auditory, then the visual feedback
· updated gamma value now stored without needing to click a button (thanks, Nia)
· possible to have no result displayed at all (to avoid subject influencing)
· tried to really hide mouse cursor (Flash player bug)
· largest Landolt C little smaller, margin one full gap until screen edge (thanks, Mark)
2013-06-183.8.0e· renamed "FrACT3_preferences_history.sol" to "FrACT3_preferences_trialHistory.sol", same for the class
· changed type of "precision" in the rStrN* class to int
· "whichTestOn5" now defaults to acuity in the internal case construct
· removed the (by now) obsolete "T" option
2013-03-273.8.0d· removed hi-res timestamp from results, increased displayed precision of results, added distance to results, units for landoltC-contrast in Weber
· added 1500 ms background mask (for Ralf Kredel)
· default number of trials reduced to 18 (8 choices) and 24 (4 choices) based on recent study
2012-12-073.8.0 · added grating acuity (useful only for low vision!)
· display transform now also works with tumbling E and with Sloan letters (thanks to Paul Artes)
· harmonized terminology across tests;
· Vernier clipboard results now in arcsecs; ISO date form
2012-06-193.7.4c· improved color bit stealing & added to GUI
· added simplified bit-stealing (Tyler1997SpatVis)
· introduced "dir2"-pref to switch between hor/ver which is, in principle, more versatile
· increased the z-mode callback to 50 (for Liz)
· added tracking mode for contrast
· added testType to the persistent history
· grating: added some Gaussian windowing and made patch-diameter a user-defined setting.
2011-10-273.7.1b• added grating test as requested by Jens
• added timestamps (milliseconds since 1970) to the full history
• [3.7.m special version for Paik with long Verniers (40x longer)]
2011-04-293.7lpreview, work in progress
• added display transformations: mirroring vertically and 180°
• delt with blocked information storing (due to new Adobe settings)
• new flash player module (10.2 with 3.7l)
• added “Contrast screening”
    – calibration accessible via shift key, changed sequence logic, now respects the number of orientations (4/8)
• corrected threshold for “red condition” acuity warning in SETTINGS
• added visual feedback (growing optotype)
• rearranged value/label placement on the settings screen, main screen buttons, response key graphics
• removed display size from key settings (caused misunderstanding)
• changed default contrast-dia 30→50 arcmin, max 300→999
• internal class rearranging (LandoltC→Optotypes)
• various minor improvements
• added face files
2010-09-013.6.3• corrected Michelson→Weber contrast calculation: the previous Weber value had been c·W%-times too high (e.g. 1.01% instead of 1.0%, 11% instead of 10%, etc.). Thanks to Prof. von Handorff and his students for spotting this.
• This is the last version that runs on Mac OS/PowerPC.
2010-07-293.6.2• added tumbling E
• added optional on-line trial info
• added persistent history (copied to clipboard with "z")
• modernized writing to the clipboard
• centered parameter-input in the SETTINGS frame
• solved problem of not being able to enter "5" into the subjectID field
2010-03-213.6beta• Quit button now labelled "Exit" in Windows
• added TCP/IP based results transmission
• deleted the flawed and effectless manipulation of presented direction depending on response correctness
• added face recognition paradigm (experimental)
• improved Alert class from <http://fatal-exception.co.uk/blog/?p=69#more-69>
• for FrACT letters the history is now correctly exported, with the letters. Checked LandoltC and SloanC size, they are identical, as should be.
2009-11-113.5.5 Quite a number of tiny improvements:
• added screen dimension to main screen info
• added "force Snellen denominator to 20 ft" on request
• added option for colour Landolt Cs on request
• set uncalibrated values bold & red in the SETTINGS screen to make them more obvious
• set focus to stage (now it responds to keyboard shortcuts after returning from SETTINGS etc.)
• now possible to start with numkey-5 irrespective of numlock setting
2009-09-163.5.4made the calibration bar blue; increased PEST-grain from 500 to 5000; added contrast with Weber definition; improved manual
2009-08-203.5.3 • fixed background glitch, a regression from the new contrast polarity setting
• rearranged the setup a little around the calibration bar
2009-07-193.5.2• added option to set contrast polarity
• fixed silly error (fixation target in contrast testing staying on) introduced recently
• added option not to go full screen (this can help with multiple screen setups)
2009-05-273.5 • fixed errors in the calibration check GUI resulting from the new mask code
• renamed "Preferences" into "Setup", put key settings on main screen
[all thanks to Daphne McCulloch's thoughtful suggestions]
2009-04-213.4.3• Improved coding around the sound channels (fixed the ‘hang’), cleaned up the Pest code (no performance change, just more elegant :) )
• Added detection of sound capabilities and disabled sound settings when appropriate (does not seem to work correctly)
• added a blank (or grey for contrast) mask after the response key. Option in Prefs. Currently fixed at 200 ms.
• Keypad now works without numlock
• Maximal distance increased (9999 cm instead of 999 cm),
• Vernier size now scales with distance (as it should have): 0.5° total height, 0.5 arcmins bar sigma, 0.2 arcmins gap height
• separate timeouts for showing the optotype (down to 0.1 s) and for responding to it
• and further trivia
2008-12-083.3timeout > 30 seconds now possible (current maximum: 999 s); improved Flash version display; corrected a missing help button
2008-11-163.2ported to Flash CS4, added calibration alert
2008-09-103.1.3fixed a capitalisation issue in a sound resource
now ignoring letter capitalisation in shortcuts
2008-09-103.1.2added optional Sloan letters . Range-checked timeout-value (reported by Frank Schmidtborn, more fields need to be checked)
2008-06-203.1All numerical preferences now range-checked
corrected the logic in the response key evaluation (didn't stop after first match). Added acuity based on Sloan letters. Rewrote response code to use key-value pairs.
2008-05-303.0.4“auditory feedback when done” now preserved, made sound resources more generic, improved internal debugging
2008-05-063.0.3Corrected time-out (error diagnosed by Frank Schmidtborn), added a positional jitter to vernier test (as suggested by Wolf Harmening)
2008-04-263.0.2Complete re-write of FrACT, now called FrACT3. Reason for re-write was that I wanted to improve the contrast dithering. This entailed updating to the (totally underwhelming) Adobe's Flash CS3 development system. This required changes in nearly every line of code. A major chore, which markedly improved the program internally, while not showing the changes externally. There is also a new icon, thanks to Inga.
A comparison in 54 eyes found that acuity results differed between FrACT2 and FrACT3 by ≈0.01 LogMAR, thus below noise limit. Contrast testing is improved, the vernier test is being evaluated.
2007-12-242.3fixed a bug of incorrectly formatted Snellen fractions under certain rare conditions
2007-11-192.2re-enabled the “bonus trial” option for the contrast & Vernier test, improved FrACT documentation
2007-10-302.1improved contrast dither for oblique orientations. Thanks to Hendrik Jungnickel at the Ammersee meeting!
2007-07-252.0.5• added 2 new sounds: (1) run done, and (2) incorrect response. Now I prefer the purely auditory feedback to the visual one. Give it a try!
• switch to Flash CS 3 with only few nasty side effects
• internal changes to the PEST procedure: code “beautification” without changes in the basic logic
2007-06-022.0.3• added a "which test on pressing ‘5’" option, changed contrast-Ø default to 30'
• finally found how to abort using <esc>
2007-05-23202a• There was a problem with the final contrast value in the “export to clipboard” record (thanks to Hendrik Jungnickel!)
• Added sanity check for acuity formats. If all are switched off, decimal is switched on
2007-04-112.0Contrast now employs dithering to achieve normal thresholds (currently using a 2×2 dithermatrix, increasing luminance resolution by a factor of 4).
Added target cross for Contrast. Gamma adjustment via cursor keys, reference lines now use 0.5±0.3 luminance, thus avoiding the extremes, better for LCDs.
2007-01-061.10negative optotype contrast now works again (had been lost when making the program more robust with respect to non-sensible preference values, probably back around version 1.2)
2006-11-301.9the smallest gap size had been reduced to 0.5 pixel. Tests now showed that this does not result in reliable optotype quality, and has been reset to 1.0
2006-11-151.8a• Extended warning when the highest possible VA is below 2.0
• Vernier result now honours the preferred decimal point character
• Rewrite of the contrast routines (help from Hendrik Jungnickel gratefully acknowledged): Correct setting of contrast and readback honouring gamma correction, back luminance clamped to 50%; “results2clipboard” now works with contrast;
• contrast now also allows a position shift, added by request
2006-10-011.6a• fixed decimal point internationalisation, fixed tab sequence in Preferences
• “Bonus trials” now have the setting {never | every 6th trial | always}, added by request. This allows to create a separate easy training version.
2006-08-091.5a• added Vernier measurement (first attempt, feedback welcome)
• fixed error that had based the 4afc psychometric function on the 8afc guessing rate
• increased the default trial setting (now at 24 for 8 alternatives)
The documentation does not yet reflect the Vernier addition – but it's rather obvious to operate, methinks.
2006-04-281.3• allowed multiple combination of result formats (decimal, LogMAR, Snellen fractions),
• choose better ranges for rounding of decimal VA,
• switched off the distance information in the result string (anyone needs this?)
2005-11-221.1.3added "frame" (square + circular) to crowding options
2005-11-211.1.2in "results2clipboard" trial number starts with 1, not 0; added "maxAcuity" in Prefs, framePrefs & Acuity
2005-10-251.1added crowding flankers (on request of Bruce Evans)
2005-10-101.0.9switched to Flash 8, some slight changes in the preferences dialog (now a combobox for decimal point)
2005-08-06
                        
1.0.8
         
• added “results2clipboard” (see Help>More Help for format)
• added internationalisation of numerical output (the decimal point)
• unfinished contrast test now defaults to off
2005-04-221.0.6• added a "mirroring" option (requested by Laura Gibson & Ken Nakayama
• added luminance linearisation calibration
2004-10-071.0.5added facility to change eccentricity, made feedback-expansion a bit slower
2004-05-281.0.1fixed a size error introduced in vs 1.0 (due to work on the contrast test some acuity routines were affected)
2004-02-11 1.0 re-implemented old direction strategy: When wrong, then reduce likelihood to present at the responded direction
2004-01-08 added contrast setting for the acuity optotype (suggestion by Lea Hyvärinen)
2002-08-24 ported to Flash
1996-09-07 available on the Internet
1992-11-21 ported to Macintosh
1985 first implementation on a Z80 with a 7220-graphics board

[→even earlier history details)]

A brief history of FrACT

In 1985 I programmed the first version, using a custom-built Z80 CP/M computer with a graphics board based on the NEC 7220 graphics chip, using serious digital differential algorithms (Newman & Sproull, 1979) just to draw the Landolt C. It became more than a curio after incorporation of the Best PEST threshold algorithm (Lieberman & Pentland, 1982) [nowadays one would call this Bayes-based] and was routinely employed in my lab to screen subjects’ acuities before experiments. The port to the Macintosh in 1992, translating from Pascal to C++, facilitated the use of anti-aliasing (Bach, 1997), which immediately made the measurements more precise (by allowing intermediate pixel values) and enabled a higher acuity limit at practical distances (a few meters). After adding gamma correction for better quantitative definition, in 1996 the first Internet version was made available. The rich feedback spurred many bug fixes and feature expansions, paving the way from a ‘hobby’ to a professional program, now validated in independent laboratories. The pressure of requests finally motivated me in 2002 to port the program to an operating system-agnostic environment, for which Macromedia’s (now Adobe’s) Flash was chosen. Consequently the program then ran in near identical fashion on the Macintosh, Linux and Windows operating systems. Anticipating the demise of Flash, in 2020 the program was ported to a Javascript-based framework (Cappuccino), thus now it runs on all platforms, including tablets.

Good programming practice

While FrACT initially began as a “hobby project” (see History above), its widespread application made more rigorous quality control necessary.

As is well known, any interesting computer program cannot be shown to be entirely correct, and usually isn’t. Thus the ongoing validation by independent and critical users is most important for the verification of FrACT. Thank you! All pertinent comments welcome.

Bugs in FrACT₁₀

FrACT₁₀ is a port of “classic” FrACT, yet bugs are inevitable. Please alert me if you find problems.

Bugs in “classic” FrACT

At this time, I am not aware of any bugs proper in FrACT. Please tell me if you find problems.