view Sphinx/source/plugins/ohif.rst @ 1010:62ac15a772f8

extra main dicom tags
author Alain Mazy <am@osimis.io>
date Thu, 04 Jan 2024 10:56:13 +0100
parents 05b106383b2a
children 60b0b7ea409b
line wrap: on
line source

.. _ohif:


OHIF plugin
===========

.. contents::

This **official** plugin by the `ICTEAM institute of UCLouvain
<https://uclouvain.be/en/research-institutes/icteam>`__ extends
Orthanc with the `OHIF <https://ohif.org/>`__ extensible Web imaging
platform.

The plugin greatly simplifies the deployment of OHIF, as it does not
necessitate the setup of any reverse proxy.

If you face difficulties in using OHIF, please get in touch with the
`OHIF community <https://ohif.org/collaborate>`__ in the first place.
Indeed, the OHIF and Orthanc communities are entirely distinct.


Usage
-----

This plugin adds a dedicated button to Orthanc Explorer, which
provides an easy, fast access to the OHIF viewers (click on the image
to view a demo video):

.. image:: ../images/OHIF.png
           :align: center
           :width: 800
           :target: https://www.youtube.com/watch?v=-lzddzq9iT4

|


Compilation
-----------

.. highlight:: bash

Official releases can be `downloaded from the Orthanc homepage
<https://orthanc.uclouvain.be/downloads/sources/orthanc-ohif/index.html>`__. As
an alternative, the `repository containing the source code
<https://orthanc.uclouvain.be/hg/orthanc-ohif/>`__ can be accessed
using Mercurial.

The procedure to compile this plugin is similar of that for the
:ref:`core of Orthanc <binaries>`. The following commands should work
on most GNU/Linux distributions, provided Docker is installed::

  $ mkdir Build
  $ cd Build
  $ ../Resources/CreateOHIFDist.sh
  $ cmake .. -DSTATIC_BUILD=ON -DCMAKE_BUILD_TYPE=Release
  $ make

The compilation will produce a shared library ``libOrthancOHIF.so``
that contains the OHIF plugin for Orthanc.

Pre-compiled Linux Standard Base (LSB) binaries `are available for
download <https://orthanc.uclouvain.be/downloads/linux-standard-base/orthanc-ohif/index.html>`__.

Pre-compiled binaries for `Microsoft Windows <https://orthanc.uclouvain.be/downloads/windows-32/orthanc-ohif/index.html>`__
and `macOS <https://orthanc.uclouvain.be/downloads/macos/orthanc-ohif/index.html>` are available as well.

Furthermore, the :ref:`Docker images <docker>`
``jodogne/orthanc-plugins`` and ``osimis/orthanc`` also contain the
plugin. Debian and Ubuntu packages can be found in the
:ref:`standalone repository <binaries>`
``https://debian.orthanc-labs.com/``.


Configuration
-------------

.. highlight:: json

Here is a minimal sample :ref:`configuration file <configuration>` to
use this plugin::

  {
    "Plugins" : [
      "/home/user/orthanc-ohif/Build/libOrthancOHIF.so"
    ]
  }

Orthanc must of course be restarted after the modification of its
configuration file.


Using DICOMweb
^^^^^^^^^^^^^^

.. highlight:: json

By default, the plugin uses the `DICOM JSON data source
<https://v3-docs.ohif.org/configuration/datasources/dicom-json/>`__ of
OHIF. This data source is optimized to provide the fastest access to
the DICOM images, while requiring no additional plugin. However, in
order to deliver fast access, the OHIF plugin will cache additional
information about each DICOM instance as :ref:`metadata <metadata>` in
the Orthanc database, which results in a larger size of the Orthanc
database (an additional 1KB is roughly needed per instance).

As an alternative, it is possible to enable the `DICOMweb data source
<https://v3-docs.ohif.org/configuration/dataSources/dicom-web>`__. In
this case, the :ref:`DICOMweb plugin of Orthanc <dicomweb>` must also
be loaded. It can also be useful to load the :ref:`GDCM plugin <gdcm>`
if the DICOM images are encoded using a JPEG2k compressed transfer
syntax.

The advantages of using DICOMweb over the default DICOM JSON are:

* More standard-compliant.

* The OHIF study list is accessible, notably as a button on the
  welcome screen of Orthanc Explorer. The study list is not available
  if using the DICOM JSON data source.

* No additional space is used in the Orthanc database.
  
Here is a minimal configuration file to use DICOMweb::

  {
    "Plugins" : [
      "/home/user/orthanc-ohif/Build/libOrthancOHIF.so",
      "/home/user/orthanc-dicomweb/Build/libOrthancDicomWeb.so"
    ],
    "OHIF" : {
      "DataSource" : "dicom-web"
    }
  }
  

User configuration of OHIF
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. highlight:: json

OHIF comes with a number of `configuration options
<https://v3-docs.ohif.org/configuration/configurationfiles/#configuration-options>`__
that can be fine-tuned by the user. User settings can be injected
using the ``UserConfiguration`` option as follows::

  {
    "Plugins" : [
      "/home/user/orthanc-ohif/Build/libOrthancOHIF.so"
    ],
    "OHIF" : {
      "UserConfiguration" : "ohif.js"
    }
  }

.. highlight:: javascript

A minimal ``ohif.js`` would be::

  window.config = {
    extensions: [],
    modes: []
  }

