看 DICOM 标准有一段时间了,前面几篇也介绍了一下 DIMSE-C 消息服务,具体参看Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N),本文就介绍一下 DICOM 标准中的一个重要服务- Worklist 服务。

Worklist 服务简介


  首先来看一下 DICOM 标准中的说明:

A worklist is the structure to present information related to a particular set of tasks. It specifies particular details for each task. The information supports the selection of the task to be performed first, and supports the performance of that task.

  意思是 Worklist 是呈现与特定任务组相关信息的结构。它指定每个任务的具体细节。这个信息支持首先要执行的任务的选择,并支持该任务的执行。
  这样理解起来感觉很困难,那么我们根据实际场景来一步一步的讲解这个服务具体是干什么的。我们就以医院拍片(DR)的场景来讲,临床医生给患者开具处方单(DR 检查)后,患者拿着就诊卡和这张处方单到达放射科,先要去登记处登记,登记的这个过程是将患者的信息录入到 RIS 系统,通过就诊卡卡号从 HIS 系统中获取患者信息,然后患者就到候诊区等待叫号,检查设备通过 Worklist 服务从工作流系统获取待检查列表,然后通过叫号系统呼叫患者进行检查。Worklist 服务在这里的作用是避免检查技师在设备上手动输入患者的信息,避免了信息输入错误的情况,同时减少了技师的工作量。
  Worklist 的流程图如下:

 
Worklist flowchart

Worklist 请求


  Worklist 其实就是一个 C-Find 请求,不过这个 C-Find 请求指定了 SOP Class UID 为 【1.2.840.10008.5.1.4.31】,这个 SOP Class 就指定了当前的 C-Find 请求是查询 Worklist,下图是 Worklist 信息模型的实体关系图

 
Modality Worklist Information Model E/R Diagram

  有关 Worklist 请求的参数构造可详见 DICOM 标准 PS 3.4 中 Table K.6-1. Attributes for the Modality Worklist Information Model(P219),这里面定义了必填和可选参数:

  • Scheduled Procedure Step Model 中,必需的参数有 :
  1. ScheduledProcedureStepSequence(0040,0100),这个 TAG 里面必填的 TAG 有:
    1.1 设备的 AE Title【Scheduled Station AE Title(0040,0001)】;
    1.2 计划程序步骤的开始日期和开始时间【Scheduled Procedure Step Start Date(0040,0002)、Scheduled Procedure Step Start Time(0040,0003)】;
    1.3 设备【Modality(0008,0060)】(DR、CT etc.);
    1.4 执行医师名称【Scheduled Performing Physician's Name(0040,0006)】;
  • Patient Identification 中,有两个参数必需:
  1. 患者姓名【Patient's Name(0010,0010)】;
  2. 患者 ID【Patient ID(0010,0020)】;

其他的参数均为可选参数。
  在实际查询中,这些必需的参数也可以做模糊匹配查询,具体匹配的规则有设备方和 Worklist SCP 方互相定义遵循即可;
  在实际场景中,有指定查询某一个患者的,即传准确的患者姓名和患者 ID,Scheduled Procedure Step Model 做模糊匹配;有通过Scheduled Procedure Step Start Date 和 Scheduled Procedure Step Start Time 结合设备的 AE Title 查询的;还有通过 Scheduled Procedure Step Start Date 和 Scheduled Procedure Step Start Time 结合 Modality 或执行医师名称查询的,具体可以参看下图:

 
Modality Worklist Message Flow Example

Worklist SCU


  结合开源 DICOM 库 fo-dicom 可以非常容易的构造一个 Worklist SCU,fo-dicom 已经在 DicomCFindRequest.cs 中封装好了创建查询 Worklist 的条件,只需要如下的代码即可实现 Worklist SCU。

using Dicom.Network;
using System;
using System.Collections.Generic;
var worklistItems = new List<DicomDataset>();
var cfind = DicomCFindRequest.CreateWorklistQuery(); // no filter, so query all awailable entries
cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) =>
{
var dicomDataset = rp.Dataset;
if (dicomDataset != null)
{
Console.WriteLine("Study UID: {0}", dicomDataset.GetSingleValue<string>(DicomTag.StudyInstanceUID));
worklistItems.Add(rp.Dataset);
}
}; var client = new DicomClient();
client.AddRequest(cfind);
client.SendAsync(serverIP, serverPort, false, clientAET, serverAET).GetAwaiter().GetResult(); return worklistItems;

Worklist SCP


  Worklist SCP 其实就是一个 C-Find SCP,可以通过派生 DicomService 服务类来实现 Dicom 服务的基本框架,然后实现 IDicomServiceProvider 和 IDicomCFindProvider 接口来实现,但要注意的是在实现 IDicomServiceProvider 接口的 OnReceiveAssociationRequestAsync 方法时需要根据请求发送的 SOP Class UID 过滤,只有值为【1.2.840.10008.5.1.4.31】的请求才同意在建立 Association 连接后接受 C-Find 请求。具体代码可以参考这里

