From bfc9f5a926e9924f4ff015d906dbca03739233cc Mon Sep 17 00:00:00 2001 From: lkrombeenc <58769033+lkrombeenc@users.noreply.github.com> Date: Tue, 23 Jun 2020 13:34:13 +0200 Subject: [PATCH] Design (#250) Add design document --- doc/Doxyfile.in | 2 +- doc/design.md | 95 +++++++++++++++++++++++++++++++++++++++++ doc/images/diagram.png | Bin 0 -> 6671 bytes doc/images/flow.png | Bin 0 -> 18707 bytes 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 doc/design.md create mode 100644 doc/images/diagram.png create mode 100644 doc/images/flow.png diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index 3347f7f82..4e4a309c4 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -842,7 +842,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = +IMAGE_PATH = @CMAKE_CURRENT_LIST_DIR@/images # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program diff --git a/doc/design.md b/doc/design.md new file mode 100644 index 000000000..4a944945a --- /dev/null +++ b/doc/design.md @@ -0,0 +1,95 @@ +# Design + +## DPPP: a framework for streaming radio interferometric pipelines +DPPP (DP3, short for Default PreProcessing Pipeline) is a framework +for efficiently processing time-ordered visibilities, +e.g. freshly correlated data. It was developed for the LOFAR +telescope, and is used for preprocessing its imaging pipelines. +DPPP user documentation is found at the [LOFAR Wiki](https://www.astron.nl/lofarwiki/doku.php?id=public:user_software:documentation:ndppp). + +For avoiding high memory usage, DPPP reads the input data in chunks instead of reading all input data at once. +For each chunk, it calls all the steps to do the processing on this data. The last step will then +write out the processed data. + + + +DPPP runs a pipeline in clearly defined stages, to make spotting +errors as easy as possible. +* **Initialise** This connects all the processing steps together. This step is data independent. +* **Tune At** This stage reads metadata, such as the number of channels, and adjusts the steps accordingly. +* **Process** This stage pipes the data through the steps, one buffer at a time. The steps define the buffer size. + +## Measurement Set standard +DPPP adheres to the Measurement Set (MS) standard, which is the common format for radio telescope data. DPPP can +also create a new MS. When an appropriate input step is in +place (e.g. a streaming connection to a correlator), MSs can +be written from scratch. + +DPPP supports only regularly shaped MSs with the following restrictions: +- Every time slot has the same number of antennas. +- Time slots have the same duration and are equally spaced (missing time slots are allowed). +- Every integration has the same number of correlations and channels. +- Only one spectral window can be handled. + +## Built-in steps +DPPP contains built-in steps that are linked together and process one time slot at a time. This way, DPPP is therefore suitable for large measurement sets. +All the built-in steps derive from the [DPStep](@ref DP3::DPPP::DPStep) class. +Its inheritance diagram shows all step types, including the built-in steps. + +[DPRun](@ref DP3::DPPP::DPRun) initialises and orchestrates the configured steps. +It begins with setting the required info for the first step and its next step(s). +Next, each buffer (containing a single time slot) is processed by the first step. +When processed, it invokes the process function of the next step. +Once all buffers are processed, DPPP calls the `finish` function of the first step and subsequent steps. +This function flushes all remaining data from the steps to their output channel(s). +Finally, DPPP calls the `addToMS` function on each step for updating the metadata of the MS. +The figure below gives a graphical overview of the [DPStep](@ref DP3::DPPP::DPStep) flow. + + + +### Calibration +The DPPP step [GainCal](@ref DP3::DPPP::GainCal) implements many variants of direction +independent calibration. It uses [StefCal](https://ieeexplore.ieee.org/abstract/document/6930038), with many +extra features, such as fitting a function over frequency. +Also full-Jones calibration is supported. Results are written +to [ParmDB](https://www.astron.nl/lofarwiki/doku.php?id=public:user_software:documentation:makesourcedb); [H5Parm](https://github.com/revoltek/losoto/wiki/H5parm-specifications) support is in development. + +### AOFlagger +DPPP contains a DPStep class which is a shallow wrapper that calls AOFlagger. +This makes it possible to flag with AOFlagger and immediately +afterwards average the data, without writing the +data to disk in between. + +### User-defined steps +Apart from the built-in steps, also custom steps can +be defined, following the existing interface description. +Recompiling DPPP is not necessary: steps are found as shared +libraries. + +A special custom step is the [Python step](@ref DP3::DPPP::PythonStep), which uses a step defined in a Python module. +This makes it very easy to implement custom steps even for non C++-wizards. An +example Python step is bundled with the LOFAR software. + +## Example reduction +Arguments are given to DPPP as a 'parameter set', a simple +key-value format. Optionally, parameters can be overridden +on the command line. The example also shows that you can +use the out step to store intermediate results. + + msin = [bla.MS, bla2.MS] + steps = [aoflag, avg1, out1, cal, out2, avg2 ] + avg1.type = average + avg1.timestep = 4 # Average down every 4 timeslots + out1.type = out + out1.name = myfile_averaged.MS + cal.type = calibrate + cal.skymodel = 3C196.skymodel + cal.applysolution = true + cal.parmdb = instrument.parmdb + out2.type = out + out2.name = . + out2.datacolumn = CORRECTED_DATA + avg2.type = average + avg2.timestep = 2 # average down some more + avg2.freqstep = 16 + msout = bla_combined.MS diff --git a/doc/images/diagram.png b/doc/images/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..3a94abe45eedd3bf8d54bd39c4ac35c684f9bdad GIT binary patch literal 6671 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 literal 0 HcmV?d00001 diff --git a/doc/images/flow.png b/doc/images/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..754ce883a263a6a6257e4fd25a3dffdc8f929946 GIT binary patch literal 18707 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 literal 0 HcmV?d00001 -- GitLab