Example #1
0
        public void AddDuplicateImage()
        {
            IImageViewer viewer    = new ImageViewerComponent();
            StudyTree    studyTree = viewer.StudyTree;

            string studyUid1  = DicomUid.GenerateUid().UID;
            string seriesUid1 = DicomUid.GenerateUid().UID;
            string imageUid1  = DicomUid.GenerateUid().UID;

            ImageSop image1 = CreateImageSop("patient1", studyUid1, seriesUid1, imageUid1);
            ImageSop image2 = CreateImageSop("patient1", studyUid1, seriesUid1, imageUid1);

            //The sop has already silently disposed the 2nd data source.
            Assert.IsTrue(Object.ReferenceEquals(image1.DataSource, image2.DataSource));
            studyTree.AddSop(image1);
            studyTree.AddSop(image2);

            Assert.IsTrue(studyTree.Patients["patient1"].Studies[studyUid1].Series[seriesUid1].Sops.Count == 1);

            TestDataSource dataSource = (TestDataSource)image1.DataSource;

            viewer.Dispose();

            Assert.IsTrue(dataSource.IsDisposed);
            Assert.IsTrue(SopDataCache.ItemCount == 0, "The Sop data cache is NOT empty.");
        }
        public void TestSeriesSplittingMREcho()
        {
            const int             numberOfSeries     = 5;
            const int             instancesPerSeries = 10;
            List <TestDataSource> dataSources        = CreateMRStudyDataSources(numberOfSeries, instancesPerSeries, "1.2.3");
            StudyTree             studyTree          = CreateStudyTree(ConvertToSops(dataSources));

            MREchoDisplaySetFactory factory = new MREchoDisplaySetFactory();

            factory.SetStudyTree(studyTree);
            List <IDisplaySet> allDisplaySets = new List <IDisplaySet>();

            try
            {
                Patient patient = studyTree.Patients[0];
                Study   study   = patient.Studies[0];

                Assert.AreEqual(numberOfSeries, study.Series.Count, "There should be exactly {0} series", numberOfSeries);

                Series series2 = study.Series[1];
                Series series3 = study.Series[2];

                MakeEchoSeries(series2);
                MakeEchoSeries(series3);

                foreach (Series series in study.Series)
                {
                    Assert.AreEqual(instancesPerSeries, series.Sops.Count, "There should be exactly {0} sops", instancesPerSeries);
                    List <IDisplaySet> displaySets = factory.CreateDisplaySets(series);
                    allDisplaySets.AddRange(displaySets);

                    if (series == series2 || series == series3)
                    {
                        IDisplaySet displaySet = displaySets[0];
                        Assert.AreEqual(2, displaySets.Count, "There should be exactly 2 display sets");
                        Assert.AreEqual(series.Sops.Count / 2, displaySet.PresentationImages.Count, "#presentation images should be #Sops/2");
                        Assert.AreNotEqual(series.SeriesInstanceUid, displaySet.Descriptor.Uid, "Series UID and Display Set UID don't match");
                        Assert.AreEqual(typeof(MREchoDisplaySetDescriptor), displaySet.Descriptor.GetType(), "Wrong display set descriptor type");
                        Assert.IsTrue(displaySet.Name.Contains("Echo"), "Display Set name not correct");

                        ValidateEchoDisplaySet(displaySets[0], 1);
                        ValidateEchoDisplaySet(displaySets[1], 2);
                    }
                    else
                    {
                        Assert.AreEqual(0, displaySets.Count, "There should be no display sets");
                    }
                }
            }
            finally
            {
                foreach (IDisplaySet displaySet in allDisplaySets)
                {
                    displaySet.Dispose();
                }

                studyTree.Dispose();
            }
        }
Example #3
0
 public void ReAllocateStudyTree()
 {
     if (_studyTree != null)
     {
         _studyTree.Dispose();
         _studyTree = null;
         _studyTree = new StudyTree();
     }
 }
        public StudyTree CreateStudyTree(List <Sop> sops)
        {
            StudyTree studyTree = new StudyTree();

            foreach (Sop sop in sops)
            {
                studyTree.AddSop(sop);
            }
            return(studyTree);
        }
