Time Tagger User Manual Logo
Documentation as pdf
  • Getting Started
    • Installation Instructions
      • Windows
        • Installation
        • Time Tagger Lab
      • Linux
        • Installation
      • Application data directory
      • Offline installation
        • License retrieval
        • Windows installer
        • .NET Desktop Runtime
        • Trusted certificate authorities
    • Time Tagger Lab
      • Selecting a device on the home screen
      • Configuring input channels
        • Trigger level
        • Signal delay
        • Dead time
        • Event divider
        • Conditional filter
      • Performing measurements
        • The measurement view
        • Measurements list
        • Chart view
        • Properties
      • Processors and virtual channels
        • Processor tips and tricks
        • Virtual channel naming
      • Saving measurement data
        • Export data / trace data
        • Export chart
      • Reference clock
      • Network server
      • Network client
      • Troubleshooting
        • Overflows
        • Log warning messages
    • Programming Languages
      • Python
      • LabVIEW (via .NET)
      • MATLAB (wrapper for .NET)
      • .NET
      • C#
      • C++
        • Debug and Release Builds
        • Code Sanitizers
    • Hardware License Upgrades
      • Time Tagger Lab
      • Python
    • Usage Statistics Collection
      • Contents of the usage statistics data
      • Ways of control
      • Time Tagger Lab diagnostics
  • Hardware
    • Operating conditions
    • Input channels
      • Electrical characteristics
      • Configurable input termination - Time Tagger X only
      • High Resolution Mode
    • Data connection
    • Calibration
    • LEDs
      • Time Tagger X
      • Time Tagger Ultra
      • Time Tagger 20
    • Test signal
    • Synthetic input delay
    • Synthetic dead time
    • Event divider
    • Conditional Filter
    • Bin equilibration
    • Overflows
    • External Clock Input
    • Synchronization signals
    • FPGA link
    • General purpose IO (GPIO)
    • 19-inch rack mount
  • Tutorials
    • Measuring Coincidences
      • Time Tagger configuration
      • Coincidence-counting
      • Delay adjustment for coincidence detection
      • Exclusive coincidences using Combinations virtual channel
      • Coincidence-counting vs Correlation Measurement
    • Confocal Fluorescence Microscope
      • Time Tagger configuration
      • Intensity scanning microscope
      • Fluorescence Lifetime Microscope
      • Alternative pixel trigger formats
        • Pixel pulse width defines the integration time
        • Pixel pulse indicates the pixel start
        • FLIM with non-periodic pixel trigger
        • Line pulse but no pixel pulses
    • Fluorescence Correlation Spectroscopy
      • Microscope Setup
      • Single Photon Correlation
      • Time Tagger configuration
      • Continuous Wave Laser
      • Fluorescence Cross-Correlation Spectroscopy
      • Pulsed Laser
      • Spectral Overlap and Pulsed Interleaved Excitation
    • Optically Detected Magnetic Resonance
      • Creation of optical and microwave pulse patterns
      • Signal generation and detection
      • Sweeping modes
      • ODMR contrast
    • Remote Synchronization of Time Taggers
      • Establishing a common time base across distributed locations
      • Starting a Time Tagger Server at each location
      • Connecting to multiple Time Tagger Servers over the network
      • Accessing individual servers
      • Verification of the synchronization technology using a single Time Tagger
      • Measuring synchronization precision across multiple Time Taggers
    • Remote Time Tagger with Python
      • Sharing a Time Tagger with Network Time Tagger
      • Remote control of a Time Tagger with Pyro
      • Remote procedure call
      • Initial setup
      • Minimal example
      • Creating the Time Tagger
      • Measurements and virtual channels
      • Working example
      • What is next?
  • Software Overview
    • Graphical user interface
    • Precompiled libraries and high-level language bindings
    • C++ API
  • Application Programming Interface
    • Examples
      • Measuring cross-correlation
      • Using virtual channels
      • Using multiple Time Taggers
      • Using Time Tagger remotely
    • The TimeTagger Library
      • Units of measurement
        • timestamp_t
      • Channel numbers
        • channel_t
      • Unused channels
      • Constants
        • CHANNEL_UNUSED
      • Enumerations
        • AccessMode
        • ChannelEdge
        • CoincidenceTimestamp
        • FpgaLinkInterface
        • GatedChannelInitial
        • Resolution
        • Type
        • UsageStatisticsStatus
        • TestSignalSource
      • Functions
        • createTimeTagger()
        • createTimeTaggerVirtual()
        • createTimeTaggerNetwork()
        • extractDeviceLicense()
        • flashLicense()
        • getTimeTaggerServerInfo()
        • freeTimeTagger()
        • scanTimeTagger()
        • scanTimeTaggerServers()
        • setLogger()
        • mergeStreamFiles()
        • getVersion()
        • setUsageStatisticsStatus()
        • getUsageStatisticsStatus()
        • getUsageStatisticsReport()
      • Helper classes
        • ChannelGate
    • TimeTagger Classes
      • General Time Tagger features
        • TimeTaggerSource
        • TimeTaggerBase
      • Time Tagger
        • TimeTaggerHardware
        • TimeTagger
      • The TimeTaggerVirtual class
        • TimeTaggerVirtual
      • The TimeTaggerNetwork class
        • TimeTaggerNetwork
        • TimeTaggerServer
      • Additional classes
        • ReferenceClockState
        • SoftwareClockState
    • Virtual Channels
      • Available virtual channels
      • Common methods
        • VirtualChannel.getChannel()
        • VirtualChannel.getChannels()
      • Coincidence
        • Coincidence
      • Coincidences
        • Coincidences
      • Combinations
        • Combinations
      • Combiner
        • Combiner
      • ConstantFractionDiscriminator
        • ConstantFractionDiscriminator
      • DelayedChannels
        • DelayedChannels
        • DelayedChannel
      • EventGenerator
        • EventGenerator
      • FrequencyMultiplier
        • FrequencyMultiplier
      • GatedChannels
        • GatedChannels
        • GatedChannel
      • TriggerOnCountrate
        • TriggerOnCountrate
    • Measurement Classes
      • Common methods
        • IteratorBase
      • Event counting
        • Countrate
        • Counter
        • GatedCounter
      • Time histograms
        • StartStop
        • Histogram
        • HistogramLogBins
        • HistogramCustomBins
        • Histogram2D
        • HistogramND
        • Correlation
        • CorrelationPairs
        • TimeDifferences
        • TimeDifferencesND
      • Fluorescence-lifetime imaging (FLIM)
        • FlimAbstract
        • Flim
        • FlimFrameInfo
        • FlimBase
      • Phase & frequency analyses
        • FrequencyCounter
        • FrequencyStability
        • PhaseNoise
        • PulsePerSecondMonitor
      • Time-tag streaming
        • TimeTagStream
        • FileWriter
        • FileReader
        • Dump
        • Scope
        • Sampler
      • Helper classes
        • CustomMeasurement
        • SynchronizedMeasurements
  • In Depth Guides
    • Software-Defined Reference Clock
      • Overview of synchronization concepts
        • Traditional hardware reference clock
        • Software-defined reference clock
      • Setting up the software-defined reference clock
      • Technical limitations
        • Input signal limitations
        • Resolution limitations
      • Advanced features
        • Emulating the Conditional Filter
        • Averaging of rising and falling edges
    • Conditional Filter
      • Example configurations
        • One trigger and one filtered channel
        • Multiple trigger-channels
        • Multiple filtered channels
        • Multiple trigger and filtered channels
      • Understanding the filtering mechanism
        • Terms
        • Processing stages
        • Consequences
      • Setup of the Conditional Filter
        • Control hardware delay compensation
        • Disable the Conditional Filter
    • Raw Time-Tag-Stream access
      • Dumping and post-processing
        • File Reader
        • Virtual Time Tagger
      • On-the-fly processing
        • TimeTagStream - high-level, lower performance
        • CustomMeasurement - low-level, higher performance
        • CustomVirtualChannel - modify the time tag stream - C++ only
        • IteratorBase - C++ only
    • Synchronization of the Time Tagger pipeline
    • 10 Gbit/s Ethernet Link
      • Setup overview and requirements
      • Preparing the receiving network interface
        • Windows
        • Linux
      • Enabling 10 GbE streaming
      • Performance considerations
    • FPGA Link
      • Getting Started with SFP+
      • Using QSFP+
      • Modifying the reference design
  • Synchronizer
    • Overview
    • Key applications
      • Crosstalk elimination
      • High transfer rate
      • Multi-room experiment
      • Synchronizer with a single Time Tagger
    • Requirements
    • Cable connections
      • Using an external reference clock
    • Software and channel numbering
      • Incomplete cable connections
      • Buffer overflows
    • Limitations
      • Conditional filter
      • Internal test signal
    • Status LEDs and troubleshooting
  • Safety & Compliance
    • Safety and Compliance Guidelines
      • Symbols
      • Operation environment
      • Electrostatic-sensitive device
        • Cleaning
      • Disposal and recycling
      • Contact, support and service
    • Time Tagger X Safety Notice
      • Electrical characteristics
      • Equipment installation
      • Maintenance and repair
        • Power cord
        • Safety fuse
  • Revision History
    • V2.22.0 - 26.06.2026
    • V2.21.2 - 26.03.2026
    • V2.21.0 - 19.02.2026
    • V2.20.2 - 17.12.2025
    • V2.20.0 - 11.12.2025
    • V2.19.0 - 29.07.2025
    • V2.18.2 - 07.05.2025
    • V2.18.0 - 23.04.2025
    • V2.17.6 - 21.01.2025
    • V2.17.4 - 17.07.2024
    • V2.17.2 - 02.07.2024
    • V2.17.0 - 22.04.2024
    • V2.16.2 - 28.06.2023
    • V2.16.0 - 05.06.2023
    • V2.15.0 - 06.03.2023
    • V2.14.0 - 23.12.2022
    • V2.13.2 - 22.11.2022
    • V2.12.4 - 09.11.2022
    • V2.12.2 - 04.10.2022
    • V2.12.0 - 01.09.2022
    • V2.11.0 - 22.04.2022
    • V2.10.6 - 16.03.2022
    • V2.10.4 - 23.02.2022
    • V2.10.2 - 31.12.2021
    • V2.10.0 - 22.12.2021
    • V2.9.0 - 07.06.2021
    • V2.8.4 - 04.05.2021
    • V2.8.2 - 26.04.2021
    • V2.8.0 - 29.03.2021
    • V2.7.6 - 26.04.2021
    • V2.7.4 - 19.04.2021
    • V2.7.2 - 22.12.2020
    • V2.7.0 - 01.10.2020
    • V2.6.10 - 07.09.2020
    • V2.6.8 - 21.08.2020
    • V2.6.6 - 10.07.2020
    • V2.6.4 - 27.05.2020
    • V2.6.2 - 10.03.2020
    • V2.6.0 - 23.12.2019
    • V2.4.4 - 29.07.2019
    • V2.4.2 - 12.05.2019
    • V2.4.0 - 10.04.2019
    • V2.2.4 - 29.01.2019
    • V2.2.2 - 13.11.2018
    • V2.2.0 - 07.11.2018
    • V2.1.6 - 17.05.2018
    • V2.1.4 - 21.03.2018
    • V2.1.2 - 14.03.2018
    • V2.1.0 - 06.03.2018
    • V2.0.4 - 01.02.2018
    • V2.0.2 - 17.01.2018
    • V2.0.0 - 14.12.2017
    • V1.0.20 - 24.10.2017
    • V1.0.6 - 16.03.2017
    • V1.0.4 - 24.11.2016
    • V1.0.2 - 28.07.2016
    • V1.0.0
