Wednesday, June 28, 2023

DICOM Modality Worklist

Modality worklist (MWL) is one of DICOM’s workflow services that really make a difference. It’s the difference between grocery store workflow with notes on little pieces of paper and a true modern accountable workflow.

Technically speaking, DICOM Modality Worklist is a task manager just like a piece of paper with short text and a check box or the tasks application on your iPhone (or Android). But for the imaging center or RAD department the advantages are enormous. The most obvious benefit is that there’s no need to reconcile all kind of misspelled names in the PACS because the patient name is no longer keyed in on the modality workstation but received electronically via the MWL query. The fact that the requested procedure is also received electronically reduces the chance for doing the wrong procedure to the wrong patient. Combined with Modality Performed Procedure step (MPPS), that allows the modality to report the task status, take ownership over the task and checkmark it as done when completed, the up side is obvious. No wonder then, that many HMO’s require Modality Worklist as a mandatory feature for every imaging device they purchase. 

The most basic abstraction of a task is a short description of what should be done and a checkbox. That’s all it takes. The MWL data model is a bit more complicated and has two levels.
The top, parent, level is called “Requested Procedure” (RP) and holds the information about the patient (name, id), the study (accession number, study instance UID) and the procedure. The procedure can be described as text using attribute (0032,1060) – “Requested Procedure Description” or in a more sophisticated manner using the (0032,1064) – “Requested Procedure Code Sequence” where static tables of codes and meanings can be used to configure and maintain procedures in the RIS or HIS.
The child level is called “Scheduled Procedure Step” (SPS) and holds attributes relevant to the modality and the actual procedure to be made. A single requested procedure may hold more than one SPS if the request is for a multi-modality study, for example a chest X-Ray and a CT or whatever combination, or if for example two protocols should be applied (e.g. Chest and Abdomen). As a modality, we will use the data in the RP to identify the patient and eliminate re-typing of the name and ID and the SPS to determine what exactly to do.

The DICOM images that the modality will create should use the attributes received from the MWL. When MWL is implemented, the Study Instance UID is generated in the RIS so if a multi-modality procedure is done, each modality will create a series and attach it to the Study by using the Study Instance UID received in the MWL query.
The Modality Worklist Server is responsible for managing the tasks. On one hand it provides means to schedule new tasks (e.g. via HL7 or using a web form) and on the other hand it provides means to get the list of scheduled tasks (via DICOM).
In this post, we’re going to write a simple MWL client using RZDCX DICOM Toolkit and discuss the details of the service and how the workflow is implemented. We’ll leave the MPPS for a future post.
Let’s start with a simplified overview of the workflow at the imaging center or the radiology department.
  1. An order is made for an imaging service, let’s say for example a chest X-Ray. The order can be made in various ways. For example it can arrive as a HL7 message from the HIS (Hospital Information System), or it can be that the patient walks in an the order is made at the reception desk. In either case, a new record is created in the worklist manager with the information for the service.
  2. The order is scheduled and assigned to the X-Ray machine or Room that will perform the exam. If there are many X-Ray machines, the order may be assigned to one of them. The assignment is made by setting the AE title on the order and setting a date. The exact way it is done, is very much the business of the worklist manager implementation. DICOM only defines the data model entities. The relevant entity for this is scheduled procedure step. It’s an abstraction of a task with description of what should be done, when it should be done and who should do it.
  3. When the X-Ray machine makes a modality worklist query, it gets the list of scheduled tasks and performs them.
Let’s have a look at a modality worklist client.

On the upper left of this single form application you see the DICOM network parameters that we’ve already seen on chapter 5 of the DICOM tutorial when talking about DICOM networking.
On the upper right side we have some filter attributes that we can use that make a lot of sense. We can filter by the AE title that the procedure was scheduled for, by the type of modality it was scheduled for and using the scheduled date. For demonstration purpose, the date matching attributes here are very detailed in order to show all possible date and time exact, open and closed range matching.
The Query button packs the filter into a DICOM object and then sends it to the MWL server using the Query method of the DCXREQ interface. The SOP class for Modality Worklist is “1.2.840.10008.5.1.4.31”.
The construction of the query object is a bit tricky because we have to build the parent-child hierarchy. The mechanism of making queries for hierarchical objects is called sequence matching. The server (Q/R SCP) should search all the matching Requested Procedures that have at least one child Scheduled Procedure Step with attributes that matches the query. If it finds such, the complete RP with all its child nodes is sent as a result. The client (Query SCU) may set exactly one child node in the query.

