示例#1
0
            private static string ConvertListOfUidCriteria(string listOfUidCriteria, string columnName)
            {
                string uids = StringUtilities.Combine(DicomStringHelper.GetStringArray(listOfUidCriteria), ", ",
                                                      delegate(string value) { return(String.Format("'{0}'", value)); });

                return(String.Format("{0} in ( {1} )", columnName, uids));
            }
示例#2
0
        public void TestStringArrayConverter()
        {
            string input = null;

            string[] output = DicomStringHelper.GetStringArray(input);
            Assert.AreEqual(output.Length, 0);

            input  = "";
            output = DicomStringHelper.GetStringArray(input);
            Assert.AreEqual(output.Length, 0);

            input  = @"the\lazy\\brown\dog";
            output = DicomStringHelper.GetStringArray(input);
            Assert.AreEqual(output[0], "the");
            Assert.AreEqual(output[1], "lazy");
            Assert.AreEqual(output[2], "");
            Assert.AreEqual(output[3], "brown");
            Assert.AreEqual(output[4], "dog");

            input  = @"\the\lazy\brown\dog";
            output = DicomStringHelper.GetStringArray(input);
            Assert.AreEqual(output[0], "");
            Assert.AreEqual(output[1], "the");
            Assert.AreEqual(output[2], "lazy");
            Assert.AreEqual(output[3], "brown");
            Assert.AreEqual(output[4], "dog");

            input  = @"the\lazy\brown\dog\";
            output = DicomStringHelper.GetStringArray(input);
            Assert.AreEqual(output[0], "the");
            Assert.AreEqual(output[1], "lazy");
            Assert.AreEqual(output[2], "brown");
            Assert.AreEqual(output[3], "dog");
            Assert.AreEqual(output[4], "");
        }
示例#3
0
        /// <summary>
        /// Gets an enumeration of <see cref="VoiWindow"/>s defined in the specified data source.
        /// </summary>
        /// <param name="dataset">A DICOM data source.</param>
        /// <returns>An enumeration of <see cref="VoiWindow"/>s.</returns>
        public static IEnumerable <VoiWindow> GetWindows(IDicomAttributeProvider dataset)
        {
            string windowCenterValues = dataset[DicomTags.WindowCenter].ToString();

            if (string.IsNullOrEmpty(windowCenterValues))
            {
                yield break;
            }

            string windowWidthValues = dataset[DicomTags.WindowWidth].ToString();

            if (string.IsNullOrEmpty(windowWidthValues))
            {
                yield break;
            }

            string windowExplanationValues = dataset[DicomTags.WindowCenterWidthExplanation].ToString();

            double[] windowCenters;
            DicomStringHelper.TryGetDoubleArray(windowCenterValues, out windowCenters);

            double[] windowWidths;
            DicomStringHelper.TryGetDoubleArray(windowWidthValues, out windowWidths);

            string[] windowExplanations = DicomStringHelper.GetStringArray(windowExplanationValues);

            foreach (VoiWindow window in GetWindows(windowCenters, windowWidths, windowExplanations))
            {
                yield return(window);
            }
        }
示例#4
0
 /// <summary>
 /// Returns a delegate that will get the value of <paramref name="dicomTag"/> (all positions),
 /// from an <see cref="ImageSop"/> as an array of <see cref="string"/>s.
 /// </summary>
 public static FrameDataRetrieverDelegate <string[]> GetStringArrayRetriever(uint dicomTag)
 {
     return(delegate(Frame frame)
     {
         string value;
         value = frame.ParentImageSop[dicomTag].ToString();
         return DicomStringHelper.GetStringArray(value ?? "");
     });
 }
        /// <summary>
        /// Creates a <see cref="PatientOrientation"/> object from a dicom multi-valued string.
        /// </summary>
        /// <returns>
        /// Null if there are not exactly 2 parsed values in the input string.
        /// </returns>
        public static PatientOrientation FromString(string multiValuedString)
        {
            string[] values = DicomStringHelper.GetStringArray(multiValuedString);
            if (values != null && values.Length == 2)
            {
                return(new PatientOrientation(values[0], values[1]));
            }

            return(null);
        }
        /// <summary>
        /// Parses a <see cref="PatientOrientation"/> from a DICOM multi-valued string.
        /// </summary>
        /// <param name="multiValuedString">Patient orientation, defined in orientation of rows and orientation of columns, separated by a backslash.</param>
        /// <param name="anatomicalOrientationType">The anatomical orientation type code.</param>
        /// <returns>
        /// NULL if there are not exactly 2 parsed values in the input string.
        /// </returns>
        public static PatientOrientation FromString(string multiValuedString, string anatomicalOrientationType)
        {
            if (string.IsNullOrEmpty(multiValuedString))
            {
                return(null);
            }
            var values = DicomStringHelper.GetStringArray(multiValuedString);

            return(values != null && values.Length == 2 ? new PatientOrientation(values[0], values[1], anatomicalOrientationType) : null);
        }