Time Tagger User Manual
  • In Depth Guides
  • 10 Gbit/s Ethernet Link

10 Gbit/s Ethernet Link

The Time Tagger X provides multiple interfaces for transferring time-tag data. For standard operation, the recommended configuration is to transfer time tags to the host PC via USB 3.0, which provides a specified data transfer rate up to 90 MTags/s. For applications requiring higher sustained throughput or lower latency, the Time Tagger X also provides SFP+ and QSFP+ interfaces. These interfaces are also discussed in the FPGA Link in-depth guide, where they are employed to stream time tags to external FPGA hardware through an Ethernet-based protocol.

This guide describes how to use the SFP+ interface as a 10 Gbit/s Ethernet (10 GbE) link for streaming time tags directly from the Time Tagger X to an acquisition PC. The data stream is received and processed by the Time Tagger software.

The 10 GbE interface supplements rather than replaces the USB connection: USB remains required for device configuration and control, while the time-tag data stream is routed over the SFP+ interface. At any given time, all time-tag data is transferred over a single data interface; it is not possible to route data from some channels over USB and from others over the SFP+ interface simultaneously.

Note

The 10 GbE link is intended for applications with sustained time-tag rates that exceed what can be transferred consistently over the USB interface. For lower data rates, the USB interface is simpler and therefore recommended.

