Exemplo n.º 1
0
        protected void InitializeAnnotationList(string studyInstanceUID)
        {
            if (_annotationDictionary.ContainsStudy(studyInstanceUID))
            {
                return;
            }

            StudyItemList studyAnnotations = GetAnnotationsList(studyInstanceUID);             // TODO - switch to using SR IOD when we have it

            if (studyAnnotations == null || studyAnnotations.Count == 0)
            {
                return;
            }

            using (IDataStoreReader reader = DataAccessLayer.GetIDataStoreReader())
            {
                foreach (StudyItem studyItem in studyAnnotations)
                {
                    ClearCanvas.Dicom.DataStore.Study study = reader.GetStudy(studyItem.StudyInstanceUid) as ClearCanvas.Dicom.DataStore.Study;
                    if (study != null)
                    {
                        IEnumerable <ISeries> allSeries = study.GetSeries();
                        foreach (ISeries series in allSeries)
                        {
                            if (series != null && series.Modality == "SR")
                            {
                                IEnumerable <ISopInstance> sopInstances = series.GetSopInstances();
                                foreach (ISopInstance sopInstance in sopInstances)
                                {
                                    if (sopInstance != null)
                                    {
                                        DicomUri fileUri = sopInstance.GetLocationUri();
                                        if (fileUri.IsFile)
                                        {
                                            _annotationDictionary.Add(study.StudyInstanceUid, series.SeriesInstanceUid, sopInstance.SopInstanceUid, fileUri.LocalDiskPath);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                // TODO:
                // 1. Find and load all annotations (read-only?)
                //      LocalDataStoreActivityMonitor.Instance.
            }
        }
        public override StudyItemList Query(QueryParameters queryParams, object targetServer)
        {
            ApplicationEntity selectedServer = (ApplicationEntity)targetServer;

            StudyItemList list = new StudyItemList();

            foreach (var key in MINTApi.GetStudies(selectedServer.Host))
            {
                var item = new StudyItem(key.StudyUid, key, MINTApi.LoaderName);

                MINTApi.FillStudyItem(item, key);
                list.Add(item);
            }

            return(list);
        }
        /// <summary>
        /// Queries local datastore for studies based on specified search function.
        /// </summary>
        private void QueryStudies(string query, Converter <string, KeyValuePair <string, double>[]> searchFunc)
        {
            // if there is a previous task that may still be running, disconnect it so we effectively abandon it
            if (_queryStudiesTask != null)
            {
                _queryStudiesTask.ProgressUpdated -= OnQueryStudiesProgressUpdate;
            }

            // clear existing items
            _searchResults.Items.Clear();

            // create new task to query similar studies asynchronously so as not to block UI
            _queryStudiesTask = new BackgroundTask(
                delegate(IBackgroundTaskContext ctx)
            {
                KeyValuePair <string, double>[] similarStudyUids = searchFunc(query);
                foreach (KeyValuePair <string, double> kvp in similarStudyUids)
                {
                    string studyUid = kvp.Key;
                    double score    = kvp.Value;

                    QueryParameters queryParams = new QueryParameters();
                    queryParams.Add("PatientsName", "");
                    queryParams.Add("PatientId", "");
                    queryParams.Add("AccessionNumber", "");
                    queryParams.Add("StudyDescription", "");
                    queryParams.Add("ModalitiesInStudy", "");
                    queryParams.Add("StudyDate", "");
                    queryParams.Add("StudyInstanceUid", studyUid);

                    // currently only the local dicom store is supported
                    StudyItemList similarStudyItems = ImageViewerComponent.FindStudy(queryParams, null, "DICOM_LOCAL");

                    // should only ever be one result at most
                    // if zero results, it means the study exists in the tag database but not in the local dicom store
                    StudyItem studyItem = CollectionUtils.FirstElement(similarStudyItems);
                    if (studyItem != null)
                    {
                        StudyTableEntry entry = new StudyTableEntry(studyItem, MakeTagsString(_database.GetTagsForStudy(studyUid)), score);
                        ctx.ReportProgress(new StudyQueryProgress(entry));
                    }
                }
            }, false);

            _queryStudiesTask.ProgressUpdated += OnQueryStudiesProgressUpdate;
            _queryStudiesTask.Run();
        }
Exemplo n.º 4
0
        private static StudyItemList Query(QueryParameters queryParams, List <KeyValuePair <string, Exception> > failedServerInfo, List <IServerTreeNode> servers)
        {
            StudyItemList aggregateStudyItemList = new StudyItemList();

            foreach (IServerTreeNode serverNode in servers)
            {
                try
                {
                    StudyItemList serverStudyItemList;

                    if (serverNode.IsLocalDataStore)
                    {
                        serverStudyItemList = ImageViewerComponent.FindStudy(queryParams, null, "DICOM_LOCAL");
                    }
                    else if (serverNode.IsServer)
                    {
                        Server            server = (Server)serverNode;
                        ApplicationEntity ae     = new ApplicationEntity(
                            server.Host,
                            server.AETitle,
                            server.Name,
                            server.Port,
                            server.IsStreaming,
                            server.HeaderServicePort,
                            server.WadoServicePort);

                        serverStudyItemList = ImageViewerComponent.FindStudy(queryParams, ae, "DICOM_REMOTE");
                    }
                    else
                    {
                        throw new Exception("Server is not queryable");
                    }

                    aggregateStudyItemList.AddRange(serverStudyItemList);
                }
                catch (Exception e)
                {
                    // keep track of the failed server names and exceptions
                    failedServerInfo.Add(new KeyValuePair <string, Exception>(serverNode.Name, e));
                }
            }

            return(aggregateStudyItemList);
        }
Exemplo n.º 5
0
            private void FindAndAddPriors()
            {
                try
                {
                    var result = _priorStudyFinder.FindPriorStudies();
                    if (result == null)
                    {
                        return;
                    }

                    _findResultsComplete = result.ResultsComplete;
                    _queryResults        = result.Studies;
                    if (_queryResults.Count == 0)
                    {
                        return;
                    }
                }
                catch (Exception e)
                {
                    _queryResults        = new StudyItemList();
                    _findFailed          = true;
                    _findResultsComplete = false;
                    Platform.Log(LogLevel.Error, e, "The search for prior studies has failed.");
                    return;
                }

                foreach (StudyItem result in _queryResults)
                {
                    if (_stop)
                    {
                        break;
                    }

                    var loader = new SingleStudyLoader(_synchronizationContext, _imageViewer, result)
                    {
                        LoadOnlineOnly = true
                    };

                    _singleStudyLoaders.Add(loader);
                    loader.LoadStudy();
                }
            }
Exemplo n.º 6
0
        public override StudyItemList Query(QueryParameters queryParams,
                                            IApplicationEntity targetServer)
        {
            var studyItems = new StudyItemList();
            var tmp        = targetServer as MediaFileSet;

            try
            {
                if (tmp != null)
                {
                    studyItems.AddRange(tmp.Studies.Select(study => new StudyItem(study, tmp)));
                }
            }
            catch (Exception e)
            {
                Platform.Log(LogLevel.Warn, e.Message);
            }


            return(studyItems);
        }
Exemplo n.º 7
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);
        }
Exemplo n.º 8
0
 public PriorStudyFinderResult(StudyItemList studies, bool resultsComplete)
 {
     ResultsComplete = resultsComplete;
     Studies         = studies;
 }
Exemplo n.º 9
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;
        }
        private static StudyItemList Query(QueryParameters queryParams, List<KeyValuePair<string, Exception>> failedServerInfo, List<IServerTreeNode> servers)
        {
            var aggregateStudyItemList = new StudyItemList();
            foreach (var serverNode in servers)
            {
                try
                {
                    StudyItemList serverStudyItemList;

                    if (serverNode.IsLocalDataStore)
                    {
                        serverStudyItemList = ImageViewerComponent.FindStudy(queryParams, null, "DICOM_LOCAL");
                    }
                    else if (serverNode.IsServer)
                    {
                        var server = (Server)serverNode;
                        var ae = new ApplicationEntity(
                            server.Host,
                            server.AETitle,
                            server.Name,
                            server.Port,
                            server.IsStreaming,
                            server.HeaderServicePort,
                            server.WadoServicePort);

                        serverStudyItemList = ImageViewerComponent.FindStudy(queryParams, ae, "DICOM_REMOTE");
                    }
                    else
                    {
                        throw new Exception("Server is not queryable");
                    }

                    aggregateStudyItemList.AddRange(serverStudyItemList);
                }
                catch (Exception e)
                {
                    failedServerInfo.Add(new KeyValuePair<string, Exception>(serverNode.Name, e));
                }
            }
            return aggregateStudyItemList;
        }
Exemplo n.º 11
0
			private void FindAndAddPriors()
			{
				try
				{
				    var result = _priorStudyFinder.FindPriorStudies();
                    if (result == null)
                        return;

                    _findResultsComplete = result.ResultsComplete;
				    _queryResults = result.Studies;
					if (_queryResults.Count == 0)
						return;
				}
				catch (Exception e)
				{
					_queryResults = new StudyItemList();
					_findFailed = true;
				    _findResultsComplete = false;
					Platform.Log(LogLevel.Error, e, "The search for prior studies has failed.");
					return;
				}

				foreach (StudyItem result in _queryResults)
				{
					if (_stop)
						break;

					var loader = new SingleStudyLoader(_synchronizationContext, _imageViewer, result){ LoadOnlineOnly = true };

					_singleStudyLoaders.Add(loader);
					loader.LoadStudy();
				}
			}
Exemplo n.º 12
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);
        }
Exemplo n.º 13
0
 public PriorStudyFinderResult(StudyItemList studies, bool resultsComplete)
 {
     ResultsComplete = resultsComplete;
     Studies = studies;
 }
Exemplo n.º 14
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;
		}
Exemplo n.º 15
0
        public override PriorStudyFinderResult FindPriorStudies()
        {
            _cancel = false;

            var priorsServerQueries = new List <IStudyRootQuery>();

            foreach (ServerPartition partition in ServerPartitionMonitor.Instance)
            {
                using (IReadContext ctx = PersistentStoreRegistry.GetDefaultStore().OpenReadContext())
                {
                    IDeviceEntityBroker  broker   = ctx.GetBroker <IDeviceEntityBroker>();
                    DeviceSelectCriteria criteria = new DeviceSelectCriteria();
                    criteria.DeviceTypeEnum.EqualTo(DeviceTypeEnum.PriorsServer);
                    criteria.ServerPartitionKey.EqualTo(partition.Key);
                    IList <Device> list = broker.Find(criteria);
                    foreach (Device theDevice in list)
                    {
                        // Check the settings and log for debug purposes
                        if (!theDevice.Enabled)
                        {
                            Platform.Log(LogLevel.Debug, "Prior Server '{0}' on partition '{1}' is disabled in the device setting",
                                         theDevice.AeTitle, partition.AeTitle);
                            continue;
                        }

                        DicomStudyRootQuery remoteQuery = new DicomStudyRootQuery(partition.AeTitle, theDevice.AeTitle,
                                                                                  theDevice.IpAddress, theDevice.Port);
                        priorsServerQueries.Add(remoteQuery);
                    }
                }
            }

            // Log the prior servers for debug purpose
            if (Platform.IsLogLevelEnabled(LogLevel.Debug) && priorsServerQueries.Count > 0)
            {
                StringBuilder log = new StringBuilder();
                log.Append("Searching for priors on the following servers:");

                StringBuilder serverList = new StringBuilder();
                foreach (DicomStudyRootQuery server in priorsServerQueries)
                {
                    if (serverList.Length > 0)
                    {
                        serverList.Append(",");
                    }
                    serverList.AppendFormat("{0}", server);
                }

                log.Append(serverList.ToString());
                Platform.Log(LogLevel.Debug, log.ToString());
            }

            StudyItemList results = new StudyItemList();

            DefaultPatientReconciliationStrategy reconciliationStrategy = new DefaultPatientReconciliationStrategy();
            List <string> patientIds = new List <string>();

            foreach (Patient patient in Viewer.StudyTree.Patients)
            {
                if (_cancel)
                {
                    break;
                }

                IPatientData reconciled = reconciliationStrategy.ReconcileSearchCriteria(patient);
                if (!patientIds.Contains(reconciled.PatientId))
                {
                    patientIds.Add(reconciled.PatientId);
                }
            }

            //Note: we don't catch the exception for this one because it's just querying the other
            //partitions, so if it fails we want an outright failure to occur.  Besides, it should never happen
            //if the server is functioning correctly.
            using (StudyRootQueryBridge bridge = new StudyRootQueryBridge(Platform.GetService <IStudyRootQuery>()))
            {
                foreach (string patientId in patientIds)
                {
                    StudyRootStudyIdentifier identifier = new StudyRootStudyIdentifier {
                        PatientId = patientId
                    };

                    IList <StudyRootStudyIdentifier> studies = bridge.StudyQuery(identifier);
                    foreach (StudyRootStudyIdentifier study in studies)
                    {
                        if (_cancel)
                        {
                            break;
                        }

                        StudyItem studyItem = ConvertToStudyItem(study);
                        if (studyItem != null)
                        {
                            results.Add(studyItem);
                        }
                    }
                }
            }

            bool complete = true;

            foreach (IStudyRootQuery query in priorsServerQueries)
            {
                foreach (string patientId in patientIds)
                {
                    try
                    {
                        var identifier = new StudyRootStudyIdentifier
                        {
                            PatientId = patientId
                        };

                        IList <StudyRootStudyIdentifier> list = query.StudyQuery(identifier);
                        foreach (StudyRootStudyIdentifier i in list)
                        {
                            if (_cancel)
                            {
                                break;
                            }

                            StudyItem studyItem = ConvertToStudyItem(i);
                            if (studyItem != null)
                            {
                                results.Add(studyItem);
                            }
                        }
                    }
                    catch (FaultException <DataValidationFault> ex)
                    {
                        complete = false;
                        Platform.Log(LogLevel.Error, ex, "An error has occurred when searching for prior studies on server '{0}'", query.ToString());
                    }
                    catch (FaultException <QueryFailedFault> ex)
                    {
                        complete = false;
                        Platform.Log(LogLevel.Error, ex, "An error has occurred when searching for prior studies on server '{0}'", query.ToString());
                    }
                }
            }

            return(new PriorStudyFinderResult(results, complete));
        }
Exemplo n.º 16
0
        public override PriorStudyFinderResult FindPriorStudies()
		{
			_cancel = false;

            var priorsServerQueries = new List<IStudyRootQuery>();
            foreach (ServerPartition partition in ServerPartitionMonitor.Instance)
            {
                using (IReadContext ctx = PersistentStoreRegistry.GetDefaultStore().OpenReadContext())
                {
                    IDeviceEntityBroker broker = ctx.GetBroker<IDeviceEntityBroker>();
                    DeviceSelectCriteria criteria = new DeviceSelectCriteria();
                    criteria.DeviceTypeEnum.EqualTo(DeviceTypeEnum.PriorsServer);
                    criteria.ServerPartitionKey.EqualTo(partition.Key);
                    IList<Device> list = broker.Find(criteria);
                    foreach (Device theDevice in list)
                    {
                        // Check the settings and log for debug purposes
                        if (!theDevice.Enabled)
                        {
                            Platform.Log(LogLevel.Debug, "Prior Server '{0}' on partition '{1}' is disabled in the device setting",
                                    theDevice.AeTitle, partition.AeTitle);
                            continue;
                        }

                        DicomStudyRootQuery remoteQuery = new DicomStudyRootQuery(partition.AeTitle, theDevice.AeTitle,
                                                                                  theDevice.IpAddress, theDevice.Port);
                        priorsServerQueries.Add(remoteQuery);
                    }
                }
            }

            // Log the prior servers for debug purpose
            if (Platform.IsLogLevelEnabled(LogLevel.Debug) && priorsServerQueries.Count > 0)
            {
                StringBuilder log = new StringBuilder();
                log.Append("Searching for priors on the following servers:");

                StringBuilder serverList = new StringBuilder();
                foreach (DicomStudyRootQuery server in priorsServerQueries)
                {
                    if (serverList.Length > 0)
                        serverList.Append(",");
                    serverList.AppendFormat("{0}", server);
                }

                log.Append(serverList.ToString());
                Platform.Log(LogLevel.Debug, log.ToString());
            }

            StudyItemList results = new StudyItemList();

			DefaultPatientReconciliationStrategy reconciliationStrategy = new DefaultPatientReconciliationStrategy();
			List<string> patientIds = new List<string>();
			foreach (Patient patient in Viewer.StudyTree.Patients)
			{
				if (_cancel)
					break;

				IPatientData reconciled = reconciliationStrategy.ReconcileSearchCriteria(patient);
				if (!patientIds.Contains(reconciled.PatientId))
					patientIds.Add(reconciled.PatientId);
			}

            //Note: we don't catch the exception for this one because it's just querying the other
            //partitions, so if it fails we want an outright failure to occur.  Besides, it should never happen
            //if the server is functioning correctly.
			using (StudyRootQueryBridge bridge = new StudyRootQueryBridge(Platform.GetService<IStudyRootQuery>()))
			{
				foreach (string patientId in patientIds)
				{
					StudyRootStudyIdentifier identifier = new StudyRootStudyIdentifier {PatientId = patientId};

				    IList<StudyRootStudyIdentifier> studies = bridge.StudyQuery(identifier);
					foreach (StudyRootStudyIdentifier study in studies)
					{
						if (_cancel)
							break;

						StudyItem studyItem = ConvertToStudyItem(study);
						if (studyItem != null)
							results.Add(studyItem);
					}
				}
			}

            bool complete = true;
            foreach (IStudyRootQuery query in priorsServerQueries)
            {
                foreach (string patientId in patientIds)
                {

                    try
                    {
                        var identifier = new StudyRootStudyIdentifier
                                             {
                                                 PatientId = patientId
                                             };

                        IList<StudyRootStudyIdentifier> list = query.StudyQuery(identifier);
                        foreach (StudyRootStudyIdentifier i in list)
                        {
                            if (_cancel)
                                break;

                            StudyItem studyItem = ConvertToStudyItem(i);
                            if (studyItem != null)
                                results.Add(studyItem);
                        }
                    }
                    catch (FaultException<DataValidationFault> ex)
                    {
                        complete = false;
                        Platform.Log(LogLevel.Error, ex, "An error has occurred when searching for prior studies on server '{0}'", query.ToString());
                    }
                    catch (FaultException<QueryFailedFault> ex)
                    {
                        complete = false;
                        Platform.Log(LogLevel.Error, ex, "An error has occurred when searching for prior studies on server '{0}'", query.ToString());
                    }
                }
            }

            return new PriorStudyFinderResult(results, complete);
		}