c-Store failing even though c-Echo is successful

echo:
I1207 05:58:17.028517 MongooseServer.cpp:726] GET /system
I1207 05:58:17.114411 MongooseServer.cpp:726] GET /modalities
I1207 05:58:18.510131 MongooseServer.cpp:726] POST /modalities/AGE-RELATED-ATROPHY-REPORT/echo
I1207 05:58:18.510403 DicomUserConnection.cpp:889] Opening a DICOM SCU connection from AET "ORTHANC" to AET "neuroquant_age" on host xx.xxx.xx.xxx:4242 (manufacturer: Generic)
I1207 05:58:18.694446 ReusableDicomUserConnection.cpp:94] Closing the global SCU connection after timeout

c-store:
I1207 05:52:58.508044 MongooseServer.cpp:726] GET /system
I1207 05:52:58.589449 MongooseServer.cpp:726] GET /patients
I1207 05:53:00.629044 MongooseServer.cpp:726] GET /system
I1207 05:53:00.708836 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028
I1207 05:53:00.788703 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028/studies
I1207 05:53:00.878184 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028/protected
I1207 05:53:01.789552 MongooseServer.cpp:726] GET /system
I1207 05:53:01.868100 MongooseServer.cpp:726] GET /studies/8074b5b7-43976d9a-28e58dec-b002d3ca-df4bfc34
I1207 05:53:01.958039 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028
I1207 05:53:02.040215 MongooseServer.cpp:726] GET /studies/8074b5b7-43976d9a-28e58dec-b002d3ca-df4bfc34/series
I1207 05:53:06.900914 MongooseServer.cpp:726] GET /system
I1207 05:53:06.988287 MongooseServer.cpp:726] GET /series/35691131-781f17c6-812c0fff-4d40ff59-b0092706
I1207 05:53:07.089875 MongooseServer.cpp:726] GET /studies/8074b5b7-43976d9a-28e58dec-b002d3ca-df4bfc34
I1207 05:53:07.171477 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028
I1207 05:53:07.258558 MongooseServer.cpp:726] GET /series/35691131-781f17c6-812c0fff-4d40ff59-b0092706/instances
I1207 05:53:09.368221 MongooseServer.cpp:726] GET /modalities
I1207 05:53:09.449555 MongooseServer.cpp:726] GET /peers
I1207 05:53:10.619103 MongooseServer.cpp:726] POST /modalities/AGE-RELATED-ATROPHY-REPORT/store
I1207 05:53:10.624404 ServerScheduler.cpp:189] New job submitted (HTTP request: Store-SCU to peer "AGE-RELATED-ATROPHY-REPORT")
I1207 05:53:10.624559 DicomUserConnection.cpp:889] Opening a DICOM SCU connection from AET "ORTHANC" to AET "neuroquant_age" on host xx.xxx.xx.xxx:4242 (manufacturer: Generic)
I1207 05:53:10.630489 StoreScuCommand.cpp:61] Sending resource 6cfd8c43-a066ecdb-acd793b4-60c229a6-c7b25c8c to modality "neuroquant_age"
I1207 05:53:10.630641 FilesystemStorage.cpp:154] Reading attachment "9c7882cd-c1c6-411d-b321-1a80def1c19f" of "DICOM" content type
E1207 05:53:10.654839 DicomUserConnection.cpp:165] DicomUserConnection: Peer aborted Association (or never connected)
E1207 05:53:10.655420 StoreScuCommand.cpp:78] Unable to forward to a modality in a Lua script (instance 6cfd8c43-a066ecdb-acd793b4-60c229a6-c7b25c8c): Error in the network protocol
E1207 05:53:10.655635 ServerScheduler.cpp:122] Job has failed (HTTP request: Store-SCU to peer "AGE-RELATED-ATROPHY-REPORT")
I1207 05:53:10.755696 ReusableDicomUserConnection.cpp:94] Closing the global SCU connection after timeout

