=================
Software Overview
=================
At the heart of the *Time Tagger* software is a multi-threaded processing engine
that receives the time tag stream and feeds it to all running
measurements. The measurements and the virtual channels are parallel processing units that analyze the time tag stream
each in their own way. For example, a :ref:`api.Countrate` measurement analyzes all time
tags from one or more specific channels and calculates the average number of tags received per
second. A :ref:`api.Correlation` measurement computes the cross-correlation between two
channels, typically by sorting the time tags in histograms, and so on. Such a
powerful architecture enables you to perform any conceivable digital time-domain
measurement in real time. You have several choices on how to use this architecture.

Graphical user interface
========================
The easiest way of using the *Time Tagger* is the graphical user interface
*Time Tagger Lab*, available on Windows only.
It allows you to interact with the hardware, create measurements, get live plots,
and save and load the acquired data.
Refer to the :doc:`/gettingStarted/GettingStartedTTLab` section to get started.

Precompiled libraries and high-level language bindings
======================================================
The Time Tagger library provides a comprehensive set of ready-to-use measurement classes,
covering event counting (e.g. :ref:`api.Countrate`), time-difference histograms (e.g. :ref:`api.Correlation`),
phase and frequency analyses (e.g. :ref:`api.FrequencyStability`), time-tag streaming (e.g. :ref:`api-FileWriter`).
These measurements cover the most common applications of our devices.
The library ships as precompiled binaries with bindings for
Python, MATLAB, LabVIEW, and .NET, so you can start a complex measurement
from the language of your choice with a few lines of code.
Refer to :doc:`/gettingStarted/index` and :doc:`/api/index` for further details.

C++ API
=======
The underlying software architecture is provided by a C++ |API| that implements
two classes: one class that represents the Time Tagger and one class that
represents a base measurement. On top of that, the C++ |API| also provides
all predefined measurements that are made available by the
high-level language bindings. To use this |API|, you have to
write and compile a C++ program.