OrthancToolsJS : A new frontend for Orthanc

2,920 views
Skip to first unread message

Salim Kanoun

unread,
Jul 3, 2020, 7:42:11 AM7/3/20
to Orthanc Users

Dear Orthanc community,

We are pleased to announce our new project to build a new modern, web-based front end for Orthanc, called OrthancToolsJS.

OrthancToolsJS is the successor of Orthanc Tools, the previous JAVA front end, it will implement almost all it's features in a much user friendly interface and additional features.
More than just of front end, this project add an authentication layer and automation of several task in Orthanc.

Today we are releasing a testing version to get community feedback and ideas.

So far we have implemented :
Import of DICOM
Listing Orthanc Content
Anonymization with batch management
Auto Retrieve : Retrieve of DICOM by batch from a PACS
Export with batch management
Delete with batch managemnt
OHIF viewer for vizualization
AET / Peer declaration
Identification Layer with roles and dedicated permissions

We still have in our roadmap :
- DiscProducer robot management (Epson and Primera)
- Pre fetching
- DICOM metadata extraction in database (tag monitoring)
at maybe more (autorouting ...)

The full code is AGPL v3 licenced

A demo server is set here :
login and password : admin

Pay Attention :
- Do not upload non anonymized DICOM if I find remaining identifying DICOMs on the testing server I will simply close it and the community will not have anymore a testing environement.
- The demo server is really weak, make only few testing, again I will close it if I see intensive usage of the server.
- For now it is just an alfa release, the software probably suffers of significant bugs, however we wanted to share our work with the community. We expect (hope) to get a stable version in september.

We welcome contributions in the projet, bug report (please use GIT issue tracker), idea for future improvement.
If you need a specific feature we also welcome financial support to help developpement of OrthancToolsJS

Last, I would thank our two students who worked with me for saveral months on this project, Sylvain Berthier and Leo Courderc, and also Sebastien Jodogne and Osimis Team for their kind continuous support on my projects

Best regards,

Salim Kanoun
Nuclear Medicine Physician,
Toulouse, France



Stephen Douglas Scotti

unread,
Jul 4, 2020, 2:59:38 PM7/4/20
to Orthanc Users
Interesting.  Are you using React and Bootstrap ?

Have not looked at it that carefully yet, but the OHIF viewer links are not working for me.

e.g.


http://212.47.232.65/viewer/1.3.12.2.1107.5.8.15.130763.30000018071309430887000001215


Successfully compiled asm.js code (total compilation time 87ms) index.umd.js

Cornerstone Tools index.umd.js:49260:11


Some cookies are misusing the recommended sameSite attribute 3

Successfully compiled asm.js code (total compilation time 142ms) index.umd.js

Successfully compiled asm.js code (total compilation time 85ms) index.umd.js

Cornerstone Tools index.umd.js:2:1502288

Successfully compiled asm.js code (total compilation time 148ms) index.umd.js

Successfully compiled asm.js code (total compilation time 85ms) index.umd.js

Cornerstone Tools index.umd.js:2:4368009

Successfully compiled asm.js code (total compilation time 151ms) index.umd.js

Successfully compiled asm.js code (total compilation time 95ms) index.umd.js

Cornerstone Tools index.umd.js:2:599500

Successfully compiled asm.js code (total compilation time 147ms) index.umd.js

Successfully compiled asm.js code (total compilation time 83ms) index.umd.js

The provided colorLUT only provides 0 labels, whereas segmentsPerLabelmap is set to 65535. Autogenerating the rest. index.umd.js:26480:12

New 'CornerstoneTools@4' source added. index.umd.js:209420:30

New measurement mapping added to source 'CornerstoneTools@4'. index.umd.js:209476:30

Extension ID cornerstone has already been registered. Exiting before duplicating modules. index.umd.js:208141:65

OHIF
Viewer rendered/updated 1.3.12.2.1107.5.8.15.130763.30000018071309430887000001215:40:19

retrieveTimepoints
index.umd.js:114776:34

Timepoint data retrieval index.umd.js:117046:34

search series of study
1.3.12.2.1107.5.8.15.130763.30000018071309430887000001215 index.umd.js:76893:17

XHRGEThttp://212.47.232.65/api/dicom-web/studies/1.3.12.2.1107.5.8.15.130763.30000018071309430887000001215/series[HTTP/1.1 401 Unauthorized 212ms]