Hi,
I am trying to send from latest orthanc, running inside docker on ubuntu, to a PACS server running on Windows. I can successfully complete a c-Echo, but the c-Store fails saying that there is an error in the network protocol. I have followed the troubleshooting guide and do not know how to debug further, so if you could point me in the right direction, that would be great.
Thanks

I am trying to send from latest orthanc, running inside docker on ubuntu, to a PACS server running on Windows. I can successfully complete a c-Echo, but the c-Store fails saying that there is an error in the network protocol. I have followed the troubleshooting guide and do not know how to debug further, so if you could point me in the right direction, that would be great.

As written in the troubleshooting guide, this issue most probably reflects the fact that your PACS server does not know about your Orthanc instance:
http://book.orthanc-server.com/faq/dicom.html

http://book.orthanc-server.com/dicom-guide.html#dicom-move

In other words, for a DICOM query/retrieve request between modality “A” and PACS “B” to succeed, “A” must know about “B” and “B” must know about “A”. In your case, the second part of the condition is most probably not true.

HTH,
Sébastien-

I am seeing this issue with c-Store, not c-Move. I don't think the same
issue applies.

Well, C-Store and C-Move requires the same kind of configuration. Do you mean you’ve been able to issue a C-Move and not a C-Store ?

Could you provide us with your configuration file, Orthanc IP address, PACS AET, IP and port.
On your PACS, what did you enter to configure the Orthanc modality ?
On your PACS, are your sure this modality is allowed to perform C-Store ?

No, I have not tried to perform a C-Move. Only a C-Store via the web ui.

Here is the configuration file:

{
/**

  • 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 inside Docker”,

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

// 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”,

// 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”, “/usr/local/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. 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” : true,

// The list of the registered users. Because Orthanc uses HTTP
// Basic Authentication, the passwords are stored as plain text.
“RegisteredUsers” : {
“orthanc” : “XXXXXXXXXXX”
// “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”.
    **/
    “AGE-RELATED-ATROPHY-REPORT” : [ “neuroquant_age”, “XX.XXX.XX.XXX”, 4242 ],
    “BRAIN-DEVELOPMENT-REPORT” : [ “neuroquant_bd”, “XX.XXX.XX.XXX”, 4242 ],
    “HUIPPOCAMPAL-VOLUME-ASYMMETRY-REPORT” : [ “neuroquant_asym”, “XX.XXX.XX.XXX”, 4242 ],
    “MULTI-STRUCTURE-ATROPHY-REPORT” : [ “neuroquant_msa”, “XX.XXX.XX.XXX”, 4242 ],
    “TRIAGE-BRAIN-ATROPHY-REPORT” : [ “neuroquant_tba”, “XX.XXX.XX.XXX”, 4242 ]

/**

  • 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.
    **/
    // “clearcanvas” : [ “CLEARCANVAS”, “192.168.1.1”, 104, “ClearCanvas” ]
    },

// 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.
“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” : 0,

// 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 handle “SOP Classes in Study”
// (0008,0062) in C-FIND requests. This option is turned off by
// default, as it requires intensive accesses to the hard drive.
“AllowFindSopClassesInStudy” : false,

// 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), and possibly the maximum
// multiplicity (0 means arbitrary multiplicity, defaults to 1).
“Dictionary” : {
// “0014,1020” : [ “DA”, “ValidationExpiryDate”, 1, 1 ]
}
}

I do not feel comfortable sharing IP’s.
Here is the configuration of the PACS server. It is more of a proxy (CTXNode) provided by CortechLabs. I have also attached a usage guide they provided. From what I see, it makes sense that they would expect a C-Store
Inline image 1

Thanks!

Hello,

No, I have not tried to perform a C-Move. Only a C-Store via the web ui. […] Here is the configuration of the PACS server. It is more of a proxy (CTXNode) provided by CortechLabs. I have also attached a usage guide they provided. From what I see, it makes sense that they would expect a C-Store

Please also provide the logs of Orthanc (cf. Collecting logs — Orthanc Book documentation) and the logs of your CTXNode.

Sébastien-

I can not determine how to retrieve logs from CTXNode, I will ask them and get back to you if I can find any.