Note

10 GbE data transfer is available to all users at up to 100 MTags/s. With the High Rate hardware license, the full transfer rate of up to 300 MTags/s over SFP+ is enabled. To upgrade your license, contact sales@swabianinstruments.com. The license can then be updated using the standard procedure described in Hardware License Upgrades.

The following sections describe the setup requirements and provide step-by-step guidance for configuring and validating the connection.

Setup overview and requirements

The acquisition PC must be equipped with a dedicated 10 GbE network adapter with an SFP+ port, either an internal PCIe card or an external adapter, and connected to the Time Tagger X via two independent interfaces: USB 3.0 for device configuration and control, and the SFP+ interface for the time-tag data stream. The recommended physical setup is a direct point-to-point connection between the SFP+ port of the Time Tagger X and the 10 GbE adapter. The acquisition PC must run Time Tagger software version 2.22 or later.

The time-tag data stream uses UDP. Because the Time Tagger X generates Ethernet frames directly without relying on ARP, the IPv4 address and MAC address of the receiving network interface must be supplied explicitly when enabling the stream via the Time Tagger API. How to identify these values is described in the next section.

The achievable time-tag transfer rate depends strongly on the MTU, which defines the maximum packet size used for the UDP data stream. Standard Ethernet operation uses an MTU of 1500 bytes. Larger MTU values require support for larger-than-standard Ethernet frames, commonly referred to as jumbo frames. The Time Tagger API uses an MTU of 9000 bytes by default. For high-rate operation, the receiving network interface must therefore be configured to accept Ethernet frames large enough to carry UDP packets with this MTU, as described in the following section.

