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(); }
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)); }
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"); } }
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; } }
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, })); }
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()); }
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); }
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); }
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); } }
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; }
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; } }
/// <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 }
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"); } }
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); } }
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"); } }
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); } }
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; } } }