protected override void OnReceiveCMoveRequest(byte presentationID, ushort messageID, string destinationAE, DcmPriority priority, DcmDataset query) { Console.WriteLine(String.Format("{0} Receive C-Move from {1} (marked as anonymous:{2})", DateTime.Now, this.Associate.CallingAE, _flagAnonymousAccess)); Debug.WriteLine(query.Dump()); AEInfo recipientInfo = FindAE(destinationAE); if (recipientInfo == null) { SendCMoveResponse(presentationID, messageID, DcmStatus.QueryRetrieveMoveDestinationUnknown, 0, 0, 0, 0); Console.Write("Moving to:" + recipientInfo.Name + "> "); return; } Console.Write("Moving to:" + recipientInfo.Name + "> "); ushort imagesProcessed = 0; ushort errorCount = 0; ushort successCount = 0; try { using (var database = new MedicalISDataContext()) { var storeClient = new CStoreClient(); storeClient.CallingAE = "CURAPACS"; storeClient.CalledAE = destinationAE; storeClient.PreferredTransferSyntax = recipientInfo.TransferSyntax; storeClient.PreloadCount = 10; storeClient.LogID = "store"; if (Settings.Default.DebugMove) Dicom.Debug.InitializeConsoleDebugLogger(); if (_flagAnonymousAccess) storeClient.DisableFileStreaming = true; var files = GetFilePaths(database, query); if (Settings.Default.UseFixedFolder) { files = Directory.GetFiles(Settings.Default.FixedFolderPath); } long totalSize = 0; foreach (var f in files) { totalSize += new FileInfo(f).Length; storeClient.AddFile(f); } int totalImageCount = (ushort) files.Count(); Console.Write("#{0} files > ", totalImageCount); Stopwatch timer = Stopwatch.StartNew(); storeClient.OnCStoreRequestBegin = (c, i) => { if (_flagAnonymousAccess) { var dataset = i.Dataset; AnonymizeDatasetBasedOnStudyInfo(dataset); } }; storeClient.OnCStoreRequestComplete = (c, i) => { timer.Stop(); if (i.HasError) { Console.WriteLine("Error:{0}", i.Error); } else { // Console.WriteLine("Done"); } totalImageCount -= storeClient.PendingCount; }; storeClient.OnCStoreResponseReceived = (c, i) => { if (i.Status == DcmStatus.Success) { successCount++; Console.Write("."); } else { errorCount++; Console.Write("x"); } }; storeClient.OnCStoreRequestProgress = (c, i, p) => { //Console.WriteLine("{0}@{1}", p.BytesTransfered, c.Socket.LocalStats.ToString()); }; storeClient.OnCStoreRequestFailed = (c, i) => { Console.WriteLine(""); Console.WriteLine("Failed. " + i.Error.ToString()); }; storeClient.Connect(recipientInfo.Ip, recipientInfo.Port, DcmSocketType.TCP); if (storeClient.Wait()) { } timer.Stop(); double bytesPerSeconds = (double) totalSize/timer.Elapsed.TotalSeconds; double MiBPerSecond = bytesPerSeconds/(1024.0*1024.0); Console.WriteLine(""); Console.WriteLine("Done. {0} MiB/s (ImagesProcessed={1})", MiBPerSecond, imagesProcessed); SendCMoveResponse(presentationID, messageID, DcmStatus.Success, 0, imagesProcessed, 0, 0); storeClient.Close(); } } catch (Exception ex) { Console.WriteLine(""); Console.WriteLine("Failed. => " + ex.ToString()); SendCMoveResponse(presentationID, messageID, DcmStatus.ProcessingFailure, 0, imagesProcessed, 0, 0); } }
protected override void OnReceiveCFindRequest(byte presentationID, ushort messageID, DcmPriority priority, Dicom.Data.DcmDataset query) { TryInterpretStringsInDatasetUsingCorrectEncoding(query); Trace.WriteLine(String.Format("{0} Receive C-Find from {1} (marked as anonymous:{2})", DateTime.Now, this.Associate.CallingAE, _flagAnonymousAccess)); Trace.WriteLine(query.Dump()); using( var database = new MedicalISDataContext() ) { var queryLevel = query.GetString(DicomTags.QueryRetrieveLevel, null); if (queryLevel == "PATIENT") { IQueryable<Patient> patients = PatientQueries.GetMatchingPatients(database, query, _flagAnonymousAccess); patients = patients.Take(Settings.Default.MaxNumberOfStudiesReturned); foreach (var currentPatient in patients) { foreach (var currentStudy in currentPatient.Studies) { var p = currentPatient; var response = new DcmDataset { SpecificCharacterSetEncoding = query.SpecificCharacterSetEncoding }; // Map saved study tags to output response.AddElementWithValue(DicomTags.RetrieveAETitle, "CURAPACS"); response.AddElementWithValue(DicomTags.QueryRetrieveLevel, "PATIENT"); response.AddElementWithValue(DicomTags.PatientID, p.ExternalPatientID); response.AddElementWithValue(DicomTags.PatientsName, p.LastName + "^" + p.FirstName); response.AddElementWithValue(DicomTags.PatientsBirthDate, p.BirthDateTime.Value); response.AddElementWithValue(DicomTags.StudyInstanceUID, currentStudy.StudyInstanceUid); response.AddElementWithValue(DicomTags.AccessionNumber, currentStudy.AccessionNumber); response.AddElementWithValue(DicomTags.StudyDescription, currentStudy.Description); response.AddElementWithValue(DicomTags.ModalitiesInStudy, currentStudy.ModalityAggregation); if (currentStudy.PerformedDateTime.HasValue) { response.AddElementWithValue(DicomTags.StudyDate, currentStudy.PerformedDateTime.Value); response.AddElementWithValue(DicomTags.StudyTime, currentStudy.PerformedDateTime.Value); } response.AddElementWithValue(DicomTags.NumberOfStudyRelatedSeries, currentStudy.Series.Count); response.AddElementWithValue(DicomTags.NumberOfStudyRelatedInstances, (from s in currentStudy.Series select s.Images.Count).Sum()); if (_flagAnonymousAccess) AnonymizeDatasetBasedOnStudyInfo(response); SendCFindResponse(presentationID, messageID, response, DcmStatus.Pending); } } } else if (queryLevel == "STUDY") { IQueryable<Study> studies = StudyQueries.GetMatchingStudies(database, query, _flagAnonymousAccess); studies = studies.Take(Settings.Default.MaxNumberOfStudiesReturned); foreach (var currentStudy in studies) { var p = currentStudy.Patient; var response = new DcmDataset { SpecificCharacterSetEncoding = query.SpecificCharacterSetEncoding }; // Map saved study tags to output response.AddElementWithValue(DicomTags.RetrieveAETitle, "CURAPACS"); response.AddElementWithValue(DicomTags.QueryRetrieveLevel, "STUDY"); response.AddElementWithValue(DicomTags.PatientID, p.ExternalPatientID); response.AddElementWithValue(DicomTags.PatientsName, p.LastName + "^" + p.FirstName); response.AddElementWithValue(DicomTags.PatientsBirthDate, p.BirthDateTime.Value); response.AddElementWithValue(DicomTags.StudyInstanceUID, currentStudy.StudyInstanceUid); response.AddElementWithValue(DicomTags.AccessionNumber, currentStudy.AccessionNumber); response.AddElementWithValue(DicomTags.StudyDescription, currentStudy.Description); response.AddElementWithValue(DicomTags.ModalitiesInStudy, currentStudy.ModalityAggregation); if (currentStudy.PerformedDateTime.HasValue) { response.AddElementWithValue(DicomTags.StudyDate, currentStudy.PerformedDateTime.Value); response.AddElementWithValue(DicomTags.StudyTime, currentStudy.PerformedDateTime.Value); } response.AddElementWithValue(DicomTags.NumberOfStudyRelatedSeries, currentStudy.Series.Count); response.AddElementWithValue(DicomTags.NumberOfStudyRelatedInstances, (from s in currentStudy.Series select s.Images.Count).Sum()); if (! String.IsNullOrEmpty(query.GetString(DicomTags.PatientsSex, null))) { response.AddElementWithValue(DicomTags.PatientsSex, Settings.Default.AlwaysRespondWithGender); } if(_flagAnonymousAccess) AnonymizeDatasetBasedOnStudyInfo(response); Trace.WriteLine("response (STUDY): > "); Trace.WriteLine(response.Dump()); SendCFindResponse(presentationID, messageID, response, DcmStatus.Pending); } } else if (queryLevel == "SERIES") { IQueryable<Series> series = SeriesQueries.GetMatchingSeries(database, query); foreach (var currentSeries in series) { var response = new DcmDataset { SpecificCharacterSetEncoding = query.SpecificCharacterSetEncoding }; if (currentSeries.PerformedDateTime.HasValue) { response.AddElementWithValue(DicomTags.SeriesDate, currentSeries.PerformedDateTime.Value); response.AddElementWithValue(DicomTags.SeriesTime, currentSeries.PerformedDateTime.Value); } response.AddElementWithValue(DicomTags.QueryRetrieveLevel, "SERIES"); response.AddElementWithValue(DicomTags.StudyInstanceUID, currentSeries.StudyInstanceUid); response.AddElementWithValue(DicomTags.SeriesInstanceUID, currentSeries.SeriesInstanceUid); response.AddElementWithValue(DicomTags.SeriesNumber, currentSeries.SeriesNumber); response.AddElementWithValue(DicomTags.SeriesDescription, currentSeries.Description); response.AddElementWithValue(DicomTags.Modality, currentSeries.PerformedModalityType); response.AddElementWithValue(DicomTags.NumberOfSeriesRelatedInstances, currentSeries.Images.Count()); response.AddElementWithValue(DicomTags.ReferringPhysiciansName, ""); response.AddElementWithValue(DicomTags.StudyCommentsRETIRED, ""); SendCFindResponse(presentationID, messageID, response, DcmStatus.Pending); } } SendCFindResponse(presentationID, messageID, DcmStatus.Success); } }
public static IQueryable<Series> GetMatchingSeries(MedicalISDataContext database, DcmDataset query) { var series = from s in database.Series select s; series = series.Where( FilterByStudyUid(query) ); series = series.Where( FilterBySeriesUid(query) ); series = series.Where( FilterBySeriesDate(query) ); series.OrderBy(s => s.PerformedDateTime); return series; }
public static IQueryable<Patient> GetMatchingPatients(MedicalISDataContext database, DcmDataset query, bool anonymousOnly = false) { var patients = from p in database.Patients select p; if( anonymousOnly == false ) patients = patients.Where(FilterByPatientsName(query)); patients = patients.Where(FilterByPatientsId(query)); patients = patients.Where(FilterByPatientsBirthDate(query)); patients = patients.Where(FilterByStudyPerformedDate(query)); patients = patients.Where(FilterByStudyModalityDate(query)); patients = patients.OrderByDescending(p => p.Studies.Max(s => s.PerformedDateTime)); return patients; }
public static IQueryable<Study> GetMatchingStudies(MedicalISDataContext database, DcmDataset query, bool isAnonymousQuery ) { var studies = from s in database.Studies select s; if (!isAnonymousQuery) studies = studies.Where( FilterByPatientsName(query) ); studies = studies.Where( FilterByPatientsId(query) ); studies = studies.Where( FilterByPatientsBirthDate(query) ); studies = studies.Where( FilterByStudyUid(query) ); studies = studies.Where( FilterByStudyDate(query) ); studies = studies.Where( FilterByAccessionNumber(query) ); studies = studies.Where( FilterByModality(query) ); studies.OrderBy(s => s.PerformedDateTime); return studies; }
private static IEnumerable<string> GetFilePaths(MedicalISDataContext database, DcmDataset query) { if ( ! String.IsNullOrWhiteSpace(query.GetString(DicomTags.SeriesInstanceUID, "")) ) { string seriesInstanceUid = query.GetString(DicomTags.SeriesInstanceUID,""); var imagePaths = from i in database.Images where i.SeriesInstanceUid == seriesInstanceUid select Path.Combine(Settings.Default.RootPath, i.ArchivedStorageLocation); return imagePaths; } else if ( !String.IsNullOrWhiteSpace(query.GetString(DicomTags.StudyInstanceUID, ""))) { string studyInstanceUid = query.GetElement(DicomTags.StudyInstanceUID).GetValueString(); var imagePaths = from i in database.Images where i.Series.Study.StudyInstanceUid == studyInstanceUid select Path.Combine(Settings.Default.RootPath, i.ArchivedStorageLocation); return imagePaths; } else { return new string[]{}; } }