From 01a218117f55aab16292a84e13ac3f86f44d3686 Mon Sep 17 00:00:00 2001
From: Karim Ahmed <karim.ahmed@xfel.eu>
Date: Thu, 6 Apr 2023 10:43:51 +0200
Subject: [PATCH] fix workflow and remove advance and add back the notebook

---
 docs/css/extra.css                            |   4 +
 docs/development/advanced.md                  |  40 +--
 docs/development/configuration.md             |  57 ++--
 docs/development/contributing_to_gitlab.md    |  36 +++
 docs/development/installation.md              |  18 +-
 docs/development/workflow.md                  | 291 ++++++------------
 docs/gen_ref_pages.py                         |  46 +--
 docs/includes/abbreviations.md                |   6 +
 docs/operation/available_notebooks.md         |  18 +-
 docs/operation/webservice.md                  |   6 +-
 docs/overview.md                              |   6 +-
 ...l-calibrate_cli_process_no_caldbremote.png | Bin 0 -> 20929 bytes
 docs/references/glossary.md                   |   3 -
 mkdocs.yml                                    |  38 ++-
 14 files changed, 245 insertions(+), 324 deletions(-)
 create mode 100644 docs/css/extra.css
 create mode 100644 docs/development/contributing_to_gitlab.md
 create mode 100644 docs/includes/abbreviations.md
 create mode 100644 docs/reference/xfel-calibrate_cli_process_no_caldbremote.png
 delete mode 100644 docs/references/glossary.md

diff --git a/docs/css/extra.css b/docs/css/extra.css
new file mode 100644
index 000000000..804da13d4
--- /dev/null
+++ b/docs/css/extra.css
@@ -0,0 +1,4 @@
+
+code, .rst-content tt, .rst-content code {
+    white-space: pre;
+  }
\ No newline at end of file
diff --git a/docs/development/advanced.md b/docs/development/advanced.md
index 36dec4364..5d59fb7a7 100644
--- a/docs/development/advanced.md
+++ b/docs/development/advanced.md
@@ -1,45 +1,13 @@
 # Advanced Topics
 
-The following tasks should only be carried out by trained staff.
+!!! warning
 
-Request dark characterization
------------------------------
+    The following tasks should only be carried out by trained staff.
 
-The script runs dark characterization notebook with default parameters
-via web service. The data needs to be transferred via the MDC, however,
-the web service will wait for any transfer to be completed. The detector
-is chosen automatically with respect to given instrument
-([\--instrument]). For AGIPD, LPD, Jungfrau runs for the
-three gain stages need to be given ([\--run-high],
-[\--run-med], [\--run-low]). For FastCCD and
-ePIX only a single run needs to be given ([\--run]).
-
-The complete list of parameters is:
-
-    -h, --help            show this help message and exit
-    --proposal PROPOSAL   The proposal number, without leading p, but with
-                          leading zeros
-    --instrument {SPB,MID,FXE,SCS,SQS,HED}
-                          The instrument
-    --cycle CYCLE         The facility cycle
-    --run-high RUN_HIGH   Run number of high gain data as an integer
-    --run-med RUN_MED     Run number of medium gain data as an integer
-    --run-low RUN_LOW     Run number of low gain data as an integer
-    --run RUN             Run number as an integer
-
-The path to data files is defined from script parameters. A typical data
-path, which can be found in the MDC is:
-
-    /gpfs/exfel/exp/MID/201930/p900071/raw
-
-Where [MID] is an instrument name, [201930] is a
-cycle, [900071] is a proposal number.
-
-Extending Correction Notebooks on User Request
-----------------------------------------------
+## Extending Correction Notebooks on User Request
 
 Internally, each automated correction run will trigger
-[calibrate\_nbc.py] to be called anew on the respective
+[calibrate_nbc.py] to be called anew on the respective
 notebook. This means that any changes to save to this notebook will be
 picked up for subsequent runs.
 
diff --git a/docs/development/configuration.md b/docs/development/configuration.md
index 5844f5714..d053eaa8e 100644
--- a/docs/development/configuration.md
+++ b/docs/development/configuration.md
@@ -2,18 +2,16 @@
 
 
 The European XFEL offline calibration is executed using the command line interface.
-By running `xfel-calibrate DETECTOR CALIBRATION --<configurations>` The notebook of the executed detector calibration is submitted on MAXWELL on a SLURM node.
+By running `xfel-calibrate DETECTOR CALIBRATION --<configurations>` The notebook of the executed detector calibration is submitted on MAXWELL into [SLURM][slurm] nodes.
 
-Before going into the details on how to connect a notebook to a specific calibration in xfel-calibrate {>> TODO link} and before explain the machinery pieces on how the notebook is submitted on Maxwell {>> TODO link}:. We are going to mention the main configuration pieces for the offline calibation CLI machinery.
+The offline calibration CLI machinery consists of several configuration pieces that are necessary for the calibration process. These files contain the configuration information for the notebook to process and how to submit it on MAXWELL resources.
 
-The European XFEL Offline Calibration is configured through two python modules at `xfel_calibrate` source directory:
-- `settings.py`: Consist of the tool's environment definitions.
-- `notebooks.py`: The module where every calibration notebook is connected to a detector calibration for the CLI.
+    - `settings.py`: Consist of the tool's environment definitions.
+    - `notebooks.py`: The module where every calibration notebook is connected to a detector calibration for the CLI.
 
 ## Settings
 
