public void TestDifferentFramesOfReference()
        {
            var factory     = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var seriesCT    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCT", 1, "FrameA", Modality.CT);
            var seriesPET   = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPET", 2, "FrameB", Modality.PT);
            var displaySets = CreateDisplaySets(factory, Combine(seriesCT, seriesPET));

            try
            {
                Platform.CheckTrue(displaySets.Count > 0, "displaySets should not be empty.");

                foreach (var displaySet in displaySets)
                {
                    foreach (var image in displaySet.PresentationImages)
                    {
                        var annotationLayoutProvider = (IAnnotationLayoutProvider)image;
                        var annotationItem           = CollectionUtils.SelectFirst(annotationLayoutProvider.AnnotationLayout.AnnotationBoxes,
                                                                                   b => b.AnnotationItem is FusionImageAnnotationItemProvider.MismatchedFrameOfReferenceFusionImageAnnotationItem);
                        Assert.IsNotNull(annotationItem, "The MismatchedFrameOfReferenceFusionImageAnnotationItem is missing.");

                        var annotationText = annotationItem.GetAnnotationText(image);
                        Assert.AreEqual(SR.CodeMismatchedFrameOfReference, annotationText, "Fusion image where source data have different frames of reference should indicate FoR MISMATCH on text overlay.");
                    }
                }
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesCT, seriesPET);
            }
        }
Exemple #2
0
        public void TestPETFusionDisplaySetDescriptor()
        {
            StudyTree studyTree;
            var       factory      = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var       seriesCT     = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCT", 1, "FrameA", Modality.CT);
            var       seriesPET    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPET", 2, "FrameA", Modality.PT);
            var       seriesPETCor = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPETCor", 3, "FrameA", Modality.PT, true, false);
            var       displaySets  = CreateDisplaySets(factory, Combine(seriesCT, seriesPET, seriesPETCor), out studyTree);

            try
            {
                Assert.AreEqual(2, displaySets.Count, "There is only one valid combination of fuseable series.");

                // Verify identity of fused series
                var displaySet = CollectionUtils.SelectFirst(displaySets, d => ValidateFusionDisplaySetDescriptor(d.Descriptor, HashUid("SeriesCT"), HashUid("SeriesPET")));
                Assert.IsNotNull(displaySet, "Could not find the uncorrected fusion series.");
                Assert.IsFalse(((PETFusionDisplaySetDescriptor)displaySet.Descriptor).AttenuationCorrection, "Uncorrected fusion series is incorrectly flagged as corrected.");

                var displaySetCor = CollectionUtils.SelectFirst(displaySets, d => ValidateFusionDisplaySetDescriptor(d.Descriptor, HashUid("SeriesCT"), HashUid("SeriesPETCor")));
                Assert.IsNotNull(displaySetCor, "Could not find the corrected fusion series.");
                Assert.IsTrue(((PETFusionDisplaySetDescriptor)displaySetCor.Descriptor).AttenuationCorrection, "Corrected fusion series is incorrectly flagged as uncorrected.");

                var seriesCollection = CollectionUtils.FirstElement(CollectionUtils.FirstElement(studyTree.Patients).Studies).Series;
                var ctSeries         = CollectionUtils.SelectFirst(seriesCollection, s => s.SeriesDescription == "SeriesCT");
                var petSeries        = CollectionUtils.SelectFirst(seriesCollection, s => s.SeriesDescription == "SeriesPET");
                var petCorSeries     = CollectionUtils.SelectFirst(seriesCollection, s => s.SeriesDescription == "SeriesPETCor");

                var expectedDescriptor    = GetFusedDisplaySetName(ctSeries, petSeries, false);
                var expectedDescriptorCor = GetFusedDisplaySetName(ctSeries, petCorSeries, true);

                // Validate the names of the display sets (this is what is shown on the context menu)
                Assert.AreEqual(expectedDescriptor, displaySet.Name, "Name string differs for uncorrected display set.");
                Assert.AreEqual(expectedDescriptorCor, displaySetCor.Name, "Name string differs for corrected display set.");
            }
            catch (Exception)
            {
                if (displaySets.Count > 0)
                {
                    Console.WriteLine("Generated Display Sets ({0})", displaySets.Count);
                    foreach (var displaySet in displaySets)
                    {
                        Console.WriteLine(" > {0}", displaySet.Descriptor.Description);
                    }
                }
                throw;
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesCT, seriesPET, seriesPETCor);
            }
        }
Exemple #3
0
        public void TestNullCreation()
        {
            var factory     = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var displaySets = CreateDisplaySets(factory, Combine <ISopDataSource>());

            try
            {
                Assert.IsEmpty(displaySets, "Display set factories should not throw an exception if there is nothing to create.");
            }
            finally
            {
                Dispose(displaySets);
            }
        }
Exemple #4
0
        public void TestNoFusingInvalidModalities()
        {
            var factory     = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var seriesCT    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCT", 1, "FrameA", Modality.CT);
            var seriesMR    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesMR", 1, "FrameA", Modality.MR);
            var displaySets = CreateDisplaySets(factory, Combine(seriesCT, seriesMR));

            try
            {
                Assert.IsEmpty(displaySets, "Fusion display sets should not be created between invalid modalities (e.g. CT and MR).");
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesCT, seriesMR);
            }
        }
