/// <summary> /// Anonymises every DICOM file in the specified folder path and saves locally to the /// correct dry run folder. /// </summary> /// <param name="anonymisationProtocolId">The anonymisation protocol unique identifier.</param> /// <param name="anonymisationProtocol">The anonymisation protocol.</param> /// <param name="uploadQueueItem">The upload queue item.</param> /// <param name="aETConfigType">Type of application entity title configuration.</param> /// <returns>The async task.</returns> private async Task AnonymiseAndSaveDicomFilesAsync( Guid anonymisationProtocolId, IEnumerable <DicomTagAnonymisation> anonymisationProtocol, UploadQueueItem uploadQueueItem, AETConfigType aETConfigType) { var dryRunFolder = DryRunFolders.GetFolder(aETConfigType); var resultFolderPath = Path.Combine(uploadQueueItem.RootDicomFolderPath, dryRunFolder, uploadQueueItem.AssociationGuid.ToString()); foreach (var filePath in EnumerateFiles(uploadQueueItem.AssociationFolderPath, uploadQueueItem)) { var dicomFile = TryOpenDicomFile(filePath, uploadQueueItem); // Not a DICOM file or is not a structure set file. if (dicomFile == null) { EnqueueMessage(new DeleteQueueItem(uploadQueueItem, filePath), _deleteQueuePath); continue; } var anonymizedDicomFile = _innerEyeSegmentationClient.AnonymizeDicomFile( dicomFile: dicomFile, anonymisationProtocolId: anonymisationProtocolId, anonymisationProtocol: anonymisationProtocol); await SaveDicomFilesAsync(resultFolderPath, anonymizedDicomFile).ConfigureAwait(false); // This item has been saved, we can now delete this file EnqueueMessage(new DeleteQueueItem(uploadQueueItem, filePath), _deleteQueuePath); } }
public async Task GenerateAndTestDeAnonymisedStructureSetFile() { var image = @"Images\LargeSeriesWithContour"; var tempFolder = CreateTemporaryDirectory(); var segmentationClient = GetMockInnerEyeSegmentationClient(); var configType = AETConfigType.ModelWithResultDryRun; var dryRunFolder = DryRunFolders.GetFolder(configType); var testAETConfigModel = GetTestAETConfigModel(); var newTestAETConfigModel = testAETConfigModel.With( aetConfig: new ClientAETConfig( new AETConfig( configType, testAETConfigModel.AETConfig.Config.ModelsConfig), testAETConfigModel.AETConfig.Destination, false)); var aetConfigProvider = new MockAETConfigProvider(newTestAETConfigModel); var receivePort = 160; using (var deleteService = CreateDeleteService()) using (var pushService = CreatePushService(aetConfigProvider.AETConfigModels)) using (var downloadService = CreateDownloadService(segmentationClient)) using (var uploadService = CreateUploadService(segmentationClient, aetConfigProvider.AETConfigModels)) using (var receiveService = CreateReceiveService(receivePort, tempFolder)) { deleteService.Start(); pushService.Start(); downloadService.Start(); uploadService.Start(); receiveService.Start(); DcmtkHelpers.SendFolderUsingDCMTK( image, receivePort, ScuProfile.LEExplicitCT, TestContext, applicationEntityTitle: newTestAETConfigModel.CallingAET, calledAETitle: newTestAETConfigModel.CalledAET); SpinWait.SpinUntil(() => tempFolder.GetDirectories().FirstOrDefault(x => x.FullName.Contains(dryRunFolder)) != null); var dryRunFolderDirectory = tempFolder.GetDirectories().First(x => x.FullName.Contains(dryRunFolder)).GetDirectories().First(); // Wait until we have all image files. SpinWait.SpinUntil(() => dryRunFolderDirectory.GetFiles().Length == 1); // Wait for all files to save. await Task.Delay(1000); var originalSlice = DicomFile.Open(new DirectoryInfo(image).GetFiles().First().FullName); Assert.IsNotNull(originalSlice); foreach (var file in dryRunFolderDirectory.GetFiles()) { var dicomFile = DicomFile.Open(file.FullName, FileReadOption.ReadAll); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.StudyDate), dicomFile.Dataset.GetSingleValue <string>(DicomTag.StudyDate)); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.AccessionNumber), dicomFile.Dataset.GetSingleValue <string>(DicomTag.AccessionNumber)); Assert.AreEqual("RTSTRUCT", dicomFile.Dataset.GetSingleValue <string>(DicomTag.Modality)); Assert.AreEqual("Microsoft Corporation", dicomFile.Dataset.GetSingleValue <string>(DicomTag.Manufacturer)); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.ReferringPhysicianName), dicomFile.Dataset.GetSingleValue <string>(DicomTag.ReferringPhysicianName)); Assert.AreEqual(originalSlice.Dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty), dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty)); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.PatientName), dicomFile.Dataset.GetSingleValue <string>(DicomTag.PatientName)); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.PatientID), dicomFile.Dataset.GetSingleValue <string>(DicomTag.PatientID)); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.PatientBirthDate), dicomFile.Dataset.GetSingleValue <string>(DicomTag.PatientBirthDate)); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.StudyInstanceUID), dicomFile.Dataset.GetSingleValue <string>(DicomTag.StudyInstanceUID)); Assert.AreEqual(originalSlice.Dataset.GetSingleValue <string>(DicomTag.StudyID), dicomFile.Dataset.GetSingleValue <string>(DicomTag.StudyID)); Assert.IsTrue(dicomFile.Dataset.GetString(DicomTag.SoftwareVersions).StartsWith("Microsoft InnerEye Gateway:")); Assert.IsTrue(dicomFile.Dataset.GetValue <string>(DicomTag.SoftwareVersions, 1).StartsWith("InnerEye AI Model:")); Assert.IsTrue(dicomFile.Dataset.GetValue <string>(DicomTag.SoftwareVersions, 2).StartsWith("InnerEye AI Model ID:")); Assert.IsTrue(dicomFile.Dataset.GetValue <string>(DicomTag.SoftwareVersions, 3).StartsWith("InnerEye Model Created:")); Assert.IsTrue(dicomFile.Dataset.GetValue <string>(DicomTag.SoftwareVersions, 4).StartsWith("InnerEye Version:")); Assert.AreEqual("1.2.840.10008.5.1.4.1.1.481.3", dicomFile.Dataset.GetSingleValue <string>(DicomTag.SOPClassUID)); Assert.AreEqual($"{DateTime.UtcNow.Year}{DateTime.UtcNow.Month.ToString("D2")}{DateTime.UtcNow.Day.ToString("D2")}", dicomFile.Dataset.GetSingleValue <string>(DicomTag.SeriesDate)); Assert.IsTrue(dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, string.Empty).StartsWith("1.2.826.0.1.3680043.2")); Assert.AreEqual("511091532", dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.SeriesNumber, string.Empty)); Assert.AreEqual("NOT FOR CLINICAL USE", dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.SeriesDescription, string.Empty)); Assert.IsTrue(dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.SOPInstanceUID, string.Empty).StartsWith("1.2.826.0.1.3680043.2")); Assert.AreEqual("ANONYM", dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.OperatorsName, string.Empty)); VerifyDicomFile(file.FullName); } } }
public async Task GenerateAndTestAnonymisedRTFile() { var tempFolder = CreateTemporaryDirectory(); { var configType = AETConfigType.ModelDryRun; var dryRunFolder = DryRunFolders.GetFolder(configType); var segmentationClient = GetMockInnerEyeSegmentationClient(); var testAETConfigModel = GetTestAETConfigModel(); var newTestAETConfigModel = testAETConfigModel.With( aetConfig: new ClientAETConfig( new AETConfig( configType, null), testAETConfigModel.AETConfig.Destination, false)); var aetConfigProvider = new MockAETConfigProvider(newTestAETConfigModel); var receivePort = 162; using (var deleteService = CreateDeleteService()) using (var pushService = CreatePushService(aetConfigProvider.AETConfigModels)) using (var downloadService = CreateDownloadService(segmentationClient)) using (var uploadService = CreateUploadService(segmentationClient, aetConfigProvider.AETConfigModels)) using (var receiveService = CreateReceiveService(receivePort, tempFolder)) { deleteService.Start(); pushService.Start(); downloadService.Start(); uploadService.Start(); receiveService.Start(); DcmtkHelpers.SendFolderUsingDCMTK( @"Images\1ValidSmall", receivePort, ScuProfile.LEExplicitRTCT, TestContext, applicationEntityTitle: newTestAETConfigModel.CallingAET, calledAETitle: newTestAETConfigModel.CalledAET); SpinWait.SpinUntil(() => tempFolder.GetDirectories().FirstOrDefault(x => x.FullName.Contains(dryRunFolder)) != null); var dryRunFolderDirectory = tempFolder.GetDirectories().First(x => x.FullName.Contains(dryRunFolder)).GetDirectories().First(); // Wait until we have all image files. SpinWait.SpinUntil(() => dryRunFolderDirectory.GetFiles().Length == 1); // Wait for all files to save. await Task.Delay(1000); var savedSampleFile = false; foreach (var file in dryRunFolderDirectory.GetFiles()) { var dicomFile = DicomFile.Open(file.FullName); AssertDicomFileIsAnonymised(dicomFile); if (!savedSampleFile) { WriteDicomFileForBuildPackage("AnonymisedRT.dcm", dicomFile); savedSampleFile = true; } } } } }