Here are the Orthanc Logs:

root@ip-172-31-32-57:~# docker logs orthanc
W1207 05:52:09.195584 main.cpp:1235] Orthanc version: mainline (20161207T012352)
W1207 05:52:09.198087 OrthancInitialization.cpp:173] Scanning folder “/etc/orthanc” for configuration files
W1207 05:52:09.198325 OrthancInitialization.cpp:125] Reading the configuration from: “/etc/orthanc/orthanc.json”
W1207 05:52:09.200222 FromDcmtkBridge.cpp:141] Loading the external DICOM dictionary “/usr/share/libdcmtk2/dicom.dic”
W1207 05:52:09.208372 FromDcmtkBridge.cpp:141] Loading the external DICOM dictionary “/usr/share/libdcmtk2/private.dic”
W1207 05:52:09.215190 OrthancInitialization.cpp:488] Registering JPEG Lossless codecs
W1207 05:52:09.215383 OrthancInitialization.cpp:493] Registering JPEG codecs
W1207 05:52:09.222794 main.cpp:632] Loading plugin(s) from: /usr/share/orthanc/plugins
I1207 05:52:09.222926 PluginsManager.cpp:287] Scanning folder /usr/share/orthanc/plugins for plugins
W1207 05:52:09.223071 main.cpp:632] Loading plugin(s) from: /usr/local/share/orthanc/plugins
I1207 05:52:09.223189 PluginsManager.cpp:287] Scanning folder /usr/local/share/orthanc/plugins for plugins
I1207 05:52:09.223347 PluginsManager.cpp:310] Found a shared library: “/usr/local/share/orthanc/plugins/libServeFolders.so”
W1207 05:52:09.224399 PluginsManager.cpp:268] Registering plugin ‘serve-folders’ (version mainline)
I1207 05:52:09.224539 OrthancPlugins.cpp:1010] Plugin has registered a REST callback witout mutual exclusion on: /app/plugin-serve-folders.html
W1207 05:52:09.225201 PluginsManager.cpp:167] ServeFolders: Empty configuration file: No additional folder will be served!
I1207 05:52:09.225307 PluginsManager.cpp:310] Found a shared library: “/usr/local/share/orthanc/plugins/libModalityWorklists.so”
W1207 05:52:09.226123 PluginsManager.cpp:268] Registering plugin ‘worklists’ (version mainline)
W1207 05:52:09.226223 PluginsManager.cpp:167] Sample worklist plugin is initializing
W1207 05:52:09.226402 PluginsManager.cpp:167] Worklists server is disabled, no suitable configuration section was provided
W1207 05:52:09.226491 OrthancInitialization.cpp:986] SQLite index directory: “/var/lib/orthanc/db”
W1207 05:52:09.227231 OrthancInitialization.cpp:1056] Storage directory: “/var/lib/orthanc/db”
I1207 05:52:09.228160 DatabaseWrapper.cpp:306] Version of the Orthanc database: 6
W1207 05:52:09.247711 LuaContext.cpp:103] Lua says: Lua toolbox installed
W1207 05:52:09.247885 HttpClient.cpp:680] No certificates are provided to validate peers, set “HttpsCACertificates” if you need to do HTTPS requests
I1207 05:52:09.247982 HttpClient.cpp:151] Setting the default timeout for HTTP client connections: 10 seconds
I1207 05:52:09.248055 HttpClient.cpp:135] Setting the default proxy for HTTP client connections:
I1207 05:52:09.248120 DicomUserConnection.cpp:1201] Default timeout for DICOM connections if Orthanc acts as SCU (client): 10 seconds (0 = no timeout)
W1207 05:52:09.248188 ServerContext.cpp:181] Disk compression is disabled
I1207 05:52:09.248229 ServerContext.cpp:495] Storing MD5 for attachments: yes
W1207 05:52:09.248300 ServerIndex.cpp:1392] No limit on the number of stored patients
W1207 05:52:09.248353 ServerIndex.cpp:1409] No limit on the size of the storage area
I1207 05:52:09.248720 DicomServer.cpp:125] Setting timeout for DICOM connections if Orthanc acts as SCP (server): 30 seconds (0 = no timeout)
W1207 05:52:09.249315 main.cpp:822] DICOM server listening with AET ORTHANC on port: 4242
W1207 05:52:09.249424 MongooseServer.cpp:887] This version of OpenSSL is vulnerable to the Heartbleed exploit
I1207 05:52:09.249479 MongooseServer.cpp:1001] HTTP keep alive is disabled
W1207 05:52:09.249552 MongooseServer.cpp:1027] HTTP compression is enabled
W1207 05:52:09.249677 ServerScheduler.cpp:134] The server scheduler has started
W1207 05:52:09.250779 main.cpp:757] HTTP server listening on port: 8042
W1207 05:52:09.250995 main.cpp:644] Orthanc has started
I1207 05:52:09.251057 ServerIndex.cpp:1877] Starting the monitor for stable resources (stable age = 60)
I1207 05:52:09.251162 DicomServer.cpp:63] DICOM server started
I1207 05:52:09.252002 ServerIndex.cpp:363] Starting the database flushing thread (sleep = 10)
I1207 05:52:54.796376 MongooseServer.cpp:726] GET /system
I1207 05:52:54.881588 MongooseServer.cpp:726] GET /modalities
I1207 05:52:57.047582 MongooseServer.cpp:726] POST /modalities/AGE-RELATED-ATROPHY-REPORT/echo
I1207 05:52:57.047841 DicomUserConnection.cpp:889] Opening a DICOM SCU connection from AET “ORTHANC” to AET “neuroquant_age” on host XX.XXX.XX.XXX:4242 (manufacturer: Generic)
I1207 05:52:57.124277 ReusableDicomUserConnection.cpp:94] Closing the global SCU connection after timeout
I1207 05:52:58.508044 MongooseServer.cpp:726] GET /system
I1207 05:52:58.589449 MongooseServer.cpp:726] GET /patients
I1207 05:53:00.629044 MongooseServer.cpp:726] GET /system
I1207 05:53:00.708836 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028
I1207 05:53:00.788703 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028/studies
I1207 05:53:00.878184 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028/protected
I1207 05:53:01.789552 MongooseServer.cpp:726] GET /system
I1207 05:53:01.868100 MongooseServer.cpp:726] GET /studies/8074b5b7-43976d9a-28e58dec-b002d3ca-df4bfc34
I1207 05:53:01.958039 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028
I1207 05:53:02.040215 MongooseServer.cpp:726] GET /studies/8074b5b7-43976d9a-28e58dec-b002d3ca-df4bfc34/series
I1207 05:53:06.900914 MongooseServer.cpp:726] GET /system
I1207 05:53:06.988287 MongooseServer.cpp:726] GET /series/35691131-781f17c6-812c0fff-4d40ff59-b0092706
I1207 05:53:07.089875 MongooseServer.cpp:726] GET /studies/8074b5b7-43976d9a-28e58dec-b002d3ca-df4bfc34
I1207 05:53:07.171477 MongooseServer.cpp:726] GET /patients/252ab8d0-b40538a7-a134472d-0f42f307-a14bb028
I1207 05:53:07.258558 MongooseServer.cpp:726] GET /series/35691131-781f17c6-812c0fff-4d40ff59-b0092706/instances
I1207 05:53:09.368221 MongooseServer.cpp:726] GET /modalities
I1207 05:53:09.449555 MongooseServer.cpp:726] GET /peers
I1207 05:53:10.619103 MongooseServer.cpp:726] POST /modalities/AGE-RELATED-ATROPHY-REPORT/store
I1207 05:53:10.624404 ServerScheduler.cpp:189] New job submitted (HTTP request: Store-SCU to peer “AGE-RELATED-ATROPHY-REPORT”)
I1207 05:53:10.624559 DicomUserConnection.cpp:889] Opening a DICOM SCU connection from AET “ORTHANC” to AET “neuroquant_age” on host XX.XXX.XX.XXX:4242 (manufacturer: Generic)
I1207 05:53:10.630489 StoreScuCommand.cpp:61] Sending resource 6cfd8c43-a066ecdb-acd793b4-60c229a6-c7b25c8c to modality “neuroquant_age”
I1207 05:53:10.630641 FilesystemStorage.cpp:154] Reading attachment “9c7882cd-c1c6-411d-b321-1a80def1c19f” of “DICOM” content type
E1207 05:53:10.654839 DicomUserConnection.cpp:165] DicomUserConnection: Peer aborted Association (or never connected)
E1207 05:53:10.655420 StoreScuCommand.cpp:78] Unable to forward to a modality in a Lua script (instance 6cfd8c43-a066ecdb-acd793b4-60c229a6-c7b25c8c): Error in the network protocol
E1207 05:53:10.655635 ServerScheduler.cpp:122] Job has failed (HTTP request: Store-SCU to peer “AGE-RELATED-ATROPHY-REPORT”)
I1207 05:53:10.755696 ReusableDicomUserConnection.cpp:94] Closing the global SCU connection after timeout