Source map error: Error: request failed with status 404
Resource URL: https://unpkg.com/@ohif/viewer/dist/index.umd.js
Source Map URL: index.js.map
request failed
:  XMLHttpRequest { onreadystatechange: onreadystatechange()

, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, responseURL: "http://212.47.232.65/api/dicom-web/studies/1.3.12.2.1107.5.8.15.130763.30000018071309430887000001215/series", status: 401, statusText: "Unauthorized", responseType: "json", response: null } index.umd.js:76439:23


Error: request failed
    com ohif
/viewer/dist/index.umd.js:76440
 
index.umd.js:76444:23


null index.umd.js:76445:23

Error: request failed
    com ohif
/viewer/dist/index.umd.js:76440
 
index.umd.js:120650:35

Error: request failed
    com ohif
/viewer/dist/index.umd.js:76440
 
index.umd.js:108297:44






Not sure why that is, but some of the .js files are really large.  I get the OHIF initial black window, but nothing after that.

1.  Kind of curious about how you query for resources.  I have a similar tool written in PHP.  It seems that there are some limitations on doing queries using tools/find with Orthanc as opposed to using something like a MySQL database since I dont think you can "ORDER BY" or use something like LIMIT x,y.  I did something similar to what it looks like you did by allowing the user to select the maximum number of results to return for a query (which the REST API allows), and you can process the returned results to sort them or filter them further somehow.  Seems like you can't use an "OR" with tools/find, but issue multiple queries in that case.

2.  Regarding modification and anonymization.  I've looked at that a little, and it looks like when you anonymize (and maybe modify) and existing study using the REST API that it creates a copy of the original study and leaves the original there.  That might actually be desired since it is often unwise to delete something in the medical environment.  Just wondering how you handle that ?  I do have an uploader that can anonymize on-the-fly using dcmtk before the study is sent to Orthanc.  That using a web interface similar to yours where you can drag and drop a folder to upload.  I found a client side script that can actually detect DCM files using the header from the file and not just the file extension, which is a little useful to filter out .exe files and others on the client side if you don't want those.

3.  Regarding the viewer, do you have that running behind a proxy or otherwise have some sort of authentication / access controls set up for that ?  For example, could I just go directly to a viewer line and bypass even logging into the app, or do you use SESSION's for authentication with OHIF and the Tools app running on the same server.  That is still problematic because there are really 3 apps, the Orthanc Tools, the OHIF viewer and Orthanc, although I guess that is mostly DICOM web issue.

Kind of like it though.

Thanks.

/sds





Salim Kanoun

unread,
Jul 6, 2020, 2:52:43 AM7/6/20
to Orthanc Users
Hi stephen,

Yes we are using React and Bootstrap. The frontend is in React and the backend is in NodeJS, the backend deal with orthanc which should not be exposed to the public (but only to our backend). 
Yes it act as a reverse proxy for many resquests comming for the front, for some fuction we add some specific features like authentication or automatition to make sequential (batch processing) request to Orthanc.

The OHIF viewer is broken because these last day we change the authentication mechanisme by replacing sessions to Json Web Token, so I have to pass the token to OHIF to be able to retrieve dicom ressources through our backend. Will fix this.

1.For the ressources query I fully use the tools/find API nothing more.
2. I'm just using the Anonymize and Modify API of Orthanc since DICOM are changed they need to be new dicoms with new UID, that's already done in Orthanc.
3. everything goes through the NodeJS reverse proxy, Orthanc should be closed to all other access except the reverse proxy (in production I will use a DockerCompose the Orthanc server will be referecend only in the orthanc compose cluster and not mounted to the host machine). So Yes there is an authentication mechanisme that are using an internal database and/or a LDAP/AD registery (wip), there is an authentication API that deliver a crytped JsonWebToken (with an expiracy date) that must be resent by the frontend for all futher call in the backend, if you don't have a valid token all HTTP call will be rejected (no mater if you calling data from Orthanc itself, DicomWeb or our custom API). This way the NodeJS backend act as a single backend, and basically the frontend don't even know that the data are orignally comming from Orthanc, it just see our NodeJS server.

Best regards,

Salim

Stephen Douglas Scotti

unread,
Jul 10, 2020, 10:15:16 AM7/10/20
to Orthanc Users
Thanks for the reply.  I download the .zip from GitHub.  I can't run Docker on my iMac becaue it is too old, so I'm running on an UBUNTU VM using docker-compose up.

I get a pretty extensive log in the terminal after executing that:

Attaching to orthanctoolsjspacs, orthanctoolsjs, orthanctoolsjsmaster_watchtower_1, orthanc
orthanctoolsjs        
|
orthanctoolsjs        
| > @salim.kanoun/orthanctools@0.0.3 prestart /OrthancToolsJs
orthanctoolsjs        
| > cross-env NODE_ENV=production npm run migrate
orthanctoolsjs        
|
orthanctoolsjspacs    
| Startup command: Orthanc /tmp/orthanc.json
orthanctoolsjspacs    
| W0710 13:56:26.134423 main.cpp:1614] Orthanc version: 1.6.1
orthanctoolsjspacs    
| W0710 13:56:26.134792 OrthancConfiguration.cpp:61] Reading the configuration from: "/tmp/orthanc.json"
watchtower_1          
| time="2020-07-10T13:56:29Z" level=info msg="Starting Watchtower and scheduling first run: 2020-07-10 14:01:29 +0000 UTC m=+300.865451521"
orthanctoolsjs        
|
orthanctoolsjs        
| > @salim.kanoun/orthanctools@0.0.3 migrate /OrthancToolsJs
orthanctoolsjspacs    
| W0710 13:56:26.159125 FromDcmtkBridge.cpp:302] Loading external DICOM dictionary: "/usr/share/libdcmtk14/dicom.dic"
orthanctoolsjs        
| > sequelize db:migrate
orthanctoolsjs        
|
orthanctoolsjspacs    
| W0710 13:56:26.171499 FromDcmtkBridge.cpp:302] Loading external DICOM dictionary: "/usr/share/libdcmtk14/private.dic"
orthanctoolsjspacs    
| W0710 13:56:26.189191 main.cpp:792] Loading plugin(s) from: /usr/share/orthanc/plugins/
orthanctoolsjs        
|
orthanctoolsjspacs    
| W0710 13:56:26.189606 OrthancInitialization.cpp:301] SQLite index directory: "/var/lib/orthanc/db"
orthanctoolsjspacs    
| W0710 13:56:26.190099 OrthancInitialization.cpp:376] Storage directory: "/var/lib/orthanc/db"
orthanctoolsjs        
| Sequelize CLI [Node: 12.16.2, CLI: 5.5.1, ORM: 5.22.3]
orthanctoolsjs        
|
orthanctoolsjspacs    
| W0710 13:56:26.209630 HttpClient.cpp:1066] HTTPS will use the CA certificates from this file: /etc/ssl/certs/ca-certificates.crt
orthanctoolsjs        
| Loaded configuration file "database/config/config.json".
orthanctoolsjs        
| Using environment "production".
orthanctoolsjspacs    
| W0710 13:56:26.210365 LuaContext.cpp:104] Lua says: Lua toolbox installed
orthanctoolsjspacs    
| W0710 13:56:26.210720 LuaContext.cpp:104] Lua says: Lua toolbox installed
orthanctoolsjspacs    
| W0710 13:56:26.210857 ServerContext.cpp:327] Disk compression is disabled
orthanctoolsjspacs    
| W0710 13:56:26.210890 ServerIndex.cpp:1636] No limit on the number of stored patients
orthanctoolsjspacs    
| W0710 13:56:26.210921 ServerIndex.cpp:1653] No limit on the size of the storage area
orthanctoolsjspacs    
| W0710 13:56:26.211327 JobsEngine.cpp:283] The jobs engine has started with 2 threads
orthanctoolsjs        
| == 20200201140939-create-option: migrating =======
orthanctoolsjspacs    
| W0710 13:56:26.211941 main.cpp:1098] DICOM server listening with AET ORTHANC on port: 4242
orthanctoolsjs        
| == 20200201140939-create-option: migrated (0.074s)
orthanctoolsjs        
|
orthanctoolsjs        
| == 20200617094153-create-Role: migrating =======
orthanctoolsjspacs    
| W0710 13:56:26.212001 HttpServer.cpp:1309] HTTP compression is enabled
orthanctoolsjspacs    
| W0710 13:56:26.212037 main.cpp:1001] Remote LUA script execution is disabled
orthanctoolsjs        
| == 20200617094153-create-Role: migrated (0.040s)
orthanctoolsjs        
|
orthanctoolsjspacs    
| W0710 13:56:26.216173 HttpServer.cpp:1216] HTTP server listening on port: 8042 (HTTPS encryption is disabled, remote access is allowed)
orthanctoolsjspacs    
| W0710 13:56:26.216250 main.cpp:804] Orthanc has started
orthanctoolsjs        
| == 20200617094233-create-user: migrating =======
orthanctoolsjs        
| == 20200617094233-create-user: migrated (0.048s)
orthanctoolsjs        
|
orthanctoolsjs        
| == 20200617094307-addUniqueUser: migrating =======
orthanctoolsjs        
| == 20200617094307-addUniqueUser: migrated (0.124s)
orthanctoolsjs        
|
orthanctoolsjs        
| == 20200617094436-addDefaultRoles: migrating =======
orthanctoolsjs        
| == 20200617094436-addDefaultRoles: migrated (0.040s)
orthanctoolsjs        
|
orthanctoolsjs        
| == 20200617095049-addDefaultUser: migrating =======
orthanctoolsjs        
| == 20200617095049-addDefaultUser: migrated (0.197s)
orthanctoolsjs        
|
orthanctoolsjs        
|
orthanctoolsjs        
| > @salim.kanoun/orthanctools@0.0.3 start /OrthancToolsJs
orthanctoolsjs        
| > cross-env NODE_ENV=production node OrthancToolsJS.js
orthanctoolsjs        
|
orthanc              
| Startup command: Orthanc /tmp/orthanc.json
orthanc              
| W0710 13:56:29.393573 main.cpp:1614] Orthanc version: 1.6.1
orthanc              
| W0710 13:56:29.393843 OrthancConfiguration.cpp:61] Reading the configuration from: "/tmp/orthanc.json"
orthanc              
| W0710 13:56:29.420984 FromDcmtkBridge.cpp:302] Loading external DICOM dictionary: "/usr/share/libdcmtk14/dicom.dic"
orthanc              
| W0710 13:56:29.434330 FromDcmtkBridge.cpp:302] Loading external DICOM dictionary: "/usr/share/libdcmtk14/private.dic"
orthanc              
| W0710 13:56:29.454186 main.cpp:792] Loading plugin(s) from: /usr/share/orthanc/plugins/
orthanc              
| W0710 13:56:29.454966 PluginsManager.cpp:269] Registering plugin 'worklists' (version 1.6.1)
orthanc              
| W0710 13:56:29.455024 PluginsManager.cpp:168] Sample worklist plugin is initializing
orthanc              
| W0710 13:56:29.455148 PluginsManager.cpp:168] The database of worklists will be read from folder: /var/lib/orthanc/worklists
orthanc              
| W0710 13:56:29.469030 PluginsManager.cpp:269] Registering plugin 'dicom-web' (version 1.1)
orthanc              
| W0710 13:56:29.469260 PluginsManager.cpp:168] URI to the DICOMweb REST API: /dicom-web/
orthanc              
| W0710 13:56:29.469716 PluginsManager.cpp:168] URI to the WADO-URI API: /wado
orthanc               | W0710 13:56:29.486040 PluginsManager.cpp:269] Registering plugin 'osimis-web-viewer' (version 1.3.1.0-ea114768)
orthanc               | W0710 13:56:29.486141 PluginsManager.cpp:168] Initializing the Web viewer
orthanc               | W0710 13:56:29.486573 PluginsManager.cpp:168] Using GDCM instead of the DICOM decoder that is built in Orthanc
orthanc               | W0710 13:56:29.487447 PluginsManager.cpp:269] Registering plugin 'transfers' (version 1.0)
orthanc               | W0710 13:56:29.490436 PluginsManager.cpp:269] Registering plugin 'python' (version 1.0)
orthanc               | W0710 13:56:29.490593 PluginsManager.cpp:168] Python plugin is initializing
orthanc               | W0710 13:56:29.490730 PluginsManager.cpp:168] The option "PythonScript" is not provided: Python scripting is disabled
orthanc               | W0710 13:56:29.490826 OrthancInitialization.cpp:301] SQLite index directory: "/
var/lib/orthanc/db"
orthanc               | W0710 13:56:29.491337 OrthancInitialization.cpp:376] Storage directory: "
/var/lib/orthanc/db"
orthanc               | W0710 13:56:29.510774 HttpClient.cpp:1066] HTTPS will use the CA certificates from this file: /etc/ssl/certs/ca-certificates.crt
orthanc               | W0710 13:56:29.511493 LuaContext.cpp:104] Lua says: Lua toolbox installed
orthanc               | W0710 13:56:29.511802 LuaContext.cpp:104] Lua says: Lua toolbox installed
orthanc               | W0710 13:56:29.511993 ServerContext.cpp:327] Disk compression is disabled
orthanc               | W0710 13:56:29.512034 ServerIndex.cpp:1636] No limit on the number of stored patients
orthanc               | W0710 13:56:29.512057 ServerIndex.cpp:1653] No limit on the size of the storage area
orthanc               | W0710 13:56:29.512468 JobsEngine.cpp:283] The jobs engine has started with 2 threads
orthanc               | W0710 13:56:29.513027 main.cpp:1098] DICOM server listening with AET ORTHANC on port: 4242
orthanc               | W0710 13:56:29.513082 HttpServer.cpp:1309] HTTP compression is enabled
orthanc               | W0710 13:56:29.513113 main.cpp:1001] Remote LUA script execution is disabled
orthanc               | W0710 13:56:29.517158 HttpServer.cpp:1216] HTTP server listening on port: 8042 (HTTPS encryption is disabled, remote access is allowed)
orthanc               | W0710 13:56:29.517229 main.cpp:804] Orthanc has started
orthanctoolsjs        | Warning: connect.session() MemoryStore is not
orthanctoolsjs        | designed for a production environment, as it will leak
orthanctoolsjs        | memory, and will not scale past a single process.
orthanctoolsjs        | Listening on port: 4000


