eFilm + Orthanc

Dear Orthanc team,

I have a server with installed Debian 9 os and Orthanc 1.2.0+dfsg-1
it is connected to the CT with the appropriate settings,
the studies transfer works fine
all transferred studies I can see and download using web.
The next step, connecting Ortank with eFilm
orthanc.json:

`

{
/**

  • General configuration of Orthanc
    **/

// The logical name of this instance of Orthanc. This one is
// displayed in Orthanc Explorer and at the URI “/system”.
“Name” : “ORTHANC”,

// Path to the directory that holds the heavyweight files
// (i.e. the raw DICOM instances)
“StorageDirectory” : “/var/lib/orthanc/db-v6”,

// Path to the directory that holds the SQLite index (if unset,
// the value of StorageDirectory is used). This index could be
// stored on a RAM-drive or a SSD device for performance reasons.
“IndexDirectory” : “/var/lib/orthanc/db-v6”,

// Enable the transparent compression of the DICOM instances
“StorageCompression” : false,

// Maximum size of the storage in MB (a value of “0” indicates no
// limit on the storage size)
“MaximumStorageSize” : 0,

// Maximum number of patients that can be stored at a given time
// in the storage (a value of “0” indicates no limit on the number
// of patients)
“MaximumPatientCount” : 0,

// List of paths to the custom Lua scripts that are to be loaded
// into this instance of Orthanc
“LuaScripts” : [
],

// List of paths to the plugins that are to be loaded into this
// instance of Orthanc (e.g. “./libPluginTest.so” for Linux, or
// “./PluginTest.dll” for Windows). These paths can refer to
// folders, in which case they will be scanned non-recursively to
// find shared libraries.
“Plugins” : [
“/usr/share/orthanc/plugins/”
],

/**

  • Configuration of the HTTP server
    **/

// Enable the HTTP server. If this parameter is set to “false”,
// Orthanc acts as a pure DICOM server. The REST API and Orthanc
// Explorer will not be available.
“HttpServerEnabled” : true,

// HTTP port for the REST services and for the GUI
“HttpPort” : 8042,

// When the following option is “true”, if an error is encountered
// while calling the REST API, a JSON message describing the error
// is put in the HTTP answer. This feature can be disabled if the
// HTTP client does not properly handles such answers.
“HttpDescribeErrors” : true,

// Enable HTTP compression to improve network bandwidth utilization,
// at the expense of more computations on the server. Orthanc
// supports the “gzip” and “deflate” HTTP encodings.
“HttpCompressionEnabled” : true,

/**

  • Configuration of the DICOM server
    **/

// Enable the DICOM server. If this parameter is set to “false”,
// Orthanc acts as a pure REST server. It will not be possible to
// receive files or to do query/retrieve through the DICOM protocol.
“DicomServerEnabled” : true,

// The DICOM Application Entity Title
“DicomAet” : “ORTHANC”,

// Check whether the called AET corresponds during a DICOM request
“DicomCheckCalledAet” : false,

// The DICOM port
“DicomPort” : 4242,

// The default encoding that is assumed for DICOM files without
// “SpecificCharacterSet” DICOM tag, and that is used when answering
// C-Find requests (including worklists). The allowed values are
// “Ascii”, “Utf8”, “Latin1”, “Latin2”, “Latin3”, “Latin4”,
// “Latin5”, “Cyrillic”, “Windows1251”, “Arabic”, “Greek”, “Hebrew”,
// “Thai”, “Japanese”, and “Chinese”.
“DefaultEncoding” : “Latin1”,

// The transfer syntaxes that are accepted by Orthanc C-Store SCP
“DeflatedTransferSyntaxAccepted” : true,
“JpegTransferSyntaxAccepted” : true,
“Jpeg2000TransferSyntaxAccepted” : true,
“JpegLosslessTransferSyntaxAccepted” : true,
“JpipTransferSyntaxAccepted” : true,
“Mpeg2TransferSyntaxAccepted” : true,
“RleTransferSyntaxAccepted” : true,

// Whether Orthanc accepts to act as C-Store SCP for unknown storage
// SOP classes (aka. “promiscuous mode”)
“UnknownSopClassAccepted” : false,

// Set the timeout (in seconds) after which the DICOM associations
// are closed by the Orthanc SCP (server) if no further DIMSE
// command is received from the SCU (client).
“DicomScpTimeout” : 30,

/**

  • Security-related options for the HTTP server
    **/

// Whether remote hosts can connect to the HTTP server
“RemoteAccessAllowed” : true,

// Whether or not SSL is enabled
“SslEnabled” : false,

// Path to the SSL certificate in the PEM format (meaningful only if
// SSL is enabled)
“SslCertificate” : “certificate.pem”,

// Whether or not the password protection is enabled
“AuthenticationEnabled” : false,

// The list of the registered users. Because Orthanc uses HTTP
// Basic Authentication, the passwords are stored as plain text.
“RegisteredUsers” : {
“alice” : “alicePassword”
},

/**

  • Network topology
    **/

// The list of the known DICOM modalities
“DicomModalities” : {
/**

  • Uncommenting the following line would enable Orthanc to
  • connect to an instance of the “storescp” open-source DICOM
  • store (shipped in the DCMTK distribution) started by the
  • command line “storescp 2000”.
    **/
    //“sample” : [ “EFILM”, “192.168.38.18”, 4006 ]

/**

  • A fourth parameter is available to enable patches for a
  • specific PACS manufacturer. The allowed values are currently
  • “Generic” (default value), “StoreScp” (storescp tool from
  • DCMTK), “ClearCanvas”, “MedInria”, “Dcm4Chee”, “SyngoVia”,
  • “AgfaImpax” (Agfa IMPAX), “EFilm2” (eFilm version 2), and
  • “Vitrea”. This parameter is case-sensitive.
    **/
    “efilm” : [ “EFILM”, “192.168.38.18”, 4006, “Generic” ]
    },

// The timeout (in seconds) after which the DICOM associations are
// considered as closed by the Orthanc SCU (client) if the remote
// DICOM SCP (server) does not answer.
“DicomScuTimeout” : 10,

// The list of the known Orthanc peers
“OrthancPeers” : {
/**

  • Each line gives the base URL of an Orthanc peer, possibly
  • followed by the username/password pair (if the password
  • protection is enabled on the peer).
    **/
    // “peer” : [ “http://127.0.0.1:8043/”, “alice”, “alicePassword” ]
    // “peer2” : [ “http://127.0.0.1:8044/” ]

/**

  • This is another, more advanced format to define Orthanc
  • peers. It notably allows to specify a HTTPS client certificate
  • in the PEM format (as in the “–cert” option of curl), or to
  • enable PKCS#11 authentication for smart cards.
    **/
    // “peer” : {
    // “Url” : “http://127.0.0.1:8043/”,
    // “Username” : “alice”,
    // “Password” : “alicePassword”,
    // “CertificateFile” : “client.crt”,
    // “CertificateKeyFile” : “client.key”,
    // “CertificateKeyPassword” : “certpass”,
    // “Pkcs11” : false
    // }
    },

// Parameters of the HTTP proxy to be used by Orthanc. If set to the
// empty string, no HTTP proxy is used. For instance:
// “HttpProxy” : “192.168.0.1:3128”
// “HttpProxy” : “proxyUser:proxyPassword@192.168.0.1:3128”
“HttpProxy” : “”,

// Set the timeout for HTTP requests issued by Orthanc (in seconds).
“HttpTimeout” : 10,

// Enable the verification of the peers during HTTPS requests. This
// option must be set to “false” if using self-signed certificates.
// Pay attention that setting this option to “false” results in
// security risks!
// Reference: http://curl.haxx.se/docs/sslcerts.html
“HttpsVerifyPeers” : true,

// Path to the CA (certification authority) certificates to validate
// peers in HTTPS requests. From curl documentation (“–cacert”
// option): “Tells curl to use the specified certificate file to
// verify the peers. The file may contain multiple CA
// certificates. The certificate(s) must be in PEM format.”
“HttpsCACertificates” : “”,

/**

  • Advanced options
    **/

// Dictionary of symbolic names for the user-defined metadata. Each
// entry must map an unique string to an unique number between 1024
// and 65535. Reserved values:
// - The Orthanc whole-slide imaging plugin uses metadata 4200
“UserMetadata” : {
// “Sample” : 1024
},

// Dictionary of symbolic names for the user-defined types of
// attached files. Each entry must map an unique string to an unique
// number between 1024 and 65535. Optionally, a second argument can
// provided to specify a MIME content type for the attachment.
“UserContentType” : {
// “sample” : 1024
// “sample2” : [ 1025, “application/pdf” ]
},

// Number of seconds without receiving any instance before a
// patient, a study or a series is considered as stable.
“StableAge” : 60,

// By default, Orthanc compares AET (Application Entity Titles) in a
// case-insensitive way. Setting this option to “true” will enable
// case-sensitive matching.
“StrictAetComparison” : false,

// When the following option is “true”, the MD5 of the DICOM files
// will be computed and stored in the Orthanc database. This
// information can be used to detect disk corruption, at the price
// of a small performance overhead.
“StoreMD5ForAttachments” : true,

// The maximum number of results for a single C-FIND request at the
// Patient, Study or Series level. Setting this option to “0” means
// no limit.
“LimitFindResults” : 0,

// The maximum number of results for a single C-FIND request at the
// Instance level. Setting this option to “0” means no limit.
“LimitFindInstances” : 0,

// The maximum number of active jobs in the Orthanc scheduler. When
// this limit is reached, the addition of new jobs is blocked until
// some job finishes.
“LimitJobs” : 10,

// If this option is set to “false”, Orthanc will not log the
// resources that are exported to other DICOM modalities of Orthanc
// peers in the URI “/exports”. This is useful to prevent the index
// to grow indefinitely in auto-routing tasks.
“LogExportedResources” : true,

// Enable or disable HTTP Keep-Alive (deprecated). Set this option
// to “true” only in the case of high HTTP loads.
“KeepAlive” : false,

// If this option is set to “false”, Orthanc will run in index-only
// mode. The DICOM files will not be stored on the drive. Note that
// this option might prevent the upgrade to newer versions of Orthanc.
“StoreDicom” : true,

// DICOM associations are kept open as long as new DICOM commands
// are issued. This option sets the number of seconds of inactivity
// to wait before automatically closing a DICOM association. If set
// to 0, the connection is closed immediately.
“DicomAssociationCloseDelay” : 5,

// Maximum number of query/retrieve DICOM requests that are
// maintained by Orthanc. The least recently used requests get
// deleted as new requests are issued.
“QueryRetrieveSize” : 10,

// When handling a C-Find SCP request, setting this flag to “true”
// will enable case-sensitive match for PN value representation
// (such as PatientName). By default, the search is
// case-insensitive, which does not follow the DICOM standard.
“CaseSensitivePN” : false,

// Configure PKCS#11 to use hardware security modules (HSM) and
// smart cards when carrying on HTTPS client authentication.
/**
“Pkcs11” : {
“Module” : “/usr/local/lib/libbeidpkcs11.so”,
“Module” : “C:/Windows/System32/beidpkcs11.dll”,
“Pin” : “1234”,
“Verbose” : true
}
**/

// If set to “true”, Orthanc will still handle “SOP Classes in
// Study” (0008,0062) in C-FIND requests, even if the “SOP Class
// UID” metadata is not available in the database (which is the case
// if the DB was previously used by Orthanc <= 1.1.0). This option
// is turned off by default, as it requires intensive accesses to
// the hard drive.
“AllowFindSopClassesInStudy” : false,

// If set to “false”, Orthanc will not load its default dictionary
// of private tags. This might be necessary if you cannot import a
// DICOM file encoded using the Implicit VR Endian transfer syntax,
// and containing private tags: Such an import error might stem from
// a bad dictionary. You can still list your private tags of
// interest in the “Dictionary” configuration option below.
“LoadPrivateDictionary” : true,

// Register a new tag in the dictionary of DICOM tags that are known
// to Orthanc. Each line must contain the tag (formatted as 2
// hexadecimal numbers), the value representation (2 upcase
// characters), a nickname for the tag, possibly the minimum
// multiplicity (> 0 with defaults to 1), possibly the maximum
// multiplicity (0 means arbitrary multiplicity, defaults to 1), and
// possibly the Private Creator (for private tags).
“Dictionary” : {
// “0014,1020” : [ “DA”, “ValidationExpiryDate”, 1, 1 ]
// “00e1,10c2” : [ “UI”, “PET-CT Multi Modality Name”, 1, 1, “ELSCINT1” ]
// “7053,1003” : [ “ST”, “Original Image Filename”, 1, 1, “Philips PET Private Group” ]
// “2001,5f” : [ “SQ”, “StackSequence”, 1, 1, “Philips Imaging DD 001” ]
}
}

`