Hard to say anything without the logs from CTXNode. The important part of the Orthanc log is:

1207 05:53:10.624404 ServerScheduler.cpp:189] New job submitted (HTTP request: Store-SCU to peer “AGE-RELATED-ATROPHY-REPORT”)
I1207 05:53:10.624559 DicomUserConnection.cpp:889] Opening a DICOM SCU connection from AET “ORTHANC” to AET “neuroquant_age” on host XX.XXX.XX.XXX:4242 (manufacturer: Generic)
E1207 05:53:10.654839 DicomUserConnection.cpp:165] DicomUserConnection: Peer aborted Association (or never connected)

The important part of the Orthanc configuration is:

“DicomModalities” : {
“AGE-RELATED-ATROPHY-REPORT” : [ “neuroquant_age”, “XX.XXX.XX.XXX”, 4242 ]

}

Are you sure that “neuroquant_age” is really the AET of CTXNode? This is a strange AET name, as it should be in uppercase. Haven’t you swapped the AET of the modality, with the symbolic name assigned to the modality in Orthanc? In other words, shouldn’t you write:

“DicomModalities” : {
“neuroquant_age” : [ “AGE-RELATED-ATROPHY-REPORT”, “XX.XXX.XX.XXX”, 4242 ]
}

Also, it is strange that the AET of CTXNode is 4242 (the DICOM port used by Orthanc). Shouldn’t it be set to 104?

