Problem with a dicom service and the c-find operation

651 views
Skip to first unread message

Andreas Auderer

unread,
Mar 13, 2015, 4:39:48 AM3/13/15
to fo-d...@googlegroups.com

Hello,

 

i have a question regarding the c-find Operation in the fellow oak dicom. I have developed a Service wich implements a c-find operation and should send the found patients back tot he ultrasound machine. I’m testing currently with the 4d view “emulator” from GE.

 

I’ve implemented the code like I found on this forum and its receiving the request. I send back a dataset but everytime I get on the ultrasound machine the message that no items could be found. L

 

May anyone of you can help me?

 

Thanks in advance

Andreas


using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
namespace Server
{
 [CLSCompliant(false)]
 public class CFind : DicomServiceBase, IDicomCFindProvider
 {

  private static readonly DicomTag PatientNumberTag = new DicomTag(0x10, 0x20);

  private static readonly DicomTag PatientNameTag = new DicomTag(0x10, 0x10);
  public CFind() : base(null, null)
  {
  }

  public CFind(System.IO.Stream stream, global::Dicom.Log.Logger log) : base(stream, log)
  {
  }

  public IEnumerable<global::Dicom.Network.DicomCFindResponse> OnCFindRequest(global::Dicom.Network.DicomCFindRequest request)
  {
   Logging.Trace(CurrentLogger, "C-Find request");
   string familyname = "";
   int? patientId = default(int?);

   if (request.Dataset.Contains(PatientNumberTag)) {
    DicomLongString dicomLongStringItem = request.Dataset.Get<DicomLongString>(PatientNumberTag);
    if (Information.IsNumeric(dicomLongStringItem.Value))
     patientId = dicomLongStringItem.Value;
   }
   if (request.Dataset.Contains(PatientNameTag)) {
    DicomPersonName dicomPersonNameItem = request.Dataset.Get<DicomPersonName>(PatientNameTag);
    if (!string.IsNullOrEmpty(dicomPersonNameItem.Last) && dicomPersonNameItem.Last != "*")
     familyname = dicomPersonNameItem.Last;
   }


   List<DicomCFindResponse> responses = new List<DicomCFindResponse>();
   if (request.Level == DicomQueryRetrieveLevel.Patient) {
    foreach (DicomDataset result in getworklistresults()) {
     result.Add(DicomTag.QueryRetrieveLevel, request.Level);
     result.Add(DicomTag.RetrieveAETitle, CalledAe);
     DicomCFindResponse response = new DicomCFindResponse(request, DicomStatus.Success);
     response.Dataset = result;
     responses.Add(response);
    }
   }
   responses.Add(new DicomCFindResponse(request, DicomStatus.Success));
   return responses;

  }
  private List<DicomDataset> getworklistresults()
  {
   DicomDataset ds = new DicomDataset();
   ds.Add(new DicomPersonName(DicomTag.PatientName, DicomEncoding.GetEncoding("ISO 2022 IR 100"), "name^surname"));
   ds.Add(DicomTag.PatientID, "rtrtrtrtrt");
   ds.Add(DicomTag.PatientBirthName, "errerere");
   ds.Add(DicomTag.RetrieveAETitle, this.CalledAe);
   List<DicomDataset> a = new List<DicomDataset>();
   a.Add(ds);
   return a;
  }
 }
}

Hesham Desouky

unread,
Mar 14, 2015, 6:08:29 PM3/14/15
to fo-d...@googlegroups.com
Hello,

From my experience the modality will not display the returned results as long as it didn't contains the attributes it requested through the C-FIND request.

You should look into the request dataset to find which DICOM attributes the modality is requesting and populate these fields with results.

if you have any requested attributes with no match from your SCP add it empty to the result response dataset.

To understand how it works you can read the following


or for more details go ahead for the standard:


I hope the above lighten things up for you

Andreas Auderer

unread,
Mar 16, 2015, 12:49:14 PM3/16/15
to fo-d...@googlegroups.com
Hello Hesham,


thanks for your response. i have looked into the request dataset and added all tags mentioned there. but it can't find patients in the 4d view app. Did you mean that?

Heres my updated code:


   Public Function OnCFindRequest(request As Global.Dicom.Network.DicomCFindRequest) As IEnumerable(Of Global.Dicom.Network.DicomCFindResponse) Implements Global.Dicom.Network.IDicomCFindProvider.OnCFindRequest
       
Logging.Trace(CurrentLogger, "C-Find request")
       
Dim familyname As String = ""
       
Dim patientId As Integer?

       
If request.Dataset.Contains(PatientNumberTag) Then
           
Dim dicomLongStringItem As DicomLongString = request.Dataset.Get(Of DicomLongString)(PatientNumberTag)
           
If IsNumeric(dicomLongStringItem.Value) Then patientId = dicomLongStringItem.Value
       
