Exemplo n.º 1
0
 public int GetStudyCount(StudyRootStudyIdentifier criteria)
 {
     return Real.GetStudyCount(new GetStudyCountRequest
                                    {
                                        Criteria = new StudyEntry{Study = criteria}
                                    }).StudyCount;
 }
		public void TestSameStudyMultipleServers()
		{
			var study1Local = CreateStudyIdentifier("1", "20130810", "112300", LocalAeTitle);
			var study2Local = CreateStudyIdentifier("2", "20130901", "122400", LocalAeTitle);

			var study1Streaming = new StudyRootStudyIdentifier(study1Local){RetrieveAeTitle = StreamingAeTitle};
			var study1NonStreaming = new StudyRootStudyIdentifier(study1Local){RetrieveAeTitle = NonStreaminAeTitle};
			var study1UnknownServer = new StudyRootStudyIdentifier(study1Local) { RetrieveAeTitle = null};

			var study2Streaming = new StudyRootStudyIdentifier(study2Local) { RetrieveAeTitle = StreamingAeTitle };
			var study2NonStreaming = new StudyRootStudyIdentifier(study2Local) { RetrieveAeTitle = NonStreaminAeTitle };
			var study2UnknownServer = new StudyRootStudyIdentifier(study2Local) { RetrieveAeTitle = null };

			var identifiers = new List<StudyRootStudyIdentifier>
			                  	{
			                  		study1UnknownServer, study2NonStreaming, study1NonStreaming,
									study1Streaming, study2Local,
									study1Local, study2UnknownServer, study2Streaming
			                  	};

			foreach (var identifier in identifiers)
				identifier.ResolveServer(false);

			identifiers.Sort(new StudyDateTimeComparer());

			Assert.AreEqual(identifiers[0], study2Local);
			Assert.AreEqual(identifiers[1], study2Streaming);
			Assert.AreEqual(identifiers[2], study2NonStreaming);
			Assert.AreEqual(identifiers[3], study2UnknownServer);
			Assert.AreEqual(identifiers[4], study1Local);
			Assert.AreEqual(identifiers[5], study1Streaming);
			Assert.AreEqual(identifiers[6], study1NonStreaming);
			Assert.AreEqual(identifiers[7], study1UnknownServer);
		}
Exemplo n.º 3
0
		private static StudyRootStudyIdentifier CreateStudyIdentifier(string uid, string date, string time)
		{
			StudyRootStudyIdentifier id = new StudyRootStudyIdentifier();
			id.StudyInstanceUid = uid;
			id.StudyDate = date;
			id.StudyTime = time;
			return id;
		}
Exemplo n.º 4
0
        /// <summary>
        /// Performs a STUDY level query.
        /// </summary>
        /// <exception cref="FaultException{TDetail}">Thrown when some part of the data in the request is poorly formatted.</exception>
        /// <exception cref="FaultException{QueryFailedFault}">Thrown when the query fails.</exception>
        public IList<StudyRootStudyIdentifier> StudyQuery(StudyRootStudyIdentifier queryCriteria)
        {
            var results = _real.StudyQuery(queryCriteria);

            AuditHelper.LogQueryIssued(_remoteServer.AETitle, _remoteServer.ScpParameters.HostName, EventSource.CurrentUser,
                           EventResult.Success, SopClass.StudyRootQueryRetrieveInformationModelFindUid,
                           queryCriteria.ToDicomAttributeCollection());

            return results;
        }
Exemplo n.º 5
0
		public IList<StudyRootStudyIdentifier> LocateStudyByAccessionNumber(string accessionNumber, out LocateFailureInfo[] failures)
		{
			Platform.CheckForEmptyString(accessionNumber, "accessionNumber");
			if (accessionNumber.Contains("*") || accessionNumber.Contains("?"))
				throw new ArgumentException("Accession Number cannot contain wildcard characters.");

			var criteria = new StudyRootStudyIdentifier {AccessionNumber = accessionNumber};
			var result = LocateStudies(new LocateStudiesRequest {Criteria = criteria});
			failures = result.Failures.ToArray();
			return result.Studies;
		}
Exemplo n.º 6
0
        public void SelectAllStudies()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier();

                var results = query.StudyQuery(criteria);

                var realCount = context.GetStudyBroker().GetStudyCount();
                Assert.AreEqual(realCount, results.Count);
            }
        }