Sébastien-

As per Alain’s suggestion, the new modality config is:
“neuroquant-age” : [ “AGE-RELATED-ATROPHY-REPORT”, “XX.XXX.XX.XXX”, 4242 ],

This actually seems to have helped:

I1208 09:13:28.801961 CommandDispatcher.cpp:490] Association Received from AET neuroquant on IP XX.XXX.XX.XXX

I1208 09:13:28.802462 CommandDispatcher.cpp:688] Association Acknowledged (Max Send PDV: 16372)

I1208 09:13:28.802569 CommandDispatcher.cpp:690] (but no valid presentation contexts)

I1208 09:13:30.466041 CommandDispatcher.cpp:891] DUL Peer Requested Release

I1208 09:13:30.466225 CommandDispatcher.cpp:898] Association Release

I1208 09:13:45.106914 MongooseServer.cpp:726] GET /modalities

I1208 09:13:45.183660 MongooseServer.cpp:726] GET /peers

I1208 09:13:47.649850 MongooseServer.cpp:726] POST /modalities/neuroquant-age/store

I1208 09:13:47.655347 ServerScheduler.cpp:189] New job submitted (HTTP request: Store-SCU to peer “neuroquant-age”)

I1208 09:13:47.655554 DicomUserConnection.cpp:889] Opening a DICOM SCU connection from AET “ORTHANC” to AET “AGE-RELATED-ATROPHY-REPORT” on host XX.XXX.XX.XXX:4242 (manufacturer: Generic)