Note that the following configuration options will be overridden by
the OHIF plugin to properly configure the data source and the
integration with the Orthanc Web server:

* ``window.config.dataSources``
* ``window.config.defaultDataSourceName``
* ``window.config.routerBasename``
* ``window.config.showStudyList`` (set to ``false`` if using the DICOM
  JSON data source)
  

.. _ohif-router-basename:

Router basename
^^^^^^^^^^^^^^^

.. highlight:: json

If Orthanc is not branched at the root of a Web server thanks of the
presence of a reverse proxy, the configuration option
``RouterBasename`` must be adapted.

For instance, if Orthanc is running at address
``https://host.com/imaging/demo/orthanc/``, the following
configuration file must be used for OHIF to work::

  {
    "Plugins" : [
      "/home/user/orthanc-ohif/Build/libOrthancOHIF.so"
    ],
    "OHIF" : {
      "RouterBasename" : "/imaging/demo/orthanc/ohif/"
    }
  }

The default value of ``RouterBasename`` is ``/ohif/``.


.. _ohif-preloading:

Preloading
^^^^^^^^^^

.. highlight:: json

If using the DICOM JSON data source, whenever a new DICOM instance is
received by Orthanc, the OHIF plugin will compute a summary of the
DICOM tags of interest to OHIF, and will store it as :ref:`metadata
<metadata>` in the Orthanc database. This process has the advantage of
speeding up even the first opening of the DICOM study by OHIF, which
probably corresponds to the expectations of most radiologists.

However, if your Orthanc deployment is focused on speed, this
preloading might be undesirable, as it slows down the ingestion of new
DICOM instances by Orthanc. Furthermore, if your Orthanc server will
contain a large number of DICOM studies that will never be displayed
using OHIF, this can result in a waste of space in the Orthanc
database because of the metadata that will be preloaded, but that will
never be read.

It is consequently possible to turn off the automated preloading
of metadata using the following configuration::

  {
    "Plugins" : [
      "/home/user/orthanc-ohif/Build/libOrthancOHIF.so"
    ],
    "OHIF" : {
      "DataSource" : "dicom-json",
      "Preload" : false
    }
  }

If the ``Preload`` option is set to ``false``, the first display of a
DICOM study can take several seconds because of the computation of the
metadata, but subsequent displays will run much faster.

Note that preloading is only applied to the newly received instances:
The DICOM instances that were stored in the Orthanc server before the
installation of the OHIF plugin will only benefit from the
optimization starting with their second display using OHIF.


.. _ohif-https:

HTTPS encryption
^^^^^^^^^^^^^^^^

.. highlight:: bash

In order to use the :ref:`built-in HTTPS encryption <https-builtin>`
of Orthanc together with the OHIF plugin, first generate a proper
X.509 certificate for the ``localhost``::

  $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
            -subj "/C=BE/CN=localhost" -keyout /tmp/private.key -out /tmp/certificate.crt
  $ cat /tmp/private.key /tmp/certificate.crt > /tmp/certificate.pem


.. highlight:: json

Secondly, create the following configuration file::

  {
    "Plugins" : [
      "/home/user/orthanc-ohif/Build/libOrthancOHIF.so"
    ],
    "SslEnabled" : true,
    "SslCertificate" : "/tmp/certificate.pem",
    "OHIF" : {
      "DataSource" : "dicom-json",
      "RouterBasename" : "/ohif/"
    }
  }

If more complex scenarios with reverse proxies are involved, make sure
to properly setup :ref:`CORS in your reverse proxy <nginx-cors>` and
to :ref:`adapt the router basename <ohif-router-basename>`. If you
face difficulties, while the simple setup with the built-in HTTPS
encryption described above works, your issue is related to OHIF, so
please get in touch with the `OHIF community
<https://ohif.org/collaborate>`__.


For developers
--------------

Extensions to the REST API
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. highlight:: bash

The content of the `DICOM JSON data source
<https://v3-docs.ohif.org/configuration/datasources/dicom-json/>`__
for a DICOM study of interest can be retrieved as follows::

  $ curl https://orthanc.uclouvain.be/demo/studies/6b9e19d9-62094390-5f9ddb01-4a191ae7-9766b715/ohif-dicom-json

This data source is constructed from the :ref:`metadata 4202
<registry>` associated with the individual DICOM instances of the
DICOM study. The metadata corresponds to the `Base64 encoding
<https://en.wikipedia.org/wiki/Base64>`__ of a gzipped JSON file. For
debugging, the JSON file associated with a DICOM instance can be
inspected using::

  $ curl https://orthanc.uclouvain.be/demo/instances/1f3c00bd-49df10b7-f416a598-1b3bb5a2-cb791b52/metadata/4202 | base64 -d | gunzip -c
  

Preloading existing studies
^^^^^^^^^^^^^^^^^^^^^^^^^^^

:ref:`As explained above <ohif-preloading>`, the metadata associated
with DICOM instances are only preloaded for the newly ingested DICOM
instances. Using the REST API of Orthanc, it is easy to create a
script that would preload the metadata for the already existing DICOM
studies, hereby greatly speeding up the first opening of those studies
as well.

This script would loop over the :ref:`the DICOM studies that are
stored by Orthanc <rest-access>` using ``GET /studies``. For each
study whose :ref:`Orthanc identifier <orthanc-ids>` is ``id``, the
script would simply call ``GET /studies/{id}/ohif-dicom-json``.