Example #5
0
        private List <Study> GetStudies(IEnumerable <IImageSet> imageSets, StudyTree studyTree)
        {
            List <Study> studies = new List <Study>();

            foreach (IImageSet imageSet in imageSets)
            {
                studies.Add(studyTree.GetStudy(imageSet.Uid));
            }

            return(studies);
        }
Example #6
0
        public Study AddStudy(StudyTree studyTree)
        {
            var sops = BuildSops();

            foreach (var sop in sops)
            {
                studyTree.AddSop(sop);
            }

            return(studyTree.GetStudy(sops[0].StudyInstanceUid));
        }
        private static string GetPrimaryStudyInstanceUid(StudyTree studyTree)
        {
            foreach (Patient patient in studyTree.Patients)
            {
                foreach (Study study in patient.Studies)
                {
                    return(study.StudyInstanceUid);
                }
            }

            return(null);
        }
Example #8
0
 private static IDicomServiceNode FindStudySourceServer(StudyTree studyTree, string studyInstanceUid)
 {
     try
     {
         return(studyTree.GetStudy(studyInstanceUid).Series.SelectMany(s => s.Sops).Select(s => s.DataSource.Server).FirstOrDefault(source => source != null));
     }
     catch (Exception ex)
     {
         Platform.Log(LogLevel.Warn, ex, "Failed to identify source server for study {0}", studyInstanceUid);
         return(null);
     }
 }
Example #9
0
        public override void Prepare()
        {
            if (_displayData != null)
            {
                return;
            }
            //Console.Write("Prepare for a cell\t");
            var sopInstanceUid = _imageBase.SOPInstanceUID;

            if (StudyTree.GetSop(sopInstanceUid) == null)
            {
                DataLoader.LoadSopByUid(sopInstanceUid);
            }
        }
        public override void SetImageViewer(IImageViewer imageViewer)
        {
            base.SetImageViewer(imageViewer);

            StudyTree studyTree = null;

            if (imageViewer != null)
            {
                studyTree = imageViewer.StudyTree;
            }

            _reconciliationStrategy.SetStudyTree(studyTree);

            _imageSetFiller = new ImageSetFiller(studyTree, DisplaySetCreationOptions);
        }
        public KeyImageClipboard(StudyTree studyTree)
        {
            _studyTree = studyTree;

            _currentContext    = new KeyImageInformation();
            _availableContexts = new List <KeyImageInformation> {
                _currentContext
            };
            _availableContexts.AddRange(_studyTree.Studies
                                        .SelectMany(s => s.Series)
                                        .SelectMany(s => s.Sops)
                                        .Where(s => s.SopClassUid == SopClass.KeyObjectSelectionDocumentStorageUid)
                                        .Select(s => new KeyImageInformation(studyTree, s))
                                        .OrderByDescending(s => s.ContentDateTime)
                                        .ThenBy(s => s.SeriesNumber));
        }