and then I can connect to explorer using http://localhost:8042.  However, I do not see how to connect to the orthanctoolsJS ?

There is nothing on port 4000 as far as I can tell.

Is there a way to runthe orthanctoolsJS with that configuration ?

The envrionment in the .yml is        

environment:
            OrthancAddress: "http://orthanc"
            OrthancPort: "8042"
            OrthancUsername: "salim"
            OrthancPassword: "salim"

Thanks.

Salim Kanoun

unread,
Jul 10, 2020, 10:22:51 AM7/10/20
to Orthanc Users
Sorry I didn't updated to release package for a while

Uzip it in a directory you have a write permission
Install NodeJS in your computer
Then at the root of the unziped folder : 
npm install
npm start 


In this version the browser should be automatically opened, the 4000 port should respond

Best regards,

Salim

Stephen Douglas Scotti

unread,
Jul 10, 2020, 1:51:09 PM7/10/20
to Orthanc Users
Thanks.  I tried that on my iMac.  It almost runs, but I get an error when trying to start.  I'm not that familiar with Node.js.  Is there something else to configured to fthat, or is it some sort of syntax error problem ?

??  const {robot} = require('../model/robot/Robot')
??  const { getRobotDetails, getAllRobotDetails, addRobotJob, validateRobotJob, deleteRobotJob, removeQueryFromJob, addAnonJob, getAnonJob, getDeleteJob, addDeleteJob } = require('../controllers/Robot2')