Exemplo n.º 7
0
		public IList<StudyRootStudyIdentifier> StudyQuery(StudyRootStudyIdentifier queryCriteria)
		{
			var request = new StudyQueryRequest
				{
					Criteria = queryCriteria,
					LocalApplicationEntity = _localAE,
					RemoteApplicationEntity = new ApplicationEntity(_remoteAE)
				};

			var query = new DicomStudyRootQueryApplication();
			var result = query.StudyQuery(request);
			return result.Results;
		}
Exemplo n.º 8
0
 public void SelectPatientIdEquals()
 {
     using (var context = CreateContext())
     {
         var query = context.GetStudyStoreQuery();
         var criteria = new StudyRootStudyIdentifier
                            {
                                PatientId = "12345678"
                            };
         
         var results = query.StudyQuery(criteria);
         Assert.AreEqual(1, results.Count);
         Assert.AreEqual(criteria.PatientId, results[0].PatientId);
     }
 }
Exemplo n.º 9
0
        public void TestIsOpenQuery()
        {
            var identifier = new StudyRootStudyIdentifier();
            Assert.IsTrue(identifier.IsOpenQuery());

            identifier.RetrieveAeTitle = "Test";
            identifier.InstanceAvailability = "Test";
            identifier.SpecificCharacterSet = "Test";

            Assert.IsTrue(identifier.IsOpenQuery());

            identifier.PatientId = "Test";
            Assert.IsFalse(identifier.IsOpenQuery());

            identifier.PatientId = "";
            identifier.PatientsName = "Test";
            Assert.IsFalse(identifier.IsOpenQuery());

            identifier.PatientId = "T";
            identifier.PatientsName = "T";
            Assert.IsFalse(identifier.IsOpenQuery());
        }
Exemplo n.º 10
0
 public System.Collections.Generic.IList<StudyRootStudyIdentifier> StudyQuery(StudyRootStudyIdentifier queryCriteria)
 {
     var criteria = new StudyEntry {Study = queryCriteria};
     var result = Real.GetStudyEntries(new GetStudyEntriesRequest {Criteria = criteria});
     return result.StudyEntries.Select(e => e.Study).ToList();
 }
Exemplo n.º 11
0
 /// <summary>
 /// Performs a STUDY level query.
 /// </summary>
 /// <exception cref="FaultException{DataValidationFault}">Thrown when some part of the data in the request is poorly formatted.</exception>
 /// <exception cref="FaultException{QueryFailedFault}">Thrown when the query fails.</exception>
 public IList <StudyRootStudyIdentifier> StudyQuery(StudyRootStudyIdentifier queryCriteria)
 {
     return(base.Channel.StudyQuery(queryCriteria));
 }
Exemplo n.º 12
0
        /// <summary>
        /// Figure out which studies have been deleted and/or updated.
        /// </summary>
        private void ProcessChangedStudiesAsync(out DateTime? queryStartTime, out List<string> deletedStudyUids, out List<StudyEntry> updatedStudies)
        {
            deletedStudyUids = new List<string>();
            updatedStudies = new List<StudyEntry>();
            queryStartTime = null;
            DateTime now = DateTime.Now;

            var fiveSeconds = TimeSpan.FromSeconds(5);
            var rapidChangeInterval = TimeSpan.FromMilliseconds(300);

            lock (_syncLock)
            {
                if (_queryingForUpdates)
                    return; //Already querying.

                //Nothing to query for? Return.
                if (_setChangedStudies.Count == 0 || !_lastStudyChangeTime.HasValue)
                    return;

                bool studiesChanging = now - _lastStudyChangeTime.Value < rapidChangeInterval;
                if (studiesChanging)
                {
                    //Many DIFFERENT studies are changing in very rapid succession. Delay until it settles down, which usually isn't long.
                    Platform.Log(LogLevel.Debug, "Studies are still actively changing - delaying update.");
                    return;
                }
                
                if (!_hastenUpdateQuery)
                {
                    bool updatedRecently = _lastUpdateQueryEndTime.HasValue && now - _lastUpdateQueryEndTime < fiveSeconds;
                    if (updatedRecently)
                    {
                        //We just finished an update query less than 5 seconds ago.
                        Platform.Log(LogLevel.Debug, "Studies were updated within the last 5 seconds - delaying update.");
                        return;
                    }
                }

                //Reset this before the immediate query.
                _hastenUpdateQuery = false;

                //Add everything to the deleted list.
                deletedStudyUids.AddRange(_setChangedStudies.Keys);
                _setChangedStudies.Clear();

                //We are officially querying for updates.
                _queryingForUpdates = true;
            }

            queryStartTime = now;
            string studyUids = DicomStringHelper.GetDicomStringArray(deletedStudyUids);

            try
            {
                var clock = new CodeClock();
                clock.Start();
             
                var criteria = new StudyRootStudyIdentifier { StudyInstanceUid = studyUids };
                var request = new GetStudyEntriesRequest { Criteria = new StudyEntry { Study = criteria } };
                
                IList<StudyEntry> entries = null;
                
                //We're doing it this way here because it's local only.
                Platform.GetService<IStudyStoreQuery>(s => entries = s.GetStudyEntries(request).StudyEntries);

                foreach (var entry in entries)
                {
                    //If we got a result back, then it's not deleted.
                    deletedStudyUids.Remove(entry.Study.StudyInstanceUid);
                    updatedStudies.Add(entry);
                }

                clock.Stop();
                Platform.Log(LogLevel.Debug, "Study update query took {0}.", clock);
            }
            catch (Exception e)
            {
                Platform.Log(LogLevel.Error, e);
            }
            finally
            {
                lock (_syncLock)
                {
                    //Finished querying for updates.
                    _queryingForUpdates = false;
                    _lastUpdateQueryEndTime = now;
                }
            }
        }
