view TODO @ 4886:228ce71e08a3

removed TODO - already done
author Alain Mazy <am@osimis.io>
date Tue, 15 Feb 2022 18:09:03 +0100
parents 86468693779e
children 6eff25f70121
line wrap: on
line source

=======================
=== Orthanc Roadmap ===
=======================

For higher-level ideas in the roadmap, please first read the
"Contributing to Orthanc" section of the Orthanc Book:
https://book.orthanc-server.com/contributing.html


=======
General
=======

* Configure an user-defined site UID root if generating DICOM UIDs
  ("FromDcmtkBridge::GenerateUuid()")
* Improve handling of errors in the command queue:
  https://groups.google.com/d/msg/orthanc-users/--njEbqcDDI/rBu8XL-Mm-cJ
* Support partial file retrieval in Orthanc::HttpClient
* Support retry counter in Orthanc::HttpClient
* Option to enable DNS lookups in DICOM:
  https://hg.orthanc-server.com/orthanc/file/Orthanc-1.9.3/OrthancFramework/Sources/OrthancFramework.cpp#l88
* Toolbox::ComputeMD5() fails on files larger than 4GB
* Add an option to run Orthanc in read-only mode both for DICOM and for Rest API.
* Logging: add some information like Thread-Id to contextualize the logs
* Accept extra DICOM tags dictionaries in the DCMTK format '.dic' (easier to use than declare
  them in the Orthanc configuration file).  Even the standard dictionaries could be 
  overriden by these custom dictionaries.

============================
Documentation (Orthanc Book)
============================

* Explain how log rotation can be achieved (no built-in support in Orthanc)
* Explain how to interface with Mirth/NextGen Connect
  https://en.wikipedia.org/wiki/NextGen_Connect
* How to reproduce issues by replacing Orthanc with storescp or wlmscpfs
* How to capture TCP traffic of DICOM protocol using tcpdump and Wireshark
* Add more configurations of viewers (Weasis, Slicer...):
  https://book.orthanc-server.com/integrations.html
* Discuss HL7 in a dedicated page:
  https://groups.google.com/d/msg/orthanc-users/4dt4992O0lQ/opTjTFU2BgAJ
  https://groups.google.com/g/orthanc-users/c/Spjtcj9vSPo/m/ktUArWxUDQAJ


================
Orthanc Explorer
================

* Option to tune the number of results for a local lookup:
  https://groups.google.com/g/orthanc-users/c/LF39musq02Y/


========
REST API
========

--------
Mid-term
--------

* Archive jobs: Resume downloads using "range requests":
  https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
* Create DICOM from DICOMweb JSON ("application/dicom+json")
  with "/tools/create-dicom"
* Create multi-frame images with /tools/create-dicom (by adding a
  "MultiFrame" flag to avoid creating a series), or modify PixelData
  of a multi-frame image:
  https://groups.google.com/g/orthanc-users/c/y3-xa_GcdLM/m/m0Kr5G5UPAAJ
* Specify the transfer syntax in /tools/create-dicom
* In the /studies/{id}/anonymize route, add an option to remove
  secondary captures.  They usually contains Patient info in the
  image. The SOPClassUID might be used to identify such secondary
  captures.
* Support "/preview" and "/matlab" for LUT color images
* Try to transcode files if a simple decoding fails:
  https://groups.google.com/g/orthanc-users/c/b8168-NkAhA/m/Df3j-CO9CgAJ
* Add asynchronous mode in "/modalitities/.../move" for C-MOVE SCU:
  https://groups.google.com/g/orthanc-users/c/G3_jBy4X4NQ/m/8BanTsdMBQAJ
* Ranges of DICOM tags for "Keep" and "Remove" in ".../modify" and ".../anonymize": 
  https://groups.google.com/g/orthanc-users/c/6dETktKo9v8/m/b0LUvSfwAgAJ

---------
Long-term
---------

* Stick to the JSONapi or JAREST guidelines for a "v2" of the API:
  https://groups.google.com/forum/#!msg/orthanc-users/Bag-SwEE9ZI/-w7QXI6p7-oJ
  http://www.admiraalit.nl/jarest/


=====
DICOM
=====

--------
Mid-term
--------

* Support C-GET SCU (note that C-GET SCP was introduced in Orthanc 1.7.0)
* Support "Retrieve AE Title" (0008,0054) in C-FIND:
  - On SCP side: done by https://hg.orthanc-server.com/orthanc/rev/1ec3e1e18f50
  - On SCU side:
    https://groups.google.com/d/msg/orthanc-users/wPl0g5mqZco/5X1Z8tEzBgAJ
* Support "Instance Availability" (0008,0056) in C-FIND:
  http://dicom.nema.org/medical/DICOM/2019a/output/chtml/part04/sect_C.4.html#sect_C.4.1.1.3.2
  https://groups.google.com/d/msg/orthanc-users/hteDgE6igo8/j-ArqD7pBQAJ
* Check Big Endian transfer syntax in ParsedDicomFile::EmbedImage and
  DicomImageDecoder
* Strict hierarchical C-FIND:
  https://groups.google.com/d/msg/orthanc-users/VBHpeGVSNKM/tkaVvjWFBwAJ

---------
Long-term
---------

