The LEADTOOLS Storage Server Manager DICOM listening service responds to received C-FIND Requests with one or more C-FIND Reponses. The C-FIND response contains DICOM attributes that are specified in the request.
To use a custom database schema, a configuration file must be defined so that the DICOM listening service to fill the C-FIND Response with the proper attributes, and set the attribute values with the corresponding data from the database.
The default configuration file that ships with LEAD Storage Server Manager is named QueryIOD.xml. The default configuration is defined to return attributes, and sequences of attributes for the shipping database. For the tutorial database, we do not return sequences of items.
The structure of QueryIOD.xml is as follows. It consists of <patientLevel>, <studyLevel>, <seriesLevel>, and <imageLevel> elements, each of which contain one or more <element> elements.
<query>
<patientLevel>
<element>...</element>
<element>...</element>
...
</patientLevel>
<studyLevel>
<element>...</element>
<element>...</element>
...
</ studyLevel >
< seriesLevel >
<element>...</element>
<element>...</element>
...
</ seriesLevel >
<imageLevel>
<element>...</element>
<element>...</element>
...
</ imageLevel >
</query>
Each <element> element corresponds to an attribute in the C-FIND Request, and provides a mapping a corresponding value in the database.
The following is an example <element> for the tutorial database. It maps the DICOM element PatientID (0010,0010) to the corresponding table name (MyPatientTable) and column (PatientName).
<element tag="(0010,0010)"
tagName="PatientName"
vr="PN"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="WildCard"
tableName="MyPatientTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyPatient,My.Medical.Storage.DataAccessLayer"
columnsName="PatientName" />
Attribute |
Explanation |
tag |
DICOM data element tag (group,element) |
tagName |
Named constant name (from class DicomTag) |
vr |
Value representation that indicates the type of the value stored in the data element |
minVM |
Minimum value multiplicity -minimum number of values that may be stored |
maxVM |
Maximum value multiplicity - maximum number of values that may be stored |
vmDivider |
Number of stored values must be a multiple of the vmDivider |
keyType |
|
matchingType |
One of the following (defined in Part 4 of DICOM Specification)
|
tableName |
DataSet Table name that contains the data |
matchingEntity |
Fully qualified class name, followed by assembly name defining the class The fully qualified class is one that derives from class CatalogEntity For the tutorial, it is one of the following:
For the tutorial, the assembly name is
|
columnsName |
DataSet Column name that contains the data |
The full text of the MyQueryIOD.xml is given below:
MyQueryIOD.xml
<?xml version="1.0" encoding="utf-8" ?>
<query>
<patientLevel>
<element tag="(0010,0010)"
tagName="PatientName"
vr="PN"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="WildCard"
tableName="MyPatientTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyPatient,My.Medical.Storage.DataAccessLayer"
columnsName="PatientName" />
<element tag="(0010,0020)"
tagName="PatientID"
vr="LO"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Unique"
matchingType="SingleValue"
tableName="MyPatientTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyPatient,My.Medical.Storage.DataAccessLayer"
columnsName="PatientIdentification" />
<element tag="(0010,0030)"
tagName="PatientBirthDate"
vr="DA"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="Range"
tableName="MyPatientTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyPatient,My.Medical.Storage.DataAccessLayer"
columnsName="PatientBirthday" />
<element tag="(0010,0040)"
tagName="PatientSex"
vr="CS"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="SingleValue"
tableName="MyPatientTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyPatient,My.Medical.Storage.DataAccessLayer"
columnsName="PatientSex" />
<element tag="(0010,4000)"
tagName="PatientComments"
vr="LT"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="NotApplicable"
tableName="MyPatientTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyPatient,My.Medical.Storage.DataAccessLayer"
columnsName="PatientComments" />
</patientLevel>
<studyLevel>
<element tag="(0008,0020)"
tagName="StudyDate"
vr="DA"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="Range"
tableName="MyStudyTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyStudy,My.Medical.Storage.DataAccessLayer"
columnsName="StudyStudyDate" />
<element tag="(0008,0050)"
tagName="AccessionNumber"
vr="SH"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="SingleValue"
tableName="MyStudyTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyStudy,My.Medical.Storage.DataAccessLayer"
columnsName="StudyAccessionNumber" />
<element tag="(0008,0061)"
tagName="ModalitiesInStudy"
vr="CS"
minVM="1"
maxVM="-1"
vmDivider="1"
vmDistinct="true"
keyType="Optional"
matchingType="SingleValue"
tableName="MySeriesTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MySeries,My.Medical.Storage.DataAccessLayer"
columnsName="SeriesModality" />
<element tag="(0008,0062)"
tagName="SOPClassesInStudy"
vr="UI"
minVM="1"
maxVM="-1"
vmDivider="1"
vmDistinct="true"
keyType="Optional"
matchingType="ListOfUID"
tableName="MyInstanceTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.MatchingParameters.Image,My.Medical.Storage.DataAccessLayer"
columnsName="ImageUniqueSOPClassUID" />
<element tag="(0008,0090)"
tagName="ReferringPhysiciansName"
vr="PN"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="SingleValue"
tableName="MyStudyTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyStudy,My.Medical.Storage.DataAccessLayer"
columnsName="StudyReferringPhysiciansName" />
<element tag="(0008,1030)"
tagName="StudyDescription"
vr="LO"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="NotApplicable"
tableName="MyStudyTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyStudy,My.Medical.Storage.DataAccessLayer"
columnsName="StudyStudyDescription" />
<element tag="(0020,0010)"
tagName="StudyID"
vr="SH"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="SingleValue"
tableName="MyStudyTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyStudy,My.Medical.Storage.DataAccessLayer"
columnsName="StudyStudyId" />
<element tag="(0020,000D)"
tagName="StudyInstanceUID"
vr="UI"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Unique"
matchingType="ListOfUID"
tableName="MyStudyTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyStudy,My.Medical.Storage.DataAccessLayer"
columnsName="StudyStudyInstanceUID" />
</studyLevel>
<seriesLevel>
<element tag="(0008,0060)"
tagName="Modality"
vr="CS"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="SingleValue"
tableName="MySeriesTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MySeries,My.Medical.Storage.DataAccessLayer"
columnsName="SeriesModality" />
<element tag="(0008,103E)"
tagName="SeriesDescription"
vr="LO"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="SingleValue"
tableName="MySeriesTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MySeries,My.Medical.Storage.DataAccessLayer"
columnsName="SeriesSeriesDescription" />
<element tag="(0008,0021)"
tagName="SeriesDate"
vr="DA"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="Range"
tableName="MySeriesTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MySeries,My.Medical.Storage.DataAccessLayer"
columnsName="SeriesSeriesDate" />
<element tag="(0018,0015)"
tagName="BodyPartExamined"
vr="CS"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="Range"
tableName="MySeriesTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MySeries,My.Medical.Storage.DataAccessLayer"
columnsName="SeriesBodyPartExamined" />
<element tag="(0020,0011)"
tagName="SeriesNumber"
vr="IS"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="SingleValue"
tableName="MySeriesTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MySeries,My.Medical.Storage.DataAccessLayer"
columnsName="SeriesSeriesNumber" />
<element tag="(0020,000E)"
tagName="SeriesInstanceUID"
vr="UI"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="ListOfUID"
tableName="MySeriesTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MySeries,My.Medical.Storage.DataAccessLayer"
columnsName="SeriesSeriesInstanceUID" />
</seriesLevel>
<imageLevel>
<element tag="(0020,0013)"
tagName="InstanceNumber"
vr="IS"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="SingleValue"
tableName="MyInstanceTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyInstance,My.Medical.Storage.DataAccessLayer"
columnsName="ImageImageNumber" />
<element tag="(0008,0016)"
tagName="SOPClassUID"
vr="UI"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="ListOfUID"
tableName="MyInstanceTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyInstance,My.Medical.Storage.DataAccessLayer"
columnsName="ImageUniqueSOPClassUID" />
<element tag="(0008,0018)"
tagName="SOPInstanceUID"
vr="UI"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Required"
matchingType="ListOfUID"
tableName="MyInstanceTable"
matchingEntity="My.Medical.Storage.DataAccessLayer.Entities.MyInstance,My.Medical.Storage.DataAccessLayer"
columnsName="SOPInstanceUID" />
<element tag="(0028,0010)"
tagName="Rows"
vr="US"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="NotApplicable"
tableName="ImageInstance"
matchingEntity="My.Medical.Storage.DataAccessLayer.MatchingParameters.ImageInstance,My.Medical.Storage.DataAccessLayer"
columnsName="ImageRows" />
<element tag="(0028,0011)"
tagName="Columns"
vr="US"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="NotApplicable"
tableName="ImageInstance"
matchingEntity="My.Medical.Storage.DataAccessLayer.MatchingParameters.ImageInstance,My.Medical.Storage.DataAccessLayer"
columnsName="ImageColumns" />
<element tag="(0028,0100)"
tagName="BitsAllocated"
vr="US"
minVM="1"
maxVM="1"
vmDivider="1"
keyType="Optional"
matchingType="NotApplicable"
tableName="ImageInstance"
matchingEntity="My.Medical.Storage.DataAccessLayer.MatchingParameters.ImageInstance,My.Medical.Storage.DataAccessLayer"
columnsName="ImageBitsAllocated" />
</imageLevel>
</query>