Exemplo n.º 13
0
        public void SelectPatientIdAndStudyId_Wildcard()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    PatientId = "*EXAMPLE",
                    StudyId = "*EXAMPLE"
                };

                var results = query.StudyQuery(criteria);
                Assert.AreEqual(4, results.Count);
            }
        }
Exemplo n.º 14
0
        public void SelectPatientIdAndName_Equals()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    PatientId = "123a56b8",
                    PatientsName = "MISTER^CT"
                };

                var results = query.StudyQuery(criteria);
                Assert.AreEqual(1, results.Count);
                Assert.IsTrue(results.SingleOrDefault(study => study.PatientId == "123a56b8") != null);
            }
        }
Exemplo n.º 15
0
        public void SelectPatientIdAndName_Wildcard()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    PatientId = "*5*",
                    PatientsName = "MIST*"
                };

                var results = query.StudyQuery(criteria);
                Assert.AreEqual(4, results.Count);

                //Throw in an extra.
                criteria.AccessionNumber = "*6";
                results = query.StudyQuery(criteria);
                Assert.AreEqual(1, results.Count);
            }
        }
Exemplo n.º 16
0
        public void SelectPatientId_Wildcard()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                                   {
                                       PatientId = "123*"
                                   };

                var results = query.StudyQuery(criteria);
                Assert.AreEqual(2, results.Count);
                Assert.IsTrue(results.SingleOrDefault(study => study.PatientId == "12345678") != null);
                Assert.IsTrue(results.SingleOrDefault(study => study.PatientId == "123a56b8") != null);
            }
        }
Exemplo n.º 17
0
		/// <summary>
		/// Constructor.
		/// </summary>
		public Viewer(Guid identifier, StudyRootStudyIdentifier primaryStudyIdentifier)
		{
			Identifier = identifier;
			PrimaryStudyIdentifier = primaryStudyIdentifier;
		}
Exemplo n.º 18
0
 public IList<StudyEntry> GetStudyEntries(StudyRootStudyIdentifier criteria)
 {
     return GetStudyEntries(new StudyEntry {Study = criteria});
 }