示例#7
0
        public StudyEntry ToStoreEntry()
        {
            var entry = new StudyEntry
            {
                Study = new StudyRootStudyIdentifier(this)
                {
                    InstanceAvailability = "ONLINE",
                    RetrieveAE           = ServerDirectory.GetLocalServer(),
                    SpecificCharacterSet = SpecificCharacterSet
                },
                Data = new StudyEntryData
                {
                    DeleteTime = DeleteTime,
                    InstitutionNamesInStudy = DicomStringHelper.GetStringArray(InstitutionNamesInStudy),
                    SourceAETitlesInStudy   = DicomStringHelper.GetStringArray(SourceAETitlesInStudy),
                    StationNamesInStudy     = DicomStringHelper.GetStringArray(StationNamesInStudy),
                    StoreTime = StoreTime
                }
            };

            return(entry);
        }
        public void TestListFormatters()
        {
            string input  = @"The\brown\dog\\jumped";
            string result = DicomDataFormatHelper.StringListFormat(DicomStringHelper.GetStringArray(input));

            Assert.AreEqual(result, "The,\nbrown,\ndog,\njumped");

            input  = @"Doe^John^^^";
            result = DicomDataFormatHelper.PersonNameFormatter(new PersonName(input));
            Assert.AreEqual(result, "Doe, John");

            input  = @"^John^^^";
            result = DicomDataFormatHelper.PersonNameFormatter(new PersonName(input));
            Assert.AreEqual(result, "John");

            input  = @"Doe^^^^";
            result = DicomDataFormatHelper.PersonNameFormatter(new PersonName(input));
            Assert.AreEqual(result, "Doe");

            input  = @"Doe^John^^^\Doe^Jane^^^";
            result = DicomDataFormatHelper.PersonNameListFormatter(DicomStringHelper.GetPersonNameArray(input));
            Assert.AreEqual(result, "Doe, John,\nDoe, Jane");

            input  = @"^John^^^\Doe^Jane^^^";
            result = DicomDataFormatHelper.PersonNameListFormatter(DicomStringHelper.GetPersonNameArray(input));
            Assert.AreEqual(result, "John,\nDoe, Jane");

            input  = @"^John^^^\Doe^^^^";
            result = DicomDataFormatHelper.PersonNameListFormatter(DicomStringHelper.GetPersonNameArray(input));
            Assert.AreEqual(result, "John,\nDoe");

            input  = @"^^^^\Doe^^^^";
            result = DicomDataFormatHelper.PersonNameListFormatter(DicomStringHelper.GetPersonNameArray(input));
            Assert.AreEqual(result, "Doe");

            input  = @"^^^^\^^^^";
            result = DicomDataFormatHelper.PersonNameListFormatter(DicomStringHelper.GetPersonNameArray(input));
            Assert.AreEqual(result, "");
        }
示例#9
0
        public static string[] ToStringArray(object value, TypeConverter converter)
        {
            if (value == null)
            {
                return new string[] { }
            }
            ;

            if (value.GetType().IsArray)
            {
                Array array = value as Array;

                if (array == null)
                {
                    return new string[] { }
                }
                ;

                string[] stringArray = new string[array.Length];
                int      i           = 0;
                foreach (object arrayValue in array)
                {
                    stringArray[i++] = ToString(arrayValue, converter);
                }

                return(stringArray);
            }
            else if (value is string)
            {
                //Assume strings are (potentially) multi-valued.  If they're not, then this has no effect anyway.
                return(DicomStringHelper.GetStringArray(((string)value) ?? ""));
            }
            else
            {
                return(new string[] { ToString(value, converter) });
            }
        }
    }
}
示例#10
0
            // NOTE: this method is not bulletproof in the (very, very, very!) unusual case where there are
            // wildcards in the modalities in study criteria, but we still try to narrow down the result set
            // that is going to be post-filtered.
            private static string ConvertModalitiesInStudyCriteria(string criteria, string columnName)
            {
                //Modalities in study is a special case, where we allow list matching (not dicom compliant).
                string[]      criteriaValues = DicomStringHelper.GetStringArray(criteria);
                StringBuilder builder        = new StringBuilder();

                int i = 0;

                foreach (string criteriaValue in criteriaValues)
                {
                    criteria = criteriaValue;
                    string filter = "";
                    if (!ContainsWildcardCharacters(criteria))
                    {
                        filter = String.Format("{0} = '{1}' OR ", columnName, criteria);
                    }
                    else
                    {
                        ReplaceWildcardCharacters(ref criteria);
                        filter = String.Format("{0} LIKE '{1}' OR ", columnName, criteria);
                    }

                    filter += String.Format(@"{0} LIKE '{1}\%' " +
                                            @" OR {0} LIKE '%\{1}' " +
                                            @" OR {0} LIKE '%\{1}\%' ", columnName, criteria);

                    if (i++ > 0)
                    {
                        builder.Append(" OR ");
                    }

                    builder.AppendFormat(" ({0}) ", filter);
                }

                return(builder.ToString());
            }
