Пример #1
0
        /// <summary>
        /// Attempts to find the first series that matches the constraints or returns a collection of DICOM constraint results.
        /// </summary>
        /// <param name="modelChannelConstraints">The channel constraints for the model.</param>
        /// <param name="seriesData">The collection of Dicom files for the series.</param>
        /// <returns>If matched and the channel data or false and null and the dicom constraint result per Dicom series.</returns>
        private static ConstraintResult <ChannelData> GetChannelConstraintResult(
            ModelChannelConstraints modelChannelConstraints,
            IEnumerable <IEnumerable <DicomFile> > seriesData)
        {
            var dicomConstraintResults = new List <DicomConstraintResult>();

            foreach (var dicomSeries in seriesData)
            {
                var constraintResult = GetChannelConstraintResult(modelChannelConstraints, dicomSeries);

                dicomConstraintResults.AddRange(constraintResult.DicomConstraintResults);

                // As soon as we match we return the result
                if (constraintResult.Matched)
                {
                    return(new ConstraintResult <ChannelData>(dicomConstraintResults, constraintResult.Result));
                }
            }

            return(new ConstraintResult <ChannelData>(dicomConstraintResults));
        }
Пример #2
0
        /// <summary>
        /// Gets the channel constraint result for a collection of DICOM files.
        /// </summary>
        /// <param name="channelConstraints">The channel constraints.</param>
        /// <param name="dicomFiles">The dicom files.</param>
        /// <returns>The channel data and constraint result.</returns>
        private static ConstraintResult <ChannelData> GetChannelConstraintResult(
            ModelChannelConstraints channelConstraints,
            IEnumerable <DicomFile> dicomFiles)
        {
            var(filteredDicomFiles, dicomConstraintResults) = FilterDicomFiles(channelConstraints, dicomFiles);
            var filteredDicomFilesCount = filteredDicomFiles.Count;

            // Check that we have sufficient images after the filter
            var filteredDicomFilesCountSufficient =
                channelConstraints.MinChannelImages <= filteredDicomFilesCount &&
                (channelConstraints.MaxChannelImages <= 0 || filteredDicomFilesCount <= channelConstraints.MaxChannelImages);

            if (filteredDicomFilesCountSufficient)
            {
                // we may wish to do something more sophisticated here. e.g. record all the matches and choose
                // and distribute matched series over the constraints using a heuristic
                return(new ConstraintResult <ChannelData>(
                           dicomConstraintResults,
                           new ChannelData(channelID: channelConstraints.ChannelID, dicomFiles: filteredDicomFiles)));
            }

            return(new ConstraintResult <ChannelData>(dicomConstraintResults));
        }
Пример #3
0
        /// <summary>
        /// Filters the DICOM files based on the channel constraints..
        /// </summary>
        /// <param name="channelConstraints">The channel constraints.</param>
        /// <param name="dicomFiles">The dicom files.</param>
        /// <returns>The filtered DICOM files and the constraint results per DICOM file.</returns>
        private static (IList <DicomFile> FilteredDicomFiles, IEnumerable <DicomConstraintResult> DicomConstraintResults) FilterDicomFiles(
            ModelChannelConstraints channelConstraints,
            IEnumerable <DicomFile> dicomFiles)
        {
            var filteredImages         = new List <DicomFile>();
            var dicomConstraintResults = new List <DicomConstraintResult>();

            foreach (var dicomFile in dicomFiles)
            {
                var imageFilterResult       = channelConstraints.ImageFilter.Check(dicomFile.Dataset);
                var channelConstraintResult = channelConstraints.ChannelConstraints.Check(dicomFile.Dataset);

                dicomConstraintResults.Add(imageFilterResult);
                dicomConstraintResults.Add(channelConstraintResult);

                // This check will throw InvalidOperationException if the config is incorrect
                if (imageFilterResult.Result && channelConstraintResult.Result)
                {
                    filteredImages.Add(dicomFile);
                }
            }

            return(filteredImages, dicomConstraintResults);
        }