From c39a76d70f0657ffebc374c1824f88f0aa640e4a Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 14 Apr 2025 22:39:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../a8k/app/a8kproj/A8kIdCardDataParseService.java | 14 +- .../a8k/app/a8kproj/A8kReactionResultComputer.java | 184 ----------------- .../java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java | 159 --------------- .../a8k/app/a8kproj/optalgo/type/A8kOptPeak.java | 44 ----- .../a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java | 56 ------ .../a8kproj/optalgo/type/LineProcessContext.java | 22 --- .../a8k/app/a8kproj/optalgo/type/LinearResult.java | 6 - .../app/a8kproj/optalgo/type/LinearResultSeq.java | 6 - .../a8kproj/optalgo/type/OptAlgoAnalysResult.java | 46 ----- .../a8k/app/a8kproj/optalgo/type/OptAlgoError.java | 9 - .../java/a8k/app/a8kproj/optalgo/type/OptCfg.java | 5 - .../a8kproj/optalgo/type/OptProcessContext.java | 7 - .../app/a8kproj/optalgo/type/OptScanResult.java | 15 -- .../app/a8kproj/optalgo/type/PeakFindState.java | 6 - .../app/a8kproj/optalgo/utils/A8kOptAlgoUtils.java | 32 --- .../a8kproj/optalgo/utils/A8kOptGainAdjuster.java | 39 ---- .../a8k/app/a8kproj/optalgo/utils/BasicAlgo.java | 87 -------- .../java/a8k/app/a8kproj/optalgo/utils/Filter.java | 38 ---- .../a8k/app/a8kproj/optalgo/utils/LeastSquare.java | 72 ------- .../a8k/app/a8kproj/optalgo/utils/SubSampling.java | 26 --- .../app/a8kproj/optalgo/utils/SupperSampling.java | 30 --- .../a8kproj/optalgo/version/OptAlogVersion.java | 5 - .../a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java | 64 ------ .../a8k/app/a8kproj/optanalyzer/OptChecker.java | 61 ------ .../a8kproj/optanalyzer/PeakDivisionComputer.java | 26 --- .../app/a8kproj/optanalyzer/PeakNameAssigner.java | 48 ----- .../optanalyzer/context/OptAnalyzeContext.java | 28 --- .../exception/A8kOptProcessException.java | 13 -- src/main/java/a8k/app/a8ktype/opttype/A8kOptX.java | 31 --- .../a8k/app/a8ktype/opttype/OptScanDirection.java | 10 - .../java/a8k/app/a8ktype/opttype/PeakDivision.java | 18 -- .../java/a8k/app/a8ktype/opttype/PeakName.java | 9 - .../app/a8ktype/opttype/ReactionResultStatus.java | 52 ----- .../a8k/app/a8ktype/state/ProjectTaskContext.java | 6 +- .../java/a8k/app/a8ktype/type/ReactionResult.java | 4 +- src/main/java/a8k/app/dao/type/OptCfg.java | 2 +- src/main/java/a8k/app/dao/type/OptRawScanData.java | 2 +- .../java/a8k/app/dao/type/ProjExtInfoCard.java | 2 +- .../java/a8k/app/dao/type/ProjectBaseInfo.java | 2 +- src/main/java/a8k/app/dao/type/ReactionReport.java | 4 +- .../a8k/app/dao/type/a8kidcard/A8kNormalFn.java | 43 ---- .../app/dao/type/a8kidcard/A8kOptFnFormula.java | 21 -- .../a8k/app/dao/type/a8kidcard/A8kPiecewiseFn.java | 76 ------- .../app/dao/type/a8kidcard/A8kResultBuilderFn.java | 57 ------ .../dao/type/a8kidcard/A8kResultUnitConverter.java | 44 ----- .../app/dao/type/a8kidcard/zenum/A8kFnType.java | 21 -- .../app/dao/type/a8kidcard/zenum/A8kOptType.java | 6 - .../type/a8kidcard/zenum/A8kReactionFlowType.java | 41 ---- .../dao/type/a8kidcard/zenum/A8kResultUnit.java | 73 ------- .../a8k/app/hardware/driver/OptModuleDriver.java | 2 +- .../a8k/app/hardware/utils/OptGainConvert.java | 2 +- .../java/a8k/app/optalgo/A8kOptCurveAnalyzer.java | 160 +++++++++++++++ src/main/java/a8k/app/optalgo/A8kPeakAnalyzer.java | 218 +++++++++++++++++++++ src/main/java/a8k/app/optalgo/README.md | 8 + src/main/java/a8k/app/optalgo/algo/BasicAlgo.java | 87 ++++++++ .../java/a8k/app/optalgo/algo/LeastSquare.java | 72 +++++++ .../java/a8k/app/optalgo/algo/SubSampling.java | 26 +++ .../java/a8k/app/optalgo/algo/SupperSampling.java | 30 +++ src/main/java/a8k/app/optalgo/type/A8kOptPeak.java | 42 ++++ .../java/a8k/app/optalgo/type/A8kOptPeakInfo.java | 25 +++ .../java/a8k/app/optalgo/type/A8kOptPeaks.java | 55 ++++++ .../app/optalgo/type/A8kOptProcessException.java | 11 ++ src/main/java/a8k/app/optalgo/type/A8kOptX.java | 31 +++ .../java/a8k/app/optalgo/type/LinearResult.java | 6 + .../a8k/app/optalgo/type/OptScanDirection.java | 10 + .../java/a8k/app/optalgo/type/OptScanResult.java | 15 ++ .../java/a8k/app/optalgo/type/PeakDivision.java | 18 ++ .../java/a8k/app/optalgo/type/PeakFindState.java | 6 + src/main/java/a8k/app/optalgo/type/PeakName.java | 9 + .../a8k/app/optalgo/type/ReactionResultStatus.java | 52 +++++ .../app/optalgo/type/a8kidcard/A8kNormalFn.java | 43 ++++ .../optalgo/type/a8kidcard/A8kOptFnFormula.java | 21 ++ .../app/optalgo/type/a8kidcard/A8kPiecewiseFn.java | 76 +++++++ .../optalgo/type/a8kidcard/A8kResultBuilderFn.java | 57 ++++++ .../type/a8kidcard/A8kResultUnitConverter.java | 44 +++++ .../optalgo/type/a8kidcard/zenum/A8kFnType.java | 21 ++ .../optalgo/type/a8kidcard/zenum/A8kOptType.java | 6 + .../type/a8kidcard/zenum/A8kReactionFlowType.java | 41 ++++ .../type/a8kidcard/zenum/A8kResultUnit.java | 73 +++++++ .../a8k/app/optalgo/utils/A8kOptGainAdjuster.java | 39 ++++ .../app/optalgo/utils/A8kOptPeakInfoBuilder.java | 27 +++ .../java/a8k/app/optalgo/utils/A8kOptXGetter.java | 64 ++++++ .../java/a8k/app/optalgo/utils/OptChecker.java | 61 ++++++ .../app/optalgo/utils/PeakDivisionComputer.java | 23 +++ .../a8k/app/optalgo/utils/PeakNameAssigner.java | 48 +++++ .../a8k/app/optalgo/version/OptAlogVersion.java | 5 + .../java/a8k/app/service/data/FileMgrService.java | 44 ++--- .../app/service/data/ProjIdCardInfoMgrService.java | 14 +- .../app/service/data/ReactionRecordMgrService.java | 2 +- .../lowerctrl/OptScanModuleCtrlService.java | 18 +- .../mainctrl/AppConsumablesScanService.java | 2 +- .../mainflowctrl/action/AC20ScanReactionPlate.java | 8 +- .../mainflowctrl/action/AC41ProcessSample.java | 2 +- .../param/optparam/OptModuleExtParamsMgr.java | 2 +- src/main/java/a8k/app/utils/ProjBuildinInfo.java | 4 +- src/main/java/a8k/app/utils/ProjInfoUtils.java | 2 +- .../extui/factory/FakeOptScanResultFactory.java | 42 ++-- .../a8k/extui/factory/ProjExtInfoCardFactory.java | 10 +- .../a8k/extui/page/extapp/A8kOptVerification.java | 8 +- .../page/extapp/OptFullFlowVerificationPage.java | 8 +- .../page/extapp/OptModuleParamCalibration.java | 2 +- .../FakeReactionRecordGeneratorPage.java | 10 +- .../debug_assistant/FakeStateGeneratorPage.java | 4 +- .../extsetting/db/ReactionRecordMgrDebugPage.java | 4 +- .../page/test/codetest/OptFormulaTestPage.java | 8 +- .../page/test/codetest/OptFormulaTestPageV2.java | 19 +- .../verification/P51FullFlowVerificationPage.java | 8 +- 107 files changed, 1661 insertions(+), 1766 deletions(-) delete mode 100644 src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeak.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/LineProcessContext.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/LinearResult.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/LinearResultSeq.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoAnalysResult.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoError.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/OptCfg.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/OptProcessContext.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/OptScanResult.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/type/PeakFindState.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptAlgoUtils.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptGainAdjuster.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/utils/BasicAlgo.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/utils/Filter.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/utils/LeastSquare.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/utils/SubSampling.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/utils/SupperSampling.java delete mode 100644 src/main/java/a8k/app/a8kproj/optalgo/version/OptAlogVersion.java delete mode 100644 src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java delete mode 100644 src/main/java/a8k/app/a8kproj/optanalyzer/OptChecker.java delete mode 100644 src/main/java/a8k/app/a8kproj/optanalyzer/PeakDivisionComputer.java delete mode 100644 src/main/java/a8k/app/a8kproj/optanalyzer/PeakNameAssigner.java delete mode 100644 src/main/java/a8k/app/a8kproj/optanalyzer/context/OptAnalyzeContext.java delete mode 100644 src/main/java/a8k/app/a8kproj/optanalyzer/exception/A8kOptProcessException.java delete mode 100644 src/main/java/a8k/app/a8ktype/opttype/A8kOptX.java delete mode 100644 src/main/java/a8k/app/a8ktype/opttype/OptScanDirection.java delete mode 100644 src/main/java/a8k/app/a8ktype/opttype/PeakDivision.java delete mode 100644 src/main/java/a8k/app/a8ktype/opttype/PeakName.java delete mode 100644 src/main/java/a8k/app/a8ktype/opttype/ReactionResultStatus.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/A8kNormalFn.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/A8kOptFnFormula.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/A8kPiecewiseFn.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/A8kResultBuilderFn.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/A8kResultUnitConverter.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kFnType.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kOptType.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kReactionFlowType.java delete mode 100644 src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kResultUnit.java create mode 100644 src/main/java/a8k/app/optalgo/A8kOptCurveAnalyzer.java create mode 100644 src/main/java/a8k/app/optalgo/A8kPeakAnalyzer.java create mode 100644 src/main/java/a8k/app/optalgo/README.md create mode 100644 src/main/java/a8k/app/optalgo/algo/BasicAlgo.java create mode 100644 src/main/java/a8k/app/optalgo/algo/LeastSquare.java create mode 100644 src/main/java/a8k/app/optalgo/algo/SubSampling.java create mode 100644 src/main/java/a8k/app/optalgo/algo/SupperSampling.java create mode 100644 src/main/java/a8k/app/optalgo/type/A8kOptPeak.java create mode 100644 src/main/java/a8k/app/optalgo/type/A8kOptPeakInfo.java create mode 100644 src/main/java/a8k/app/optalgo/type/A8kOptPeaks.java create mode 100644 src/main/java/a8k/app/optalgo/type/A8kOptProcessException.java create mode 100644 src/main/java/a8k/app/optalgo/type/A8kOptX.java create mode 100644 src/main/java/a8k/app/optalgo/type/LinearResult.java create mode 100644 src/main/java/a8k/app/optalgo/type/OptScanDirection.java create mode 100644 src/main/java/a8k/app/optalgo/type/OptScanResult.java create mode 100644 src/main/java/a8k/app/optalgo/type/PeakDivision.java create mode 100644 src/main/java/a8k/app/optalgo/type/PeakFindState.java create mode 100644 src/main/java/a8k/app/optalgo/type/PeakName.java create mode 100644 src/main/java/a8k/app/optalgo/type/ReactionResultStatus.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/A8kNormalFn.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/A8kOptFnFormula.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/A8kPiecewiseFn.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultBuilderFn.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultUnitConverter.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kFnType.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kOptType.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kReactionFlowType.java create mode 100644 src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kResultUnit.java create mode 100644 src/main/java/a8k/app/optalgo/utils/A8kOptGainAdjuster.java create mode 100644 src/main/java/a8k/app/optalgo/utils/A8kOptPeakInfoBuilder.java create mode 100644 src/main/java/a8k/app/optalgo/utils/A8kOptXGetter.java create mode 100644 src/main/java/a8k/app/optalgo/utils/OptChecker.java create mode 100644 src/main/java/a8k/app/optalgo/utils/PeakDivisionComputer.java create mode 100644 src/main/java/a8k/app/optalgo/utils/PeakNameAssigner.java create mode 100644 src/main/java/a8k/app/optalgo/version/OptAlogVersion.java diff --git a/src/main/java/a8k/app/a8kproj/A8kIdCardDataParseService.java b/src/main/java/a8k/app/a8kproj/A8kIdCardDataParseService.java index 5fba87a..eff125c 100644 --- a/src/main/java/a8k/app/a8kproj/A8kIdCardDataParseService.java +++ b/src/main/java/a8k/app/a8kproj/A8kIdCardDataParseService.java @@ -1,15 +1,15 @@ package a8k.app.a8kproj; import a8k.app.dao.ProjectBaseInfoDao; -import a8k.app.dao.type.a8kidcard.A8kNormalFn; +import a8k.app.optalgo.type.a8kidcard.A8kNormalFn; import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.app.a8ktype.opttype.A8kOptX; +import a8k.app.optalgo.type.A8kOptX; import a8k.app.dao.type.ProjectBaseInfo; -import a8k.app.dao.type.a8kidcard.A8kPiecewiseFn; -import a8k.app.dao.type.a8kidcard.A8kResultBuilderFn; -import a8k.app.dao.type.a8kidcard.zenum.A8kFnType; -import a8k.app.dao.type.a8kidcard.zenum.A8kResultUnit; -import a8k.app.dao.type.a8kidcard.A8kOptFnFormula; +import a8k.app.optalgo.type.a8kidcard.A8kPiecewiseFn; +import a8k.app.optalgo.type.a8kidcard.A8kResultBuilderFn; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kFnType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kResultUnit; +import a8k.app.optalgo.type.a8kidcard.A8kOptFnFormula; import a8k.app.dao.type.ProjExtInfoCard; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; diff --git a/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java b/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java deleted file mode 100644 index 1dbdabb..0000000 --- a/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java +++ /dev/null @@ -1,184 +0,0 @@ -package a8k.app.a8kproj; - -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; -import a8k.app.a8kproj.optanalyzer.A8kOptXGetter; -import a8k.app.a8kproj.optanalyzer.OptChecker; -import a8k.app.a8kproj.optanalyzer.context.OptAnalyzeContext; -import a8k.app.a8kproj.optanalyzer.exception.A8kOptProcessException; -import a8k.app.a8ktype.state.SampleInfo; -import a8k.app.dao.type.a8kidcard.A8kNormalFn; -import a8k.app.dao.type.a8kidcard.A8kOptFnFormula; -import a8k.app.dao.type.a8kidcard.A8kPiecewiseFn; -import a8k.app.dao.type.a8kidcard.A8kResultBuilderFn; -import a8k.app.dao.type.a8kidcard.zenum.A8kFnType; -import a8k.app.a8ktype.type.ReactionResult; -import a8k.app.a8ktype.opttype.ReactionResultStatus; -import a8k.app.utils.ProjInfo; -import a8k.app.utils.ProjInfoUtils; -import a8k.app.utils.ZloggerRecorder; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.LoggerFactory; -import org.springframework.util.Assert; - -// -// 光学结果分析器 -// -// -// - -@Slf4j -public class A8kReactionResultComputer { - - static ZloggerRecorder zloggerRecorder = new ZloggerRecorder(LoggerFactory.getLogger(A8kReactionResultComputer.class)); - - static String fmt(Double val) { - return val == null ? "null" : String.format("%.5f", val); - } - - static private Double compute2ndResult(A8kResultBuilderFn fn, Double firstResult) { - if (fn.ret2Unit == null) { - return null; - } - if (fn.toUint2FnA == null) { - return null; - } - - - double A = fn.toUint2FnA; - double B = fn.toUint2FnB != null ? fn.toUint2FnB : 0; - - double result2 = A * firstResult + B; - zloggerRecorder.info("======Compute 2nd Result======"); - zloggerRecorder.info("-Fromula : Y = %sX+%s", fmt(fn.toUint2FnA), fmt(fn.toUint2FnB)); - zloggerRecorder.info("-Unit :%s", fn.ret2Unit); - zloggerRecorder.info("-Input :%s", fmt(firstResult)); - zloggerRecorder.info("-Result :%s", fmt(result2)); - return result2; - } - - static private Double compute3rdResult(A8kResultBuilderFn fn, Double firstResult) { - if (fn.ret3Unit == null) { - return null; - } - if (fn.toUint3FnA == null) { - return null; - } - double A = fn.toUint3FnA; - double B = fn.toUint3FnB != null ? fn.toUint3FnB : 0; - double result = A * firstResult + B; - zloggerRecorder.info("======Compute 3rd Result======"); - zloggerRecorder.info("+Fromula : Y = %sX+%s", fmt(fn.toUint3FnA), fmt(fn.toUint3FnB)); - zloggerRecorder.info("+Unit :%s", fn.ret3Unit); - zloggerRecorder.info("+ Input :%s", fmt(firstResult)); - zloggerRecorder.info("+Result :%s", fmt(result)); - return result; - } - - // - - - //普通函数 - static Double callNorFn(OptAnalyzeContext optcxt, A8kNormalFn fn, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException { - zloggerRecorder.info("==========NormalFn=========="); - zloggerRecorder.info("-XType : %s", fn.x); - zloggerRecorder.info("-Fromula : Y = %sX^2+%sX+%s", fmt(fn.A), fmt(fn.B), fmt(fn.C)); - zloggerRecorder.info("-XRange : [%s:%s]", fmt(fn.xMin), fmt(fn.xMax)); - zloggerRecorder.info("-ResultRange: [%s:%s]", fmt(fn.lowLimit), fmt(fn.upLimit)); - - zloggerRecorder.info("-==========Result=========="); - Double X = A8kOptXGetter.getX(fn.x, optcxt.getProjOptInfo(), optAlgoAnalysResult); - zloggerRecorder.info("-Result:X = %s", fmt(X)); - OptChecker.checkX(X, fn.xMin, fn.xMax); - - Double result1 = fn.A * X * X + fn.B * X + fn.C; - zloggerRecorder.info("-Result:%s", fmt(result1)); - OptChecker.checkResult1(result1, fn.lowLimit, fn.upLimit); - return result1; - } - - - // 分段函数系数 - static Double callPiecewiseFn(OptAnalyzeContext optcxt, A8kPiecewiseFn fn, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException { - zloggerRecorder.info("==========PiecewiseFn=========="); - zloggerRecorder.info("+JudeX :%s", fn.judeX); - zloggerRecorder.info("+JudeThres :%s", fmt(fn.judeThres)); - zloggerRecorder.info("+lxType :%s", fn.lX); - zloggerRecorder.info("+hxType :%s", fn.hX); - zloggerRecorder.info("+LX : Y = %sX^3 + %sX^2 + %sX + %s", fmt(fn.A0), fmt(fn.B0), fmt(fn.C0), fmt(fn.D0)); - zloggerRecorder.info("+HX : Y = %sX^3 + %sX^2 + %sX + %s", fmt(fn.A1), fmt(fn.B1), fmt(fn.C1), fmt(fn.D1)); - zloggerRecorder.info("+XRange : [%s:%s]", fmt(fn.xMin), fmt(fn.xMax)); - zloggerRecorder.info("+ResultRange : [%s:%s]", fmt(fn.lowLimit), fmt(fn.upLimit)); - - - Double pwFnJudeX = A8kOptXGetter.getX(fn.judeX, optcxt.getProjOptInfo(), optAlgoAnalysResult); - Double X = null; - Double result1 = null; - boolean isHX = false; - if (pwFnJudeX < fn.judeThres) { - X = A8kOptXGetter.getX(fn.lX, optcxt.getProjOptInfo(), optAlgoAnalysResult); - result1 = fn.A0 * X * X * X + fn.B0 * X * X + fn.C0 * X + fn.D0; - } else { - X = A8kOptXGetter.getX(fn.hX, optcxt.getProjOptInfo(), optAlgoAnalysResult); - result1 = fn.A1 * X * X * X + fn.B1 * X * X + fn.C1 * X + fn.D1; - isHX = true; - } - zloggerRecorder.info("+==========Result=========="); - zloggerRecorder.info("+JudeX :%s", fmt(pwFnJudeX)); - zloggerRecorder.info("+FnType :%s", isHX ? "HX" : "LX"); - zloggerRecorder.info("+XVal :%s", fmt(X)); - zloggerRecorder.info("+Result :%s", fmt(result1)); - - - OptChecker.checkX(X, fn.xMin, fn.xMax); - OptChecker.checkResult1(result1, fn.lowLimit, fn.upLimit); - return result1; - } - - static ReactionResult buildResult(OptAnalyzeContext optcxt, A8kResultBuilderFn fn, Double result1) { - Assert.isTrue(result1 != null, "result1 must not be null"); - Double result2 = compute2ndResult(fn, result1); - Double result3 = compute3rdResult(fn, result1); - ReactionResult reactionResult = new ReactionResult(optcxt.getProjOptInfo().subProjName, optcxt.getProjOptInfo().subProjShortName, result1, fn.toResultUnitConverters()); - reactionResult.status = ReactionResultStatus.SUCCESS; - return reactionResult; - } - - static private ReactionResult analyzeResult(OptAnalyzeContext optcxt, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException { - // A8kOptFnFormula fnFormual = optcxt.projInfoCxt.getA8kOptFnFormula(optcxt.subProjIndex); - A8kOptFnFormula fnFormual = ProjInfoUtils.getA8kOptFnFormula(optcxt.projInfoCxt.ext, optcxt.subProjIndex); - Assert.isTrue(fnFormual != null, "fnFormual must not be null"); - Double result1 = null; - if (fnFormual.fnType.equals(A8kFnType.NormalFn)) { - result1 = switch (optcxt.sampleInfo.bloodType) { - case WHOLE_BLOOD -> callNorFn(optcxt, fnFormual.bloodNorFn, optAlgoAnalysResult); - case SERUM_OR_PLASMA -> callNorFn(optcxt, fnFormual.serumNorFn, optAlgoAnalysResult); - }; - } else if (fnFormual.fnType.equals(A8kFnType.PiecewiseFn)) { - result1 = switch (optcxt.sampleInfo.bloodType) { - case WHOLE_BLOOD -> callPiecewiseFn(optcxt, fnFormual.bloodPiecewiseFn, optAlgoAnalysResult); - case SERUM_OR_PLASMA -> callPiecewiseFn(optcxt, fnFormual.serumPiecewiseFn, optAlgoAnalysResult); - }; - } - - return buildResult(optcxt, fnFormual.resultBuilderFn, result1); - } - - static public ReactionResult optComputeResult(SampleInfo sampleInfo, ProjInfo projInfoCxt, int subProjIndex, OptAlgoAnalysResult optAlgoAnalysResult) { - zloggerRecorder.clear(); - zloggerRecorder.info("================OPT COMPUTE RESULT============="); - zloggerRecorder.info("optComputeResult:%s proj:%s(%s) sub-proj:%s", sampleInfo.sampleId, projInfoCxt.buildIn.projId, projInfoCxt.buildIn.projName, subProjIndex); - OptAnalyzeContext optAnalyzeContext = new OptAnalyzeContext(sampleInfo, projInfoCxt, subProjIndex); - try { - return analyzeResult(optAnalyzeContext, optAlgoAnalysResult); - } catch (A8kOptProcessException e) { - zloggerRecorder.error("optComputeResult fail:%s,%s ", e.status, e.errorMsg); - return new ReactionResult(optAnalyzeContext.getProjOptInfo().subProjName, optAnalyzeContext.getProjOptInfo().subProjShortName, e.status, e.errorMsg); - } - } - - static public String getComputeContext() { - return zloggerRecorder.getRecord(); - } - - -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java b/src/main/java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java deleted file mode 100644 index 80b2b55..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java +++ /dev/null @@ -1,159 +0,0 @@ -package a8k.app.a8kproj.optalgo; - -import a8k.app.a8kproj.optalgo.type.*; -import a8k.app.a8kproj.optalgo.utils.*; -import a8k.app.a8kproj.optanalyzer.PeakNameAssigner; -import a8k.app.dao.type.OptCfg; -import a8k.app.utils.ProjBuildinInfo; -import lombok.extern.slf4j.Slf4j; - - -@Slf4j -public class A8kOptAlgoV2 { - double[] avg; - double[] diffx2; - double[] diff; - double avgLine; - double[] afSupperVal; - double[] afSubSampling; - - Integer[] rawData; - - ProjBuildinInfo projInfo; - OptCfg optCfg; - - - public OptAlgoAnalysResult processOptData(ProjBuildinInfo projInfo, OptCfg optCfg, Integer[] data) { - double[] doubleData = new double[data.length]; - for (int i = 0; i < data.length; i++) { - doubleData[i] = data[i]; - } - this.projInfo = projInfo; - this.optCfg = optCfg; - this.rawData = data; - return processOptData(doubleData); - } - - private OptAlgoAnalysResult processOptData(double[] data) { - - - //过采样 - afSupperVal = SupperSampling.process(data, 5); - afSubSampling = SubSampling.process(afSupperVal, 24); - - avg = afSubSampling; - diff = LeastSquare.calculatedSlopeCurve(avg, 5); - diffx2 = LeastSquare.calculatedSlopeCurve(diff, 5); - avgLine = findAvgLine(afSubSampling); - - - A8kOptPeaks peaks = new A8kOptPeaks(); - - findpeak(avg, 20, 60, peaks.P040); - findpeak(avg, 60, 100, peaks.P080); - findpeak(avg, 100, 140, peaks.P120); - findpeak(avg, 140, 180, peaks.P160); - findpeak(avg, 180, 220, peaks.P200); - - PeakNameAssigner.assignPeakName(projInfo.projId, optCfg.peakNameRefNum, peaks); - - - return OptAlgoAnalysResult.build(afSubSampling, peaks); - } - - double findAvgLine(double[] inputRaw) { - double base_min = 500; - double fsum = 0; - int cnt = 0; - - int range = inputRaw.length; - - do { - fsum = cnt = 0; - for (int i = 1; i < range; i++) { - if (inputRaw[i] < base_min) { - fsum += inputRaw[i]; - cnt++; - } - } - - base_min = base_min + 50; - } while (cnt < range - 15 * inputRaw.length / 250); - - return fsum / cnt; - } - - void findpeak(double[] data, int search_start, int search_end, A8kOptPeak retpeak) { - // find peak - int findpeakTargetPos = search_start + (search_end - search_start) / 2; - log.info("find peak {}", findpeakTargetPos); - retpeak.state = PeakFindState.NOT_FIND_PEAK; - retpeak.area = 0.0; - retpeak.peakPos = 0; - retpeak.peakStartPos = 0; - retpeak.peakEndPos = 0; - - double max = 0; - int peakpos = 0; - int midpos = search_start + (search_end - search_start) / 2; - for (int i = search_start; i < search_end; i++) { - if (data[i] > max) { - max = data[i]; - peakpos = i; - } - } - - if (max < avgLine) { - log.warn("find peak-{} fail, max:{} < m_cxt.agvline:{}", findpeakTargetPos, max, avgLine); - return; - } else if (peakpos > midpos + 15) { - log.warn("find peak-{} fail, peakpos > midpos + 15:{}", findpeakTargetPos, midpos + 15); - return; - } else if (peakpos < midpos - 15) { - log.warn("find peak-{} fail, peakpos < midpos - 15:{}", findpeakTargetPos, midpos - 15); - return; - } - - // find_peak_start - // 从pos向前找20个点,从低于均值线的坐标开始找,找到diff2的最大值 - retpeak.peakPos = peakpos; - retpeak.peakStartPos = findPeakStartTurnPoint(data, peakpos - 20, peakpos) - 4; //-4 是经验数值 - retpeak.peakEndPos = findPeakEndTurnPoint(data, peakpos, peakpos + 20) + 4; //+4 是经验数值 - retpeak.area = computePeakArea(data, retpeak.peakStartPos, retpeak.peakEndPos); - retpeak.state = PeakFindState.FIND_PEAK; - log.info("find peak:{} startpos:{} endpos:{} area:{}", retpeak.peakPos, retpeak.peakStartPos, retpeak.peakEndPos, retpeak.area); - - // find_peak_end - // 从pos向后找20个点,找到diff2的最大值 - } - - int findPeakStartTurnPoint(double[] data, int search_start, int suggest_search_end) { - int peakTurnPos = search_start; - double maxdiff2 = diffx2[search_start]; - for (int i = search_start; i < suggest_search_end; i++) { - if (diffx2[i] > maxdiff2) { - maxdiff2 = diffx2[i]; - peakTurnPos = i; - } - } - return peakTurnPos; - } - - int findPeakEndTurnPoint(double[] data, int search_start, int suggest_search_end) { - return findPeakStartTurnPoint(new double[0], search_start, suggest_search_end); - } - - double abs(double a) { - return a > 0 ? a : -a; - } - - double computePeakArea(double[] data, int start, int end) { - double area = 0; - for (int i = start; i < end; i++) { - area += data[i]; - } - - double baselinearea = (data[start] + data[end]) * abs(end - start) / 2; - return abs(area - baselinearea); - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeak.java b/src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeak.java deleted file mode 100644 index cc47082..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeak.java +++ /dev/null @@ -1,44 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -import a8k.app.a8ktype.opttype.PeakName; - -public class A8kOptPeak { - public PeakFindState state = PeakFindState.NOT_FIND_PEAK; - public PeakName peakName; - public Integer off; - - public Double area; - public Integer peakPos; - public Integer peakStartPos; - public Integer peakEndPos; - - - public String toString() { - return String.format("[%s: %s]", peakName, area); - } - - public A8kOptPeak deepCopy() { - A8kOptPeak val = new A8kOptPeak(); - val.state = state; - val.off = off; - val.area = area; - val.peakPos = peakPos; - val.peakStartPos = peakStartPos; - val.peakEndPos = peakEndPos; - val.peakName = peakName; - return val; - } - - public A8kOptPeak() { - } - - public A8kOptPeak(PeakFindState state, PeakName peakName, Integer off, Double area, Integer peakPos, Integer peakStartPos, Integer peakEndPos) { - this.state = state; - this.peakName = peakName; - this.off = off; - this.area = area; - this.peakPos = peakPos; - this.peakStartPos = peakStartPos; - this.peakEndPos = peakEndPos; - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java b/src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java deleted file mode 100644 index 7d5f564..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java +++ /dev/null @@ -1,56 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -import a8k.app.a8ktype.opttype.PeakName; -import org.springframework.util.Assert; - -public class A8kOptPeaks { - public A8kOptPeak P040 = new A8kOptPeak(); - public A8kOptPeak P080 = new A8kOptPeak(); - public A8kOptPeak P120 = new A8kOptPeak(); - public A8kOptPeak P160 = new A8kOptPeak(); - public A8kOptPeak P200 = new A8kOptPeak(); - - public void trySetPeakArea(PeakName peakName, Double area) { - Assert.notNull(peakName, "peakName must not be null"); - if (peakName.equals(P040.peakName)) { - P040.area = area; - } - if (peakName.equals(P080.peakName)) { - P080.area = area; - } - if (peakName.equals(P120.peakName)) { - P120.area = area; - } - if (peakName.equals(P160.peakName)) { - P160.area = area; - } - if (peakName.equals(P200.peakName)) { - P200.area = area; - } - } - - public A8kOptPeak findPeak(PeakName peakName) { - Assert.notNull(peakName, "peakName must not be null"); - if (peakName.equals(P040.peakName)) { - return P040; - } - if (peakName.equals(P080.peakName)) { - return P080; - } - if (peakName.equals(P120.peakName)) { - return P120; - } - if (peakName.equals(P160.peakName)) { - return P160; - } - if (peakName.equals(P200.peakName)) { - return P200; - } - return null; - } - - public String toString() { - return String.format("P040: %s, P080: %s, P120: %s, P160: %s, P200: %s", P040, P080, P120, P160, P200); - } - -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/LineProcessContext.java b/src/main/java/a8k/app/a8kproj/optalgo/type/LineProcessContext.java deleted file mode 100644 index ae92274..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/LineProcessContext.java +++ /dev/null @@ -1,22 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -public class LineProcessContext { - - //过采样6000 - public double[] afSupperVal; - //中值滤波6000 - public double[] afSupperMedianVal; - - //下采样到1000个点 - public double[] raw1000; - //生成1000个的平滑曲线 - public double[] avg1000; - //生成1000个的斜率曲线 - public double[] diff1000; - //求数据的均值(巴迪泰A5000算法) - public double avgLine; - - //在曲线开始的位置第10个到15点的斜率 - public double baselineSlope; - -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/LinearResult.java b/src/main/java/a8k/app/a8kproj/optalgo/type/LinearResult.java deleted file mode 100644 index 214dbea..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/LinearResult.java +++ /dev/null @@ -1,6 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -public class LinearResult { - public double slope; - public double intercept; -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/LinearResultSeq.java b/src/main/java/a8k/app/a8kproj/optalgo/type/LinearResultSeq.java deleted file mode 100644 index 0359f4b..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/LinearResultSeq.java +++ /dev/null @@ -1,6 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -public class LinearResultSeq { - public Float[] slope; - public Float intercept; -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoAnalysResult.java b/src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoAnalysResult.java deleted file mode 100644 index 482435c..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoAnalysResult.java +++ /dev/null @@ -1,46 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -import a8k.app.a8kproj.optalgo.version.OptAlogVersion; -import a8k.app.a8kproj.optanalyzer.PeakDivisionComputer; -import a8k.app.a8ktype.opttype.PeakDivision; -import a8k.app.a8ktype.opttype.PeakName; - -public class OptAlgoAnalysResult { - - public String algoVersion = ""; - - public double[] resultData; // 250 POINT - - public A8kOptPeak T4; - public A8kOptPeak R; - public A8kOptPeak H; - public A8kOptPeak T; - public A8kOptPeak C; - - public Double pdR; //1 - public Double pdAR; //2 - public Double pdATR; //3 - public Double pdRFR; //5 - public Double pdT4R; //6 - public Double pdT4T3R; //7 - - - static public OptAlgoAnalysResult build(double[] resultData, A8kOptPeaks peaks) { - OptAlgoAnalysResult result = new OptAlgoAnalysResult(); - result.resultData = resultData; - result.T4 = peaks.findPeak(PeakName.T4); - result.R = peaks.findPeak(PeakName.R); - result.H = peaks.findPeak(PeakName.H); - result.T = peaks.findPeak(PeakName.T); - result.C = peaks.findPeak(PeakName.C); - result.pdR = PeakDivisionComputer.computePeakDivision(PeakDivision.R, peaks); - result.pdAR = PeakDivisionComputer.computePeakDivision(PeakDivision.AR, peaks); - result.pdATR = PeakDivisionComputer.computePeakDivision(PeakDivision.ATR, peaks); - result.pdRFR = PeakDivisionComputer.computePeakDivision(PeakDivision.RFR, peaks); - result.pdT4R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4R, peaks); - result.pdT4T3R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4T3R, peaks); - result.algoVersion = OptAlogVersion.version; - return result; - } - -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoError.java b/src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoError.java deleted file mode 100644 index 4656cf9..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoError.java +++ /dev/null @@ -1,9 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -public enum OptAlgoError { - Success, - LostPeak, - LostPeakStart, - LostPeakEnd, -} - diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/OptCfg.java b/src/main/java/a8k/app/a8kproj/optalgo/type/OptCfg.java deleted file mode 100644 index 9cd1ded..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/OptCfg.java +++ /dev/null @@ -1,5 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -public class OptCfg { - public Integer peakNum; -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/OptProcessContext.java b/src/main/java/a8k/app/a8kproj/optalgo/type/OptProcessContext.java deleted file mode 100644 index 91aa079..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/OptProcessContext.java +++ /dev/null @@ -1,7 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -public class OptProcessContext { - Double[] supperVal; //超采样,1200*5=6000 - Double[] supperMedianVal; //supper_val,窗口平滑滤波,6000 - Double[] supperSmoothSubVal; //supper_smooth_val 均值压缩,6000/24=25 -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/OptScanResult.java b/src/main/java/a8k/app/a8kproj/optalgo/type/OptScanResult.java deleted file mode 100644 index 0419abb..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/OptScanResult.java +++ /dev/null @@ -1,15 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -import a8k.app.dao.type.OptRawScanData; -import a8k.app.utils.ZJsonHelper; - -import java.util.Date; - -public class OptScanResult { - public Date scanDate; - public OptRawScanData rawData; - public OptAlgoAnalysResult analysResult; - public String toString() { - return ZJsonHelper.objectToJson(this); - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/type/PeakFindState.java b/src/main/java/a8k/app/a8kproj/optalgo/type/PeakFindState.java deleted file mode 100644 index bba057a..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/type/PeakFindState.java +++ /dev/null @@ -1,6 +0,0 @@ -package a8k.app.a8kproj.optalgo.type; - -public enum PeakFindState { - FIND_PEAK, - NOT_FIND_PEAK, -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptAlgoUtils.java b/src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptAlgoUtils.java deleted file mode 100644 index 62e2c75..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptAlgoUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package a8k.app.a8kproj.optalgo.utils; - -public class A8kOptAlgoUtils { - - static public Integer[] supperSamplingAndSubSampling(Integer[] data) { - double[] indata = new double[data.length]; - for (int i = 0; i < data.length; i++) { - indata[i] = data[i]; - } - - var result = supperSamplingAndSubSampling(indata); - Integer[] outdata = new Integer[result.length]; - for (int i = 0; i < result.length; i++) { - outdata[i] = (int) result[i]; - } - return outdata; - } - - static public double[] supperSamplingAndSubSampling(double[] data) { - //过采样 - var afSupperVal = SupperSampling.process(data, 5); - //中值滤波 - var afSupperMedianVal = Filter.medianFiltering(afSupperVal, 25); - - //下采样到1000个点 - var raw1000 = SubSampling.process(afSupperMedianVal, 6); - //生成1000个的平滑曲线 - var avg1000 = Filter.smooth(raw1000, 13); - - return SubSampling.process(avg1000, 4); - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptGainAdjuster.java b/src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptGainAdjuster.java deleted file mode 100644 index 976ee1e..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/utils/A8kOptGainAdjuster.java +++ /dev/null @@ -1,39 +0,0 @@ -package a8k.app.a8kproj.optalgo.utils; - -import org.springframework.util.Assert; - -public class A8kOptGainAdjuster { - public Double suggestGain; - public Boolean scanAgain; - public Integer maxval; - - public void process(Integer[] data, double nowgain, int expectResult, int tolerate) { - Assert.isTrue(data.length == 1200, "data.length must be 1200"); - - maxval = data[0]; - for (int i = 1; i < data.length; i++) { - if (maxval < data[i]) { - maxval = data[i]; - } - } - - if (maxval > expectResult + tolerate) { - scanAgain = true; - suggestGain = nowgain / 2; - return; - } - - if (maxval > expectResult) { - scanAgain = false; - suggestGain = nowgain; - return; - } - - if (maxval != 0) { - suggestGain = nowgain * ((double) expectResult / (double) maxval); - } else { - suggestGain = nowgain * 2; - } - scanAgain = true; - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/utils/BasicAlgo.java b/src/main/java/a8k/app/a8kproj/optalgo/utils/BasicAlgo.java deleted file mode 100644 index 7d89c1b..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/utils/BasicAlgo.java +++ /dev/null @@ -1,87 +0,0 @@ -package a8k.app.a8kproj.optalgo.utils; - -import org.springframework.util.Assert; - -public class BasicAlgo { - - - static public Boolean feq(double a, double b, double epsilon) { - double dv = a - b; - if (dv < 0) - dv = -dv; - return dv <= epsilon; - } - - - public static void bubbleSort(double[] src) { - // 实现冒泡排序 - for (int i = 0; i < src.length; i++) { - for (int j = 0; j < src.length - i - 1; j++) { - if (src[j] > src[j + 1]) { - double temp = src[j]; - src[j] = src[j + 1]; - src[j + 1] = temp; - } - } - } - } - - /** - * - * 填充数组 - * 输入数据一般经过窗口处理后,会出现边界数据不全的情况,需要填充 - * - * @param inputRaw 输入数据 - * @param windows_size 窗口大小 - */ - public static void padArraryAfWindowsAlgo(double[] inputRaw, int windows_size) { - int windows_size_half = (windows_size - 1) / 2; - double fillInVal0 = inputRaw[windows_size_half]; - double fillInVal1 = inputRaw[inputRaw.length - windows_size_half - 1]; - - for (int i = 0; i < windows_size_half; i++) { - inputRaw[i] = fillInVal0; - } - - for (int i = inputRaw.length - windows_size_half; i < inputRaw.length; i++) { - inputRaw[i] = fillInVal1; - } - } - - /** - * 获取窗口数据 - * @param src 数据 - * @param off 窗口中心位置 - * @param windows 窗口大小 - * @return 窗口数据 - */ - static public double[] getWindowsPoint(double[] src, int off, int windows) { - double[] ret = new double[windows]; - int retindex = 0; - for (int i = off - windows / 2; i <= off + windows / 2; i++) { - ret[retindex] = src[i]; - retindex++; - } - return ret; - } - - - static public boolean isMaxvalInWindows(double[] val, int pos, int windows_size) { - Assert.isTrue(windows_size > 0, "windows_size <= 0"); - Assert.isTrue(windows_size % 2 == 1, "windows_size is not odd"); - - boolean ret = true; - int startPos = pos - windows_size / 2; - double val0 = val[pos]; - for (int i = 0; i < windows_size; i++) { - if (startPos + i == pos) - continue; - - if (val[startPos + i] > val0) { - ret = false; - break; - } - } - return ret; - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/utils/Filter.java b/src/main/java/a8k/app/a8kproj/optalgo/utils/Filter.java deleted file mode 100644 index cbe8db9..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/utils/Filter.java +++ /dev/null @@ -1,38 +0,0 @@ -package a8k.app.a8kproj.optalgo.utils; - -public class Filter { - static public double[] medianFiltering(double[] inputRaw, int windows_size) { - double[] medianRaw = new double[inputRaw.length]; - double[] windows = new double[windows_size]; - - int windows_size_half = (windows_size - 1) / 2; - - for (int index = windows_size_half; index < inputRaw.length - windows_size_half; index++) { - System.arraycopy(inputRaw, index - windows_size_half, windows, 0, windows_size); - BasicAlgo.bubbleSort(windows); // 从小到大顺序排序 - medianRaw[index] = windows[windows_size_half + 1]; - } - - BasicAlgo.padArraryAfWindowsAlgo(medianRaw, windows_size); - return medianRaw; - } - - - static public double[] smooth(double[] inputRaw, int windows_size) { - double[] smoothRaw = new double[inputRaw.length]; - int windows_size_half = (windows_size - 1) / 2; - - for (int index = windows_size_half; index < inputRaw.length - windows_size_half; index++) { - double sum = 0; - for (int i = index - windows_size_half; i <= index + windows_size_half; i++) { - sum += inputRaw[i]; - } - smoothRaw[index] = sum / windows_size; - } - - BasicAlgo.padArraryAfWindowsAlgo(smoothRaw, windows_size); - return smoothRaw; - } - - -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/utils/LeastSquare.java b/src/main/java/a8k/app/a8kproj/optalgo/utils/LeastSquare.java deleted file mode 100644 index 576a8b4..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/utils/LeastSquare.java +++ /dev/null @@ -1,72 +0,0 @@ -package a8k.app.a8kproj.optalgo.utils; - -import a8k.app.a8kproj.optalgo.type.LinearResult; -import org.springframework.util.Assert; - -public class LeastSquare { - - - static LinearResult linearLeastSquares(double[] x, double[] y) { - LinearResult result = new LinearResult(); - int n = x.length; - double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumXX = 0.0; - for (int i = 0; i < n; ++i) { - sumX += x[i]; - sumY += y[i]; - sumXY += x[i] * y[i]; - sumXX += x[i] * x[i]; - } - double xMean = sumX / n; - double yMean = sumY / n; - - Assert.isTrue((!BasicAlgo.feq((sumXX - n * xMean * xMean), 0, 0.0001)), "!feq((sumXX - n * xMean * xMean), 0, 0.0001)"); - - result.slope = (sumXY - n * xMean * yMean) / (sumXX - n * xMean * xMean); - result.intercept = yMean - result.slope * xMean; - return result; - } - - // - public static LinearResult linearLeastSquares(double[] y, int size) { - double[] xpoint = new double[size]; - double[] ypoint = new double[size]; - - for (int i = 0; i < size; i++) { - xpoint[i] = i; - ypoint[i] = y[i]; - } - return linearLeastSquares(xpoint, ypoint); - } - - public static LinearResult linearLeastSquares(double[] y, int off, int size) { - double[] ypoint = new double[size]; - System.arraycopy(y, off, ypoint, 0, size); - return linearLeastSquares(ypoint, size); - } - - /** - * 计算斜率曲线 - * @param inputRaw 输入数据 - * @param windows_size 窗口大小 - * @return 斜率曲线 - */ - public static double[] calculatedSlopeCurve(double[] inputRaw, int windows_size) { - Assert.isTrue((windows_size > 0), "windows_size > 0"); - Assert.isTrue((windows_size % 2 == 1), "windows_size % 2 == 1"); - - double[] differentiateRaw = new double[inputRaw.length]; - double[] windowsRaw; - - int windows_size_half = (windows_size - 1) / 2; - - for (int index = windows_size_half; index < inputRaw.length - windows_size_half; index++) { - windowsRaw = BasicAlgo.getWindowsPoint(inputRaw, index, windows_size); - float intercept = 0; - LinearResult result = linearLeastSquares(windowsRaw, windows_size); - differentiateRaw[index] = result.slope; - } - - BasicAlgo.padArraryAfWindowsAlgo(differentiateRaw, windows_size); - return differentiateRaw; - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/utils/SubSampling.java b/src/main/java/a8k/app/a8kproj/optalgo/utils/SubSampling.java deleted file mode 100644 index a4b08f3..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/utils/SubSampling.java +++ /dev/null @@ -1,26 +0,0 @@ -package a8k.app.a8kproj.optalgo.utils; - -public class SubSampling { - public static double[] process(double[] inputRaw, int nSubSampleRate) { - double fAvg; - double nSum = 0; - - int subIndex = 0; - int nOutputLength = inputRaw.length / nSubSampleRate; - - double[] subSampledRaw = new double[nOutputLength]; - - for (int index = 0; index < inputRaw.length; index++) { - if (index % nSubSampleRate == 0 && index > 0) { - fAvg = nSum * 1.0f / nSubSampleRate; - if (subIndex < subSampledRaw.length) { - subSampledRaw[subIndex++] = fAvg; - } - nSum = 0; - } - nSum += inputRaw[index]; - } - subSampledRaw[subSampledRaw.length - 1] = subSampledRaw[subSampledRaw.length - 2]; - return subSampledRaw; - } -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/utils/SupperSampling.java b/src/main/java/a8k/app/a8kproj/optalgo/utils/SupperSampling.java deleted file mode 100644 index 575192b..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/utils/SupperSampling.java +++ /dev/null @@ -1,30 +0,0 @@ -package a8k.app.a8kproj.optalgo.utils; - -public class SupperSampling { - static public double[] process(double[] inputRaw, Integer nUpSampleRate) { - /* - * @brief - * 过采样,将输入的数据进行过采样,增加数据的密度 - */ - int nInputLength = inputRaw.length; - int nOutputLength = nInputLength * nUpSampleRate; - double[] upSamplingRaw = new double[nOutputLength]; - - for (int si = 0, di = 0; si < nInputLength - 1; di++) { - double a = upSamplingRaw[di * nUpSampleRate] = (double) inputRaw[si]; - double b = upSamplingRaw[(di + 1) * nUpSampleRate] = (double) inputRaw[++si]; - - double nSlope = (b - a) / nUpSampleRate; - - for (int i = 0; i < nUpSampleRate - 1; i++) { - int baseIndex = (di * nUpSampleRate) + i; - upSamplingRaw[baseIndex + 1] = upSamplingRaw[baseIndex] + nSlope; - } - } - - return upSamplingRaw; - } - - - -} diff --git a/src/main/java/a8k/app/a8kproj/optalgo/version/OptAlogVersion.java b/src/main/java/a8k/app/a8kproj/optalgo/version/OptAlogVersion.java deleted file mode 100644 index e730726..0000000 --- a/src/main/java/a8k/app/a8kproj/optalgo/version/OptAlogVersion.java +++ /dev/null @@ -1,5 +0,0 @@ -package a8k.app.a8kproj.optalgo.version; - -public class OptAlogVersion { - static public final String version = "1.0.0"; -} diff --git a/src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java b/src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java deleted file mode 100644 index 1c75b55..0000000 --- a/src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java +++ /dev/null @@ -1,64 +0,0 @@ -package a8k.app.a8kproj.optanalyzer; - -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; -import a8k.app.a8kproj.optanalyzer.exception.A8kOptProcessException; -import a8k.app.a8ktype.opttype.A8kOptX; -import a8k.app.a8ktype.opttype.PeakDivision; -import a8k.app.dao.type.OptCfg; -import a8k.app.a8ktype.opttype.ReactionResultStatus; - -public class A8kOptXGetter { - - static class Context { - OptCfg optcfg; - OptAlgoAnalysResult optAlgoAnalysResult; - } - - static private Double getPeakDivision(Context cxt, PeakDivision pdtype) throws A8kOptProcessException { - OptAlgoAnalysResult optAlgoAnalysResult = cxt.optAlgoAnalysResult; - Double val = switch (pdtype) { - case R -> optAlgoAnalysResult.pdR; - case AR -> optAlgoAnalysResult.pdAR; - case ATR -> optAlgoAnalysResult.pdATR; - case RFR -> optAlgoAnalysResult.pdRFR; - case T4R -> optAlgoAnalysResult.pdT4R; - case T4T3R -> optAlgoAnalysResult.pdT4T3R; - }; - - OptChecker.checkPeakDevision(pdtype, val); - return val; - } - - - static private Double addPD(Context cxt, PeakDivision... type) throws A8kOptProcessException { - double result = 0.0; - for (PeakDivision peakDivision : type) { - result += getPeakDivision(cxt, peakDivision); - } - return result; - } - - static public Double getX(A8kOptX xType, OptCfg optcfg, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException { - - Context cxt = new Context(); - cxt.optcfg = optcfg; - cxt.optAlgoAnalysResult = optAlgoAnalysResult; - - /* - * 根据项目获取未知数X - */ - return switch (xType) { - case R -> addPD(cxt, PeakDivision.R); - case AR -> addPD(cxt, PeakDivision.AR); - case ATR -> addPD(cxt, PeakDivision.ATR); - case R_ADD_ATR -> addPD(cxt, PeakDivision.R, PeakDivision.ATR); - case RFR -> addPD(cxt, PeakDivision.RFR); - case T4R -> addPD(cxt, PeakDivision.T4R); - case T4T3R -> addPD(cxt, PeakDivision.T4T3R); - case RFR_ADD_T4T3R -> addPD(cxt, PeakDivision.RFR, PeakDivision.T4T3R); - default -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_UNKOWN_X, "ERROR_UNKOWN_X"); - }; - } - - -} diff --git a/src/main/java/a8k/app/a8kproj/optanalyzer/OptChecker.java b/src/main/java/a8k/app/a8kproj/optanalyzer/OptChecker.java deleted file mode 100644 index 2149435..0000000 --- a/src/main/java/a8k/app/a8kproj/optanalyzer/OptChecker.java +++ /dev/null @@ -1,61 +0,0 @@ -package a8k.app.a8kproj.optanalyzer; - -import a8k.app.a8kproj.optalgo.type.A8kOptPeak; -import a8k.app.a8kproj.optalgo.type.PeakFindState; -import a8k.app.a8kproj.optanalyzer.exception.A8kOptProcessException; -import a8k.app.a8ktype.opttype.PeakDivision; -import a8k.app.a8ktype.opttype.PeakName; -import a8k.app.a8ktype.opttype.ReactionResultStatus; - -public class OptChecker { - - static public void checkPack(PeakName peakName, A8kOptPeak peak) throws A8kOptProcessException { - if (peak != null && peak.state.equals(PeakFindState.FIND_PEAK)) { - return; - } - - switch (peakName) { - case T4 -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_T4, "ERROR_LOST_PEAK_T4"); - case R -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_R, "ERROR_LOST_PEAK_R"); - case H -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_H, "ERROR_LOST_PEAK_H"); - case T -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_T, "ERROR_LOST_PEAK_T"); - case C -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_C, "ERROR_LOST_PEAK_C"); - } - } - - public static void checkPeakDevision(PeakDivision pdType, Double val) throws A8kOptProcessException { - if (val != null) { - return; - } - - ReactionResultStatus estatus = switch (pdType) { - case R -> ReactionResultStatus.ERROR_COMPUTE_R_FAIL; - case AR -> ReactionResultStatus.ERROR_COMPUTE_AR_FAIL; - case ATR -> ReactionResultStatus.ERROR_COMPUTE_ATR_FAIL; - case RFR -> ReactionResultStatus.ERROR_COMPUTE_RFR_FAIL; - case T4R -> ReactionResultStatus.ERROR_COMPUTE_T4R_FAIL; - case T4T3R -> ReactionResultStatus.ERROR_COMPUTE_T4T3R_FAIL; - }; - throw new A8kOptProcessException(estatus, estatus.name()); - } - - - public static void checkX(Double x, Double lowLimit, Double upLimit) throws A8kOptProcessException { - if (x > upLimit) { - throw new A8kOptProcessException(ReactionResultStatus.ERROR_X_EXCEED_THE_UPPER_LIMIT, "ERROR_X_OUT_OF_RANGE"); - } - if (x < lowLimit) { - throw new A8kOptProcessException(ReactionResultStatus.ERROR_X_BELOW_THE_LOWER_LIMIT, "ERROR_X_OUT_OF_RANGE"); - } - } - - static public void checkResult1(Double result1, Double lowLimit, Double upLimit) throws A8kOptProcessException { - if (result1 > upLimit) { - throw new A8kOptProcessException(ReactionResultStatus.ERROR_RESULT_EXCEED_THE_UPPER_LIMIT, "ERROR_BEYOND_THE_UPPER_LIMIT"); - } - if (result1 < lowLimit) { - throw new A8kOptProcessException(ReactionResultStatus.ERROR_RESULT_BELOW_THE_LOWER_LIMIT, "ERROR_BEYOND_THE_LOWER_LIMIT"); - } - } - -} diff --git a/src/main/java/a8k/app/a8kproj/optanalyzer/PeakDivisionComputer.java b/src/main/java/a8k/app/a8kproj/optanalyzer/PeakDivisionComputer.java deleted file mode 100644 index c90cc7b..0000000 --- a/src/main/java/a8k/app/a8kproj/optanalyzer/PeakDivisionComputer.java +++ /dev/null @@ -1,26 +0,0 @@ -package a8k.app.a8kproj.optanalyzer; - -import a8k.app.a8kproj.optalgo.type.A8kOptPeak; -import a8k.app.a8kproj.optalgo.type.A8kOptPeaks; -import a8k.app.a8ktype.opttype.PeakDivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PeakDivisionComputer { - private static final Logger log = LoggerFactory.getLogger(PeakDivisionComputer.class); - - public static Double computePeakDivision(PeakDivision pdtype, A8kOptPeaks peaks) { - A8kOptPeak numerator = peaks.findPeak(pdtype.numerator); - A8kOptPeak denominator = peaks.findPeak(pdtype.denominator); - - if (numerator == null || denominator == null) { - return null; - } - - if (denominator.area == 0.0) { - return null; - } - return numerator.area / denominator.area; - } - -} diff --git a/src/main/java/a8k/app/a8kproj/optanalyzer/PeakNameAssigner.java b/src/main/java/a8k/app/a8kproj/optanalyzer/PeakNameAssigner.java deleted file mode 100644 index a774768..0000000 --- a/src/main/java/a8k/app/a8kproj/optanalyzer/PeakNameAssigner.java +++ /dev/null @@ -1,48 +0,0 @@ -package a8k.app.a8kproj.optanalyzer; - -import a8k.app.a8kproj.optalgo.type.A8kOptPeaks; -import a8k.app.a8ktype.opttype.PeakName; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class PeakNameAssigner { - public static void assignPeakName(Integer projId, Integer peakNameRefNum, A8kOptPeaks peaks) { - - - //项目ID==1时,峰的命名是特殊的 - if (projId == 2) { - peaks.P080.peakName = PeakName.C; - peaks.P120.peakName = PeakName.T; - } else { - - // - switch (peakNameRefNum) { - case 2 -> { - peaks.P080.peakName = PeakName.T; - peaks.P120.peakName = PeakName.C; - } - case 3 -> { - peaks.P040.peakName = PeakName.H; - peaks.P080.peakName = PeakName.T; - peaks.P120.peakName = PeakName.C; - } - case 4 -> { - peaks.P040.peakName = PeakName.R; - peaks.P080.peakName = PeakName.H; - peaks.P120.peakName = PeakName.T; - peaks.P160.peakName = PeakName.C; - } - case 5 -> { - peaks.P040.peakName = PeakName.T4; - peaks.P080.peakName = PeakName.R; - peaks.P120.peakName = PeakName.H; - peaks.P160.peakName = PeakName.T; - peaks.P200.peakName = PeakName.C; - } - default -> { - } - } - } - } - -} diff --git a/src/main/java/a8k/app/a8kproj/optanalyzer/context/OptAnalyzeContext.java b/src/main/java/a8k/app/a8kproj/optanalyzer/context/OptAnalyzeContext.java deleted file mode 100644 index df1975a..0000000 --- a/src/main/java/a8k/app/a8kproj/optanalyzer/context/OptAnalyzeContext.java +++ /dev/null @@ -1,28 +0,0 @@ -package a8k.app.a8kproj.optanalyzer.context; - -import a8k.app.a8ktype.state.SampleInfo; -import a8k.app.dao.type.OptCfg; -import a8k.app.utils.ProjInfo; - -public class OptAnalyzeContext { - - public SampleInfo sampleInfo; - public ProjInfo projInfoCxt; - public int subProjIndex; - - public OptAnalyzeContext(SampleInfo sampleInfo, ProjInfo projInfoCxt, int subProjIndex) { - this.sampleInfo = sampleInfo; - this.projInfoCxt = projInfoCxt; - this.subProjIndex = subProjIndex; - } - - public OptCfg getProjOptInfo() { - return projInfoCxt.buildIn.optcfg.get(subProjIndex); - } - - public String getProjName() { - return projInfoCxt.buildIn.projName; - } - - -} diff --git a/src/main/java/a8k/app/a8kproj/optanalyzer/exception/A8kOptProcessException.java b/src/main/java/a8k/app/a8kproj/optanalyzer/exception/A8kOptProcessException.java deleted file mode 100644 index 1399fa6..0000000 --- a/src/main/java/a8k/app/a8kproj/optanalyzer/exception/A8kOptProcessException.java +++ /dev/null @@ -1,13 +0,0 @@ -package a8k.app.a8kproj.optanalyzer.exception; - -import a8k.app.a8ktype.opttype.ReactionResultStatus; - -public class A8kOptProcessException extends Exception { - public ReactionResultStatus status = ReactionResultStatus.SUCCESS; - public String errorMsg = ""; - - public A8kOptProcessException(ReactionResultStatus status, String errorMsg) { - super(status.toString()); - this.status = status; - } -} diff --git a/src/main/java/a8k/app/a8ktype/opttype/A8kOptX.java b/src/main/java/a8k/app/a8ktype/opttype/A8kOptX.java deleted file mode 100644 index 611ad62..0000000 --- a/src/main/java/a8k/app/a8ktype/opttype/A8kOptX.java +++ /dev/null @@ -1,31 +0,0 @@ -package a8k.app.a8ktype.opttype; - -public enum A8kOptX { - USUPPORT, - R, //1 - AR, //2 - ATR, //3 - R_ADD_ATR, //4 - RFR, //5 - T4R, //6 - T4T3R, //7 - RFR_ADD_T4T3R, //8 - ; - - A8kOptX() { - } - - static public A8kOptX valueOf(int index) { - return switch (index) { - case 1 -> R; - case 2 -> AR; - case 3 -> ATR; - case 4 -> R_ADD_ATR; - case 5 -> RFR; - case 6 -> T4R; - case 7 -> T4T3R; - case 8 -> RFR_ADD_T4T3R; - default -> USUPPORT; - }; - } -} diff --git a/src/main/java/a8k/app/a8ktype/opttype/OptScanDirection.java b/src/main/java/a8k/app/a8ktype/opttype/OptScanDirection.java deleted file mode 100644 index f71a7e4..0000000 --- a/src/main/java/a8k/app/a8ktype/opttype/OptScanDirection.java +++ /dev/null @@ -1,10 +0,0 @@ -package a8k.app.a8ktype.opttype; - -public enum OptScanDirection { - FORWARD, //从左向右扫描 - BACKWARD; - - public Integer getInteger() { - return this == FORWARD ? 1 : -1; - } -} diff --git a/src/main/java/a8k/app/a8ktype/opttype/PeakDivision.java b/src/main/java/a8k/app/a8ktype/opttype/PeakDivision.java deleted file mode 100644 index 3c5336d..0000000 --- a/src/main/java/a8k/app/a8ktype/opttype/PeakDivision.java +++ /dev/null @@ -1,18 +0,0 @@ -package a8k.app.a8ktype.opttype; - -public enum PeakDivision { - R(PeakName.T, PeakName.C), //T/C - AR(PeakName.H, PeakName.C), //H/C - ATR(PeakName.T, PeakName.H), //T/H - RFR(PeakName.R, PeakName.C), //R/C - T4R(PeakName.T4, PeakName.C), //T4/C - T4T3R(PeakName.R, PeakName.T4); //R/T4 - ; - public final PeakName numerator; - public final PeakName denominator; - - PeakDivision(PeakName numerator, PeakName denominator) { - this.numerator = numerator; - this.denominator = denominator; - } -} diff --git a/src/main/java/a8k/app/a8ktype/opttype/PeakName.java b/src/main/java/a8k/app/a8ktype/opttype/PeakName.java deleted file mode 100644 index 0ed1740..0000000 --- a/src/main/java/a8k/app/a8ktype/opttype/PeakName.java +++ /dev/null @@ -1,9 +0,0 @@ -package a8k.app.a8ktype.opttype; - -public enum PeakName { - T4, - R, - H, - T, - C, -} diff --git a/src/main/java/a8k/app/a8ktype/opttype/ReactionResultStatus.java b/src/main/java/a8k/app/a8ktype/opttype/ReactionResultStatus.java deleted file mode 100644 index 388d0dd..0000000 --- a/src/main/java/a8k/app/a8ktype/opttype/ReactionResultStatus.java +++ /dev/null @@ -1,52 +0,0 @@ -package a8k.app.a8ktype.opttype; - -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(description = """ - 反应结果状态: - DISABLED: 未启用 - SUCCESS: 成功 - ERROR: 结果异常 - ERROR_RESULT_OUT_OF_RANGE: 结果超出范围 - ERROR_RESULT_EXCEED_THE_UPPER_LIMIT: 超过上限 - ERROR_RESULT_BELOW_THE_LOWER_LIMIT: 低于下限 - ERROR_X_EXCEED_THE_UPPER_LIMIT: 超过上限 - ERROR_X_BELOW_THE_LOWER_LIMIT: 低于下限 - ERROR_QUALITY_PEAK_DETECTION: 质峰检测错误 - ERROR_LOST_PEAK_T4: T4峰丢失 - ERROR_LOST_PEAK_R: R峰丢失 - ERROR_LOST_PEAK_H: H峰丢失 - ERROR_LOST_PEAK_T: T峰丢失 - ERROR_LOST_PEAK_C: C峰丢失 - ERROR_UNKOWN_X: 未知X""") -public enum ReactionResultStatus { - /* - * 命名规范,如果结果错误,则ERROR开头的状态,表示结果异常。 - */ - DISABLED, // 未启用 - SUCCESS,// 成功 - ERROR,// 结果异常 - ERROR_RESULT_OUT_OF_RANGE,// 结果超出范围 - ERROR_RESULT_EXCEED_THE_UPPER_LIMIT,// 超过上限 - ERROR_RESULT_BELOW_THE_LOWER_LIMIT, // 低于下限 - ERROR_X_EXCEED_THE_UPPER_LIMIT,// 超过上限 - ERROR_X_BELOW_THE_LOWER_LIMIT, // 低于下限 - ERROR_QUALITY_PEAK_DETECTION,// 质峰检测错误 - - ERROR_LOST_PEAK_T4,// T4峰丢失 - ERROR_LOST_PEAK_R, // R峰丢失 - ERROR_LOST_PEAK_H, // H峰丢失 - ERROR_LOST_PEAK_T, // T峰丢失 - ERROR_LOST_PEAK_C, // C峰丢失 - - - ERROR_COMPUTE_R_FAIL, // - ERROR_COMPUTE_AR_FAIL, // - ERROR_COMPUTE_ATR_FAIL, // - ERROR_COMPUTE_RFR_FAIL, // - ERROR_COMPUTE_T4R_FAIL, // - ERROR_COMPUTE_T4T3R_FAIL, // - - - ERROR_UNKOWN_X, -} diff --git a/src/main/java/a8k/app/a8ktype/state/ProjectTaskContext.java b/src/main/java/a8k/app/a8ktype/state/ProjectTaskContext.java index 085660d..84c4d0f 100644 --- a/src/main/java/a8k/app/a8ktype/state/ProjectTaskContext.java +++ b/src/main/java/a8k/app/a8ktype/state/ProjectTaskContext.java @@ -1,12 +1,12 @@ package a8k.app.a8ktype.state; import a8k.SpringBootBeanUtil; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.device.*; import a8k.app.a8ktype.param.type.A8kSamplePos; import a8k.app.dao.type.ProjExtInfoCard; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; -import a8k.app.dao.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.app.service.exparam.HbotConsumableExParamMgr; import a8k.app.utils.ProjBuildinInfo; import a8k.app.utils.ProjInfoReader; diff --git a/src/main/java/a8k/app/a8ktype/type/ReactionResult.java b/src/main/java/a8k/app/a8ktype/type/ReactionResult.java index 2b930b4..2843e40 100644 --- a/src/main/java/a8k/app/a8ktype/type/ReactionResult.java +++ b/src/main/java/a8k/app/a8ktype/type/ReactionResult.java @@ -1,7 +1,7 @@ package a8k.app.a8ktype.type; -import a8k.app.dao.type.a8kidcard.A8kResultUnitConverter; -import a8k.app.a8ktype.opttype.ReactionResultStatus; +import a8k.app.optalgo.type.a8kidcard.A8kResultUnitConverter; +import a8k.app.optalgo.type.ReactionResultStatus; import a8k.app.utils.ZJsonHelper; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/src/main/java/a8k/app/dao/type/OptCfg.java b/src/main/java/a8k/app/dao/type/OptCfg.java index d1e93d1..1252a69 100644 --- a/src/main/java/a8k/app/dao/type/OptCfg.java +++ b/src/main/java/a8k/app/dao/type/OptCfg.java @@ -1,6 +1,6 @@ package a8k.app.dao.type; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import java.io.Serializable; diff --git a/src/main/java/a8k/app/dao/type/OptRawScanData.java b/src/main/java/a8k/app/dao/type/OptRawScanData.java index 98ccf14..dec288e 100644 --- a/src/main/java/a8k/app/dao/type/OptRawScanData.java +++ b/src/main/java/a8k/app/dao/type/OptRawScanData.java @@ -1,6 +1,6 @@ package a8k.app.dao.type; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.app.utils.ZJsonHelper; public class OptRawScanData { diff --git a/src/main/java/a8k/app/dao/type/ProjExtInfoCard.java b/src/main/java/a8k/app/dao/type/ProjExtInfoCard.java index 0b74d07..d5810fc 100644 --- a/src/main/java/a8k/app/dao/type/ProjExtInfoCard.java +++ b/src/main/java/a8k/app/dao/type/ProjExtInfoCard.java @@ -1,6 +1,6 @@ package a8k.app.dao.type; -import a8k.app.dao.type.a8kidcard.A8kOptFnFormula; +import a8k.app.optalgo.type.a8kidcard.A8kOptFnFormula; import a8k.app.utils.ZDateUtils; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/a8k/app/dao/type/ProjectBaseInfo.java b/src/main/java/a8k/app/dao/type/ProjectBaseInfo.java index 7772c95..d0356e6 100644 --- a/src/main/java/a8k/app/dao/type/ProjectBaseInfo.java +++ b/src/main/java/a8k/app/dao/type/ProjectBaseInfo.java @@ -1,6 +1,6 @@ package a8k.app.dao.type; -import a8k.app.dao.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.app.utils.ZJsonHelper; import java.io.Serializable; diff --git a/src/main/java/a8k/app/dao/type/ReactionReport.java b/src/main/java/a8k/app/dao/type/ReactionReport.java index e4698aa..9691412 100644 --- a/src/main/java/a8k/app/dao/type/ReactionReport.java +++ b/src/main/java/a8k/app/dao/type/ReactionReport.java @@ -1,9 +1,9 @@ package a8k.app.dao.type; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.type.ReactionResult; import a8k.app.a8ktype.device.BloodType; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.app.utils.ProjInfo; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/A8kNormalFn.java b/src/main/java/a8k/app/dao/type/a8kidcard/A8kNormalFn.java deleted file mode 100644 index 4ca31da..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/A8kNormalFn.java +++ /dev/null @@ -1,43 +0,0 @@ -package a8k.app.dao.type.a8kidcard; - -import a8k.app.a8ktype.opttype.A8kOptX; - -import java.io.Serializable; - -public class A8kNormalFn implements Serializable ,Cloneable{ - // 非分段函数 - public A8kOptX x = A8kOptX.R; // 函数未知数是 0150 - public Double xMin = 0.0; // 函数未知数下限闻值 0155 - public Double xMax = 99999.0; // 函数未知数上限闻值 015A - - public Double A = 1.0;//015F - public Double B = 1.0;//0164 - public Double C = 1.0;//0169 - public Double D = 1.0;//016E - public Double lowLimit = 0.0;//0173 - public Double upLimit = 999999.0;//0178 - - public A8kNormalFn clone() { - try { - return (A8kNormalFn) super.clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - - - public A8kNormalFn() { - } - - public A8kNormalFn(A8kOptX x, Double xMin, Double xMax, Double a, Double b, Double c, Double d, Double lowLimit, Double upLimit) { - this.x = x; - this.xMin = xMin; - this.xMax = xMax; - A = a; - B = b; - C = c; - D = d; - this.lowLimit = lowLimit; - this.upLimit = upLimit; - } -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/A8kOptFnFormula.java b/src/main/java/a8k/app/dao/type/a8kidcard/A8kOptFnFormula.java deleted file mode 100644 index 7645eb7..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/A8kOptFnFormula.java +++ /dev/null @@ -1,21 +0,0 @@ -package a8k.app.dao.type.a8kidcard; - -import a8k.app.dao.type.a8kidcard.zenum.A8kFnType; - -import java.io.Serializable; - -public class A8kOptFnFormula implements Serializable { - public A8kFnType fnType = A8kFnType.NormalFn; - - //普通函数 - public A8kNormalFn serumNorFn; // 血清 - public A8kNormalFn bloodNorFn; // 血浆 - - // 分段函数系数 - public A8kPiecewiseFn serumPiecewiseFn; // 血清 - public A8kPiecewiseFn bloodPiecewiseFn; // 血浆 - - //结果 - public A8kResultBuilderFn resultBuilderFn; //结果生成函数 - -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/A8kPiecewiseFn.java b/src/main/java/a8k/app/dao/type/a8kidcard/A8kPiecewiseFn.java deleted file mode 100644 index ea049e9..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/A8kPiecewiseFn.java +++ /dev/null @@ -1,76 +0,0 @@ -package a8k.app.dao.type.a8kidcard; - -import a8k.app.a8ktype.opttype.A8kOptX; - -import java.io.Serializable; - -public class A8kPiecewiseFn implements Serializable { - // 分段函数 - public A8kOptX judeX; // 分界判断数据来源 01F0 - public Double judeThres; // 分界判断数据值 01F5 - public A8kOptX lX; // 低浓度未知数 01FA - public A8kOptX hX; // 高浓度未知数 01FF - public Double xMin; // 函数未知数下限闻值 0204 - public Double xMax; // 函数未知数上限闻值 0209 - - // 血清分段函数系数 - public Double A0; - public Double B0; - public Double C0; - public Double D0; - - public Double A1; - public Double B1; - public Double C1; - public Double D1; - - public Double lowLimit; - public Double upLimit; - - public A8kPiecewiseFn() { - } - - public A8kPiecewiseFn( - A8kOptX judeX, - Double judeThres, - A8kOptX lX, - A8kOptX hX, - Double xMin, - Double xMax, - Double a0, - Double b0, - Double c0, - Double d0, - Double a1, - Double b1, - Double c1, - Double d1, - Double lowLimit, - Double upLimit) { - this.judeX = judeX; - this.judeThres = judeThres; - this.lX = lX; - this.hX = hX; - this.xMin = xMin; - this.xMax = xMax; - this.A0 = a0; - this.B0 = b0; - this.C0 = c0; - this.D0 = d0; - this.A1 = a1; - this.B1 = b1; - this.C1 = c1; - this.D1 = d1; - this.lowLimit = lowLimit; - this.upLimit = upLimit; - } - - public A8kPiecewiseFn clone() { - try { - return (A8kPiecewiseFn) super.clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/A8kResultBuilderFn.java b/src/main/java/a8k/app/dao/type/a8kidcard/A8kResultBuilderFn.java deleted file mode 100644 index d873bbf..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/A8kResultBuilderFn.java +++ /dev/null @@ -1,57 +0,0 @@ -package a8k.app.dao.type.a8kidcard; - -import a8k.app.dao.type.a8kidcard.zenum.A8kResultUnit; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -public class A8kResultBuilderFn implements Serializable, Cloneable { - // 结果 - public A8kResultUnit ret1Unit = A8kResultUnit.noUint; // 单位 02E0 - public A8kResultUnit ret2Unit; // 单位 02E5 - public A8kResultUnit ret3Unit; // 单位 02EA - // - public Double toUint2FnA; // 结果转换为单位2的函数A result2 = A * result1 + B 02EF - public Double toUint2FnB; // 结果转换为单位2的函数B 02F4 - - // - public Double toUint3FnA; // 结果转换为单位3的函数A result3 = A * result1 + B 02F9 - public Double toUint3FnB; // 结果转换为单位3的函数B 02FE - - public A8kResultBuilderFn(A8kResultUnit ret1Unit, A8kResultUnit ret2Unit, A8kResultUnit ret3Unit, Double toUint2FnA, Double toUint2FnB, Double toUint3FnA, Double toUint3FnB) { - this.ret1Unit = ret1Unit; - this.ret2Unit = ret2Unit; - this.ret3Unit = ret3Unit; - this.toUint2FnA = toUint2FnA; - this.toUint2FnB = toUint2FnB; - this.toUint3FnA = toUint3FnA; - this.toUint3FnB = toUint3FnB; - } - - public A8kResultBuilderFn() { - } - - public A8kResultBuilderFn clone() { - try { - return (A8kResultBuilderFn) super.clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - - - public List toResultUnitConverters() { - List resultConverters = new ArrayList<>(); - if (ret1Unit != null) { - resultConverters.add(new A8kResultUnitConverter(ret1Unit, 1.0, 0.0)); - } - if (ret2Unit != null) { - resultConverters.add(new A8kResultUnitConverter(ret2Unit, toUint2FnA, toUint2FnB)); - } - if (ret3Unit != null) { - resultConverters.add(new A8kResultUnitConverter(ret3Unit, toUint3FnA, toUint3FnB)); - } - return resultConverters; - } -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/A8kResultUnitConverter.java b/src/main/java/a8k/app/dao/type/a8kidcard/A8kResultUnitConverter.java deleted file mode 100644 index 6d72605..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/A8kResultUnitConverter.java +++ /dev/null @@ -1,44 +0,0 @@ -package a8k.app.dao.type.a8kidcard; - -import a8k.app.dao.type.a8kidcard.zenum.A8kResultUnit; - -import java.io.Serializable; - -public class A8kResultUnitConverter implements Serializable { - // 结果 - public A8kResultUnit uint; - public String uintstr = ""; - public Double A; // 结果转换为单位2的函数A result2 = A * result1 + B 02EF - public Double B; // 结果转换为单位2的函数B 02F4 - - public A8kResultUnitConverter(A8kResultUnit uint, Double A, Double B) { - this.uint = uint; - this.A = A; - this.B = B; - this.uintstr = uint.unitstr; - } - - public A8kResultUnitConverter() { - } - - public String convert(Double firstResult) { - if (uint == null) { - return null; - } - if (A == null) { - return null; - } - double result = A * firstResult + B; - return String.format("%.2f %s", result, uint.unitstr); - } - - public Double computeResultVal(Double firstResult) { - if (uint == null) { - return null; - } - if (A == null) { - return null; - } - return A * firstResult + B; - } -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kFnType.java b/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kFnType.java deleted file mode 100644 index cabfce8..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kFnType.java +++ /dev/null @@ -1,21 +0,0 @@ -package a8k.app.dao.type.a8kidcard.zenum; - -public enum A8kFnType { - NormalFn(1),//正常函数 - PiecewiseFn(2),//分段函数 - ; - final int val; - - A8kFnType(int val) { - this.val = val; - } - - public static A8kFnType fromInt(int val) { - for (A8kFnType type : A8kFnType.values()) { - if (type.val == val) { - return type; - } - } - return null; - } -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kOptType.java b/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kOptType.java deleted file mode 100644 index fa6cd99..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kOptType.java +++ /dev/null @@ -1,6 +0,0 @@ -package a8k.app.dao.type.a8kidcard.zenum; - -public enum A8kOptType { - FOPT, - TOPT, -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kReactionFlowType.java b/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kReactionFlowType.java deleted file mode 100644 index b02f0f4..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kReactionFlowType.java +++ /dev/null @@ -1,41 +0,0 @@ -package a8k.app.dao.type.a8kidcard.zenum; - -public enum A8kReactionFlowType { - /** - * 流程: - * 取tip - * 刺破小缓冲瓶 - * 取样本 - * 取tip - * 放入样本到小缓冲瓶 - * 吸吐混匀 - * 取样 - * 滴定 - */ - SampleAndBS(1, 2), //样本和小瓶缓冲反应 - - /** - * - * 流程: - * 取tip - * 取大瓶缓冲液 - * 放入探测物质中 - * - * 取tip - * 取样本 - * 放入探测物质中 - * 吸吐混匀 - * 取样 - * 滴定 - */ - SampleAndBSAndProbeSubstance(2, 2),//样本,大瓶缓冲液,探测物质反应 - ; - public final int tipUseNum; - public final int valInIdCard; - - A8kReactionFlowType(int valInIdCard, int tipUseNum) { - this.tipUseNum = tipUseNum; - this.valInIdCard = valInIdCard; - } - -} diff --git a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kResultUnit.java b/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kResultUnit.java deleted file mode 100644 index 494330c..0000000 --- a/src/main/java/a8k/app/dao/type/a8kidcard/zenum/A8kResultUnit.java +++ /dev/null @@ -1,73 +0,0 @@ -package a8k.app.dao.type.a8kidcard.zenum; - -public enum A8kResultUnit { - Original(0, ""), - noUint(1, ""), - pgPml(2, "pg/mL"), - ngPml(3, "ng/mL"), - ugPml(4, "ug/mL"), - mgPml(5, "mg/mL"), - pgPl(6, "pg/L"), - ngPl(7, "ng/L"), - ugPl(8, "ug/L"), - mgPl(9, "mg/L"), - gPl(10, "g/L"), - ngPdl(11, "ng/dL"), - ugPdl(12, "ug/dL"), - mgPdl(13, "mg/dL"), - gPdl(14, "g/dL"), - pmolPl(15, "pmol/L"), - nmolPl(16, "nmol/L"), - umolPl(17, "umol/L"), - mmolPl(18, "mmol/L"), - uiuPml(19, "uIU/mL"), - miuPml(20, "mIU/mL"), - iuPml(21, "IU/mL"), - uuPml(22, "uU/mL"), - muPml(23, "mU/mL"), - uPml(24, "U/mL"), - muPl(25, "mU/L"), - uPl(26, "U/L"), - kiuPl(27, "kIU/L"), - kuPl(28, "kU/L"), - percent(29, "%"), - mmolPmol(30, "mmol/mol"), - milPul(31, "mil/uL"), - mmP1h(32, "mm/1h"), - ul(33, "/uL"), - ukatPl(34, "ukat/L"), - nkatPl(35, "nkat/L"), - mptPl(36, "mpt/L"), - tptPl(37, "tpt/L"), - gptPl(38, "gpt/L"), - pfuPml(39, "PFU/mL"), - cfuPml(40, "CFU/mL"), - sPco(41, "S/CO"), - coi(42, "COI"), - index(43, ""), - UNSUPPORT(-1, "UNSUPPORT"), - ; - - - public final int val; - public final String unitstr; - - A8kResultUnit(int val, String unitstr) { - this.val = val; - this.unitstr = unitstr; - } - - static public A8kResultUnit valueOf(Integer val) { - if (val == 0) { - return null; - } - - for (A8kResultUnit unit : values()) { - if (unit.val == val) { - return unit; - } - } - return UNSUPPORT; - } - -} diff --git a/src/main/java/a8k/app/hardware/driver/OptModuleDriver.java b/src/main/java/a8k/app/hardware/driver/OptModuleDriver.java index 0da6af8..a79b4b7 100644 --- a/src/main/java/a8k/app/hardware/driver/OptModuleDriver.java +++ b/src/main/java/a8k/app/hardware/driver/OptModuleDriver.java @@ -8,7 +8,7 @@ import a8k.app.hardware.type.a8kcanprotocol.CmdId; import a8k.app.hardware.type.a8kcanprotocol.MId; import a8k.app.hardware.type.a8kcanprotocol.ModuleStatus; import a8k.app.hardware.driver.type.OptModuleRegIndex; -import a8k.app.a8ktype.opttype.OptScanDirection; +import a8k.app.optalgo.type.OptScanDirection; import a8k.app.a8ktype.error.AEHardwareError; import a8k.app.a8ktype.exception.AppException; import a8k.app.utils.ByteArray; diff --git a/src/main/java/a8k/app/hardware/utils/OptGainConvert.java b/src/main/java/a8k/app/hardware/utils/OptGainConvert.java index 0aa7c61..e6891fc 100644 --- a/src/main/java/a8k/app/hardware/utils/OptGainConvert.java +++ b/src/main/java/a8k/app/hardware/utils/OptGainConvert.java @@ -1,6 +1,6 @@ package a8k.app.hardware.utils; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; public class OptGainConvert { diff --git a/src/main/java/a8k/app/optalgo/A8kOptCurveAnalyzer.java b/src/main/java/a8k/app/optalgo/A8kOptCurveAnalyzer.java new file mode 100644 index 0000000..037587f --- /dev/null +++ b/src/main/java/a8k/app/optalgo/A8kOptCurveAnalyzer.java @@ -0,0 +1,160 @@ +package a8k.app.optalgo; + +import a8k.app.optalgo.algo.LeastSquare; +import a8k.app.optalgo.algo.SubSampling; +import a8k.app.optalgo.algo.SupperSampling; +import a8k.app.optalgo.type.*; +import a8k.app.optalgo.utils.*; +import a8k.app.dao.type.OptCfg; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class A8kOptCurveAnalyzer { + double[] avg; + double[] diffx2; + double[] diff; + double avgLine; + double[] afSupperVal; + double[] afSubSampling; + + Integer[] rawData; + + OptCfg optCfg; + Integer projId; + + + public A8kOptPeakInfo analysCurve(Integer projId, OptCfg optCfg, Integer[] data) { + double[] doubleData = new double[data.length]; + for (int i = 0; i < data.length; i++) { + doubleData[i] = data[i]; + } + this.optCfg = optCfg; + this.rawData = data; + this.projId = projId; + return analysCurve(doubleData); + } + + private A8kOptPeakInfo analysCurve(double[] data) { + + + //过采样 + afSupperVal = SupperSampling.process(data, 5); + afSubSampling = SubSampling.process(afSupperVal, 24); + + avg = afSubSampling; + diff = LeastSquare.calculatedSlopeCurve(avg, 5); + diffx2 = LeastSquare.calculatedSlopeCurve(diff, 5); + avgLine = findAvgLine(afSubSampling); + + + A8kOptPeaks peaks = new A8kOptPeaks(); + + findpeak(avg, 20, 60, peaks.P040); + findpeak(avg, 60, 100, peaks.P080); + findpeak(avg, 100, 140, peaks.P120); + findpeak(avg, 140, 180, peaks.P160); + findpeak(avg, 180, 220, peaks.P200); + + PeakNameAssigner.assignPeakName(projId, optCfg.peakNameRefNum, peaks); + + + return A8kOptPeakInfoBuilder.build(afSubSampling, peaks); + } + + double findAvgLine(double[] inputRaw) { + double base_min = 500; + double fsum = 0; + int cnt = 0; + + int range = inputRaw.length; + + do { + fsum = cnt = 0; + for (int i = 1; i < range; i++) { + if (inputRaw[i] < base_min) { + fsum += inputRaw[i]; + cnt++; + } + } + + base_min = base_min + 50; + } while (cnt < range - 15 * inputRaw.length / 250); + + return fsum / cnt; + } + + void findpeak(double[] data, int search_start, int search_end, A8kOptPeak retpeak) { + // find peak + int findpeakTargetPos = search_start + (search_end - search_start) / 2; + log.info("find peak {}", findpeakTargetPos); + retpeak.state = PeakFindState.NOT_FIND_PEAK; + retpeak.area = 0.0; + retpeak.peakPos = 0; + retpeak.peakStartPos = 0; + retpeak.peakEndPos = 0; + + double max = 0; + int peakpos = 0; + int midpos = search_start + (search_end - search_start) / 2; + for (int i = search_start; i < search_end; i++) { + if (data[i] > max) { + max = data[i]; + peakpos = i; + } + } + + if (max < avgLine) { + log.warn("find peak-{} fail, max:{} < m_cxt.agvline:{}", findpeakTargetPos, max, avgLine); + return; + } else if (peakpos > midpos + 15) { + log.warn("find peak-{} fail, peakpos > midpos + 15:{}", findpeakTargetPos, midpos + 15); + return; + } else if (peakpos < midpos - 15) { + log.warn("find peak-{} fail, peakpos < midpos - 15:{}", findpeakTargetPos, midpos - 15); + return; + } + + // find_peak_start + // 从pos向前找20个点,从低于均值线的坐标开始找,找到diff2的最大值 + retpeak.peakPos = peakpos; + retpeak.peakStartPos = findPeakStartTurnPoint(data, peakpos - 20, peakpos) - 4; //-4 是经验数值 + retpeak.peakEndPos = findPeakEndTurnPoint(data, peakpos, peakpos + 20) + 4; //+4 是经验数值 + retpeak.area = computePeakArea(data, retpeak.peakStartPos, retpeak.peakEndPos); + retpeak.state = PeakFindState.FIND_PEAK; + log.info("find peak:{} startpos:{} endpos:{} area:{}", retpeak.peakPos, retpeak.peakStartPos, retpeak.peakEndPos, retpeak.area); + + // find_peak_end + // 从pos向后找20个点,找到diff2的最大值 + } + + int findPeakStartTurnPoint(double[] data, int search_start, int suggest_search_end) { + int peakTurnPos = search_start; + double maxdiff2 = diffx2[search_start]; + for (int i = search_start; i < suggest_search_end; i++) { + if (diffx2[i] > maxdiff2) { + maxdiff2 = diffx2[i]; + peakTurnPos = i; + } + } + return peakTurnPos; + } + + int findPeakEndTurnPoint(double[] data, int search_start, int suggest_search_end) { + return findPeakStartTurnPoint(new double[0], search_start, suggest_search_end); + } + + double abs(double a) { + return a > 0 ? a : -a; + } + + double computePeakArea(double[] data, int start, int end) { + double area = 0; + for (int i = start; i < end; i++) { + area += data[i]; + } + + double baselinearea = (data[start] + data[end]) * abs(end - start) / 2; + return abs(area - baselinearea); + } +} diff --git a/src/main/java/a8k/app/optalgo/A8kPeakAnalyzer.java b/src/main/java/a8k/app/optalgo/A8kPeakAnalyzer.java new file mode 100644 index 0000000..64a7ef7 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/A8kPeakAnalyzer.java @@ -0,0 +1,218 @@ +package a8k.app.optalgo; + +import a8k.app.dao.type.OptCfg; +import a8k.app.optalgo.type.A8kOptPeakInfo; +import a8k.app.optalgo.type.A8kOptProcessException; +import a8k.app.a8ktype.state.SampleInfo; +import a8k.app.optalgo.type.a8kidcard.A8kNormalFn; +import a8k.app.optalgo.type.a8kidcard.A8kOptFnFormula; +import a8k.app.optalgo.type.a8kidcard.A8kPiecewiseFn; +import a8k.app.optalgo.type.a8kidcard.A8kResultBuilderFn; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kFnType; +import a8k.app.a8ktype.type.ReactionResult; +import a8k.app.optalgo.type.ReactionResultStatus; +import a8k.app.optalgo.utils.A8kOptXGetter; +import a8k.app.optalgo.utils.OptChecker; +import a8k.app.utils.ProjInfo; +import a8k.app.utils.ProjInfoUtils; +import a8k.app.utils.ZloggerRecorder; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; + +// +// 光学结果分析器 +// +// +// + +@Slf4j +public class A8kPeakAnalyzer { + + static public class OptAnalyzeContext { + + public SampleInfo sampleInfo; + public ProjInfo projInfoCxt; + public int subProjIndex; + + public OptAnalyzeContext(SampleInfo sampleInfo, ProjInfo projInfoCxt, int subProjIndex) { + this.sampleInfo = sampleInfo; + this.projInfoCxt = projInfoCxt; + this.subProjIndex = subProjIndex; + } + + public OptCfg getProjOptInfo() { + return projInfoCxt.buildIn.optcfg.get(subProjIndex); + } + + public String getProjName() { + return projInfoCxt.buildIn.projName; + } + + + } + + // + // PUBLIC + // + + + static public ReactionResult analysisPeakInfo(SampleInfo sampleInfo, ProjInfo projInfoCxt, int subProjIndex, A8kOptPeakInfo a8kOptPeakInfo) { + zloggerRecorder.clear(); + zloggerRecorder.info("================OPT COMPUTE RESULT============="); + zloggerRecorder.info("optComputeResult:%s proj:%s(%s) sub-proj:%s", sampleInfo.sampleId, projInfoCxt.buildIn.projId, projInfoCxt.buildIn.projName, subProjIndex); + OptAnalyzeContext optAnalyzeContext = new OptAnalyzeContext(sampleInfo, projInfoCxt, subProjIndex); + try { + return analyzeResult(optAnalyzeContext, a8kOptPeakInfo); + } catch (A8kOptProcessException e) { + zloggerRecorder.error("optComputeResult fail:%s,%s ", e.status, e.errorMsg); + return new ReactionResult(optAnalyzeContext.getProjOptInfo().subProjName, optAnalyzeContext.getProjOptInfo().subProjShortName, e.status, e.errorMsg); + } + } + + static public String getComputeContext() { + return zloggerRecorder.getRecord(); + } + + + // + // PRIVATE + // + + + static ZloggerRecorder zloggerRecorder = new ZloggerRecorder(LoggerFactory.getLogger(A8kPeakAnalyzer.class)); + + static String fmt(Double val) { + return val == null ? "null" : String.format("%.5f", val); + } + + static private Double compute2ndResult(A8kResultBuilderFn fn, Double firstResult) { + if (fn.ret2Unit == null) { + return null; + } + if (fn.toUint2FnA == null) { + return null; + } + + + double A = fn.toUint2FnA; + double B = fn.toUint2FnB != null ? fn.toUint2FnB : 0; + + double result2 = A * firstResult + B; + zloggerRecorder.info("======Compute 2nd Result======"); + zloggerRecorder.info("-Fromula : Y = %sX+%s", fmt(fn.toUint2FnA), fmt(fn.toUint2FnB)); + zloggerRecorder.info("-Unit :%s", fn.ret2Unit); + zloggerRecorder.info("-Input :%s", fmt(firstResult)); + zloggerRecorder.info("-Result :%s", fmt(result2)); + return result2; + } + + static private Double compute3rdResult(A8kResultBuilderFn fn, Double firstResult) { + if (fn.ret3Unit == null) { + return null; + } + if (fn.toUint3FnA == null) { + return null; + } + double A = fn.toUint3FnA; + double B = fn.toUint3FnB != null ? fn.toUint3FnB : 0; + double result = A * firstResult + B; + zloggerRecorder.info("======Compute 3rd Result======"); + zloggerRecorder.info("+Fromula : Y = %sX+%s", fmt(fn.toUint3FnA), fmt(fn.toUint3FnB)); + zloggerRecorder.info("+Unit :%s", fn.ret3Unit); + zloggerRecorder.info("+ Input :%s", fmt(firstResult)); + zloggerRecorder.info("+Result :%s", fmt(result)); + return result; + } + + // + + + //普通函数 + static Double callNorFn(OptAnalyzeContext optcxt, A8kNormalFn fn, A8kOptPeakInfo a8kOptPeakInfo) throws A8kOptProcessException { + zloggerRecorder.info("==========NormalFn=========="); + zloggerRecorder.info("-XType : %s", fn.x); + zloggerRecorder.info("-Fromula : Y = %sX^2+%sX+%s", fmt(fn.A), fmt(fn.B), fmt(fn.C)); + zloggerRecorder.info("-XRange : [%s:%s]", fmt(fn.xMin), fmt(fn.xMax)); + zloggerRecorder.info("-ResultRange: [%s:%s]", fmt(fn.lowLimit), fmt(fn.upLimit)); + + zloggerRecorder.info("-==========Result=========="); + Double X = A8kOptXGetter.getX(fn.x, optcxt.getProjOptInfo(), a8kOptPeakInfo); + zloggerRecorder.info("-Result:X = %s", fmt(X)); + OptChecker.checkX(X, fn.xMin, fn.xMax); + + Double result1 = fn.A * X * X + fn.B * X + fn.C; + zloggerRecorder.info("-Result:%s", fmt(result1)); + OptChecker.checkResult1(result1, fn.lowLimit, fn.upLimit); + return result1; + } + + + // 分段函数系数 + static Double callPiecewiseFn(OptAnalyzeContext optcxt, A8kPiecewiseFn fn, A8kOptPeakInfo a8kOptPeakInfo) throws A8kOptProcessException { + zloggerRecorder.info("==========PiecewiseFn=========="); + zloggerRecorder.info("+JudeX :%s", fn.judeX); + zloggerRecorder.info("+JudeThres :%s", fmt(fn.judeThres)); + zloggerRecorder.info("+lxType :%s", fn.lX); + zloggerRecorder.info("+hxType :%s", fn.hX); + zloggerRecorder.info("+LX : Y = %sX^3 + %sX^2 + %sX + %s", fmt(fn.A0), fmt(fn.B0), fmt(fn.C0), fmt(fn.D0)); + zloggerRecorder.info("+HX : Y = %sX^3 + %sX^2 + %sX + %s", fmt(fn.A1), fmt(fn.B1), fmt(fn.C1), fmt(fn.D1)); + zloggerRecorder.info("+XRange : [%s:%s]", fmt(fn.xMin), fmt(fn.xMax)); + zloggerRecorder.info("+ResultRange : [%s:%s]", fmt(fn.lowLimit), fmt(fn.upLimit)); + + + Double pwFnJudeX = A8kOptXGetter.getX(fn.judeX, optcxt.getProjOptInfo(), a8kOptPeakInfo); + Double X = null; + Double result1 = null; + boolean isHX = false; + if (pwFnJudeX < fn.judeThres) { + X = A8kOptXGetter.getX(fn.lX, optcxt.getProjOptInfo(), a8kOptPeakInfo); + result1 = fn.A0 * X * X * X + fn.B0 * X * X + fn.C0 * X + fn.D0; + } else { + X = A8kOptXGetter.getX(fn.hX, optcxt.getProjOptInfo(), a8kOptPeakInfo); + result1 = fn.A1 * X * X * X + fn.B1 * X * X + fn.C1 * X + fn.D1; + isHX = true; + } + zloggerRecorder.info("+==========Result=========="); + zloggerRecorder.info("+JudeX :%s", fmt(pwFnJudeX)); + zloggerRecorder.info("+FnType :%s", isHX ? "HX" : "LX"); + zloggerRecorder.info("+XVal :%s", fmt(X)); + zloggerRecorder.info("+Result :%s", fmt(result1)); + + + OptChecker.checkX(X, fn.xMin, fn.xMax); + OptChecker.checkResult1(result1, fn.lowLimit, fn.upLimit); + return result1; + } + + static ReactionResult buildResult(OptAnalyzeContext optcxt, A8kResultBuilderFn fn, Double result1) { + Assert.isTrue(result1 != null, "result1 must not be null"); + Double result2 = compute2ndResult(fn, result1); + Double result3 = compute3rdResult(fn, result1); + ReactionResult reactionResult = new ReactionResult(optcxt.getProjOptInfo().subProjName, optcxt.getProjOptInfo().subProjShortName, result1, fn.toResultUnitConverters()); + reactionResult.status = ReactionResultStatus.SUCCESS; + return reactionResult; + } + + static private ReactionResult analyzeResult(OptAnalyzeContext optcxt, A8kOptPeakInfo a8kOptPeakInfo) throws A8kOptProcessException { + // A8kOptFnFormula fnFormual = optcxt.projInfoCxt.getA8kOptFnFormula(optcxt.subProjIndex); + A8kOptFnFormula fnFormual = ProjInfoUtils.getA8kOptFnFormula(optcxt.projInfoCxt.ext, optcxt.subProjIndex); + Assert.isTrue(fnFormual != null, "fnFormual must not be null"); + Double result1 = null; + if (fnFormual.fnType.equals(A8kFnType.NormalFn)) { + result1 = switch (optcxt.sampleInfo.bloodType) { + case WHOLE_BLOOD -> callNorFn(optcxt, fnFormual.bloodNorFn, a8kOptPeakInfo); + case SERUM_OR_PLASMA -> callNorFn(optcxt, fnFormual.serumNorFn, a8kOptPeakInfo); + }; + } else if (fnFormual.fnType.equals(A8kFnType.PiecewiseFn)) { + result1 = switch (optcxt.sampleInfo.bloodType) { + case WHOLE_BLOOD -> callPiecewiseFn(optcxt, fnFormual.bloodPiecewiseFn, a8kOptPeakInfo); + case SERUM_OR_PLASMA -> callPiecewiseFn(optcxt, fnFormual.serumPiecewiseFn, a8kOptPeakInfo); + }; + } + + return buildResult(optcxt, fnFormual.resultBuilderFn, result1); + } + + +} diff --git a/src/main/java/a8k/app/optalgo/README.md b/src/main/java/a8k/app/optalgo/README.md new file mode 100644 index 0000000..5bb3037 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/README.md @@ -0,0 +1,8 @@ +```angular2html + +1. 该目录为巴迪泰光学算法相关内容 +2. 入口类为Ak8OptAlgoV2 +3. utils部分工具也可以使用 +4. 不包含任何Component + +``` \ No newline at end of file diff --git a/src/main/java/a8k/app/optalgo/algo/BasicAlgo.java b/src/main/java/a8k/app/optalgo/algo/BasicAlgo.java new file mode 100644 index 0000000..e26bfff --- /dev/null +++ b/src/main/java/a8k/app/optalgo/algo/BasicAlgo.java @@ -0,0 +1,87 @@ +package a8k.app.optalgo.algo; + +import org.springframework.util.Assert; + +public class BasicAlgo { + + + static public Boolean feq(double a, double b, double epsilon) { + double dv = a - b; + if (dv < 0) + dv = -dv; + return dv <= epsilon; + } + + + public static void bubbleSort(double[] src) { + // 实现冒泡排序 + for (int i = 0; i < src.length; i++) { + for (int j = 0; j < src.length - i - 1; j++) { + if (src[j] > src[j + 1]) { + double temp = src[j]; + src[j] = src[j + 1]; + src[j + 1] = temp; + } + } + } + } + + /** + * + * 填充数组 + * 输入数据一般经过窗口处理后,会出现边界数据不全的情况,需要填充 + * + * @param inputRaw 输入数据 + * @param windows_size 窗口大小 + */ + public static void padArraryAfWindowsAlgo(double[] inputRaw, int windows_size) { + int windows_size_half = (windows_size - 1) / 2; + double fillInVal0 = inputRaw[windows_size_half]; + double fillInVal1 = inputRaw[inputRaw.length - windows_size_half - 1]; + + for (int i = 0; i < windows_size_half; i++) { + inputRaw[i] = fillInVal0; + } + + for (int i = inputRaw.length - windows_size_half; i < inputRaw.length; i++) { + inputRaw[i] = fillInVal1; + } + } + + /** + * 获取窗口数据 + * @param src 数据 + * @param off 窗口中心位置 + * @param windows 窗口大小 + * @return 窗口数据 + */ + static public double[] getWindowsPoint(double[] src, int off, int windows) { + double[] ret = new double[windows]; + int retindex = 0; + for (int i = off - windows / 2; i <= off + windows / 2; i++) { + ret[retindex] = src[i]; + retindex++; + } + return ret; + } + + + static public boolean isMaxvalInWindows(double[] val, int pos, int windows_size) { + Assert.isTrue(windows_size > 0, "windows_size <= 0"); + Assert.isTrue(windows_size % 2 == 1, "windows_size is not odd"); + + boolean ret = true; + int startPos = pos - windows_size / 2; + double val0 = val[pos]; + for (int i = 0; i < windows_size; i++) { + if (startPos + i == pos) + continue; + + if (val[startPos + i] > val0) { + ret = false; + break; + } + } + return ret; + } +} diff --git a/src/main/java/a8k/app/optalgo/algo/LeastSquare.java b/src/main/java/a8k/app/optalgo/algo/LeastSquare.java new file mode 100644 index 0000000..c4e974c --- /dev/null +++ b/src/main/java/a8k/app/optalgo/algo/LeastSquare.java @@ -0,0 +1,72 @@ +package a8k.app.optalgo.algo; + +import a8k.app.optalgo.type.LinearResult; +import org.springframework.util.Assert; + +public class LeastSquare { + + + static LinearResult linearLeastSquares(double[] x, double[] y) { + LinearResult result = new LinearResult(); + int n = x.length; + double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumXX = 0.0; + for (int i = 0; i < n; ++i) { + sumX += x[i]; + sumY += y[i]; + sumXY += x[i] * y[i]; + sumXX += x[i] * x[i]; + } + double xMean = sumX / n; + double yMean = sumY / n; + + Assert.isTrue((!BasicAlgo.feq((sumXX - n * xMean * xMean), 0, 0.0001)), "!feq((sumXX - n * xMean * xMean), 0, 0.0001)"); + + result.slope = (sumXY - n * xMean * yMean) / (sumXX - n * xMean * xMean); + result.intercept = yMean - result.slope * xMean; + return result; + } + + // + public static LinearResult linearLeastSquares(double[] y, int size) { + double[] xpoint = new double[size]; + double[] ypoint = new double[size]; + + for (int i = 0; i < size; i++) { + xpoint[i] = i; + ypoint[i] = y[i]; + } + return linearLeastSquares(xpoint, ypoint); + } + + public static LinearResult linearLeastSquares(double[] y, int off, int size) { + double[] ypoint = new double[size]; + System.arraycopy(y, off, ypoint, 0, size); + return linearLeastSquares(ypoint, size); + } + + /** + * 计算斜率曲线 + * @param inputRaw 输入数据 + * @param windows_size 窗口大小 + * @return 斜率曲线 + */ + public static double[] calculatedSlopeCurve(double[] inputRaw, int windows_size) { + Assert.isTrue((windows_size > 0), "windows_size > 0"); + Assert.isTrue((windows_size % 2 == 1), "windows_size % 2 == 1"); + + double[] differentiateRaw = new double[inputRaw.length]; + double[] windowsRaw; + + int windows_size_half = (windows_size - 1) / 2; + + for (int index = windows_size_half; index < inputRaw.length - windows_size_half; index++) { + windowsRaw = BasicAlgo.getWindowsPoint(inputRaw, index, windows_size); + float intercept = 0; + LinearResult result = linearLeastSquares(windowsRaw, windows_size); + differentiateRaw[index] = result.slope; + } + + BasicAlgo.padArraryAfWindowsAlgo(differentiateRaw, windows_size); + return differentiateRaw; + } +} diff --git a/src/main/java/a8k/app/optalgo/algo/SubSampling.java b/src/main/java/a8k/app/optalgo/algo/SubSampling.java new file mode 100644 index 0000000..f827f1d --- /dev/null +++ b/src/main/java/a8k/app/optalgo/algo/SubSampling.java @@ -0,0 +1,26 @@ +package a8k.app.optalgo.algo; + +public class SubSampling { + public static double[] process(double[] inputRaw, int nSubSampleRate) { + double fAvg; + double nSum = 0; + + int subIndex = 0; + int nOutputLength = inputRaw.length / nSubSampleRate; + + double[] subSampledRaw = new double[nOutputLength]; + + for (int index = 0; index < inputRaw.length; index++) { + if (index % nSubSampleRate == 0 && index > 0) { + fAvg = nSum * 1.0f / nSubSampleRate; + if (subIndex < subSampledRaw.length) { + subSampledRaw[subIndex++] = fAvg; + } + nSum = 0; + } + nSum += inputRaw[index]; + } + subSampledRaw[subSampledRaw.length - 1] = subSampledRaw[subSampledRaw.length - 2]; + return subSampledRaw; + } +} diff --git a/src/main/java/a8k/app/optalgo/algo/SupperSampling.java b/src/main/java/a8k/app/optalgo/algo/SupperSampling.java new file mode 100644 index 0000000..e354030 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/algo/SupperSampling.java @@ -0,0 +1,30 @@ +package a8k.app.optalgo.algo; + +public class SupperSampling { + static public double[] process(double[] inputRaw, Integer nUpSampleRate) { + /* + * @brief + * 过采样,将输入的数据进行过采样,增加数据的密度 + */ + int nInputLength = inputRaw.length; + int nOutputLength = nInputLength * nUpSampleRate; + double[] upSamplingRaw = new double[nOutputLength]; + + for (int si = 0, di = 0; si < nInputLength - 1; di++) { + double a = upSamplingRaw[di * nUpSampleRate] = (double) inputRaw[si]; + double b = upSamplingRaw[(di + 1) * nUpSampleRate] = (double) inputRaw[++si]; + + double nSlope = (b - a) / nUpSampleRate; + + for (int i = 0; i < nUpSampleRate - 1; i++) { + int baseIndex = (di * nUpSampleRate) + i; + upSamplingRaw[baseIndex + 1] = upSamplingRaw[baseIndex] + nSlope; + } + } + + return upSamplingRaw; + } + + + +} diff --git a/src/main/java/a8k/app/optalgo/type/A8kOptPeak.java b/src/main/java/a8k/app/optalgo/type/A8kOptPeak.java new file mode 100644 index 0000000..f288f04 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/A8kOptPeak.java @@ -0,0 +1,42 @@ +package a8k.app.optalgo.type; + +public class A8kOptPeak { + public PeakFindState state = PeakFindState.NOT_FIND_PEAK; + public PeakName peakName; + public Integer off; + + public Double area; + public Integer peakPos; + public Integer peakStartPos; + public Integer peakEndPos; + + + public String toString() { + return String.format("[%s: %s]", peakName, area); + } + + public A8kOptPeak deepCopy() { + A8kOptPeak val = new A8kOptPeak(); + val.state = state; + val.off = off; + val.area = area; + val.peakPos = peakPos; + val.peakStartPos = peakStartPos; + val.peakEndPos = peakEndPos; + val.peakName = peakName; + return val; + } + + public A8kOptPeak() { + } + + public A8kOptPeak(PeakFindState state, PeakName peakName, Integer off, Double area, Integer peakPos, Integer peakStartPos, Integer peakEndPos) { + this.state = state; + this.peakName = peakName; + this.off = off; + this.area = area; + this.peakPos = peakPos; + this.peakStartPos = peakStartPos; + this.peakEndPos = peakEndPos; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/A8kOptPeakInfo.java b/src/main/java/a8k/app/optalgo/type/A8kOptPeakInfo.java new file mode 100644 index 0000000..e3b83d2 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/A8kOptPeakInfo.java @@ -0,0 +1,25 @@ +package a8k.app.optalgo.type; + +public class A8kOptPeakInfo { + + public String algoVersion = ""; + + public double[] resultData; // 250 POINT + + public A8kOptPeak T4; + public A8kOptPeak R; + public A8kOptPeak H; + public A8kOptPeak T; + public A8kOptPeak C; + + public Double pdR; //1 + public Double pdAR; //2 + public Double pdATR; //3 + public Double pdRFR; //5 + public Double pdT4R; //6 + public Double pdT4T3R; //7 + + + + +} diff --git a/src/main/java/a8k/app/optalgo/type/A8kOptPeaks.java b/src/main/java/a8k/app/optalgo/type/A8kOptPeaks.java new file mode 100644 index 0000000..1b8c2b9 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/A8kOptPeaks.java @@ -0,0 +1,55 @@ +package a8k.app.optalgo.type; + +import org.springframework.util.Assert; + +public class A8kOptPeaks { + public A8kOptPeak P040 = new A8kOptPeak(); + public A8kOptPeak P080 = new A8kOptPeak(); + public A8kOptPeak P120 = new A8kOptPeak(); + public A8kOptPeak P160 = new A8kOptPeak(); + public A8kOptPeak P200 = new A8kOptPeak(); + + public void trySetPeakArea(PeakName peakName, Double area) { + Assert.notNull(peakName, "peakName must not be null"); + if (peakName.equals(P040.peakName)) { + P040.area = area; + } + if (peakName.equals(P080.peakName)) { + P080.area = area; + } + if (peakName.equals(P120.peakName)) { + P120.area = area; + } + if (peakName.equals(P160.peakName)) { + P160.area = area; + } + if (peakName.equals(P200.peakName)) { + P200.area = area; + } + } + + public A8kOptPeak findPeak(PeakName peakName) { + Assert.notNull(peakName, "peakName must not be null"); + if (peakName.equals(P040.peakName)) { + return P040; + } + if (peakName.equals(P080.peakName)) { + return P080; + } + if (peakName.equals(P120.peakName)) { + return P120; + } + if (peakName.equals(P160.peakName)) { + return P160; + } + if (peakName.equals(P200.peakName)) { + return P200; + } + return null; + } + + public String toString() { + return String.format("P040: %s, P080: %s, P120: %s, P160: %s, P200: %s", P040, P080, P120, P160, P200); + } + +} diff --git a/src/main/java/a8k/app/optalgo/type/A8kOptProcessException.java b/src/main/java/a8k/app/optalgo/type/A8kOptProcessException.java new file mode 100644 index 0000000..6fddf32 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/A8kOptProcessException.java @@ -0,0 +1,11 @@ +package a8k.app.optalgo.type; + +public class A8kOptProcessException extends Exception { + public ReactionResultStatus status = ReactionResultStatus.SUCCESS; + public String errorMsg = ""; + + public A8kOptProcessException(ReactionResultStatus status, String errorMsg) { + super(status.toString()); + this.status = status; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/A8kOptX.java b/src/main/java/a8k/app/optalgo/type/A8kOptX.java new file mode 100644 index 0000000..07eaac3 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/A8kOptX.java @@ -0,0 +1,31 @@ +package a8k.app.optalgo.type; + +public enum A8kOptX { + USUPPORT, + R, //1 + AR, //2 + ATR, //3 + R_ADD_ATR, //4 + RFR, //5 + T4R, //6 + T4T3R, //7 + RFR_ADD_T4T3R, //8 + ; + + A8kOptX() { + } + + static public A8kOptX valueOf(int index) { + return switch (index) { + case 1 -> R; + case 2 -> AR; + case 3 -> ATR; + case 4 -> R_ADD_ATR; + case 5 -> RFR; + case 6 -> T4R; + case 7 -> T4T3R; + case 8 -> RFR_ADD_T4T3R; + default -> USUPPORT; + }; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/LinearResult.java b/src/main/java/a8k/app/optalgo/type/LinearResult.java new file mode 100644 index 0000000..41b1ac4 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/LinearResult.java @@ -0,0 +1,6 @@ +package a8k.app.optalgo.type; + +public class LinearResult { + public double slope; + public double intercept; +} diff --git a/src/main/java/a8k/app/optalgo/type/OptScanDirection.java b/src/main/java/a8k/app/optalgo/type/OptScanDirection.java new file mode 100644 index 0000000..bafa8cb --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/OptScanDirection.java @@ -0,0 +1,10 @@ +package a8k.app.optalgo.type; + +public enum OptScanDirection { + FORWARD, //从左向右扫描 + BACKWARD; + + public Integer getInteger() { + return this == FORWARD ? 1 : -1; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/OptScanResult.java b/src/main/java/a8k/app/optalgo/type/OptScanResult.java new file mode 100644 index 0000000..07cb117 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/OptScanResult.java @@ -0,0 +1,15 @@ +package a8k.app.optalgo.type; + +import a8k.app.dao.type.OptRawScanData; +import a8k.app.utils.ZJsonHelper; + +import java.util.Date; + +public class OptScanResult { + public Date scanDate; + public OptRawScanData rawData; + public A8kOptPeakInfo analysResult; + public String toString() { + return ZJsonHelper.objectToJson(this); + } +} diff --git a/src/main/java/a8k/app/optalgo/type/PeakDivision.java b/src/main/java/a8k/app/optalgo/type/PeakDivision.java new file mode 100644 index 0000000..9b5717c --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/PeakDivision.java @@ -0,0 +1,18 @@ +package a8k.app.optalgo.type; + +public enum PeakDivision { + R(PeakName.T, PeakName.C), //T/C + AR(PeakName.H, PeakName.C), //H/C + ATR(PeakName.T, PeakName.H), //T/H + RFR(PeakName.R, PeakName.C), //R/C + T4R(PeakName.T4, PeakName.C), //T4/C + T4T3R(PeakName.R, PeakName.T4); //R/T4 + ; + public final PeakName numerator; + public final PeakName denominator; + + PeakDivision(PeakName numerator, PeakName denominator) { + this.numerator = numerator; + this.denominator = denominator; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/PeakFindState.java b/src/main/java/a8k/app/optalgo/type/PeakFindState.java new file mode 100644 index 0000000..0e2942c --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/PeakFindState.java @@ -0,0 +1,6 @@ +package a8k.app.optalgo.type; + +public enum PeakFindState { + FIND_PEAK, + NOT_FIND_PEAK, +} diff --git a/src/main/java/a8k/app/optalgo/type/PeakName.java b/src/main/java/a8k/app/optalgo/type/PeakName.java new file mode 100644 index 0000000..9babad0 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/PeakName.java @@ -0,0 +1,9 @@ +package a8k.app.optalgo.type; + +public enum PeakName { + T4, + R, + H, + T, + C, +} diff --git a/src/main/java/a8k/app/optalgo/type/ReactionResultStatus.java b/src/main/java/a8k/app/optalgo/type/ReactionResultStatus.java new file mode 100644 index 0000000..1d772aa --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/ReactionResultStatus.java @@ -0,0 +1,52 @@ +package a8k.app.optalgo.type; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = """ + 反应结果状态: + DISABLED: 未启用 + SUCCESS: 成功 + ERROR: 结果异常 + ERROR_RESULT_OUT_OF_RANGE: 结果超出范围 + ERROR_RESULT_EXCEED_THE_UPPER_LIMIT: 超过上限 + ERROR_RESULT_BELOW_THE_LOWER_LIMIT: 低于下限 + ERROR_X_EXCEED_THE_UPPER_LIMIT: 超过上限 + ERROR_X_BELOW_THE_LOWER_LIMIT: 低于下限 + ERROR_QUALITY_PEAK_DETECTION: 质峰检测错误 + ERROR_LOST_PEAK_T4: T4峰丢失 + ERROR_LOST_PEAK_R: R峰丢失 + ERROR_LOST_PEAK_H: H峰丢失 + ERROR_LOST_PEAK_T: T峰丢失 + ERROR_LOST_PEAK_C: C峰丢失 + ERROR_UNKOWN_X: 未知X""") +public enum ReactionResultStatus { + /* + * 命名规范,如果结果错误,则ERROR开头的状态,表示结果异常。 + */ + DISABLED, // 未启用 + SUCCESS,// 成功 + ERROR,// 结果异常 + ERROR_RESULT_OUT_OF_RANGE,// 结果超出范围 + ERROR_RESULT_EXCEED_THE_UPPER_LIMIT,// 超过上限 + ERROR_RESULT_BELOW_THE_LOWER_LIMIT, // 低于下限 + ERROR_X_EXCEED_THE_UPPER_LIMIT,// 超过上限 + ERROR_X_BELOW_THE_LOWER_LIMIT, // 低于下限 + ERROR_QUALITY_PEAK_DETECTION,// 质峰检测错误 + + ERROR_LOST_PEAK_T4,// T4峰丢失 + ERROR_LOST_PEAK_R, // R峰丢失 + ERROR_LOST_PEAK_H, // H峰丢失 + ERROR_LOST_PEAK_T, // T峰丢失 + ERROR_LOST_PEAK_C, // C峰丢失 + + + ERROR_COMPUTE_R_FAIL, // + ERROR_COMPUTE_AR_FAIL, // + ERROR_COMPUTE_ATR_FAIL, // + ERROR_COMPUTE_RFR_FAIL, // + ERROR_COMPUTE_T4R_FAIL, // + ERROR_COMPUTE_T4T3R_FAIL, // + + + ERROR_UNKOWN_X, +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kNormalFn.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kNormalFn.java new file mode 100644 index 0000000..969d12e --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kNormalFn.java @@ -0,0 +1,43 @@ +package a8k.app.optalgo.type.a8kidcard; + +import a8k.app.optalgo.type.A8kOptX; + +import java.io.Serializable; + +public class A8kNormalFn implements Serializable ,Cloneable{ + // 非分段函数 + public A8kOptX x = A8kOptX.R; // 函数未知数是 0150 + public Double xMin = 0.0; // 函数未知数下限闻值 0155 + public Double xMax = 99999.0; // 函数未知数上限闻值 015A + + public Double A = 1.0;//015F + public Double B = 1.0;//0164 + public Double C = 1.0;//0169 + public Double D = 1.0;//016E + public Double lowLimit = 0.0;//0173 + public Double upLimit = 999999.0;//0178 + + public A8kNormalFn clone() { + try { + return (A8kNormalFn) super.clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + + + public A8kNormalFn() { + } + + public A8kNormalFn(A8kOptX x, Double xMin, Double xMax, Double a, Double b, Double c, Double d, Double lowLimit, Double upLimit) { + this.x = x; + this.xMin = xMin; + this.xMax = xMax; + A = a; + B = b; + C = c; + D = d; + this.lowLimit = lowLimit; + this.upLimit = upLimit; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kOptFnFormula.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kOptFnFormula.java new file mode 100644 index 0000000..4558c97 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kOptFnFormula.java @@ -0,0 +1,21 @@ +package a8k.app.optalgo.type.a8kidcard; + +import a8k.app.optalgo.type.a8kidcard.zenum.A8kFnType; + +import java.io.Serializable; + +public class A8kOptFnFormula implements Serializable { + public A8kFnType fnType = A8kFnType.NormalFn; + + //普通函数 + public A8kNormalFn serumNorFn; // 血清 + public A8kNormalFn bloodNorFn; // 血浆 + + // 分段函数系数 + public A8kPiecewiseFn serumPiecewiseFn; // 血清 + public A8kPiecewiseFn bloodPiecewiseFn; // 血浆 + + //结果 + public A8kResultBuilderFn resultBuilderFn; //结果生成函数 + +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kPiecewiseFn.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kPiecewiseFn.java new file mode 100644 index 0000000..0d1246d --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kPiecewiseFn.java @@ -0,0 +1,76 @@ +package a8k.app.optalgo.type.a8kidcard; + +import a8k.app.optalgo.type.A8kOptX; + +import java.io.Serializable; + +public class A8kPiecewiseFn implements Serializable { + // 分段函数 + public A8kOptX judeX; // 分界判断数据来源 01F0 + public Double judeThres; // 分界判断数据值 01F5 + public A8kOptX lX; // 低浓度未知数 01FA + public A8kOptX hX; // 高浓度未知数 01FF + public Double xMin; // 函数未知数下限闻值 0204 + public Double xMax; // 函数未知数上限闻值 0209 + + // 血清分段函数系数 + public Double A0; + public Double B0; + public Double C0; + public Double D0; + + public Double A1; + public Double B1; + public Double C1; + public Double D1; + + public Double lowLimit; + public Double upLimit; + + public A8kPiecewiseFn() { + } + + public A8kPiecewiseFn( + A8kOptX judeX, + Double judeThres, + A8kOptX lX, + A8kOptX hX, + Double xMin, + Double xMax, + Double a0, + Double b0, + Double c0, + Double d0, + Double a1, + Double b1, + Double c1, + Double d1, + Double lowLimit, + Double upLimit) { + this.judeX = judeX; + this.judeThres = judeThres; + this.lX = lX; + this.hX = hX; + this.xMin = xMin; + this.xMax = xMax; + this.A0 = a0; + this.B0 = b0; + this.C0 = c0; + this.D0 = d0; + this.A1 = a1; + this.B1 = b1; + this.C1 = c1; + this.D1 = d1; + this.lowLimit = lowLimit; + this.upLimit = upLimit; + } + + public A8kPiecewiseFn clone() { + try { + return (A8kPiecewiseFn) super.clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultBuilderFn.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultBuilderFn.java new file mode 100644 index 0000000..55a179a --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultBuilderFn.java @@ -0,0 +1,57 @@ +package a8k.app.optalgo.type.a8kidcard; + +import a8k.app.optalgo.type.a8kidcard.zenum.A8kResultUnit; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class A8kResultBuilderFn implements Serializable, Cloneable { + // 结果 + public A8kResultUnit ret1Unit = A8kResultUnit.noUint; // 单位 02E0 + public A8kResultUnit ret2Unit; // 单位 02E5 + public A8kResultUnit ret3Unit; // 单位 02EA + // + public Double toUint2FnA; // 结果转换为单位2的函数A result2 = A * result1 + B 02EF + public Double toUint2FnB; // 结果转换为单位2的函数B 02F4 + + // + public Double toUint3FnA; // 结果转换为单位3的函数A result3 = A * result1 + B 02F9 + public Double toUint3FnB; // 结果转换为单位3的函数B 02FE + + public A8kResultBuilderFn(A8kResultUnit ret1Unit, A8kResultUnit ret2Unit, A8kResultUnit ret3Unit, Double toUint2FnA, Double toUint2FnB, Double toUint3FnA, Double toUint3FnB) { + this.ret1Unit = ret1Unit; + this.ret2Unit = ret2Unit; + this.ret3Unit = ret3Unit; + this.toUint2FnA = toUint2FnA; + this.toUint2FnB = toUint2FnB; + this.toUint3FnA = toUint3FnA; + this.toUint3FnB = toUint3FnB; + } + + public A8kResultBuilderFn() { + } + + public A8kResultBuilderFn clone() { + try { + return (A8kResultBuilderFn) super.clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + + + public List toResultUnitConverters() { + List resultConverters = new ArrayList<>(); + if (ret1Unit != null) { + resultConverters.add(new A8kResultUnitConverter(ret1Unit, 1.0, 0.0)); + } + if (ret2Unit != null) { + resultConverters.add(new A8kResultUnitConverter(ret2Unit, toUint2FnA, toUint2FnB)); + } + if (ret3Unit != null) { + resultConverters.add(new A8kResultUnitConverter(ret3Unit, toUint3FnA, toUint3FnB)); + } + return resultConverters; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultUnitConverter.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultUnitConverter.java new file mode 100644 index 0000000..834f1b8 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/A8kResultUnitConverter.java @@ -0,0 +1,44 @@ +package a8k.app.optalgo.type.a8kidcard; + +import a8k.app.optalgo.type.a8kidcard.zenum.A8kResultUnit; + +import java.io.Serializable; + +public class A8kResultUnitConverter implements Serializable { + // 结果 + public A8kResultUnit uint; + public String uintstr = ""; + public Double A; // 结果转换为单位2的函数A result2 = A * result1 + B 02EF + public Double B; // 结果转换为单位2的函数B 02F4 + + public A8kResultUnitConverter(A8kResultUnit uint, Double A, Double B) { + this.uint = uint; + this.A = A; + this.B = B; + this.uintstr = uint.unitstr; + } + + public A8kResultUnitConverter() { + } + + public String convert(Double firstResult) { + if (uint == null) { + return null; + } + if (A == null) { + return null; + } + double result = A * firstResult + B; + return String.format("%.2f %s", result, uint.unitstr); + } + + public Double computeResultVal(Double firstResult) { + if (uint == null) { + return null; + } + if (A == null) { + return null; + } + return A * firstResult + B; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kFnType.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kFnType.java new file mode 100644 index 0000000..71adb48 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kFnType.java @@ -0,0 +1,21 @@ +package a8k.app.optalgo.type.a8kidcard.zenum; + +public enum A8kFnType { + NormalFn(1),//正常函数 + PiecewiseFn(2),//分段函数 + ; + final int val; + + A8kFnType(int val) { + this.val = val; + } + + public static A8kFnType fromInt(int val) { + for (A8kFnType type : A8kFnType.values()) { + if (type.val == val) { + return type; + } + } + return null; + } +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kOptType.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kOptType.java new file mode 100644 index 0000000..f054d25 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kOptType.java @@ -0,0 +1,6 @@ +package a8k.app.optalgo.type.a8kidcard.zenum; + +public enum A8kOptType { + FOPT, + TOPT, +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kReactionFlowType.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kReactionFlowType.java new file mode 100644 index 0000000..a555bdc --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kReactionFlowType.java @@ -0,0 +1,41 @@ +package a8k.app.optalgo.type.a8kidcard.zenum; + +public enum A8kReactionFlowType { + /** + * 流程: + * 取tip + * 刺破小缓冲瓶 + * 取样本 + * 取tip + * 放入样本到小缓冲瓶 + * 吸吐混匀 + * 取样 + * 滴定 + */ + SampleAndBS(1, 2), //样本和小瓶缓冲反应 + + /** + * + * 流程: + * 取tip + * 取大瓶缓冲液 + * 放入探测物质中 + * + * 取tip + * 取样本 + * 放入探测物质中 + * 吸吐混匀 + * 取样 + * 滴定 + */ + SampleAndBSAndProbeSubstance(2, 2),//样本,大瓶缓冲液,探测物质反应 + ; + public final int tipUseNum; + public final int valInIdCard; + + A8kReactionFlowType(int valInIdCard, int tipUseNum) { + this.tipUseNum = tipUseNum; + this.valInIdCard = valInIdCard; + } + +} diff --git a/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kResultUnit.java b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kResultUnit.java new file mode 100644 index 0000000..b11f168 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/type/a8kidcard/zenum/A8kResultUnit.java @@ -0,0 +1,73 @@ +package a8k.app.optalgo.type.a8kidcard.zenum; + +public enum A8kResultUnit { + Original(0, ""), + noUint(1, ""), + pgPml(2, "pg/mL"), + ngPml(3, "ng/mL"), + ugPml(4, "ug/mL"), + mgPml(5, "mg/mL"), + pgPl(6, "pg/L"), + ngPl(7, "ng/L"), + ugPl(8, "ug/L"), + mgPl(9, "mg/L"), + gPl(10, "g/L"), + ngPdl(11, "ng/dL"), + ugPdl(12, "ug/dL"), + mgPdl(13, "mg/dL"), + gPdl(14, "g/dL"), + pmolPl(15, "pmol/L"), + nmolPl(16, "nmol/L"), + umolPl(17, "umol/L"), + mmolPl(18, "mmol/L"), + uiuPml(19, "uIU/mL"), + miuPml(20, "mIU/mL"), + iuPml(21, "IU/mL"), + uuPml(22, "uU/mL"), + muPml(23, "mU/mL"), + uPml(24, "U/mL"), + muPl(25, "mU/L"), + uPl(26, "U/L"), + kiuPl(27, "kIU/L"), + kuPl(28, "kU/L"), + percent(29, "%"), + mmolPmol(30, "mmol/mol"), + milPul(31, "mil/uL"), + mmP1h(32, "mm/1h"), + ul(33, "/uL"), + ukatPl(34, "ukat/L"), + nkatPl(35, "nkat/L"), + mptPl(36, "mpt/L"), + tptPl(37, "tpt/L"), + gptPl(38, "gpt/L"), + pfuPml(39, "PFU/mL"), + cfuPml(40, "CFU/mL"), + sPco(41, "S/CO"), + coi(42, "COI"), + index(43, ""), + UNSUPPORT(-1, "UNSUPPORT"), + ; + + + public final int val; + public final String unitstr; + + A8kResultUnit(int val, String unitstr) { + this.val = val; + this.unitstr = unitstr; + } + + static public A8kResultUnit valueOf(Integer val) { + if (val == 0) { + return null; + } + + for (A8kResultUnit unit : values()) { + if (unit.val == val) { + return unit; + } + } + return UNSUPPORT; + } + +} diff --git a/src/main/java/a8k/app/optalgo/utils/A8kOptGainAdjuster.java b/src/main/java/a8k/app/optalgo/utils/A8kOptGainAdjuster.java new file mode 100644 index 0000000..ce78f0e --- /dev/null +++ b/src/main/java/a8k/app/optalgo/utils/A8kOptGainAdjuster.java @@ -0,0 +1,39 @@ +package a8k.app.optalgo.utils; + +import org.springframework.util.Assert; + +public class A8kOptGainAdjuster { + public Double suggestGain; + public Boolean scanAgain; + public Integer maxval; + + public void process(Integer[] data, double nowgain, int expectResult, int tolerate) { + Assert.isTrue(data.length == 1200, "data.length must be 1200"); + + maxval = data[0]; + for (int i = 1; i < data.length; i++) { + if (maxval < data[i]) { + maxval = data[i]; + } + } + + if (maxval > expectResult + tolerate) { + scanAgain = true; + suggestGain = nowgain / 2; + return; + } + + if (maxval > expectResult) { + scanAgain = false; + suggestGain = nowgain; + return; + } + + if (maxval != 0) { + suggestGain = nowgain * ((double) expectResult / (double) maxval); + } else { + suggestGain = nowgain * 2; + } + scanAgain = true; + } +} diff --git a/src/main/java/a8k/app/optalgo/utils/A8kOptPeakInfoBuilder.java b/src/main/java/a8k/app/optalgo/utils/A8kOptPeakInfoBuilder.java new file mode 100644 index 0000000..e32fd8f --- /dev/null +++ b/src/main/java/a8k/app/optalgo/utils/A8kOptPeakInfoBuilder.java @@ -0,0 +1,27 @@ +package a8k.app.optalgo.utils; + +import a8k.app.optalgo.type.A8kOptPeaks; +import a8k.app.optalgo.type.A8kOptPeakInfo; +import a8k.app.optalgo.type.PeakDivision; +import a8k.app.optalgo.type.PeakName; +import a8k.app.optalgo.version.OptAlogVersion; + +public class A8kOptPeakInfoBuilder { + static public A8kOptPeakInfo build(double[] resultData, A8kOptPeaks peaks) { + A8kOptPeakInfo result = new A8kOptPeakInfo(); + result.resultData = resultData; + result.T4 = peaks.findPeak(PeakName.T4); + result.R = peaks.findPeak(PeakName.R); + result.H = peaks.findPeak(PeakName.H); + result.T = peaks.findPeak(PeakName.T); + result.C = peaks.findPeak(PeakName.C); + result.pdR = PeakDivisionComputer.computePeakDivision(PeakDivision.R, peaks); + result.pdAR = PeakDivisionComputer.computePeakDivision(PeakDivision.AR, peaks); + result.pdATR = PeakDivisionComputer.computePeakDivision(PeakDivision.ATR, peaks); + result.pdRFR = PeakDivisionComputer.computePeakDivision(PeakDivision.RFR, peaks); + result.pdT4R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4R, peaks); + result.pdT4T3R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4T3R, peaks); + result.algoVersion = OptAlogVersion.version; + return result; + } +} diff --git a/src/main/java/a8k/app/optalgo/utils/A8kOptXGetter.java b/src/main/java/a8k/app/optalgo/utils/A8kOptXGetter.java new file mode 100644 index 0000000..4ab0e47 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/utils/A8kOptXGetter.java @@ -0,0 +1,64 @@ +package a8k.app.optalgo.utils; + +import a8k.app.optalgo.type.A8kOptPeakInfo; +import a8k.app.optalgo.type.A8kOptProcessException; +import a8k.app.optalgo.type.A8kOptX; +import a8k.app.optalgo.type.PeakDivision; +import a8k.app.dao.type.OptCfg; +import a8k.app.optalgo.type.ReactionResultStatus; + +public class A8kOptXGetter { + + static class Context { + OptCfg optcfg; + A8kOptPeakInfo optAlgoAnalysResult; + } + + static private Double getPeakDivision(Context cxt, PeakDivision pdtype) throws A8kOptProcessException { + A8kOptPeakInfo a8kOptPeakInfo = cxt.optAlgoAnalysResult; + Double val = switch (pdtype) { + case R -> a8kOptPeakInfo.pdR; + case AR -> a8kOptPeakInfo.pdAR; + case ATR -> a8kOptPeakInfo.pdATR; + case RFR -> a8kOptPeakInfo.pdRFR; + case T4R -> a8kOptPeakInfo.pdT4R; + case T4T3R -> a8kOptPeakInfo.pdT4T3R; + }; + + OptChecker.checkPeakDevision(pdtype, val); + return val; + } + + + static private Double addPD(Context cxt, PeakDivision... type) throws A8kOptProcessException { + double result = 0.0; + for (PeakDivision peakDivision : type) { + result += getPeakDivision(cxt, peakDivision); + } + return result; + } + + static public Double getX(A8kOptX xType, OptCfg optcfg, A8kOptPeakInfo a8kOptPeakInfo) throws A8kOptProcessException { + + Context cxt = new Context(); + cxt.optcfg = optcfg; + cxt.optAlgoAnalysResult = a8kOptPeakInfo; + + /* + * 根据项目获取未知数X + */ + return switch (xType) { + case R -> addPD(cxt, PeakDivision.R); + case AR -> addPD(cxt, PeakDivision.AR); + case ATR -> addPD(cxt, PeakDivision.ATR); + case R_ADD_ATR -> addPD(cxt, PeakDivision.R, PeakDivision.ATR); + case RFR -> addPD(cxt, PeakDivision.RFR); + case T4R -> addPD(cxt, PeakDivision.T4R); + case T4T3R -> addPD(cxt, PeakDivision.T4T3R); + case RFR_ADD_T4T3R -> addPD(cxt, PeakDivision.RFR, PeakDivision.T4T3R); + default -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_UNKOWN_X, "ERROR_UNKOWN_X"); + }; + } + + +} diff --git a/src/main/java/a8k/app/optalgo/utils/OptChecker.java b/src/main/java/a8k/app/optalgo/utils/OptChecker.java new file mode 100644 index 0000000..bc66f3a --- /dev/null +++ b/src/main/java/a8k/app/optalgo/utils/OptChecker.java @@ -0,0 +1,61 @@ +package a8k.app.optalgo.utils; + +import a8k.app.optalgo.type.A8kOptPeak; +import a8k.app.optalgo.type.PeakFindState; +import a8k.app.optalgo.type.A8kOptProcessException; +import a8k.app.optalgo.type.PeakDivision; +import a8k.app.optalgo.type.PeakName; +import a8k.app.optalgo.type.ReactionResultStatus; + +public class OptChecker { + + static public void checkPack(PeakName peakName, A8kOptPeak peak) throws A8kOptProcessException { + if (peak != null && peak.state.equals(PeakFindState.FIND_PEAK)) { + return; + } + + switch (peakName) { + case T4 -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_T4, "ERROR_LOST_PEAK_T4"); + case R -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_R, "ERROR_LOST_PEAK_R"); + case H -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_H, "ERROR_LOST_PEAK_H"); + case T -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_T, "ERROR_LOST_PEAK_T"); + case C -> throw new A8kOptProcessException(ReactionResultStatus.ERROR_LOST_PEAK_C, "ERROR_LOST_PEAK_C"); + } + } + + public static void checkPeakDevision(PeakDivision pdType, Double val) throws A8kOptProcessException { + if (val != null) { + return; + } + + ReactionResultStatus estatus = switch (pdType) { + case R -> ReactionResultStatus.ERROR_COMPUTE_R_FAIL; + case AR -> ReactionResultStatus.ERROR_COMPUTE_AR_FAIL; + case ATR -> ReactionResultStatus.ERROR_COMPUTE_ATR_FAIL; + case RFR -> ReactionResultStatus.ERROR_COMPUTE_RFR_FAIL; + case T4R -> ReactionResultStatus.ERROR_COMPUTE_T4R_FAIL; + case T4T3R -> ReactionResultStatus.ERROR_COMPUTE_T4T3R_FAIL; + }; + throw new A8kOptProcessException(estatus, estatus.name()); + } + + + public static void checkX(Double x, Double lowLimit, Double upLimit) throws A8kOptProcessException { + if (x > upLimit) { + throw new A8kOptProcessException(ReactionResultStatus.ERROR_X_EXCEED_THE_UPPER_LIMIT, "ERROR_X_OUT_OF_RANGE"); + } + if (x < lowLimit) { + throw new A8kOptProcessException(ReactionResultStatus.ERROR_X_BELOW_THE_LOWER_LIMIT, "ERROR_X_OUT_OF_RANGE"); + } + } + + static public void checkResult1(Double result1, Double lowLimit, Double upLimit) throws A8kOptProcessException { + if (result1 > upLimit) { + throw new A8kOptProcessException(ReactionResultStatus.ERROR_RESULT_EXCEED_THE_UPPER_LIMIT, "ERROR_BEYOND_THE_UPPER_LIMIT"); + } + if (result1 < lowLimit) { + throw new A8kOptProcessException(ReactionResultStatus.ERROR_RESULT_BELOW_THE_LOWER_LIMIT, "ERROR_BEYOND_THE_LOWER_LIMIT"); + } + } + +} diff --git a/src/main/java/a8k/app/optalgo/utils/PeakDivisionComputer.java b/src/main/java/a8k/app/optalgo/utils/PeakDivisionComputer.java new file mode 100644 index 0000000..4c48672 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/utils/PeakDivisionComputer.java @@ -0,0 +1,23 @@ +package a8k.app.optalgo.utils; + +import a8k.app.optalgo.type.A8kOptPeak; +import a8k.app.optalgo.type.A8kOptPeaks; +import a8k.app.optalgo.type.PeakDivision; + +public class PeakDivisionComputer { + + public static Double computePeakDivision(PeakDivision pdtype, A8kOptPeaks peaks) { + A8kOptPeak numerator = peaks.findPeak(pdtype.numerator); + A8kOptPeak denominator = peaks.findPeak(pdtype.denominator); + + if (numerator == null || denominator == null) { + return null; + } + + if (denominator.area == 0.0) { + return null; + } + return numerator.area / denominator.area; + } + +} diff --git a/src/main/java/a8k/app/optalgo/utils/PeakNameAssigner.java b/src/main/java/a8k/app/optalgo/utils/PeakNameAssigner.java new file mode 100644 index 0000000..a733e00 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/utils/PeakNameAssigner.java @@ -0,0 +1,48 @@ +package a8k.app.optalgo.utils; + +import a8k.app.optalgo.type.A8kOptPeaks; +import a8k.app.optalgo.type.PeakName; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class PeakNameAssigner { + public static void assignPeakName(Integer projId, Integer peakNameRefNum, A8kOptPeaks peaks) { + + + //项目ID==1时,峰的命名是特殊的 + if (projId == 2) { + peaks.P080.peakName = PeakName.C; + peaks.P120.peakName = PeakName.T; + } else { + + // + switch (peakNameRefNum) { + case 2 -> { + peaks.P080.peakName = PeakName.T; + peaks.P120.peakName = PeakName.C; + } + case 3 -> { + peaks.P040.peakName = PeakName.H; + peaks.P080.peakName = PeakName.T; + peaks.P120.peakName = PeakName.C; + } + case 4 -> { + peaks.P040.peakName = PeakName.R; + peaks.P080.peakName = PeakName.H; + peaks.P120.peakName = PeakName.T; + peaks.P160.peakName = PeakName.C; + } + case 5 -> { + peaks.P040.peakName = PeakName.T4; + peaks.P080.peakName = PeakName.R; + peaks.P120.peakName = PeakName.H; + peaks.P160.peakName = PeakName.T; + peaks.P200.peakName = PeakName.C; + } + default -> { + } + } + } + } + +} diff --git a/src/main/java/a8k/app/optalgo/version/OptAlogVersion.java b/src/main/java/a8k/app/optalgo/version/OptAlogVersion.java new file mode 100644 index 0000000..dea89f9 --- /dev/null +++ b/src/main/java/a8k/app/optalgo/version/OptAlogVersion.java @@ -0,0 +1,5 @@ +package a8k.app.optalgo.version; + +public class OptAlogVersion { + static public final String version = "1.0.0"; +} diff --git a/src/main/java/a8k/app/service/data/FileMgrService.java b/src/main/java/a8k/app/service/data/FileMgrService.java index 28fcb6a..6cdc596 100644 --- a/src/main/java/a8k/app/service/data/FileMgrService.java +++ b/src/main/java/a8k/app/service/data/FileMgrService.java @@ -1,15 +1,15 @@ package a8k.app.service.data; -import a8k.app.a8kproj.optalgo.type.A8kOptPeak; -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; -import a8k.app.a8kproj.optalgo.type.OptScanResult; -import a8k.app.a8kproj.optalgo.type.PeakFindState; -import a8k.app.a8ktype.opttype.PeakDivision; -import a8k.app.a8ktype.opttype.PeakName; +import a8k.app.optalgo.type.A8kOptPeak; +import a8k.app.optalgo.type.A8kOptPeakInfo; +import a8k.app.optalgo.type.OptScanResult; +import a8k.app.optalgo.type.PeakFindState; +import a8k.app.optalgo.type.PeakDivision; +import a8k.app.optalgo.type.PeakName; import a8k.app.constant.FilePathConstant; import a8k.app.controler.filemgr.StorageControler; import a8k.app.dao.type.OptRawScanData; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.app.utils.ZDateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -200,30 +200,30 @@ public class FileMgrService { data.rawData[i] = i; } - OptAlgoAnalysResult optAlgoAnalysResult = new OptAlgoAnalysResult(); - optAlgoAnalysResult.T4 = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T4, 0, 1.1, 40, 0, 80); - optAlgoAnalysResult.R = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.R, 0, 1.1, 80, 40, 120); - optAlgoAnalysResult.H = null; - optAlgoAnalysResult.T = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T, 0, 1.1, 160, 120, 200); - optAlgoAnalysResult.C = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.C, 0, 1.1, 200, 160, 240); - optAlgoAnalysResult.pdR = 1.1; - optAlgoAnalysResult.pdAR = 1.2; - optAlgoAnalysResult.pdATR = 1.3; - optAlgoAnalysResult.pdRFR = 1.4; - optAlgoAnalysResult.pdT4R = 1.5; - optAlgoAnalysResult.pdT4T3R = 1.6; + A8kOptPeakInfo a8kOptPeakInfo = new A8kOptPeakInfo(); + a8kOptPeakInfo.T4 = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T4, 0, 1.1, 40, 0, 80); + a8kOptPeakInfo.R = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.R, 0, 1.1, 80, 40, 120); + a8kOptPeakInfo.H = null; + a8kOptPeakInfo.T = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T, 0, 1.1, 160, 120, 200); + a8kOptPeakInfo.C = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.C, 0, 1.1, 200, 160, 240); + a8kOptPeakInfo.pdR = 1.1; + a8kOptPeakInfo.pdAR = 1.2; + a8kOptPeakInfo.pdATR = 1.3; + a8kOptPeakInfo.pdRFR = 1.4; + a8kOptPeakInfo.pdT4R = 1.5; + a8kOptPeakInfo.pdT4T3R = 1.6; // optAlgoAnalysResult.rawData = new Integer[1200]; // for (int i = 0; i < 1200; i++) { // optAlgoAnalysResult.rawData[i] = i; // } - optAlgoAnalysResult.resultData = new double[250]; + a8kOptPeakInfo.resultData = new double[250]; for (int i = 0; i < 250; i++) { - optAlgoAnalysResult.resultData[i] = i; + a8kOptPeakInfo.resultData[i] = i; } OptScanResult optScanResult = new OptScanResult(); optScanResult.rawData = data; - optScanResult.analysResult = optAlgoAnalysResult; + optScanResult.analysResult = a8kOptPeakInfo; String path = storageOptReport("Fake( xxxx)", 1, optScanResult); log.info("createFakeOptReport success {}", path); diff --git a/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java b/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java index d33fcca..e8c7dbd 100644 --- a/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java +++ b/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java @@ -2,14 +2,14 @@ package a8k.app.service.data; import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.opttype.A8kOptX; +import a8k.app.optalgo.type.A8kOptX; import a8k.app.dao.A8kProjExtInfoCardDao; -import a8k.app.dao.type.a8kidcard.A8kNormalFn; -import a8k.app.dao.type.a8kidcard.A8kOptFnFormula; -import a8k.app.dao.type.a8kidcard.A8kPiecewiseFn; -import a8k.app.dao.type.a8kidcard.A8kResultBuilderFn; -import a8k.app.dao.type.a8kidcard.zenum.A8kFnType; -import a8k.app.dao.type.a8kidcard.zenum.A8kResultUnit; +import a8k.app.optalgo.type.a8kidcard.A8kNormalFn; +import a8k.app.optalgo.type.a8kidcard.A8kOptFnFormula; +import a8k.app.optalgo.type.a8kidcard.A8kPiecewiseFn; +import a8k.app.optalgo.type.a8kidcard.A8kResultBuilderFn; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kFnType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kResultUnit; import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; import a8k.app.service.lowerctrl.ProjIDCardCtrlAndMonitorService; import a8k.app.service.statemgr.GStateMgrService; diff --git a/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java b/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java index 0b52854..ad5f3c5 100644 --- a/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java +++ b/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java @@ -1,6 +1,6 @@ package a8k.app.service.data; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.state.SampleInfo; import a8k.app.dao.ReactionReportDao; import a8k.app.dao.type.ReactionReport; diff --git a/src/main/java/a8k/app/service/lowerctrl/OptScanModuleCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/OptScanModuleCtrlService.java index 709a0a4..2a310ec 100644 --- a/src/main/java/a8k/app/service/lowerctrl/OptScanModuleCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/OptScanModuleCtrlService.java @@ -1,10 +1,10 @@ package a8k.app.service.lowerctrl; -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; +import a8k.app.optalgo.type.A8kOptPeakInfo; import a8k.app.constant.OptConstant; -import a8k.app.a8kproj.optalgo.A8kOptAlgoV2; -import a8k.app.a8kproj.optalgo.type.OptScanResult; -import a8k.app.a8kproj.optalgo.utils.A8kOptGainAdjuster; +import a8k.app.optalgo.A8kOptCurveAnalyzer; +import a8k.app.optalgo.type.OptScanResult; +import a8k.app.optalgo.utils.A8kOptGainAdjuster; import a8k.app.hardware.driver.OptModuleDriver; import a8k.app.hardware.driver.StepMotorCtrlDriver; import a8k.app.hardware.driver.type.OptModuleRegIndex; @@ -13,9 +13,9 @@ import a8k.app.service.bases.UIMessage; import a8k.app.service.param.optparam.OptModuleExtParamsMgr; import a8k.app.service.param.optparam.OptModuleParamsMgr; import a8k.app.dao.type.OptRawScanData; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.app.a8ktype.device.IncubatorPos; -import a8k.app.a8ktype.opttype.OptScanDirection; +import a8k.app.optalgo.type.OptScanDirection; import a8k.app.a8ktype.exception.AppException; import a8k.app.utils.ProjBuildinInfo; import a8k.app.hardware.utils.OptGainConvert; @@ -150,13 +150,13 @@ public class OptScanModuleCtrlService { public OptScanResult optScan(ProjBuildinInfo projBuildinInfo, Integer subProjIndex) throws AppException { UIMessage.info(log, "光学扫描"); - A8kOptAlgoV2 a8kOptAlgoV2 = new A8kOptAlgoV2(); + A8kOptCurveAnalyzer a8KOptCurveAnalyzer = new A8kOptCurveAnalyzer(); OptScanResult result = new OptScanResult(); result.scanDate = new Date(); - OptRawScanData rawData = doOptScan(projBuildinInfo.optcfg.get(subProjIndex).optType); - OptAlgoAnalysResult analysResult = a8kOptAlgoV2.processOptData(projBuildinInfo, projBuildinInfo.optcfg.get(subProjIndex), rawData.rawData); + OptRawScanData rawData = doOptScan(projBuildinInfo.optcfg.get(subProjIndex).optType); + A8kOptPeakInfo analysResult = a8KOptCurveAnalyzer.analysCurve(projBuildinInfo.projId, projBuildinInfo.optcfg.get(subProjIndex), rawData.rawData); result.rawData = rawData; result.analysResult = analysResult; diff --git a/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java b/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java index e86c4a2..3cedbbe 100644 --- a/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java +++ b/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java @@ -16,7 +16,7 @@ import a8k.app.a8ktype.device.consumables.LittBottleGroup; import a8k.app.a8ktype.device.consumables.ReactionPlateGroup; import a8k.app.a8ktype.error.ConsumablesScanReportErrorType; import a8k.app.a8ktype.exception.AppException; -import a8k.app.dao.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.app.utils.*; import jakarta.annotation.Resource; import org.slf4j.Logger; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java index 89167a4..ce3edae 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java @@ -1,7 +1,7 @@ package a8k.app.service.mainctrl.mainflowctrl.action; -import a8k.app.a8kproj.A8kReactionResultComputer; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.A8kPeakAnalyzer; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.DeviceRunMode; import a8k.app.service.mainctrl.mainflowctrl.base.A8kActionTask; @@ -12,7 +12,7 @@ import a8k.app.service.statemgr.OptScanModuleStateMgrService; import a8k.app.service.statemgr.ProjectContextMgrService; import a8k.app.a8ktype.state.ProjectTaskContext; import a8k.app.service.lowerctrl.OptScanModuleCtrlService; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.app.teststate.VirtualDevice; import a8k.app.factory.FakeReactionResultFactory; import a8k.app.a8ktype.type.ReactionResult; @@ -89,7 +89,7 @@ public class AC20ScanReactionPlate extends A8kActionTask { cxt.setOptScanResult(optType, optScanResult); } - ReactionResult result = A8kReactionResultComputer.optComputeResult(cxt.getSampleInfo(), ProjInfoUtils.buildProjInfo(cxt), i, optScanResult.analysResult); + ReactionResult result = A8kPeakAnalyzer.analysisPeakInfo(cxt.getSampleInfo(), ProjInfoUtils.buildProjInfo(cxt), i, optScanResult.analysResult); reactionResults.add(result); } diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java index 59c85da..6fe7fe6 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java @@ -13,7 +13,7 @@ import a8k.app.a8ktype.state.Tube; import a8k.app.a8ktype.state.TubeHolder; import a8k.app.a8ktype.state.enumtype.TubeState; import a8k.app.service.mainctrl.erroranalyzer.ErrorProcessor; -import a8k.app.dao.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.app.utils.ActionTaskPool; import a8k.app.utils.ZList; import a8k.app.teststate.VirtualDevice; diff --git a/src/main/java/a8k/app/service/param/optparam/OptModuleExtParamsMgr.java b/src/main/java/a8k/app/service/param/optparam/OptModuleExtParamsMgr.java index 2589e76..7c79389 100644 --- a/src/main/java/a8k/app/service/param/optparam/OptModuleExtParamsMgr.java +++ b/src/main/java/a8k/app/service/param/optparam/OptModuleExtParamsMgr.java @@ -3,7 +3,7 @@ package a8k.app.service.param.optparam; import a8k.app.service.param.base.ParamMgr; import a8k.app.a8ktype.param.optpos.OptModuleExtParam; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/a8k/app/utils/ProjBuildinInfo.java b/src/main/java/a8k/app/utils/ProjBuildinInfo.java index a161819..4a1b58d 100644 --- a/src/main/java/a8k/app/utils/ProjBuildinInfo.java +++ b/src/main/java/a8k/app/utils/ProjBuildinInfo.java @@ -2,8 +2,8 @@ package a8k.app.utils; import a8k.app.dao.type.OptCfg; import a8k.app.dao.type.ProjectBaseInfo; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; -import a8k.app.dao.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kReactionFlowType; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import org.slf4j.Logger; diff --git a/src/main/java/a8k/app/utils/ProjInfoUtils.java b/src/main/java/a8k/app/utils/ProjInfoUtils.java index ca66375..1fbd46e 100644 --- a/src/main/java/a8k/app/utils/ProjInfoUtils.java +++ b/src/main/java/a8k/app/utils/ProjInfoUtils.java @@ -2,7 +2,7 @@ package a8k.app.utils; import a8k.app.a8ktype.state.ProjectTaskContext; import a8k.app.dao.type.ProjExtInfoCard; -import a8k.app.dao.type.a8kidcard.A8kOptFnFormula; +import a8k.app.optalgo.type.a8kidcard.A8kOptFnFormula; import a8k.app.a8ktype.type.ProjBriefInfo; import java.util.ArrayList; diff --git a/src/main/java/a8k/extui/factory/FakeOptScanResultFactory.java b/src/main/java/a8k/extui/factory/FakeOptScanResultFactory.java index 3799af7..1555481 100644 --- a/src/main/java/a8k/extui/factory/FakeOptScanResultFactory.java +++ b/src/main/java/a8k/extui/factory/FakeOptScanResultFactory.java @@ -1,12 +1,12 @@ package a8k.extui.factory; -import a8k.app.a8kproj.optalgo.type.A8kOptPeak; -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; -import a8k.app.a8kproj.optalgo.type.OptScanResult; -import a8k.app.a8kproj.optalgo.type.PeakFindState; -import a8k.app.a8ktype.opttype.PeakName; +import a8k.app.optalgo.type.A8kOptPeak; +import a8k.app.optalgo.type.A8kOptPeakInfo; +import a8k.app.optalgo.type.OptScanResult; +import a8k.app.optalgo.type.PeakFindState; +import a8k.app.optalgo.type.PeakName; import a8k.app.dao.type.OptRawScanData; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import java.util.Date; @@ -34,25 +34,25 @@ public class FakeOptScanResultFactory { optScanResult.rawData = rawData; //OptAlgoAnalysResult - OptAlgoAnalysResult optAlgoAnalysResult = new OptAlgoAnalysResult(); - optAlgoAnalysResult.T4 = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T4, 0, 1.1, 40, 0, 80); - optAlgoAnalysResult.R = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.R, 0, 1.1, 80, 40, 120); - optAlgoAnalysResult.H = null; - optAlgoAnalysResult.T = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T, 0, 1.1, 160, 120, 200); - optAlgoAnalysResult.C = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.C, 0, 1.1, 200, 160, 240); - optAlgoAnalysResult.pdR = 1.1; - optAlgoAnalysResult.pdAR = 1.2; - optAlgoAnalysResult.pdATR = 1.3; - optAlgoAnalysResult.pdRFR = 1.4; - optAlgoAnalysResult.pdT4R = 1.5; - optAlgoAnalysResult.pdT4T3R = 1.6; - optAlgoAnalysResult.resultData = new double[250]; + A8kOptPeakInfo a8kOptPeakInfo = new A8kOptPeakInfo(); + a8kOptPeakInfo.T4 = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T4, 0, 1.1, 40, 0, 80); + a8kOptPeakInfo.R = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.R, 0, 1.1, 80, 40, 120); + a8kOptPeakInfo.H = null; + a8kOptPeakInfo.T = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T, 0, 1.1, 160, 120, 200); + a8kOptPeakInfo.C = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.C, 0, 1.1, 200, 160, 240); + a8kOptPeakInfo.pdR = 1.1; + a8kOptPeakInfo.pdAR = 1.2; + a8kOptPeakInfo.pdATR = 1.3; + a8kOptPeakInfo.pdRFR = 1.4; + a8kOptPeakInfo.pdT4R = 1.5; + a8kOptPeakInfo.pdT4T3R = 1.6; + a8kOptPeakInfo.resultData = new double[250]; for (int i = 0; i < 250; i++) { - optAlgoAnalysResult.resultData[i] = optType.equals(A8kOptType.FOPT) ? i : 250 - i; + a8kOptPeakInfo.resultData[i] = optType.equals(A8kOptType.FOPT) ? i : 250 - i; } - optScanResult.analysResult = optAlgoAnalysResult; + optScanResult.analysResult = a8kOptPeakInfo; //return return optScanResult; diff --git a/src/main/java/a8k/extui/factory/ProjExtInfoCardFactory.java b/src/main/java/a8k/extui/factory/ProjExtInfoCardFactory.java index 998baf5..9f93af7 100644 --- a/src/main/java/a8k/extui/factory/ProjExtInfoCardFactory.java +++ b/src/main/java/a8k/extui/factory/ProjExtInfoCardFactory.java @@ -3,11 +3,11 @@ package a8k.extui.factory; import a8k.SpringBootBeanUtil; import a8k.app.a8ktype.exception.AppException; import a8k.app.dao.type.ProjExtInfoCard; -import a8k.app.dao.type.a8kidcard.A8kNormalFn; -import a8k.app.dao.type.a8kidcard.A8kOptFnFormula; -import a8k.app.dao.type.a8kidcard.A8kPiecewiseFn; -import a8k.app.dao.type.a8kidcard.A8kResultBuilderFn; -import a8k.app.dao.type.a8kidcard.zenum.A8kFnType; +import a8k.app.optalgo.type.a8kidcard.A8kNormalFn; +import a8k.app.optalgo.type.a8kidcard.A8kOptFnFormula; +import a8k.app.optalgo.type.a8kidcard.A8kPiecewiseFn; +import a8k.app.optalgo.type.a8kidcard.A8kResultBuilderFn; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kFnType; import a8k.app.service.data.ProjInfoMgrService; import a8k.app.utils.ProjBuildinInfo; diff --git a/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java b/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java index 589d307..6f5160c 100644 --- a/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java +++ b/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java @@ -1,7 +1,7 @@ package a8k.extui.page.extapp; -import a8k.app.a8kproj.A8kReactionResultComputer; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.A8kPeakAnalyzer; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.device.BloodType; import a8k.app.a8ktype.state.SampleInfo; import a8k.app.a8ktype.type.ReactionResult; @@ -19,7 +19,7 @@ import a8k.app.service.data.ProjInfoMgrService; import a8k.app.service.lowerctrl.OptScanModuleCtrlService; import a8k.app.service.lowerctrl.PlateBoxCtrlService; import a8k.extui.type.ret.A8kScanCurve; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.app.a8ktype.device.ConsumableGroup; import a8k.app.a8ktype.device.IncubatorPos; import a8k.app.a8ktype.exception.AppException; @@ -214,7 +214,7 @@ public class A8kOptVerification { for (int i = 0; i < projBuildinInfo.optcfg.size(); i++) { OptScanResult optScanResult = getOptScanResult(projBuildinInfo.optcfg.get(i).optType); Assert.notNull(optScanResult, "光学扫描结果为空"); - results.add(A8kReactionResultComputer.optComputeResult(sampleInfo, projInfo, i, optScanResult.analysResult)); + results.add(A8kPeakAnalyzer.analysisPeakInfo(sampleInfo, projInfo, i, optScanResult.analysResult)); } return results; diff --git a/src/main/java/a8k/extui/page/extapp/OptFullFlowVerificationPage.java b/src/main/java/a8k/extui/page/extapp/OptFullFlowVerificationPage.java index bc0993c..a51f71b 100644 --- a/src/main/java/a8k/extui/page/extapp/OptFullFlowVerificationPage.java +++ b/src/main/java/a8k/extui/page/extapp/OptFullFlowVerificationPage.java @@ -1,8 +1,8 @@ package a8k.extui.page.extapp; import a8k.OS; -import a8k.app.a8kproj.A8kReactionResultComputer; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.A8kPeakAnalyzer; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.device.*; import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.param.type.A8kSamplePos; @@ -10,7 +10,7 @@ import a8k.app.a8ktype.state.SampleInfo; import a8k.app.a8ktype.type.ReactionResult; import a8k.app.a8ktype.type.TubeHolderScanResult; import a8k.app.dao.type.ProjExtInfoCard; -import a8k.app.dao.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.app.hardware.driver.PipetteCtrlDriver; import a8k.app.service.bases.AppEventBusService; import a8k.app.service.bases.FrontEndMessageBoxAndEventMgr; @@ -219,7 +219,7 @@ public class OptFullFlowVerificationPage { for (int i = 0; i < cxt.projBuildinInfo.subProjNum; i++) { var optScanResult = optScanModuleCtrlService.optScan(cxt.projBuildinInfo, i); - ReactionResult result = A8kReactionResultComputer.optComputeResult(cxt.sampleInfo, projInfo, i, optScanResult.analysResult); + ReactionResult result = A8kPeakAnalyzer.analysisPeakInfo(cxt.sampleInfo, projInfo, i, optScanResult.analysResult); cxt.results.add(result); optScanResults.add(optScanResult); } diff --git a/src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java b/src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java index 527d54f..3d83c44 100644 --- a/src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java +++ b/src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java @@ -11,7 +11,7 @@ import a8k.app.service.lowerctrl.OptScanModuleCtrlService; import a8k.app.service.lowerctrl.PlateBoxCtrlService; import a8k.app.service.param.optparam.OptModuleExtParamsMgr; import a8k.app.a8ktype.param.optpos.OptModuleExtParam; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.app.a8ktype.exception.AppException; import a8k.app.hardware.utils.OptGainConvert; import jakarta.annotation.PostConstruct; diff --git a/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeReactionRecordGeneratorPage.java b/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeReactionRecordGeneratorPage.java index fa01457..ac5d13a 100644 --- a/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeReactionRecordGeneratorPage.java +++ b/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeReactionRecordGeneratorPage.java @@ -1,14 +1,14 @@ package a8k.extui.page.extapp.debug_assistant; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.device.BloodType; import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.opttype.ReactionResultStatus; +import a8k.app.optalgo.type.ReactionResultStatus; import a8k.app.a8ktype.state.SampleInfo; import a8k.app.a8ktype.type.ReactionResult; -import a8k.app.dao.type.a8kidcard.A8kResultBuilderFn; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; -import a8k.app.dao.type.a8kidcard.zenum.A8kResultUnit; +import a8k.app.optalgo.type.a8kidcard.A8kResultBuilderFn; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kResultUnit; import a8k.extui.factory.FakeOptScanResultFactory; import a8k.extui.factory.ProjExtInfoCardFactory; import a8k.app.service.data.ProjInfoMgrService; diff --git a/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeStateGeneratorPage.java b/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeStateGeneratorPage.java index c983845..6603037 100644 --- a/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeStateGeneratorPage.java +++ b/src/main/java/a8k/extui/page/extapp/debug_assistant/FakeStateGeneratorPage.java @@ -5,8 +5,8 @@ import a8k.app.a8ktype.device.BloodType; import a8k.app.a8ktype.type.ReactionResult; import a8k.app.dao.ReactionReportDao; import a8k.app.dao.type.ReactionReport; -import a8k.app.dao.type.a8kidcard.A8kResultBuilderFn; -import a8k.app.dao.type.a8kidcard.zenum.A8kResultUnit; +import a8k.app.optalgo.type.a8kidcard.A8kResultBuilderFn; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kResultUnit; import a8k.app.service.statemgr.GStateMgrService; import a8k.app.utils.ZDateUtils; import a8k.extui.mgr.ExtApiPageMgr; diff --git a/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java b/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java index 529d2c8..1a33794 100644 --- a/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java +++ b/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java @@ -1,10 +1,10 @@ package a8k.extui.page.extsetting.db; import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.opttype.ReactionResultStatus; +import a8k.app.optalgo.type.ReactionResultStatus; import a8k.app.controler.filemgr.StorageControler; import a8k.app.dao.type.ReactionReport; -import a8k.app.dao.type.a8kidcard.zenum.A8kOptType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kOptType; import a8k.extui.factory.A8kScanCurveFactory; import a8k.app.service.data.FileMgrService; import a8k.app.service.data.ProjIdCardInfoMgrService; diff --git a/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPage.java b/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPage.java index 91827ef..868e7cb 100644 --- a/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPage.java +++ b/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPage.java @@ -1,8 +1,8 @@ package a8k.extui.page.test.codetest; -import a8k.app.a8kproj.A8kReactionResultComputer; -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; +import a8k.app.optalgo.A8kPeakAnalyzer; +import a8k.app.optalgo.type.A8kOptPeakInfo; import a8k.app.a8ktype.device.BloodType; import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.state.SampleInfo; @@ -32,7 +32,7 @@ public class OptFormulaTestPage { Boolean test(); } - OptAlgoAnalysResult optAlgoAnalysResult = new OptAlgoAnalysResult(); + A8kOptPeakInfo optAlgoAnalysResult = new A8kOptPeakInfo(); public void setR(Double val) { @@ -83,7 +83,7 @@ public class OptFormulaTestPage { if (projInfoContext.buildIn.optcfg.size() <= optIndex) { throw AppException.of(A8kEcode.CODEERROR, "当前项目没有第%s个子项目", optIndex); } - return A8kReactionResultComputer.optComputeResult(sampleInfo, projInfoContext, optIndex, optAlgoAnalysResult); + return A8kPeakAnalyzer.analysisPeakInfo(sampleInfo, projInfoContext, optIndex, optAlgoAnalysResult); } @Resource diff --git a/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPageV2.java b/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPageV2.java index 7cc1c37..e741ea5 100644 --- a/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPageV2.java +++ b/src/main/java/a8k/extui/page/test/codetest/OptFormulaTestPageV2.java @@ -1,13 +1,14 @@ package a8k.extui.page.test.codetest; -import a8k.app.a8kproj.A8kReactionResultComputer; -import a8k.app.a8kproj.optalgo.type.A8kOptPeaks; -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; -import a8k.app.a8kproj.optanalyzer.PeakNameAssigner; +import a8k.app.optalgo.A8kPeakAnalyzer; +import a8k.app.optalgo.type.A8kOptPeaks; +import a8k.app.optalgo.type.A8kOptPeakInfo; +import a8k.app.optalgo.utils.A8kOptPeakInfoBuilder; +import a8k.app.optalgo.utils.PeakNameAssigner; import a8k.app.a8ktype.device.BloodType; import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.opttype.PeakName; +import a8k.app.optalgo.type.PeakName; import a8k.app.a8ktype.state.SampleInfo; import a8k.app.a8ktype.type.ReactionResult; import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; @@ -78,12 +79,12 @@ public class OptFormulaTestPageV2 { @ExtApiStatu(name = "", group = "光学中间结果2", order = 3, minWidth = "100%") synchronized public String getComputedMidResult() { - return A8kReactionResultComputer.getComputeContext(); + return A8kPeakAnalyzer.getComputeContext(); } - OptAlgoAnalysResult optAlgoAnalysResult; + A8kOptPeakInfo optAlgoAnalysResult; synchronized public void setT4Area(Double val) { @@ -137,11 +138,11 @@ public class OptFormulaTestPageV2 { peaks.trySetPeakArea(PeakName.C, CArea); - optAlgoAnalysResult = OptAlgoAnalysResult.build(new double[0], peaks); + optAlgoAnalysResult = A8kOptPeakInfoBuilder.build(new double[0], peaks); if (projInfoContext.buildIn.optcfg.size() <= optIndex) { throw AppException.of(A8kEcode.CODEERROR, "当前项目没有第%s个子项目", optIndex); } - return A8kReactionResultComputer.optComputeResult(sampleInfo, projInfoContext, optIndex, optAlgoAnalysResult); + return A8kPeakAnalyzer.analysisPeakInfo(sampleInfo, projInfoContext, optIndex, optAlgoAnalysResult); } @Resource diff --git a/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java index 82358f8..d949ed7 100644 --- a/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java +++ b/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java @@ -1,8 +1,8 @@ package a8k.extui.page.test.verification; import a8k.OS; -import a8k.app.a8kproj.A8kReactionResultComputer; -import a8k.app.a8kproj.optalgo.type.OptScanResult; +import a8k.app.optalgo.A8kPeakAnalyzer; +import a8k.app.optalgo.type.OptScanResult; import a8k.app.a8ktype.device.*; import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.param.type.A8kSamplePos; @@ -10,7 +10,7 @@ import a8k.app.a8ktype.state.SampleInfo; import a8k.app.a8ktype.type.ReactionResult; import a8k.app.a8ktype.type.TubeHolderScanResult; import a8k.app.dao.type.ProjExtInfoCard; -import a8k.app.dao.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.app.optalgo.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.app.hardware.driver.PipetteCtrlDriver; import a8k.app.service.bases.AppEventBusService; import a8k.app.service.bases.FrontEndMessageBoxAndEventMgr; @@ -222,7 +222,7 @@ public class P51FullFlowVerificationPage { for (int i = 0; i < cxt.projBuildinInfo.subProjNum; i++) { var optScanResult = optScanModuleCtrlService.optScan(cxt.projBuildinInfo, i); - ReactionResult result = A8kReactionResultComputer.optComputeResult(cxt.sampleInfo, projInfo, i, optScanResult.analysResult); + ReactionResult result = A8kPeakAnalyzer.analysisPeakInfo(cxt.sampleInfo, projInfo, i, optScanResult.analysResult); cxt.results.add(result); optScanResults.add(optScanResult); }