Exemple #5
0
        public void TestNoFusingWrongModality()
        {
            var factory     = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var seriesMR    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesMR", 1, "FrameA", Modality.MR);
            var seriesPET   = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPET", 2, "FrameA", Modality.PT);
            var displaySets = CreateDisplaySets(factory, Combine(seriesMR, seriesPET));

            try
            {
                Assert.IsEmpty(displaySets, "Fusion display sets should not be created for PET-MR using a PET-CT factory.");
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesMR, seriesPET);
            }
        }
Exemple #6
0
        public void TestPETAndCTFusion()
        {
            var factory     = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var seriesCT    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCT", 1, "FrameA", Modality.CT);
            var seriesPET   = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPET", 2, "FrameA", Modality.PT);
            var displaySets = CreateDisplaySets(factory, Combine(seriesCT, seriesPET));

            try
            {
                Assert.IsNotEmpty(displaySets, "Fusion display sets should be created for trivially simple PET-CT data.");
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesCT, seriesPET);
            }
        }
Exemple #7
0
        public void TestFusingDifferentFramesOfReference()
        {
            var factory     = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var seriesCT    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCT", 1, "FrameA", Modality.CT);
            var seriesPET   = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPET", 2, "FrameB", Modality.PT);
            var displaySets = CreateDisplaySets(factory, Combine(seriesCT, seriesPET));

            try
            {
                Assert.IsNotEmpty(displaySets, "Fusion display sets should still be created even with different frames of reference.");
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesCT, seriesPET);
            }
        }
Exemple #8
0
        public void TestNoFusingDifferentPatients()
        {
            var factory     = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var seriesCT    = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCT", 1, "FrameA", Modality.CT);
            var seriesPET   = CreateSopSeries(25, "PatientB", "StudyB", "SeriesPET", 2, "FrameA", Modality.PT);
            var displaySets = CreateDisplaySets(factory, Combine(seriesCT, seriesPET));

            try
            {
                Assert.IsEmpty(displaySets, "Fusion display sets should not be created for series from different patients.");
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesCT, seriesPET);
            }
        }
Exemple #9
0
        public void TestFusionMatchMaker()
        {
            var factory          = new PETFusionDisplaySetFactory(PETFusionType.CT);
            var seriesCT         = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCT", 1, "FrameA", Modality.CT);
            var seriesCTAx       = CreateSopSeries(25, "PatientA", "StudyA", "SeriesCTAx", 1, "FrameA", Modality.CT);
            var seriesPET        = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPET", 2, "FrameA", Modality.PT);
            var seriesPETCor     = CreateSopSeries(25, "PatientA", "StudyA", "SeriesPETCor", 3, "FrameA", Modality.PT, true, false);
            var unrelatedSeries  = CreateSopSeries(25, "PatientA", "StudyA", "UnrelatedSeries", 1, "FrameA", Modality.MR);
            var unrelatedStudy   = CreateSopSeries(25, "PatientA", "UnrelatedStudy", "UnrelatedSeries", 1, "FrameA", Modality.PT);
            var unrelatedPatient = CreateSopSeries(25, "UnrelatedPatient", "UnrelatedStudy", "UnrelatedSeries", 1, "FrameA", Modality.PT);
            var displaySets      = CreateDisplaySets(factory, Combine(seriesCT, seriesPET, seriesCTAx, seriesPETCor, unrelatedSeries, unrelatedStudy, unrelatedPatient));

            try
            {
                // There are 4 lights, obviously
                Assert.AreEqual(4, displaySets.Count, "There are four valid combinations of fuseable series.");

                // Verify identities of each fused series
                Assert.IsTrue(CollectionUtils.Contains(displaySets, d => ValidateFusionDisplaySetDescriptor(d.Descriptor, HashUid("SeriesCT"), HashUid("SeriesPET"))));
                Assert.IsTrue(CollectionUtils.Contains(displaySets, d => ValidateFusionDisplaySetDescriptor(d.Descriptor, HashUid("SeriesCT"), HashUid("SeriesPETCor"))));
                Assert.IsTrue(CollectionUtils.Contains(displaySets, d => ValidateFusionDisplaySetDescriptor(d.Descriptor, HashUid("SeriesCTAx"), HashUid("SeriesPET"))));
                Assert.IsTrue(CollectionUtils.Contains(displaySets, d => ValidateFusionDisplaySetDescriptor(d.Descriptor, HashUid("SeriesCTAx"), HashUid("SeriesPETCor"))));
            }
            catch (Exception)
            {
                if (displaySets.Count > 0)
                {
                    Console.WriteLine("Generated Display Sets ({0})", displaySets.Count);
                    foreach (var displaySet in displaySets)
                    {
                        Console.WriteLine(" > {0}", displaySet.Descriptor.Description);
                    }
                }
                throw;
            }
            finally
            {
                Dispose(displaySets);
                Dispose(seriesCT, seriesCTAx, seriesPET, seriesPETCor, unrelatedSeries, unrelatedStudy, unrelatedPatient);
            }
        }