Exemplo n.º 19
0
		public override PriorStudyFinderResult FindPriorStudies()
		{
			_cancel = false;
			var results = new Dictionary<string, StudyItem>();

			IPatientReconciliationStrategy reconciliationStrategy = new DefaultPatientReconciliationStrategy();
			reconciliationStrategy.SetStudyTree(Viewer.StudyTree);

			var patientIds = new Dictionary<string, string>();
			foreach (Patient patient in Viewer.StudyTree.Patients)
			{
				if (_cancel)
					break;

				IPatientData reconciled = reconciliationStrategy.ReconcileSearchCriteria(patient);
				patientIds[reconciled.PatientId] = reconciled.PatientId;
			}

		    int failedCount = 0;
		    int successCount = 0;

            foreach (var priorsServer in ServerDirectory.GetPriorsServers(true))
		    {
                if (_cancel)
                    break;

		        try
		        {
                    using (var bridge = new StudyRootQueryBridge(priorsServer.GetService<IStudyRootQuery>()))
                    {
                        foreach (string patientId in patientIds.Keys)
                        {
                            var identifier = new StudyRootStudyIdentifier { PatientId = patientId };

                            IList<StudyRootStudyIdentifier> studies = bridge.StudyQuery(identifier);
                            
                            Platform.Log(LogLevel.Debug, "Found {0} prior studies on server '{1}'", studies.Count, priorsServer.Name);

                            foreach (StudyRootStudyIdentifier study in studies)
                            {
                                if (_cancel)
                                    break;

                                //Eliminate false positives right away.
                                IPatientData reconciled = reconciliationStrategy.ReconcilePatientInformation(study);
                                if (reconciled == null)
                                    continue;

                                StudyItem studyItem = ConvertToStudyItem(study);
                                if (studyItem == null || results.ContainsKey(studyItem.StudyInstanceUid))
                                    continue;

                                if (!results.ContainsKey(studyItem.StudyInstanceUid))
                                    results[studyItem.StudyInstanceUid] = studyItem;
                            }
                        }
                    }

		            ++successCount;
		        }
		        catch (Exception e)
		        {
		            ++failedCount;
                    Platform.Log(LogLevel.Error, e, "Failed to query server: {0}", priorsServer.Name);
		        }
		    }

            if (_cancel)
            {
                //Just pretend the query never happened.
                return new PriorStudyFinderResult(new StudyItemList(), true);
            }

            if (failedCount > 0)
            {
                PriorStudyLoaderExceptionPolicy.NotifyFailedQuery();

                if (successCount == 0)
                    throw new Exception("The search for prior studies has failed.");
            }
            else
            {
                //Even if success count is zero, we'll still consider it "successful".
                PriorStudyLoaderExceptionPolicy.NotifySuccessfulQuery();
            }

            Platform.Log(LogLevel.Debug, "Found {0} prior studies in total.", results.Count);

            return new PriorStudyFinderResult(new StudyItemList(results.Values), failedCount == 0);
        }
Exemplo n.º 20
0
		private static StudyItem ConvertToStudyItem(StudyRootStudyIdentifier study)
		{
		    study.ResolveServer(true);
		    var item = new StudyItem(study);
			if (String.IsNullOrEmpty(item.InstanceAvailability))
				item.InstanceAvailability = "ONLINE";

			return item;
		}
Exemplo n.º 21
0
        public void SelectEmptyStudyDescription_NoCriteria()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    StudyDescription = ""
                };

                //Get all studies back.
                var results = query.StudyQuery(criteria);

                var realCount = context.GetStudyBroker().GetStudyCount();
                Assert.AreEqual(realCount, results.Count);
            }
        }
			public Viewer OpenViewer(StudyRootStudyIdentifier studyRootStudyIdentifier)
			{
				return OpenViewer(new[] { studyRootStudyIdentifier });
			}
Exemplo n.º 23
0
		public IList<StudyRootStudyIdentifier> LocateStudyByPatientId(string patientId, out LocateFailureInfo[] failures)
		{
			Platform.CheckForEmptyString(patientId, "patientId");
			if (patientId.Contains("*") || patientId.Contains("?"))
				throw new ArgumentException("Patient Id cannot contain wildcard characters.");

			var criteria = new StudyRootStudyIdentifier {PatientId = patientId};
			var result = LocateStudies(new LocateStudiesRequest {Criteria = criteria});
			failures = result.Failures.ToArray();
			return result.Studies;
		}
Exemplo n.º 24
0
 public IList <StudyRootStudyIdentifier> StudyQuery(StudyRootStudyIdentifier queryCriteria)
 {
     return(Query <StudyRootStudyIdentifier, StudyRootFindScu>(queryCriteria));
 }
Exemplo n.º 25
0
        public IImageSet BuildImageSet(StudyTree studyTree, out Study study)
        {
            if (IsRemote)
            {
                study = null;
                //Add only the image set, which essentially makes it a remote study.
                var identifier = new StudyRootStudyIdentifier(this, this, new StudyIdentifier())
                                     {
                                         PatientId = ReconciledPatientId ?? PatientId
                                     };

                return new ImageSet(new DicomImageSetDescriptor(identifier));
            }

            study = AddStudy(studyTree);
            var studyIdentifier = study.GetIdentifier();
            studyIdentifier = new StudyRootStudyIdentifier(studyIdentifier) { PatientId = ReconciledPatientId ?? study.ParentPatient.PatientId };
            var imageSet = new ImageSet(new DicomImageSetDescriptor(studyIdentifier));
            foreach (var series in study.Series)
            {
                foreach (var displaySet in DisplaySetFactory.CreateDisplaySets(series))
                    imageSet.DisplaySets.Add(displaySet);
            }

            return imageSet;
        }
