diff --git a/Lugano 2014/20231205 lugano病灶验证.xlsx b/Lugano 2014/20231205 lugano病灶验证.xlsx new file mode 100644 index 0000000..c421668 Binary files /dev/null and b/Lugano 2014/20231205 lugano病灶验证.xlsx differ diff --git a/Lugano 2014/20231205-Lugano 2014_ECRF.xlsx b/Lugano 2014/20231205-Lugano 2014_ECRF.xlsx new file mode 100644 index 0000000..cfdf0fd Binary files /dev/null and b/Lugano 2014/20231205-Lugano 2014_ECRF.xlsx differ diff --git a/Lugano 2014/20231205-Lugano 2014默认部位列表-确认版.xlsx b/Lugano 2014/20231205-Lugano 2014默认部位列表-确认版.xlsx new file mode 100644 index 0000000..281392a Binary files /dev/null and b/Lugano 2014/20231205-Lugano 2014默认部位列表-确认版.xlsx differ diff --git a/Lugano 2014/20231205-Lugano2014 标准版阅片单元配置表格问题.xlsx b/Lugano 2014/20231205-Lugano2014 标准版阅片单元配置表格问题.xlsx new file mode 100644 index 0000000..92f7826 Binary files /dev/null and b/Lugano 2014/20231205-Lugano2014 标准版阅片单元配置表格问题.xlsx differ diff --git a/Lugano 2014/20231205-lugano阅片标准优化需求.docx b/Lugano 2014/20231205-lugano阅片标准优化需求.docx new file mode 100644 index 0000000..7b945f2 Binary files /dev/null and b/Lugano 2014/20231205-lugano阅片标准优化需求.docx differ diff --git a/Lugano 2014/20231205-lugano阅片标准需求.docx b/Lugano 2014/20231205-lugano阅片标准需求.docx new file mode 100644 index 0000000..cfa3098 Binary files /dev/null and b/Lugano 2014/20231205-lugano阅片标准需求.docx differ diff --git a/Lugano 2014/评估算法/1、靶病灶评估.cs b/Lugano 2014/评估算法/1、靶病灶评估.cs new file mode 100644 index 0000000..9d88e47 --- /dev/null +++ b/Lugano 2014/评估算法/1、靶病灶评估.cs @@ -0,0 +1,28 @@ + +"默认SD" + +if(当前访视是基线) +{ + "NA"; +} +else if(基线未选择靶病灶) +{ + "ND"; +} +else if(任一单个病灶进展即可) +{ + "PD"; +} +else if(当前访视存在至少一个状态为“不可评估”的靶病灶) +{ + "NE"; +} +else if(当前访视非淋巴结靶病灶全部消失 && (当前访视淋巴结靶病灶的状态全部变为“消失” 或者 "太小" )) +{ + "CR"; +} +else if(与基线相比SPD变化的百分比 <=- 50% ) +{ + "PR"; +} + diff --git a/Lugano 2014/评估算法/2、非靶病灶评估.cs b/Lugano 2014/评估算法/2、非靶病灶评估.cs new file mode 100644 index 0000000..173eed8 --- /dev/null +++ b/Lugano 2014/评估算法/2、非靶病灶评估.cs @@ -0,0 +1,24 @@ +if(当前访视是基线) +{ + "NA"; +} +else if(基线未选择非靶病灶) +{ + "ND"; +} +else if(随访至少存在一个状态为“显著增大”的非靶病灶) +{ + "PD"; +} +else if( 随访存在至少一个状态为“不可评估”的非靶病灶) +{ + "NE"; +} +else if(所有单个病灶/病灶组状态评估状态为“消失”) //当前访视非靶病灶状态为消失的数量==非靶病灶的数量 +{ + "CR"; +} +else +{ + "PR/SD"; +} \ No newline at end of file diff --git a/Lugano 2014/评估算法/3、新病灶评估.cs b/Lugano 2014/评估算法/3、新病灶评估.cs new file mode 100644 index 0000000..02bb309 --- /dev/null +++ b/Lugano 2014/评估算法/3、新病灶评估.cs @@ -0,0 +1,20 @@ +if(当前访视是基线) +{ + "NA"; +} +else if(当前访视存在至少一个明确新病灶) +{ + "是"; +} +else if(只要有任何一个新病灶状态为“无法评估”) +{ + "无法评估"; +} +else if(当前访视不存在明确新病灶且存在至少一个疑似新病灶) +{ + "疑似"; +} +else +{ + "否"; +} \ No newline at end of file diff --git a/Lugano 2014/评估算法/4、脾脏评估.cs b/Lugano 2014/评估算法/4、脾脏评估.cs new file mode 100644 index 0000000..013e2da --- /dev/null +++ b/Lugano 2014/评估算法/4、脾脏评估.cs @@ -0,0 +1 @@ +return "脾脏状态"; \ No newline at end of file diff --git a/Lugano 2014/评估算法/5、肝脏评估.cs b/Lugano 2014/评估算法/5、肝脏评估.cs new file mode 100644 index 0000000..1cf823a --- /dev/null +++ b/Lugano 2014/评估算法/5、肝脏评估.cs @@ -0,0 +1 @@ +return "肝脏状态"; \ No newline at end of file diff --git a/Lugano 2014/评估算法/6、CMRI总体评估实现代码.cs b/Lugano 2014/评估算法/6、CMRI总体评估实现代码.cs new file mode 100644 index 0000000..ea3812d --- /dev/null +++ b/Lugano 2014/评估算法/6、CMRI总体评估实现代码.cs @@ -0,0 +1,213 @@ +public async Task CTMRIEvaluation(ReadingCalculateDto inDto) + { + if (inDto.IsBaseLine) + { + return CTMRIOverallAssessment.NA.GetEnumInt(); + } + // 靶病灶评估 + var targetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.Answer).FirstOrDefault(); + + // 非靶病灶评估 + var noTargetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NoTargetLesion).Select(x => x.Answer).FirstOrDefault(); + + // 存在新病灶 + var existsNewTarget = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionEvaluation).Select(x => x.Answer).FirstOrDefault(); + + // 肝脏评估 + var liverEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LiverAssessment).Select(x => x.Answer).FirstOrDefault(); + + // 脾脏评估 + var spleenEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicEvaluation).Select(x => x.Answer).FirstOrDefault(); + + List data = new List() { + + //ND ND 否/疑似 正常 正常 ND + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.ND }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No, NewLesionAssessment.Suspected }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND }), + }, + + //PD 任一结果 任一结果 任一结果 任一结果 PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.PD }), + Column2=ReadingCommon.EnumToString(new List() { }), + Column3=ReadingCommon.EnumToString(new List() { }), + Column4=ReadingCommon.EnumToString(new List() { }), + Column5=ReadingCommon.EnumToString(new List() { }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), + }, + //任一结果 PD 任一结果 任一结果 任一结果 PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.PD }), + Column3=ReadingCommon.EnumToString(new List() {}), + Column4=ReadingCommon.EnumToString(new List() { }), + Column5=ReadingCommon.EnumToString(new List() { }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), + }, + //任一结果 任一结果 是 任一结果 任一结果 PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { }), + Column2=ReadingCommon.EnumToString(new List() { }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.Yes }), + Column4=ReadingCommon.EnumToString(new List() { }), + Column5=ReadingCommon.EnumToString(new List() { }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), + }, + //任一结果 任一结果 任一结果 显著增大 任一结果 PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { }), + Column2=ReadingCommon.EnumToString(new List() { }), + Column3=ReadingCommon.EnumToString(new List() { }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Increase }), + Column5=ReadingCommon.EnumToString(new List() { }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), + }, + //任一结果 任一结果 任一结果 任一结果 显著增大 PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { }), + Column2=ReadingCommon.EnumToString(new List() { }), + Column3=ReadingCommon.EnumToString(new List() {}), + Column4=ReadingCommon.EnumToString(new List() { }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Increase }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), + }, + //CR CR/ND 否 正常 正常 CR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.CR }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.CR, NoTargetAssessment.ND }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR }), + }, + //ND CR 否 正常 正常 CR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.CR }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR }), + }, + //NE 非PD 否/疑似/无法评估 非显著增大 非显著增大 NE + new CalculationDto(){ + NotEq=new List(){ 2,4,5}, + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.NE }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.PD }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No,NewLesionAssessment.Suspected, NewLesionAssessment.NE}), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Increase }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Increase }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.NE }), + }, + //ND NE 否/疑似/无法评估(不为是) 正常/稳定/无法评估/部分缓解(非显著增大) 正常/稳定/无法评估/部分缓解(非显著增大) NE + new CalculationDto(){ + NotEq=new List(){ 3,4,5}, + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.Yes }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Increase }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Increase }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.NE }), + }, + //ND ND 无法评估 正常/稳定/无法评估/部分缓解(非显著增大) 正常/稳定/无法评估/部分缓解(非显著增大) NE + new CalculationDto(){ + NotEq=new List(){ 4,5}, + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.ND }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.NE }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Increase }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Increase }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.NE }), + }, + //ND ND 否/疑似 无法评估 正常/稳定/无法评估/部分缓解(非显著增大) NE + new CalculationDto(){ + NotEq=new List(){ 5}, + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.ND }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No,NewLesionAssessment.Suspected }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.NotEvaluable }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Increase }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.NE }), + }, + // ND ND 否/疑似 正常/稳定 NE NE + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.ND }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No,NewLesionAssessment.Suspected }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal,LiverAssessment.Stabilization }), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.NotEvaluable }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.NE }), + }, + //PR 非PD 否/疑似/无法评估(不为是) 正常/稳定 正常/部分缓解 PR + new CalculationDto(){ + NotEq=new List(){ 2,3}, + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.PR }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.PD }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.Yes }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal,LiverAssessment.Stabilization}), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal,SpleenAssessment.Remission }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PR }), + }, + //CR (PR/SD)或者NE 否/疑似/无法评估(不为是) 正常/部分缓解 正常/部分缓解 PR + new CalculationDto(){ + NotEq=new List(){ 3}, + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.CR }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.PRSD,NoTargetAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.Yes,NewLesionAssessment.Yes }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal,LiverAssessment.Stabilization}), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal,SpleenAssessment.Remission }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PR }), + }, + //CR CR/ND 疑似/无法评估 正常/稳定 正常/部分缓解 PR + new CalculationDto(){ + + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.CR }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.CR,NoTargetAssessment.ND }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.Suspected, NewLesionAssessment.NE }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal,LiverAssessment.Stabilization}), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal,SpleenAssessment.Remission }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PR }), + }, + // ND CR 疑似/无法评估 正常/稳定 正常/部分缓解 PR + new CalculationDto(){ + + Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.CR }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.Suspected, NewLesionAssessment.NE }), + Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal,LiverAssessment.Stabilization}), + Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal,SpleenAssessment.Remission }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PR }), + }, + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { }), + Column2=ReadingCommon.EnumToString(new List() { }), + Column3=ReadingCommon.EnumToString(new List() { }), + Column4=ReadingCommon.EnumToString(new List() { }), + Column5=ReadingCommon.EnumToString(new List() { }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.SD }), + }, + }; + + var index= data.FindIndex(x => + (x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) && + (x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) && + (x.NotEq.Contains(3) ? !x.Column3.Contains(existsNewTarget) : x.Column3.Contains(existsNewTarget) || x.Column3.Count() == 0) && + (x.NotEq.Contains(4) ? !x.Column4.Contains(liverEvaluation) : x.Column4.Contains(liverEvaluation) || x.Column4.Count() == 0) && + (x.NotEq.Contains(5) ? !x.Column5.Contains(spleenEvaluation) : x.Column5.Contains(spleenEvaluation) || x.Column5.Count() == 0)) + ; + Console.WriteLine(index); + var result = data.Where(x => + (x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) && + (x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) && + (x.NotEq.Contains(3) ? !x.Column3.Contains(existsNewTarget) : x.Column3.Contains(existsNewTarget) || x.Column3.Count() == 0) && + (x.NotEq.Contains(4) ? !x.Column4.Contains(liverEvaluation) : x.Column4.Contains(liverEvaluation) || x.Column4.Count() == 0) && + (x.NotEq.Contains(5) ? !x.Column5.Contains(spleenEvaluation) : x.Column5.Contains(spleenEvaluation) || x.Column5.Count() == 0)) + .Select(x => x.Column6.FirstOrDefault()) + .FirstOrDefault(); + return result??string.Empty; + } \ No newline at end of file diff --git a/Lugano 2014/评估算法/6、CTMRI总体评估-对应表.png b/Lugano 2014/评估算法/6、CTMRI总体评估-对应表.png new file mode 100644 index 0000000..cc3fb8d Binary files /dev/null and b/Lugano 2014/评估算法/6、CTMRI总体评估-对应表.png differ diff --git a/Lugano 2014/评估算法/7、FDG-PET评估-对应表.png b/Lugano 2014/评估算法/7、FDG-PET评估-对应表.png new file mode 100644 index 0000000..4c7e1c4 Binary files /dev/null and b/Lugano 2014/评估算法/7、FDG-PET评估-对应表.png differ diff --git a/Lugano 2014/评估算法/7、FDG-PET评估实现代码.cs b/Lugano 2014/评估算法/7、FDG-PET评估实现代码.cs new file mode 100644 index 0000000..2dace19 --- /dev/null +++ b/Lugano 2014/评估算法/7、FDG-PET评估实现代码.cs @@ -0,0 +1,94 @@ + public async Task GetFDGPETOverallAssessment(ReadingCalculateDto inDto) + { + + if (inDto.IsBaseLine) + { + return FDGPETOverallAssessment.NA.GetEnumInt(); + } + + var existPET =await GetExistPET(inDto); + if (existPET.EqEnum(ReadingYesOrNo.No)) + { + return FDGPETOverallAssessment.NE.GetEnumInt(); + } + + //FDGPETOverallAssessment result = FDGPETOverallAssessment.NA; + + // PET5PS + var PET5PS = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstOrDefault(); + + // UptakeChange + var UptakeChange = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.UptakeChange).Select(x => x.Answer).FirstOrDefault(); + + // EvidenceFocalFDG + var EvidenceFocalFDG = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.EvidenceFocalFDG).Select(x => x.Answer).FirstOrDefault(); + + + List data = new List() { + + //NE NE NE NE + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.NE }), + Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.NotEvaluable }), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.NE}), + Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + }, + + //NE/5分/4分/3分/2分/1分/X NE/增大/减少/无明显变化 是,存在新的/复发的FDG高亲和性病灶 PMD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.NE,PET5PSScore.Five,PET5PSScore.Four,PET5PSScore.Three,PET5PSScore.Two,PET5PSScore.One,PET5PSScore.X, }), + Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.NotEvaluable,SUVChangeVSBaseline.Increase,SUVChangeVSBaseline.Decrease,SUVChangeVSBaseline.DidNotChange, }), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.YesHaveNew,}), + Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMD }), + }, + + //5分/4分 增大 NE/(是,存在新的/复发的FDG高亲和性病灶)/(是,存在持续的局灶性变化)/否 PMD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.Five,PET5PSScore.Four, }), + Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.Increase }), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.NE, FDGAffinityFociInBM.YesHaveNew, FDGAffinityFociInBM.YesSustain, FDGAffinityFociInBM.No}), + Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMD }), + }, + + //3分/2分/1分/X NE/增大/减少/无明显变化 否 CMR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.Three,PET5PSScore.Two,PET5PSScore.One,PET5PSScore.X, }), + Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.NotEvaluable,SUVChangeVSBaseline.Increase,SUVChangeVSBaseline.Decrease,SUVChangeVSBaseline.DidNotChange, }), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.No}), + Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.CMR }), + }, + + //3分/2分/1分/X NE/增大/减少/无明显变化 是,存在持续的局灶性变化 PMR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.Three,PET5PSScore.Two,PET5PSScore.One,PET5PSScore.X, }), + Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.NotEvaluable,SUVChangeVSBaseline.Increase,SUVChangeVSBaseline.Decrease,SUVChangeVSBaseline.DidNotChange, }), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.YesSustain }), + Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMR }), + }, + + //5分/4分 减少 否/是,存在持续的局灶性变化 PMR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.Five,PET5PSScore.Four }), + Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.Decrease }), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}), + Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMR }), + }, + + //5分/4分 无明显变化 否/是,存在持续的局灶性变化 NMR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.Five,PET5PSScore.Four }), + Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.DidNotChange }), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}), + Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NMR }), + }, + }; + + + var resultdata = data.Where(x => + (x.NotEq.Contains(1) ? !x.Column1.Contains(PET5PS) : x.Column1.Contains(PET5PS) || x.Column1.Count() == 0) && + (x.NotEq.Contains(2) ? !x.Column2.Contains(UptakeChange) : x.Column2.Contains(UptakeChange) || x.Column2.Count() == 0) && + (x.NotEq.Contains(3) ? !x.Column3.Contains(EvidenceFocalFDG) : x.Column3.Contains(EvidenceFocalFDG) || x.Column3.Count() == 0)) + .Select(x => x.Column4.FirstOrDefault()) + .FirstOrDefault(); + return resultdata ?? string.Empty; + } \ No newline at end of file diff --git a/Lugano 2014/评估算法/8、影像学整体肿瘤评估-对应表更新.png b/Lugano 2014/评估算法/8、影像学整体肿瘤评估-对应表更新.png new file mode 100644 index 0000000..b2fd2dc Binary files /dev/null and b/Lugano 2014/评估算法/8、影像学整体肿瘤评估-对应表更新.png differ diff --git a/Lugano 2014/评估算法/8、影像学整体肿瘤评估代码.cs b/Lugano 2014/评估算法/8、影像学整体肿瘤评估代码.cs new file mode 100644 index 0000000..78b9aa1 --- /dev/null +++ b/Lugano 2014/评估算法/8、影像学整体肿瘤评估代码.cs @@ -0,0 +1,139 @@ + public async Task GetImgOncology(ReadingCalculateDto inDto) + { + if (inDto.IsBaseLine) + { + return ImagingOverallAssessment_Lugano.NA.GetEnumInt(); + } + + //var imageQualityEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ImageQualityAssessment&&x.Answer.EqEnum(ImageQualityEvaluation.Abnormal)).FirstOrDefault(); + //if (imageQualityEvaluation != null) + //{ + // return ImagingOverallAssessment_Lugano.NE.GetEnumInt(); + //} + + // CTandMRI + var CTandMRIData = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.CTandMRI).Select(x => x.Answer).FirstOrDefault(); + + // FDGPET + var FDGPETData = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.FDGPET).Select(x => x.Answer).FirstOrDefault(); + + var baseLineTaskId = await GetBaseLineTaskId(inDto); + // lastFDGPET + var lastFDGPETData = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LastFDGPET).Select(x => x.Answer).FirstOrDefault(); + + List data = new List() { + + //1、ND NE NE/NA ND + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.ND }), + }, + //2、ND/PD/CR/NE/PR/SD PMD PMD/CMR/PMR/NMR/NE/NA PMD/PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD}), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMD, }), + Column3=ReadingCommon.EnumToString(new List() {FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.PMDPD }), + }, + //3、ND/PD/CR/NE/PR/SD NE PMD PMD/PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD}), + Column2=ReadingCommon.EnumToString(new List() {FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMD, }), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.PMDPD }), + }, + //4、PD NE CMR/PMR/NMR/NE/NA PMD/PD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD}), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE, }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.PMDPD }), + }, + //5、NE NE NE/NA NE + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.NE }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.NE }), + }, + + //6、CR/PR/SD/NE/ND/PD CMR CMR/PMR/NMR/PMD/NE/NA CMR/CR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND,CTMRIOverallAssessment.PD }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.CMR }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.CMRCR }), + }, + //7、CR NE NE/NA CMR/CR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.CMRCR }), + }, + + //8、 CR、PR、SD、NE、ND NE CMR CMR/CR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.CMR,}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.CMRCR }), + }, + + + + + //9、ND/PD/CR/NE/PR/SD PMR PMD/CMR/PMR/NMR/NE/NA PMR/PR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMR }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE,FDGPETOverallAssessment.NA, }), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.PMRPR }), + }, + //10、PR NE NE/NA PMR/PR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PR }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.PMRPR }), + }, + //11、CR/PR/SD/NE/ND NE PMR PMR/PR + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMR}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.PMRPR }), + }, + //12、ND/PD/CR/NE/PR/SD NMR PMD/CMR/PMR/NMR/NE/NA NMR/SD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND,CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NMR }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR, FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.NMRSD }), + }, + //13、CR/PR/SD/ND/NE NE NMR NMR/SD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR, CTMRIOverallAssessment.PR, CTMRIOverallAssessment.SD, CTMRIOverallAssessment.ND, CTMRIOverallAssessment.NE }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NMR}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.NMRSD }), + }, + //14、SD NE NE/NA NMR/SD + new CalculationDto(){ + Column1=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.SD }), + Column2=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE }), + Column3=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}), + Column4=ReadingCommon.EnumToString(new List() { ImagingOverallAssessment_Lugano.NMRSD }), + }, + }; + + var resultdata = data.Where(x => + (x.NotEq.Contains(1) ? !x.Column1.Contains(CTandMRIData) : x.Column1.Contains(CTandMRIData) || x.Column1.Count() == 0) && + (x.NotEq.Contains(2) ? !x.Column2.Contains(FDGPETData) : x.Column2.Contains(FDGPETData) || x.Column2.Count() == 0) && + (x.NotEq.Contains(3) ? !x.Column3.Contains(lastFDGPETData) : x.Column3.Contains(lastFDGPETData) || x.Column3.Count() == 0)) + .Select(x => x.Column4.FirstOrDefault()) + .FirstOrDefault(); + return resultdata ?? string.Empty; + } \ No newline at end of file diff --git a/Lugano 2014/评估算法/PET5PS评分.cs b/Lugano 2014/评估算法/PET5PS评分.cs new file mode 100644 index 0000000..0126e40 --- /dev/null +++ b/Lugano 2014/评估算法/PET5PS评分.cs @@ -0,0 +1,24 @@ +if(如果没有PET) +{ + "NE"; +} +else if(本访视病灶的 max SUVmax(所有病灶中最大的)> 2 * 肝脏血池SUVmax) +{ + "5"; +} +else if(本访视病灶的SUVmax(所有病灶中最大的)>肝脏血池SUVmax) +{ + "4"; +} +else if(纵隔血池SUVmax<本访视点病灶的max SUVmax(所有病灶中最大的)≤1*肝脏血池SUVmax) +{ + "3"; +} +else if(本访视点病灶的SUVmax(所有病灶中最大的)<纵隔血池SUVmax) +{ + "2"; +} +else +{ + "";//原来是1这里改为空 +} \ No newline at end of file diff --git a/Lugano 2014/评估算法/与基线相比摄取值变化.cs b/Lugano 2014/评估算法/与基线相比摄取值变化.cs new file mode 100644 index 0000000..20be0c6 --- /dev/null +++ b/Lugano 2014/评估算法/与基线相比摄取值变化.cs @@ -0,0 +1,16 @@ +if(本访视无PET图像) +{ + "NE"; +} +else if(本访视PET评分 > 基线PET评分) +{ + "增大"; +} +else if(本访视PET评分 < 基线PET评分) +{ + "减小"; +} +else if(访视PET评分 = 基线PET评分) +{ + "不赋值,为空"; +} diff --git a/Lugano 2014/评估算法/普通靶病灶的疾病进展状态 - 前端.cs b/Lugano 2014/评估算法/普通靶病灶的疾病进展状态 - 前端.cs new file mode 100644 index 0000000..bb34272 --- /dev/null +++ b/Lugano 2014/评估算法/普通靶病灶的疾病进展状态 - 前端.cs @@ -0,0 +1,13 @@ +// LDi LDi= 当前病灶的长径 +// LDi LDi= 当前病灶的短径 +// PPD PPD= 当前病灶的PPD + +if( 15mm < 当前靶病灶LDi ≤20mm && 相比最低点PPD增加百分比 ≥50% && (相比PPD最低点LDi增加值 ≥5 mm || 相比PPD最低点SDi增加值≥5 mm) ) +{ + // 疾病进展 +} +else if( 当前靶病灶LDi>20 mm && 相比最低点PPD增加百分比 ≥50% (相比PPD最低点LDi增加值 ≥10 mm || 相比PPD最低点SDi增加值Sdi ≥10 mm)) +{ + // 疾病进展 +} + diff --git a/Lugano 2014/评估算法/脾脏状态.cs b/Lugano 2014/评估算法/脾脏状态.cs new file mode 100644 index 0000000..1cf2cd1 --- /dev/null +++ b/Lugano 2014/评估算法/脾脏状态.cs @@ -0,0 +1,42 @@ +初始值为:"无法评估" +if(0<当前垂直径≤130mm) +{ + "正常"; +} +else if(当前访视是基线) +{ + "肿大" +}else +{ + if(基线 垂直径> 130 mm && 与基线相比脾垂直径变化值≥10 mm && 与基线相比脾肿大增加的百分比 > 50%) + { + "显著增大"; + } + else if(基线 垂直径> 130 mm + && 当前访视的前面访视中 存在垂直径≤130mm + && 与最低点相比脾脏垂直径的增加值≥20 mm + && 当前垂直径 > 130 mm) + { + "显著增大"; + } + else if(基线垂直径≤130mm && 与基线相比脾垂直径变化值≥20 mm && 当前垂直径 > 130 mm) + { + "显著增大"; + } + else if(基线期 状态为“肿大” + && 与基线相比脾肿大增加的百分比 < -50%) + { + "部分缓解"; + } + else + { + "稳定"; + } +} + +注: +1、与基线相比脾肿大增加的百分比的计算方式: +(1)当前垂直径大于130,且基线垂直径大于130时,=[(当前垂直径-130)-(基线垂直径-130)]/(基线垂直径-130); +(2)当前垂直径小于等于130,或者基线垂直径小于等于130时,赋值NA + +2、与基线相比脾垂直径变化值的计算方式:当前访视脾脏垂直径-基线脾脏垂直径 diff --git a/Lugano 2014/评估算法/融合靶病灶的疾病进展状态 - 前端.cs b/Lugano 2014/评估算法/融合靶病灶的疾病进展状态 - 前端.cs new file mode 100644 index 0000000..517b429 --- /dev/null +++ b/Lugano 2014/评估算法/融合靶病灶的疾病进展状态 - 前端.cs @@ -0,0 +1,9 @@ +// LDi LDi= 当前病灶的长径 +// LDi LDi= 当前病灶的短径 +// PPD PPD= 当前病灶的PPD + +if( 15mm < 当前靶病灶LDi && 相比最低点PPD增加百分比 ≥50% ) +{ + // 疾病进展 +} + diff --git a/Lugano 2014/评估算法/靶病灶分裂主病灶的疾病进展状态.cs b/Lugano 2014/评估算法/靶病灶分裂主病灶的疾病进展状态.cs new file mode 100644 index 0000000..ce58efc --- /dev/null +++ b/Lugano 2014/评估算法/靶病灶分裂主病灶的疾病进展状态.cs @@ -0,0 +1,19 @@ +// LDi LDi= 主病灶加分裂病灶的长径之和 +// LDi LDi= 主病灶加分裂病灶的短径之和 +// PPD PPD= 主病灶加分裂病灶的PPD之和 + +if( 15mm < 当前靶病灶LDi≤20mm && 相比最低点PPD增加百分比 ≥50% && (相比PPD最低点LDi增加值 ≥5 mm || 相比PPD最低点SDi增加值≥5 mm) ) +{ + // 疾病进展 +} +else if( 当前靶病灶LDi>20 mm && 相比最低点PPD增加百分比 ≥50% (相比PPD最低点LDi增加值 ≥10 mm || 相比PPD最低点SDi增加值Sdi ≥10 mm)) +{ + // 疾病进展 +} +else if +( + if(之前是疾病进展) + { + // 改为存在 + } +) diff --git a/Lugano 2014/评估算法/靶病灶疾病进展状态.zip b/Lugano 2014/评估算法/靶病灶疾病进展状态.zip new file mode 100644 index 0000000..fbb2a96 Binary files /dev/null and b/Lugano 2014/评估算法/靶病灶疾病进展状态.zip differ diff --git a/Lugano 2014/评估算法/靶病灶融合主病灶的疾病进展状态.cs b/Lugano 2014/评估算法/靶病灶融合主病灶的疾病进展状态.cs new file mode 100644 index 0000000..c368c65 --- /dev/null +++ b/Lugano 2014/评估算法/靶病灶融合主病灶的疾病进展状态.cs @@ -0,0 +1,8 @@ +// LDi LDi= 当前病灶的长径 +// LDi LDi= 当前病灶的短径 +// PPD PPD= 当前病灶的PPD + +if( 15mm < 当前靶病灶LDi && 相比最低点PPD增加百分比 ≥50% ) +{ + // 疾病进展 +} diff --git a/Lugano 2014/评估算法/骨髓中是否存在局灶性 FDG亲和病灶的证据.cs b/Lugano 2014/评估算法/骨髓中是否存在局灶性 FDG亲和病灶的证据.cs new file mode 100644 index 0000000..3e1523c --- /dev/null +++ b/Lugano 2014/评估算法/骨髓中是否存在局灶性 FDG亲和病灶的证据.cs @@ -0,0 +1,8 @@ +if(不存在PET) +{ + "NE" +} +else +{ + "取骨髓中是否存在局灶性 FDG亲和病灶的证据 的结果" +} \ No newline at end of file diff --git a/Lugano 2014/阅片交互 - 病灶SUV测量-不可切换图像.pdf b/Lugano 2014/阅片交互 - 病灶SUV测量-不可切换图像.pdf new file mode 100644 index 0000000..93af7c3 Binary files /dev/null and b/Lugano 2014/阅片交互 - 病灶SUV测量-不可切换图像.pdf differ diff --git a/Lugano 2014/阅片交互 - 病灶SUV测量-不可切换图像.vsdx b/Lugano 2014/阅片交互 - 病灶SUV测量-不可切换图像.vsdx new file mode 100644 index 0000000..0d1f231 Binary files /dev/null and b/Lugano 2014/阅片交互 - 病灶SUV测量-不可切换图像.vsdx differ