using System.Collections.Generic; using System.Linq; using WingInterfaceLibrary.Enum; namespace WingAIDiagnosisService.Manage { public class BreastDiagnosis : BaseDiagnosis { public BreastDiagnosis(List recordResult, DiagnosisOrganEnum organ) : base(recordResult, organ) { } #region Private private AIDetectedObject IsValidDetectedObjectInfo(AIDetectedObject detectedObjectInfo) { if (detectedObjectInfo.Label == 0) { return detectedObjectInfo; } if (detectedObjectInfo.Descriptions == null || !detectedObjectInfo.Descriptions.Any()) { return null; } var lesionSizeDescription = detectedObjectInfo.Descriptions.FirstOrDefault(d => d.Type == DiagnosisDescription.LesionSize && !string.IsNullOrWhiteSpace(d.Value)); if (lesionSizeDescription == null) { return null; } var lessionSizeInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(lesionSizeDescription.Value); if (lessionSizeInfo.VerticalLengthInPixel == 0 || lessionSizeInfo.HorizontalLengthInPixel == 0) { return null; } return detectedObjectInfo; } private bool CheckIsBreast(List result) { var breastCount = result.Where(a => a.PriorityScore > 0).Count(); var totalCount = result.Count; var breastRate = breastCount * 1.0 / totalCount * 1.0; return breastRate > 1 / 3.0; } private bool ExistAIData(IEnumerable organDiagResults, AILabelEnum label) { if (organDiagResults == null) return false; foreach (var record in organDiagResults) { if (record.DetectedObjects == null) continue; if (record.Organ != DiagnosisOrganEnum.Breast) continue; if (label == AILabelEnum.BIRads1) { if (record.DetectedObjects.Any(a => a.Label == (int)label)) return true; } else { if (record.DetectedObjects.Any(a => a.Label == (int)label) && record.DetectedObjects.All(d => IsValidDetectedObjectInfo(d) != null)) return true; } } return false; } #endregion public override AIDiagnosisResultPerOrgan CheckResultValid(AIDiagnosisResultPerOrgan message) { if (message.Organ != DiagnosisOrganEnum.Breast) { return null; } var result = message; var validDetectedObjects = new List(); foreach (var obj in message.DetectedObjects) { var obj_new = IsValidDetectedObjectInfo(obj); if (obj_new != null) { validDetectedObjects.Add(obj_new); } } if (validDetectedObjects.Any()) { result.DetectedObjects = validDetectedObjects.ToList(); return result; } return null; } public override DiagnosisConclusion GetAIStatus() { var status = DiagnosisConclusion.Unrecognized; bool existMalignant = false; bool existBenign = false; if (RecordDiagnosisResult != null && RecordDiagnosisResult.Any()) { if (!CheckIsBreast(RecordDiagnosisResult)) return status; foreach (var diagResult in RecordDiagnosisResult) { if (existMalignant && existBenign) break; if (diagResult.DiagResultsForEachOrgan != null && diagResult.PriorityScore > 0) { foreach (var organ in diagResult.DiagResultsForEachOrgan) { if (organ.DetectedObjects != null) { if (!existMalignant) { if (organ.DetectedObjects.Any(a => a.Label >= 4)) { existMalignant = true; } } if (!existBenign) { if (organ.DetectedObjects.Any(a => a.Label >= 1 && a.Label < 4)) { existBenign = true; } } } } if (existMalignant) { status = existBenign ? DiagnosisConclusion.BenignAndMalignant : DiagnosisConclusion.Malignant; } else { status = existBenign ? DiagnosisConclusion.Benign : DiagnosisConclusion.NoObviousLesion; } } } } return status; } /// /// 是否恶性病灶 /// /// /// protected override bool IsMalignant(AIDetectedObject detectedObject) { return detectedObject.Label > (int)AILabelEnum.BIRads3; } public override List GetReportResults() { if (!RecordDiagnosisResult.Any()) { return RecordDiagnosisResult; } var reportResults = new List(); for (var i = 1; i <= (int)AILabelEnum.BIRads5; i++) { var label = (AILabelEnum)i; var data = RecordDiagnosisResult.FirstOrDefault(a => ExistAIData(a.DiagResultsForEachOrgan, label)); if (data != null) { if (!reportResults.Any(a => a.RemedicalCode == data.RemedicalCode && a.Index == data.Index)) { reportResults.Add(data); } } } if (!reportResults.Any()) { //未见异常 var label = AILabelEnum.BIRads1; var data = RecordDiagnosisResult.FirstOrDefault(a => ExistAIData(a.DiagResultsForEachOrgan, label)); if (data != null) { if (!reportResults.Any(a => a.RemedicalCode == data.RemedicalCode && a.Index == data.Index)) { reportResults.Add(data); } } } RecordDiagnosisResult = reportResults; InitialAIImage(); return RecordDiagnosisResult; } } }