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