public async Task <(string segmentationId, IEnumerable <DicomFile> postedImages)> StartSegmentationAsync(string modelId, IEnumerable <ChannelData> channelIdsAndDicomFiles)
 {
     if (RealSegmentation)
     {
         return(await _InnerEyeSegmentationClient.StartSegmentationAsync(modelId, channelIdsAndDicomFiles).ConfigureAwait(false));
     }
     else
     {
         return(Guid.NewGuid().ToString(), channelIdsAndDicomFiles.SelectMany(x => x.DicomFiles).ToList());
     }
 }
Beispiel #2
0
        /// <summary>
        /// Starts the segmentation task.
        /// </summary>
        /// <param name="channelData">The channel data.</param>
        /// <param name="uploadQueueItem">The upload queue item.</param>
        /// <param name="modelGuid">The model unique identifier.</param>
        /// <param name="tagReplacements">The tag replacements.</param>
        /// <param name="clientConfiguration">The client configuration.</param>
        /// <returns>The queue item.</returns>
        /// <exception cref="InvalidQueueDataException">If the result destination is not a valid AET.</exception>
        private async Task <DownloadQueueItem> StartSegmentationAsync
            (IEnumerable <ChannelData> channelData,
            UploadQueueItem uploadQueueItem,
            string modelGuid,
            TagReplacement[] tagReplacements,
            ClientAETConfig clientConfiguration)
        {
            if (clientConfiguration.Destination == null)
            {
                var exception = new ArgumentNullException("clientConfiguration.Destination",
                                                          "The result destination is null. The destination has not been configured.");

                LogError(LogEntry.Create(AssociationStatus.UploadErrorDestinationEmpty, uploadQueueItem: uploadQueueItem),
                         exception);

                throw exception;
            }

            // Validate the destination before uploading.
            ValidateDicomEndpoint(uploadQueueItem, clientConfiguration.Destination);

            LogInformation(LogEntry.Create(AssociationStatus.Uploading,
                                           uploadQueueItem: uploadQueueItem,
                                           modelId: modelGuid));

            var referenceDicomFiles = channelData.First().DicomFiles.ToArray();

            // Read all the bytes from the reference Dicom file and create new DICOM files with only the required DICOM tags
            var referenceDicomByteArrays = referenceDicomFiles
                                           .CreateNewDicomFileWithoutPixelData(
                _innerEyeSegmentationClient.SegmentationAnonymisationProtocol.Select(x => x.DicomTagIndex.DicomTag));

            // Start the segmentation
            var(segmentationId, postedImages) = await _innerEyeSegmentationClient.StartSegmentationAsync(modelGuid, channelData).ConfigureAwait(false);

            LogInformation(LogEntry.Create(AssociationStatus.Uploaded,
                                           uploadQueueItem: uploadQueueItem,
                                           segmentationId: segmentationId,
                                           modelId: modelGuid));

            var isDryRun         = clientConfiguration.Config.AETConfigType == AETConfigType.ModelWithResultDryRun;
            var resultsDirectory = GetResultsDirectory(
                uploadQueueItem.RootDicomFolderPath,
                isDryRun: isDryRun);

            // Copy any data needed to be sent with result to results directory if needed.
            if (clientConfiguration.ShouldReturnImage)
            {
                CopySendDataToResultsDirectory(resultsDirectory, channelData);
            }

            return(new DownloadQueueItem(
                       segmentationId: segmentationId,
                       modelId: modelGuid,
                       resultsDirectory: resultsDirectory,
                       referenceDicomFiles: referenceDicomByteArrays,
                       calledApplicationEntityTitle: uploadQueueItem.CalledApplicationEntityTitle,
                       callingApplicationEntityTitle: uploadQueueItem.CallingApplicationEntityTitle,
                       destinationApplicationEntity: new GatewayApplicationEntity(
                           clientConfiguration.Destination.Title,
                           clientConfiguration.Destination.Port,
                           clientConfiguration.Destination.Ip),
                       tagReplacementJsonString: JsonConvert.SerializeObject(tagReplacements),
                       associationGuid: uploadQueueItem.AssociationGuid,
                       associationDateTime: uploadQueueItem.AssociationDateTime,
                       isDryRun: isDryRun));
        }