SyntaxError: Unexpected token =
    at new Script (vm.js:79:7)
    at createScript (vm.js:251:10)
    at Object.runInThisContext (vm.js:303:10)
    at Module._compile (internal/modules/cjs/loader.js:657:28)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/Users/sscotti/Desktop/OrthancToolsJS_0.3.2/controllers/Robot2.js:1:79)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/Users/sscotti/Desktop/OrthancToolsJS_0.3.2/routes/index.js:7:168)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @salim.kanoun/orthan...@0.0.3 start: `cross-env NODE_ENV=production node OrthancToolsJS.js`
npm ERR! Exit status 1

??

Salim Kanoun

unread,
Jul 10, 2020, 6:52:27 PM7/10/20
to Orthanc Users
Dear Stephen,

These error do not mention my code except the "require" function to import js file in another file which is more than common.
Could you check your nodeJS version ? We need  a recent version of nodeJS (v12).
The nodejs ecosystem is still a bit immature, there are compatibilty issue across version (event recents ones).

I revert back http2 to http1 again http2 support for node js seems immature as well. 

I didn't tried with mac but it works on Linux and Windows so I expect to be working as well in mac.

Salim

Stephen Douglas Scotti

unread,
Jul 10, 2020, 7:45:30 PM7/10/20
to Orthanc Users
Thanks.  I had to reconfigure and update my system a bit, but got it working now using the 3.2 version.  I think it is because I had an old version of Node.   Thanks a lot.  I have it running locally on my Mac, so I can play around with it a little.  I use mostly PHP, MySQL, CSS, HTML,JS and jQuery, Bootstrap & and a PHP framework, but I'd like to learn Vue.js, Angular or React, as well as Node.  Not sure which one to look at.  Vue.js is apparently easier to learn, and I really don't know much about Node, but I have pretty decent Javascript skills and experience with MVC frameworks.