End If
       
If request.Dataset.Contains(PatientNameTag) Then
           
Dim dicomPersonNameItem As DicomPersonName = request.Dataset.Get(Of DicomPersonName)(PatientNameTag)
           
If Not String.IsNullOrEmpty(dicomPersonNameItem.Last) AndAlso dicomPersonNameItem.Last <> "*" Then familyname = dicomPersonNameItem.Last
       
End If


       
Dim responses As New List(Of DicomCFindResponse)()
       
If request.Level = DicomQueryRetrieveLevel.Patient Then
           
For Each result As DicomDataset In getworklistresults(request)
               
Dim response As New DicomCFindResponse(request, DicomStatus.Pending)
                response
.Dataset = result
                responses
.Add(response)

           
Next
       
End If

        responses
.Add(New DicomCFindResponse(request, DicomStatus.Success))

       
Return responses
   
End Function

   
Private Function getworklistresults(request As Global.Dicom.Network.DicomCFindRequest) As List(Of DicomDataset)
       
Dim dicomdatasets As New DicomDataset()

        dicomdatasets
.Add(DicomTag.SpecificCharacterSet, "ISO_IR 100")
        dicomdatasets
.Add(DicomTag.AccessionNumber, "")
        dicomdatasets
.Add(DicomTag.ReferringPhysicianName, "")

       
Dim sequenceDatase0 = New DicomDataset
       
Dim sq0 As New DicomSequence(DicomTag.ReferencedStudySequence, sequenceDatase0)
        dicomdatasets
.Add(DicomTag.ReferencedStudySequence, sq0)

       
Dim sequenceDataset1 = New DicomDataset
       
Dim sq1 As New DicomSequence(DicomTag.ReferencedPatientSequence, sequenceDataset1)
        dicomdatasets
.Add(DicomTag.ReferencedPatientSequence, sq1)

        dicomdatasets
.Add(New DicomPersonName(DicomTag.PatientName, DicomEncoding.GetEncoding("ISO 2022 IR 100"), "name^surname"))
        dicomdatasets
.Add(DicomTag.PatientID, "12345")
        dicomdatasets
.Add(DicomTag.IssuerOfPatientID, "")
        dicomdatasets
.Add(DicomTag.PatientBirthDate, "")

        dicomdatasets
.Add(DicomTag.PatientSex, "F")
        dicomdatasets
.Add(DicomTag.PatientSize, "170")
        dicomdatasets
.Add(DicomTag.PatientWeight, "170")
        dicomdatasets
.Add(DicomTag.LastMenstrualDate, "")

        dicomdatasets
.Add(DicomTag.StudyInstanceUID, "")
        dicomdatasets
.Add(DicomTag.RequestingPhysician, "")
        dicomdatasets
.Add(DicomTag.RequestedProcedureDescription, "")

       
Dim sequenceDataset2 = New DicomDataset
       
Dim sq2 As New DicomSequence(DicomTag.RequestedProcedureCodeSequence, sequenceDataset2)

        dicomdatasets
.Add(DicomTag.RequestedProcedureCodeSequence, sq2)
        dicomdatasets
.Add(DicomTag.AdmissionID, "")

       
Dim sequenceDataset3 = New DicomDataset
       
Dim sq3 As New DicomSequence(DicomTag.ScheduledProcedureStepSequence, sequenceDataset3)
        dicomdatasets
.Add(DicomTag.ScheduledProcedureStepSequence, sq3)

        dicomdatasets
.Add(DicomTag.RequestedProcedureID, "")
        dicomdatasets
.Add(DicomTag.ReasonForTheRequestedProcedure, "")

       
Dim a As New List(Of DicomDataset)
        a
.Add(dicomdatasets)
       
Return a
   
End Function

Hesham Desouky

unread,
Mar 16, 2015, 1:09:14 PM3/16/15
to fo-d...@googlegroups.com
Check the 4d view application conformance statement. conformance statement will show you which fields are mandatory and can't have empty or no data.

For example, study instance UID can't be empty.

Not providing the mandatory attributes with data will be discarded by the requesting application. I saw this behavior with many modalities vendors like GE and Philips.

Hesham

Andreas Auderer

unread,
Mar 17, 2015, 5:11:35 AM3/17/15
to fo-d...@googlegroups.com
i've also send some study instance uid - but without succes

can you tell me how i will see this conformance statement?

thanks
Andreas

Chris Horn

unread,
Mar 18, 2015, 3:36:14 AM3/18/15
to fo-d...@googlegroups.com
Are you trying to get a work list ?
or c-find to another machine?

what are you trying to achieve, the conformance statement will tell you what the machine supports, the hardware vendor will be able to supply you a copy or google for the machine name and version should yeild results.
do you have any looging set up that may show more ?
Reply all
Reply to author
Forward
0 new messages