If the network path does not support an MTU of 9000 bytes, the Time Tagger MTU parameter must be reduced to the maximum value accepted by all components in the path. At the standard Ethernet MTU of 1500 bytes, the achievable transfer rate is significantly reduced because the same data must be carried by many more, smaller UDP packets; in this case, we recommend using the USB interface instead.

The following table lists hardware configurations validated for 10 GbE streaming, together with the achieved sustained transfer rates at MTU 9000 bytes. Comparable rates may be achievable with MTU values above approximately 5000 bytes.

10 GbE SFP+ interface

CPU

OS

Transfer rate (MTags/s)

Intel X520 (PCIe)

AMD Ryzen 9 9950X

Windows 11 / Ubuntu 24.04

300 / 260

Intel X710 (PCIe)

AMD Ryzen 9 9950X

Ubuntu 24.04

264

QNAP QNA-T310G1S (Thunderbolt 3)

AMD Ryzen 9 9950X

Windows 11

300

QNAP QNA-T310G1S (Thunderbolt 3)

AMD Ryzen 7 PRO 8840HS

Windows 11

300

QNAP QNA-T310G1S (Thunderbolt 3)

Intel Core i7-1360P

Windows 11

300

All measurements were performed with Time Tagger software version 2.22 using a modified version of the transfer_rate.py example found in the 6-Various-Examples folder of the Time Tagger installation, with 8 channels enabled.

Preparing the receiving network interface

Before enabling 10 GbE streaming, the receiving network interface must be configured to accept packets with an MTU of at least 9000 bytes, which matches the default MTU used by the Time Tagger API. The IPv4 address and MAC address of the receiving interface must also be identified. The exact steps depend on the operating system and on the network-adapter driver.

Windows

Identifying the 10 GbE interface

Open a PowerShell window and run:

Get-NetAdapter

The output lists all available network adapters with their name, description, and link state. Connect the cable between the Time Tagger X SFP+ port and the 10 GbE adapter; the corresponding entry will change from Disconnected to Up. Note the adapter name; it is used in the following steps.

Configuring jumbo frames / MTU

  1. Open Device Manager and expand Network Adapters.

  2. Right-click the 10 GbE adapter and select Properties.

  3. Go to the Advanced tab and locate the Jumbo Packet (or Jumbo Frame) property.

  4. Set the value to 9014 Bytes or the highest available value of at least 9000 bytes.

  5. Click OK.

Finding the IPv4 address and MAC address

Open a Command Prompt and run:

ipconfig /all

Locate the entry for the adapter name identified above. The IPv4 Address and Physical Address (MAC address) fields provide the values required by the Time Tagger API.

Alternatively, open Settings ‣ Network & Internet, select the adapter, and click Properties. Both the IPv4 address and the Physical address (|MAC|) are listed there.

Linux

Identifying the 10 GbE interface

Run the following command to list all network interfaces:

ip link show

The output lists all interfaces with their current state. The 10 GbE interface connected to the Time Tagger X can be identified by its state changing from DOWN to UP when the cable is plugged in. Note the interface name (e.g. enp3s0 or eth0); it is used in all subsequent commands.

Configuring the MTU

Set the MTU to 9000 bytes, replacing <interface> with the name identified above:

sudo ip link set <interface> mtu 9000

Verify that the MTU has been applied:

ip link show <interface>

The output should contain mtu 9000. This change takes effect immediately but might not be persistent across reboots.

Finding the IPv4 address and MAC address

ip addr show <interface>

The MAC address appears on the link/ether line and the IPv4 address on the inet line. These are the values to supply to the Time Tagger API.

Enabling 10 GbE streaming

