最新版给药算法
This commit is contained in:
commit
e3f0663954
|
@ -0,0 +1,995 @@
|
|||
import time
|
||||
import math
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import pymysql
|
||||
import datetime
|
||||
from torch import device, cuda, zeros, from_numpy, load
|
||||
from torch.nn import LSTM,Linear,Module
|
||||
device = device("cuda" if cuda.is_available() else "cpu")
|
||||
|
||||
|
||||
df = pd.read_csv('./information.txt',sep=',',header=None)
|
||||
name = df.iloc[0,0]
|
||||
dbname = str(name)
|
||||
|
||||
|
||||
#####计算BMI,肥胖患者需要调整
|
||||
def weight(sex, high, weight):
|
||||
BMI = weight / (high / 100 * high / 100)
|
||||
if (BMI > 30):
|
||||
if (sex == "M"):
|
||||
jiao_weight = high - 100 + 0.4 * (weight - (high - 100))
|
||||
lixiang_weight = high - 100
|
||||
else:
|
||||
jiao_weight = high - 105 + 0.4 * (weight - (high - 105))
|
||||
lixiang_weight = high - 105
|
||||
else:
|
||||
jiao_weight = weight
|
||||
lixiang_weight = weight
|
||||
return jiao_weight, lixiang_weight
|
||||
|
||||
def ku_patient():
|
||||
while(1):
|
||||
try:
|
||||
conn3 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4', db=dbname,port=3306,connect_timeout= 60)
|
||||
cur3 = conn3.cursor()
|
||||
sql = ' SELECT * FROM patienttable ORDER BY id DESC LIMIT 1'
|
||||
cur3.execute(sql)
|
||||
results = cur3.fetchall()
|
||||
if len(results) == 0:
|
||||
print('PatientTable is None!')
|
||||
time.sleep(2)
|
||||
else:
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
global a1
|
||||
a1 = np.array(results)
|
||||
a1 = a1.reshape(16)
|
||||
conn3.commit()
|
||||
cur3.close()
|
||||
conn3.close()
|
||||
return a1
|
||||
|
||||
patient = ku_patient()
|
||||
high = patient[5]
|
||||
weight1 = patient[4]
|
||||
sex = patient[2]
|
||||
weight1, weight2 = weight(sex, high, weight1)
|
||||
|
||||
######################################获取featuretable数据#############################################################
|
||||
def ku_data():
|
||||
while(1):
|
||||
try:
|
||||
conn2 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4', db=dbname,port=3306,connect_timeout= 60)
|
||||
cur2 = conn2.cursor()
|
||||
sql = ' SELECT * FROM featuretable ORDER BY id DESC LIMIT 1'
|
||||
cur2.execute(sql)
|
||||
results = cur2.fetchall()
|
||||
id = results[0][0]
|
||||
ID[1] = id
|
||||
if ID[0] == ID[1] or len(results) == 0:
|
||||
pass
|
||||
elif ID[0] != ID[1]:
|
||||
ID[0] = ID[1]
|
||||
ID[1] = 0
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
global a
|
||||
a = np.array(results)
|
||||
a = a.reshape(15)
|
||||
conn2.commit()
|
||||
cur2.close()
|
||||
conn2.close()
|
||||
return a
|
||||
|
||||
##############################40<BIS<60时,进行调整
|
||||
def CHO_BIS(CHO, BIS):
|
||||
if BIS > 60:
|
||||
CHO_NOW = CHO + 10
|
||||
elif 0 < BIS < 40:
|
||||
CHO_NOW = CHO - 10
|
||||
return CHO_NOW
|
||||
|
||||
##############################血压###############
|
||||
def BP_data(SBP, DBP, MAP):
|
||||
xy = -1 ##### 0代表正常、1代表高血压、2代表低血压、-1代表血压不在判断范围内
|
||||
# MAP = (SBP + 2*DBP)/3
|
||||
if (SBP > 130 and DBP >=60) or (80 <= SBP <= 130 and DBP>90):
|
||||
xy = 1
|
||||
elif SBP >=80 and 0 < DBP < 60 :
|
||||
if MAP > 110 :
|
||||
xy = 1
|
||||
elif 0 < MAP < 60:
|
||||
xy = 2
|
||||
elif 60 <= MAP <= 110:
|
||||
xy = 0
|
||||
elif 80 <= SBP <= 130 and 60 <= DBP <= 90:
|
||||
xy = 0
|
||||
elif 0 < SBP < 80 and 0 < DBP <= 90:
|
||||
xy = 2
|
||||
return xy
|
||||
|
||||
#############################读取连续1min的HR(去掉零值),判读其趋势
|
||||
def HR_data(b):
|
||||
b_flag = 0
|
||||
while(1):
|
||||
try:
|
||||
conn4 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
|
||||
cur4 = conn4.cursor()
|
||||
sql = ' SELECT * FROM featuretable ORDER BY id DESC LIMIT %d' % (60)
|
||||
cur4.execute(sql)
|
||||
results = cur4.fetchall()
|
||||
global a
|
||||
a = np.array(results)
|
||||
conn4.commit()
|
||||
cur4.close()
|
||||
conn4.close()
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
filtered_data = [x for x in a[:, 3] if x != 0]
|
||||
if len(filtered_data) == 0:
|
||||
b_flag = 2
|
||||
if b==1:
|
||||
for i in range(len(filtered_data)):
|
||||
if filtered_data[i] > 89:
|
||||
b_flag=1
|
||||
else:
|
||||
b_flag=0
|
||||
break
|
||||
else:
|
||||
for i in range(len(filtered_data)):
|
||||
if (0 < filtered_data[i] < 46):
|
||||
b_flag=1
|
||||
else:
|
||||
b_flag=0
|
||||
break
|
||||
return b_flag
|
||||
|
||||
#############################读取连续10条BIS值,用于LSTM的BIS预测算法;BIS值不足10条时将对已有数据进行复制
|
||||
def Feature_data():
|
||||
while(1):
|
||||
try:
|
||||
conn9 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
|
||||
cur9 = conn9.cursor()
|
||||
sql = ' SELECT BIS FROM featuretable ORDER BY id DESC LIMIT %d ' % (10)
|
||||
cur9.execute(sql)
|
||||
results = cur9.fetchall()
|
||||
global a
|
||||
a = np.array(results)
|
||||
if len(a) < 10:
|
||||
repeat_count = math.ceil((10 - len(a)) / len(a)) + 1
|
||||
final_results = a.repeat(repeat_count)
|
||||
final_results = np.array(final_results[:10]).reshape(10, 1)
|
||||
a = final_results[::-1, :]
|
||||
a = (a - 40) / 20
|
||||
a = a.reshape(a.shape[0], a.shape[1], 1)
|
||||
conn9.commit()
|
||||
cur9.close()
|
||||
conn9.close()
|
||||
break
|
||||
else:
|
||||
a = a[::-1, :]
|
||||
a = (a-40)/20
|
||||
a = a.reshape(a.shape[0],a.shape[1],1)
|
||||
conn9.commit()
|
||||
cur9.close()
|
||||
conn9.close()
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
return a
|
||||
|
||||
# 丙泊酚最大速度与最小速度
|
||||
CHO_max = 120 # ug/kg/min
|
||||
CHO_min = 60
|
||||
|
||||
# 瑞芬太尼最大速度与最小速度
|
||||
REM_max = 0.3 # ug/kg/min
|
||||
REM_min = 0.1
|
||||
|
||||
# 顺阿曲库铵最大速度与最小速度
|
||||
ROC_max = 2 # ug/kg/min
|
||||
ROC_min = 1 # ug/kg/min
|
||||
|
||||
# 罗库溴铵最大速度与最小速度
|
||||
RB_max = 12 # ug/kg/min
|
||||
RB_min = 9 # ug/kg/min
|
||||
|
||||
# 丙泊酚、瑞芬太尼以及顺阿曲库铵的正常浓度
|
||||
re_CHO = 90 # ug/kg/min
|
||||
re_REM = 0.2 # ug/kg/min
|
||||
re_ROC = 1.5 # ug/kg/min
|
||||
re_RB = 10 # ug/kg/min
|
||||
|
||||
# 7种药的浓度(又称规格)
|
||||
CHO_con=10 #mg/ml
|
||||
REM_con=0.1 #mg/ml
|
||||
ROC_con=1 #mg/ml
|
||||
EPH_con=3 #mg/ml 麻黄素
|
||||
NIC_con=0.5 #mg/ml 尼卡地平
|
||||
ESM_con=10 #mg/ml 艾司洛尔
|
||||
ATR_con=0.2 #mg/ml 阿托品
|
||||
RB_con = 2.5 #mg/ml 罗库溴铵
|
||||
|
||||
# 目前速度或剂量,初始化为正常速度
|
||||
now_CHO = re_CHO
|
||||
now_REM = re_REM
|
||||
now_ROC = re_ROC
|
||||
now_RB = re_RB
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
|
||||
# 关于药物时间间隔(生效时间)的计数或给药次数bi
|
||||
bis_count = 0
|
||||
pre_bis_count = 0
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
TOF_count = 0
|
||||
|
||||
HRS_count = 0 #慢心率计数
|
||||
HRD_count = 0 #快心率计数
|
||||
ESM_count = 0
|
||||
ATR_count = 0
|
||||
|
||||
REMSS_count = 0 #瑞芬太尼加药时间间隔的计数
|
||||
REMDD_count = 0 #瑞芬太尼减药时间间隔的计数
|
||||
REMS_count = 0 #瑞芬太尼加药给药次数
|
||||
REMD_count = 0 #瑞芬太尼减药给药次数
|
||||
|
||||
flag = 0 #判别症状标志 0为正常状态 1为BIS异常;当丙泊酚输注速率达到最大速率或最小速率,视为BIS异常
|
||||
bis_flag = 0 #丙泊酚初次判断标志 0为正常状态 1为异常,则进入BIS药物间隔时间计数
|
||||
flag1 = 0 #高血压或低血压两次给药无效则转瑞芬太尼 1为转瑞芬太尼
|
||||
flag2 = 0 #快心率或慢心率两次给药无效则转瑞芬太尼 1为转瑞芬太尼
|
||||
flag4 = 0 #TOF 连续两次加药无效,转人工 1代表转人工
|
||||
xueya_flag = 0 #血压标志: 0为正常 1为高血压 2为低血压
|
||||
xinlv_flag = 0 #心率标志:0为正常 1为快心率 2为慢心率
|
||||
REM_flag = 0 #瑞芬太尼初次判断标志 0为正常状态 1为异常,则进入瑞芬太尼药物间隔时间计数
|
||||
TOF_flag = 0 #TOF初次判断标志 0为正常状态 1为异常
|
||||
|
||||
|
||||
gaoxue_count = 0 #高血压时间间隔计数(暂关闭)
|
||||
dixue_count = 0 #低血压时间间隔计数(暂关闭)
|
||||
gaoxue_cishu = 0 #测得高血压的次数
|
||||
dixue_cishu = 0 #测得低血压的次数
|
||||
rem_gaoxue_cishu = 0 #转瑞芬太尼后,测得高血压的次数
|
||||
rem_dixue_cishu = 0 #转瑞芬太尼后,测得低血压的次数
|
||||
|
||||
CHO_unit = 2.5 #40<BIS<60,调整单位
|
||||
ID = [0,0] #判断是否为上一个值
|
||||
BP_flag = 0 #### 1代表有创 2代表无创
|
||||
jisong = 2 ##### 1代表罗库溴铵 2代表顺阿曲库铵
|
||||
|
||||
#################### 定义 LSTM 模型
|
||||
class LSTMModel(Module):
|
||||
def __init__(self, input_size, hidden_size, num_layers, output_size):
|
||||
super(LSTMModel, self).__init__()
|
||||
self.hidden_size = hidden_size
|
||||
self.num_layers = num_layers
|
||||
self.lstm = LSTM(input_size, hidden_size, num_layers, batch_first=True)
|
||||
self.fc = Linear(hidden_size, output_size)
|
||||
|
||||
def forward(self, x):
|
||||
h0 = zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
|
||||
c0 = zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
|
||||
x = x.float()
|
||||
out, _ = self.lstm(x, (h0, c0))
|
||||
out = self.fc(out[:, -1, :])
|
||||
return out
|
||||
|
||||
while(1):
|
||||
try:
|
||||
conn5 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
|
||||
#判断手术是否结束,1代表手术进行中,0代表手术结束;
|
||||
sql = ' SELECT Flag FROM endflagtable ORDER BY id DESC LIMIT 1'
|
||||
cur5 = conn5.cursor()
|
||||
cur5.execute(sql)
|
||||
results = cur5.fetchall()
|
||||
results = np.array(results)
|
||||
conn5.commit()
|
||||
|
||||
# sql1 = ' SELECT 罗库 FROM selecttable'
|
||||
# cur5 = conn5.cursor()
|
||||
# cur5.execute(sql1)
|
||||
# temp = cur5.fetchall()
|
||||
# temp = np.array(temp)
|
||||
# conn5.commit()
|
||||
# if np.isin(1, temp):
|
||||
# jisong = 1
|
||||
# break
|
||||
# elif np.isin(2, temp):
|
||||
# jisong = 2
|
||||
# break
|
||||
cur5.close()
|
||||
conn5.close()
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
|
||||
############### 维持期程序
|
||||
while(results):
|
||||
while(1):
|
||||
try:
|
||||
conn6 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306,connect_timeout= 60)
|
||||
cur6 = conn6.cursor()
|
||||
sql = ' SELECT Flag FROM endflagtable ORDER BY id DESC LIMIT 1'
|
||||
cur6.execute(sql)
|
||||
results = cur6.fetchall()
|
||||
results = np.array(results)
|
||||
conn6.commit()
|
||||
if BP_flag == 0:
|
||||
sql1 = ' SELECT 有创 FROM selecttable ORDER BY id DESC LIMIT 1'
|
||||
cur6 = conn6.cursor()
|
||||
cur6.execute(sql1)
|
||||
temp1 = cur6.fetchall()
|
||||
temp1 = np.array(temp1)
|
||||
conn6.commit()
|
||||
if temp1 == 1:
|
||||
BP_flag = 1
|
||||
elif temp1 == 2:
|
||||
BP_flag = 2
|
||||
# if np.isin(1, temp1):
|
||||
# BP_flag = 1
|
||||
# elif np.isin(2, temp1):
|
||||
# BP_flag = 2
|
||||
cur6.close()
|
||||
conn6.close()
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
|
||||
while(1):
|
||||
try:
|
||||
conn10 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306,connect_timeout= 60)
|
||||
cur10 = conn10.cursor()
|
||||
sql = ' SELECT Flag FROM aiflagtable ORDER BY id DESC LIMIT 1'
|
||||
cur10.execute(sql)
|
||||
ai_flag = cur10.fetchall()
|
||||
ai_flag = np.array(ai_flag)
|
||||
if ai_flag == 0:
|
||||
# 目前速度或剂量,初始化为正常速度
|
||||
now_CHO = re_CHO
|
||||
now_REM = re_REM
|
||||
now_ROC = re_ROC
|
||||
now_RB = re_RB
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
|
||||
# 关于药物时间间隔(生效时间)的计数或给药次数
|
||||
bis_count = 0
|
||||
pre_bis_count = 0
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
TOF_count = 0
|
||||
|
||||
HRS_count = 0 # 慢心率计数
|
||||
HRD_count = 0 # 快心率计数
|
||||
ESM_count = 0
|
||||
ATR_count = 0
|
||||
|
||||
REMSS_count = 0 # 瑞芬太尼加药时间间隔的计数
|
||||
REMDD_count = 0 # 瑞芬太尼减药时间间隔的计数
|
||||
REMS_count = 0 # 瑞芬太尼加药给药次数
|
||||
REMD_count = 0 # 瑞芬太尼减药给药次数
|
||||
|
||||
flag = 0 # 判别症状标志 0为正常状态 1为BIS异常;当丙泊酚输注速率达到最大速率或最小速率,视为BIS异常
|
||||
bis_flag = 0 # 丙泊酚初次判断标志 0为正常状态 1为异常,则进入BIS药物间隔时间计数
|
||||
flag1 = 0 # 高血压或低血压两次给药无效则转瑞芬太尼 1为转瑞芬太尼
|
||||
flag2 = 0 # 快心率或慢心率两次给药无效则转瑞芬太尼 1为转瑞芬太尼
|
||||
flag4 = 0 # TOF 连续两次加药无效,转人工 1代表转人工
|
||||
xueya_flag = 0 # 血压标志: 0为正常 1为高血压 2为低血压
|
||||
xinlv_flag = 0 # 心率标志:0为正常 1为快心率 2为慢心率
|
||||
REM_flag = 0 # 瑞芬太尼初次判断标志 0为正常状态 1为异常,则进入瑞芬太尼药物间隔时间计数
|
||||
TOF_flag = 0 # TOF初次判断标志 0为正常状态 1为异常
|
||||
|
||||
gaoxue_count = 0 # 高血压时间间隔计数(暂关闭)
|
||||
dixue_count = 0 # 低血压时间间隔计数(暂关闭)
|
||||
gaoxue_cishu = 0 # 测得高血压的次数
|
||||
dixue_cishu = 0 # 测得低血压的次数
|
||||
rem_gaoxue_cishu = 0 # 转瑞芬太尼后,测得高血压的次数
|
||||
rem_dixue_cishu = 0 # 转瑞芬太尼后,测得低血压的次数
|
||||
elif ai_flag == 1:
|
||||
pass
|
||||
conn10.commit()
|
||||
cur10.close()
|
||||
conn10.close()
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
try:
|
||||
feature = ku_data()
|
||||
BIS = feature[2]
|
||||
HR = feature[3]
|
||||
SBP = feature[4]
|
||||
DBP = feature[5]
|
||||
MAP = feature[6]
|
||||
ST = feature[7]
|
||||
TEMP = feature[8]
|
||||
SPO2 = feature[9]
|
||||
EtCO2 = feature[10]
|
||||
TOF = feature[13]
|
||||
|
||||
##########################BIS值########################################################
|
||||
if flag == 0 and (0 < BIS <= 35) and bis_flag == 0:
|
||||
now_CHO = 0
|
||||
now_REM = 0
|
||||
elif flag == 0 and (35 < BIS < 40 or BIS > 60) and bis_flag == 0:# 判断此时BIS是否正常,如果异常,则观察2min进行丙泊酚药量调整,调整如果到达最大值,转到相应的瑞芬模块
|
||||
if now_CHO == 0:
|
||||
now_CHO = re_CHO
|
||||
now_REM = re_REM
|
||||
now_CHO = CHO_BIS(now_CHO, BIS)
|
||||
bis_flag = 1
|
||||
elif flag == 0 and (40 <= BIS <= 60 or BIS == 0) and bis_flag == 0:
|
||||
if now_CHO == 0 :
|
||||
now_CHO = re_CHO
|
||||
now_REM = re_REM
|
||||
bis_data = Feature_data()
|
||||
bis_data = bis_data.copy()
|
||||
bis_data = from_numpy(bis_data).float()
|
||||
bis_data = bis_data.to(device)
|
||||
bis_model = load("./bis_model.pt")
|
||||
bis_model = bis_model.to(device)
|
||||
bis_pred = bis_model(bis_data)
|
||||
bis_pred = bis_pred[-1].item()
|
||||
bis_pred = bis_pred*20+40
|
||||
pre_bis_count = pre_bis_count + 1
|
||||
print("pre_bis_count",pre_bis_count)
|
||||
if pre_bis_count == 61 and 42 < bis_pred <= 45:
|
||||
print(bis_pred)
|
||||
now_CHO = now_CHO + (-2) * CHO_unit
|
||||
pre_bis_count = 1
|
||||
elif pre_bis_count == 61 and 45 < bis_pred <= 48:
|
||||
print(bis_pred)
|
||||
now_CHO = now_CHO + (-1) * CHO_unit
|
||||
pre_bis_count = 1
|
||||
elif pre_bis_count == 61 and 55 < bis_pred <= 58:
|
||||
print(bis_pred)
|
||||
now_CHO = now_CHO + 2 * CHO_unit
|
||||
pre_bis_count = 1
|
||||
elif pre_bis_count == 61 and 52 < bis_pred <= 55:
|
||||
print(bis_pred)
|
||||
now_CHO = now_CHO + CHO_unit
|
||||
pre_bis_count = 1
|
||||
elif pre_bis_count == 62:
|
||||
print(bis_pred)
|
||||
pre_bis_count = 1
|
||||
|
||||
if bis_flag == 1:
|
||||
bis_count = bis_count + 1
|
||||
print("bis_count",bis_count)
|
||||
if 0 < BIS <= 35 :
|
||||
bis_flag = 0
|
||||
bis_count = 0
|
||||
pre_bis_count = 0
|
||||
if bis_count == 121 and (35 < BIS < 40 or BIS > 60):
|
||||
now_CHO = CHO_BIS(now_CHO, BIS)
|
||||
bis_count = 1
|
||||
pre_bis_count = 0
|
||||
elif bis_count == 121 and (40 <= BIS <= 60):
|
||||
bis_flag = 0
|
||||
bis_count = 0
|
||||
pre_bis_count = 0
|
||||
elif bis_count == 121 and BIS == 0:
|
||||
bis_count = bis_count - 1
|
||||
|
||||
if now_CHO > CHO_max:
|
||||
now_CHO = CHO_max
|
||||
flag = 1
|
||||
elif 0 < now_CHO < CHO_min:
|
||||
now_CHO = CHO_min
|
||||
flag = 1
|
||||
else:
|
||||
flag = 0
|
||||
##########################BIS值########################################################
|
||||
|
||||
##########################无创血压########################################################
|
||||
print("xueya_flag",xueya_flag)
|
||||
if BP_flag == 2:
|
||||
if xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 1:
|
||||
xueya_flag = 1
|
||||
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 2:
|
||||
xueya_flag = 2
|
||||
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 0 :
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
if xueya_flag == 1:
|
||||
if BP_data(SBP,DBP,MAP) == 1:
|
||||
now_EPH = 0
|
||||
EPH_count = 0
|
||||
gaoxue_cishu = gaoxue_cishu + 1
|
||||
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 2:
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
xueya_flag = 0
|
||||
elif xueya_flag == 2:
|
||||
if BP_data(SBP,DBP,MAP) == 2:
|
||||
now_NIC = 0
|
||||
NIC_count = 0
|
||||
dixue_cishu= dixue_cishu+1
|
||||
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1:
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
xueya_flag = 0
|
||||
#############################两次异常##################################################
|
||||
if BP_data(SBP,DBP,MAP) == 1 and (gaoxue_cishu == 2):
|
||||
now_NIC = 1
|
||||
now_EPH = 0
|
||||
gaoxue_count = 1
|
||||
NIC_count = NIC_count + 1
|
||||
EPH_count = 0
|
||||
gaoxue_cishu = 0
|
||||
elif BP_data(SBP,DBP,MAP) == 2 and (dixue_cishu == 2):
|
||||
now_NIC = 0
|
||||
now_EPH = 1
|
||||
NIC_count = 0
|
||||
EPH_count = EPH_count + 1
|
||||
dixue_cishu = 0
|
||||
|
||||
##########################有创血压########################################################
|
||||
elif BP_flag == 1:
|
||||
if xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 1: # 判断此时血压是否正常,正常则不进行调整,异常则给对应的异常标志
|
||||
xueya_flag = 1
|
||||
gaoxue_count = 0
|
||||
gaoxue_cishu = 1
|
||||
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 2:
|
||||
xueya_flag = 2
|
||||
dixue_count = 0
|
||||
dixue_cishu = 1
|
||||
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 0:
|
||||
gaoxue_count = 0
|
||||
dixue_count = 0
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
|
||||
if xueya_flag == 1:
|
||||
gaoxue_count = gaoxue_count + 1
|
||||
if gaoxue_count == 61 and BP_data(SBP,DBP,MAP) == 1:
|
||||
now_EPH = 0
|
||||
EPH_count = 0
|
||||
gaoxue_count = 1
|
||||
gaoxue_cishu = gaoxue_cishu + 1
|
||||
elif gaoxue_count == 61 and (BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 2):
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
xueya_flag = 0
|
||||
gaoxue_count = 0
|
||||
elif gaoxue_count == 61 and (SBP == 0 or DBP == 0):
|
||||
gaoxue_count = gaoxue_count - 1
|
||||
|
||||
elif xueya_flag == 2:
|
||||
dixue_count = dixue_count + 1
|
||||
if dixue_count == 61 and BP_data(SBP,DBP,MAP) == 2:
|
||||
now_NIC = 0
|
||||
NIC_count = 0
|
||||
dixue_count = 1
|
||||
dixue_cishu = dixue_cishu + 1
|
||||
elif dixue_count == 61 and (BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1):
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
NIC_count = 0
|
||||
EPH_count = 0
|
||||
xueya_flag = 0
|
||||
dixue_count = 0
|
||||
elif dixue_count == 61 and (SBP == 0 or DBP == 0):
|
||||
dixue_count = dixue_count - 1
|
||||
|
||||
if BP_data(SBP,DBP,MAP) == 1 and (gaoxue_cishu == 2):
|
||||
now_NIC = 1
|
||||
now_EPH = 0
|
||||
gaoxue_count = 1
|
||||
NIC_count = NIC_count + 1
|
||||
EPH_count = 0
|
||||
gaoxue_cishu = 1
|
||||
elif BP_data(SBP,DBP,MAP) == 2 and (dixue_cishu == 2):
|
||||
now_NIC = 0
|
||||
now_EPH = 1
|
||||
NIC_count = 0
|
||||
EPH_count = EPH_count + 1
|
||||
dixue_cishu = 1
|
||||
dixue_count = 0
|
||||
######################血压##################################
|
||||
if NIC_count > 2 or EPH_count > 2: # 如果两次给药后,还是异常则需要转的瑞芬模块
|
||||
flag1 = 1
|
||||
else:
|
||||
flag1 = 0
|
||||
##########################心率########################################################
|
||||
# 心率调节
|
||||
if HR > 89 and xinlv_flag == 0: # 检测心率,如果心率异常则进行给药,记录给药次数,将心率状态标志赋予对应异常状态
|
||||
HRD_count = HRD_count + 1
|
||||
if HRD_count == 61:
|
||||
xinlv_flag = 1
|
||||
now_ESM = 1
|
||||
now_ATR = 0
|
||||
ESM_count = ESM_count + 1
|
||||
ATR_count = 0
|
||||
HRD_count = 0
|
||||
HRS_count = 0
|
||||
elif (0 < HR < 46) and xinlv_flag == 0:
|
||||
HRS_count = HRS_count + 1
|
||||
if HRS_count == 61:
|
||||
xinlv_flag = 2
|
||||
now_ESM = 0
|
||||
now_ATR = 1
|
||||
ESM_count = 0
|
||||
ATR_count = ATR_count + 1
|
||||
HRD_count = 0
|
||||
HRS_count = 0
|
||||
elif (46 <= HR <= 89) and xinlv_flag == 0:
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
ESM_count = 0
|
||||
ATR_count = 0
|
||||
HRD_count = 0
|
||||
HRS_count = 0
|
||||
|
||||
if xinlv_flag == 1: # 检测异常状态,说明此时已经给药,需要间隔2min查看状态;如果状态异常则再给药一次,记录给药次数;如果异常状态消失则说明,此时正常,将相应标志置零
|
||||
HRD_count = HRD_count + 1
|
||||
if HRD_count == 121 and HR_data(1) == 1:
|
||||
now_ESM = 1
|
||||
now_ATR = 0
|
||||
ESM_count = ESM_count + 1
|
||||
ATR_count = 0
|
||||
HRD_count = 1
|
||||
elif HRD_count == 121 and HR_data(1) == 0:
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
ESM_count = 0
|
||||
ATR_count = 0
|
||||
HRD_count = 0
|
||||
xinlv_flag = 0
|
||||
elif HRD_count == 121 and HR_data(1) == 2:
|
||||
HRD_count = HRD_count - 1
|
||||
elif xinlv_flag == 2:
|
||||
HRS_count = HRS_count + 1
|
||||
if HRS_count == 121 and HR_data(2) == 1:
|
||||
now_ESM = 0
|
||||
now_ATR = 1
|
||||
ESM_count = 0
|
||||
ATR_count = ATR_count + 1
|
||||
HRS_count = 1
|
||||
elif HRS_count == 121 and HR_data(2) == 0:
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
ESM_count = 0
|
||||
ATR_count = 0
|
||||
HRS_count = 0
|
||||
xinlv_flag = 0
|
||||
elif HRS_count == 121 and HR_data(2) == 2:
|
||||
HRS_count = HRS_count - 1
|
||||
|
||||
if ESM_count > 2 or ATR_count > 2:
|
||||
flag2 = 1
|
||||
else:
|
||||
flag2 = 0
|
||||
##########################心率########################################################
|
||||
|
||||
##############################肌松_罗库溴铵##################################################
|
||||
if jisong == 1:
|
||||
if TOF >= 10 and TOF_flag == 0:
|
||||
now_RB = now_RB + 1
|
||||
TOF_flag = 1
|
||||
elif TOF < 10 and TOF_flag == 0:
|
||||
now_RB = re_RB
|
||||
TOF_count = 0
|
||||
flag4 = 0
|
||||
|
||||
if TOF_flag == 1:
|
||||
TOF_count = TOF_count + 1
|
||||
if TOF_count == 121 and TOF >= 10:
|
||||
now_RB = now_RB + 1
|
||||
TOF_count = 1
|
||||
elif TOF_count == 121 and 0 < TOF < 10 :
|
||||
now_RB = re_RB
|
||||
TOF_count = 0
|
||||
TOF_flag = 0
|
||||
flag4 = 0
|
||||
elif TOF_count == 121 and TOF == 0:
|
||||
TOF_count = TOF_count - 1
|
||||
|
||||
if now_RB > RB_max:
|
||||
now_RB = RB_max
|
||||
flag4 = 1
|
||||
TOF_flag = 0
|
||||
TOF_count = 0
|
||||
|
||||
##############################肌松_顺阿曲库铵##################################################
|
||||
elif jisong == 2:
|
||||
if TOF >= 10 and TOF_flag == 0:
|
||||
now_ROC = now_ROC + 0.25
|
||||
TOF_flag = 1
|
||||
elif TOF < 10 and TOF_flag == 0:
|
||||
now_ROC = re_ROC
|
||||
TOF_count = 0
|
||||
flag4 = 0
|
||||
|
||||
if TOF_flag == 1:
|
||||
TOF_count = TOF_count + 1
|
||||
if TOF_count == 121 and TOF >= 10:
|
||||
now_ROC = now_ROC + 0.25
|
||||
TOF_count = 1
|
||||
elif TOF_count == 121 and 0 < TOF < 10 :
|
||||
now_ROC = re_ROC
|
||||
TOF_count = 0
|
||||
TOF_flag = 0
|
||||
flag4 = 0
|
||||
elif TOF_count == 121 and TOF == 0:
|
||||
TOF_count = TOF_count - 1
|
||||
|
||||
if now_ROC > ROC_max:
|
||||
now_ROC = ROC_max
|
||||
flag4 = 1
|
||||
TOF_flag = 0
|
||||
TOF_count = 0
|
||||
##################################肌松########################################################
|
||||
##################################瑞芬太尼调控##################################################
|
||||
if REM_flag == 0 and (flag1 == 1 or flag2 == 1): # 启动瑞芬模块,REM_flag=0 第一次给药之后需要间隔2min 在重新判断
|
||||
if NIC_count > 2 or ESM_count > 2:
|
||||
now_REM = now_REM + 0.05
|
||||
REMS_count = REMS_count + 1
|
||||
rem_gaoxue_cishu = -1
|
||||
REMD_count = 0
|
||||
REM_flag = 1
|
||||
else:
|
||||
now_REM = now_REM - 0.05
|
||||
REMS_count = 0
|
||||
REMD_count = REMD_count + 1
|
||||
rem_dixue_cishu = -1
|
||||
REM_flag = 2
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
xueya_flag = 0
|
||||
xinlv_flag = 0
|
||||
|
||||
###########################################yo#######瑞芬太尼_无创血压############
|
||||
if REM_flag == 1 and (BP_flag == 2 or BP_flag == 0) :
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
if now_REM == 0:
|
||||
flag = 3
|
||||
if flag1 == 1 and now_REM != 0:
|
||||
if BP_data(SBP,DBP,MAP) == 1:
|
||||
rem_gaoxue_cishu = rem_gaoxue_cishu +1
|
||||
elif BP_data(SBP,DBP,MAP) == 0 and BP_data(SBP,DBP,MAP) == 2:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag1 = 0
|
||||
rem_gaoxue_cishu = 0
|
||||
if BP_data(SBP,DBP,MAP) == 1 and rem_gaoxue_cishu == 2:
|
||||
now_REM = now_REM + 0.05
|
||||
REMS_count = REMS_count + 1
|
||||
REMD_count = 0
|
||||
rem_gaoxue_cishu = 0
|
||||
REMSS_count = REMSS_count + 1
|
||||
if REMSS_count == 121:
|
||||
REMD_count = 0
|
||||
if flag2 == 1 and now_REM != 0:
|
||||
if HR_data(1) == 1:
|
||||
now_REM = now_REM + 0.05
|
||||
REMS_count = REMS_count + 1
|
||||
REMD_count = 0
|
||||
REMSS_count = 1
|
||||
elif HR_data(1) == 2:
|
||||
REMSS_count = REMSS_count - 1
|
||||
elif HR_data(1) == 0:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag2 = 0
|
||||
REMSS_count = 1
|
||||
elif REM_flag == 2 and (BP_flag == 2 or BP_flag == 0):
|
||||
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
if now_REM == 0:
|
||||
flag = 3
|
||||
if flag1 == 1 and now_REM != 0:
|
||||
if BP_data(SBP,DBP,MAP) == 2:
|
||||
rem_dixue_cishu = rem_dixue_cishu + 1
|
||||
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag1 = 0
|
||||
if BP_data(SBP,DBP,MAP) == 2 and rem_dixue_cishu == 2:
|
||||
now_REM = now_REM - 0.05
|
||||
REMS_count = 0
|
||||
REMD_count = REMD_count + 1
|
||||
rem_dixue_cishu = 0
|
||||
REMDD_count = REMDD_count + 1
|
||||
if REMDD_count == 121:
|
||||
REMS_count = 0
|
||||
if flag2 == 1 and now_REM != 0:
|
||||
if HR_data(2) == 1:
|
||||
now_REM = now_REM - 0.05
|
||||
REMS_count = 0
|
||||
REMD_count = REMD_count + 1
|
||||
REMDD_count = 1
|
||||
elif HR_data(2) == 2:
|
||||
REMDD_count = REMDD_count - 1
|
||||
elif HR_data(2) == 0:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag2 = 0
|
||||
REMDD_count = 1
|
||||
|
||||
##################################################瑞芬太尼_有创血压############
|
||||
if REM_flag == 1 and BP_flag == 1:
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
if now_REM == 0:
|
||||
flag = 3
|
||||
REMSS_count = REMSS_count + 1
|
||||
if REMSS_count == 121:
|
||||
REMD_count = 0
|
||||
if flag1 == 1 and now_REM != 0:
|
||||
if BP_data(SBP,DBP,MAP) == 1:
|
||||
now_REM = now_REM + 0.05
|
||||
REMS_count = REMS_count + 1
|
||||
REMD_count = 0
|
||||
REMSS_count = 1
|
||||
elif SBP == 0 or DBP == 0:
|
||||
REMSS_count = REMSS_count - 1
|
||||
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 2:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag1 = 0
|
||||
REMSS_count = 1
|
||||
if flag2 == 1 and now_REM != 0:
|
||||
if HR_data(1) == 1:
|
||||
now_REM = now_REM + 0.05
|
||||
REMS_count = REMS_count + 1
|
||||
REMD_count = 0
|
||||
REMSS_count = 1
|
||||
elif HR_data(1) == 2:
|
||||
REMSS_count = REMSS_count - 1
|
||||
elif HR_data(1) == 0:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag2 = 0
|
||||
REMSS_count = 1
|
||||
elif REM_flag == 2 and BP_flag == 1:
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
REMDD_count = REMDD_count + 1
|
||||
if REMDD_count == 121:
|
||||
REMS_count = 0
|
||||
if flag1 == 1 and now_REM != 0:
|
||||
if BP_data(SBP,DBP,MAP) == 2:
|
||||
now_REM = now_REM - 0.05
|
||||
REMS_count = 0
|
||||
REMD_count = REMD_count + 1
|
||||
REMDD_count = 1
|
||||
elif SBP == 0 or DBP == 0:
|
||||
REMDD_count = REMDD_count - 1
|
||||
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag1 = 0
|
||||
REMDD_count = 1
|
||||
elif flag2 == 1 and now_REM != 0:
|
||||
if HR_data(2) == 1:
|
||||
now_REM = now_REM - 0.05
|
||||
REMS_count = 0
|
||||
REMD_count = REMD_count + 1
|
||||
REMDD_count = 1
|
||||
elif HR_data(2) == 2:
|
||||
REMDD_count = REMDD_count - 1
|
||||
elif HR_data(2) == 0:
|
||||
now_REM = re_REM
|
||||
REMS_count = 0
|
||||
REMD_count = 0
|
||||
REM_flag = 0
|
||||
flag2 = 0
|
||||
REMDD_count = 1
|
||||
|
||||
###############是否转人工#################################
|
||||
|
||||
if REMS_count > 2 or REMD_count > 2 or flag4 == 1 or flag == 1 or flag == 3:
|
||||
print("ai_flag",ai_flag)
|
||||
while (ai_flag):
|
||||
try:
|
||||
conn8 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
|
||||
cur8 = conn8.cursor()
|
||||
sql = 'INSERT INTO aiflagtable (Flag,ConvertFlag) VALUES (%2f,%2f)' % (0,1)
|
||||
cur8.execute(sql)
|
||||
conn8.commit()
|
||||
cur8.close()
|
||||
conn8.close()
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
#########瑞芬太尼速率
|
||||
if now_REM > REM_max:
|
||||
now_REM = REM_max
|
||||
elif 0 < now_REM < REM_min:
|
||||
now_REM = REM_min
|
||||
|
||||
while (ai_flag):
|
||||
try:
|
||||
print('维持期给药数据:丙泊酚 %.2f,舒芬太尼 %.2f,瑞芬太尼 %.2f,顺阿曲库铵 %.2f,%2f,%2f,%2f,%2f' % (now_CHO, 0, now_REM, now_ROC, now_EPH, now_ESM, now_ATR, now_NIC))
|
||||
conn7 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
|
||||
cur7 = conn7.cursor()
|
||||
sql = 'INSERT INTO aimedicinetable (Phase,丙泊酚 ,舒芬太尼 ,瑞芬太尼 ,顺阿曲库铵 ,麻黄碱 ,艾司洛尔 ,阿托品 ,尼卡地平 )VALUES (2,%2f,%2f,%2f,%2f,%2f,%2f,%2f,%2f)' % (
|
||||
(now_CHO * weight2 * 60) / (1000 * CHO_con), 0, (now_REM * weight2 * 60) / (1000 * REM_con),
|
||||
(now_ROC * weight2 * 60) / (1000 * ROC_con), now_EPH, now_ESM,now_ATR, now_NIC)
|
||||
cur7.execute(sql)
|
||||
conn7.commit()
|
||||
now_NIC = 0
|
||||
now_EPH = 0
|
||||
now_ESM = 0
|
||||
now_ATR = 0
|
||||
cur7.close()
|
||||
conn7.close()
|
||||
break
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
|
||||
except Exception as e:
|
||||
current_time = datetime.datetime.now()
|
||||
current_time = current_time.strftime("%Y%m%d%H%M%S")
|
||||
with open("geiyao_error_log.txt", "a") as file:
|
||||
file.write(f"{current_time} - 错误信息: {str(e)}\n")
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user