private static bool Filter(HashSet <string> whitelistIfAny, DicomCFindResponse response) { var dataset = response.Dataset; //ignore responses where there are no dataset record being returned if (dataset == null) { return(false); } //if there is a whitelist if (whitelistIfAny != null) { //get the response dataset patientId var patientId = dataset.GetSingleValue <string>(DicomTag.PatientID); //if the patientId is empty or not on our whitelist if (patientId == null) { return(false); } return(whitelistIfAny.Contains(patientId.Trim())); } //No WhiteList just add return(true); }
public async Task OnCFindRequestAsync_ImmediateSuccess_ShouldRespond() { var port = Ports.GetNext(); using (DicomServerFactory.Create <ImmediateSuccessAsyncDicomCFindProvider>(port, logger: _logger.IncludePrefix("DicomServer"))) { var client = DicomClientFactory.Create("127.0.0.1", port, false, "SCU", "ANY-SCP"); client.Logger = _logger.IncludePrefix(typeof(DicomClient).Name); DicomCFindResponse response = null; DicomRequest.OnTimeoutEventArgs timeout = null; var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study) { OnResponseReceived = (req, res) => response = res, OnTimeout = (sender, args) => timeout = args }; await client.AddRequestAsync(request).ConfigureAwait(false); await client.SendAsync().ConfigureAwait(false); Assert.NotNull(response); Assert.Equal(DicomStatus.Success, response.Status); Assert.Null(timeout); } }
public virtual IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { DicomStatus status = DicomStatus.Success; IList <DicomDataset> queries; List <DicomCFindResponse> responses = new List <DicomCFindResponse>(); if (OnZSCFindRequest != null) { //此处通过代理来返回在服务端本机进行的操作结果,也就是DICOM协议中说的匹配查询结果 queries = OnZSCFindRequest(request); if (queries != null) { Logger.Info("查询到{0}个数据", queries.Count); foreach (var item in queries) { //对于每一个查询匹配的结果,都需要有一个单独的C-FIND-RSP消息来返回到请求端 //【注】:每次发送的状态都必须是Pending,表明后续还会继续发送查询结果 DicomCFindResponse rsp = new DicomCFindResponse(request, DicomStatus.Pending); rsp.Dataset = item; responses.Add(rsp); } } else { status = DicomStatus.QueryRetrieveOutOfResources; } } //随后需要发送查询结束的状态,即Success到C-FIND SCU端 responses.Add(new DicomCFindResponse(request, DicomStatus.Success)); //这里貌似是一起将多个response发送出去的?需要后续在研究一下DicomService中的实现代码 //搞清楚具体的发送机制 return(responses); }
public static void DebugStudyResponse(DicomCFindResponse response) { if (response.Status == DicomStatus.Pending) { // print the results Console.WriteLine($"Patient {response.Dataset.Get(DicomTag.PatientName, string.Empty)}, {response.Dataset.Get(DicomTag.ModalitiesInStudy, string.Empty)}"); } if (response.Status == DicomStatus.Success) { Console.WriteLine(response.Status.ToString()); } }
public static void DebugStudyResponse(DicomCFindResponse response) { if (response.Status == DicomStatus.Pending) { // print the results Console.WriteLine($"Patient {response.Dataset.Get<String>(DicomTag.PatientName)}, {response.Dataset.Get<String>(DicomTag.ModalitiesInStudy, -1)}-Study from {response.Dataset.Get<DateTime>(DicomTag.StudyDate)} with UID {response.Dataset.Get<String>(DicomTag.StudyInstanceUID)} "); } if (response.Status == DicomStatus.Success) { Console.WriteLine(response.Status.ToString()); } }
public static void DebugStudyResponse(DicomCFindResponse response) { if (response.Status == DicomStatus.Pending) { // print the results Console.WriteLine($"Patient {response.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty)}, {(response.Dataset.TryGetString(DicomTag.ModalitiesInStudy, out var dummy) ? dummy : string.Empty)}-Study from {response.Dataset.GetSingleValueOrDefault(DicomTag.StudyDate, new DateTime())} with UID {response.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty)} "); } if (response.Status == DicomStatus.Success) { Console.WriteLine(response.Status.ToString()); } }
private void WriteValue(CsvWriter writer, DicomCFindResponse response, DicomTag tag) { var val = DicomTypeTranslaterReader.GetCSharpValue(response.Dataset, tag); if (val == null) { writer.WriteField(""); } else { writer.WriteField(DicomTypeTranslater.Flatten(val)); } }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { List <DicomCFindResponse> responses = new List <DicomCFindResponse>(); IList <DicomDataset> queryResults = HandleCFindQuery(request); foreach (DicomDataset item in queryResults) { DicomCFindResponse response = new DicomCFindResponse(request, DicomStatus.Pending); response.Dataset = item; responses.Add(response); } responses.Add(new DicomCFindResponse(request, DicomStatus.Success)); return(responses); }
private void WriteResult(CsvWriter writer, DicomCFindResponse response) { if (!response.HasDataset) { return; } foreach (var t in _tagsToWrite) { WriteValue(writer, response, t); } writer.NextRecord(); }
public SeriesQueryOut(DicomCFindResponse response) { PropertyInfo[] properties = typeof(SeriesQueryOut).GetProperties(); foreach (var property in properties) { // (0010,0010) string tag = typeof(DicomTag).GetField(property.Name).GetValue(null).ToString(); // DicomTag.PatientName DicomTag theTag = (DicomTag.Parse(tag)); string value = ""; response.Dataset.TryGetSingleValue(theTag, out value); property.SetValue(this, value); } }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { DicomStatus status = DicomStatus.Success; var queries = GetPatients(); foreach (var item in queries) { DicomCFindResponse rs = new DicomCFindResponse(request, DicomStatus.Pending); rs.Dataset = item; yield return(rs); } DicomCFindResponse rs2 = new DicomCFindResponse(request, DicomStatus.Success); rs2.Dataset = queries.LastOrDefault(); yield return(rs2); }
private Patient GetPatientInformation(DicomCFindResponse rp) { Patient patient = new Patient { FirstName = rp.Dataset.Get <string>(DicomTag.PatientName), Sex = rp.Dataset.Get <Sex>(DicomTag.PatientSex), BirthDate = rp.Dataset.Get <DateTime>(DicomTag.PatientBirthDate), PatientAddress = rp.Dataset.Get <string>(DicomTag.PatientAddress), PatientComments = rp.Dataset.Get <string>(DicomTag.PatientComments), AccessionNumber = rp.Dataset.Get <string>(DicomTag.AccessionNumber), PatientId = rp.Dataset.Get <string>(DicomTag.PatientID), MedicalRecordLocator = rp.Dataset.Get <string>(DicomTag.MedicalRecordLocator), Telephone = rp.Dataset.Get <string>(DicomTag.PatientTelephoneNumbers) }; return(patient); }
public static void DebugSerieResponse(DicomCFindResponse response) { try { if (response.Status == DicomStatus.Pending) { // print the results Console.WriteLine($"Serie {response.Dataset.GetSingleValue<String>(DicomTag.SeriesDescription)}, {response.Dataset.GetSingleValue<String>(DicomTag.Modality)}, {response.Dataset.GetSingleValue<int>(DicomTag.NumberOfSeriesRelatedInstances)} instances"); } if (response.Status == DicomStatus.Success) { Console.WriteLine(response.Status.ToString()); } } catch (Exception) { } }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { Console.WriteLine(request.PresentationContext.AbstractSyntax.ToString()); var responseList = new List <DicomCFindResponse>(); var r = new DicomCFindResponse(request, DicomStatus.Pending); r.Dataset = new DicomDataset(); r.Dataset.Add(DicomTag.PatientID, request.PresentationContext.AbstractSyntax.ToString()); responseList.Add(r); r = new DicomCFindResponse(request, DicomStatus.Pending); r.Dataset = new DicomDataset(); r.Dataset.Add(DicomTag.SOPClassesInStudy, request.PresentationContext.Result.ToString()); responseList.Add(r); responseList.Add(new DicomCFindResponse(request, DicomStatus.Success)); return(responseList); }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { var patientId = GetPatientId(request); var familyName = GetPatientName(request); List <DicomCFindResponse> responses = new List <DicomCFindResponse>(); if (request.Level == DicomQueryRetrieveLevel.Patient) { foreach (DicomDataset result in GetWorklistResults(request)) { var response = new DicomCFindResponse(request, DicomStatus.Success); response.Dataset = result; responses.Add(response); } } responses.Add(new DicomCFindResponse(request, DicomStatus.Success)); return(responses); }
//получает информацио о патиентах в Dicom Worklist private Patient GetPatientInformation(DicomCFindResponse rp) { string patientName = rp.Dataset.Get <string>(DicomTag.PatientName); Patient patient = new Patient { FirstName = patientName.Substring(patientName.IndexOf('^') + 1, patientName.IndexOf('^') - 2), LastName = patientName.Substring(0, patientName.IndexOf('^')), MiddleName = patientName.Substring(patientName.LastIndexOf('^') + 1), Sex = rp.Dataset.Get <Sex>(DicomTag.PatientSex), BirthDate = rp.Dataset.Get <DateTime>(DicomTag.PatientBirthDate), PatientAddress = rp.Dataset.Get <string>(DicomTag.PatientAddress), PatientComments = rp.Dataset.Get <string>(DicomTag.PatientComments), AccessionNumber = rp.Dataset.Get <string>(DicomTag.AccessionNumber), PatientId = rp.Dataset.Get <string>(DicomTag.PatientID), MedicalRecordLocator = rp.Dataset.Get <string>(DicomTag.MedicalRecordLocator), Telephone = rp.Dataset.Get <string>(DicomTag.PatientTelephoneNumbers) }; return(patient); }
public async Task SendingFindRequestToServerThatSendsPendingResponsesWithinTimeoutShouldNotTimeout() { var port = Ports.GetNext(); using (CreateServer <FastPendingResponsesDicomServer>(port)) { var client = CreateClient(port); client.ServiceOptions.RequestTimeout = TimeSpan.FromSeconds(2); DicomCFindResponse lastResponse = null; var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Patient) { Dataset = new DicomDataset { { DicomTag.PatientID, "PAT123" } }, OnResponseReceived = (req, res) => lastResponse = res }; DicomRequest.OnTimeoutEventArgs onTimeoutEventArgs = null; request.OnTimeout += (sender, args) => onTimeoutEventArgs = args; await client.AddRequestAsync(request).ConfigureAwait(false); var sendTask = client.SendAsync(); var sendTimeoutCancellationTokenSource = new CancellationTokenSource(); var sendTimeout = Task.Delay(TimeSpan.FromSeconds(10), sendTimeoutCancellationTokenSource.Token); var winner = await Task.WhenAny(sendTask, sendTimeout).ConfigureAwait(false); sendTimeoutCancellationTokenSource.Cancel(); sendTimeoutCancellationTokenSource.Dispose(); Assert.Equal(winner, sendTask); Assert.NotNull(lastResponse); Assert.Equal(lastResponse.Status, DicomStatus.Success); Assert.Null(onTimeoutEventArgs); } }
public static void LogStudyResultsFoundToDebugConsole(DicomCFindResponse response) { // See http://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_CC.2.8.4.html for status codes for C-FIND responses // The remote AE will provide a status of pending if it has matches and continues to send it one by one if (response.Status == DicomStatus.Pending) { var patientName = response.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty); var studyDate = response.Dataset.GetSingleValueOrDefault(DicomTag.StudyDate, new DateTime()); var studyUID = response.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty); LogToDebugConsole("Matched Result..."); LogToDebugConsole($"Patient Found -> {patientName} "); LogToDebugConsole($"Study Date -> {studyDate} "); LogToDebugConsole($"Study UID -> {studyUID} "); LogToDebugConsole("\n"); } //if all match operations against the supplied query filter have been completed if (response.Status == DicomStatus.Success) { LogToDebugConsole(response.Status.ToString()); } }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { IList <DicomCFindResponse> responses = new List <DicomCFindResponse>(); //固定返回C-FIND-RSP给客户端 for (int i = 0; i < 2; ++i) { DicomCFindResponse response = new DicomCFindResponse(request, DicomStatus.Pending) { Dataset = request.Dataset }; response.Completed = i + 100; responses.Add(response); } DicomCFindResponse rsp = new DicomCFindResponse(request, DicomStatus.Success) { Dataset = request.Dataset }; rsp.Completed = 2234; responses.Add(rsp); return(responses); }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { var log = new StringBuilder(); IDicomDatasetWalker walkerTexasRanger = new DicomDatasetDumper(log); new DicomDatasetWalker(request.Dataset).Walk(walkerTexasRanger); //var description = string.Format("C-FIND -> {0}", request.Dataset.Get<DicomSequence>(DicomTag.ScheduledProcedureStepSequence).First().Get(DicomTag.ScheduledProcedureStepStartDate, "NONE")); List <DicomCFindResponse> responses = new List <DicomCFindResponse>(); var results = m_WorklistRepository.WorklistItems; foreach (DicomDataset result in results) { //result.Add(DicomTag.RetrieveAETitle, "meeeeh"); var response = new DicomCFindResponse(request, DicomStatus.Pending) { Dataset = result }; responses.Add(response); } responses.Add(new DicomCFindResponse(request, DicomStatus.Success)); return(responses); }
public StudyQueryOut(DicomCFindResponse response) { PropertyInfo[] properties = typeof(StudyQueryOut).GetProperties(); foreach (var property in properties) { // (0010,0010) string tag = typeof(DicomTag).GetField(property.Name).GetValue(null).ToString(); // DicomTag.PatientName DicomTag theTag = (DicomTag.Parse(tag)); if (property.Name != "ModalitiesInStudy") { string value = ""; response.Dataset.TryGetSingleValue(theTag, out value); property.SetValue(this, value); } else { var value = new string[5]; response.Dataset.TryGetValues(theTag, out value); string modalities = ""; if (value != null) { for (int i = 0; i < value.Length; i++) { modalities = modalities + value[i] + ", "; } } if (modalities.Length > 2) { modalities = modalities.Substring(0, modalities.Length - 2); } property.SetValue(this, modalities); } } }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { string prefix = "[WorklistSCP] [" + session + "] "; Program.Log.Write(prefix + "Begin processing c-find request."); List <DicomCFindResponse> responses = new List <DicomCFindResponse>(); if (request.Level == DicomQueryRetrieveLevel.Worklist || request.Level == DicomQueryRetrieveLevel.Patient) { DataSet dsQC = DicomMappingHelper.CreateQCDataSet <MWLQueryCriteriaItem>(WorkListSCPService.Service.QCList, request.Dataset); WorklistSCPHelper.ModifyQCDataSet(WorkListSCPService.Service.QCList, dsQC); if (dsQC == null) { Program.Log.Write(prefix + "[WARNING] Process query criteria failed."); responses.Add(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess)); return(responses); } DataSet dsQR = WorkListSCPService.Service.RequestData(Program.ConfigMgt.Config.Rule, dsQC); if (dsQR == null) { Program.Log.Write(prefix + "[WARNING] Query GC Gateway database failed."); responses.Add(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess)); return(responses); } WorklistSCPHelper.GenerateRequestedProcedureID(dsQR, session); if (WorklistSCPHelper.SplitDataRow(dsQR)) { Program.Log.Write(prefix + "[INFORMATION] Found multiple values in code value and performed splitting."); } //fname = path + "\\DataSet_QR_2_SPLIT_" + DateTime.Now.Ticks.ToString() + ".xml"; //dsQR.WriteXml(fname); DElementListWrapper[] resultList = null; if (Program.ConfigMgt.Config.MergeElementList) { resultList = WorklistSCPHelper.CreateQRElementList <MWLQueryResultItem>(WorkListSCPService.Service.QRList, dsQR); } else { resultList = DicomMappingHelper.CreateQRElementList <MWLQueryResultItem>(WorkListSCPService.Service.QRList, dsQR); } if (resultList == null) { Program.Log.Write(prefix + "[WARNING] Process query result failed."); responses.Add(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess)); return(responses); } int count = resultList.Length; if (count < 1) { Program.Log.Write(prefix + "[WARNING] No query result."); } else { int index = 1; foreach (DElementListWrapper eleList in resultList) { Program.Log.Write(prefix + "Sending query result " + (index++).ToString() + "/" + count.ToString()); DicomDataset result = new DicomDataset(); if (Program.ConfigMgt.Config.SendCharacterSetTag) { //eleList.List.Add(DHelper.CharacterSet); if (DHelper.iCharacterSet != null) { for (int i = 0; i < DHelper.iCharacterSet.Length; i++) { eleList.List.Add <string>(DicomTag.SpecificCharacterSet, DHelper.iCharacterSet[i]); } } } eleList.List.Add <string>(new DicomTag(0x0000, 0x0002), "1.2.840.10008.5.1.4.31"); DicomCFindResponse response = new DicomCFindResponse(request, DicomStatus.Pending); response.Dataset = eleList.List; responses.Add(response); } } } responses.Add(new DicomCFindResponse(request, DicomStatus.Success)); return(responses); }