Worklist 过程分析


  Worklist 请求的交互过程和 C-Find 请求的一样,都是先通过 A-Associate 请求建立 Association 连接,然后发送 C-Find 请求,最后通过 A-Release 请求释放 Association 连接。我主要介绍一下它们的区别,一个最主要的区别就是请求中传输的 Affected SOP Class UID 不一样,普通 C-Find 请求中根据查询的层级 Affected SOP Class UID 分为患者级【Patient Root Query Retrieve Information Model FIND(1.2.840.10008.5.1.4.1.2.1.1)】和检查级【1.2.840.10008.5.1.4.1.2.2.1(Study Root Query Retrieve Information Model FIND)】,而 Worklist 请求中 C-Find 请求的 Affected SOP Class UID 是【Modality Worklist Information Model FIND(1.2.840.10008.5.1.4.31)】,详见下图:

 
Worklist C-Find Request

作者:Statmoon
链接:https://www.jianshu.com/p/2bc57d1bc0cb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

DICOM的Worklist服务的更多相关文章

  1. DICOM:C-GET服务

    背景: 之前博文对照过多次C-MOVE与C-GET服务的差别,两者最大的差别在于C-GET是基于单个TCP连接的点对点的双方服务.而C-MOVE是基于两个TCP连接的三方服务(详情參见:<DIC ...

  2. DICOM worklist工作原理

    一.关于Worklist 在RIS与PACS的系统集成中.Wordlist的连接为其主要工作之一.Wordlist成像设备工作列表,它是DICOM协议中众多服务类别中的一个.它的功能是实现设备操作台与 ...

  3. DICOM医学图像处理:Orthanc Plugin SDK实现WADO服务

    背景: Orthanc是博主发现的一个很完美的DICOM和HTTP服务端开源软件,前几篇分别介绍了Orthanc的基本使用.Orthanc从0.8.0版本之后给出了Plugin SDK,通过该SDK可 ...

  4. DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求

    转载:http://blog.csdn.net/zssureqh/article/details/39213817 背景: 上一篇专栏博文中针对PACS终端(或设备终端,如CT设备)与RIS系统之间w ...

  5. DICOM:DICOM3.0网络通信协议(续)

    转载:http://blog.csdn.net/zssureqh/article/details/44278693 题记: 近一年来一直坚持周末写博客,整理工作和闲暇之余的点点滴滴.对于新知识点.新技 ...

  6. DICOM:DICOM3.0网络通信协议

    转载:http://blog.csdn.net/zssureqh/article/details/41016091 背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接 ...

  7. DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

    背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只 ...

  8. DICOM:DICOM3.0网络通信协议(延续)

    题记: 在过去的一年中一直坚持周末博客,整理工作与休闲比的点点滴滴. 新知识点.新技术的涉猎会单独成文,对于与DICOM相关的知识统一放在了DICOM医学图像处理 专栏里,事实上DICOM英文全称是D ...

  9. DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class

    背景: 预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题.起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WM ...

随机推荐

  1. 使用阿里的EasyExcel遇到的一些坑(NoSuchMethodError异常)

    引入eayexcel依赖的时候已经包含了poi依赖

  2. Jmeter进行分布式性能测试

    由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误.要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的 ...

  3. socket 多连接

    socket 多连接 本文档为文档https://www.cnblogs.com/wodeboke-y/p/11241472.html 后续内容. 上一文档中的案例2给出了一个阻塞型socket se ...

  4. PTA的Python练习题(十二)-第4章-7 统计学生平均成绩与及格人数

    第4章-7 统计学生平均成绩与及格人数 a=eval(input()) b=list(map(int,input().split())) sum=sum(b) c=[i for i in b if i ...

  5. 【原】jenkins知识点_凭据(一)

    一:凭据 1.目的: 与第三方网站或应用程序进行交互,如代码仓库.云存储系统和服务等 2.操作路径: Jenkins-凭据-系统-全局凭据 3.权限 Jenkins 中保存的凭证可以用于: 任何适用于 ...

  6. base64相关

    1.base64指定的64个字符(包含52个大小写.10个数字和+./): abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ...

  7. locust --hellp

    1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁.轻量.高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力. 官网:https://loc ...

  8. IDEA工具java开发之 代码重构Refactor 重命名 删除移动复制 生成变量 抽取方法

    一.重命名 用shift + F6 或者右键单击 二.抽取方法 .三.生成变量 . 四.文件移动复制和删除 可以右键

  9. Java入门笔记 00-前言&目录

    前言:这本笔记记录的是Java基础部分的学习内容,大部分内容总结性的,包括: ---01 Java基础语法 ---02 数组 ---03 面向对象 ---04 异常处理 ---05 多线程 ---06 ...

  10. uniGUI学习汇总

    UniGUI之UniLabel(31) uniGUI之自定义JS事件动作ClientEvents(30) uniGUI之文件下载(29) uniGUI之FDQuery(28) uniGUI之UniPo ...