-The `settings.py` is a python configuration file, which
-configures the tool's environment.
+The `settings.py` is a python configuration file, which configures the tool's environment.
 
 ```py
     # path into which temporary files from each run are placed
@@ -34,10 +32,12 @@ configures the tool's environment.
 
 ## Notebooks
 
-The `notebooks.py` module configures the notebooks to
-the command line by using two level nest dictionaries. The first dictionary has a key for the detector. The second dictionary consist of keys for the calibration types. The third dictonary consist of the notebook names (notebook, pre-notebook, dep-notebook) and the concurrency parameters. 
+The notebooks.py module is responsible for configuring the connection between the notebooks and the command line. It achieves this by using a nested dictionary structure, with two levels of nesting. The first level contains a key for the detector being used, and the second level contains keys for the calibration types. The third level of the dictionary contains the names of the notebooks (notebook, pre-notebook, and dep-notebook) along with the relevant concurrency parameters. By organizing the configuration in this way, the notebooks.py module is able to provide a clear and flexible way of connecting the notebooks to the command line.
 
-```py
+
+!!! example "Example for `xfel-calibrate/notebooks.py`"
+
+    ```python
     notebooks = {
         "AGIPD": {
             "DARK": {
@@ -65,31 +65,34 @@ the command line by using two level nest dictionaries. The first dictionary has
                                 "default concurrency": [-1],
                                 "cluster cores": 16},
             },
-             ...
-         
+            ...
         }
-     }
-```
+    }
+    ```
 
-As mentioned, the calibration type nested dictionaries like `DARK` or `CORRECT` will consist of links to the executed notebooks and the concurrency configuration for the main calibration notebook.
+As previously explained, the DARK and CORRECT nested dictionaries that correspond to different calibration types contain references to the notebooks that will be executed and specify the concurrency settings for the main calibration notebook.
 
-Below is a definition for every dictionary key:
+- `notebook`: The main calibration notebook and the notebook that will be affected with the concurrency configs.
 
-- notebook: The main calibration notebook and the notebook that will be affected with the concurrency configs.
-- pre_notebooks: These notebooks runs before the main notebook as the usually prepare some essential data for it before it runs over multiple SLURM nodes. e.g. retrieving constant file paths before processing.
-- dep_notebooks: These are the notebooks dependent on the processing of all SLURM nodes running the main notebook. e.g. running summary plots over the processed files.
+- `pre_notebooks`: These notebooks runs before the main notebook as the usually prepare some essential data for it before it runs over multiple [SLURM][slurm] nodes. e.g. retrieving constant file paths before processing.
 
-!!! Note
+- `dep_notebooks`: These are the notebooks dependent on the processing of all [SLURM][slurm] nodes running the main notebook. e.g. running summary plots over the processed files.
+
+!!! tip
 
     It is good practice to name command line enabled notebooks with an `_NBC` suffix as shown in the above example.
 
-- Concurrency:
-  - parameter: The parameter name that the notebook will be parallelizing the processing over. The parameter type is expected to be a list.
-  - use_function: In case there is a need to use a function within the notebook that will affect the SLURM nodes used. A function can be used here and it will be expected in the first notebook cell of the main notebook. e.g. balance_sequences {TODO: GIVE A LINK TO THE FUNCTION. Example??}
+- `concurrency` dictionary:
+
+    - `parameter`: The parameter name that will be used to distribute the processing of the notebook across multiple computing resources. The parameter should be of type list.
+    
+    - `use_function`: In case there is a need to use a function within the notebook that will affect the [SLURM][slurm] nodes used. A function can be used here, and it will be expected in the first notebook cell of the main notebook. e.g. [balance_sequences](../reference/xfel-calibrate/calibrate.md#balance_sequences)
   
-!!! Note
+    !!! Note
+
+        The function only needs to be defined, but not executed within the notebook context itself.
 
-    The function only needs to be defined, but not executed within the notebook context itself.
+  - `default concurrency`: The default concurrency to use if not defined by the user. e.g. `default_concurrency = 16` and `parameter` name modules of type ` lis(int)` leads to running 16 concurrent SLURM jobs with modules values 0 to 15, respectively for each node.  
+  - `cluster cores`: This is for notebooks using ipcluster, only. This is of the number of cores to use.
 
-  - default concurrency: The default concurrency to use if not defined by the user. e.g. `default_concurrency = 16` and `parameter` name modules of type ` lis(int)` leads to running 16 concurrent SLURM jobs with modules values 0 to 15, respectively for each node.  
-  - cluster cores: This is for notebooks using ipcluster, only. This is of the number of cores to use.
+[slurm]: https://slurm.schedmd.com/documentation.html
diff --git a/docs/development/contributing_to_gitlab.md b/docs/development/contributing_to_gitlab.md
new file mode 100644
index 000000000..dae6d9986
--- /dev/null
+++ b/docs/development/contributing_to_gitlab.md
@@ -0,0 +1,36 @@
+# Contributing to GitLab
+
+- Branches prefixes:
+  - Feature: feat/
+  - Fix: fix/  
+  - Documentation: doc/ 
+  - Refactoring: refactor/
+
+- Short well-defined branch name.
+
+- Avoid multiple unrelated changes in one merge request.
+
+- Add common Abbreviations to the merge request name.
+  e.g. `DETECTOR` `CALIBRATION` >> `AGIPD` `DARK`
+
+- Add doc strings to all functions, comments to complicated SW lines, and fixed numbers. It is recommended to use Google style
+
+- WIP Merge requests are not yet finished by the author
+
+
+- Non-WIP MR is finished, and it's adding requested features during the review should be avoided.
+a) if a bug/change was fixed/done by the author during the review, one should point the reviewers to the new change.
+
+- Add a description to your Merge request: Summary, Test, Reviewers, .....
+
+- Connect the Merge request to any external documents and GitLab issues or MRs
+
+-  Add more than one reviewer per a merge request.
+
+- Merge requests can be merged only after receiving 2 approvals or LGTMs, and all discussions are resolved.
+
+- Delete source branch during merging to master.
+
+- Reviewers are free to add comments from importing libraries in alphabetical order to software design (A suggestion is very welcomed)
+
+- Notebooks should be added to branch/master without the cell's output.
\ No newline at end of file
diff --git a/docs/development/installation.md b/docs/development/installation.md
index 9d533db32..e4a4d098e 100644
--- a/docs/development/installation.md
+++ b/docs/development/installation.md
@@ -11,19 +11,18 @@ to do this.
 
 ## Installation using python virtual environment - recommended
 
-[pycalibration] uses the same version of Python as Karabo,
-which in June 2021 updated to use Python 3.8. Currently, the default
+`pycalibration` uses Python 3.8. Currently, the default
 python installation on Maxwell is still Python 3.6.8, so Python 3.8
 needs to be loaded from a different location.
 
-One option is to use the Maxwell Spack installation, running [module
-load maxwell] will activate the test Spack instance from
-DESY, then you can use [module load
-python-3.8.6-gcc-10.2.0-622qtxd] to Python 3.8. Note that
+One option is to use the Maxwell Spack installation, running `module
+load maxwell` will activate the test Spack instance from
+DESY, then you can use `module load
+python-3.8.6-gcc-10.2.0-622qtxd` to Python 3.8. Note that
 this Spack instance is currently a trial phase and may not be stable.
 
-Another option is to use [pyenv], we provide a pyenv
-installation at [/gpfs/exfel/sw/calsoft/.pyenv] which we use
+Another option is to use `pyenv`, we provide a pyenv
+installation at `/gpfs/exfel/sw/calsoft/.pyenv` which we use
 to manage different versions of python. This can be activated with
 `source /gpfs/exfel/sw/calsoft/.pyenv/bin/activate`
 
@@ -62,8 +61,7 @@ python3 -m pip install ipykernel  # If not using a venv add `--user` flag
 python3 -m ipykernel install --user --name pycalibration --display-name "pycalibration"  # If not using a venv pick different name
 ```
 