Now running Node:  v14.5.0, nvm 0.32.x

Salim Kanoun

unread,
Sep 24, 2020, 7:47:38 AM9/24/20
to Orthanc Users
Dear All,

We released the pre-release version 0.4.1 of Orthanc Tools JS.

From the inital post we notably add : 

Active Directory connexion support for user identification
CD/DVD Burner with Primera/Epson (beta)
A lot of improvement and debugs (auto retrieve, user roles, export, anon ...)

Salim

Maximiliano A. Dursi

unread,
Sep 24, 2020, 7:53:48 AM9/24/20
to Orthanc Users
Hi Salim, is a windows installer? if not, i hope you can develope one.
Thanks!

Salim Kanoun

unread,
Sep 24, 2020, 8:00:21 AM9/24/20
to Orthanc Users
No, 
In the Release of GitHub you will have the distribution, you will juste need to install NodeJS in windows, unzip the distribution and type 2 command in the terminal : "npm install" and "npm start"

I don't have any plan to make a windows installer (I have docker container by the way), but anyone who will want to produce such installer is more than welcome,

Salim

Christopher

unread,
Sep 28, 2020, 3:14:28 AM9/28/20
to Orthanc Users
Hi Salim,

Just  copied and pasted the previous private conversion via email before and want to discuss publicly here

I asked 
Hi Salim, is it possible that your app is able to manage several orthanc’s’ ?

And your response
Hi it depend what you calling multiples orthanc server.

I Can make a storage of known orthanc server ans being to Switch the frontend to one orthanc to another one. That is possible.

But if your thinking about managind multiple orthanc in the same Time, for exemple to make a dicom quuery make it in multiple orthanc server, no it will be nightmare

My initial intention is just to manage the Orthanc Configuration, such as, Orthanc.json , plugins and scripting (lua and python).  So manually editing, restarting individually Orthanc service in a pool of Orthans is not convenient for teams like devops. If they can have GUI that makes it visually, it would be great. The purpose of dicom query it is not much of my concern. But even in case of querying dicom in a pool Orthanc, I have no idea that it is a nightmare ? I imagine  that the GUI will be have a list of Orthanc, user clicks on a particular Orthanc and starts doing query. Is that possible ?

Thanks,
Chris


Vào lúc 19:00:21 UTC+7 ngày Thứ Năm, 24 tháng 9, 2020, salim....@gmail.com đã viết:

Salim Kanoun

unread,
Sep 28, 2020, 12:17:38 PM9/28/20
to Orthanc Users
A GUI to edit Orthanc.Json is doable, I don't exclude to make one but not now.
However it wont be able to reparameter dynamically your orthanc servers, most parameter need edition of the orthanc.json file in server and orthanc reboot (the latest can be done by API).
So unless orthanc would become flully parametrable through API (and so settings stored in database) you will need to copy the file in the server and so it is impossible to manage N orthanc settings only from a web GUI.

For quering multiple orthanc no it's too messy,  specially the AET query, each Orthanc having N aet you will have N Orthanc each one knowing N AET it will be a nightmare to manage. 

Salim

walid...@gmail.com

unread,
Oct 1, 2020, 12:34:32 AM10/1/20
to Orthanc Users
I'm newbie, was using your orthanc tool old version and its a life saver. I want to try this version too but how do Install/configure do you have simple step by step guide? thank you.

Salim Kanoun

unread,
Oct 1, 2020, 4:56:32 AM10/1/20
to Orthanc Users
Hi,

The documentation is in "Work In progress"

However you have at least the installation documentation in the current version : 


Best regards,

Salim

walid...@gmail.com

unread,
Oct 2, 2020, 12:32:58 AM10/2/20
to Orthanc Users
Thank you very much.

Salim Kanoun

unread,
Oct 8, 2020, 5:08:09 AM10/8/20
to Orthanc Users
Dear All,

Here an updated documentation of Orthanc Tools JS


Best regards,

Salim

Salim Kanoun

unread,
Dec 18, 2020, 4:30:22 AM12/18/20
to Orthanc Users
Dear All,

Just wanted to give some update on Orthanc Tools JS project,

I recieve regularly emails of begginers trying to install OrthancToolsJS, and it's likely to become more difficult to install OrthancToolsJS in the future, so i'm afraid that it will become difficult for begginers to use it, I explain why.