appropriate ip-addressing, AEtitles, ports, DicomModalities
eFilm:

on both sides The C-Echo has succeeded!
the search works, I can see studies list! that testifies about correctly configuration of the nodes
but when I try to “View”, “Retrieve” this study transference does not work
eFilm:

Orthanc.log:

`

W0705 14:26:33.191019 main.cpp:1238] Orthanc version: 1.2.0
W0705 14:26:33.191108 main.cpp:1095] Performance warning: Non-release build, runtime debug assertions are turned on
W0705 14:26:33.195004 OrthancInitialization.cpp:173] Scanning folder “/etc/orthanc/” for configuration files
W0705 14:26:33.195157 OrthancInitialization.cpp:125] Reading the configuration from: “/etc/orthanc/webviewer.json”
W0705 14:26:33.195448 OrthancInitialization.cpp:125] Reading the configuration from: “/etc/orthanc/serve-folders.json”
W0705 14:26:33.195597 OrthancInitialization.cpp:125] Reading the configuration from: “/etc/orthanc/orthanc.json”
W0705 14:26:33.196455 OrthancInitialization.cpp:125] Reading the configuration from: “/etc/orthanc/dicomweb.json”
W0705 14:26:33.196619 OrthancInitialization.cpp:125] Reading the configuration from: “/etc/orthanc/worklists.json”
W0705 14:26:33.225601 FromDcmtkBridge.cpp:141] Loading the external DICOM dictionary “/usr/share/libdcmtk8/dicom.dic”
W0705 14:26:33.250721 FromDcmtkBridge.cpp:141] Loading the external DICOM dictionary “/usr/share/libdcmtk8/private.dic”
W0705 14:26:33.270296 OrthancInitialization.cpp:488] Registering JPEG Lossless codecs
W0705 14:26:33.270353 OrthancInitialization.cpp:493] Registering JPEG codecs
W0705 14:26:33.287453 main.cpp:632] Loading plugin(s) from: /usr/share/orthanc/plugins/
W0705 14:26:33.287865 PluginsManager.cpp:268] Registering plugin ‘worklists’ (version 1.2.0)
W0705 14:26:33.287901 PluginsManager.cpp:167] Sample worklist plugin is initializing
W0705 14:26:33.288172 PluginsManager.cpp:167] Worklists server is disabled by the configuration file
W0705 14:26:33.319937 PluginsManager.cpp:268] Registering plugin ‘dicom-web’ (version 0.3)
W0705 14:26:33.320234 PluginsManager.cpp:167] URI to the DICOMweb REST API: /dicom-web/
W0705 14:26:33.320666 PluginsManager.cpp:167] URI to the WADO-URI API: /wado
W0705 14:26:33.321070 PluginsManager.cpp:268] Registering plugin ‘serve-folders’ (version 1.2.0)
W0705 14:26:33.321359 PluginsManager.cpp:167] ServeFolders: Empty configuration file: No additional folder will be served!
W0705 14:26:33.322293 PluginsManager.cpp:268] Registering plugin ‘web-viewer’ (version 2.2)
W0705 14:26:33.322321 PluginsManager.cpp:167] Initializing the Web viewer
W0705 14:26:33.322632 PluginsManager.cpp:167] Web viewer using 4 threads for the decoding of the DICOM images
W0705 14:26:33.322656 PluginsManager.cpp:167] Storing the cache of the Web viewer in folder: /var/lib/orthanc/db-v6/WebViewerCache
W0705 14:26:33.324908 PluginsManager.cpp:167] Web viewer using a cache of 100 MB
W0705 14:26:33.324945 PluginsManager.cpp:167] Using GDCM instead of the DICOM decoder that is built in Orthanc
W0705 14:26:33.325058 OrthancInitialization.cpp:986] SQLite index directory: “/var/lib/orthanc/db-v6”
W0705 14:26:33.325194 OrthancInitialization.cpp:1056] Storage directory: “/var/lib/orthanc/db-v6”
W0705 14:26:33.326453 HttpClient.cpp:685] HTTPS will use the CA certificates from this file: /etc/orthanc/
W0705 14:26:33.327488 ServerScheduler.cpp:134] The server scheduler has started
W0705 14:26:33.328051 LuaContext.cpp:103] Lua says: Lua toolbox installed
W0705 14:26:33.328171 ServerContext.cpp:181] Disk compression is disabled
W0705 14:26:33.328202 ServerIndex.cpp:1402] No limit on the number of stored patients
W0705 14:26:33.328452 ServerIndex.cpp:1419] No limit on the size of the storage area
W0705 14:26:33.329509 main.cpp:822] DICOM server listening with AET ORTHANC on port: 4242
W0705 14:26:33.329569 MongooseServer.cpp:1027] HTTP compression is enabled
W0705 14:26:33.338227 main.cpp:757] HTTP server listening on port: 8042
W0705 14:26:33.338277 main.cpp:644] Orthanc has started
W0705 14:27:58.073488 OrthancMoveRequestHandler.cpp:178] Move-SCU request received for AET “EFILM”
E0705 14:28:58.168069 DicomUserConnection.cpp:166] DicomUserConnection: Peer aborted Association (or never connected)
E0705 14:28:58.168814 MoveScp.cpp:221] IMoveRequestHandler Failed: Error in the network protocol

`