The RP and SPS entities have many attributes but for this post what’s important is to understand that we, as a modality, are performing a schedule procedure step so we are looking for the child entity. The AE title, modality and scheduled date are all attributes of the schedule procedure step so in order to perform the matching, we create a filter for the scheduled procedure step and then put it into a requested procedure object as a sequence element and this is the query we send. Here’s the code:

// Fill the query object
rp = new DCXOBJ();
sps = new DCXOBJ();
el = new DCXELM();

// Build the Scheduled procedure Step (SPS) item
el.Init((int)DICOM_TAGS_ENUM.ScheduledStationAETitle);
sps.insertElement(el);

// A lot of code to handle all the cases of date and time matching
// that eventually goes into the elements: ScheduledProcedureStepStartDate and ScheduledProcedureStepStartTime
el.Init((int)DICOM_TAGS_ENUM.ScheduledProcedureStepStartDate);

/// This adds a filter for time
el.Init((int)DICOM_TAGS_ENUM.ScheduledProcedureStepStartTime);

// Handle the modality Combo Box
el.Init((int)DICOM_TAGS_ENUM.Modality);
if (comboBoxModality..SelectedItem.ToString() != "Any")
    el.Value = comboBoxModality.SelectedItem.ToString();
sps.insertElement(el);

// Now we put it as an item to sequence
spsIt = new DCXOBJIterator();
spsIt.Insert(sps);

// and add the sequence Scheduled Procedure Step Sequence to the requested procedure (parent) object
el.Init((int)DICOM_TAGS_ENUM.ScheduledProcedureStepSequence);
el.Value = spsIt;
rp.insertElement(el);

/// Add the Requested Procedure attributes that we would like to get
el.Init((int)DICOM_TAGS_ENUM.RequestedProcedureID);
rp.insertElement(el);

el.Init((int)DICOM_TAGS_ENUM.RequestedProcedureDescription);
rp.insertElement(el);

el.Init((int)DICOM_TAGS_ENUM.studyInstanceUID);
rp.insertElement(el);

el.Init((int)DICOM_TAGS_ENUM.PatientsName);
rp.insertElement(el);

el.Init((int)DICOM_TAGS_ENUM.patientID);
rp.insertElement(el);

el.Init((int)DICOM_TAGS_ENUM.AccessionNumber);
rp.insertElement(el);

// Create the requester object and connect it's callback to our method
req = new DCXREQClass();
req.OnQueryResponseRecieved += new IDCXREQEvents_OnQueryResponseRecievedEventHandler(OnQueryResponseRecievedAction);

rp.Dump("query.txt");

// send the query command
it = req.Query(LocalAEEdit.Text,
               TargetAEEdit.Text,
               HostEdit.Text,
               ushort.Parse(PortEdit.Text),
               "1.2.840.10008.5.1.4.31"/// Modality Worklist SOP Class
               rp);

At the bottom of the form we have a grid that will show the results.
We can handle the results either in the callback OnQueryResponseRecievedAction or iterate over the items in DCXREQ.Query return value. In this example we’ll do the later and unpack some of the attributes of the RP into a data grid. Here’s the code for it:

private void LoadResultsToGrid(DCXOBJIterator it)
{
    DCXOBJ currObj = null;

    try
    {
        DataTable dt = new DataTable();
        DataRow dr;

        dt.Columns.Add(new DataColumn("Patient Name", typeof(string)));
        dt.Columns.Add(new DataColumn("Accession Number", typeof(string)));
        dt.Columns.Add(new DataColumn("Requested Procedure ID", typeof(string)));
        dt.Columns.Add(new DataColumn("Requested Procedure Description", typeof(string)));
       
        // Iterate over the query results
        for (; !it.AtEnd(); it.Next())
        {
            currObj = it.Get();
            dr = dt.NewRow();
            dr["Patient Name"] = TryGetString(currObj, DICOM_TAGS_ENUM.patientName);
            dr["Accession Number"] = TryGetString(currObj,DICOM_TAGS_ENUM.AccessionNumber);
            dr["Requested Procedure ID"] = TryGetString(currObj,DICOM_TAGS_ENUM.RequestedProcedureID);
            dr["Requested Procedure Description"] = TryGetString(currObj,DICOM_TAGS_ENUM.RequestedProcedureDescription);
            dt.Rows.Add(dr);
        }
        DataView dv = new DataView(dt);
        dgvQueryResults.DataSource = dv;
    }
    finally
    {
        ReleaseComObject(currObj);
    }

} 

