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