help me please understand what there can be a problem?

Hi Alex,

I would say that eFilm does not allow Orthanc to connect to it. When you issue a C-Move from eFilm to Orthanc, it actually orders Orthanc to create a new DICOM association to eFilm. This steps seems to fail. Make sure that you have allowed Orthanc to open incoming connections on eFilm.
The fact that C-ECHO works from Orthanc to eFilm is not sufficient because usually, AETs and IPs are not verified during C-ECHO.

Br

Alain

Hi Alex,

I’m getting the same issue as you using eFilm 3.3 Vet but only from specific DICOM syntaxes (JPEG-LS in my case). Other studies are opening fine and the same studies that are causing errors are working in other viewers (RADIANT). If you’re getting the same thing as me, you should see this in the console if you start Orthanc from the command line when you try to open the study from eFilm along with the usual “Error in the network protocol” error in the log file:

W: DIMSE Warning: (GVMIEXT,CVRS_DELL1650-01): sendMessage: unable to convert dataset from ‘JPEG-LS Lossless’ transfer syntax to ‘Little Endian Explicit’

I’m just about to contact Sebastien Jodogne regarding this since I deactivated the JPEG-LS syntax from the accepted transfer syntaxes but I’m still receiving them for some weird reason…

I’ll get back to you if I learn anything. Likewise, if you learn anything new, please get back to me. :slight_smile:

Cheers and thanks,
Mat M.

Hello,

From what I understand, your eFilm client does not accept receiving DICOM files embedding a “JPEG-LS Lossless” image.

As a consequence, it asks Orthanc to transcode the “JPEG-LS Lossless” transfer syntax to a plain, uncompressed DICOM image (aka “Little Endian Explicit”). However, because Orthanc currently has no such transcoding capabilities, the transfer fails.

It seems really strange to me that a professional DICOM viewer such as eFilm has no support to decode JPEG-LS by itself.

I hope this clarifies things.

Regards,
Sébastien-

Hello Sébastien,

First of all, thank you very much for all the work you put into Orthanc. I’ve only been working with it for about a week but it really has alot of potential!

Second, could you take a look at the other post I made here please? → https://groups.google.com/forum/#!topic/orthanc-users/NvEeNCbrvd8

In short, I tried disabling the JPEG-LS syntax but we’re still receiving them for some reason unknown to me. Did I disable the right thing?

Thanks!
Mat M.

Hello,
First of all, thanks to all who are interested in this question.
so
did some tests:

  1. I imported some study from KT on Dicom,
    then uploaded this study using a Radiant and saved on a PC in the dicom format,

here, I understand that the radiant appeared like a converter.
then, I deleted this study from server.
Next, I download saved study via the web on the server
and after, launching an efilm, I find and download this study. Everything is working.

  1. In order to confirm the previous test, I saved one of the studies with old
    angiographic system, efil sees and downloads it without problems

