.. include:: replace.txt

Design
******

The DCF consists of three basic classes:

* *Probe* is a mechanism to instrument and control the output of
  simulation data that is used to monitor interesting events. It
  produces output in the form of one or more |ns3| trace sources.
  Probe objects are hooked up to one or more trace *sinks* (called
  *Collectors*), which process samples on-line and prepare them for
  output.

* *Collector* consumes the data generated by one or more Probe objects. 
  It performs transformations on the data, such as normalization, reduction, and 
  the computation of basic statistics. Collector objects do not produce
  data that is directly output by the ns-3 run; instead, they output data
  downstream to another type of object, called *Aggregator*, which performs
  that function.  Typically, Collectors output their data in the form of
  trace sources as well, allowing collectors to be chained in series.

* *Aggregator* is the end point of the data collected by a network of Probes and Collectors. 
  The main responsibility of the Aggregator is to marshal data and their
  corresponding metadata, into different output 
  formats such as plain text files, spreadsheet files, or databases.

All three of these classes provide the capability to dynamically turn themselves on or off throughout a simulation.

Any standalone |ns3| simulation run that uses the DCF will typically create 
at least one instance of each of the three classes above. 

.. _dcf-overview:

.. figure:: figures/dcf-overview.*
   
   Data Collection Framework overview 

The overall flow of data processing is depicted in :ref:`dcf-overview`.  On
the left side, a running |ns3| simulation is depicted.  In the course
of running the simulation, data is made available by models through
trace sources, or via other means.  The diagram depicts that probes
can be connected to these trace sources to receive data asynchronously,
or probes can poll for data.  Data is then passed to a collector object
that transforms the data.  Finally, an aggregator can be connected
to the outputs of the collector, to generate plots, files, or databases.

.. _dcf-overview-with-aggregation:

.. figure:: figures/dcf-overview-with-aggregation.*
   
   Data Collection Framework aggregation

A variation on the above figure is provided 
in :ref:`dcf-overview-with-aggregation`.
This second figure illustrates that the DCF objects may be chained
together in a manner that downstream objects take inputs from multiple
upstream objects.  The figure conceptually shows that multiple probes
may generate output that is fed into a single collector; as an example,
a collector that outputs a ratio of two counters would typically acquire
each counter data from separate probes.  Multiple collectors can also
feed into a single aggregator, which (as its name implies) may collect
a number of data streams for inclusion into a single plot, file, or
database.