After the receiving network interface has been prepared, 10 GbE streaming is enabled via the Time Tagger API. The Time Tagger X must first be connected and initialized over USB, as in normal operation.

Call xtra_enableStreamInterfaceUDP() with the following parameters:

  • pc_ip: the IPv4 address of the receiving network interface, identified in the previous section.

  • pc_mac: the MAC address of the receiving network interface, identified in the previous section.

  • tagger_ip: a user-chosen IPv4 address for the Time Tagger X’s SFP+ interface. This address must be on the same subnet as pc_ip. A simple choice is to take the PC’s IP address and change the last octet to an unused address in the same subnet, as shown in the example below.

  • MTU: the MTU in bytes (default: 9000 bytes). Must not exceed the MTU configured on the receiving adapter and is limited to a maximum of 9500 bytes.

Replace the values in the example below with the values used in your setup.

from Swabian import TimeTagger

PC_IP     = '169.254.99.217'
PC_MAC    = '24:5E:BE:44:26:AF'
TAGGER_IP = '169.254.99.216'  # user-chosen; must be on the same subnet as PC_IP

tagger = TimeTagger.createTimeTagger()

tagger.xtra_enableStreamInterfaceUDP(pc_ip=PC_IP,
                                     pc_mac=PC_MAC,
                                     tagger_ip=TAGGER_IP,
                                     MTU=9000)

Once the UDP stream is enabled, Time Tagger measurements can be started as usual.

When 10 GbE streaming is no longer required, call xtra_disableStreamInterfaceUDP() to return the time-tag data path to the default USB interface.

tagger.xtra_disableStreamInterfaceUDP()

Performance considerations

At high data rates, each time tag is compressed to 32 bits, enabling a maximum transfer rate of 300 MTags/s over the 10 Gbit/s link. On reception, the software expands each tag to a 128-bit internal representation, producing a sustained in-memory data rate of approximately 4.8 GB/s, a substantial volume that underlines the scale of the data being processed.

The raw time-tag transfer rate given in the hardware comparison table is measured with a minimal custom measurement that accumulates the size of each received tag block without processing individual tags. Under these conditions, the achievable rate reflects the capacity of the network adapter and the host to sustain high-speed data reception.

When measurements are running, every received time tag must be processed by each active measurement object. Running multiple measurements simultaneously means their processing costs add up within each data block, and the combined cost determines the achievable throughput. The Time Tagger measurement backend is highly optimized to handle this stream efficiently, sustaining high throughput across most measurement types even when individual measurements do not reach the maximum transfer rate.

The computational cost per tag varies substantially across measurement types. The throughput figures below were obtained on an AMD Ryzen 9 9950X with an Intel X520 PCIe adapter and should be interpreted as indicative rather than as specifications; actual values depend on hardware, operating system, and measurement parameters.

FileWriter achieves the full hardware transfer rate, independently of the number of channels. Although it does not perform per-tag analysis, it must batch time tags into blocks, compress each block, and write the result to disk. Its throughput is sensitive to thread scheduling: when simultaneous multi-threading (SMT) is enabled, the data-conversion and the file-writing threads may be placed on logical cores sharing the same physical core, reducing throughput substantially down to 200-250 MTags/s. Disabling SMT recovers the full transfer rate.

Lightweight measurements such as Counter and Countrate add minimal overhead and achieve close to the full hardware transfer rate.

Correlation is considerably more expensive. For each incoming tag, the algorithm compares it against all previously received tags on the correlated channel that fall within the correlation time window, defined as binwidth × n_bins. The computational cost per tag therefore scales with the number of historical tags retained in that window. When multiple peaks of the correlation function fall within this window, all inter-peak tags must be retained and examined for each new tag, multiplying the cost accordingly. Even in a single-peak configuration, throughput is typically limited to approximately 240 MTags/s. To maximize throughput, set the time window to the minimum value that covers the region of interest and ensure that at most one peak falls within the window.

FrequencyStability can approach the full transfer rate when the averaging parameter is large (e.g. average = 1000); throughput is slightly dependent on the number of active channels. PhaseNoise performs an FFT-based analysis; throughput improves as more channels share the computation, with a practical upper limit of approximately 200 MTags/s.

HistogramLogBins must search across all bin edges for each detected stop event, a cost that grows with the number of bins and the span of the time axis; despite a multi-threaded implementation, it remains one of the most computationally intensive common measurement types.

The achievable throughput for a given setup depends on a combination of factors: the network adapter and host hardware, the operating system, the number of active channels, the number and type of simultaneous measurements, and their individual parameters. For guidance on a specific configuration, please contact support@swabianinstruments.com.

Previous Next

© Copyright Swabian Instruments.