a conclusion how further to be?
wait when the merge will release a version that will support JpegLossless?

Hi Alex,

Waiting for merge to support JpegLossless is indeed the “best solution” but who knows how long that will take them and whether or not they’ll actually do it.

A better solution short term would be to disable Orthanc from receiving JpegLossless for studies intended to be viewed in eFilm. You do this by setting the following option to “false”:

// The transfer syntaxes that are accepted by Orthanc C-Store SCP

“DeflatedTransferSyntaxAccepted” : true,

“JpegTransferSyntaxAccepted” : true,

“Jpeg2000TransferSyntaxAccepted” : true,

“JpegLosslessTransferSyntaxAccepted” : false,

“JpipTransferSyntaxAccepted” : true,

“Mpeg2TransferSyntaxAccepted” : true,

“RleTransferSyntaxAccepted” : true,

This first solution however, currently does not work and was fixed by Sebastien in the code which will be released with version 1.4.2 for which no release date is currently planned as reported in my thread: https://groups.google.com/forum/#!topic/orthanc-users/NvEeNCbrvd8

However, if you’re building Orthanc from source, you could implement the patch yourself using the bitbucket link provided by Sébastien → https://bitbucket.org/sjodogne/orthanc/commits/e7a10626645f55286c34e9932a73672c69126408

Another solution would be to filter on the sending/receiving AET using the REST API or a LUA script to transcode incoming images to something else that eFilm supports (this last point is still an unknown on my end, if you manage to get an official list of supported Transfer Syntaxes from Merge, please let me know! :)). If you do go this route, you should take a look at the following sample script for transcoding to Jpeg2000 which should help you make your own → https://bitbucket.org/sjodogne/orthanc/src/default/Resources/Samples/Lua/AutomatedJpeg2kCompression.lua?fileviewer=file-view-default

Hope this helps!
Mat

Hello again Alex,

I finally managed to get a list, although all they could provide me is a REALLY old (2007) DICOM conformance document for version 3.0 but I’m assuming it hasn’t changed since.

Here is the interesting part of the document:

JPEG2000 should work, fortunately enough. This means that, until 1.4.2 is released, the LUA script to transcode images to JPEG2000 should also work. This also means that they currently do not support JPEG-LS, as expected.

Hope this helps!
Mat