The full source code modality worklist SCU example can be downloaded from here. This example has a master-detail  data grid view that shows the SPS’s of the selected RP.

Don’t forget to download and register MODALIZER-SDK (32 or 64 depending on your OS) before building the project.


As always, comments and questions are most welcome.

62 comments:

  1. Really helpful article.
    Looking ahead for MPPS deciphering...
    Thank you

    ReplyDelete
  2. Thank you very much,
    All of these articles are very helpfull.

    I tried modality worklist,
    but got error like this
    'DUL Finite State Machine Error: No action defined, state 5 event 17'

    any idea?

    ReplyDelete
    Replies
    1. That's a protocol error.
      One of the sides, does not respond according to the expected.
      Can you add a log to the application and repeat the test.
      At the form load add this:

      app = new DCXAPP();
      app.StartLogging("c:\\rzdcxLog.txt");

      Than run again and post here the log file.
      We'll analyze it online

      Delete
    2. I solved it.
      The given port number was false.
      I changed it and it works :)

      Thanks a lot.

      Delete
  3. This comment has been removed by the author.

    ReplyDelete
  4. Hi! your contact page is broken :S,

    I thank your dicom posts, Im trying to create a SCP-MWL server, your appi is able to create it?

    thanks.

    ReplyDelete
    Replies
    1. Thanks no-body.
      I fixed it.
      Look at this post: http://dicomiseasy.blogspot.co.il/2012/07/dicom-modality-worklist-server.html
      about MWL SCP
      Roni

      Delete
  5. Hello.. i am using this client (DICOM Modality Worklist) but can't seem to make a connection to the server.. Maybe i just missed this info somewhere but what port number is this client listening to by default?

    ReplyDelete
    Replies
    1. Hi
      This DICOM Modality Worklist SCU (client) does not listen to any port.
      It initiates an association with the peer DICOM application that listen on a port on another computer.

      Delete
  6. Hi from Mexico!

    I'm traing to run your aplication but I got this error:

    Query failed: DUL Association Rejected.

    Any idea ?

    ReplyDelete
  7. Hi !

    I am a french student in computer science. In the context of my school, I've to code a Dicom software. I have decided to code a Worklist implementation but despite all my research some part of the Dicom standard escape me.
    I asked Roni (e-mail) about the "Admission ID", because I didn't know the meaning of this field. I share here his answer which can help everyone :

    "Admission id is an id that is created or assigned to the patient when admitted to the ward.
    For example when you visit a clinic, the secretary at the front desk opens a file for you and assigns an id to it.
    So this can be the admission id.
    It had no other logic attached to it in DICOM.
    In general you should look at the attribute type.
    There are types 1, 2, and 3.
    If it's not a 1, this means you can most probably live without it."

    I agree with that, but I have another question : how do you identify a patient ? With the Patient ID, the Accession Number or the Admission ID ? Do all the patients have an Admission id AND a Patient id ?

    Thank you so much again Roni for this first answer.
    Regards,
    Laura.

    ReplyDelete
    Replies
    1. Hi Laura,
      The identifier of the patient is Patient ID.
      Accession Number identifies the current page or incident or encounter of treatment in the patient record. It is related to study level.
      Regards,
      Roni

      Delete
    2. If you are not coming from a clinical background, all these different ID numbers can be confusing. I would look at the Admission ID as an account number. Upon admission, an account number is assigned that is used, among other things, to track all billing, procedures, etc. for that 'admission.' Next visit to doctor or hospital would/could generate another Admission (account) ID. Patient ID is unique to the PATIENT. Accession number is for the EXAM, for instance, a chest xray would have a unique accession number for that particular patient. If they had another chest xray later, it would get another unique accession number. The admission ID is for that particular visit or admission. Hopefully, this helps.

      Delete
  8. SCU has fired a query on SCP.but the SCP returns "The response from SCP was not success" and the Error comment returns a "."(dot). what may the problem.
    [DicomQueryAPI::list] The response from SCP was not success .
    [DicomQueryAPI::list] Error Comment : .

    ReplyDelete
    Replies
    1. I this with out toolkit? If so, post the complete log please.

      Delete
  9. Does the RZDCX toolkit is free?

    ReplyDelete
  10. I am siva,

    I am not understanding RZDCX modalityworklistSCU,Query/RetriveSCU and mppsSCU code sample.who is the sender and listener and how to configure AET ,IPADDRESS AND PORT.I am strugling with send data to modality.Please give solution.advance thanks

    ReplyDelete
  11. RZDCX code samples helping me,but i am not under standing flow between these exaples and modalites.Please help me.

    ReplyDelete
  12. please help me,i am .net developer.i am facing problem with send patient data to modalities.i am using RZDCX examples.i am not understanding modalityworklistscu,query/retrivescu and mpps.please tell me who is listener and who is the client.please help me.

    ReplyDelete
    Replies
    1. Dear Suvarna
      All these examples are SCU or Client. I'm sorry that I can't answer you general call for help but if you have more specific questions please ask. I suggest that you read again the post and maybe try reading other resources that maybe more clear to you.
      Regards
      Roni

      Delete
  13. please help me,i am .net developer,i am facing the problem for send patient data to modality.what is the use of modality worklist scu ,query/retrive scu and MPPS SCU.which is good example for send patient information to modality.please help me.advance thanks

    ReplyDelete
    Replies
    1. Hi Suvarna, Hope you have completed MWL scu by this time. Can you please share the details to robbinjames@gmail.com

      Delete
  14. please help me,i am .net developer, i want modality worklist scp .net source code for send scheduled patient information to modality.advance thanks.

    ReplyDelete
  15. In a worklist it is possible to have 2 different methods with the same number of access (same patient)?
    If the answer is Yes, can you give an example?
    Thank you

    ReplyDelete
  16. In a worklist it is possible to have 2 different methods with the same number of access (same patient)?
    If the answer is Yes, can you give an example?
    Thank you

    ReplyDelete
    Replies
    1. Yes, in the response you can have two scheduled procedure steps for the same scheduled procedure. See the screenshot at the top of this post

      Delete
    2. I'd seen the picture above, but you might attach a file example to better understand how it works.
      Thank you

      Delete
  17. Thanks a lot for this excellent blog about DICOM an the great explanation of the backgrounds.
    I would have one question. What is the best case to handle a missing RP Description (0032,1060) in the MWL?

    Thanks a lot!
    Is it better not to process and attempt to fix the RIS config (that's how we handle) or can it be effectively worked around on the modality?

    ReplyDelete
    Replies
    1. Hi Tobias,
      Sorry for the late replay.
      According to the DICOM standard Requested Procedure Description or Requested Procedure Description should be provided by the SCP. IHE extend the requirement also to the SCU.
      How you handle missing attribute really depends on your workflow. I tend to take the more elaborative attitude but others may think differently.
      If you decide to reject MWL records due to missing attribute make sure to have a clear message to the user why you did this including the offending attribute name and tag.
      Consider displaying the record grayed out with the error information so it is displayed but can't be used.
      Regards,
      Roni

      Delete
  18. Thank your for this Toolkit, it really helping me.

    I m using the Toolkit to implement an application requesting the worklist from a Worklist Server using Delphi XE4.

    the server is running fine with MS SQL express. I can request the list and i m getting patient information quickly

    Things was going good until i face a problem converting this line to delphi when displaying SPS elements.

    DCXOBJIterator spsIt = currObj.getElementByTag((int) DICOM_TAGS_ENUM.ScheduledProcedureStepSequence).Value as DCXOBJIterator;

    The casting of the Value ( an OleVariant) to DCXOBJIterator failed and gives error during compilation.

    I tried many typacasting forma but there is no way to iterate over the SPS.

    Can u help please ?

    How to get the SPSs in DELPHI

    Thanks in advance

    ReplyDelete
  19. Thanks a lot for the article.

    I was wondering if I can get number of images associated to a study from the modality worklist? The question is how the PACS would know if all the images for study/patient are received.

    Cheers,
    Arash

    ReplyDelete
    Replies
    1. Hi Arash,
      Great question! Because there's an answer ;) When the Modality sends MPPS COMPLETED it should include the list of SOP Instance UID's that were created during the procedure. This way the PACS knows exactly the content of the procedure.
      Roni

      Delete
  20. Thanks for the great article!
    I've a question - I've created a service which supposed to connect to a RIS server and get the worklist related to my facility.
    My question is how do i get it by hl7 query? Do i query first for all the patients related to my facility and then query for their orders or i have any dedicated query specially for this purpose?
    I want to mantion that i'm creating dicom objects only after scan so i cant query for future orders via dicom.
    Thanks in advanced,
    Doron.

    ReplyDelete
  21. Thanks for the great article!
    I've a question - I've created a service which supposed to connect to a RIS server and get the worklist related to my facility.
    My question is how do i get it by hl7 query? Do i query first for all the patients related to my facility and then query for their orders or i have any dedicated query specially for this purpose?
    I want to mantion that i'm creating dicom objects only after scan so i cant query for future orders via dicom.
    Thanks in advanced,
    Doron.

    ReplyDelete
  22. I am trying to build a MWL query request, but somehow get some tags wrong, or missing some.
    I know how to build a C-Find Query for example CT Series on a Dicom Archive on PATIENT or STUDY level. I assume a Qquery for the modality worklist must be similar, but somehow I am not getting results.

    (0000,0002) "1.2.840.10008.5.1.4.31"
    (0000,0100) ? ?
    ...
    (0008,0052) ? ? or can I just dismiss this whole tag?

    What are the minimium respond flags that I need to put in my request, Or can I just request for all MWLs on a "demo server"...

    Could you send an example of that query you create with your toolkit? rp.Dump("query.txt");

    thanks for your blog,
    Matthias

    ReplyDelete
  23. Dear Author!
    I could get value of some tags such as :PatientSex,PatientBirthDate,PatientAge when using method TryGetString. It always raise exception in the method TryGetString. Could you please tell me why and how to fix it?. This is mycode:
    string PatientSex = TryGetString(currObj, DICOM_TAGS_ENUM.PatientSex);
    string PatientBirthDate = TryGetString(currObj, DICOM_TAGS_ENUM.PatientBirthDate);
    string Age = Utility.Int32Dbnull(TryGetString(currObj, DICOM_TAGS_ENUM.PatientAge);

    private string TryGetString(DCXOBJ obj, DICOM_TAGS_ENUM tag)
    {
    try
    {
    DCXELM e = obj.getElementByTag((int)tag);
    if (e != null && e.Value != null)
    return obj.getElementByTag((int)tag).Value.ToString();
    else
    return "N/A";
    }
    catch (COMException)
    {
    return "N/A";
    }
    }

    ReplyDelete
    Replies
    1. The exception is probably "element not found". You can use GetElement instead which will not throw exception in this case and return null.

      Delete
  24. Hi, the links here "The full source code modality worklist SCU example can be downloaded from here." are dead. Could you fix it please ?

    ReplyDelete
  25. I have what may seem like a very odd question. How does one determine from looking at the data dictionary or any other part what particular attributes are um associated to dicom worklist? for example. why do modalities usually ask and pass referring physician (0008090) but not requesting(0032,1032), etc? I work in the middle between hl7 and dicom. i have a project and would like to receive diagnosis code and description (0008,1080 and 0008,1084) into my broker. I have no way to know if a modality is going to ask for any particular code any thoughts would be helpful.

    ReplyDelete
  26. We have implemented the modality worklist with a GE modality.We are getting the following error message on the GE console. "Association to modality Work list Server (SCP) refused."If we the “update” button once or twice, it recovers, but it’s almost like the timeout on the handshake is too short for the process to respond or something. Any assistance would be greatly appreciated! Thank you!

    ReplyDelete
    Replies
    1. Refused means that your AE title is either not configured or configured wrongly on the worklist SCP. Check your configuration on both sides.
      This is usually an A-ASSOCIATE Response that says that you are not recognized or recognized but not authorized to communicate with the called system.

      Delete
  27. Hi
    I am working on MWL SCU implementation. As part of implementation I have find a way to uniquely identify the work-list. Can you please tell me as per DICOM standard, what tag can be used to identify a work-list ?

    ReplyDelete
  28. Hi
    I am working on MWL SCU implementation. As part of implementation I have find a way to uniquely identify the work-list. Can you please tell me as per DICOM standard, what tag can be used to identify a work-list ?

    ReplyDelete
    Replies
    1. Hi,
      Worklist items have two major levels : the requested procedure and the scheduled step. Each have their own ID. At the top procedure level you have Requested Procedure ID (0040,1001) and at the child scheduled procedure step leve you have Schedule Procedure Step ID (0040,0009). Additionally, the work item carries other identifiers such as Accession Number and Study Instance UID but they don’t identify the work item itself but rather related entities.
      I hope this helps. See also: http://dicom.nema.org/medical/Dicom/current/output/html/part04.html#sect_K.6.1
      Roni

      Delete
  29. Hello, what object and/or example should I be using to write to the [RZ_DICOM_HL7].[dbo].[N_PATIENT] table?

    Stephen

    ReplyDelete
  30. Has anyone else noticed that this does not conform to the standard? The standard defines that each Modality Worklist Information Model, sent in response to the C-FIND Request, should only have one Item in the Scheduled Procedure Step Sequence. See http://dicom.nema.org/medical/dicom/current/output/html/part04.html#sect_K.6.1.2.2 In the example above, there are multiple Scheduled Procedure Steps in the Sequence.

    ReplyDelete
    Replies
    1. It’s confirmant. It’s true that the request should have exactly one child. But that’s what this example do

      Delete
  31. Hello,

    I running Dicomserver.exe in verbose mode and running Worklistmanager adding new row succesfully, then running ModalityWorklistSCU sample, but MWL could not get though and I found the following error at Dicomserver, please advise how to solve the problem

    # Dicom-Data-Set
    # Used TransferSyntax: Unknown Transfer Syntax
    (0000,0000) UL 0 # 4, 1 CommandGroupLength
    (0000,0002) UI =FINDModalityWorklistInformationModel # 22, 1 AffectedSOPClassUID
    (0000,0100) US 32800 # 2, 1 CommandField
    (0000,0120) US 1 # 2, 1 MessageIDBeingRespondedTo
    (0000,0800) US 257 # 2, 1 DataSetType
    (0000,0900) US 0 # 2, 1 Status

    2018-06-1209:23:51.954000 25448 DEBUG DIMSE sendDcmDataset: sending 82 bytes
    2018-06-1209:23:51.970000 25448 DEBUG WriteToConnection, length: 12, bytes written: 12, loop no: 1
    2018-06-1209:23:51.970000 25448 DEBUG WriteToConnection, length: 82, bytes written: 82, loop no: 1
    2018-06-1209:23:51.970000 25448 INFO DIMSE receiveCommand
    2018-06-1209:23:51.970000 25448 DEBUG In DIMSE_readNextPDV, Blocking=1, timeout=5
    2018-06-1209:23:51.970000 25448 DEBUG In readPDUHeadTCP, About to call defragmentTCP, block=1, (*association)->timerStart=0, timeput=5
    2018-06-1209:23:51.970000 25448 DEBUG In readPDUBodyTCP, About to call defragmentTCP, block=1, (*association)->timerStart=0, timeput=5, (*association)->nextPDULength)4
    2018-06-1209:23:51.986000 25448 DEBUG Peer requested release
    2018-06-1209:23:51.986000 25448 DEBUG WriteToConnection, length: 10, bytes written: 10, loop no: 1
    2018-06-1209:23:51.986000 25448 INFO Dropping association (closing socket, cleaning up
    2018-06-1209:23:51.986000 25448 DEBUG Assocation ended (not timeout)
    2018-06-1209:23:52.001000 25448 DEBUG AssocThread Ended
    0006:0312 No requests for associations for this server
    2018-06-1209:24:21.684000 19920 DEBUG ASSOC ERROR
    2018-06-1209:24:21.684000 19920 ERROR Connected assoc didn't go through, maybe timeout
    0006:0312 No requests for associations for this server
    2018-06-1209:24:21.700000 8556 DEBUG ASSOC ERROR
    2018-06-1209:24:21.700000 8556 ERROR Connected assoc didn't go through, maybe timeout

    ReplyDelete
    Replies
    1. It looks like configuration error

      Delete
    2. Yes, it is. the problem solved so far. Thanks anyway,

      Delete
  32. Why does Patient Birth date as 0000-00-00 from the following c# code

    dr["Patient BirthDate"] = getElementByTagID(currObj, (int)DICOM_TAGS_ENUM.PatientsBirthDate);

    while looking at Dicomserver in verbose mode, I saw patient birth date is 2561-06-11 which is correct info.

    # Dicom-Data-Set
    # Used TransferSyntax: Unknown Transfer Syntax
    (0008,0050) SH [166673699441148] # 16, 1 AccessionNumber
    (0008,0090) PN [Dr.Me] # 6, 1 ReferringPhysicianName
    (0010,0010) PN [somsri^somsriName] # 18, 1 PatientName
    (0010,0020) LO [12345] # 6, 1 PatientID
    (0010,0030) DA [2561-06-11] # 10, 1 PatientBirthDate

    ReplyDelete
    Replies
    1. What version of RZDCX are you using?

      Delete
    2. Yes, it is due to I'm using an old version of RZDCX, after update the latest one, the problem solved, thanks for your response any way.

      Delete
  33. Thanks for sharing.
    I do have one question. there some clinical document which need to be transfer from RIS/HIS to modality. for example EDD (estimated due date) is a very useful data in ultrasound (OB-GYN).
    could you explain how clinical/visiting information transfer due to worklist?

    ReplyDelete
  34. Practically, the closest I could find is here https://static.healthcare.siemens.com/siemens_hwem-hwem_ssxa_websites-context-root/wcm/idc/groups/public/@global/@services/documents/download/mda4/odgz/~edisp/bonsai_va11_dcs-06170004.pdf and the EDD is filled manually by the operator

    ReplyDelete
    Replies
    1. Dear Roni,
      thank you for taking time and search for it.
      the document that you gave me is a dicom conformance for Siemens US modality. I do read some other dicom conformance as well. but my problem is actually happen due my lack of knowledge of dicom.
      I could not find out how to transfer extended dicom or context like EDD to modality.... if you could tell me about these structures, it would be a great help

      Delete
  35. Don’t forget to download and register RZDCX (32 or 64 depending on your OS) before building the project
    Not working also

    ReplyDelete
  36. If I quiery all worklist without filter any date, I found that ScheduledProcedureStepStartDate did not sent from Dicom server, it shown N/A. However, if I filter exact date or From-To date then ScheduledProcedureStepStartDate will be sent from Dicom Server? Why.

    ReplyDelete
    Replies
    1. In order to get an attribute in the response you have to i clude it in the request identifier. Maybe when you don’t filter buy date you don’t add it at all? What tools are you using for scu and acp?

      Delete
  37. Thanks for explanation. I am trying to post-process MRI dicom that has been stored in PACS, then append new dicoms as new series. Dicoms are queried and retrieved using study root information model, but the problem is that the transfered dicoms do not have 'Patient name', or 'patient ID' tags. So the new dicoms cannot be added to the existing study. The fact that the dicoms from the PACS does not contain patient information seems to be related to the Worklist, so I came to this point. Could you advice if there is a point that I am missing?

    ReplyDelete
    Replies
    1. Check why you don't get patient name and ID from the worklist.
      if you want to add a series to a study I suggest that you take a different approach.
      first query the study from the PACS and even retrieve it completely.
      Then add your series, then send the new series to the PACS.
      You have this feature in MODALIZER+ implemented.
      Check https://modalizer.plus/
      You can download an evaluation (30 days free)
      Go to the query screen and search for your study then right click the line and select "Add image/eport as new Series"

      Delete