Revision History

V2.9.0 - 07.06.2021


  • Reduced communication latency of all Time Taggers.

  • Reduced Time Tagger 20 crosstalk on channel 1 and 2.

  • Improved USB connection stability for Time Tagger 20.

  • Optional collection and reporting of pseudonymous usage statistics. Improvement program.

  • Please use at least v2.9.0 for devices shipped from 2021 on.



  • Added TimeTagger.setHardwareBufferSize() for the Time Tagger 20.

  • Added an example and tutorial on how to work with a remote Time Tagger using Python and the Pyro5 package.

  • Licence upgrades can be flashed now for the Time Tagger 20 via the web application.

Bug fixes

V2.8.4 - 04.05.2021

  • Fixed the initialization for a Virtual Time Tagger in the Web Application

V2.8.2 - 26.04.2021

  • Fixed non appearing option to initialize in HighRes mode after upgrading/flashing the device in the Web Application.

V2.8.0 - 29.03.2021


  • High-resolution options for the Time Tagger Ultra series with a timing jitter of down to 4 ps RMS per channel.

  • Hardware input delay on the Time Tagger Ultra series with picoseconds accuracy before the conditional filter.

  • Reduced CPU load for Time Tagger Ultra.


The release is fully compatible with all Time Tagger 20 devices. It is compatible with all Time Tagger Ultra devices shipped from March 2021 and all earlier Time Tagger Ultra devices with 8 or less channels without HighRes option. If you received Time Tagger Ultra before March 2021 and it has more than 8 channels or HighRes, it is not compatible with the release. Please contact support to get a free device exchange to be fully compatible again.

New Time Tagger Ultra features

  • Reduced crosstalk and thermal drift on all channels.

  • The Time Tagger hardware sound module can be activated and set via TimeTagger.setSoundFrequency(). It can be used, e.g., for optical alignment purposes (count rate -> frequency).



  • Added a TriggerOnCountrate virtual channel that generates events when a count rate crosses the given threshold value.

  • Added support for Python 3.9.

  • waitUntilFinished() and sync have an optional timeout parameter.


  • Mathematica: Added example for FileWriter and TimeTaggerVirtual().

  • LabVIEW: Fixed broken example (#14) and added it to the LabVIEW project.

  • C++: Added an example for Custom Virtual Channel.

Bug fixes

V2.7.6 - 26.04.2021

  • Fixed RuntimeError “Got the USB error ‘UnsupportedFeature’” when calling createTimeTagger()

V2.7.4 - 19.04.2021

  • Fixed a bug for old Time Tagger Ultras, where the Web Application could not apply the license upgrade.

V2.7.2 - 22.12.2020


  • Reworked Flim implementation. Versatile high-level functionality with Flim and low-level CPU- and memory- efficient access via FlimBase and callbacks.

  • Highly improved TimeTaggerVirtual performance taking use of multithreading.

  • Support for direct time tag stream access via Custom Measurements in C# and Python - see examples in the installation folder.


  • Added AnyCPU targeted .NET Assembly for C# wrappers. Available in GAC_MSIL and the installation folder.

  • More detailed error handling and human-readable error messages.

  • Added Conditional Filter for TimeTaggerVirtual.

  • Removed Intel’s libmmd.dll library dependency.

  • All measurements have the new common method waitUntilFinished(), which can be used with startFor().

  • Warnings are printed with time information.

  • Cleanup of the C++ measurements’ header file.

  • Remote license upgrades can be performed via the web application.

  • Reworked Python and C# examples.


API changes

  • The old FLIM class is replaced by a new implementation: Flim. In case you need the old implementation, there is a 1 to 1 replacement, see here.

  • All methods and measurements now throw exceptions instead of warning on wrong arguments like invalid channels or out-of-range parameters.

  • Automatically call freeTimeTagger on del/clear/Dispose in Python/Matlab/LabVIEW/C# .

  • Removed the freeAllTimeTagger method.

  • Deprecate the multiple use of createTimeTagger() for one physical device. Pass on the timetagger object instead.

  • _Log is renamed to LogBase.

  • Our libraries are compiled with VS 2019 now, so at least version 142 of the VC runtime is required in the final application.

V2.7.0 - 01.10.2020


  • New measurements are automatically synchronized to the hardware. All data analyzed is guaranteed to be temporal later than the measurement’s initialization, start, or clear. Data coming from the internal buffer, which was acquired before the measurement was initialized, started, or cleared, will not be analyzed. Before this release, the .sync() method was required for these tasks.

Fixes and improvements

  • Added a Matlab example for SynchronizedMeasurements.

  • Fixed a bug in Matlab, creating synced measurements via SynchronizedMeasruements and .getTagger().

  • The last datapoint from a scope measurement is not marked as invalid any more.

V2.6.10 - 07.09.2020

Fixes and improvements

  • Fixes input delay, deadtime and test signal generator for the TimeTaggerVirtual.

  • Fixes getInvertedChannel with the Swabian Synchronizer and with Time Tagger Ultra 8 devices with the old channel numbering schema.

  • x axis is zoomable with Scope measurement.

  • Better error handling for non-existent files with TimeTaggerVirtual and FileReader.


  • Changed the constants CoincidenceTimestamp_ to a Python enum (e.g., CoincidenceTimestamp_First is now CoincidenceTimestamp.First).


  • Enum for timestamp argument for Coincidence(s) is avaiable via TTCoincidenceTimestamp.


  • Fix for slow Linux device opening.

V2.6.8 - 21.08.2020


  • Support for the Time Tagger Value edition. This is an upgradeable and cost-efficient version of the Time Tagger Ultra for applications with moderate timing precision requirements.


  • Added Histogram2D to the measurement list.

  • Improved performance and responsiveness for large datasets.

  • 32-bit version of the Web Application works again.

  • Fixed a bug that data of stopped measurements could not be saved.

  • Fixed a bug that settings saved had the file extension .json instead of .ttconf ending.

  • Fixed a bug when using falling edges for Time Tagger starting with channel 0.


  • Fixed a bug that some named arguments could not be used anymore.



  • Improved performance of the FileWriter, exceeding 100 M tags/s on high-end CPUs.

  • Improved binning performance of all histogram measurements: Correlation, FLIM, Histogram, StartStop, TimeDifferences, TimeDifferencesND.

  • Fixes a deadlock in the virtual Time Tagger if a measurement accesses some public methods of the Time Tagger.

V2.6.6 - 10.07.2020


  • Swabian Synchronizer support. The Synchronizer hardware can combine 8 Time Tagger Ultras with up to 144 channels. The combined Time Tagger can be interfaced the very same as it would be only one device.

  • Support for custom measurements in Python. Please see the provided programming example in the installation folder for further details.


  • Support for the Synchronizer

  • Showing error messages from setLogger API in a modal window

  • Load/save settings is now supported for the Time Tagger Virtual

Time Tagger Ultra

  • Hardware revision 1.1 now with the same performance enhancement of 500 MHz maximum sync rate, 2ns dead time and better phase stability, as introduced before for Hardware revision > 1.1

  • Dropped support for the very first Time Tagger Ultras, an error will be shown on initialization - free exchange program available

  • More intuitive byte order of the bitmask in setLED

  • Small modifications to the hardware channel to channel delay


  • Coincidence and Coincideces have an optional parameter to select which timestamp should be inserted, the last/first completing the coincidence, the average of the event timestamps, or the first of the coincidence list.

  • Fixed .net/Matlab/LabVIEW wrappers for data with empty 2D or 3D arrays

  • Provide a globally registered .NET publisher policy for C#, avoiding the ‘wrong dll version’ message in Labview when updating the Time Tagger software

  • setConditionalFilter throws an exception when invalid arguments are applied

  • Hide the warning on fetching the TimeTaggerVirtual license without an internet connection

  • DelayedChannel supports a negative delay

  • Performance enhancements in StartStop

V2.6.4 - 27.05.2020


  • Option to enable logarithmic y-axis scaling for Counter, Histogram, HistogramLogBins and Correlation

  • Redesign “Create measurement” dialog with links to the online documentation

  • Fixed flickering when switching between plots

  • Fixed plotting wrong data range when changing the number of data points

  • Added the basic functionality of the TimeTaggerVirtual (test signal only)

New features and improvements

  • Added the test signal to TimeTaggerVirtual

  • Support for Ubuntu 20.04 and CentOS 8

  • LabVIEW example for FileWriter and FileReader

  • Improved Matlab API for VirtualTimeTagger, adding optional parameters

  • Make the data transfer size configureable by .setStreamBlockSize

  • Performance improvements for HistogramLogBins

  • Slightly improved timing jitter at large time differences for the Time Tagger 20

  • Time Tagger Application works again with 32 bit operating systems

  • Connection errors are shown in the Matlab console or can be handled with the new logger functionality

  • Added custom logger examples for Matlab/Python/C#


  • Updated the USB library

  • Stop measurements when freeTimeTagger is called (e.g. closes files on dump, isRunning now returns false)

  • Reduced polling rate (0.1s) for USB reconnections

API changes

  • Added .setLogger() to attach a callback function for custom info/error logging

  • Rename of enumeration ErrorLevel to LogLevel

  • Rename of log level constants and with new corresponding integer values

V2.6.2 - 10.03.2020


  • TimeTaggerVirtual, FileWriter, and FileReader have reached a stable state

  • Improved Linux support (documentation, compiling custom Python wrappers)

New features

  • Added setInputDelay, setDeadtime, getOverflows, and more to the TimeTaggerVirtual

  • Add an optional parameter in setConditionalFilter for disabling the hardware delay compensation

  • Infinite dumping in Dump for negative max_count

  • Create a freeAllTimeTagger() method, which is called by Python atexit

  • Reimplement SynchronizedMeasurements as a proxy tagger object, which auto registers new measurements without starting them

  • The new SynchronizedMeasurements.isRunning() method returns if any measurement is still running

  • Python: Distribute the generated C++ wrapper source for supporting future Python revisions

  • C++: New IteratorBase.getLock method returning a std::unique_lock

  • C++: Improved exception handling for custom measurements: exceptions now stop the measurement, runSynchronized forwards exceptions to the caller

API changes

  • TimeTagger.getVersion return value is changed to a string

  • C++: Use 64 bit integers for the dimensions in the array_out helpers

  • C++: Rename the base class for custom measurements from _Iterator to IteratorBase

  • C++: Constructors of custom measurements shall call finishInitialization instead of IteratorBase.start

  • Python 2.7: Update the numpy C headers to 1.16.1

Examples and documentation

  • Improved Histogram2D example

  • Clearify setInputDelay vs DelayedChannel

Bug fixes

  • Relax the voltage supply check in the Time Tagger Ultra hardware revision 1.4

  • Use a 1 MB buffer for Dump, FileWriter, and FileReader to achieve full speed especially on network devices

  • Fix getTimeTaggerModel on an active device

  • Fix deadlock within sync() while the device is disconnected

  • Provide the documentation on Linux

  • Several fixes and improvements for the FileWriter and TimeTaggerVirtual


  • Improved default names for measurements

  • Not relying on data stored within the browser any more

  • Disabling mouse scrolling within numeric inputs

  • Various buxfixes

V2.6.0 - 23.12.2019


  • FileWriter: New space-efficient file writer for storing time tag stream on a disk. The file size is reduced by a factor of 4 to 8. Replaces the Dump function.

  • Virtual Time Tagger allows to replay previously dumped events back into the Time Tagger software engine.

  • Improved behavior in the overflow mode. The hardware now also reports the amount of missed events per input channel and provides the start and the end timestamps of the overflow interval.

  • New tutorial on how to implement the data acquisition for a confocal microscope

  • New measurement Histogram2D for 2-dimensional histogramming with examples

  • Web App: Selectable input units (s/ms/µs/ps) instead of ps only

Known issues

  • FileWriter and FileReader have a low performance on network devices

API changes

  • deprecated TimeTagStreamBuffer.getOverflows() – use .getEventTypes() instead

  • renamed HistogramLogBin.getDataNormalized() to .getDataNormalizedCountsPerPs()

  • removed deprecated TimeTagger.getChannels() - use .getChannelList() instead

  • removed deprecated CHANNEL_INVALID - use CHANNEL_UNUSED instead

  • removed deprecated TimeTagger.setFilter() and TimeTagger.getFilter() - use .setConditionalFilter(), .getConditionalFilter(), and .clearConditionalFilter() instead

  • C++: All custom measurement class constructors must be modified, such that the parameter containing the Time Tagger is of the type TimeTaggerBase. This allows for using the custom measurement within a real Time Tagger object and the Time Tagger Virtual.

  • C++: The struct Tag includes the type of event and the amount of missed events. They have replaced the overflow field.

  • C++/Windows: We additionally distribute binaries for the debug runtime (/MDd)

  • Matlab: is now deprecated, use .freeTimeTagger()

New features

  • Web App: Normalization (counts/s) for the Counter measurement

  • getConfiguration returns the current hardware configuration as a JSON string

  • added g2 normalization for HistogramLogBins with getDataNormalizedG2

  • improved overflow behavior for Countrate due to the missed event counters

  • improved overflow handling for the g2 normalization of Correlation and HistogramLogBin

  • support for Python version 3.8

  • smaller latency on low data rates due to adaptive chunk sizes of <= 20 ms

  • support for the Time Tagger Ultra hardware revision 1.4


  • Matlab: Faster loading of events from disk for now deprecated Dump file format

  • C++: Loading events from disk stored in the new data format

  • Labview: Scope example, .NET version redirection

  • Mathematica: Improved example

  • Python: Added “Stop” button to the countrate figure.

Bug fixes

  • fixed static input delay error with conditional filter enabled since v2.2.4

  • added missing TimeTagger.getTestSignalDivider() method

  • Scope: Fix the output if one channel has had no events

  • resolve overflows after the initialization of the Time Tagger 20

  • fixes an issue with wrongly sorted events on the reconfiguration of input delays

  • always emit an error event on plugging an external clock source

  • fixes an unlikely case when the synchronization of the external clock got lost

  • the new USB driver version fixes some random data abruption

  • TTU1.3: Fix a bug which may select a wrong clock source in the first 21 seconds and wrongly activated ext clock LED

  • Matlab: SynchronizedMeasurements work now in Matlab, too

  • different improvements within the python and C# wrappers

  • LED turns off and not red after freeing a Time Tagger

  • Dump now releases the file handle after the end of the startFor duration

  • Web App: Removed caching issues when up or downgrading the software

V2.4.4 - 29.07.2019

  • reduced crosstalk between nonadjacent channels of the Time Tagger Ultra

  • fixed a bug leading to high crosstalk with V2.4.2 for specific channels

  • fixed a rare clock selection issue on the Time Tagger 20

  • improved and more detailed documentation

  • new method Countrate.getCountsTotal(), which returns the absolute number of events counted

  • new Mathematica quickstart example

  • new Scope example for LabVIEW

  • support of the Time Tagger 20 series with hardware revision 2.3

  • release the Python GIL while in the Time Tagger engine code

  • fixed a bug in ConstantFractionDiscriminator, which could cause that no virtual tags were generated

V2.4.2 - 12.05.2019

  • support of the Time Tagger Ultra series with hardware revision 1.3

  • improve performance of short pulse sequences on the Time Tagger 20 series

  • improve overflow behavior at too high input data rates

  • fix the name of the ‘SynchronizedMeasurements’ measurement class

V2.4.0 - 10.04.2019


  • 32 bit C++ library added

  • C++ and .NET libraries renamed and registered globally


  • virtual constant fraction discriminator channel ‘ConstantFractionDiscriminator’ added

  • ‘TimeDifferenceND’ added for multidimensional time differences measurements

  • faster binning in ‘TimeDifferences’ and ‘Correlation’ measurements

  • improved memory handling for ‘TimeTageStream’

  • improved Python library include

  • fixed ‘.getNormalizedData’ for ‘Correlation’ measurements

  • various minor bug fixes and improvements


  • LabVIEW project for 32 and 64 bit

  • improved LabVIEW examples

Time Tagger Ultra

  • 10 MHz EXT input clock detection enabled

  • internal buffer size can be increased from 40 MTags to 512 MTags with ‘setHardwareBufferSize’

  • reduced crosstalk and timing jitter

  • increased maximum transfer rate to above 65 MTags/s (Intel 5 GHz CPU on 64 bit)

  • various performance improvements

  • reduced deadtime to 2 ns on hardware revision >= 1.2

Time Tagger 20

  • 166.6 MHz EXT input clock detection enabled

Operating systems

  • equivalent support for Windows 32 and 64 bit, Ubuntu 16.04 and 18.04 64 bit, CentOS 7 64 bit

V2.2.4 - 29.01.2019

  • fix the conditional filter with filter and trigger events arriving within one clock cycle

  • fix issue with negativ input delays

  • calling .stop() while dumping data stops the dump and closes the file

  • fix device selection on reconnection after transfer errors

  • synchronize tags of falling edges to their raising ones

V2.2.2 - 13.11.2018

  • Removed not required Microsoft prerequisites.

  • 32 bit version available

V2.2.0 - 07.11.2018

General improvements

  • support for devices starting with channel 1 instead of 0

  • under certain circumstances, the crosstalk for the Time Tagger 20 of channel 0-2, 0-3, 1-2, and 1-3 was highly increased, which has been fixed now

  • updated and extended examples for all programming languages (Python, Matlab, C#, C++, LabVIEW)

  • C++ examples for Visual Studio 2017, with debug support

  • documentation for virtual channels

  • Web app included in the 32 bit installer

  • Linux package available for Ubuntu 16.04

  • Support for Python 3.7


  • ‘HistogramLogBin’ allows analyzing incoming tags with logarithmic bin sizes.

  • ‘FrequencyMultiplier’ virtual channel class for upscaling a signal attached to the Time Tagger. This method can be used as an alternative to the ‘Conditonal Filter’.

  • ‘SynchronizedMeasurements’ class available to fully synchronize start(), stop(), clear() of different measurements.

  • Second parameter from ‘setConditionalFilter’ changed from ‘filter’ to ‘filtered’.

Web application

  • full ‘setConditionalFilter’ functionality available from the backend within the Web application

V2.1.6 - 17.05.2018

fixed an error with getBinWidths from CountBetweenMarkers returning wrong values

V2.1.4 - 21.03.2018

fixed bin equilibration error appearing since V2.1.0

V2.1.2 - 14.03.2018

fixed issue installing the Matlab toolbox

V2.1.0 - 06.03.2018

Time Tagger Ultra

  • efficient buffering of up to 60 MTags within the device to avoid overflows

V2.0.4 - 01.02.2018

Bug fixes

  • Closing the web application server window works properly now

V2.0.2 - 17.01.2018


  • Matlab GUI example added

  • Matlab dump/load example added

Bug fixes

  • dump class writing tags multiple times when the optional channel parameter is used

  • Counter and Countrate skip the time in between a .stop() and a .start() call

  • The Counter class now handles overflows properly. As soon as an overflow occurs the lost data junk is skipped and the Counter resumes with the new tags arriving with no gap on the time axis.

V2.0.0 - 14.12.2017

Release of the Time Tagger Ultra


The input delays might be shifted (up to a few hundred ps) compared to older driver versions.

Documentation changes

  • new section ‘In Depth Guides’ explaining the hardware event filter


  • fixed a bug setting the input values to 0 when typing in a new value

  • new server launcher screen which stops the server reliably when the application is closed

V1.0.20 - 24.10.2017

Virtual Channels

  • DelayedChannel clones and optionally delays a stream of time tags from an input channel

  • GatedChannel clones an input stream, which is gated via a start and stop channel (e.g. rising and falling edge of another physical channel)


  • startFor(duration) method implemented for all measurements to acquire data for a predefined duration

  • getCaptureDuration() available for all measurements to return the current capture duration

  • getDataNormalized() available for Correlation

  • setEventDivider(channel, divider) also transmits every nth event (divider) on channel defined


  • label for 0 on the x-axis is now 0 instead of a tiny value

C++ API:

  • internal change so that clear_impl() and next_impl() must be overwritten instead of clear() and next()

Other bug fixes/improvements

  • improved documentation and examples

V1.0.6 - 16.03.2017

Web application (GUI)

  • load/save settings available for the Time Tagger and the measurements

  • correct x-axis scaling

  • input channels can be labeled

  • save data as tab separated output file (for Matlab, Excel, … import)

  • fixed: saving measurement data now works reliably

  • fixed: ‘Initialize’ button of measurements works now with tablets and phones


  • direct time stream access possible with new class TimeTagStream (before the stream could be only dumped with Dump)

  • Python 3.6 support

  • better error handling (throwing exceptions) when libraries not found or no Time Tagger attached

  • setTestSignal(…) can be used with a vector of channels instead of a single channel only

  • Dump(…) now with an optional vector of channels to explicitly dump the channels passed

  • CHANNEL_INVALID is deprecated - use CHANNEL_UNUSED instead

  • Coincidences class (multiple Coincidences) can be used now within Matlab/LabVIEW

Documentation changes

  • documentation of every measurement now includes a figure

  • update and include web application in the quickstart section

Other bug fixes/improvements

  • no internal test tags leaking through from the initialization of the Time Tagger

  • Counter class not clearing the data buffer in time when no tags arrive

  • search path for bitfile and libraries in Linux now work as they should

  • installer for 32 bit OS available

V1.0.4 - 24.11.2016

Hardware changes

  • extended event filter to multiple conditions and filter channels

  • improved jitter for channel 0

  • channel delays might be different from the previous version (< 1 ns)

API changes

  • new function setConditionalFilter allows for multiple filter and event channels (replaces setFilter)

  • Scope class implements functionality to use the Time Tagger as a 50 GHz digitizer

  • Coincidences class now can handle multiple coincidence groups which is much faster than multiple instances of Coincidence

  • added examples for C++ and .net

Software changes

  • improved GUI (Web application)

Bug fixes

  • Matlab/LabVIEW is not required to have the Visual Studio Redistributable package installed

V1.0.2 - 28.07.2016

Major changes:

  • LabVIEW support including various example VIs

  • Matlab support including various example scripts

  • .net assembly / class library provided (32 and 64 bit)

  • WebApp graphical user interface to get started without writing a single line of code

  • Improved performance (multicore CPUs are supported)

API changes:

  • reset() function added to reset a Time Tagger device to the startup state

  • getOverflowsAndClear() and clearOverflows() introduced to be able to reset the overflow counter

  • support for python 3.5 (32 and 64 bit) instead of 3.4


initial release supporting python

Channel Number Schema 0 and 1

The Time Taggers delivered before mid 2018 started with channel number 0, which is very convenient for most of the programming languages.

Nevertheless, with the introduction of the Time Tagger Ultra and negative trigger levels, the falling edges became more and more important, and with the old channel schema, it was not intuitive to get the channel number of the falling edge.

This is why we decided to make a profound change, and we switched to the channel schema which starts with channel 1 instead of 0. The falling edges can be accessed via the corresponding negative channel number, which is very intuitive to use.

Time Tagger 20 and Ultra 8

Time Tagger Ultra 18







0 to 7

8 to 15

0 to 17

18 to 35



1 to 8

-1 to -8

1 to 18

-1 to -18


With release V2.2.0, the channel number is detected automatically for the device in use. It will be according to the labels on the device.

In case another channel schema is required, please use setTimeTaggerChannelNumberScheme(int scheme) before the first Time Tagger is initialized. If several devices are used within one instance, the first Time Tagger initialized defines the channel schema.

int getInvertedChannel(int channel) was introduced to get the opposite edge of a given channel independent of the channel schema.