Przeglądaj źródła

adapt oref TDD calc and weightedAverage

check lib/determine-basal for readable changes in oref
Robert 1 rok temu
rodzic
commit
3dd9882416

Plik diff jest za duży
+ 1 - 1
FreeAPS/Resources/javascript/bundle/determine-basal.js


+ 3 - 2
oref0_source_version.txt

@@ -1,7 +1,8 @@
-oref0 branch: TToref-reset - git version: e0caaa0
+oref0 branch: dev - git version: 0ff47a3
 
 Last commits:
-e0caaa0 revert to standard HBT calculation
+0ff47a3 fix weightedAverage, always calculate TDD
+e274bb0 revert to standard HBT calculation
 363fd11 Merge pull request #28 from bjornoleh/harmonise_defaults
 2d695e1 index.js: set enableUAM to false, and remove whitespace in L11
 8f5f820 Harmonise profile defaults with openaps/oref0

+ 126 - 127
trio-oref/lib/determine-basal/determine-basal.js

@@ -409,157 +409,156 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
 
     // Calculate tdd ----------------------------------------------------------------------
 
-    if (dynISFenabled) {
-        //Bolus:
-        for (let i = 0; i < pumphistory.length; i++) {
-            if (pumphistory[i]._type == "Bolus") {
-                bolusInsulin += pumphistory[i].amount;
-            }
+    //Bolus:
+    for (let i = 0; i < pumphistory.length; i++) {
+        if (pumphistory[i]._type == "Bolus") {
+            bolusInsulin += pumphistory[i].amount;
         }
+    }
 
-        // Temp basals:
-        for (let j = 1; j < pumphistory.length; j++) {
-            if (pumphistory[j]._type == "TempBasal" && pumphistory[j].rate > 0) {
-                current = j;
-                quota = pumphistory[j].rate;
-                var duration = pumphistory[j-1]['duration (min)'] / 60;
-                var origDur = duration;
-                var pastTime = new Date(pumphistory[j-1].timestamp);
-                var morePresentTime = new Date(pastTime);
-                var substractTimeOfRewind = 0;
-                // If temp basal hasn't yet ended, use now as end date for calculation
-                do {
-                    j--;
-                    if (j == 0) {
-                        morePresentTime =  new Date();
-                        break;
-                    }
-                    else if (pumphistory[j]._type == "TempBasal" || pumphistory[j]._type == "PumpSuspend")  {
-                        morePresentTime = new Date(pumphistory[j].timestamp);
-                        break;
-                    }
-                    // During the time the Medtronic pumps are rewinded and primed, this duration of suspened insulin delivery needs to be accounted for.
-                    var pp = j-2;
-                    if (pp >= 0) {
-                        if (pumphistory[pp]._type == "Rewind") {
-                            let rewindTimestamp = pumphistory[pp].timestamp;
-                            // There can be several Prime events
-                            while (pp - 1 >= 0) {
-                                pp -= 1;
-                                if (pumphistory[pp]._type == "Prime") {
-                                    substractTimeOfRewind = (pumphistory[pp].timestamp - rewindTimestamp) / 36e5;
-                                } else { break }
-                            }
+    // Temp basals:
+    for (let j = 1; j < pumphistory.length; j++) {
+        if (pumphistory[j]._type == "TempBasal" && pumphistory[j].rate > 0) {
+            current = j;
+            quota = pumphistory[j].rate;
+            var duration = pumphistory[j-1]['duration (min)'] / 60;
+            var origDur = duration;
+            var pastTime = new Date(pumphistory[j-1].timestamp);
+            var morePresentTime = new Date(pastTime);
+            var substractTimeOfRewind = 0;
+            // If temp basal hasn't yet ended, use now as end date for calculation
+            do {
+                j--;
+                if (j == 0) {
+                    morePresentTime =  new Date();
+                    break;
+                }
+                else if (pumphistory[j]._type == "TempBasal" || pumphistory[j]._type == "PumpSuspend")  {
+                    morePresentTime = new Date(pumphistory[j].timestamp);
+                    break;
+                }
+                // During the time the Medtronic pumps are rewinded and primed, this duration of suspened insulin delivery needs to be accounted for.
+                var pp = j-2;
+                if (pp >= 0) {
+                    if (pumphistory[pp]._type == "Rewind") {
+                        let rewindTimestamp = pumphistory[pp].timestamp;
+                        // There can be several Prime events
+                        while (pp - 1 >= 0) {
+                            pp -= 1;
+                            if (pumphistory[pp]._type == "Prime") {
+                                substractTimeOfRewind = (pumphistory[pp].timestamp - rewindTimestamp) / 36e5;
+                            } else { break }
+                        }
 
-                            // If Medtronic user forgets to insert infusion set
-                            if (substractTimeOfRewind >= duration) {
-                                morePresentTime = new Date(rewindTimestamp);
-                                substractTimeOfRewind = 0;
-                            }
+                        // If Medtronic user forgets to insert infusion set
+                        if (substractTimeOfRewind >= duration) {
+                            morePresentTime = new Date(rewindTimestamp);
+                            substractTimeOfRewind = 0;
                         }
                     }
-                } while (j > 0);
-
-                var diff = (morePresentTime - pastTime) / 36e5;
-                if (diff < origDur) {
-                    duration = diff;
                 }
+            } while (j > 0);
 
-                insulin = quota * (duration - substractTimeOfRewind);
-                tempInsulin += accountForIncrements(insulin);
-                j = current;
+            var diff = (morePresentTime - pastTime) / 36e5;
+            if (diff < origDur) {
+                duration = diff;
             }
+
+            insulin = quota * (duration - substractTimeOfRewind);
+            tempInsulin += accountForIncrements(insulin);
+            j = current;
         }
-        //  Check and count for when basals are delivered with a scheduled basal rate.
-        //  1. Check for 0 temp basals with 0 min duration. This is for when ending a manual temp basal and (perhaps) continuing in open loop for a while.
-        //  2. Check for temp basals that completes. This is for when disconnected from link/iphone, or when in open loop.
-        //  3. Account for a punp suspension. This is for when pod screams or when MDT or pod is manually suspended.
-        //  4. Account for a pump resume (in case pump/cgm is disconnected before next loop).
-        //  To do: are there more circumstances when scheduled basal rates are used? Do we need to care about "Prime" and "Rewind" with MDT pumps?
-        //
-        for (let k = 0; k < pumphistory.length; k++) {
-            // Check for 0 temp basals with 0 min duration.
-            insulin = 0;
-            if (pumphistory[k]['duration (min)'] == 0 || pumphistory[k]._type == "PumpResume") {
-                let time1 = new Date(pumphistory[k].timestamp);
-                let time2 = new Date(time1);
-                let l = k;
-                do {
-                    if (l > 0) {
-                        --l;
-                        if (pumphistory[l]._type == "TempBasal") {
-                            time2 = new Date(pumphistory[l].timestamp);
-                            break;
-                        }
+    }
+    //  Check and count for when basals are delivered with a scheduled basal rate.
+    //  1. Check for 0 temp basals with 0 min duration. This is for when ending a manual temp basal and (perhaps) continuing in open loop for a while.
+    //  2. Check for temp basals that completes. This is for when disconnected from link/iphone, or when in open loop.
+    //  3. Account for a punp suspension. This is for when pod screams or when MDT or pod is manually suspended.
+    //  4. Account for a pump resume (in case pump/cgm is disconnected before next loop).
+    //  To do: are there more circumstances when scheduled basal rates are used? Do we need to care about "Prime" and "Rewind" with MDT pumps?
+    //
+    for (let k = 0; k < pumphistory.length; k++) {
+        // Check for 0 temp basals with 0 min duration.
+        insulin = 0;
+        if (pumphistory[k]['duration (min)'] == 0 || pumphistory[k]._type == "PumpResume") {
+            let time1 = new Date(pumphistory[k].timestamp);
+            let time2 = new Date(time1);
+            let l = k;
+            do {
+                if (l > 0) {
+                    --l;
+                    if (pumphistory[l]._type == "TempBasal") {
+                        time2 = new Date(pumphistory[l].timestamp);
+                        break;
                     }
-                } while (l > 0);
-                // duration of current scheduled basal in h
-                let basDuration = (time2 - time1) / 36e5;
-
-                if (basDuration > 0) {
-                    scheduledBasalInsulin += calcScheduledBasalInsulin(time2, time1);
                 }
+            } while (l > 0);
+            // duration of current scheduled basal in h
+            let basDuration = (time2 - time1) / 36e5;
+
+            if (basDuration > 0) {
+                scheduledBasalInsulin += calcScheduledBasalInsulin(time2, time1);
             }
         }
+    }
 
-        // Check for temp basals that completes
-        for (let n = pumphistory.length -1; n > 0; n--) {
-            if (pumphistory[n]._type == "TempBasalDuration") {
-                // duration in hours
-                let oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
-                // time of old temp basal
-                let oldTime = new Date(pumphistory[n].timestamp);
-                var newTime = new Date(oldTime);
-                let o = n;
-                do {
-                    --o;
-                    if (o >= 0) {
-                        if (pumphistory[o]._type == "TempBasal" || pumphistory[o]._type == "PumpSuspend") {
-                            // time of next (new) temp basal or a pump suspension
-                            newTime = new Date(pumphistory[o].timestamp);
-                            break;
-                        }
+    // Check for temp basals that completes
+    for (let n = pumphistory.length -1; n > 0; n--) {
+        if (pumphistory[n]._type == "TempBasalDuration") {
+            // duration in hours
+            let oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
+            // time of old temp basal
+            let oldTime = new Date(pumphistory[n].timestamp);
+            var newTime = new Date(oldTime);
+            let o = n;
+            do {
+                --o;
+                if (o >= 0) {
+                    if (pumphistory[o]._type == "TempBasal" || pumphistory[o]._type == "PumpSuspend") {
+                        // time of next (new) temp basal or a pump suspension
+                        newTime = new Date(pumphistory[o].timestamp);
+                        break;
                     }
-                } while (o > 0);
-
-                // When latest temp basal is index 0 in pump history
-                if (n == 0 && pumphistory[0]._type == "TempBasalDuration") {
-                    newTime = new Date();
-                    oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
                 }
+            } while (o > 0);
 
-                let tempBasalTimeDifference = (newTime - oldTime) / 36e5;
-                let timeOfbasal = tempBasalTimeDifference - oldBasalDuration;
-                // if duration of scheduled basal is more than 0
-                if (timeOfbasal > 0) {
-                    // Timestamp after completed temp basal
-                    let timeOfScheduledBasal =  addTimeToDate(oldTime, oldBasalDuration);
-                    scheduledBasalInsulin += calcScheduledBasalInsulin(newTime, timeOfScheduledBasal);
-                }
+            // When latest temp basal is index 0 in pump history
+            if (n == 0 && pumphistory[0]._type == "TempBasalDuration") {
+                newTime = new Date();
+                oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
+            }
+
+            let tempBasalTimeDifference = (newTime - oldTime) / 36e5;
+            let timeOfbasal = tempBasalTimeDifference - oldBasalDuration;
+            // if duration of scheduled basal is more than 0
+            if (timeOfbasal > 0) {
+                // Timestamp after completed temp basal
+                let timeOfScheduledBasal =  addTimeToDate(oldTime, oldBasalDuration);
+                scheduledBasalInsulin += calcScheduledBasalInsulin(newTime, timeOfScheduledBasal);
             }
         }
+    }
 
-        tdd = bolusInsulin + tempInsulin + scheduledBasalInsulin;
+    tdd = bolusInsulin + tempInsulin + scheduledBasalInsulin;
 
 
-        var insulin_ = {
-            TDD: round(tdd, 5),
-            bolus: round(bolusInsulin, 5),
-            temp_basal: round(tempInsulin, 5),
-            scheduled_basal: round(scheduledBasalInsulin, 5)
-        }
+    var insulin_ = {
+        TDD: round(tdd, 5),
+        bolus: round(bolusInsulin, 5),
+        temp_basal: round(tempInsulin, 5),
+        scheduled_basal: round(scheduledBasalInsulin, 5)
+    }
 
-        if (pumpData > 21) {
-            logBolus = ". Bolus insulin: " + bolusInsulin.toPrecision(5) + " U";
-            logTempBasal = ". Temporary basal insulin: " + tempInsulin.toPrecision(5) + " U";
-            logBasal = ". Insulin with scheduled basal rate: " + scheduledBasalInsulin.toPrecision(5) + " U";
-            logtdd = " TDD past 24h is: " + tdd.toPrecision(5) + " U";
-            logOutPut = dataLog + logtdd + logBolus + logTempBasal + logBasal;
+    if (pumpData > 21) {
+        logBolus = ". Bolus insulin: " + bolusInsulin.toPrecision(5) + " U";
+        logTempBasal = ". Temporary basal insulin: " + tempInsulin.toPrecision(5) + " U";
+        logBasal = ". Insulin with scheduled basal rate: " + scheduledBasalInsulin.toPrecision(5) + " U";
+        logtdd = " TDD past 24h is: " + tdd.toPrecision(5) + " U";
+        logOutPut = dataLog + logtdd + logBolus + logTempBasal + logBasal;
 
-            tddReason = ", TDD: " + round(tdd,2) + " U, " + round(bolusInsulin/tdd*100,0) + "% Bolus " + round((tempInsulin+scheduledBasalInsulin)/tdd*100,0) +  "% Basal";
+        tddReason = ", TDD: " + round(tdd,2) + " U, " + round(bolusInsulin/tdd*100,0) + "% Bolus " + round((tempInsulin+scheduledBasalInsulin)/tdd*100,0) +  "% Basal";
+
+    } else { tddReason = ", TDD: Not enough pumpData (< 21h)"; }
 
-        } else { tddReason = ", TDD: Not enough pumpData (< 21h)"; }
-    }
 
     var tdd_before = tdd;
 
@@ -643,7 +642,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
 
     // Use weighted TDD average
     tdd_before = tdd;
-    if (weightPercentage < 1 && weightedAverage > 0) {
+    if (weightPercentage < 1 && weightedAverage > 1) {
         tdd = weightedAverage;
         console.log("Using weighted TDD average: " + round(tdd,2) + " U, instead of past 24 h (" + round(tdd_before,2) + " U), weight: " + weightPercentage);
         weightLog = ", Weighted TDD: " + round(tdd,2) + " U";