diff --git a/Lugano/20231205 lugano病灶验证.xlsx b/Lugano/20231205 lugano病灶验证.xlsx new file mode 100644 index 0000000..c421668 Binary files /dev/null and b/Lugano/20231205 lugano病灶验证.xlsx differ diff --git a/Lugano/20231205-Lugano 2014_ECRF.xlsx b/Lugano/20231205-Lugano 2014_ECRF.xlsx new file mode 100644 index 0000000..cfdf0fd Binary files /dev/null and b/Lugano/20231205-Lugano 2014_ECRF.xlsx differ diff --git a/Lugano/20231205-Lugano 2014默认部位列表-确认版.xlsx b/Lugano/20231205-Lugano 2014默认部位列表-确认版.xlsx new file mode 100644 index 0000000..281392a Binary files /dev/null and b/Lugano/20231205-Lugano 2014默认部位列表-确认版.xlsx differ diff --git a/Lugano/20231205-Lugano2014 标准版阅片单元配置表格问题.xlsx b/Lugano/20231205-Lugano2014 标准版阅片单元配置表格问题.xlsx new file mode 100644 index 0000000..92f7826 Binary files /dev/null and b/Lugano/20231205-Lugano2014 标准版阅片单元配置表格问题.xlsx differ diff --git a/Lugano/20231205-lugano阅片标准优化需求.docx b/Lugano/20231205-lugano阅片标准优化需求.docx new file mode 100644 index 0000000..7b945f2 Binary files /dev/null and b/Lugano/20231205-lugano阅片标准优化需求.docx differ diff --git a/Lugano/20231205-lugano阅片标准需求.docx b/Lugano/20231205-lugano阅片标准需求.docx new file mode 100644 index 0000000..cfa3098 Binary files /dev/null and b/Lugano/20231205-lugano阅片标准需求.docx differ diff --git a/Lugano/评估算法/1、靶病灶评估.cs b/Lugano/评估算法/1、靶病灶评估.cs new file mode 100644 index 0000000..b5813e9 --- /dev/null +++ b/Lugano/评估算法/1、靶病灶评估.cs @@ -0,0 +1,30 @@ + +"默认SD" + +if(当前访视是基线) +{ + "NA"; +} +else if(基线未选择靶病灶) +{ + "ND"; +} +else if(任一单个病灶进展即可) +{ + "PD"; +} +else if(当前访视存在至少一个状态为“不可评估”的靶病灶) +{ + "NE"; +} +else if(当前访视非淋巴结靶病灶全部消失 && (当前访视淋巴结靶病灶的状态全部变为“消失” 或者 "太小" )) +{ + "CR"; +} +else if(与基线相比SPD变化的百分比 <=- 50% ) +{ + "PR"; +} + +类似条件: +1、(当前访视非淋巴结靶病灶全部消失&&当前访视淋巴结靶病灶的状态全部变为“消失”)||(基线未选非淋巴结靶病灶&&当前访视淋巴结靶病灶的状态全部变为“消失”)||(当前访视非淋巴结靶病灶全部消失&&基线为选择淋巴结靶病灶”) diff --git a/Lugano/评估算法/2、非靶病灶评估.cs b/Lugano/评估算法/2、非靶病灶评估.cs new file mode 100644 index 0000000..173eed8 --- /dev/null +++ b/Lugano/评估算法/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/评估算法/3、新病灶评估.cs b/Lugano/评估算法/3、新病灶评估.cs new file mode 100644 index 0000000..02bb309 --- /dev/null +++ b/Lugano/评估算法/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/评估算法/4、脾脏评估.cs b/Lugano/评估算法/4、脾脏评估.cs new file mode 100644 index 0000000..013e2da --- /dev/null +++ b/Lugano/评估算法/4、脾脏评估.cs @@ -0,0 +1 @@ +return "脾脏状态"; \ No newline at end of file diff --git a/Lugano/评估算法/5、肝脏评估.cs b/Lugano/评估算法/5、肝脏评估.cs new file mode 100644 index 0000000..1cf823a --- /dev/null +++ b/Lugano/评估算法/5、肝脏评估.cs @@ -0,0 +1 @@ +return "肝脏状态"; \ No newline at end of file diff --git a/Lugano/评估算法/6、CMRI总体评估实现代码.cs b/Lugano/评估算法/6、CMRI总体评估实现代码.cs new file mode 100644 index 0000000..ea3812d --- /dev/null +++ b/Lugano/评估算法/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/评估算法/6、CTMRI总体评估-对应表.png b/Lugano/评估算法/6、CTMRI总体评估-对应表.png new file mode 100644 index 0000000..cc3fb8d Binary files /dev/null and b/Lugano/评估算法/6、CTMRI总体评估-对应表.png differ diff --git a/Lugano/评估算法/7、FDG-PET评估-对应表.png b/Lugano/评估算法/7、FDG-PET评估-对应表.png new file mode 100644 index 0000000..4c7e1c4 Binary files /dev/null and b/Lugano/评估算法/7、FDG-PET评估-对应表.png differ diff --git a/Lugano/评估算法/7、FDG-PET评估实现代码.cs b/Lugano/评估算法/7、FDG-PET评估实现代码.cs new file mode 100644 index 0000000..2dace19 --- /dev/null +++ b/Lugano/评估算法/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/评估算法/8、影像学整体肿瘤评估-对应表更新.png b/Lugano/评估算法/8、影像学整体肿瘤评估-对应表更新.png new file mode 100644 index 0000000..b2fd2dc Binary files /dev/null and b/Lugano/评估算法/8、影像学整体肿瘤评估-对应表更新.png differ diff --git a/Lugano/评估算法/8、影像学整体肿瘤评估代码.cs b/Lugano/评估算法/8、影像学整体肿瘤评估代码.cs new file mode 100644 index 0000000..78b9aa1 --- /dev/null +++ b/Lugano/评估算法/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/评估算法/PET5PS评分.cs b/Lugano/评估算法/PET5PS评分.cs new file mode 100644 index 0000000..0126e40 --- /dev/null +++ b/Lugano/评估算法/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/评估算法/与基线相比摄取值变化.cs b/Lugano/评估算法/与基线相比摄取值变化.cs new file mode 100644 index 0000000..589c68f --- /dev/null +++ b/Lugano/评估算法/与基线相比摄取值变化.cs @@ -0,0 +1,16 @@ +if(本访视无PET图像) +{ + "NE"; +} +else if(本访视PET评分 > 基线PET评分) +{ + "增大"; +} +else if(本访视PET评分 < 基线PET评分) +{ + "减小"; +} +else if(访视PET评分 = 基线PET评分) +{ + "无明显变化"; +} diff --git a/Lugano/评估算法/普通靶病灶的疾病进展状态 - 前端.cs b/Lugano/评估算法/普通靶病灶的疾病进展状态 - 前端.cs new file mode 100644 index 0000000..bb34272 --- /dev/null +++ b/Lugano/评估算法/普通靶病灶的疾病进展状态 - 前端.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/评估算法/脾脏状态.cs b/Lugano/评估算法/脾脏状态.cs new file mode 100644 index 0000000..76b28fd --- /dev/null +++ b/Lugano/评估算法/脾脏状态.cs @@ -0,0 +1,44 @@ +if(当前垂直径 ==0) +{ + "无法评估" +}else if(当前垂直径≤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/评估算法/融合靶病灶的疾病进展状态 - 前端.cs b/Lugano/评估算法/融合靶病灶的疾病进展状态 - 前端.cs new file mode 100644 index 0000000..517b429 --- /dev/null +++ b/Lugano/评估算法/融合靶病灶的疾病进展状态 - 前端.cs @@ -0,0 +1,9 @@ +// LDi LDi= 当前病灶的长径 +// LDi LDi= 当前病灶的短径 +// PPD PPD= 当前病灶的PPD + +if( 15mm < 当前靶病灶LDi && 相比最低点PPD增加百分比 ≥50% ) +{ + // 疾病进展 +} + diff --git a/Lugano/评估算法/靶病灶分裂主病灶的疾病进展状态.cs b/Lugano/评估算法/靶病灶分裂主病灶的疾病进展状态.cs new file mode 100644 index 0000000..ce58efc --- /dev/null +++ b/Lugano/评估算法/靶病灶分裂主病灶的疾病进展状态.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/评估算法/靶病灶融合主病灶的疾病进展状态.cs b/Lugano/评估算法/靶病灶融合主病灶的疾病进展状态.cs new file mode 100644 index 0000000..c368c65 --- /dev/null +++ b/Lugano/评估算法/靶病灶融合主病灶的疾病进展状态.cs @@ -0,0 +1,8 @@ +// LDi LDi= 当前病灶的长径 +// LDi LDi= 当前病灶的短径 +// PPD PPD= 当前病灶的PPD + +if( 15mm < 当前靶病灶LDi && 相比最低点PPD增加百分比 ≥50% ) +{ + // 疾病进展 +} diff --git a/Lugano/评估算法/骨髓中是否存在局灶性 FDG亲和病灶的证据.cs b/Lugano/评估算法/骨髓中是否存在局灶性 FDG亲和病灶的证据.cs new file mode 100644 index 0000000..3e1523c --- /dev/null +++ b/Lugano/评估算法/骨髓中是否存在局灶性 FDG亲和病灶的证据.cs @@ -0,0 +1,8 @@ +if(不存在PET) +{ + "NE" +} +else +{ + "取骨髓中是否存在局灶性 FDG亲和病灶的证据 的结果" +} \ No newline at end of file diff --git a/Lugano/阅片交互 - 病灶SUV测量-不可切换图像.pdf b/Lugano/阅片交互 - 病灶SUV测量-不可切换图像.pdf new file mode 100644 index 0000000..93af7c3 Binary files /dev/null and b/Lugano/阅片交互 - 病灶SUV测量-不可切换图像.pdf differ diff --git a/Lugano/阅片交互 - 病灶SUV测量-不可切换图像.vsdx b/Lugano/阅片交互 - 病灶SUV测量-不可切换图像.vsdx new file mode 100644 index 0000000..0d1f231 Binary files /dev/null and b/Lugano/阅片交互 - 病灶SUV测量-不可切换图像.vsdx differ diff --git a/PCWG3/20230210-PCWG3默认部位列表-确认版.xlsx b/PCWG3/20230210-PCWG3默认部位列表-确认版.xlsx new file mode 100644 index 0000000..17ef86a Binary files /dev/null and b/PCWG3/20230210-PCWG3默认部位列表-确认版.xlsx differ diff --git a/PCWG3/20230210PCWG3阅片单元配置表格问题及展示页面.xlsx b/PCWG3/20230210PCWG3阅片单元配置表格问题及展示页面.xlsx new file mode 100644 index 0000000..13c0dc9 Binary files /dev/null and b/PCWG3/20230210PCWG3阅片单元配置表格问题及展示页面.xlsx differ diff --git a/PCWG3/20230211PCWG3病灶验证.xlsx b/PCWG3/20230211PCWG3病灶验证.xlsx new file mode 100644 index 0000000..3f5487b Binary files /dev/null and b/PCWG3/20230211PCWG3病灶验证.xlsx differ diff --git a/PCWG3/20230222-PCWG3_ECRF.xlsx b/PCWG3/20230222-PCWG3_ECRF.xlsx new file mode 100644 index 0000000..80b320c Binary files /dev/null and b/PCWG3/20230222-PCWG3_ECRF.xlsx differ diff --git a/RECIST1.1 BM/20230314RECIST 1.1-BM_ECRF.xlsx b/RECIST1.1 BM/20230314RECIST 1.1-BM_ECRF.xlsx new file mode 100644 index 0000000..11099f8 Binary files /dev/null and b/RECIST1.1 BM/20230314RECIST 1.1-BM_ECRF.xlsx differ diff --git a/RECIST1.1 BM/20230314病灶验证.xlsx b/RECIST1.1 BM/20230314病灶验证.xlsx new file mode 100644 index 0000000..251233d Binary files /dev/null and b/RECIST1.1 BM/20230314病灶验证.xlsx differ diff --git a/RECIST1.1 BM/20230314阅片单元配置表格问题及展示页面-RECIST1.1.xlsx b/RECIST1.1 BM/20230314阅片单元配置表格问题及展示页面-RECIST1.1.xlsx new file mode 100644 index 0000000..d8e24f6 Binary files /dev/null and b/RECIST1.1 BM/20230314阅片单元配置表格问题及展示页面-RECIST1.1.xlsx differ diff --git a/RECIST1.1 BM/RECIST1.1-BM默认部位列表-确认版20230322.xlsx b/RECIST1.1 BM/RECIST1.1-BM默认部位列表-确认版20230322.xlsx new file mode 100644 index 0000000..2d98875 Binary files /dev/null and b/RECIST1.1 BM/RECIST1.1-BM默认部位列表-确认版20230322.xlsx differ diff --git a/RECIST1.1 BM/疗效评估算法/20230314-RECIST1.1-BM疗效对照表v1.0-确认版.xlsx b/RECIST1.1 BM/疗效评估算法/20230314-RECIST1.1-BM疗效对照表v1.0-确认版.xlsx new file mode 100644 index 0000000..f56b012 Binary files /dev/null and b/RECIST1.1 BM/疗效评估算法/20230314-RECIST1.1-BM疗效对照表v1.0-确认版.xlsx differ diff --git a/RECIST1.1 BM/疗效评估算法/20230314靶病灶疗效评估算法-确认版.cs b/RECIST1.1 BM/疗效评估算法/20230314靶病灶疗效评估算法-确认版.cs new file mode 100644 index 0000000..4991962 --- /dev/null +++ b/RECIST1.1 BM/疗效评估算法/20230314靶病灶疗效评估算法-确认版.cs @@ -0,0 +1,47 @@ +靶病灶疗效评估算法-20230314确认版本: +if(基线没有靶病灶) +{ + 靶病灶疗效为 ND +}else +{ + 初始化靶病灶疗效为 SD + + if (与基线期SOD相比减小≥30 %) + { + 靶病灶疗效为 PR + } + + if (非淋巴结靶病灶长径之和 == 0) + { + 靶病灶疗效为 CR + } + + if (有被评估为NE的单个靶病灶) + { + 靶病灶疗效为 NE + } + + if (最低点SOD > 0) + { + if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) + { + 靶病灶疗效为 PD + } + } + else + { + //进入该分支最低点SOD=0 + if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) + { + 靶病灶疗效为PD + } + } + + if(上次访视点评估是CR) + { + if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + { + 靶病灶疗效为 PD + } + } +} diff --git a/RECIST1.1/20230202-RECIST1.1默认部位列表-确认版.xlsx b/RECIST1.1/20230202-RECIST1.1默认部位列表-确认版.xlsx new file mode 100644 index 0000000..281392a Binary files /dev/null and b/RECIST1.1/20230202-RECIST1.1默认部位列表-确认版.xlsx differ diff --git a/RECIST1.1/20230202RECIST 1.1_ECRF.xlsx b/RECIST1.1/20230202RECIST 1.1_ECRF.xlsx new file mode 100644 index 0000000..4696da4 Binary files /dev/null and b/RECIST1.1/20230202RECIST 1.1_ECRF.xlsx differ diff --git a/RECIST1.1/20230202病灶验证.xlsx b/RECIST1.1/20230202病灶验证.xlsx new file mode 100644 index 0000000..b177d81 Binary files /dev/null and b/RECIST1.1/20230202病灶验证.xlsx differ diff --git a/RECIST1.1/20230210阅片单元配置表格问题及展示页面-RECIST1.1.xlsx b/RECIST1.1/20230210阅片单元配置表格问题及展示页面-RECIST1.1.xlsx new file mode 100644 index 0000000..fb99391 Binary files /dev/null and b/RECIST1.1/20230210阅片单元配置表格问题及展示页面-RECIST1.1.xlsx differ diff --git a/RECIST1.1/疗效评估算法/20230202-RECIST1.1疗效对照表v1.0-确认版.xlsx b/RECIST1.1/疗效评估算法/20230202-RECIST1.1疗效对照表v1.0-确认版.xlsx new file mode 100644 index 0000000..9ae76f5 Binary files /dev/null and b/RECIST1.1/疗效评估算法/20230202-RECIST1.1疗效对照表v1.0-确认版.xlsx differ diff --git a/RECIST1.1/疗效评估算法/20230306靶病灶疗效评估算法-确认版.cs b/RECIST1.1/疗效评估算法/20230306靶病灶疗效评估算法-确认版.cs new file mode 100644 index 0000000..0aef4bb --- /dev/null +++ b/RECIST1.1/疗效评估算法/20230306靶病灶疗效评估算法-确认版.cs @@ -0,0 +1,51 @@ +靶病灶疗效评估算法-20230306确认版本: +if(基线没有靶病灶) +{ + 靶病灶疗效为 ND +}else +{ + 初始化靶病灶疗效为 SD + + if (与基线期SOD相比减小≥30 %) + { + 靶病灶疗效为 PR + } + + if (非淋巴结靶病灶长径之和 == 0 并且所有淋巴结靶病灶的短径 < 10且淋巴结非靶病灶全部消失) + { + 靶病灶疗效为 CR + } + + if (有被评估为NE的单个靶病灶) + { + 靶病灶疗效为 NE + } + + if (最低点SOD > 0) + { + if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) + { + 靶病灶疗效为 PD + } + } + else + { + //进入该分支最低点SOD=0 + if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) + { + 靶病灶疗效为PD + } + } + + if(上次访视点评估是CR) + { + if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) + { + 靶病灶疗效为 PD + } + if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + { + 靶病灶疗效为 PD + } + } +} diff --git a/RECIST1.1/算法验证数据.xlsx b/RECIST1.1/算法验证数据.xlsx new file mode 100644 index 0000000..d4edbe0 Binary files /dev/null and b/RECIST1.1/算法验证数据.xlsx differ diff --git a/iRECIST/20230510-更新-RECIST1.1转换为iRECSIT操作.pptx b/iRECIST/20230510-更新-RECIST1.1转换为iRECSIT操作.pptx new file mode 100644 index 0000000..2ace8cd Binary files /dev/null and b/iRECIST/20230510-更新-RECIST1.1转换为iRECSIT操作.pptx differ diff --git a/iRECIST/202306019病灶验证.xlsx b/iRECIST/202306019病灶验证.xlsx new file mode 100644 index 0000000..185c14f Binary files /dev/null and b/iRECIST/202306019病灶验证.xlsx differ diff --git a/iRECIST/iRECIST标准版阅片单元配置表格问题及相关流程.xlsx b/iRECIST/iRECIST标准版阅片单元配置表格问题及相关流程.xlsx new file mode 100644 index 0000000..d6d844a Binary files /dev/null and b/iRECIST/iRECIST标准版阅片单元配置表格问题及相关流程.xlsx differ diff --git a/iRECIST/疗效评估算法/IRECIST新非靶病灶评估.cs b/iRECIST/疗效评估算法/IRECIST新非靶病灶评估.cs new file mode 100644 index 0000000..4330417 --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIST新非靶病灶评估.cs @@ -0,0 +1,23 @@ +if(所有新非靶病灶消失或一直不存在任何新非靶病灶时评估为该结果) +{ + 新非靶病灶疗效为 ND +} +else if (上一访视新非靶病灶评估为“iUPD” && 满足任一新非靶病灶状态为“增大”) +{ + 新非靶病灶疗效为 iCPD +} +else if (上一访视新非靶病灶评估为“iCPD”&& 有"存在"状态的新非靶病灶) +{ + 新非靶病灶疗效为 iCPD +} +else if (当有存在状态的新非靶病灶) +{ + 新非靶病灶疗效为 iUPD +} +else if (至少有一个新非靶病无法评估) +{ + 新非靶病灶疗效为 NE +}else +{ + //错误级别日志:项目、标准、受试者、阅片人、任务。当前新非靶病灶的病灶数据输出: +} \ No newline at end of file diff --git a/iRECIST/疗效评估算法/IRECIST新靶病灶评估.cs b/iRECIST/疗效评估算法/IRECIST新靶病灶评估.cs new file mode 100644 index 0000000..269ed08 --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIST新靶病灶评估.cs @@ -0,0 +1,23 @@ +if(所有新靶病灶消失或一直不存在任何新靶病灶) +{ + 新靶病灶疗效为 ND +} +else if (上一访视新靶病灶评估为“iUPD” && iSOD的增加值>=5mm) //与最近一次新靶病灶评估为iUPD的访视相比本次访视iSOD增加不小于5mm +{ + 新靶病灶疗效为 iCPD +} +else if (上一访视新靶病灶评估为“iCPD”&& (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶))//区分了淋巴结新靶病灶和非淋巴结新靶病灶 +{ + 新靶病灶疗效为 iCPD +} +else if (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶)//区分了淋巴结新靶病灶和非淋巴结新靶病灶 +{ + 新靶病灶疗效为 iUPD +} +else if (至少有一个新靶病无法评估) +{ + 新靶病灶疗效为 NE +}else +{ + //错误级别日志:项目、标准、受试者、阅片人、任务。输出新靶病灶数据: +} diff --git a/iRECIST/疗效评估算法/IRECIST非靶病灶评估.cs b/iRECIST/疗效评估算法/IRECIST非靶病灶评估.cs new file mode 100644 index 0000000..75381b5 --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIST非靶病灶评估.cs @@ -0,0 +1,29 @@ +if(基线没有非靶病灶) +{ + 非靶病灶疗效为 ND +} +else if (上次非靶病灶评估结果为iUPD && (任一非靶病灶状态评估为“进一步增大(iCPD)||出现至少1个上一访视未评估为“显著增大(iUPD)”的病灶本次访视评估为“显著增大(iUPD)”)) +{ + 非靶病灶疗效为 iCPD +} +else if (上次非靶病灶评估结果为iCPD && 任一非靶病灶状态评估为“进一步增大(iCPD)”或“显著增大(iUPD)”) +{ + 非靶病灶疗效为 iCPD +} +else if (本次访视非靶病灶满足RECIST1.1的PD条件)//请注意RECIST1.1中PD条件为:任一非靶病灶本次访视评估为“显著增大”,iRECIST中,应修改为任一非靶病灶本次访视评估为“显著增大(iUPD)” +{ + 非靶病灶疗效为 iUPD +} +else if (有任一非靶病灶为NE状态) +{ + 非靶病灶疗效为 NE +} +else if (全部非靶病灶均为“消失”状态) +{ + 非靶病灶疗效为 iCR +} +else +{ + 非靶病灶疗效为 iNN +} + \ No newline at end of file diff --git a/iRECIST/疗效评估算法/IRECIST靶病灶评估.cs b/iRECIST/疗效评估算法/IRECIST靶病灶评估.cs new file mode 100644 index 0000000..c19cf6c --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIST靶病灶评估.cs @@ -0,0 +1,69 @@ + iUPD连续时,与最近一次靶病灶评估为iUPD的访视相比本次访视SOD增加值 = NA; + SOD增加值>=5mm + + + if(基线没有靶病灶) + { + 靶病灶疗效为 ND + } + else if (上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件) + { + 靶病灶疗效为 ICPD + } + else if (上一访视评估为iUPD&& SOD增加值>=5mm)//修改条件为:与最近一次靶病灶评估为iUPD的访视相比本次访视SOD增加不小于5mm + { + 靶病灶疗效为 ICPD + iupd连续时,与最近一次靶病灶评估为iUPD的访视相比本次访视SOD增加值 =SOD增加值; + } + else if (本次访靶病灶视满足RECIST1.1的PD条件) + { + 靶病灶疗效为 iUPD + } else if (有任一靶病灶为NE状态) + { + 靶病灶疗效为 NE + } + else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中淋巴结病灶全部消失)//增加条件为:非靶病灶中淋巴结病灶全部消失 + { + 靶病灶疗效为 iCR + } + else if (与基线期SOD相比减小≥30 % ||(所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失))//增加排除iCR条件:所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失 + { + 靶病灶疗效为 iPR + } + else + { + 靶病灶疗效为 iSD + } + + 更新: + if(基线没有靶病灶) + { + 靶病灶疗效为 ND + } + else if (上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件) + { + 靶病灶疗效为 ICPD + } else if (本次访靶病灶视满足RECIST1.1的PD条件) + { + 靶病灶疗效为 iUPD + if (上一访视评估为iUPD&& SOD增加值>=5mm)//修改条件为:与最近一次靶病灶评估为iUPD的访视相比本次访视SOD增加不小于5mm + { + 靶病灶疗效为 ICPD + } + } else if (有任一靶病灶为NE状态) + { + 靶病灶疗效为 NE + } + else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中淋巴结病灶全部消失)//增加条件为:非靶病灶中淋巴结病灶全部消失 + { + 靶病灶疗效为 iCR + } + else if (与基线期SOD相比减小≥30 % ||(所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失))//增加排除iCR条件:所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失 + { + 靶病灶疗效为 iPR + } + else + { + 靶病灶疗效为 iSD + } + \ No newline at end of file diff --git a/iRECIST/疗效评估算法/IRECIS其它既往新病灶评估.cs b/iRECIST/疗效评估算法/IRECIS其它既往新病灶评估.cs new file mode 100644 index 0000000..e46cec4 --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIS其它既往新病灶评估.cs @@ -0,0 +1,19 @@ +if(所有其它既往新病灶消失或一直不存在任何其它既往新病灶) +{ + 其它既往新病灶疗效为 ND +} +else if (存在状态为“明确”的其它既往新病灶) +{ + 其它既往新病灶疗效为 iUPD +} +else if (至少有一个其它既往新病灶无法评估) +{ + 其它既往新病灶疗效为 NE +} +else if (至少有一个其它既往新病灶为疑似状态) +{ + 其它既往新病灶疗效为 疑似 +}else +{ + //错误级别日志:项目、标准、受试者、阅片人、任务。输出其它既往新病灶数据: +} \ No newline at end of file diff --git a/iRECIST/疗效评估算法/IRECIS整体肿瘤评估.cs b/iRECIST/疗效评估算法/IRECIS整体肿瘤评估.cs new file mode 100644 index 0000000..b1c8700 --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIS整体肿瘤评估.cs @@ -0,0 +1,59 @@ +if(上个访视整体肿瘤评估结果为iCPD&&当前访视靶病灶评估、非靶病灶评估、新病灶整体肿瘤评估任一项为iUPD或iCPD) //条件更新 +{ + 疗效为 iCPD +} +else if (上个访视整体肿瘤评估结果为iUPD&&(靶病灶评估、非靶病灶评估和新病灶整体评估从上个访视的评估结果iUPD变成本次访视的评估结果iCPD||靶病灶评估、非靶病灶评估和新病灶整体评估从上个访视的评估结果非iUPD变成本次访视的评估结果iUPD))//条件更新 +{ + 疗效为 iCPD +} +else if (靶病灶评估为iUPD || 非靶病灶评估为iUPD || 新病灶评估为iUPD) +{ + 疗效为 iUPD +} +else if ((靶病灶评估为iCR && 非靶病灶评估为iCR && 新病灶评估为ND)|| (靶病灶评估为ND && 非靶病灶评估为iCR && 新病灶评估为ND) || (靶病灶评估为iCR && 非靶病灶评估为ND && 新病灶评估为ND)) +{ + 疗效为 iCR +} +else if (靶病灶评估为iPR && 非靶病灶评估为iCR,iNN,NE或ND && 新病灶评估为ND或疑似或NE) +{ + 疗效为 iPR +} +else if (靶病灶评估为iCR && 非靶病灶评估为iNN或NE && 新病灶评估为ND或疑似或NE) +{ + 疗效为 iPR +} +else if (靶病灶评估为iCR && 非靶病灶评估为iCR或ND && 新病灶评估为疑似或NE) +{ + 疗效为 iPR +} +else if (靶病灶评估为ND && 非靶病灶评估为iCR && 新病灶评估为疑似或NE) +{ + 疗效为 iPR +} +else if (靶病灶评估为iSD && 非靶病灶评估为iCR,iNN,NE或ND && 新病灶评估为ND或疑似或NE) +{ + 疗效为 iSD +} +else if (靶病灶评估为ND && 非靶病灶评估为iNN && 新病灶评估为ND或疑似或NE) +{ + 疗效为 iNN +} +else if (靶病灶评估为ND && 非靶病灶评估为ND && 新病灶评估为ND或疑似) +{ + 疗效为 ND +} +else if (靶病灶评估为NE && 非靶病灶评估为iCR,iNN,NE或ND && 新病灶评估为ND或疑似或NE) +{ + 疗效为 NE +} +else if (靶病灶评估为ND && 非靶病灶评估为NE && 新病灶评估为ND或疑似或NE) +{ + 疗效为 NE +} +else if (靶病灶评估为ND && 非靶病灶评估为ND && 新病灶评估为NE) +{ + 疗效为 NE +}else +{ + //错误级别日志:项目、标准、受试者、阅片人、任务。输出靶病灶、非靶病灶、新病灶的评估结果: +} diff --git a/iRECIST/疗效评估算法/IRECIS新病灶评估.cs b/iRECIST/疗效评估算法/IRECIS新病灶评估.cs new file mode 100644 index 0000000..1ae47e5 --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIS新病灶评估.cs @@ -0,0 +1,43 @@ +if(新靶病灶为ND&&新非靶病灶为ND&&其它既往新病灶为ND&&不存在触发iRECIST后新病灶) +{ + 疗效为 ND +} +else if (新靶病灶为iCPD||新非靶病灶为iCPD) +{ + 疗效为 iCPD +} +else if (前一访视新病灶评估为iCPD && (新靶病灶有存在病灶 || 新非靶病灶有存在状态病灶 || 其它既往新病灶有明确的病灶 || 触发iRECIST后新病灶有明确病灶)) +{ + 疗效为 iCPD +} +else if (前一访视新病灶评估为iUPD && 新靶病灶上个访视评估为NE,本次访视评估为iUPD) +{ + 疗效为 iCPD +} +else if (前一访视新病灶评估为iUPD && 新非靶病灶上个访视评估为NE,本次访视评估为iUPD) +{ + 疗效为 iCPD +} +else if (前一访视新病灶评估为iUPD && 其它既往新病灶上个访视评估为NE或疑似,本次访视评估为iUPD) +{ + 疗效为 iCPD +} +else if (前一访视新病灶评估为iUPD && 触发iRECIST后新病灶评估上个访视评估为NE或否或疑似,本次访视评估为是) +{ + 疗效为 iCPD +} +else if (新靶病灶评估为iUPD || 新非靶病灶评估为iUPD || 其它既往新病灶评估为iUPD || 触发iRECIST后新病灶评估上个访视评估为是) +{ + 疗效为 iUPD +} +else if (新靶病灶、新非靶病灶、其它既往新病灶、触发iRECIST后的新病灶任一项评估为NE) +{ + 疗效为 NE +} +else if (其它既往新病灶或触发iRECIST后新病灶评估为“疑似”) +{ + 疗效为 疑似 +}else +{ + //错误级别日志:项目、标准、受试者、阅片人、任务。输出新病灶数据: +} \ No newline at end of file diff --git a/iRECIST/疗效评估算法/IRECIS触发iRECIST后新病灶评估.cs b/iRECIST/疗效评估算法/IRECIS触发iRECIST后新病灶评估.cs new file mode 100644 index 0000000..5b218e7 --- /dev/null +++ b/iRECIST/疗效评估算法/IRECIS触发iRECIST后新病灶评估.cs @@ -0,0 +1,16 @@ +if(出现至少1个“明确”状态的触发iRECIST后新病灶) +{ + 触发iRECIST后新病灶疗效为 是 +} +else if (只要有一个触发iRECIST后新病灶评估为NE) +{ + 触发iRECIST后新病灶疗效为 NE +} +else if (只要有一个触发iRECIST后新病灶评估为疑似) +{ + 触发iRECIST后新病灶疗效为 疑似 +} +else +{ + 触发iRECIST后新病灶疗效为 否 +} \ No newline at end of file