A the origin OrthancToolsJS was designed to be a simple software build on the top of Orthanc to automatize various time consuming DICOMs tasks, more or less what the original JAVA version orthancTools did.
Then we had more and more request from our french working group and this applications included a lot of new services, especially the authentication layer that is using a database and eventually a Active directory connection.

As we wanted this app able to scale (manage huge list of task) we had to include a task manager that itself is using a redis backend for queue management.

After many hesitations, I dedicided to switch paradigm of OrthancToolsJS, and continue to work in the benefit of scalability at the price of portability.

So from a Orthanc "Addon", OrthancToolsJS will shift to an Orthanc "distribution", that will require Orthanc but also a relational database (mysql or postgres) and a redis backend (and who knows maybe other third party apps in the future)

For linux users all of this will be simple to install through docker compose which will be the official way to go.
For Windows users things are more complicated, it is still possible as there is a windows community version of Redis but not an official version. So, i'm relying on the bet that in some months windows will have a full docker support to get this cross plateform deployement mode (Windows 10 seems to bring a much better docker support so there's hope).

If one of you want to maintain a portable version of OrthancToolsJS it's better to fork now.
Also the second way to go is to grab only OrthancToolsJS frontend to connect it directly to Orthanc without intermediate backend. Except for routes brought by OrthancToolsJS automation, all http request from the frontend are following the same API than Orthanc server (in these cases my backend only act as a pure reverse proxy with an authentication JWT middelware), it will need to adapt the authentication system (or remove it) and remove our automations interface components.

So the next version of OrthancToolsJS will be a new full version, with a new deployment process, will try to maintain the documentation update to give you insight or how to deploy it.

Best regards,

Salim

Salim Kanoun

unread,
Feb 17, 2021, 6:22:38 PM2/17/21
to Orthanc Users
Dear all,

We are preparing the next major release of OrthancToolsJS (will be 0.6.0).

I closed the initial testing server for a new one : 
login / password : admin / admin

The server is now showing the pre-version of 0.6.0, for which we are making the bug hunting,

Best regards,

Salim

Sébastien Jodogne

unread,
Feb 18, 2021, 2:21:24 AM2/18/21
to Orthanc Users
Wow, this looks great! Thanks for your hard work :-) :-)

Sébastien-

Jorge Vidal

unread,
Feb 18, 2021, 9:29:31 AM2/18/21
to Orthanc Users
It looks great! Congratulations for such hard work. I couldn´t find any study using the browser. Do we have to upload them?  I would really like to help in the testing process...
Regards, 
Jorge


Salim Kanoun

unread,
Feb 18, 2021, 9:41:12 AM2/18/21
to Orthanc Users
There is one study in it, it is visible.
(if you try this morning someone has changed the orthanc server settings so the frontend was loosing the orthanc server to reach).

You can upload what you want but only anonymized studies 

Salim Kanoun

unread,
Mar 1, 2021, 5:29:55 PM3/1/21
to Orthanc Users
Hi there,

OrthancToolsJS 0.6.0 is out.
The demo server has now an easier name  : https://orthanctoolsjs.ddns.net/

These next couples of month we will continue to make minor features and focus on stability. 

Best regards,

Salim

Salim Kanoun

unread,
May 12, 2021, 6:29:37 AM5/12/21
to Orthanc Users
Hi there,