Exemplo n.º 26
0
        public void SelectStudyDate_Between()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    StudyDate = "20050915-20111223"
                };

                var results = query.StudyQuery(criteria);

                Assert.AreEqual(4, results.Count);

                criteria = new StudyRootStudyIdentifier
                {
                    StudyDate = "20050916-20111223"
                };

                results = query.StudyQuery(criteria);

                Assert.AreEqual(3, results.Count);

                criteria = new StudyRootStudyIdentifier
                {
                    StudyDate = "20050915-20111222"
                };

                results = query.StudyQuery(criteria);

                Assert.AreEqual(3, results.Count);
            }
        }
Exemplo n.º 27
0
 private IEnumerable<Study> GetStudies(StudyRootStudyIdentifier criteria)
 {
     return GetStudies(new StudyEntry { Study = criteria });
 }
Exemplo n.º 28
0
		public IList<StudyRootStudyIdentifier> LocateStudyByInstanceUid(IEnumerable<string> studyInstanceUids, out LocateFailureInfo[] failures)
		{
			var instanceUids = studyInstanceUids.ToArray();
			foreach (string studyInstanceUid in instanceUids)
			{
				Platform.CheckForEmptyString(studyInstanceUid, "studyInstanceUid");

				if (studyInstanceUid.Contains("*") || studyInstanceUid.Contains("?"))
					throw new ArgumentException("Study Instance Uid cannot contain wildcard characters.");
			}

			var criteria = new StudyRootStudyIdentifier {StudyInstanceUid = DicomStringHelper.GetDicomStringArray(instanceUids)};
			var result = LocateStudies(new LocateStudiesRequest {Criteria = criteria});
			failures = result.Failures.ToArray();
			return result.Studies;
		}
Exemplo n.º 29
0
        public void SelectStudyTime_Between()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    StudyTime = "083501-100821"
                };

                /// TODO (CR Apr 2012): For now, we don't support time queries at all,
                /// so the answer is that all studies match.
                var results = query.StudyQuery(criteria);

                var realCount = context.GetStudyBroker().GetStudyCount();
                Assert.AreEqual(realCount, results.Count);
            }
        }
Exemplo n.º 30
0
 public IList<StudyRootStudyIdentifier> StudyQuery(StudyRootStudyIdentifier criteria)
 {
     var entries = GetStudies(criteria);
     return entries.Select(e => e.ToStoreEntry().Study).ToList();
 }
Exemplo n.º 31
0
        public void SelectStudyInstanceUid_Single()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    StudyInstanceUid = "1.3.51.0.7.633918642.633920010109.6339100821"
                };

                /// TODO (CR Apr 2012): For now, we don't support time queries at all,
                /// so the answer is that all studies match.
                var results = query.StudyQuery(criteria);

                Assert.AreEqual(1, results.Count);
            }
        }
Exemplo n.º 32
0
 /// <summary>
 /// Compares 2 <see cref="StudyRootStudyIdentifier"/>s.
 /// </summary>
 public int Compare(StudyRootStudyIdentifier x, StudyRootStudyIdentifier y)
 {
     return(Compare((StudyIdentifier)x, (StudyIdentifier)y));
 }
Exemplo n.º 33
0
        public void SelectStudyInstanceUid_Multiple()
        {
            using (var context = CreateContext())
            {
                var query = context.GetStudyStoreQuery();
                var criteria = new StudyRootStudyIdentifier
                {
                    StudyInstanceUid = @"1.3.51.0.7.633918642.633920010109.6339100821\1.3.46.670589.6.1.0.98511171.2001010909203006\1.2.840.113619.2.67.2158294438.15745010109084247.20000"
                };

                /// TODO (CR Apr 2012): For now, we don't support time queries at all,
                /// so the answer is that all studies match.
                var results = query.StudyQuery(criteria);

                Assert.AreEqual(3, results.Count);
            }
        }