如何获取在 C-MOVE 调用期间未成功检索的所有 SOP 实例的列表?

How to get a list of all SOP instances that were not successfully retrieved during a C-MOVE call?

我正在使用 PyNetDicom 从 PACS 服务器下载 (C-MOVE) 图像。我已经实施了一个向 PACS 发送 C-MOVE 请求的 SCU,以及一个接收 C-STORE 请求的 SCP。

我下载整个研究,一次下载几千张 DICOM 图像。出于某种原因,我没有收到其中的一些。我从 C-MOVE 请求中得到的响应显示了有多少图像已成功发送,有多少图像发送失败(以及有多少正在处理中,加上任何警告)。

我不仅想知道有多少失败,还想知道哪些失败,这意味着我想获得失败的 SOP 实例 UID 列表。这是我的代码的相关部分:

# Not shown: Implementation of association (assoc) and making a dataset to query PACS (query_dataset)
responses = assoc.send_c_move(query_dataset, b'NAME_OF_STORAGE_SCP', StudyRootQueryRetrieveInformationModelMove)

for (status, identifier) in responses: 
    # This works
    remaining_operations = status.NumberOfRemainingOperations
    completed_operations = status.NumberOfCompletedOperations
    failed_operations = status.NumberOfFailedOperations
    warning_operations = status.NumberOfWarningOperations

    if identifier: 
        failed_UID_list = identifier.FailedSOPInstanceUIDList   # This does not work

这不起作用,标识符总是None,即使status.Status显示操作失败。我做错了什么,还是我关联的 PACS 不符合 DICOM 标准?

当您作为C-MOVE SCU时,无法获取失败实例的标识符(SOP实例UID)。

  1. 您可以使用 C-MOVE SCP 单独获取 details/logs(在 DICOM 之外)。
  2. 如果故障发生在您的 C-STORE SCP 上,请检查那里的日志或详细信息。如果故障发生在 C-STORE SCU(其他系统)上,这可能没有帮助,您需要再次与他们联系。

不完全是解决方案,但是,您可以在 C-MOVE 之前执行 SERIES 级别查询 (C-FIND),并提前获取要拉取的实例数 (NumberOfSeriesRelatedInstances)。但这只是一个计数;不是标识符。 STUDY 和 PATIENT 级别的查询也是如此。

存储承诺在这种情况下可能没有用,因为同样,您的系统上不存在实例;你不知道标识符。

使用图像级别查询(C-FIND),您可以传递系列实例 UID 并获取该系列的实例列表。但是,我遇到过一些也强制使用 SOP 实例 UID 的系统。如果您的其他系统支持此功能,您可以执行以下操作:

  • 一步一步做一个PATIENT、STUDY、SERIES和IMAGE级别的查询(C-FIND)。您可以参考答案了解更多详情。
  • 将输出存储在某处(内存列表或数据库或其他)。
  • 进行常规的 C-MOVE 并将收到的实例与存储的列表进行比较。无论缺少什么,都是您正在寻找的列表。

回答您的评论:

我错过了 Failed SOP Instance UID List (0008,0058) 标签。

C.4.2.1.4.2 Response Identifier Structure
The Failed SOP Instance UID List (0008,0058) specifies a list of UIDs of the C-STORE sub-operation SOP Instances for which this C-MOVE operation has failed. An Identifier in a C-MOVE response shall conditionally contain the Failed SOP Instance UID List (0008,0058) based on the C-MOVE response status value. If no C-STORE sub-operation failed, Failed SOP Instance UID List (0008,0058) is absent and therefore no Data Set shall be sent in the C-MOVE response.
Reference: DICOM PS3.4 2020e - Service Class Specifications

看来它应该可以完成您的工作。但坦率地说,我从未遇到(或没有注意到)发送此类失败实例列表的 C-MOVE SCP。从您的代码中,您也没有收到数据。我会建议不要依赖它。