Example #12
0
        /// <summary>
        /// Implementation of the <see cref="IDisposable"/> pattern
        /// </summary>
        /// <param name="disposing">True if this object is being disposed, false if it is being finalized</param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                ParentDesktopObject = null;

                if (_toolSet != null)
                {
                    _toolSet.Dispose();
                    _toolSet = null;
                }

                StopLoadingPriors();
                StopPrefetching();

                if (_physicalWorkspace != null)
                {
                    _physicalWorkspace.Dispose();
                    _physicalWorkspace = null;
                }

                if (_logicalWorkspace != null)
                {
                    _logicalWorkspace.Dispose();
                    _logicalWorkspace = null;
                }

                if (_studyTree != null)
                {
                    _studyTree.Dispose();
                    _studyTree = null;
                }

                if (_layoutManager != null)
                {
                    _layoutManager.Dispose();
                    _layoutManager = null;
                }

                if (ExtensionData != null)
                {
                    ExtensionData.Dispose();
                    ExtensionData = null;
                }
            }
        }
        public void TestNoSeriesSplitting()
        {
            const int             numberOfSeries     = 5;
            const int             instancesPerSeries = 10;
            List <TestDataSource> dataSources        = CreateMRStudyDataSources(numberOfSeries, instancesPerSeries, "1.2.3");
            StudyTree             studyTree          = CreateStudyTree(ConvertToSops(dataSources));

            BasicDisplaySetFactory factory = new BasicDisplaySetFactory();

            factory.SetStudyTree(studyTree);

            List <IDisplaySet> allDisplaySets = new List <IDisplaySet>();

            try
            {
                Patient patient = studyTree.Patients[0];
                Study   study   = patient.Studies[0];

                Assert.AreEqual(numberOfSeries, study.Series.Count, "There should be exactly {0} series", numberOfSeries);

                foreach (Series series in study.Series)
                {
                    Assert.AreEqual(instancesPerSeries, series.Sops.Count, "There should be exactly {0} sops", instancesPerSeries);

                    List <IDisplaySet> displaySets = factory.CreateDisplaySets(series);
                    allDisplaySets.AddRange(displaySets);

                    Assert.AreEqual(1, displaySets.Count, "There should be exactly {0} display sets", 1);

                    IDisplaySet displaySet = displaySets[0];

                    Assert.AreEqual(series.Sops.Count, displaySet.PresentationImages.Count, "#Sops should match #presentation images");
                    Assert.AreEqual(series.SeriesInstanceUid, displaySet.Descriptor.Uid, "Series UID and Display Set UID don't match");
                    Assert.AreEqual(typeof(SeriesDisplaySetDescriptor), displaySet.Descriptor.GetType(), "Wrong display set descriptor type");
                }
            }
            finally
            {
                foreach (IDisplaySet displaySet in allDisplaySets)
                {
                    displaySet.Dispose();
                }

                studyTree.Dispose();
            }
        }
        public KeyImageInformation(StudyTree studyTree, Sop keyObjectSelectionDocument)
            : base(CreateClipboardItems(studyTree, keyObjectSelectionDocument))
        {
            var koDeserializer = new KeyImageDeserializer(keyObjectSelectionDocument);
            var description    = koDeserializer.DeserializeDescriptions().OfType <KeyObjectDescriptionContentItem>().FirstOrDefault();
            var author         = koDeserializer.DeserializeObserverContexts().OfType <PersonObserverContextContentItem>().FirstOrDefault();

            _parentStudyInstanceUid = keyObjectSelectionDocument.StudyInstanceUid;
            _documentInstanceUid    = keyObjectSelectionDocument.SopInstanceUid;
            _author            = author != null ? author.PersonObserverName : string.Empty;
            _description       = description != null ? description.Description : string.Empty;
            _documentTitle     = koDeserializer.DocumentTitle ?? KeyObjectSelectionDocumentTitleContextGroup.OfInterest;
            _seriesDescription = keyObjectSelectionDocument.SeriesDescription;
            _seriesNumber      = keyObjectSelectionDocument.SeriesNumber;
            _contentDateTime   = DateTimeParser.ParseDateAndTime(null, keyObjectSelectionDocument.ContentDate, keyObjectSelectionDocument.ContentTime);
            _name = string.Format(SR.FormatOriginalKeyImageSelection, keyObjectSelectionDocument.SeriesNumber, keyObjectSelectionDocument.SeriesDescription, Format.DateTime(_contentDateTime));
        }
Example #15
0
        protected override DisplayData CreateDisplayData()
        {
            var sopInstanceUid = _imageBase.SOPInstanceUID;

            if (DisplayDataTable.ContainsKey(sopInstanceUid))
            {
                return(DisplayDataTable[sopInstanceUid]);
            }

            var sop = StudyTree.GetSop(sopInstanceUid);

            var displayData = sop == null
                ? DataAccessor.CreateImageDataBySOPInstanceUID(sopInstanceUid, true)
                : CreateDisplayDataBy(sop);


            DisplayDataTable.Add(sopInstanceUid, displayData);
            return(displayData);
        }
Example #16
0
        public ImageModel()
        {
            try
            {
                Logger.LogFuncUp();

                //DataManagement for separation UI with data
                var studyTree = new StudyTree();
                _dataLoader = DataLoaderFactory.Instance().CreateLoader(studyTree, DBWrapperHelper.DBWrapper);
                _dataLoader.SopLoadedHandler += OnImageDataLoaded;

                Logger.LogFuncDown();
            }
            catch (Exception ex)
            {
                Logger.LogFuncException(ex.Message + ex.StackTrace);
                throw;
            }
        }
Example #17
0
            public ImageSetFiller(StudyTree studyTree, IDisplaySetCreationOptions displaySetCreationOptions)
            {
                _displaySetCreationOptions = displaySetCreationOptions;
                foreach (IModalityDisplaySetCreationOptions option in displaySetCreationOptions)
                {
                    _modalityDisplaySetFactories[option.Modality] = new DisplaySetFactory(option);
                }

                _modalityDisplaySetFactory = new ModalityDisplaySetFactory();
                _defaultDisplaySetFactory  = new BasicDisplaySetFactory();

                foreach (IDisplaySetFactory displaySetFactory in _modalityDisplaySetFactories.Values)
                {
                    displaySetFactory.SetStudyTree(studyTree);
                }

                _modalityDisplaySetFactory.SetStudyTree(studyTree);
                _defaultDisplaySetFactory.SetStudyTree(studyTree);
            }
Example #18
0
        private static List <IDisplaySet> CreateDisplaySets(IDisplaySetFactory displaySetFactory, IEnumerable <ISopDataSource> sopDataSources, out StudyTree studyTree)
        {
            studyTree = new StudyTree();
            foreach (var sopDataSource in sopDataSources)
            {
                studyTree.AddSop(new ImageSop(sopDataSource));
            }
            displaySetFactory.SetStudyTree(studyTree);

            var displaySets = new List <IDisplaySet>();

            foreach (var patient in studyTree.Patients)
            {
                foreach (var study in patient.Studies)
                {
                    displaySets.AddRange(displaySetFactory.CreateDisplaySets(study));
                }
            }
            return(displaySets);
        }
Example #19
0
        public void TestCT(int expectedDisplaySetCount)
        {
            var studyTree = new StudyTree();
            var builder   = StudyBuilderFactory.CreateCTChestBuilder("Patient1", "Test^Patient", "Chest", null, "Scout", "Axial", 22);

            Assert.AreEqual(2, builder.Series.Count);
            foreach (var series in builder.Series)
            {
                Assert.IsTrue(series.Images.Count > 1);
            }

            builder.AddStudy(studyTree);

            var options = new DisplaySetCreationOptions();
            var o       = (StoredDisplaySetCreationSetting)options["CT"];

            Assert.IsTrue(o.ShowOriginalSeries);

            Test(studyTree, builder, options, false, expectedDisplaySetCount);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_toolSet != null)
                {
                    _toolSet.Dispose();
                    _toolSet = null;
                }

                if (_studyTree != null)
                {
                    _studyTree.Dispose();
                    _studyTree = null;
                }

                if (DicomPrintComponent != null)
                {
                    DicomPrintComponent.Dispose();
                }
                referenceLines.Clear();
                referenceLines = null;

                if (this.DisplaySet != null && this.DisplaySet.PresentationImages != null)
                {
                    foreach (var selectPresentationImage in this.DisplaySet.PresentationImages)
                    {
                        selectPresentationImage.Dispose();
                    }
                    DisplaySet.PresentationImages.Clear();
                }

                if (_rootImageBox != null)
                {
                    _rootImageBox.Dispose();
                }

                PrintPresentationImagesHost.ImageViewerComponent = null;
            }
        }
Example #21
0
        public void TestMR(bool createEchos, bool split, bool showOriginal, bool showOriginalSeries, int expectedDisplaySetCount)
        {
            Trace.WriteLine(String.Format("MR Echo: split={0}, showOriginal={1}, showOriginalSeries={2}", split, showOriginal, showOriginalSeries));

            var studyTree = new StudyTree();
            var builder   = StudyBuilderFactory.CreateMRBuilder("Patient1", "Test^Patient", "MR Echo", null, "Series1", "Series2", 1, createEchos, false);

            builder.AddStudy(studyTree);

            var options = new DisplaySetCreationOptions();
            var o       = (StoredDisplaySetCreationSetting)options["MR"];

            Assert.IsTrue(o.SplitMultiEchoSeries);
            Assert.IsFalse(o.ShowOriginalMultiEchoSeries);
            Assert.IsTrue(o.ShowOriginalSeries);

            o.SplitMultiEchoSeries        = split;
            o.ShowOriginalMultiEchoSeries = showOriginal;
            o.ShowOriginalSeries          = showOriginalSeries;

            Test(studyTree, builder, options, false, expectedDisplaySetCount);
        }
Example #22
0
        public void AddDuplicateImage()
        {
            IImageViewer viewer    = new ImageViewerComponent();
            StudyTree    studyTree = viewer.StudyTree;

            string studyUid1  = DicomUid.GenerateUid().UID;
            string seriesUid1 = DicomUid.GenerateUid().UID;
            string imageUid1  = DicomUid.GenerateUid().UID;

            ImageSop image1 = CreateImageSop("patient1", studyUid1, seriesUid1, imageUid1);
            ImageSop image2 = CreateImageSop("patient1", studyUid1, seriesUid1, imageUid1);

            Assert.IsTrue(studyTree.AddSop(image1));
            Assert.IsFalse(studyTree.AddSop(image2));

            Assert.IsTrue(studyTree.Patients["patient1"].Studies[studyUid1].Series[seriesUid1].Sops.Count == 1);

            TestDataSource dataSource = (TestDataSource)image1.DataSource;

            viewer.Dispose();

            Assert.IsTrue(dataSource.IsDisposed);
        }
Example #23
0
            public override void SetStudyTree(StudyTree studyTree)
            {
                base.SetStudyTree(studyTree);

                _basicFactory.SetStudyTree(studyTree);

                if (_echoFactory != null)
                {
                    _echoFactory.SetStudyTree(studyTree);
                }

                if (_mixedMultiFrameFactory != null)
                {
                    _mixedMultiFrameFactory.SetStudyTree(studyTree);
                }

                _placeholderDisplaySetFactory.SetStudyTree(studyTree);

                foreach (var factory in _externalFactories)
                {
                    factory.SetStudyTree(studyTree);
                }
            }
 /// <summary>
 /// Sets the <see cref="StudyManagement.StudyTree"/> where the factory can search for referenced <see cref="Sop"/>s.
 /// </summary>
 public virtual void SetStudyTree(StudyTree studyTree)
 {
     _studyTree = studyTree;
     PresentationImageFactory.SetStudyTree(_studyTree);
 }
Example #25
0
        private void TestSortingImageSetsByStudyDate(bool reverse, bool useSops, bool testLayoutManagerSort)
        {
            ImageSetCollection orderedCollection    = new ImageSetCollection();
            ImageSetCollection nonOrderedCollection = new ImageSetCollection();
            StudyTree          studyTree            = new StudyTree();

            for (int i = 0; i <= 20; ++i)
            {
                string   id       = i.ToString();
                ImageSet imageSet = new ImageSet();
                imageSet.Name = id;

                string studyDate;
                if (i == 0)
                {
                    studyDate = "";
                }
                else
                {
                    studyDate = String.Format("200801{0}", i.ToString("00"));
                }

                if (useSops)
                {
                    DisplaySet displaySet = new DisplaySet(id, id);
                    ImageSop   sop        = NewImageSop(id, id, i);
                    imageSet.Uid = sop.StudyInstanceUid;
                    studyTree.AddSop(sop);

                    IPresentationImage image       = new DicomGrayscalePresentationImage(sop.Frames[1]);
                    IImageSopProvider  sopProvider = (IImageSopProvider)image;

                    DicomMessageSopDataSource dataSource = ((DicomMessageSopDataSource)sopProvider.ImageSop.DataSource);
                    dataSource.SourceMessage.DataSet[DicomTags.StudyDate].SetString(0, studyDate);
                    imageSet.DisplaySets.Add(displaySet);
                    displaySet.PresentationImages.Add(image);
                }
                else
                {
                    StudyRootStudyIdentifier identifier = new StudyRootStudyIdentifier();
                    identifier.StudyDate        = studyDate;
                    identifier.StudyInstanceUid = id;
                    ImageSetDescriptor descriptor = new DicomImageSetDescriptor(identifier);
                    imageSet.Descriptor = descriptor;
                }

                orderedCollection.Add(imageSet);
            }

            if (reverse)
            {
                List <IImageSet> temp = new List <IImageSet>();
                temp.AddRange(orderedCollection);
                temp.Reverse();
                orderedCollection.Clear();
                foreach (IImageSet imageSet in temp)
                {
                    orderedCollection.Add(imageSet);
                }
            }

            Randomize(orderedCollection, nonOrderedCollection);

            Debug.WriteLine("Before Sort\n------------------------\n");
            CollectionUtils.ForEach(nonOrderedCollection,
                                    imageSet => Debug.WriteLine(String.Format("name: {0}, date: {1}", imageSet.Name,
                                                                              ((IImageSopProvider)(imageSet.DisplaySets[0].PresentationImages[0])).
                                                                              ImageSop.StudyDate)));

            if (testLayoutManagerSort)
            {
                LayoutManager.SortImageSets(nonOrderedCollection, GetStudies(orderedCollection, studyTree));
            }
            else
            {
                nonOrderedCollection.Sort(new StudyDateComparer(reverse));
            }

            Debug.WriteLine("\nAfter Sort\n------------------------\n");
            CollectionUtils.ForEach(nonOrderedCollection,
                                    imageSet => Debug.WriteLine(String.Format("name: {0}, date: {1}", imageSet.Name,
                                                                              ((IImageSopProvider)(imageSet.DisplaySets[0].PresentationImages[0])).
                                                                              ImageSop.StudyDate)));

            if (reverse)
            {
                nonOrderedCollection.RemoveAt(20);
            }
            else
            {
                nonOrderedCollection.RemoveAt(0);
            }

            int j = reverse ? 20 : 1;

            foreach (IImageSet set in nonOrderedCollection)
            {
                Assert.AreEqual(j.ToString(), set.Name);
                j += reverse ? -1 : 1;
            }

            foreach (IImageSet set in nonOrderedCollection)
            {
                set.Dispose();
            }
            foreach (IImageSet set in orderedCollection)
            {
                set.Dispose();
            }

            studyTree.Dispose();
        }
