/// <summary>
 /// Gets the Dimension Organization UID of a specific dimension for the specified frame.
 /// </summary>
 /// <remarks>
 /// The Dimension Organization UID identifies when the same dimension index values are valid
 /// across multiple SOP instances.
 /// </remarks>
 /// <param name="frameNumber">The number of the frame for which the dimension is to be retrieved (1-based index).</param>
 /// <param name="dimensionIndexTag">The DICOM tag of the dimension to retrieve (i.e. the Dimension Index Pointer).</param>
 /// <param name="functionalGroupTag">The DICOM tag of the parent functional group sequence (i.e. the Functional Group Pointer).</param>
 /// <returns>The Dimension Organization UID of the specified dimension, or empty if the image is not a multi-frame or does not contain the specified dimension.</returns>
 public string GetFrameDimensionOrganizationUid(int frameNumber, uint dimensionIndexTag, uint functionalGroupTag)
 {
     if (frameNumber > 0 && IsMultiframe)
     {
         DimensionIndexSequenceItem dimension;
         var dimensionIndex = new MultiFrameDimensionModuleIod(DataSource).FindDimensionIndexSequenceItemByTag(dimensionIndexTag, functionalGroupTag, out dimension);
         if (dimensionIndex >= 0)
         {
             return(dimension.DimensionOrganizationUid);
         }
     }
     return(string.Empty);
 }
        private void ValidateMultiframeEchoDisplaySet(IDisplaySet displaySet, int echoNumber)
        {
            string seriesInstanceUid = null;

            foreach (IPresentationImage presentationImage in displaySet.PresentationImages)
            {
                var sopProvider = ((IImageSopProvider)presentationImage);
                var mfdModule   = new MultiFrameDimensionModuleIod(sopProvider.ImageSop.DataSource);
                var echoDim     = mfdModule.FindDimensionIndexSequenceItemByTag(DicomTags.EffectiveEchoTime, DicomTags.MrEchoSequence);
                Assert.IsTrue(echoDim >= 0, "MR Echo dimension was not found");

                seriesInstanceUid = sopProvider.ImageSop.SeriesInstanceUid;
                Assert.AreEqual(echoNumber, sopProvider.Frame[DicomTags.DimensionIndexValues].GetInt32(echoDim, -1), "Echo number must be {0} for each image in the display set", echoNumber);
            }

            Assert.IsNotNull(seriesInstanceUid);
            Assert.AreEqual(String.Format("{0}:Echo{1}", seriesInstanceUid, echoNumber), displaySet.Uid);
        }
Пример #3
0
 /// <summary>
 /// Gets the Dimension Index Value of a specific dimension for the specified frame.
 /// </summary>
 /// <remarks>
 /// The Dimension Index Value is a number associated with a specific frame in a multi-frame image
 /// that identifies its sequential order relative to the other frames in a particular dimension.
 /// The dimension is identified by the DICOM tag which has the value of the frame in this dimension,
 /// and the DICOM tag of the parent functional group sequence.
 /// </remarks>
 /// <param name="frameNumber">The number of the frame for which the index value is to be retrieved (1-based index).</param>
 /// <param name="dimensionIndexTag">The DICOM tag of the dimension to retrieve (i.e. the Dimension Index Pointer).</param>
 /// <param name="functionalGroupTag">The DICOM tag of the parent functional group sequence (i.e. the Functional Group Pointer).</param>
 /// <returns>The index value of the frame in the specified dimension, or NULL if the image is not a multi-frame or does not contain the specified dimension.</returns>
 public int?GetFrameDimensionIndexValue(int frameNumber, uint dimensionIndexTag, uint functionalGroupTag)
 {
     if (frameNumber > 0 && IsMultiframe)
     {
         DimensionIndexSequenceItem dimension;
         var dimensionIndex = new MultiFrameDimensionModuleIod(DataSource).FindDimensionIndexSequenceItemByTag(dimensionIndexTag, functionalGroupTag, out dimension);
         if (dimensionIndex >= 0)
         {
             int dimensionIndexValue;
             var dicomAttribute = GetFrameAttributeCore(frameNumber, DicomTags.DimensionIndexValues);
             if (dicomAttribute != null && dicomAttribute.TryGetInt32(dimensionIndex, out dimensionIndexValue))
             {
                 return(dimensionIndexValue);
             }
         }
     }
     return(null);
 }
Пример #4
0
 public SegmentationDocumentIod(IDicomAttributeProvider dicomAttributeProvider)
 {
     _dicomAttributeProvider     = dicomAttributeProvider;
     _patientModule              = new PatientModuleIod(_dicomAttributeProvider);
     _clinicalTrialSubjectModule = new ClinicalTrialSubjectModuleIod(_dicomAttributeProvider);
     _generalStudyModule         = new GeneralStudyModuleIod(_dicomAttributeProvider);
     _patientStudyModule         = new PatientStudyModuleIod(_dicomAttributeProvider);
     _clinicalTrialStudyModule   = new ClinicalTrialStudyModuleIod(_dicomAttributeProvider);
     _generalSeriesModule        = new GeneralSeriesModuleIod(_dicomAttributeProvider);
     _segmentationSeriesModule   = new SegmentationSeriesModuleIod(_dicomAttributeProvider);
     _clinicalTrialSeriesModule  = new ClinicalTrialSeriesModuleIod(_dicomAttributeProvider);
     _frameOfReferenceModule     = new FrameOfReferenceModuleIod(_dicomAttributeProvider);
     _generalEquipmentModule     = new GeneralEquipmentModuleIod(_dicomAttributeProvider);
     //_enhanceGeneralEquipmentModule = new EnhanceGeneralEquipmentModuleIod(_dicomAttributeProvider);
     _generalImageModule               = new GeneralImageModuleIod(_dicomAttributeProvider);
     _imagePixelModule                 = new ImagePixelMacroIod(_dicomAttributeProvider);
     _segmentationImageModule          = new SegmentationImageModuleIod(_dicomAttributeProvider);
     _multiFrameFunctionalGroupsModule = new MultiFrameFunctionalGroupsModuleIod(_dicomAttributeProvider);
     _multiFrameDimensionModule        = new MultiFrameDimensionModuleIod(_dicomAttributeProvider);
     _specimenModule = new SpecimenModuleIod(_dicomAttributeProvider);
     _commonInstanceReferenceModule = new CommonInstanceReferenceModuleIod(_dicomAttributeProvider);
     _sopCommonModule       = new SopCommonModuleIod(_dicomAttributeProvider);
     _frameExtractionModule = new FrameExtractionModuleIod(_dicomAttributeProvider);
 }
        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();
            }
        }