public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { var queryLevel = request.Level; var matchingFiles = new List <string>(); IDicomImageFinderService finderService = QRServer.CreateFinderService; // a QR SCP has to define in a DICOM Conformance Statement for which dicom tags it can query // depending on the level of the query. Below there are only very few parameters evaluated. switch (queryLevel) { case DicomQueryRetrieveLevel.Patient: { var patname = request.Dataset.Get(DicomTag.PatientName, string.Empty); var patid = request.Dataset.Get(DicomTag.PatientID, string.Empty); matchingFiles = finderService.FindPatientFiles(patname, patid); } break; case DicomQueryRetrieveLevel.Study: { var patname = request.Dataset.Get(DicomTag.PatientName, string.Empty); var patid = request.Dataset.Get(DicomTag.PatientID, string.Empty); var accNr = request.Dataset.Get(DicomTag.AccessionNumber, string.Empty); var studyUID = request.Dataset.Get(DicomTag.StudyInstanceUID, string.Empty); matchingFiles = finderService.FindStudyFiles(patname, patid, accNr, studyUID); } break; case DicomQueryRetrieveLevel.Series: { var patname = request.Dataset.Get(DicomTag.PatientName, string.Empty); var patid = request.Dataset.Get(DicomTag.PatientID, string.Empty); var accNr = request.Dataset.Get(DicomTag.AccessionNumber, string.Empty); var studyUID = request.Dataset.Get(DicomTag.StudyInstanceUID, string.Empty); var seriesUID = request.Dataset.Get(DicomTag.SeriesInstanceUID, string.Empty); var modality = request.Dataset.Get(DicomTag.Modality, string.Empty); matchingFiles = finderService.FindSeriesFiles(patname, patid, accNr, studyUID, seriesUID, modality); } break; case DicomQueryRetrieveLevel.Image: yield return(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess)); yield break; } // now read the required dicomtags from the matching files and return as results foreach (var matchingFile in matchingFiles) { var dicomFile = DicomFile.Open(matchingFile); var result = new DicomDataset(); foreach (var requestedTag in request.Dataset) { // most of the requested DICOM tags are stored in the DICOM files and therefore saved into a database. // you can fill the responses by selecting the values from the database. // also be aware that there are some requested DicomTags like "ModalitiesInStudy" or "NumberOfStudyRelatedInstances" // or "NumberOfPatientRelatedInstances" and so on which have to be calculated and cannot be read from a DICOM file. if (dicomFile.Dataset.Contains(requestedTag.Tag)) { dicomFile.Dataset.CopyTo(result, requestedTag.Tag); } // else if (requestedTag == DicomTag.NumberOfStudyRelatedInstances) // { // ... somehow calculate how many instances are stored within the study // result.Add(DicomTag.NumberOfStudyRelatedInstances, number); // } .... else { result.Add(requestedTag); } } yield return(new DicomCFindResponse(request, DicomStatus.Pending) { Dataset = result }); } yield return(new DicomCFindResponse(request, DicomStatus.Success)); }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { var queryLevel = request.Level; DataTable resultsDt = null; IDicomImageFinderService finderService = QRServer.CreateFinderService; // a QR SCP has to define in a DICOM Conformance Statement for which dicom tags it can query // depending on the level of the query. Below there are only very few parameters evaluated. switch (queryLevel) { case DicomQueryRetrieveLevel.Patient: { var patname = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty); var patid = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty); resultsDt = finderService.FindPatientFiles(patname, patid); } break; case DicomQueryRetrieveLevel.Study: { var patname = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty); var patid = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty); var accNr = request.Dataset.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty); var studyUID = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty); var StudyDate = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty); var StudyTime = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty); resultsDt = finderService.FindStudyFiles(patname, patid, accNr, studyUID, StudyDate, StudyTime); } break; case DicomQueryRetrieveLevel.Series: { var patname = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty); var patid = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty); var accNr = request.Dataset.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty); var studyUID = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty); var seriesUID = request.Dataset.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, string.Empty); var modality = request.Dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty); resultsDt = finderService.FindSeriesFiles(patname, patid, accNr, studyUID, seriesUID, modality); } break; case DicomQueryRetrieveLevel.Image: yield return(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess)); yield break; } bool _autoValidateDICOM = Config.GetConfigBoolValueByName(Config.Key_Enable_DICOM_AutoValidate); var columns = new List <string>(); foreach (DataColumn column in resultsDt.Columns) { columns.Add(column.ColumnName); } // now read the required dicomtags from the matching files and return as results foreach (DataRow row in resultsDt.Rows) { var rtnResult = new DicomDataset(); rtnResult.AutoValidate = _autoValidateDICOM; //Not sure if we need this so se up as config value //rtnResult.Clear(); //Could clear existing rather than create new. foreach (var requestedTag in request.Dataset) { // most of the requested DICOM tags are stored in the DICOM files and therefore saved into a database. // you can fill the responses by selecting the values from the database. // also be aware that there are some requested DicomTags like "ModalitiesInStudy" or "NumberOfStudyRelatedInstances" // or "NumberOfPatientRelatedInstances" and so on which have to be calculated and cannot be read from a DICOM file. string columnName = requestedTag.Tag.DictionaryEntry.Keyword.ToString(); if (columns.Contains(columnName)) { rtnResult.Add(requestedTag.Tag, row[columnName].ToString()); } else { rtnResult.Add(requestedTag); } } yield return(new DicomCFindResponse(request, DicomStatus.Pending) { Dataset = rtnResult }); } resultsDt.Dispose(); yield return(new DicomCFindResponse(request, DicomStatus.Success)); }