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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }