view TODO @ 4823:241d83204c23 filter-store-instance

closing branch filter-store-instance
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 25 Nov 2021 13:25:54 +0100
parents 9a1f106e175c
children 1eca4378d761
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


============================
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
  

========
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
* 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:
  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
===========

* StorageAccessor => add a memory cache using MemoryStringCache, for
  instance to speed up WADO-RS Retrieve Frames in DICOMweb plugin
* 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


========
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()"

----------------
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