I1208 09:13:48.231308 StoreScuCommand.cpp:61] Sending resource 6cfd8c43-a066ecdb-acd793b4-60c229a6-c7b25c8c to modality “AGE-RELATED-ATROPHY-REPORT”

I1208 09:13:48.231646 FilesystemStorage.cpp:154] Reading attachment “9c7882cd-c1c6-411d-b321-1a80def1c19f” of “DICOM” content type

E1208 09:13:48.447454 DicomUserConnection.cpp:165] DicomUserConnection: Peer aborted Association (or never connected)

E1208 09:13:48.448105 StoreScuCommand.cpp:78] Unable to forward to a modality in a Lua script (instance 6cfd8c43-a066ecdb-acd793b4-60c229a6-c7b25c8c): Error in the network protocol

E1208 09:13:48.448312 ServerScheduler.cpp:122] Job has failed (HTTP request: Store-SCU to peer “neuroquant-age”)

I1208 09:13:48.548391 ReusableDicomUserConnection.cpp:94] Closing the global SCU connection after timeout

Regarding using 4242 for CTXNode… I originally was using the default which was 4567, but after reading https://groups.google.com/forum/#!topic/orthanc-users/ciBldRxKeU0, I changed it to 4242, and got a bit farther.

Regarding the AETitle, I am just following the table here from their setup guide:
Inline image 1

From what I understand from this image:

Inline image 1

You should use:

“neuroquant-age” : [ “neuroquant-age”, “XX.XXX.XX.XXX”, 4567 ],

If this does not help, you have to get in touch with the network administrator of your CTXNode. He is the only one to have full knowledge of all the network topology. It is for example possible that a firewall is blocking your connections from Orthanc to CTXNode. As far as we are concerned, we cannot remotely provide any additional hint.

Sébastien-

Tried that but no luck… I will follow up with Cortech. Thanks a bunch for taking the time to debug and being very responsive and helpful. I am enjoying getting a handle on Orthanc. :slight_smile:

I'm trying to help Haydn figure this out - we have looked at all the configuration settings and they are correctly set as:

Orthanc:
IP: localhost
Port:4242
AET: ORTHANC

CTXNode:
IP: localhost (testing on same machine at this point)
Port:4567
AET: neuroquant_age

Remote modality settings on Orthanc:

"neuroquant-ctxnode" : [ "neuroquant_age", "localhost", 4567 ]

Can echo CTXNode from Orthanc successfully but when trying to send an MR study over we get the attached error (pretty much instantly). Log messages on the Orthanc side are:

E0106 16:38:20.034551 DicomUserConnection.cpp:166] DicomUserConnection: Peer aborted Association (or never connected)
E0106 16:38:20.050446 StoreScuCommand.cpp:86] Unable to forward to a modality in a Lua script (instance 91b9d396-cbf9846c-7d095904-67148e62-bd5300df): Error in the network protocol
E0106 16:38:20.055924 ServerScheduler.cpp:122] Job has failed (HTTP request: Store-SCU to peer "neuroquant-ctxnode")

On CTXNode there is no sign of a connection being made - nothing in the logs at all. tcpdump shows traffic to port 4567 however.

CTXNode can send to Orthanc.

Orthanc can send to a dummy server (dcmtk) on the same system and port.

Every other PACS, viewer etc we have ever tested can send to CTXNode (which uses dcm4chee to receive DICOM objects).

Seems like there is a network protocol incompatibility of some kind. What transfer syntax does Orthanc use by default when sending? Anything else you can think of?

Thanks,

Chris

Screen Shot 2017-01-06 at 4.38.25 PM.png

Have you properly defined Orthanc in the configuration of CTXNode? In DICOM, both software must about each other:
http://book.orthanc-server.com/faq/dicom.html

Double-check the AET, IP and port of Orthanc, as defined in the CTXNode configuration.

As of Orthanc 1.2.0, Orthanc never changes the transfer syntax of the files to be sent (no transcoding). Make sure that CTXNode supports the transfer syntax of your DICOM file.

Sébastien-