Example #26
0
        public IImageSet BuildImageSet(StudyTree studyTree, out Study study)
        {
            if (IsRemote)
            {
                study = null;
                //Add only the image set, which essentially makes it a remote study.
                var identifier = new StudyRootStudyIdentifier(this, this, new StudyIdentifier())
                                     {
                                         PatientId = ReconciledPatientId ?? PatientId
                                     };

                return new ImageSet(new DicomImageSetDescriptor(identifier));
            }

            study = AddStudy(studyTree);
            var studyIdentifier = study.GetIdentifier();
            studyIdentifier = new StudyRootStudyIdentifier(studyIdentifier) { PatientId = ReconciledPatientId ?? study.ParentPatient.PatientId };
            var imageSet = new ImageSet(new DicomImageSetDescriptor(studyIdentifier));
            foreach (var series in study.Series)
            {
                foreach (var displaySet in DisplaySetFactory.CreateDisplaySets(series))
                    imageSet.DisplaySets.Add(displaySet);
            }

            return imageSet;
        }
Example #27
0
        public Study AddStudy(StudyTree studyTree)
        {
            var sops = BuildSops();
            foreach (var sop in sops)
                studyTree.AddSop(sop);

            return studyTree.GetStudy(sops[0].StudyInstanceUid);
        }
        public void TestSeriesSplittingEnhancedMREcho()
        {
            const int             numberOfSeries     = 2;
            const int             instancesPerSeries = 3;
            const int             framesPerInstance  = 10;
            List <TestDataSource> dataSources        = CreateMRStudyDataSources(numberOfSeries, instancesPerSeries, "1.2.3");

            foreach (var dicomFile in dataSources.Select(d => d.File))
            {
                dicomFile.DataSet[DicomTags.NumberOfFrames].SetInt32(0, framesPerInstance);

                if (dicomFile.DataSet[DicomTags.SeriesNumber].GetInt32(0, 0) != 2)
                {
                    continue;
                }

                var dimUid    = "1.2.3.4.5";
                var mfdModule = new MultiFrameDimensionModuleIod(dicomFile.DataSet);
                mfdModule.DimensionOrganizationSequence = new[] { new DimensionOrganizationSequenceItem {
                                                                      DimensionOrganizationUid = dimUid
                                                                  } };
                mfdModule.DimensionIndexSequence = new[]
                {
                    new DimensionIndexSequenceItem {
                        DimensionIndexPointer = DicomTags.StackId, FunctionalGroupPointer = DicomTags.FrameContentSequence, DimensionOrganizationUid = dimUid
                    },
                    new DimensionIndexSequenceItem {
                        DimensionIndexPointer = DicomTags.InStackPositionNumber, FunctionalGroupPointer = DicomTags.FrameContentSequence, DimensionOrganizationUid = dimUid
                    },
                    new DimensionIndexSequenceItem {
                        DimensionIndexPointer = DicomTags.EffectiveEchoTime, FunctionalGroupPointer = DicomTags.MrEchoSequence, DimensionOrganizationUid = dimUid
                    }
                };
                var mffgModule = new MultiFrameFunctionalGroupsModuleIod(dicomFile.DataSet);
                mffgModule.PerFrameFunctionalGroupsSequence = Enumerable.Range(0, framesPerInstance).Select(i =>
                {
                    var fg = new FunctionalGroupsSequenceItem();
                    ushort inStackPositionNumber = (ushort)(i % 5 + 1);
                    ushort echoNumber            = (ushort)(i / 5 + 1);
                    fg.GetFunctionalGroup <FrameContentFunctionalGroup>().FrameContentSequence = new FrameContentSequenceItem {
                        InStackPositionNumber = inStackPositionNumber, StackId = "1", DimensionIndexValues = new uint[] { 1, inStackPositionNumber, echoNumber }
                    };
                    fg.GetFunctionalGroup <MrEchoFunctionalGroup>().MrEchoSequence = new MrEchoSequenceItem {
                        EffectiveEchoTime = echoNumber + 5 / 1000f
                    };
                    return(fg);
                }).ToArray();
            }

            StudyTree studyTree = CreateStudyTree(ConvertToSops(dataSources));

            MREchoDisplaySetFactory factory = new MREchoDisplaySetFactory();

            factory.SetStudyTree(studyTree);
            List <IDisplaySet> allDisplaySets = new List <IDisplaySet>();

            try
            {
                Patient patient = studyTree.Patients[0];
                Study   study   = patient.Studies[0];

                Assert.AreEqual(numberOfSeries, study.Series.Count, "There should be exactly {0} series", numberOfSeries);

                Series series2 = study.Series[1];

                foreach (Series series in study.Series)
                {
                    Assert.AreEqual(instancesPerSeries, series.Sops.Count, "There should be exactly {0} sops", instancesPerSeries);
                    List <IDisplaySet> displaySets = factory.CreateDisplaySets(series);
                    allDisplaySets.AddRange(displaySets);

                    if (series == series2)
                    {
                        Assert.AreEqual(2, displaySets.Count, "There should be exactly 4 display sets");

                        IDisplaySet displaySet = displaySets[0];
                        Assert.AreEqual(series.Sops.Count * framesPerInstance / 2, displaySet.PresentationImages.Count, "#presentation images should be #Sops/2");
                        Assert.AreNotEqual(series.SeriesInstanceUid, displaySet.Descriptor.Uid, "Series UID and Display Set UID don't match");
                        Assert.AreEqual(typeof(MREchoDisplaySetDescriptor), displaySet.Descriptor.GetType(), "Wrong display set descriptor type");
                        Assert.IsTrue(displaySet.Name.Contains("Echo"), "Display Set name not correct");

                        ValidateMultiframeEchoDisplaySet(displaySets[0], 1);
                        ValidateMultiframeEchoDisplaySet(displaySets[1], 2);
                    }
                    else
                    {
                        //Assert.AreEqual(0, displaySets.Count, "There should be no display sets");
                    }
                }
            }
            finally
            {
                foreach (IDisplaySet displaySet in allDisplaySets)
                {
                    displaySet.Dispose();
                }

                studyTree.Dispose();
            }
        }
        public void TestMixedMultiframes(int numberOfSingleFrames, int[] multiFramesNumberOfFrames)
        {
            const int numberOfSeries      = 1;
            int       instancesPerSeries  = numberOfSingleFrames + multiFramesNumberOfFrames.Length;
            int       numberOfMultiframes = multiFramesNumberOfFrames.Length;

            List <TestDataSource> dataSources = CreateMRStudyDataSources(numberOfSeries, instancesPerSeries, "1.2.3");

            for (int i = 0; i < numberOfMultiframes; i++)
            {
                dataSources[i].File.DataSet[DicomTags.NumberOfFrames].SetInt32(0, multiFramesNumberOfFrames[i]);
            }

            StudyTree studyTree = CreateStudyTree(ConvertToSops(dataSources));

            MixedMultiFrameDisplaySetFactory factory = new MixedMultiFrameDisplaySetFactory();

            factory.SetStudyTree(studyTree);
            List <IDisplaySet> allDisplaySets = new List <IDisplaySet>();

            Patient patient = studyTree.Patients[0];
            Study   study   = patient.Studies[0];
            Series  series  = study.Series[0];

            if (instancesPerSeries == 1)
            {
                try
                {
                    Assert.AreEqual(instancesPerSeries, series.Sops.Count, "There should be exactly {0} sops", instancesPerSeries);

                    List <IDisplaySet> displaySets = factory.CreateDisplaySets(series);
                    allDisplaySets.AddRange(displaySets);

                    Assert.AreEqual(0, displaySets.Count, "This scenario should produce no display sets");
                }
                finally
                {
                    foreach (IDisplaySet displaySet in allDisplaySets)
                    {
                        displaySet.Dispose();
                    }

                    studyTree.Dispose();
                }
            }
            else
            {
                try
                {
                    Assert.AreEqual(instancesPerSeries, series.Sops.Count, "There should be exactly {0} sops", instancesPerSeries);

                    List <IDisplaySet> displaySets = factory.CreateDisplaySets(series);
                    allDisplaySets.AddRange(displaySets);

                    if (series.SeriesInstanceUid == dataSources[0].SeriesInstanceUid)
                    {
                        int numberOfDisplaySets = numberOfSingleFrames > 0 ? 1 : 0;
                        numberOfDisplaySets += numberOfMultiframes;
                        Assert.AreEqual(numberOfDisplaySets, displaySets.Count, "There should be exactly {0} display sets", numberOfDisplaySets);

                        if (numberOfSingleFrames > 0)
                        {
                            IDisplaySet singleFramesDisplaySet = displaySets[0];
                            Assert.AreEqual(numberOfSingleFrames, singleFramesDisplaySet.PresentationImages.Count, "#Presentation images should match #singe frames in series");
                            Assert.AreEqual(typeof(SingleImagesDisplaySetDescriptor), singleFramesDisplaySet.Descriptor.GetType(), "Wrong display set descriptor type");
                            Assert.AreEqual(String.Format("{0}:SingleImages", series.SeriesInstanceUid), singleFramesDisplaySet.Uid);
                        }

                        int multiFramesStartIndex = numberOfSingleFrames > 0 ? 1 : 0;
                        for (int i = multiFramesStartIndex; i < displaySets.Count; i++)
                        {
                            IDisplaySet multiFrameDisplaySet = displaySets[i];
                            int         numberOfFrames       = multiFramesNumberOfFrames[i - multiFramesStartIndex];
                            ImageSop    multiFrame           = ((IImageSopProvider)multiFrameDisplaySet.PresentationImages[0]).ImageSop;
                            Assert.AreEqual(numberOfFrames, multiFrameDisplaySet.PresentationImages.Count, "#Presentation images should match #frames in multiframe");
                            Assert.AreEqual(typeof(MultiframeDisplaySetDescriptor), multiFrameDisplaySet.Descriptor.GetType(), "Wrong display set descriptor type");
                            Assert.AreEqual(multiFrame.SopInstanceUid, multiFrameDisplaySet.Uid);
                        }
                    }
                    else
                    {
                        Assert.AreEqual(0, displaySets.Count, "There should be no display sets");
                    }
                }
                finally
                {
                    foreach (IDisplaySet displaySet in allDisplaySets)
                    {
                        displaySet.Dispose();
                    }

                    studyTree.Dispose();
                }
            }
        }
Example #30
0
        internal static IEnumerable <IDisplaySet> CreateSeriesDisplaySets(Series series, StudyTree studyTree)
        {
            BasicDisplaySetFactory factory = new BasicDisplaySetFactory();

            factory.SetStudyTree(studyTree);
            return(factory.CreateDisplaySets(series));
        }
 void IPresentationImageFactory.SetStudyTree(StudyTree studyTree)
 {
     _studyTree = studyTree;
 }
Example #32
0
 void IImageSetFactory.SetStudyTree(StudyTree studyTree)
 {
     _studyTree = studyTree;
     _displaySetFactory.SetStudyTree(studyTree);
 }