Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        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);
                                }
                            }
        }
Beispiel #3
0
        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;
                                        }
                                    }
                                }
            }
        }