* Support extended association (e.g. for C-Find relational queries):
  https://groups.google.com/d/msg/orthanc-users/xD4d3mpc6ms/srF7E2goAAAJ
* Support C-MOVE-CANCEL:
  https://groups.google.com/d/msg/orthanc-users/KnduYBFd06A/o86cl5SeCAAJ

--------------------
Internationalization
--------------------

* Support multiple specific character sets (cf. "SCSH32" in orthanc-tests)
  - http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.12.html#sect_C.12.1.1.2
  - Japanese test: http://dicom.nema.org/MEDICAL/dicom/2017c/output/chtml/part05/sect_H.3.2.html
* Support Supplementary Kanji set (ISO 2022 IR 159)
* Create DICOM files with multibyte encodings (Korean, JapaneseKanji, SimplifiedChinese)


===========
Performance
===========

* ServerContext::DicomCacheLocker => give access to the raw buffer,
  useful in ServerContext::DecodeDicomInstance()
* DicomMap: create a cache to the main DICOM tags index
* Check out rapidjson: https://github.com/miloyip/nativejson-benchmark
* optimize tools/find with ModalitiesInStudies: 
  https://groups.google.com/g/orthanc-users/c/aN8nqcRd3jw/m/pmc9ylVeAwAJ.
  One solution could be: filter first without ModalitiesInStudies and then
  cycle through the responses to filter out with ModalitiesInStudies

========
Database
========

* Integration test searching for "\" and "%" in PatientName, PatientID...


=======
Plugins
=======

---
SDK
---

* Implement PluginsJob::GetOutput() to allow user-defined jobs to provide output:
  https://groups.google.com/g/orthanc-users/c/GZ7u0bTTVoo/m/Z7iTNTi2BgAJ
* Add plugins for normalized operations (notably so as to support
  Print SCU/SCP, cf. "dcmprscp"):
  https://web.archive.org/web/20170923150432/https://www.medicalconnections.co.uk/kb/DICOM_Print_Service
* Provide access to the Orthanc::DicomUserConnection class in plugins:
  https://groups.google.com/d/msg/orthanc-users/ycDA1xPuTRY/nsT2_GOtEgAJ
* Provide a C++ callback similar to "ReceivedInstanceFilter()" in Lua
  https://book.orthanc-server.com/users/lua.html#filtering-incoming-dicom-instances
  https://groups.google.com/d/msg/orthanc-users/BtvLTE5Ni8A/vIMhmMgfBAAJ
* In "OrthancPluginLog[Error|Warning|Info]()", prefix the log line with
  the name of the plugin, as retrieved by "OrthancPluginGetName()"
* update the SDK to handle buffer sizes > 4GB (all sizes are currently coded in uint32_t)

----------------
Ideas of plugins
----------------

* DICOM-RT primitives (RT-STRUCT, RT-PLAN, RT-DOSE)
* Converter to/from NIfTI
* Decode JPEG2k with grok: https://github.com/GrokImageCompression/grok
* Generate dynamic HTTP content using Lua:
  https://groups.google.com/d/msg/orthanc-users/KompazkxRSs/5Rh03mzgDAAJ
* More generally, expose more callbacks of the plugin SDK in Lua:
  https://groups.google.com/d/msg/orthanc-users/_FbiRHuXPGM/J-OAv7zaCAAJ
* Configuration interface plugin
* Delayed deletion plugin: 
  https://bugs.orthanc-server.com/show_bug.cgi?id=186#c2


===
Lua
===

* Configure HTTP headers from Lua (in HttpGet(), HttpPost(),
  HttpPut(), HttpDelete(), RestApiGet(), RestApiPost(), RestApiPut()
  and RestApiDelete().
  https://groups.google.com/forum/#!msg/orthanc-users/WNnW187OILM/6XX_bm96BwAJ


================
Code refactoring
================

* Use Semaphore::Locker everywhere (instead of explicit
  Release() and Acquire())
* Avoid direct calls to FromDcmtkBridge (make most of its 
  methods private), go through ParsedDicomFile wherever possible


=================
Platform-specific
=================

---------
Packaging
---------

* RHEL through EPEL (as of 2021, CentOS seems to be over):
  http://fedoraproject.org/wiki/EPEL_Package_Maintainers
* Fedora: Are DICOM dictionaries correctly located?
  https://groups.google.com/g/orthanc-users/c/YB_LTBuUQNA/m/3H1xsrZJDgAJ

------------------------
Big-endian architectures
------------------------

* Check the generated 16bpp PNG images

-----------------
Microsoft Windows
-----------------

* Add compatibility with non-ASCII paths (Orthanc expresses its paths
  as UTF-8 strings, but Windows expects them to be translated to the 
  system locale)


====
Misc
====

-----------------
Maintenance tools
-----------------

* Standalone tool to detect corrupted files:
  https://groups.google.com/g/orthanc-users/c/KASEJ9Gx3vQ/m/MIJFJdRhAwAJ
* Standalone tool to detect orphan files in OrthancStorage

----------------------------------
Code quality and integration tests
----------------------------------

* Have a look at openQA (cf. GNU Health)
* Add integration tests for LUT


---------------------
External applications
---------------------

* Create REST bindings with Slicer
* Create REST bindings with Horos/OsiriX