示例#11
0
        public override StudyItemList Query(QueryParameters queryParams, IApplicationEntity server)
        {
            Platform.CheckForNullReference(queryParams, "queryParams");

            //.NET strings are unicode, therefore, so is all the query data.
            const string utf8       = "ISO_IR 192";
            var          collection = new DicomAttributeCollection {
                SpecificCharacterSet = utf8
            };

            collection[DicomTags.SpecificCharacterSet].SetStringValue(utf8);

            collection[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY");
            collection[DicomTags.PatientId].SetStringValue(queryParams["PatientId"]);
            collection[DicomTags.AccessionNumber].SetStringValue(queryParams["AccessionNumber"]);
            collection[DicomTags.PatientsName].SetStringValue(queryParams["PatientsName"]);
            collection[DicomTags.ReferringPhysiciansName].SetStringValue(queryParams["ReferringPhysiciansName"]);
            collection[DicomTags.StudyDate].SetStringValue(queryParams["StudyDate"]);
            collection[DicomTags.StudyTime].SetStringValue("");
            collection[DicomTags.StudyDescription].SetStringValue(queryParams["StudyDescription"]);
            collection[DicomTags.PatientsBirthDate].SetStringValue("");
            collection[DicomTags.ModalitiesInStudy].SetStringValue(queryParams["ModalitiesInStudy"]);
            collection[DicomTags.StudyInstanceUid].SetStringValue(queryParams["StudyInstanceUid"]);
            collection[DicomTags.NumberOfStudyRelatedInstances].SetStringValue("");
            collection[DicomTags.InstanceAvailability].SetEmptyValue();             // must not be included in request

            collection[DicomTags.PatientSpeciesDescription].SetStringValue(GetString(queryParams, "PatientSpeciesDescription"));
            var codeValue   = GetString(queryParams, "PatientSpeciesCodeSequenceCodeValue");
            var codeMeaning = GetString(queryParams, "PatientSpeciesCodeSequenceCodeMeaning");

            if (codeValue != null || codeMeaning != null)
            {
                var codeSequenceMacro = new CodeSequenceMacro
                {
                    CodingSchemeDesignator = "",
                    CodeValue   = codeValue,
                    CodeMeaning = codeMeaning
                };
                collection[DicomTags.PatientSpeciesCodeSequence].AddSequenceItem(codeSequenceMacro.DicomSequenceItem);
            }

            collection[DicomTags.PatientBreedDescription].SetStringValue(GetString(queryParams, "PatientBreedDescription"));
            codeValue   = GetString(queryParams, "PatientBreedCodeSequenceCodeValue");
            codeMeaning = GetString(queryParams, "PatientBreedCodeSequenceCodeMeaning");
            if (codeValue != null || codeMeaning != null)
            {
                var codeSequenceMacro = new CodeSequenceMacro
                {
                    CodingSchemeDesignator = "",
                    CodeValue   = codeValue,
                    CodeMeaning = codeMeaning
                };
                collection[DicomTags.PatientBreedCodeSequence].AddSequenceItem(codeSequenceMacro.DicomSequenceItem);
            }

            collection[DicomTags.ResponsiblePerson].SetStringValue(GetString(queryParams, "ResponsiblePerson"));
            collection[DicomTags.ResponsiblePersonRole].SetStringValue("");
            collection[DicomTags.ResponsibleOrganization].SetStringValue(GetString(queryParams, "ResponsibleOrganization"));

            var localServer   = ServerDirectory.GetLocalServer();
            var studyItemList = new StudyItemList();

            using (var context = new DataAccessContext())
            {
                foreach (DicomAttributeCollection result in context.GetStudyStoreQuery().Query(collection))
                {
                    var item = new StudyItem(result[DicomTags.StudyInstanceUid].ToString(), localServer);
                    item.SpecificCharacterSet          = result.SpecificCharacterSet;
                    item.PatientId                     = result[DicomTags.PatientId].ToString();
                    item.PatientsName                  = new PersonName(result[DicomTags.PatientsName].ToString());
                    item.ReferringPhysiciansName       = new PersonName(result[DicomTags.ReferringPhysiciansName].GetString(0, ""));
                    item.PatientsBirthDate             = result[DicomTags.PatientsBirthDate].ToString();
                    item.StudyDate                     = result[DicomTags.StudyDate].ToString();
                    item.StudyTime                     = result[DicomTags.StudyTime].ToString();
                    item.StudyDescription              = result[DicomTags.StudyDescription].ToString();
                    item.ModalitiesInStudy             = DicomStringHelper.GetStringArray(result[DicomTags.ModalitiesInStudy].ToString());
                    item.AccessionNumber               = result[DicomTags.AccessionNumber].ToString();
                    item.NumberOfStudyRelatedInstances = result[DicomTags.NumberOfStudyRelatedInstances].GetInt32(0, 0);
                    item.InstanceAvailability          = result[DicomTags.InstanceAvailability].GetString(0, "");
                    if (String.IsNullOrEmpty(item.InstanceAvailability))
                    {
                        item.InstanceAvailability = "ONLINE";
                    }

                    item.PatientSpeciesDescription = result[DicomTags.PatientSpeciesDescription].GetString(0, "");
                    var patientSpeciesCodeSequence = result[DicomTags.PatientSpeciesCodeSequence];
                    if (!patientSpeciesCodeSequence.IsNull && patientSpeciesCodeSequence.Count > 0)
                    {
                        var codeSequenceMacro = new CodeSequenceMacro(((DicomSequenceItem[])result[DicomTags.PatientSpeciesCodeSequence].Values)[0]);
                        item.PatientSpeciesCodeSequenceCodingSchemeDesignator = codeSequenceMacro.CodingSchemeDesignator;
                        item.PatientSpeciesCodeSequenceCodeValue   = codeSequenceMacro.CodeValue;
                        item.PatientSpeciesCodeSequenceCodeMeaning = codeSequenceMacro.CodeMeaning;
                    }

                    item.PatientBreedDescription = result[DicomTags.PatientBreedDescription].GetString(0, "");
                    var patientBreedCodeSequence = result[DicomTags.PatientBreedCodeSequence];
                    if (!patientBreedCodeSequence.IsNull && patientBreedCodeSequence.Count > 0)
                    {
                        var codeSequenceMacro = new CodeSequenceMacro(((DicomSequenceItem[])result[DicomTags.PatientBreedCodeSequence].Values)[0]);
                        item.PatientBreedCodeSequenceCodingSchemeDesignator = codeSequenceMacro.CodingSchemeDesignator;
                        item.PatientBreedCodeSequenceCodeValue   = codeSequenceMacro.CodeValue;
                        item.PatientBreedCodeSequenceCodeMeaning = codeSequenceMacro.CodeMeaning;
                    }

                    item.ResponsiblePerson       = new PersonName(result[DicomTags.ResponsiblePerson].GetString(0, ""));
                    item.ResponsiblePersonRole   = result[DicomTags.ResponsiblePersonRole].GetString(0, "");
                    item.ResponsibleOrganization = result[DicomTags.ResponsibleOrganization].GetString(0, "");

                    studyItemList.Add(item);
                }
            }

            AuditHelper.LogQueryIssued(null, null, EventSource.CurrentUser, EventResult.Success,
                                       SopClass.StudyRootQueryRetrieveInformationModelFindUid, collection);

            return(studyItemList);
        }
 string[] IMultiValuedPropertyFilter <TDatabaseObject> .GetPropertyValues(TDatabaseObject item)
 {
     return(DicomStringHelper.GetStringArray(GetPropertyValue(item)));
 }
示例#13
0
        private static bool IsAttenuationCorrected(Sop sop)
        {
            var correctionTypes = DicomStringHelper.GetStringArray(sop[DicomTags.CorrectedImage].ToString().ToUpperInvariant());

            return(Array.FindIndex(correctionTypes, s => s == _attenuationCorrectionCode) >= 0);
        }
示例#14
0
            protected override IEnumerable <Series> FilterResults(IEnumerable <Series> results)
            {
                var criterion = DicomStringHelper.GetStringArray(Criterion.ToString());

                return(results.Where(s => criterion.Contains(s.SeriesInstanceUid)));
            }
示例#15
0
            private DicomAttributeCollection GetResult(T candidate)
            {
                DicomAttributeCollection result = new DicomAttributeCollection();

                string specificCharacterSet = _getSpecificCharacterSetDelegate(candidate);

                if (!String.IsNullOrEmpty(specificCharacterSet))
                {
                    result.SpecificCharacterSet = specificCharacterSet;
                    result[DicomTags.SpecificCharacterSet].SetStringValue(specificCharacterSet);
                }
                result.ValidateVrLengths = false;
                result.ValidateVrValues  = false;

                foreach (QueryablePropertyInfo property in QueryableProperties <T> .GetProperties())
                {
                    string criteria = _queryCriteria[property.Path];

                    bool includeResult = property.IsUnique || property.IsHigherLevelUnique || criteria != null;
                    if (!includeResult)
                    {
                        continue;
                    }

                    object   propertyValue = property.ReturnProperty.GetValue(candidate, null);
                    string[] testValues    = Convert.ToStringArray(propertyValue, property.ReturnPropertyConverter);

                    if (criteria == null)
                    {
                        criteria = "";
                    }

                    bool isModalitiesInStudy = property.Path.Equals(DicomTags.ModalitiesInStudy);
                    bool containsWildcards   = ContainsWildcardCharacters(criteria);

                    //special case, we post-filter modalities in study when it contains wildcards b/c the hql query won't
                    //always produce exactly the right results.  This will never happen anyway.
                    bool query = !String.IsNullOrEmpty(criteria) && ((!property.IsHigherLevelUnique && property.PostFilterOnly) ||
                                                                     (isModalitiesInStudy && containsWildcards));

                    if (query)
                    {
                        string[] criteriaValues;
                        if (property.AllowListMatching)
                        {
                            criteriaValues = DicomStringHelper.GetStringArray(criteria);
                        }
                        else
                        {
                            criteriaValues = new string[] { criteria }
                        };

                        //When something doesn't match, the candidate is not a match, and the result is filtered out.
                        if (!AnyMatch(property, criteriaValues, testValues))
                        {
                            return(null);
                        }
                    }

                    string resultValue = DicomStringHelper.GetDicomStringArray(testValues);
                    AddValueToResult(property.Path, resultValue, result);
                }

                return(result);
            }
示例#16
0
        internal void Initialize(DicomFile file)
        {
            DicomAttributeCollection sopInstanceDataset = file.DataSet;

            DicomAttribute attribute       = sopInstanceDataset[DicomTags.StudyInstanceUid];
            string         datasetStudyUid = attribute.ToString();

            if (!String.IsNullOrEmpty(StudyInstanceUid) && StudyInstanceUid != datasetStudyUid)
            {
                string message = String.Format("The study uid in the data set does not match this study's uid ({0} != {1}).",
                                               datasetStudyUid, StudyInstanceUid);

                throw new InvalidOperationException(message);
            }
            else
            {
                StudyInstanceUid = attribute.ToString();
            }

            Platform.CheckForEmptyString(StudyInstanceUid, "StudyInstanceUid");

            attribute = sopInstanceDataset[DicomTags.PatientId];
            PatientId = attribute.ToString();

            attribute       = sopInstanceDataset[DicomTags.PatientsName];
            PatientsName    = new PersonName(attribute.ToString());
            PatientsNameRaw = DicomImplementation.CharacterParser.EncodeAsIsomorphicString(PatientsName, sopInstanceDataset.SpecificCharacterSet);

            attribute = sopInstanceDataset[DicomTags.ReferringPhysiciansName];
            ReferringPhysiciansName    = new PersonName(attribute.ToString());
            ReferringPhysiciansNameRaw = DicomImplementation.CharacterParser.EncodeAsIsomorphicString(ReferringPhysiciansName, sopInstanceDataset.SpecificCharacterSet);

            attribute   = sopInstanceDataset[DicomTags.PatientsSex];
            PatientsSex = attribute.ToString();

            attribute            = sopInstanceDataset[DicomTags.PatientsBirthDate];
            PatientsBirthDateRaw = attribute.ToString();

            attribute = sopInstanceDataset[DicomTags.StudyId];
            StudyId   = attribute.ToString();

            attribute       = sopInstanceDataset[DicomTags.AccessionNumber];
            AccessionNumber = attribute.ToString();

            attribute        = sopInstanceDataset[DicomTags.StudyDescription];
            StudyDescription = attribute.ToString();

            attribute    = sopInstanceDataset[DicomTags.StudyDate];
            StudyDateRaw = attribute.ToString();
            StudyDate    = DateParser.Parse(StudyDateRaw);

            attribute    = sopInstanceDataset[DicomTags.StudyTime];
            StudyTimeRaw = attribute.ToString();

            if (sopInstanceDataset.Contains(DicomTags.ProcedureCodeSequence))
            {
                attribute = sopInstanceDataset[DicomTags.ProcedureCodeSequence];
                if (!attribute.IsEmpty && !attribute.IsNull)
                {
                    DicomSequenceItem sequence = ((DicomSequenceItem[])attribute.Values)[0];
                    ProcedureCodeSequenceCodeValue = sequence[DicomTags.CodeValue].ToString();
                    ProcedureCodeSequenceCodingSchemeDesignator = sequence[DicomTags.CodingSchemeDesignator].ToString();
                }
            }

            attribute            = sopInstanceDataset[DicomTags.SpecificCharacterSet];
            SpecificCharacterSet = attribute.ToString();

            string[] modalitiesInStudy = DicomStringHelper.GetStringArray(ModalitiesInStudy ?? "");
            ModalitiesInStudy = DicomStringHelper.GetDicomStringArray(
                ComputeModalitiesInStudy(modalitiesInStudy, sopInstanceDataset[DicomTags.Modality].GetString(0, "")));
        }
示例#17
0
        public override StudyItemList Query(QueryParameters queryParams, IApplicationEntity targetServer)
        {
            Platform.CheckForNullReference(queryParams, "queryParams");
            Platform.CheckForNullReference(targetServer, "targetServer");

            var selectedServer = targetServer.ToServiceNode();

            //.NET strings are unicode, therefore, so is all the query data.
            const string utf8 = "ISO_IR 192";
            var          requestCollection = new DicomAttributeCollection {
                SpecificCharacterSet = utf8
            };

            requestCollection[DicomTags.SpecificCharacterSet].SetStringValue(utf8);

            requestCollection[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY");
            requestCollection[DicomTags.StudyInstanceUid].SetStringValue("");

            requestCollection[DicomTags.PatientId].SetStringValue(queryParams["PatientId"]);
            requestCollection[DicomTags.AccessionNumber].SetStringValue(queryParams["AccessionNumber"]);
            requestCollection[DicomTags.PatientsName].SetStringValue(queryParams["PatientsName"]);
            requestCollection[DicomTags.ReferringPhysiciansName].SetStringValue(queryParams["ReferringPhysiciansName"]);
            requestCollection[DicomTags.StudyDate].SetStringValue(queryParams["StudyDate"]);
            requestCollection[DicomTags.StudyTime].SetStringValue("");
            requestCollection[DicomTags.StudyDescription].SetStringValue(queryParams["StudyDescription"]);
            requestCollection[DicomTags.PatientsBirthDate].SetStringValue("");
            requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(queryParams["ModalitiesInStudy"]);
            requestCollection[DicomTags.NumberOfStudyRelatedInstances].SetStringValue("");
            requestCollection[DicomTags.InstanceAvailability].SetEmptyValue();             // must not be included in request

            requestCollection[DicomTags.PatientSpeciesDescription].SetStringValue(GetString(queryParams, "PatientSpeciesDescription"));
            var codeValue   = GetString(queryParams, "PatientSpeciesCodeSequenceCodeValue");
            var codeMeaning = GetString(queryParams, "PatientSpeciesCodeSequenceCodeMeaning");

            if (codeValue != null || codeMeaning != null)
            {
                var codeSequenceMacro = new CodeSequenceMacro
                {
                    CodingSchemeDesignator = "",
                    CodeValue   = codeValue,
                    CodeMeaning = codeMeaning
                };
                requestCollection[DicomTags.PatientSpeciesCodeSequence].AddSequenceItem(codeSequenceMacro.DicomSequenceItem);
            }

            requestCollection[DicomTags.PatientBreedDescription].SetStringValue(GetString(queryParams, "PatientBreedDescription"));
            codeValue   = GetString(queryParams, "PatientBreedCodeSequenceCodeValue");
            codeMeaning = GetString(queryParams, "PatientBreedCodeSequenceCodeMeaning");
            if (codeValue != null || codeMeaning != null)
            {
                var codeSequenceMacro = new CodeSequenceMacro
                {
                    CodingSchemeDesignator = "",
                    CodeValue   = codeValue,
                    CodeMeaning = codeMeaning
                };
                requestCollection[DicomTags.PatientBreedCodeSequence].AddSequenceItem(codeSequenceMacro.DicomSequenceItem);
            }

            requestCollection[DicomTags.ResponsiblePerson].SetStringValue(GetString(queryParams, "ResponsiblePerson"));
            requestCollection[DicomTags.ResponsiblePersonRole].SetStringValue("");
            requestCollection[DicomTags.ResponsibleOrganization].SetStringValue(GetString(queryParams, "ResponsibleOrganization"));

            IList <DicomAttributeCollection> results = Query(selectedServer, requestCollection);

            StudyItemList studyItemList = new StudyItemList();

            foreach (DicomAttributeCollection result in results)
            {
                StudyItem item = new StudyItem(result[DicomTags.StudyInstanceUid].GetString(0, ""), selectedServer);

                //TODO: add DicomField attributes to the StudyItem class (implement typeconverter for PersonName class).
                item.PatientsBirthDate       = result[DicomTags.PatientsBirthDate].GetString(0, "");
                item.AccessionNumber         = result[DicomTags.AccessionNumber].GetString(0, "");
                item.StudyDescription        = result[DicomTags.StudyDescription].GetString(0, "");
                item.StudyDate               = result[DicomTags.StudyDate].GetString(0, "");
                item.StudyTime               = result[DicomTags.StudyTime].GetString(0, "");
                item.PatientId               = result[DicomTags.PatientId].GetString(0, "");
                item.PatientsName            = new PersonName(result[DicomTags.PatientsName].GetString(0, ""));
                item.ReferringPhysiciansName = new PersonName(result[DicomTags.ReferringPhysiciansName].GetString(0, ""));
                item.ModalitiesInStudy       = DicomStringHelper.GetStringArray(result[DicomTags.ModalitiesInStudy].ToString());
                DicomAttribute attribute = result[DicomTags.NumberOfStudyRelatedInstances];
                if (!attribute.IsEmpty && !attribute.IsNull)
                {
                    item.NumberOfStudyRelatedInstances = attribute.GetInt32(0, 0);
                }

                item.SpecificCharacterSet = result.SpecificCharacterSet;
                item.InstanceAvailability = result[DicomTags.InstanceAvailability].GetString(0, "");
                if (String.IsNullOrEmpty(item.InstanceAvailability))
                {
                    item.InstanceAvailability = "ONLINE";
                }

                item.PatientSpeciesDescription = result[DicomTags.PatientSpeciesDescription].GetString(0, "");
                var patientSpeciesCodeSequence = result[DicomTags.PatientSpeciesCodeSequence];
                if (!patientSpeciesCodeSequence.IsNull && patientSpeciesCodeSequence.Count > 0)
                {
                    var codeSequenceMacro = new CodeSequenceMacro(((DicomSequenceItem[])result[DicomTags.PatientSpeciesCodeSequence].Values)[0]);
                    item.PatientSpeciesCodeSequenceCodingSchemeDesignator = codeSequenceMacro.CodingSchemeDesignator;
                    item.PatientSpeciesCodeSequenceCodeValue   = codeSequenceMacro.CodeValue;
                    item.PatientSpeciesCodeSequenceCodeMeaning = codeSequenceMacro.CodeMeaning;
                }

                item.PatientBreedDescription = result[DicomTags.PatientBreedDescription].GetString(0, "");
                var patientBreedCodeSequence = result[DicomTags.PatientBreedCodeSequence];
                if (!patientBreedCodeSequence.IsNull && patientBreedCodeSequence.Count > 0)
                {
                    var codeSequenceMacro = new CodeSequenceMacro(((DicomSequenceItem[])result[DicomTags.PatientBreedCodeSequence].Values)[0]);
                    item.PatientBreedCodeSequenceCodingSchemeDesignator = codeSequenceMacro.CodingSchemeDesignator;
                    item.PatientBreedCodeSequenceCodeValue   = codeSequenceMacro.CodeValue;
                    item.PatientBreedCodeSequenceCodeMeaning = codeSequenceMacro.CodeMeaning;
                }

                item.ResponsiblePerson       = new PersonName(result[DicomTags.ResponsiblePerson].GetString(0, ""));
                item.ResponsiblePersonRole   = result[DicomTags.ResponsiblePersonRole].GetString(0, "");
                item.ResponsibleOrganization = result[DicomTags.ResponsibleOrganization].GetString(0, "");
                studyItemList.Add(item);
            }

            AuditHelper.LogQueryIssued(selectedServer.AETitle, selectedServer.ScpParameters.HostName, EventSource.CurrentUser,
                                       EventResult.Success, SopClass.StudyRootQueryRetrieveInformationModelFindUid,
                                       requestCollection);

            return(studyItemList);
        }
        public PatientAnnotationItemProvider()
            : base("AnnotationItemProviders.Dicom.Patient", new AnnotationResourceResolver(typeof(PatientAnnotationItemProvider).Assembly))
        {
            _annotationItems = new List <IAnnotationItem>();

            AnnotationResourceResolver resolver = new AnnotationResourceResolver(this);

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.EthnicGroup",
                    resolver,
                    FrameDataRetrieverFactory.GetStringRetriever(DicomTags.EthnicGroup),
                    DicomDataFormatHelper.RawStringFormat
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.PatientComments",
                    resolver,
                    FrameDataRetrieverFactory.GetStringRetriever(DicomTags.PatientComments),
                    DicomDataFormatHelper.RawStringFormat
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.PatientId",
                    resolver,
                    delegate(Frame frame) { return(frame.ParentImageSop.PatientId); },
                    DicomDataFormatHelper.RawStringFormat
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.OtherPatientIds",
                    resolver,
                    delegate(Frame frame)
            {
                var patientIds = new List <string>();
                DicomAttribute attribute;
                if (frame.ParentImageSop.TryGetAttribute(DicomTags.OtherPatientIds, out attribute))
                {
                    patientIds.AddRange(DicomStringHelper.GetStringArray(attribute));
                }

                if (frame.ParentImageSop.TryGetAttribute(DicomTags.OtherPatientIdsSequence, out attribute) && !attribute.IsEmpty && !attribute.IsNull)
                {
                    var sqAttr = (DicomAttributeSQ)attribute;
                    for (var i = 0; i < sqAttr.Count; i++)
                    {
                        var attr = sqAttr[i][DicomTags.PatientId];
                        if (attr != null && !string.IsNullOrEmpty(attr))
                        {
                            patientIds.Add(attr);
                        }
                    }
                }

                return(DicomStringHelper.GetDicomStringArray(patientIds.Distinct()));
            },
                    DicomDataFormatHelper.RawStringFormat
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.PatientsBirthDate",
                    resolver,
                    delegate(Frame frame) { return(frame.ParentImageSop.PatientsBirthDate); },
                    DicomDataFormatHelper.DateFormat
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.PatientsBirthTime",
                    resolver,
                    FrameDataRetrieverFactory.GetStringRetriever(DicomTags.PatientsBirthTime),
                    DicomDataFormatHelper.TimeFormat
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <PersonName>
                (
                    "Dicom.Patient.PatientsName",
                    resolver,
                    delegate(Frame frame) { return(frame.ParentImageSop.PatientsName); },
                    DicomDataFormatHelper.PersonNameFormatter
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.PatientsSex",
                    resolver,
                    delegate(Frame frame) { return(frame.ParentImageSop.PatientsSex); },
                    DicomDataFormatHelper.RawStringFormat
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <PersonName>
                (
                    "Dicom.Patient.ResponsiblePerson",
                    resolver,
                    delegate(Frame frame) { return(frame.ParentImageSop.ResponsiblePerson); },
                    DicomDataFormatHelper.PersonNameFormatter
                )
            );

            _annotationItems.Add
            (
                new DicomAnnotationItem <string>
                (
                    "Dicom.Patient.ResponsibleOrganization",
                    resolver,
                    delegate(Frame frame) { return(frame.ParentImageSop.ResponsibleOrganization); },
                    DicomDataFormatHelper.RawStringFormat
                )
            );

            _annotationItems.Add
            (
                new CodeSequenceAnnotationItem
                (
                    "Dicom.Patient.PatientSpecies",
                    resolver,
                    DicomTags.PatientSpeciesCodeSequence,
                    DicomTags.PatientSpeciesDescription
                )
            );

            _annotationItems.Add
            (
                new CodeSequenceAnnotationItem
                (
                    "Dicom.Patient.PatientBreed",
                    resolver,
                    DicomTags.PatientBreedCodeSequence,
                    DicomTags.PatientBreedDescription
                )
            );
        }