Example #1
0
        public IDicomSeries GetSeriesForSeriesUid(string studyUid, string seriesUid)
        {
            CheckRemoteNodeAvailability();

            var seriesQueryIod = new SeriesQueryIod();

            seriesQueryIod.SetCommonTags();
            seriesQueryIod.StudyInstanceUid  = studyUid;
            seriesQueryIod.SeriesInstanceUid = seriesUid;

            var findScu = new StudyRootFindScu();
            var series  = findScu.Find(LocalNode.AeTitle, RemoteNode.AeTitle,
                                       RemoteNode.IpAddress, RemoteNode.Port, seriesQueryIod);
            var seriesDescription = series.Count == 0 ? "" : series.FirstOrDefault()?.SeriesDescription;

            var imageQueryIods = GetImageIodsForSeries(studyUid, seriesUid);

            if (imageQueryIods?.ToList().Count == 0)
            {
                return(null);
            }

            return(new DicomSeries
            {
                StudyInstanceUid = studyUid,
                SeriesInstanceUid = seriesUid,
                SeriesDescription = seriesDescription,
                Images = imageQueryIods?
                         .Select(r => new DicomImage {
                    ImageUid = r.SopInstanceUid
                })
                         .ToList()
            });
        }
		private void _queryButton_Click(object sender, EventArgs e)
		{
			var scu = new StudyRootFindScu();
			var query = new DicomAttributeCollection();
			scu.AssociationRejected += scu_AssociationRejected;
			scu.AssociationAccepted += scu_AssociationAccepted;
			scu.AssociationReleased += scu_AssociationReleased;
			scu.AssociationAborted += scu_AssociationAborted;
			scu.NetworkError += scu_NetworkError;

            query[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY");
            query[DicomTags.PatientId].SetStringValue("");
			query[DicomTags.PatientsName].SetStringValue("");
			query[DicomTags.AccessionNumber].SetStringValue("");
			query[DicomTags.StudyDescription].SetStringValue("");
			query[DicomTags.StudyDate].SetStringValue("");
			query[DicomTags.StudyInstanceUid].SetStringValue("");

			if (_studyDateTextBox.Text != "")
			{
				query[DicomTags.StudyDate].SetStringValue(_studyDateTextBox.Text +"-" + DateTime.Today.ToString("yyyyMMdd"));
			}
			
			_results = null;
			_results = scu.Find(_aeTitleTextbox.Text, _calledAETitleTextbox.Text, _hostnameTextbox.Text, int.Parse(_portTextbox.Text), query);

			scu.Dispose();

		}
        private void _queryButton_Click(object sender, EventArgs e)
        {
            var scu   = new StudyRootFindScu();
            var query = new DicomAttributeCollection();

            scu.AssociationRejected += scu_AssociationRejected;
            scu.AssociationAccepted += scu_AssociationAccepted;
            scu.AssociationReleased += scu_AssociationReleased;
            scu.AssociationAborted  += scu_AssociationAborted;
            scu.NetworkError        += scu_NetworkError;

            query[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY");
            query[DicomTags.PatientId].SetStringValue("");
            query[DicomTags.PatientsName].SetStringValue("");
            query[DicomTags.AccessionNumber].SetStringValue("");
            query[DicomTags.StudyDescription].SetStringValue("");
            query[DicomTags.StudyDate].SetStringValue("");
            query[DicomTags.StudyInstanceUid].SetStringValue("");

            if (_studyDateTextBox.Text != "")
            {
                query[DicomTags.StudyDate].SetStringValue(_studyDateTextBox.Text + "-" + DateTime.Today.ToString("yyyyMMdd"));
            }

            _results = null;
            _results = scu.Find(_aeTitleTextbox.Text, _calledAETitleTextbox.Text, _hostnameTextbox.Text, int.Parse(_portTextbox.Text), query);

            scu.Dispose();
        }
Example #4
0
        private IEnumerable <IDicomStudy> GetStudies(StudyQueryIod query)
        {
            CheckRemoteNodeAvailability();
            var findScu = new StudyRootFindScu();

            return(findScu
                   .Find(LocalNode.AeTitle, RemoteNode.AeTitle, RemoteNode.IpAddress, RemoteNode.Port, query)
                   .Select(MapToDicomStudy));
        }
Example #5
0
 public static Study GetStudyFromAccession(string accession)
 {
     var node = GetSelectedNode();
     if (node == null)
         throw new Exception("Unable to get selected DICOM node");
     StudyRootFindScu findScu = new StudyRootFindScu();
     StudyQueryIod queryMessage = new StudyQueryIod();
     queryMessage.SetCommonTags();
     queryMessage.AccessionNumber = accession;
     IList<StudyQueryIod> results = findScu.Find(node.LocalAe, node.AET, node.IP, node.Port, queryMessage);
     if (results.Count == 1)
     {
         Study st = new Study();
         st.Accession = results[0].AccessionNumber;
         st.Images = (int)results[0].NumberOfStudyRelatedInstances;
         st.PatientDob = results[0].PatientsBirthDate;
         st.PatientFirstname = results[0].PatientsName.FirstName;
         st.PatientId = results[0].PatientId;
         st.PatientSurname = results[0].PatientsName.LastName;
         st.StudyDate = results[0].StudyDate;
         st.StudyDescription = results[0].StudyDescription;
         st.StudyModality = results[0].ModalitiesInStudy;
         st.StudyUid = results[0].StudyInstanceUid;
         if (st.StudyDate != null && st.PatientDob != null)
         {
             int age = st.StudyDate.Value.Year - st.PatientDob.Value.Year;
             if (st.PatientDob.Value > st.StudyDate.Value.AddYears(-age)) age--;
             st.PatientAge = age;
         }
         StudyRootFindScu seriesFindScu = new StudyRootFindScu();
         SeriesQueryIod seriesQuery = new SeriesQueryIod();
         seriesQuery.SetCommonTags();
         seriesQuery.StudyInstanceUid = results[0].StudyInstanceUid;
         IList<SeriesQueryIod> seriesResults = seriesFindScu.Find(node.LocalAe, node.AET, node.IP, node.Port, seriesQuery);
         if (seriesResults.Count > 0)
         {
             st.Series = new List<Series>();
             foreach (var se in seriesResults)
             {
                 Series s = new Series();
                 s.StudyUid = results[0].StudyInstanceUid;
                 s.Images = (int)se.NumberOfSeriesRelatedInstances;
                 s.SeriesDescription = se.SeriesDescription;
                 s.SeriesModality = se.Modality;
                 s.SeriesUid = se.SeriesInstanceUid;
                 st.Series.Add(s);
             }
         }
         return st;
     }
     else
     {
         throw new Exception("No study found");
     }
 }
Example #6
0
        private void buttonQueryScuSearch_Click(object sender, EventArgs e)
        {
            XmlDocument theDoc = new XmlDocument();

            try
            {
                theDoc.LoadXml(textBoxQueryMessage.Text);
                InstanceXml instanceXml = new InstanceXml(theDoc.DocumentElement, null);
                DicomAttributeCollection queryMessage = instanceXml.Collection;

                if (queryMessage == null)
                {
                    Logger.LogError("Unexpected error parsing query message");
                }

                int maxResults;
                if (!int.TryParse(textBoxQueryScuMaxResults.Text, out maxResults))
                {
                    maxResults = -1;
                }

                IList <DicomAttributeCollection> resultsList;
                if (comboBoxQueryScuQueryType.SelectedIndex == 0)
                {
                    StudyRootFindScu findScu = new StudyRootFindScu();
                    findScu.MaxResults = maxResults;
                    resultsList        = findScu.Find(textBoxQueryScuLocalAe.Text,
                                                      textBoxQueryScuRemoteAe.Text,
                                                      textBoxQueryScuRemoteHost.Text,
                                                      int.Parse(textBoxQueryScuRemotePort.Text), queryMessage);
                    findScu.Dispose();
                }
                else
                {
                    PatientRootFindScu findScu = new PatientRootFindScu();
                    findScu.MaxResults = maxResults;
                    resultsList        = findScu.Find(textBoxQueryScuLocalAe.Text,
                                                      textBoxQueryScuRemoteAe.Text,
                                                      textBoxQueryScuRemoteHost.Text,
                                                      int.Parse(textBoxQueryScuRemotePort.Text), queryMessage);
                    findScu.Dispose();
                }

                foreach (DicomAttributeCollection msg in resultsList)
                {
                    Logger.LogInfo(msg.DumpString);
                }
            }
            catch (Exception x)
            {
                Logger.LogErrorException(x, "Unable to perform query");
                return;
            }
        }
Example #7
0
        public IEnumerable <IDicomSeries> GetSeriesForStudy(string studyUid)
        {
            CheckRemoteNodeAvailability();

            var seriesQuery = new SeriesQueryIod();

            seriesQuery.SetCommonTags();
            seriesQuery.StudyInstanceUid = studyUid;
            var find = new StudyRootFindScu();

            return(find.Find(LocalNode.AeTitle, RemoteNode.AeTitle, RemoteNode.IpAddress, RemoteNode.Port, seriesQuery)
                   .Select(s => new DicomSeries
            {
                SeriesInstanceUid = s.SeriesInstanceUid,
                SeriesDescription = s.SeriesDescription,
                StudyInstanceUid = s.StudyInstanceUid,
            }));
        }
Example #8
0
        public IDicomStudy GetStudyForAccession(string accessionNumber)
        {
            var query = new StudyQueryIod();

            query.SetCommonTags();
            query.AccessionNumber = accessionNumber;

            var findScu = new StudyRootFindScu();
            var studies = findScu
                          .Find(LocalNode.AeTitle, RemoteNode.AeTitle, RemoteNode.IpAddress, RemoteNode.Port, query)
                          .Select(MapToDicomStudy).ToList();

            if (studies.Count > 1)
            {
                throw new Exception($"{studies.Count} studies returned for accession {accessionNumber}");
            }
            return(studies.FirstOrDefault());
        }
Example #9
0
        public string GetStudyUidForAccession(string accession)
        {
            CheckRemoteNodeAvailability();

            var studyQuery = new StudyQueryIod();

            studyQuery.SetCommonTags();
            studyQuery.AccessionNumber = accession;

            var findScu = new StudyRootFindScu();
            var studies = findScu.Find(LocalNode.AeTitle, RemoteNode.AeTitle,
                                       RemoteNode.IpAddress, RemoteNode.Port, studyQuery);

            if (studies.Count == 0)
            {
                throw new DicomException($"No study was found for accession: {accession}");
            }
            return(studies.Count == 0 ? "" : studies.FirstOrDefault()?.StudyInstanceUid);
        }
Example #10
0
        private IList <ImageQueryIod> GetImageIodsForSeries(string studyUid, string seriesUid)
        {
            var imageQuery = new ImageQueryIod();

            imageQuery.SetCommonTags();
            imageQuery.StudyInstanceUid  = studyUid;
            imageQuery.SeriesInstanceUid = seriesUid;

            var find    = new StudyRootFindScu();
            var results = find.Find(LocalNode.AeTitle, RemoteNode.AeTitle, RemoteNode.IpAddress,
                                    RemoteNode.Port, imageQuery);

            if (!string.IsNullOrEmpty(find.FailureDescription))
            {
                throw new DicomException($"Series query failed: {find.FailureDescription}{Environment.NewLine}" +
                                         $"AET: {RemoteNode.AeTitle}{Environment.NewLine}" +
                                         $"Study Uid: {studyUid}{Environment.NewLine}" +
                                         $"Series Uid: {seriesUid}");
            }
            return(results);
        }
Example #11
0
        public void RunApplication(string[] args)
        {
            CommandLine              cmd        = new CommandLine(args);
            int                      numClients = int.Parse(cmd.Named["n"]);
            bool                     single     = cmd.Switches["extreme"];
            StudyRootFindScu         scu        = new StudyRootFindScu();
            DicomAttributeCollection query      = new DicomAttributeCollection();

            query[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY");
            query[DicomTags.StudyInstanceUid].SetStringValue("");
            scu.Find("Test", "ImageServer", "localhost", 5001, query);

            foreach (DicomAttributeCollection result in scu.Results)
            {
                _studies.Add(result[DicomTags.StudyInstanceUid].ToString());
            }

            Random r = new Random();

            for (int i = 0; i < numClients; i++)
            {
                Thread thread = new Thread(delegate(object state)
                {
                    do
                    {
                        Thread.Sleep(r.Next(200, 10000));
                        TestClient client = new TestClient("" + Thread.CurrentThread.ManagedThreadId);
                        client.GetStudy(_studies[r.Next(_studies.Count)],
                                        new Uri("http://localhost:1000/wado"),
                                        "ImageServer", single);
                    } while (true);
                }
                                           );

                thread.Start(i);
            }
        }
Example #12
0
    public static bool DownloadOneSeries(string studyuid, string seriesuid, int retryCount = 0)
    {
        var node = GetSelectedNode();
        var cstore = new DicomSCP(node.LocalAe, 104);
        try
        {
            LOG.Write("Retry Count: " + retryCount);

            StudyRootFindScu findScu = new StudyRootFindScu();
            SeriesQueryIod queryMessage = new SeriesQueryIod();
            queryMessage.SetCommonTags();
            queryMessage.StudyInstanceUid = studyuid;
            queryMessage.SeriesInstanceUid = seriesuid;
            IList<SeriesQueryIod> results = findScu.Find(node.LocalAe, node.AET, node.IP, node.Port, queryMessage);
            if (results.Count != 1)
                throw new Exception(string.Format("Unable to query study on PACS: [{0}]", studyuid));

            int expectedFiles = (int)results[0].NumberOfSeriesRelatedInstances;

            if (!System.IO.Directory.Exists(node.LocalStorage))
                System.IO.Directory.CreateDirectory(node.LocalStorage);
            cstore.Start();
            while (!cstore.IsRunning)
                System.Threading.Thread.Sleep(1000);

            MoveScuBase moveScu = new StudyRootMoveScu(node.LocalAe, node.AET, node.IP, node.Port, node.LocalAe);
            moveScu.ReadTimeout = 600000;
            moveScu.WriteTimeout = 600000;
            moveScu.AddStudyInstanceUid(studyuid);
            moveScu.AddSeriesInstanceUid(seriesuid);

            DateTime started = DateTime.Now;

            moveScu.Move();
            System.Threading.Thread.Sleep(2000);
            if (moveScu.Status == ScuOperationStatus.AssociationRejected || moveScu.Status == ScuOperationStatus.Canceled ||
                moveScu.Status == ScuOperationStatus.ConnectFailed || moveScu.Status == ScuOperationStatus.Failed ||
                moveScu.Status == ScuOperationStatus.NetworkError || moveScu.Status == ScuOperationStatus.TimeoutExpired ||
                moveScu.Status == ScuOperationStatus.UnexpectedMessage || moveScu.FailureSubOperations != 0)
            {
                if (retryCount > 4)
                    throw new Exception(string.Format("Failed moving study [{0}] | Status : {1} | Failed Operations: {2}", studyuid, moveScu.Status, moveScu.FailureSubOperations));
                retryCount += 1;
                if (cstore.IsRunning)
                    cstore.Stop();
                DownloadOneSeries(studyuid, seriesuid, retryCount);
            }

            string downloadFolder = GetStoreString();
            downloadFolder = Path.Combine(downloadFolder, studyuid, seriesuid);
            bool direxist = Directory.Exists(downloadFolder);
            while (!direxist)
            {
                if ((DateTime.Now - started).TotalMinutes > 3)
                {
                    if (cstore.IsRunning)
                        cstore.Stop();
                    throw new Exception("Waited too long for images to come in");
                }
                //LOG.Write("Waiting for images to come in...");
                System.Threading.Thread.Sleep(1 * 1000);
                direxist = Directory.Exists(downloadFolder);
            }

            var dcmfiles = Directory.GetFiles(downloadFolder, "*.dcm");
            var dcmCount = dcmfiles.Length;
            while (dcmCount < expectedFiles)
            {
                if ((DateTime.Now - started).TotalMinutes > 3)
                {
                    if (cstore.IsRunning)
                        cstore.Stop();
                    throw new Exception("Waited too long for images to come in");
                }
                //LOG.Write("Waiting for images to come in...");
                System.Threading.Thread.Sleep(1 * 1000);
                dcmfiles = Directory.GetFiles(downloadFolder, "*.dcm");
                if (dcmfiles.Length != dcmCount)
                {
                    if (dcmfiles.Length >= expectedFiles) { break; }
                    dcmCount = dcmfiles.Length;
                    started = DateTime.Now;
                }
            }

            if (cstore.IsRunning)
                cstore.Stop();
            LOG.Write("Series successfully downloaded from PACS");
            return true;
        }
        catch (Exception ex)
        {
            if (cstore.IsRunning)
                cstore.Stop();
            string errorString = "Error at :" + System.Reflection.MethodBase.GetCurrentMethod().Name;
            LOG.Write(errorString);
            LOG.Write(ex.Message);
            return false;
        }
    }
        private static int QueryDicomServer(Order order,
                                            string shredAETitle,
                                            string dicomServerAETitle,
                                            string dicomServerHost,
                                            int dicomServerPort,
                                            out bool studiesNotFound)
        {
            DicomAttributeCollection requestCollection = new DicomAttributeCollection();

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

            int numberOfInstancesFromDicomServer = 0;

            using (StudyRootFindScu scu = new StudyRootFindScu())
            {
                IList <DicomAttributeCollection> results = scu.Find(
                    shredAETitle,
                    dicomServerAETitle,
                    dicomServerHost,
                    dicomServerPort,
                    requestCollection);

                // Wait for a response
                scu.Join(new TimeSpan(0, 0, 0, 0, 1000));

                if (scu.Status == ScuOperationStatus.Canceled)
                {
                    String message = String.Format(SR.MessageFormatDicomRemoteServerCancelledFind,
                                                   scu.FailureDescription ?? "no failure description provided");
                    throw new DicomException(message);
                }
                if (scu.Status == ScuOperationStatus.ConnectFailed)
                {
                    String message = String.Format(SR.MessageFormatDicomConnectionFailed,
                                                   scu.FailureDescription ?? "no failure description provided");
                    throw new DicomException(message);
                }
                if (scu.Status == ScuOperationStatus.Failed)
                {
                    String message = String.Format(SR.MessageFormatDicomQueryOperationFailed,
                                                   scu.FailureDescription ?? "no failure description provided");
                    throw new DicomException(message);
                }
                if (scu.Status == ScuOperationStatus.TimeoutExpired)
                {
                    String message = String.Format(SR.MessageFormatDicomConnectTimeoutExpired,
                                                   scu.FailureDescription ?? "no failure description provided");
                    throw new DicomException(message);
                }

                foreach (DicomAttributeCollection result in results)
                {
                    numberOfInstancesFromDicomServer += (int)result[DicomTags.NumberOfStudyRelatedInstances].GetUInt32(0, 0);
                }

                studiesNotFound = results.Count == 0;
            }

            return(numberOfInstancesFromDicomServer);
        }
        /// <summary>
        /// Called by the framework when the user clicks the "apply" menu item or toolbar button.
        /// </summary>
        public void SeriesQuery()
        {

            string callingAE = ServerTree.GetClientAETitle();
            List<SeriesItem> SeriesList = new List<SeriesItem>();

            #region remote datastore
            // If remote data store, need to query server for series level information
            if (!this.Context.SelectedServerGroup.IsLocalDatastore)
            {
                // Loop through all selected servers
                foreach (Server node in this.Context.SelectedServerGroup.Servers)
                {
                    DicomAttributeCollection dicomAttributeCollection = new DicomAttributeCollection();
                    // Query on "Series" Level
                    dicomAttributeCollection[DicomTags.QueryRetrieveLevel].SetStringValue("SERIES");

                    string studyUID = this.Context.SelectedStudies[0].StudyInstanceUid;
                    dicomAttributeCollection[DicomTags.StudyInstanceUid].SetStringValue(studyUID);
                    dicomAttributeCollection[DicomTags.SeriesDescription].SetNullValue();
                    dicomAttributeCollection[DicomTags.SeriesInstanceUid].SetNullValue();
                    dicomAttributeCollection[DicomTags.SeriesNumber].SetNullValue();
                    dicomAttributeCollection[DicomTags.Modality].SetNullValue();
                    dicomAttributeCollection[DicomTags.Date].SetNullValue();
                    dicomAttributeCollection[DicomTags.Time].SetNullValue();
                    dicomAttributeCollection[DicomTags.RepetitionTime].SetNullValue();

                    IList<DicomAttributeCollection> resultsList;
                    StudyRootFindScu findScu = new StudyRootFindScu();
                    List<string> seriesUIDs = new List<string>();

                    resultsList = findScu.Find(
                                    callingAE,
                                    node.AETitle,
                                    node.Host,
                                    node.Port,
                                    dicomAttributeCollection);

                    findScu.CloseAssociation();
                    findScu.Dispose();

                    foreach (DicomAttributeCollection msg in resultsList)
                    {
                        string text = msg[DicomTags.SeriesInstanceUid];
                        Platform.Log(LogLevel.Info, text);

                        SeriesItem series = new SeriesItem();

                        series.SeriesNumber = msg[DicomTags.SeriesNumber];
                        series.SeriesDescription = msg[DicomTags.SeriesDescription];
                        series.StudyInstanceUID = msg[DicomTags.StudyInstanceUid];
                        series.SeriesInstanceUID = msg[DicomTags.SeriesInstanceUid];
                        series.Modality = msg[DicomTags.Modality];
                        series.Date = msg[DicomTags.Date];
                        series.Time = msg[DicomTags.Time];
                        //series.NumberOfSeriesRelatedInstances = int.Parse(msg[DicomTags.NumberOfSeriesRelatedInstances].ToString());
                        SeriesList.Add(series);

                    }
                    _component = new SeriesBrowserComponent(SeriesList, node);
                    _shelf = ApplicationComponent.LaunchAsShelf(this.Context.DesktopWindow, _component, "Series Browser", ShelfDisplayHint.DockBottom | ShelfDisplayHint.DockAutoHide);
                    _shelf.Closed += Shelf_Closed;
                }              
            }
            #endregion
           
            #region Local Datastore
            // If local datastore, can obtain series information by building study tree
            else
            {
                IImageViewer viewer = new ImageViewerComponent();
                StudyTree studyTree = viewer.StudyTree;

                // Add selected objects studies to study tree
                foreach (StudyItem selectedstudy in this.Context.SelectedStudies)
                {
                    string studyUID = selectedstudy.StudyInstanceUid;
                    int numberOfSops = LocalStudyLoader.Start(new StudyLoaderArgs(studyUID, null));
                    for (int i = 0; i < numberOfSops; ++i)
                    {
                        Sop imageSop = LocalStudyLoader.LoadNextSop();
                        studyTree.AddSop(imageSop);
                    }
                }

                foreach (Patient patient in studyTree.Patients)
                {
                    foreach (Study study in patient.Studies)
                    {
                        foreach (Series series in study.Series)
                        {
                            SeriesItem seriesitem = new SeriesItem();

                            seriesitem.SeriesNumber = series.SeriesNumber.ToString();
                            seriesitem.SeriesDescription = series.SeriesDescription;
                            seriesitem.StudyInstanceUID = study.StudyInstanceUid;
                            seriesitem.SeriesInstanceUID = series.SeriesInstanceUid;
                            seriesitem.Modality = series.Modality;
                            seriesitem.Date = series.SeriesDate;
                            seriesitem.Time = series.SeriesTime;
                            //series.NumberOfSeriesRelatedInstances = int.Parse(msg[DicomTags.NumberOfSeriesRelatedInstances].ToString());
                            seriesitem.NumberOfSeriesRelatedInstances = series.Sops.Count.ToString();

                            SeriesList.Add(seriesitem);
                        }
                    _component = new SeriesBrowserComponent(SeriesList, null);
                    _shelf = ApplicationComponent.LaunchAsShelf(this.Context.DesktopWindow, _component, DicomDataFormatHelper.PersonNameFormatter(patient.PatientsName), ShelfDisplayHint.DockBottom | ShelfDisplayHint.DockAutoHide);
                    _shelf.Closed += Shelf_Closed;
                    }
                }
            }
            #endregion

        }
		private static int QueryDicomServer(Order order, 
			string shredAETitle,
			string dicomServerAETitle,
			string dicomServerHost,
			int dicomServerPort,
			out bool studiesNotFound)
		{
			DicomAttributeCollection requestCollection = new DicomAttributeCollection();
			requestCollection[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY");
			requestCollection[DicomTags.StudyInstanceUid].SetStringValue("");
			requestCollection[DicomTags.AccessionNumber].SetStringValue(order.AccessionNumber);
			requestCollection[DicomTags.NumberOfStudyRelatedInstances].SetStringValue("");

			int numberOfInstancesFromDicomServer = 0;
			using (StudyRootFindScu scu = new StudyRootFindScu())
			{
				IList<DicomAttributeCollection> results = scu.Find(
					shredAETitle,
					dicomServerAETitle,
					dicomServerHost,
					dicomServerPort,
					requestCollection);

				// Wait for a response
				scu.Join(new TimeSpan(0, 0, 0, 0, 1000));

				if (scu.Status == ScuOperationStatus.Canceled)
				{
					String message = String.Format(SR.MessageFormatDicomRemoteServerCancelledFind,
					                               scu.FailureDescription ?? "no failure description provided");
					throw new DicomException(message);
				}
				if (scu.Status == ScuOperationStatus.ConnectFailed)
				{
					String message = String.Format(SR.MessageFormatDicomConnectionFailed,
					                               scu.FailureDescription ?? "no failure description provided");
					throw new DicomException(message);
				}
				if (scu.Status == ScuOperationStatus.Failed)
				{
					String message = String.Format(SR.MessageFormatDicomQueryOperationFailed,
					                               scu.FailureDescription ?? "no failure description provided");
					throw new DicomException(message);
				}
				if (scu.Status == ScuOperationStatus.TimeoutExpired)
				{
					String message = String.Format(SR.MessageFormatDicomConnectTimeoutExpired,
					                               scu.FailureDescription ?? "no failure description provided");
					throw new DicomException(message);
				}

				foreach (DicomAttributeCollection result in results)
				{
					numberOfInstancesFromDicomServer += (int) result[DicomTags.NumberOfStudyRelatedInstances].GetUInt32(0, 0);
				}

				studiesNotFound = results.Count == 0;
			}

			return numberOfInstancesFromDicomServer;
		}
Example #16
0
		private void buttonQueryScuSearch_Click(object sender, EventArgs e)
		{
			XmlDocument theDoc = new XmlDocument();

			try
			{
				theDoc.LoadXml(textBoxQueryMessage.Text);
				InstanceXml instanceXml = new InstanceXml(theDoc.DocumentElement, null);
				DicomAttributeCollection queryMessage = instanceXml.Collection;

				if (queryMessage == null)
				{
					Logger.LogError("Unexpected error parsing query message");
				}

				int maxResults;
				if (!int.TryParse(textBoxQueryScuMaxResults.Text, out maxResults))
					maxResults = -1;

				IList<DicomAttributeCollection> resultsList;
				if (comboBoxQueryScuQueryType.SelectedIndex == 0)
				{
					StudyRootFindScu findScu = new StudyRootFindScu();
					findScu.MaxResults = maxResults;
					resultsList = findScu.Find(textBoxQueryScuLocalAe.Text,
								 textBoxQueryScuRemoteAe.Text,
								 textBoxQueryScuRemoteHost.Text,
								 int.Parse(textBoxQueryScuRemotePort.Text), queryMessage);
					findScu.Dispose();
				}
				else
				{
					PatientRootFindScu findScu = new PatientRootFindScu();
					findScu.MaxResults = maxResults;
					resultsList = findScu.Find(textBoxQueryScuLocalAe.Text,
								 textBoxQueryScuRemoteAe.Text,
								 textBoxQueryScuRemoteHost.Text,
								 int.Parse(textBoxQueryScuRemotePort.Text), queryMessage);
					findScu.Dispose();
				}

				foreach (DicomAttributeCollection msg in resultsList)
				{
					Logger.LogInfo(msg.DumpString);
				}
			}
			catch (Exception x)
			{
				Logger.LogErrorException(x, "Unable to perform query");
				return;
			}		
		}
Example #17
0
        /// <summary>
        /// Called by the framework when the user clicks the "apply" menu item or toolbar button.
        /// </summary>
        public void SeriesQuery()
        {
            string            callingAE  = ServerTree.GetClientAETitle();
            List <SeriesItem> SeriesList = new List <SeriesItem>();

            #region remote datastore
            // If remote data store, need to query server for series level information
            if (!this.Context.SelectedServerGroup.IsLocalDatastore)
            {
                // Loop through all selected servers
                foreach (Server node in this.Context.SelectedServerGroup.Servers)
                {
                    DicomAttributeCollection dicomAttributeCollection = new DicomAttributeCollection();
                    // Query on "Series" Level
                    dicomAttributeCollection[DicomTags.QueryRetrieveLevel].SetStringValue("SERIES");

                    string studyUID = this.Context.SelectedStudies[0].StudyInstanceUid;
                    dicomAttributeCollection[DicomTags.StudyInstanceUid].SetStringValue(studyUID);
                    dicomAttributeCollection[DicomTags.SeriesDescription].SetNullValue();
                    dicomAttributeCollection[DicomTags.SeriesInstanceUid].SetNullValue();
                    dicomAttributeCollection[DicomTags.SeriesNumber].SetNullValue();
                    dicomAttributeCollection[DicomTags.Modality].SetNullValue();
                    dicomAttributeCollection[DicomTags.Date].SetNullValue();
                    dicomAttributeCollection[DicomTags.Time].SetNullValue();
                    dicomAttributeCollection[DicomTags.RepetitionTime].SetNullValue();

                    IList <DicomAttributeCollection> resultsList;
                    StudyRootFindScu findScu    = new StudyRootFindScu();
                    List <string>    seriesUIDs = new List <string>();

                    resultsList = findScu.Find(
                        callingAE,
                        node.AETitle,
                        node.Host,
                        node.Port,
                        dicomAttributeCollection);

                    findScu.CloseAssociation();
                    findScu.Dispose();

                    foreach (DicomAttributeCollection msg in resultsList)
                    {
                        string text = msg[DicomTags.SeriesInstanceUid];
                        Platform.Log(LogLevel.Info, text);

                        SeriesItem series = new SeriesItem();

                        series.SeriesNumber      = msg[DicomTags.SeriesNumber];
                        series.SeriesDescription = msg[DicomTags.SeriesDescription];
                        series.StudyInstanceUID  = msg[DicomTags.StudyInstanceUid];
                        series.SeriesInstanceUID = msg[DicomTags.SeriesInstanceUid];
                        series.Modality          = msg[DicomTags.Modality];
                        series.Date = msg[DicomTags.Date];
                        series.Time = msg[DicomTags.Time];
                        //series.NumberOfSeriesRelatedInstances = int.Parse(msg[DicomTags.NumberOfSeriesRelatedInstances].ToString());
                        SeriesList.Add(series);
                    }
                    _component     = new SeriesBrowserComponent(SeriesList, node);
                    _shelf         = ApplicationComponent.LaunchAsShelf(this.Context.DesktopWindow, _component, "Series Browser", ShelfDisplayHint.DockBottom | ShelfDisplayHint.DockAutoHide);
                    _shelf.Closed += Shelf_Closed;
                }
            }
            #endregion

            #region Local Datastore
            // If local datastore, can obtain series information by building study tree
            else
            {
                IImageViewer viewer    = new ImageViewerComponent();
                StudyTree    studyTree = viewer.StudyTree;

                // Add selected objects studies to study tree
                foreach (StudyItem selectedstudy in this.Context.SelectedStudies)
                {
                    string studyUID     = selectedstudy.StudyInstanceUid;
                    int    numberOfSops = LocalStudyLoader.Start(new StudyLoaderArgs(studyUID, null));
                    for (int i = 0; i < numberOfSops; ++i)
                    {
                        Sop imageSop = LocalStudyLoader.LoadNextSop();
                        studyTree.AddSop(imageSop);
                    }
                }

                foreach (Patient patient in studyTree.Patients)
                {
                    foreach (Study study in patient.Studies)
                    {
                        foreach (Series series in study.Series)
                        {
                            SeriesItem seriesitem = new SeriesItem();

                            seriesitem.SeriesNumber      = series.SeriesNumber.ToString();
                            seriesitem.SeriesDescription = series.SeriesDescription;
                            seriesitem.StudyInstanceUID  = study.StudyInstanceUid;
                            seriesitem.SeriesInstanceUID = series.SeriesInstanceUid;
                            seriesitem.Modality          = series.Modality;
                            seriesitem.Date = series.SeriesDate;
                            seriesitem.Time = series.SeriesTime;
                            //series.NumberOfSeriesRelatedInstances = int.Parse(msg[DicomTags.NumberOfSeriesRelatedInstances].ToString());
                            seriesitem.NumberOfSeriesRelatedInstances = series.Sops.Count.ToString();

                            SeriesList.Add(seriesitem);
                        }
                        _component     = new SeriesBrowserComponent(SeriesList, null);
                        _shelf         = ApplicationComponent.LaunchAsShelf(this.Context.DesktopWindow, _component, DicomDataFormatHelper.PersonNameFormatter(patient.PatientsName), ShelfDisplayHint.DockBottom | ShelfDisplayHint.DockAutoHide);
                        _shelf.Closed += Shelf_Closed;
                    }
                }
            }
            #endregion
        }
Example #18
0
    public static Study GetStudyFromAccession(string accession)
    {
        var node = GetSelectedNode();

        if (node == null)
        {
            throw new Exception("Unable to get selected DICOM node");
        }
        StudyRootFindScu findScu      = new StudyRootFindScu();
        StudyQueryIod    queryMessage = new StudyQueryIod();

        queryMessage.SetCommonTags();
        queryMessage.AccessionNumber = accession;
        IList <StudyQueryIod> results = findScu.Find(node.LocalAe, node.AET, node.IP, node.Port, queryMessage);

        if (results.Count == 1)
        {
            Study st = new Study();
            st.Accession        = results[0].AccessionNumber;
            st.Images           = (int)results[0].NumberOfStudyRelatedInstances;
            st.PatientDob       = results[0].PatientsBirthDate;
            st.PatientFirstname = results[0].PatientsName.FirstName;
            st.PatientId        = results[0].PatientId;
            st.PatientSurname   = results[0].PatientsName.LastName;
            st.StudyDate        = results[0].StudyDate;
            st.StudyDescription = results[0].StudyDescription;
            st.StudyModality    = results[0].ModalitiesInStudy;
            st.StudyUid         = results[0].StudyInstanceUid;
            if (st.StudyDate != null && st.PatientDob != null)
            {
                int age = st.StudyDate.Value.Year - st.PatientDob.Value.Year;
                if (st.PatientDob.Value > st.StudyDate.Value.AddYears(-age))
                {
                    age--;
                }
                st.PatientAge = age;
            }
            StudyRootFindScu seriesFindScu = new StudyRootFindScu();
            SeriesQueryIod   seriesQuery   = new SeriesQueryIod();
            seriesQuery.SetCommonTags();
            seriesQuery.StudyInstanceUid = results[0].StudyInstanceUid;
            IList <SeriesQueryIod> seriesResults = seriesFindScu.Find(node.LocalAe, node.AET, node.IP, node.Port, seriesQuery);
            if (seriesResults.Count > 0)
            {
                st.Series = new List <Series>();
                foreach (var se in seriesResults)
                {
                    Series s = new Series();
                    s.StudyUid          = results[0].StudyInstanceUid;
                    s.Images            = (int)se.NumberOfSeriesRelatedInstances;
                    s.SeriesDescription = se.SeriesDescription;
                    s.SeriesModality    = se.Modality;
                    s.SeriesUid         = se.SeriesInstanceUid;
                    st.Series.Add(s);
                }
            }
            return(st);
        }
        else
        {
            throw new Exception("No study found");
        }
    }
Example #19
0
        protected static IList<DicomAttributeCollection> Query(IApplicationEntity server, DicomAttributeCollection requestCollection)
		{
			//special case code for ModalitiesInStudy.  An IStudyFinder must accept a multi-valued
			//string for ModalitiesInStudy (e.g. "MR\\CT") and process it appropriately for the 
			//datasource that is being queried.  In this case (Dicom) does not allow multiple
			//query keys, so we have to execute one query per modality specified in the 
			//ModalitiesInStudy query item.

			List<string> modalityFilters = new List<string>();
			if (requestCollection.Contains(DicomTags.ModalitiesInStudy))
			{
				string modalityFilterString = requestCollection[DicomTags.ModalitiesInStudy].ToString();
				if (!String.IsNullOrEmpty(modalityFilterString))
					modalityFilters.AddRange(modalityFilterString.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries));

				if (modalityFilters.Count == 0)
					modalityFilters.Add(""); //make sure there is at least one filter, the default.
			}

			SortedList<string, DicomAttributeCollection> resultsByStudy = new SortedList<string, DicomAttributeCollection>();

			string combinedFilter = requestCollection[DicomTags.ModalitiesInStudy];

			try 
			{
				foreach (string modalityFilter in modalityFilters) 
				{
					using (StudyRootFindScu scu = new StudyRootFindScu())
					{
						requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(modalityFilter);

                        IList<DicomAttributeCollection> results = scu.Find(
                            DicomServer.AETitle, server.AETitle, server.ScpParameters.HostName, server.ScpParameters.Port, requestCollection);

						scu.Join(new TimeSpan(0, 0, 0, 0, 1000));

						if(scu.Status == ScuOperationStatus.Canceled)
						{
							String message = String.Format(SR.MessageFormatRemoteServerCancelledFind, 
								scu.FailureDescription ?? "no failure description provided");
							throw new DicomException(message);
						}
						if (scu.Status == ScuOperationStatus.ConnectFailed)
						{
							String message = String.Format(SR.MessageFormatConnectionFailed,
								scu.FailureDescription ?? "no failure description provided");
							throw new DicomException(message);
						}
						else if (scu.Status == ScuOperationStatus.AssociationRejected)
						{
							String message = String.Format(SR.MessageFormatAssociationRejected,
								scu.FailureDescription ?? "no failure description provided");
							throw new DicomException(message);
						}
						if (scu.Status == ScuOperationStatus.Failed)
						{
							String message = String.Format(SR.MessageFormatQueryOperationFailed,
								scu.FailureDescription ?? "no failure description provided");
							throw new DicomException(message);
						}
						if (scu.Status == ScuOperationStatus.TimeoutExpired)
						{
							String message = String.Format(SR.MessageFormatConnectTimeoutExpired,
								scu.FailureDescription ?? "no failure description provided");
							throw new DicomException(message);
						}
						if (scu.Status == ScuOperationStatus.NetworkError)
						{
							throw new DicomException(SR.MessageUnexpectedNetworkError);
						}
						if (scu.Status == ScuOperationStatus.UnexpectedMessage)
						{
							throw new DicomException(SR.MessageUnexpectedMessage);
						}

						//if this function returns true, it means that studies came back whose 
						//modalities did not match the filter, meaning that filtering on
						//ModalitiesInStudy is not supported by that server.
						if (FilterResultsByModality(results, resultsByStudy, modalityFilter))
							break;
					}
				}

				return new List<DicomAttributeCollection>(resultsByStudy.Values);
			}
			finally
			{
				//for consistencies sake, put the original filter back.
				requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(combinedFilter);
			}
		}
        protected static IList <DicomAttributeCollection> Query(IApplicationEntity server, DicomAttributeCollection requestCollection)
        {
            //special case code for ModalitiesInStudy.  An IStudyFinder must accept a multi-valued
            //string for ModalitiesInStudy (e.g. "MR\\CT") and process it appropriately for the
            //datasource that is being queried.  In this case (Dicom) does not allow multiple
            //query keys, so we have to execute one query per modality specified in the
            //ModalitiesInStudy query item.

            List <string> modalityFilters = new List <string>();

            if (requestCollection.Contains(DicomTags.ModalitiesInStudy))
            {
                string modalityFilterString = requestCollection[DicomTags.ModalitiesInStudy].ToString();
                if (!String.IsNullOrEmpty(modalityFilterString))
                {
                    modalityFilters.AddRange(modalityFilterString.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries));
                }

                if (modalityFilters.Count == 0)
                {
                    modalityFilters.Add("");                     //make sure there is at least one filter, the default.
                }
            }

            SortedList <string, DicomAttributeCollection> resultsByStudy = new SortedList <string, DicomAttributeCollection>();

            string combinedFilter = requestCollection[DicomTags.ModalitiesInStudy];

            try
            {
                foreach (string modalityFilter in modalityFilters)
                {
                    using (StudyRootFindScu scu = new StudyRootFindScu())
                    {
                        requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(modalityFilter);

                        IList <DicomAttributeCollection> results = scu.Find(
                            DicomServer.AETitle, server.AETitle, server.ScpParameters.HostName, server.ScpParameters.Port, requestCollection);

                        scu.Join(new TimeSpan(0, 0, 0, 0, 1000));

                        if (scu.Status == ScuOperationStatus.Canceled)
                        {
                            String message = String.Format(SR.MessageFormatRemoteServerCancelledFind,
                                                           scu.FailureDescription ?? "no failure description provided");
                            throw new DicomException(message);
                        }
                        if (scu.Status == ScuOperationStatus.ConnectFailed)
                        {
                            String message = String.Format(SR.MessageFormatConnectionFailed,
                                                           scu.FailureDescription ?? "no failure description provided");
                            throw new DicomException(message);
                        }
                        else if (scu.Status == ScuOperationStatus.AssociationRejected)
                        {
                            String message = String.Format(SR.MessageFormatAssociationRejected,
                                                           scu.FailureDescription ?? "no failure description provided");
                            throw new DicomException(message);
                        }
                        if (scu.Status == ScuOperationStatus.Failed)
                        {
                            String message = String.Format(SR.MessageFormatQueryOperationFailed,
                                                           scu.FailureDescription ?? "no failure description provided");
                            throw new DicomException(message);
                        }
                        if (scu.Status == ScuOperationStatus.TimeoutExpired)
                        {
                            String message = String.Format(SR.MessageFormatConnectTimeoutExpired,
                                                           scu.FailureDescription ?? "no failure description provided");
                            throw new DicomException(message);
                        }
                        if (scu.Status == ScuOperationStatus.NetworkError)
                        {
                            throw new DicomException(SR.MessageUnexpectedNetworkError);
                        }
                        if (scu.Status == ScuOperationStatus.UnexpectedMessage)
                        {
                            throw new DicomException(SR.MessageUnexpectedMessage);
                        }

                        //if this function returns true, it means that studies came back whose
                        //modalities did not match the filter, meaning that filtering on
                        //ModalitiesInStudy is not supported by that server.
                        if (FilterResultsByModality(results, resultsByStudy, modalityFilter))
                        {
                            break;
                        }
                    }
                }

                return(new List <DicomAttributeCollection>(resultsByStudy.Values));
            }
            finally
            {
                //for consistencies sake, put the original filter back.
                requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(combinedFilter);
            }
        }
Example #21
0
    public static List<Study> GetPatientStudiesFromId(string patientId)
    {
        var node = GetSelectedNode();
        if (node == null)
            throw new Exception("Unable to get selected DICOM node");
        StudyRootFindScu findScu = new StudyRootFindScu();
        StudyQueryIod queryMessage = new StudyQueryIod();
        queryMessage.SetCommonTags();
        queryMessage.PatientId = patientId;
        IList<StudyQueryIod> results = findScu.Find(node.LocalAe, node.AET, node.IP, node.Port, queryMessage);
        if (results.Count > 0)
        {
            List<Study> stList = new List<Study>();

            foreach(var st in results)
            {
                var nst = new Study();
                nst.Accession = st.AccessionNumber;
                nst.Images = (int)st.NumberOfStudyRelatedInstances;
                nst.PatientDob = st.PatientsBirthDate;
                nst.PatientFirstname = st.PatientsName.FirstName;
                nst.PatientId = st.PatientId;
                nst.PatientSurname = st.PatientsName.LastName;
                nst.StudyDate = st.StudyDate;
                nst.StudyDescription = st.StudyDescription;
                nst.StudyModality = st.ModalitiesInStudy;               
                nst.StudyUid = st.StudyInstanceUid;
                if (nst.StudyDate != null && nst.PatientDob != null)
                {
                    int age = nst.StudyDate.Value.Year - nst.PatientDob.Value.Year;
                    if (nst.PatientDob.Value > nst.StudyDate.Value.AddYears(-age)) age--;
                    nst.PatientAge = age;
                }
                StudyRootFindScu seriesFindScu = new StudyRootFindScu();
                SeriesQueryIod seriesQuery = new SeriesQueryIod();
                seriesQuery.SetCommonTags();
                seriesQuery.StudyInstanceUid = st.StudyInstanceUid;
                IList<SeriesQueryIod> seriesResults = seriesFindScu.Find(node.LocalAe, node.AET, node.IP, node.Port, seriesQuery);
                if (seriesResults.Count > 0)
                {
                    nst.Series = new List<Series>();
                    foreach (var se in seriesResults)
                    {
                        if((int)se.NumberOfSeriesRelatedInstances < 1) { continue; }
                        if (nst.StudyModality == "SR" && se.Modality != "SR") { nst.StudyModality = se.Modality; }
                        Series s = new Series();
                        s.StudyUid = results[0].StudyInstanceUid;
                        s.Images = (int)se.NumberOfSeriesRelatedInstances;
                        s.SeriesDescription = se.SeriesDescription;
                        s.SeriesModality = se.Modality;
                        s.SeriesUid = se.SeriesInstanceUid;
                        nst.Series.Add(s);
                    }
                }
                if (nst.StudyModality == "SR") { nst.StudyModality = ""; }
                stList.Add(nst);
            }
            return stList;
        }
        else
        {
            throw new Exception("Unable to find studies for patient on PACS");
        }
    }
Example #22
0
    public static bool DownloadOneSeries(string studyuid, string seriesuid, int retryCount = 0)
    {
        var node   = GetSelectedNode();
        var cstore = new DicomSCP(node.LocalAe, 104);

        try
        {
            LOG.Write("Retry Count: " + retryCount);

            StudyRootFindScu findScu      = new StudyRootFindScu();
            SeriesQueryIod   queryMessage = new SeriesQueryIod();
            queryMessage.SetCommonTags();
            queryMessage.StudyInstanceUid  = studyuid;
            queryMessage.SeriesInstanceUid = seriesuid;
            IList <SeriesQueryIod> results = findScu.Find(node.LocalAe, node.AET, node.IP, node.Port, queryMessage);
            if (results.Count != 1)
            {
                throw new Exception(string.Format("Unable to query study on PACS: [{0}]", studyuid));
            }

            int expectedFiles = (int)results[0].NumberOfSeriesRelatedInstances;

            if (!System.IO.Directory.Exists(node.LocalStorage))
            {
                System.IO.Directory.CreateDirectory(node.LocalStorage);
            }
            cstore.Start();
            while (!cstore.IsRunning)
            {
                System.Threading.Thread.Sleep(1000);
            }

            MoveScuBase moveScu = new StudyRootMoveScu(node.LocalAe, node.AET, node.IP, node.Port, node.LocalAe);
            moveScu.ReadTimeout  = 600000;
            moveScu.WriteTimeout = 600000;
            moveScu.AddStudyInstanceUid(studyuid);
            moveScu.AddSeriesInstanceUid(seriesuid);

            DateTime started = DateTime.Now;

            moveScu.Move();
            System.Threading.Thread.Sleep(2000);
            if (moveScu.Status == ScuOperationStatus.AssociationRejected || moveScu.Status == ScuOperationStatus.Canceled ||
                moveScu.Status == ScuOperationStatus.ConnectFailed || moveScu.Status == ScuOperationStatus.Failed ||
                moveScu.Status == ScuOperationStatus.NetworkError || moveScu.Status == ScuOperationStatus.TimeoutExpired ||
                moveScu.Status == ScuOperationStatus.UnexpectedMessage || moveScu.FailureSubOperations != 0)
            {
                if (retryCount > 4)
                {
                    throw new Exception(string.Format("Failed moving study [{0}] | Status : {1} | Failed Operations: {2}", studyuid, moveScu.Status, moveScu.FailureSubOperations));
                }
                retryCount += 1;
                if (cstore.IsRunning)
                {
                    cstore.Stop();
                }
                DownloadOneSeries(studyuid, seriesuid, retryCount);
            }

            string downloadFolder = GetStoreString();
            downloadFolder = Path.Combine(downloadFolder, studyuid, seriesuid);
            bool direxist = Directory.Exists(downloadFolder);
            while (!direxist)
            {
                if ((DateTime.Now - started).TotalMinutes > 3)
                {
                    if (cstore.IsRunning)
                    {
                        cstore.Stop();
                    }
                    throw new Exception("Waited too long for images to come in");
                }
                //LOG.Write("Waiting for images to come in...");
                System.Threading.Thread.Sleep(1 * 1000);
                direxist = Directory.Exists(downloadFolder);
            }

            var dcmfiles = Directory.GetFiles(downloadFolder, "*.dcm");
            var dcmCount = dcmfiles.Length;
            while (dcmCount < expectedFiles)
            {
                if ((DateTime.Now - started).TotalMinutes > 3)
                {
                    if (cstore.IsRunning)
                    {
                        cstore.Stop();
                    }
                    throw new Exception("Waited too long for images to come in");
                }
                //LOG.Write("Waiting for images to come in...");
                System.Threading.Thread.Sleep(1 * 1000);
                dcmfiles = Directory.GetFiles(downloadFolder, "*.dcm");
                if (dcmfiles.Length != dcmCount)
                {
                    if (dcmfiles.Length >= expectedFiles)
                    {
                        break;
                    }
                    dcmCount = dcmfiles.Length;
                    started  = DateTime.Now;
                }
            }

            if (cstore.IsRunning)
            {
                cstore.Stop();
            }
            LOG.Write("Series successfully downloaded from PACS");
            return(true);
        }
        catch (Exception ex)
        {
            if (cstore.IsRunning)
            {
                cstore.Stop();
            }
            string errorString = "Error at :" + System.Reflection.MethodBase.GetCurrentMethod().Name;
            LOG.Write(errorString);
            LOG.Write(ex.Message);
            return(false);
        }
    }
Example #23
0
 public static void DicomTestQueryStudy(string accession)
 {
     StudyRootFindScu findScu = new StudyRootFindScu();
     StudyQueryIod queryMessage = new StudyQueryIod();
     queryMessage.SetCommonTags();
     queryMessage.AccessionNumber = accession;
     IList<StudyQueryIod> results = findScu.Find("ANDYPACS3", "RMHSYNSCP", "172.28.40.151", 104, queryMessage);
     if (results.Count == 1)
     {
         Study st = new Study();
         st.Accession = results[0].AccessionNumber;
         st.Images = (int)results[0].NumberOfStudyRelatedInstances;
         st.PatientDob = results[0].PatientsBirthDate;
         st.PatientFirstname = results[0].PatientsName.FirstName;
         st.PatientId = results[0].PatientId;
         st.PatientSurname = results[0].PatientsName.LastName;
         st.StudyDate = results[0].StudyDate;
         st.StudyDescription = results[0].StudyDescription;
         st.StudyModality = results[0].ModalitiesInStudy;
         st.StudyUid = results[0].StudyInstanceUid;
         if (st.StudyDate != null && st.PatientDob != null)
         {
             int age = st.StudyDate.Value.Year - st.PatientDob.Value.Year;
             if (st.PatientDob.Value > st.StudyDate.Value.AddYears(-age)) age--;
             st.PatientAge = age;
         }            
     }
 }