如何在Java中使用dcm4che3创建DICOM MWL查询?

时间:2019-05-30 11:03:22

标签: java dicom dcm4che

我正在使用dcm4che3库构建DICOM客户端,这让我有点困惑如何创建dicom查询。我在Association类上调用CFIND方法。

我已经找到了如何创建基本查询的方法(例如,按PatientID进行搜索):

Attributes query = new Attributes();
query.setString(Tag.PatientID, VR.LO, "12345");

到目前为止很好。

但是,当我想使用ScheduledProcedureStepStartDate之类的东西进行查询时,我必须使用一个子查询来创建一个Sequence,如下所示:

Attributes query = new Attributes();
Sequence sequence = query.newSequence(Tag.ScheduledProcedureStepSequence, 1);
Attributes subQuery = new Attributes();
subQuery.setDate(Tag.ScheduledProcedureStepStartDate, VR.DA, date);
sequence.add(subQuery);

我不太了解DICOM格式。因此,我通过反复试验很清楚地发现了这一点,并使用了另一个DICOM客户端仿真器并拦截了它的查询以尝试弄清楚它是如何工作的。

因此,我有3个问题:

  1. 如何在两个日期之间(即使用“从”和“到”日期) 之间查询ScheduledProcedureStepStartDate
  2. 在创建查询时,是否可以让dcm4che3库弄清楚如何制作序列,所以我只需在查询中指定所需的Tag,VR和值?
  3. 当我使用Sequence元素(例如ScheduledProcedureStepSequence-> Modality)查询时,它似乎不起作用。有什么技巧可以使这项工作成功吗?

1 个答案:

答案 0 :(得分:0)

  
      
  1. 如何在两个日期之间(即使用“从”和“到”日期) 之间查询ScheduledProcedureStepStartDate
  2.   

Scheduled Procedure Step Start Date(0040,0002)元素是Scheduled Procedure Step Sequence(0040,0100)的一部分。这支持Combined Range Matching

  

日期和时间的匹配键组合在一起。例如,学习日期“ 20060705-20060707”和学习时间“ 1000-1800”将匹配7月5日上午10点至7月7日下午6点的时间段,而不是三个时间段,即每个上午10点至下午6点的时间段7月5日,7月6日和7月7日。

因此,您可以指定两个用短划线(-分隔的日期,以搜索两个日期之间的 。上面的引用中给出了示例。

  
      
  1. 在创建查询时,是否可以让dcm4che3库弄清楚如何制作序列,所以我只需在查询中指定所需的Tag,VR和值?
  2.   
DICOM元素层次结构非常简单;呼叫者可以根据需要轻松创建序列。在大多数情况下,MWL查询只包含您提到的一个序列。

您要询问的内容需要对基本数据集类进行包装。使用最广泛的工具包不支持在DICOM数据集上包装,以简化序列处理。我知道很少。我不是该工具箱的专家;但是AFAIK,dcm4che不存在这种包装器。您必须自己创建和管理序列元素。

  
      
  1. 当我使用Sequence元素(例如ScheduledProcedureStepSequence-> Modality)查询时,它似乎不起作用。有什么技巧可以使这项工作成功吗?
  2.   

这还不清楚; “ 似乎不起作用”没有解释。序列元素包含一个ItemItem包含其他元素。每个Item都可以再次视为数据集。

以下是查询的外观:

MQL Query

罗尼(Roni)的article对您可能会有帮助。那里的源代码未使用您的工具包;希望你能有个主意。