We released the 0.6.2 version of OrthancToolsJS. (https://github.com/salimkanoun/Orthanc-Tools-JS/releases/tag/0.6.2)
We made a lot of small improvement and bug fixes in this version.

The next milestone will focus on dicom ressource tagging and autorouting.

Best regards,

Salim

Metab Al

unread,
May 20, 2021, 6:25:52 PM5/20/21
to Orthanc Users
Hi Salim,
Many thanks for your great efforts.

 I would like to deploy it by utilizing  docker-compose.yml as explained in https://github.com/salimkanoun/Orthanc-Tools-JS/blob/0.4.5/Documentation/Orthanc-Tools-JS-Documentation.pdf


regards,
Metab

Salim Kanoun

unread,
May 21, 2021, 4:19:28 AM5/21/21
to Metab Al, Orthanc Users
No it should work 

I dont understand why you are looking at the 0.4.x version 
Go the the latest version, the docker compose works with it.


--
You received this message because you are subscribed to the Google Groups "Orthanc Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to orthanc-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/orthanc-users/42b97ef2-70cb-41e7-a33e-81ce4b3ecf20n%40googlegroups.com.

Metab Al

unread,
May 22, 2021, 2:11:15 PM5/22/21
to Orthanc Users

Salim Kanoun

unread,
May 22, 2021, 2:20:30 PM5/22/21
to Metab Al, Orthanc Users
It does, the testing server is running it, as well as 3 frenchs hospitals and users in italy and brazil.

You should look closer at your install, espacially take account that the deployment sample is using traefik as reverse proxy defined in the other docker compose.
If you are using it in a LAN you can remove the traefik référence and expose your orthanctoolsjs container directly to your Host.

Dig deeper in Docker concepts and deployment and you should figure a way to run it.




Metab Al

unread,
May 24, 2021, 3:09:56 PM5/24/21
to Orthanc Users
Many thanks Salim.
It is working now. 

for those who would like to use docker-compose in a LAN map the ports of OrthancToosJs service to your host.
for the docker-compose.yml example below my host IP : 192.168.50.168 change it accordingly:
----
version: "2"
#if needed to map the orthancPACS to a different hard disk device (after mounting it in path)
# volumes: ["/home/petctviewer/orthanc:/var/lib/orthanc/db:Z"]

networks:
  web:
    external: true
  internal:
    external: false

services:

    orthanctoolsjs:
        image: salimkanoun/orthanctoolsjs
        container_name: orthanctoolsjs
        ports:
            - 443:4000
            - 8080:4000
        restart: unless-stopped
        volumes: ["orthanctoolsjs:/OrthancToolsJs/data:Z"]
        environment:
            TZ: "Europe/Paris"
            ORTHANC_ADDRESS: "http://orthanc"
            ORTHANC_PORT: "8042"
            ORTHANC_USERNAME: "salim"
            ORTHANC_PASSWORD: "salim"
            DOMAIN_PROTOCOL: "https"
            DOMAIN_ADDRESS: "192.168.50.198"
            REDIS_HOST: "redis"
            REDIS_PORT: "6379"
            REDIS_PASSWORD: ""
        networks:
          - internal
          - web
#        labels:
#        - "traefik.enable=true"
#        - "traefik.port=4000"
#        - "traefik.http.routers.blog.rule=Host(`0e44be91-4285-440b-a132-c6580851eed7.pub.instances.scw.cloud`)"
#        - "traefik.http.routers.blog.entrypoints=websecure"
#        - "traefik.docker.network=web"

    redis:
        image: redis:alpine
        networks:
          - internal

    orthanc:
        image: osimis/orthanc:21.1.7
        container_name: orthanc
        restart: unless-stopped
        ports: ["8042:8042"]
        volumes: ["orthanc:/var/lib/orthanc/db:Z"]
        networks:
          - internal
        environment:
            ORTHANC__NAME: "OrthancToolsJS"
            ORTHANC__DICOM_SERVER_ENABLED: "true"
            ORTHANC__DICOM_MODALITIES_IN_DATABASE: "true"
            ORTHANC__ORTHANC_PEERS_IN_DATABASE: "true"
            DICOM_WEB_PLUGIN_ENABLED: "true"
            OSIMIS_WEB_VIEWER1_PLUGIN_ENABLED: "true"
            PYTHON_PLUGIN_ENABLED: "true"
            TRANSFERS_PLUGIN_ENABLED: "true"
            WORKLISTS_PLUGIN_ENABLED: "true"
            ORTHANC__REGISTERED_USERS: |
                {"salim": "salim"}
            ORTHANC__DICOM_WEB__ENABLE: "true"
            ORTHANC__DICOM_WEB__ROOT: "/dicom-web/"
            ORTHANC__DICOM_WEB__ENABLEWADO: "true"
            ORTHANC__DICOM_WEB__WADOROOT: "/wado"
            ORTHANC__DICOM_WEB__SSL: "true"
            ORTHANC__DICOM_WEB__STUDIESMETADATA: "MainDicomTags"
            ORTHANC__DICOM_WEB__SERIESMETADATA: "Full"

    orthanctoolsjspacs:
        image: osimis/orthanc:21.1.7
        ports: ["8043:8042"]
        container_name: orthanctoolsjspacs
        restart: unless-stopped
        volumes: ["orthancpacs:/var/lib/orthanc/db:Z"]
        networks:
          - internal
        environment:
            ORTHANC__NAME: "OrthancPacs"
            ORTHANC__DICOM_MODALITIES_IN_DATABASE: "true"
            ORTHANC__REGISTERED_USERS: |
                    {"salim": "salim"}



volumes:
        orthanc:
        orthancpacs:
        orthanctoolsjs:
Reply all
Reply to author
Forward
0 new messages