-This can be useful for Jupyter notebook tools as
-<https://max-jhub.desy.de/hub/login>
+This can be useful for Jupyter notebook tools as [max-jhub documentation](https://rtd.xfel.eu/docs/data-analysis-user-documentation/en/latest/jhub/)([max-jhub](https://max-jhub.desy.de/hub/login))
 
 ## SSH Key Setup for GitLab
 
diff --git a/docs/development/workflow.md b/docs/development/workflow.md
index d1910b5e6..65ddbf1e9 100644
--- a/docs/development/workflow.md
+++ b/docs/development/workflow.md
@@ -1,79 +1,91 @@
 # Development Workflow
 
-Contributing is encouraged if you have calibration notebooks that you would like to add to the pipeline
-or if you have a specific algorithm which is beneficial for the pipeline.
-
-To guide you through this process, this section collects the main points to consider during development.
-These points should help in both the development and review process of the new feature.
+We welcome contributions to the pipeline if you have calibration notebooks or algorithms that you believe could be useful. In order to facilitate the development process, we have provided a section that outlines the key points to consider during the development of new features. This section is designed to assist you throughout the development and review process, and ensure that your contributions are consistent with the pipeline's requirements. We believe that these guidelines will be helpful in creating a seamless development process and result in high-quality contributions that benefit the pipeline. If you have any questions or concerns regarding the development process, please do not hesitate to reach out to us for assistance. We look forward to working with you to enhance the pipeline's capabilities.
 
 
 ## Developing a notebook from scratch
 
-When you are starting a blank notebook from scratch you should first
-answer few questions:
+  Developing a notebook from scratch can be a challenging but rewarding process. Here are some key steps to consider:
+
+  1. Define the purpose
+
+    Start identifying what are you trying to solve and the task you want to perform with your notebook.
+
+      - Does the user need to execute the notebook interactively?
+      - Should it run the same way as the production notebooks? It is recommended that the notebook is executed in the same way as the production notebooks through xfel-calibrate CLI.
+
+    ??? Note "`xfel-calibrate` CLI is essential"
+
+        If `xfel-calibrate` CLI is essential, you need to follow the guidelines in where and how to write the variables in the first notebook cell and how to include it as one of the CLI calibration options to execute.
+
+    - Does the notebook need to generate a report at the end to display its results or can it run without any user interaction?
+
+    ??? Note "A report is needed"
+      
+        If a report is needed you should make sure to provide sufficient guidance and textual details using markdown cells and clear prints within the code. You should also structure the notebook cells into appropriate subsections.
+
+  2. Plan you work flow
+    Map out the steps your notebook will take. From data ingestion to analyzing results and visualization.
 
-* How will the notebook be executed:
+    - What are the required data sources that the notebook needs to access or utilize? For example, GPFS or calibration database.
+    - Can the notebook's internal concurrency be optimized through the use of multiprocessing or is it necessary to employ host-level cluster computing with SLURM to achieve higher performance?
 
-  - Is it executed interactively by the user?
-  - Should it execute the same as the production notebooks through xfel-calibrate CLI.
-  - Is it a headless task or a report is needed at the end to see the results.
+    ??? Note "SLURM concurrency is needed"
 
-* Do you need to run the notebook's processing concurrently?
-  
-  - Is internal concurrency using multiprocessing sufficient, or processing using host level
-    cluster computing via SLURM is essential for higher performance.
+        If SLURM concurrency is needed, you need to identify the variable that the notebook will be replicated based on to split the processing.
 
-If `xfel-calibrate` CLI is essential, you need to follow the guidelines in where and how to
-write the variables in the first notebook cell and how to include it as one of the CLI
-calibration options to execute.
+    - What visualization tools or techniques are necessary to provide an overview of the processing results generated by the notebook? Can you give examples of charts, graphs, or other visual aids that would be useful for understanding the output?
 
-If a report is needed you should make sure to provide sufficient guidance and textual details
-using markdown cells and clear prints within the code. You should also structure the notebook cells
-it into appropriate subsections.
+  3. Write the code and include documentation
 
-If SLURM concurrency is needed, you need to identify the variable that the notebook will be
-replicated based on to split the processing.
+    Begin coding your notebook based on your workflow plan. Use comments to explain code blocks and decisions.
+    - [PEP 8](https://peps.python.org/pep-0008/) styling code is highly recommended. It leads to code that is easier to read, understand, and maintain. Additionally, it is a widely accepted standard in the Python community, and following it make your code more accessible to other developers and improve collaboration.
+    - [Google style docstrings](https://google.github.io/styleguide/pyguide.html) is our recommended way of documenting the code. By providing clear and concise descriptions of your functions and methods, including input and output parameters, potential exceptions, and other important details, you make it easier for other developers to understand the code, and for the used mkdocs documentation to [reference it](SUMMARY.md).
 
-Once you've clarified the above points, you should create a new notebook,
-either in an existing detector folder or into a new folder with the new detector's name.
-Give it a suffix `_NBC` to denote that it is enabled for the tool chain.
+  4. Document the notebook and split into sections.
 
-You should then start writing your code following the guidelines
-at {TODO link to the notebook}
+    Enriching a notebook with documentation is an important step in creating a clear and easy-to-follow guide for others to use:
 
-## Title and Author Information in `markdown` [First Cell]
+    - Use Markdown cells to create titles and section headings: By using Markdown cells, you can create clear and descriptive headings for each section of your notebook. This makes it easier to navigate and understand the content of the notebook, but more importantly these are parsed while creating the PDF report using [sphinx][sphinx].
+    - Add detailed explanations to each section.
+    - Add comments to your code.
 
-Especially for report generation the notebook should have a proper title
-author and version. These should be given in a leading `markdown` cell in
-the form::
+  5. Test and refine
+    Test your notebook thoroughly to identify any issues. Refine your code and documentation as needed to ensure your notebook is accurate, efficient, and easy to use.
 
-    # My Fancy Calculation
+  6. Share and collaborate
 
-    Author](Jane Doe, Version 0.1
+    Share your notebook on [GitLab](https://git.xfel.eu/) to start seeking feedback and begin the reviewing process. [A guide on how to share changes on gitlab](contributing_on_gitlab.md)
 
-    A description of the notebook.
 
-Information in this format allows automatic parsing of author and version.
+## Write notebook to execute using xfel-calibrate
 
+To start developing a new notebook, you either create it in an existing detector directory or create a new directory for it with the new detector's name. Give it a suffix `_NBC` to denote that it is enabled for the tool chain.
 
-## Exposing Parameters to the `xfel-calibrate` Command Line [SECOND CELL]
+You should then start writing your code following these [guidelines](how_to_write_xfel_calibrate_notebook_NBC.ipynb)
+
+- First markdown cell goes for Title, author, and notebook description. This is automatically parsed in the report.
+- First code cell must have all parameter that will be exposed to `xfel-calibrate` CLI
+- Second code cell for importing all needed libraries and methods.
+- The following code cells and markdown cells are for data ingestion, data processing, and data visualization. Markdown cells are very important as it will be parsed as the main source of report text and documentation after the calibration notebook is executed. 
+
+## Exposing parameters to `xfel-calibrate`
 
 The European XFEL Offline Calibration toolkit automatically deduces
 command line arguments from Jupyter notebooks. It does this with an
-extended version of nbparameterise_, originally written by Thomas
+extended version of [nbparameterise][nbparameterise], originally written by Thomas
 Kluyver.
 
 Parameter deduction tries to parse all variables defined in the first
 code cell of a notebook. The following variable types are supported:
 
-* Numbers](INT or FLOAT
+* Numbers(INT or FLOAT)
 * Booleans
 * Strings
-* Lists of any of the above
+* Lists of the above
 
 You should avoid having `import` statements in this cell. Line comments
-can be used to define the help text provided by the command line interface,
-and to signify if lists can be constructed from ranges and if parameters are
+can be used to define the help text provided by the command line interface, and to signify if lists can be constructed from ranges and if parameters are
 required::
 
     in_folder = ""  # directory to read data from, required
@@ -99,11 +111,8 @@ This means that any defaults given in the first cell of the code are ignored
 - `modules` and `sequences` are lists of integers, which from the command line could also be assigned using a range expression, 
 e.g. `5-10,12,13,18-21`, which would translate to `5,6,7,8,9,12,13,18,19,20`.
 
-.. note::
-
-    nbparameterise_ can only parse the mentioned subset of variable types. An expression
-    that evaluates to such a type will not be recognized](e.g. `a = list(range(3))` will
-    not work!
+!!! Warning
+    [nbparameterise][nbparameterise] can only parse the mentioned subset of variable types. An expression that evaluates to such a type will not be recognized. e.g. `a = list(range(3))` will not work!
 
 - `karabo_id` is a string value indicating the detector to be processed.
 - `karabo_da` is a list of strings to indicate the detector's modules to be processed. As `karabo_da` and `modules` 
@@ -113,64 +122,7 @@ e.g. `5-10,12,13,18-21`, which would translate to `5,6,7,8,9,12,13,18,19,20`.
 - `skip-plots` is a boolean for skipping the notebook plots to save time and deliver the report as soon as the data are processed. 
   to set `skip-plots` to False from the command line. `--no-skip-plots` is used.
 
-The code would lead to the following parameters being exposed via the command line::
-
-    % xfel-calibrate AGIPD FF --help
-      usage](xfel-calibrate [-h] [--no-cluster-job] [--prepare-only] [--report-to str] [--not-reproducible] [--skip-report] [--skip-env-freeze] [--concurrency-par str]
-                            [--constants-from str] [--vector-figs] [--slurm-mem int] [--slurm-name str] [--slurm-scheduling int] [--request-time str]
-                            [--slurm-partition str] [--reservation str] --in-folder str --out-folder str [--sequences str [str ...]] [--modules str [str ...]]
-                            [--train-ids str [str ...]] --run int [--karabo-id str] [--karabo-da str [str ...]] [--receiver-template str] [--path-template str]
-                            [--instrument-source-template str] [--index-source-template str] [--ctrl-source-template str] [--karabo-id-control str]
-                            [--slopes-ff-from-files str] [--use-dir-creation-date | --no-use-dir-creation-date] [--cal-db-interface str] [--cal-db-timeout int]
-                            [--creation-date-offset str] [--mem-cells int] [--bias-voltage int] [--acq-rate float] [--gain-setting int] [--gain-mode int]
-                            [--overwrite | --no-overwrite] [--max-pulses int [int ...]] [--mem-cells-db int] [--integration-time int] [--blc-noise-threshold int]
-                            [--cm-dark-fraction float] [--cm-dark-range float [float ...]] [--cm-n-itr int] [--hg-hard-threshold int] [--mg-hard-threshold int]
-                            [--noisy-adc-threshold float] [--ff-gain float] [--photon-energy float] [--only-offset | --no-only-offset] [--rel-gain | --no-rel-gain]
-                            [--xray-gain | --no-xray-gain] [--blc-noise | --no-blc-noise] [--blc-stripes | --no-blc-stripes] [--blc-hmatch | --no-blc-hmatch]
-                            [--match-asics | --no-match-asics] [--adjust-mg-baseline | --no-adjust-mg-baseline] [--zero-nans | --no-zero-nans]
-                            [--zero-orange | --no-zero-orange] [--blc-set-min | --no-blc-set-min] [--corr-asic-diag | --no-corr-asic-diag]
-                            [--force-hg-if-below | --no-force-hg-if-below] [--force-mg-if-below | --no-force-mg-if-below] [--mask-noisy-adc | --no-mask-noisy-adc]
-                            [--common-mode | --no-common-mode] [--melt-snow | --no-melt-snow] [--mask-zero-std | --no-mask-zero-std]
-                            [--low-medium-gap | --no-low-medium-gap] [--round-photons | --no-round-photons] [--use-ppu-device str] [--ppu-train-offset int]
-                            [--use-litframe-finder str] [--litframe-device-id str] [--energy-threshold int] [--use-super-selection str] [--use-xgm-device str]
-                            [--recast-image-data str] [--compress-fields str [str ...]] [--skip-plots | --no-skip-plots] [--cell-id-preview int] [--chunk-size int]
-                            [--n-cores-correct int] [--n-cores-files int] [--sequences-per-node int] [--max-nodes int] [--max-tasks-per-worker int]
-                            DETECTOR TYPE
-
-      # AGIPD Offline Correction #
-      ,
-      Author](European XFEL Detector Group, Version](2.0,
-      ,
-      Offline Calibration for the AGIPD Detector
-
-      positional arguments:
-        DETECTOR              The detector to calibrate](AGIPD, LPD, PNCCD, GENERIC, TUTORIAL, FASTCCD, JUNGFRAU, GOTTHARD2, EPIX100, EPIX10K, DSSC, REMI, TEST, TEST-
-                              RAISES-ERRORS
-        TYPE                  Type of calibration.
-
-      optional arguments:
-        -h, --help            show this help message and exit
-        --sequences str [str ...]
-                              sequences to correct, set to -1 for all, range allowed. Default]([-1]
-        --modules str [str ...]
-                              modules to correct, set to -1 for all, range allowed. Default]([-1]
-        --train-ids str [str ...]
-                              train IDs to correct, set to -1 for all, range allowed. Default]([-1]
-        --karabo-id str       karabo karabo_id. Default](MID_DET_AGIPD1M-1
-        --karabo-da str [str ...]
-                              a list of data aggregators names, Default [-1] for selecting all data aggregators. Default](['-1']
-        --karabo-id-control str
-                              karabo-id for control device. Default](MID_EXP_AGIPD1M1
-      ...
-
-      required arguments:
-        --in-folder str       the folder to read data from, required. Default](None
-        --out-folder str      the folder to output to, required. Default](None
-        --run int             runs to process, required. Default](None
-
-
-The following table contains a list of suggested names for certain parameters, allowing
-to stay consistent amongst all notebooks.
+The table below provides a set of recommended parameter names to ensure consistency across all notebooks.
 
 
 | Parameter name    | To be used for                                                        | Special purpose            |
@@ -188,136 +140,89 @@ to stay consistent amongst all notebooks.
 | `injections`      | developments or testing.                                              |                            |
 
 
+## External Libraries
 
-## Best Coding Practices
-
-In principle there a not restrictions other than that parameters that are exposed to the
-command line need to be defined in the first code cell of the notebook.
-
-However, a few guidelines should be observed to make notebook useful for display as
-reports and usage by others.
+You may use a wide variety of libraries available in Python, but keep in mind that others wanting to run the tool will need to install these requirements as well. Therefore::
 
-### External Libraries
+  - It is generally advisable to avoid using specialized tools or libraries unless there is a compelling reason to do so. Instead, it is often better to use well-established and widely-accepted alternatives that are more likely to be familiar to other developers and easier to install and use. For example, when creating visualizations, it is recommended to use the popular and widely-used library, [matplotlib][matplotlib] for charts, graphs and other visualisation. Similarly, [numpy][numpy] is widely used when performing numerical processing tasks.
 
-You may use a wide variety of libraries available in Python, but keep in mind that others
-wanting to run the tool will need to install these requirements as well. Thus,
+  - When developing software, it is important to keep in mind the runtime and library requirements for your application. In particular, if you are using a library that performs its own parallelism, you will need to ensure that it can either set up this parallelism programmatically or do so automatically. If you need to start your application from the command line, there may be additional challenges to consider. 
 
-* Do not use a specialized tool if an accepted alternative exists. Plots e.g. should usually
-  be created using matplotlib_ and numerical processing should be done in numpy_.
+  - Reading out EXFEL RAW data is encouraged to be done using [extra_data][extra_data]. This tool is designed to facilitate efficient access to data structures stored in HDF5 format. By simplifying the process of accessing RAW or CORRECTED datasets, it allows users to quickly and easily select and filter the specific trains, cells, or pixels of interest. This can greatly reduce the complexity and time required for data analysis, and enables researchers to more effectively explore and analyze large datasets.
 
-* Keep runtime and library requirements in mind. A library doing its own parallelism either
-  needs to programmatically be able to set this up, or automatically do so. If you need to
-  start something from the command line first, things might be tricky as you will likely
-  need to run this via `POpen` commands with appropriate environment variable.
+## Writing out data
 
-* Reading out RAW data should be done using extra_data_. It helps in accessing the HDF5 data
-  structures efficiently. It reduces the complexity of accessing the RAW or CORRECTED datasets,
-  and it provides different methods to select and filter the trains, cells, or pixels of interest.
+If your notebook produces output data, consider writing data out as early as possible, such that it is available as soon as possible. Detailed plotting and inspection can be done later on in the notebook.
 
-### Writing out data
+Also use HDF5 via [h5py][h5py] as your output format. If you correct or calibrate input data, which adheres to the XFEL naming convention, you should maintain the convention in your output data. You should not touch any data that you do not actively work on and should assure that the `INDEX` and identifier entries are synchronized with respect to your output data. E.g. if you remove pulses from a train, the `INDEX/.../count` section should reflect this. [`cal_tools.files`](../reference/src/cal_tools/files.md) module helps you achieve this easily.
 
 
-If your notebook produces output data, consider writing data out as early as possible,
-such that it is available as soon as possible. Detailed plotting and inspection can
-be done later on in the notebook.
+## Plotting
 
-Also use HDF5 via h5py_ as your output format. If you correct or calibrate
-input data, which adheres to the XFEL naming convention, you should maintain the convention
-in your output data. You should not touch any data that you do not actively work on and
-should assure that the `INDEX` and identifier entries are synchronized with respect to
-your output data. E.g. if you remove pulses from a train, the `INDEX/.../count` section
-should reflect this.
+When creating plots, make sure that the plot is either self-explanatory or add markdown comments with adequate description. Do not add "free-floating" plots, always put them into a context. Make sure to label your axes.
 
+Also make sure the plots are readable on an A4-sized PDF page; this is the format the notebook will be rendered to for report outputs. Specifically, this means that figure sizes should not exceed approx 15x15 inches.
 
-### Plotting
+The report will contain 150 dpi PNG images of your plots. If you need higher quality output of individual plot files you should save these separately, e.g. via `fig.savefig(...)` yourself.
 
-When creating plots, make sure that the plot is either self-explanatory or add markdown
-comments with adequate description. Do not add "free-floating" plots, always put them into
-a context. Make sure to label your axes.
+## xfel-calibrate execution
 
-Also make sure the plots are readable on an A4-sized PDF page; this is the format the notebook
-will be rendered to for report outputs. Specifically, this means that figure sizes should not
-exceed approx 15x15 inches.
-
-The report will contain 150 dpi png images of your plots. If you need higher quality output
-of individual plot files you should save these separately, e.g. via `fig.savefig(...)` yourself.
-
-## Running a calibration
-
-It utilizes tools such as
-[nbconvert](https://github.com/jupyter/nbconvert) and
-[nbparameterise](https://github.com/takluyver/nbparameterise) to expose
-[Jupyter](http://jupyter.org/) notebooks to a command line interface. In
-the process reports are generated from these notebooks.
+The package utilizes tools such as [nbconvert](https://github.com/jupyter/nbconvert) and
+[nbparameterise][nbparameterise] to expose [Jupyter](http://jupyter.org/) notebooks to a command line interface. In the process reports are generated from these notebooks.
 
 The general interface is:
 
     % xfel-calibrate DETECTOR TYPE
 
-where [DETECTOR] and [TYPE] specify the task to
-be performed.
-
-Additionally, it leverages the DESY/XFEL Maxwell cluster to run these
-jobs in parallel via [SLURM](https://slurm.schedmd.com).
+where `DETECTOR` and `TYPE` specify the task to be performed.
 
-Here is a list of `available_notebooks`.
-See the `advanced_topics` if you are
-looking for details on how to use as detector group staff.
+Additionally, it leverages the DESY/XFEL Maxwell cluster to run these jobs in parallel via [SLURM][slurm].
 
-If you would like to integrate additional notebooks please see the
-`development_workflow`.
+Here is a list of [available_notebooks](../operation/available_notebooks.md).
 
-## Interaction with Calibration Database
+## Interaction with the calibration database
 
-During development, it is advised to work with local constant files first before injecting
-any calibration constants to the production database. After the notebook's algorithms arguments
-matured one can switch over to the test database and then production database.
+During development, it is advised to work with local constant files first before injecting any calibration constants to the production database. After the notebook's algorithms arguments matured one can switch over to the test database and then production database.
 The reason for this is to avoid injecting wrong constants that can affect production calibration.
 And to avoid unnecessary intervention to disable wrong or unused injected calibration constants.
 
-Additionally, the calibration database is limited to XFEL networks, so independent development improves
-the workflow.
+Additionally, the [calibration database](../operation/calibration_database.md) is limited to XFEL networks, so independent development improves the workflow.
 
 
 ## Testing
 
-The most important test is that your notebook completes flawlessly outside any special
-tool chain feature. After all, the tool chain will only replace parameters, and then
-launch a concurrent job and generate a report out of notebook. If it fails to run in the
-normal Jupyter notebook environment, it will certainly fail in the tool chain environment.
+The most important test is that your notebook completes flawlessly outside any special tool chain feature. After all, the tool chain will only replace parameters, and then launch a concurrent job and generate a report out of notebook. If it fails to run in the normal Jupyter notebook environment, it will certainly fail in the tool chain environment.
 
-Once you are satisfied with your current state of initial development, you can add it
-to the list of notebooks as mentioned in the :ref:`configuration` section.
+Once you are satisfied with your current state of initial development, you can add it to the list of notebooks as mentioned in the [configuration](configuration.md#notebooks) section.
 
 Any changes you now make in the notebook will be automatically propagated to the command line.
 Specifically, you should verify that all arguments are parsed correctly, e.g. by calling::
 
-    xfel-calibrate DETECTOR NOTEBOOK_TYPE --help
+```bash
+  xfel-calibrate DETECTOR NOTEBOOK_TYPE --help
+```
 
-From then on, check include if parallel slurm jobs are executed correctly and if a report
-is generated at the end.
+From then on, check include if parallel [SLURM][slurm] jobs are executed correctly and if a report is generated at the end.
 
-Finally, you should verify that the report contains the information you'd like to convey and
-is intelligible to people other than you.
+Finally, you should verify that the report contains the information you'd like to convey and is intelligible to people other than you.
 
 ???+ note
 
-    You can run the `xfel-calibrate` command without starting a SLURM cluster job, giving
-    you direct access to console output, by adding the `--no-cluster-job` option.
+    You can run the `xfel-calibrate` command without starting a [SLURM][slurm] cluster job, giving you direct access to console output, by adding the `--no-cluster-job` option.
 
 ## Documenting
 
-Most documentation should be done in the notebook itself. Any notebooks specified in the
-`notebook.py` file will automatically show up in the [Available Notebooks](../operation/available_notebooks.md) section of this
-documentation.
+Most documentation should be done in the notebook itself. Any notebooks specified in the `notebook.py` file will automatically show up in the [Available Notebooks](../operation/available_notebooks.md) section of this documentation.
 
 
-- [nbparameterise](https://github.com/takluyver/nbparameterise)
-- [ipcluster](https://ipyparallel.readthedocs.io/en/latest/)
-- [matplotlib](https://matplotlib.org/)
-- [numpy](http://www.numpy.org/)
-- [h5py](https://www.h5py.org/)
-- [iCalibrationDB](https://git.xfel.eu/detectors/cal_db_interactive)
-- [extra_data](https://extra-data.readthedocs.io/en/latest/)
-- [extra-geom](https://extra-geom.readthedocs.io/en/latest/)
-- [pasha](https://github.com/European-XFEL/pasha)
\ No newline at end of file
+[nbparameterise]: https://github.com/takluyver/nbparameterise
+[ipcluster]: https://ipyparallel.readthedocs.io/en/latest/
+[matplotlib]: https://matplotlib.org/
+[numpy]: http://www.numpy.org/
+[h5py]: https://www.h5py.org/
+[iCalibrationDB]: https://git.xfel.eu/detectors/cal_db_interactive
+[extra_data]: https://extra-data.readthedocs.io/en/latest/
+[extra-geom]: https://extra-geom.readthedocs.io/en/latest/
+[pasha]: https://github.com/European-XFEL/pasha
+[slurm]: https://slurm.schedmd.com/documentation.html
+[sphinx]: https://www.sphinx-doc.org/en/master/
\ No newline at end of file
diff --git a/docs/gen_ref_pages.py b/docs/gen_ref_pages.py
index 43677251e..4a7520d6f 100644
--- a/docs/gen_ref_pages.py
+++ b/docs/gen_ref_pages.py
@@ -6,38 +6,38 @@ from pathlib import Path
 import mkdocs_gen_files
 
 nav = mkdocs_gen_files.Nav()
+for directory in ["src"]:
+    for path in sorted(Path(directory).rglob("*.py")):
 
-for path in sorted(Path("src").rglob("*.py")):
+        module_path = path.relative_to(directory).with_suffix("")
 
-    module_path = path.relative_to("src").with_suffix("")
+        doc_path = path.relative_to(directory).with_suffix(".md")
 
-    doc_path = path.relative_to("src").with_suffix(".md")
+        full_doc_path = Path("reference", doc_path)
 
-    full_doc_path = Path("reference", doc_path)
+        parts = list(module_path.parts)
 
-    parts = list(module_path.parts)
-   
-    if parts[-1] == "__init__":
-        parts = parts[:-1]
-        print("init parts:", parts)
-    if parts[-1] in ["notebooks", "settings", "restful_config", "__main__"]:
-        continue
+        if parts[-1] in ["notebooks", "settings", "restful_config",
+                         "__main__", "__init__", "listen_kafka", "sqlite_view", "manual_launch"
+                         "messages", ]:
+            continue
 
-    nav[parts] = doc_path.as_posix() 
+        nav[parts] = doc_path.as_posix() 
 
-    with mkdocs_gen_files.open(full_doc_path, "w") as fd:
+        with mkdocs_gen_files.open(full_doc_path, "w") as fd:
 
-        identifier = ".".join(parts)
-        if "calcat_interface" == full_doc_path.stem:
-            print(
-"""
-??? Note "This module help in skipping calibrationDBRemote"
-    ![Calibration DB Remote avoided](xfel-calibrate_cli_process_no_caldbremote.png)
-""",
-                file=fd)
-        print("::: " + identifier, file=fd)
+            identifier = ".".join(parts)
+            if "calcat_interface" == full_doc_path.stem:
+                print(  # adding an note and image for calcat_interface.py
+    """
+    ??? Note "This module help in skipping calibrationDBRemote"
+        ![Calibration DB Remote avoided](xfel-calibrate_cli_process_no_caldbremote.png)
+    """,
+                    file=fd)
+            print("::: " + identifier, file=fd)
 
-    mkdocs_gen_files.set_edit_path(full_doc_path, path)
+        mkdocs_gen_files.set_edit_path(full_doc_path, path)
 
 with mkdocs_gen_files.open(f"reference/SUMMARY.md", "w") as nav_file:
+    print(nav.build_literate_nav())
     nav_file.writelines(nav.build_literate_nav())
diff --git a/docs/includes/abbreviations.md b/docs/includes/abbreviations.md
new file mode 100644
index 000000000..1407a15ef
--- /dev/null
+++ b/docs/includes/abbreviations.md
@@ -0,0 +1,6 @@
+*[PDU]: Physical Detector Unit is the name given for the hardware module.
+*[CC]: Calibration Constant
+*[CCV]: Calibration Constant Version
+*[CLI]: Command Line Interface
+*[myMDC]: Metadata Catalog
+*[CALCAT]: Calibration Catalog is the web interface for the calibration database.
\ No newline at end of file
diff --git a/docs/operation/available_notebooks.md b/docs/operation/available_notebooks.md
index 805f925b5..09b42de23 100644
--- a/docs/operation/available_notebooks.md
+++ b/docs/operation/available_notebooks.md
@@ -33,10 +33,7 @@ The evaluated calibration constants are stored locally and injected in the calib
 
 ### Gain Characterization
 
-
-!!! warning
-
-    TODO: Add description for this notebook
+This notebook is used to produce AGIPD Flat-Field constants.
 
 ### Histogramming of AGIPD FF data
 
@@ -75,8 +72,6 @@ The resulting slopes are then fitted with a linear function and a combination of
 
 Offline Correction for DSSC Detector
 
-
-
 ### DSSC Characterize Dark Images
 
 The following code analyzes a set of dark images taken with the DSSC detector to deduce detector offsets and noise. Data for the detector is presented in one run and don’t acquire multiple gain stages.
@@ -147,20 +142,13 @@ detector, corrects the noise for Common Mode (CM), and defines bad pixels relati
 
 ### Constants from DB to HDF5
 
-Currently available instances are LPD1M1 and AGIPD1M1
-
-### Statistical analysis of calibration factors
-
-Plot calibration constants retrieved from the cal. DB.
-
-To be visualized, calibration constants are averaged per group of pixels. Plots shows calibration constant over time for each constant.
-Values shown in plots are saved in h5 files.
+Currently, available instances are LPD1M1 and AGIPD1M1
 
 ### Statistical analysis of calibration factors
 
 Plot calibration constants retrieved from the cal. DB.
 
-To be visualized, calibration constants are averaged per group of pixels. Plots shows calibration constant over time for each constant.
+To be visualized, calibration constants are averaged per group of pixels. Plot shows calibration constant over time for each constant.
 Values shown in plots are saved in h5 files.
 
 ## GOTTHARD2
diff --git a/docs/operation/webservice.md b/docs/operation/webservice.md
index de45221b0..4cf1efb7c 100644
--- a/docs/operation/webservice.md
+++ b/docs/operation/webservice.md
@@ -1 +1,5 @@
-# Calibration Webservice
\ No newline at end of file
+# Calibration Webservice
+
+The offline calibration webservice interacts is triggered through the myMDC,
+such that migration of data to the offline cluster automatically triggers
+calibration jobs on relevant files.
diff --git a/docs/overview.md b/docs/overview.md
index 162fb2dd1..319fa4296 100644
--- a/docs/overview.md
+++ b/docs/overview.md
@@ -3,7 +3,9 @@
 TODO: HERE I PLAN TO GIVE DIAGRAMS OVER THE OFFLINE CALIBRATION SERVICES AND PIECES
 
 
-> European XFEL aims to provide facility users with a fully corrected and calibrated dataset as the primary data product. - SRN 27.4, 35 (2014)
+!!! quote
+
+    European XFEL aims to provide facility users with a fully corrected and calibrated dataset as the primary data product. - SRN 27.4, 35 (2014)
 
 ![image](./static/xfel_calibrate_diagrams/overview_all_services.png)
 
@@ -14,7 +16,7 @@ pyCalibration is the main pipeline package for offline calibration at European X
 The pieces we have are: 
 
 - [Calibration Database](operation/calibration_database.md) The calibration database (CALCAT)
-- [Metadata Catalog](operation/myMDC.md) myMDC for requesting run corrects and dark constants generation.
+- [Metadata Catalog](operation/myMDC.md) myMDC for requesting run corrects and dark constants' generation.
 - [Calibration Notebooks](operation/available_notebooks.md) All available detector calibration notebooks
 - [xfel-calibrate](development/configuration.md) The machinery for running calibration notebooks using SLURM
 - [Calibration webservice](operation/webservice) The main entry for offline calibration pipeline in production
diff --git a/docs/reference/xfel-calibrate_cli_process_no_caldbremote.png b/docs/reference/xfel-calibrate_cli_process_no_caldbremote.png
new file mode 100644
index 0000000000000000000000000000000000000000..006b028d654dce0fd96ed33459250eb4d4dc94d6
GIT binary patch
literal 20929
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

literal 0
HcmV?d00001

diff --git a/docs/references/glossary.md b/docs/references/glossary.md
deleted file mode 100644
index 20275d20c..000000000
--- a/docs/references/glossary.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Glossary
-
-- PDU: Physical Detector Units - The detector module hardware name given by detector expert or manufacturer.
diff --git a/mkdocs.yml b/mkdocs.yml
index 3f6bc3f2a..f37bc60ed 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -4,14 +4,19 @@ theme:
   name: "material"
   features:
     - navigation.tabs
+    - navigation.tabs.sticky
     - navigation.sections
     - navigation.top
+    - navigation.instant
+    - navigation.tracking
     - search.suggest
     - search.highlight
     - content.tabs.link
     - content.code.annotation
     - content.code.copy
     - navigation.indexes
+    - content.tooltips
+    - toc.follow
   language: en
   palette:
     - scheme: light
@@ -24,14 +29,20 @@ theme:
         name: Switch to light mode
 
 markdown_extensions:
+  - abbr
   - pymdownx.highlight:
+      linenums_style: pymdownx-inline
       anchor_linenums: true
+  - pymdownx.superfences      
   - pymdownx.inlinehilite
-  - pymdownx.snippets
+  - pymdownx.snippets:
+      auto_append:
+        - docs/includes/abbreviations.md
   - pymdownx.tasklist
   - pymdownx.arithmatex:
       generic: true
   - pymdownx.tabbed:
+      alternate_style: true 
   - pymdownx.details
   - pymdownx.mark
   - pymdownx.emoji:
@@ -47,19 +58,11 @@ markdown_extensions:
   - codehilite
 
 extra_css:
+  - css/extra.css
   - css/custom.css
 
 plugins:
   - glightbox
-  - mkdocstrings:
-      handlers:
-        python:
-          import:
-          - https://docs.python-requests.org/en/master/objects.inv
-          paths: [src]
-          syntax: sphinx
-          docstring_section_style: list
-          docstring_style: sphinx
   - search
   - autorefs
   - mkdocs-jupyter:
@@ -70,15 +73,24 @@ plugins:
         - docs/gen_ref_pages.py
   - literate-nav:
       nav_file: SUMMARY.md
+  - section-index
+  - mkdocstrings:
+      handlers:
+        python:
+          import:
+          - https://docs.python-requests.org/en/master/objects.inv
+          paths: [src, webservice]
+          docstring_style: sphinx
+          docstring_section_style: list
 repo_url: https://git.xfel.eu/calibration/pycalibration
 
 
 nav:
     - index.md
     - Operation:
-      - Available Calibration notebooks: operation/available_notebooks.md
       - CALCAT: operation/calibration_database.md
       - myMDC: operation/myMDC.md
+      - Available Calibration notebooks: operation/available_notebooks.md
       - Calibration webservice: operation/webservice.md
       - Troubleshooting:
         - Correcting detector RAW data: operation/troubleshooting_correction.md
@@ -88,12 +100,10 @@ nav:
       - Workflow: development/workflow.md
       - How to write a notebook: development/how_to_write_xfel_calibrate_notebook_NBC.ipynb
       - Configuration: development/configuration.md
-      - Advanced topics: development/advanced.md
-    - Code Reference: reference/SUMMARY.md
+    - Code Reference: reference/
     - Reference:
       - FAQ: references/faq.md
       - Changelog: references/changelog.md
-      - Glossary: references/glossary.md
 
 copyright: |
   &copy; 2018 <a href="https://www.xfel.eu/"  target="_blank" rel="noopener">European XFEL</a>
\ No newline at end of file
-- 
GitLab