MOPH_DVI / app.py
trapezius60's picture
Update app.py
a6128b9 verified
import gradio as gr
# ============================================================
# 1. Mapping for Assessment Criteria
# ============================================================
CRITERIA_MAP = {
"num_bodies": {
"5–10 ศพ (2 คะแนน)": 2,
"11–20 ศพ (4 คะแนน)": 4,
">20 ศพขึ้นไป (6 คะแนน)": 6
},
"forensic_available": {
"มีแพทย์นิติเวชในจังหวัด (2 คะแนน)": 2,
"ไม่มีในจังหวัด แต่มีในระดับเขต (4 คะแนน)": 4,
"ไม่มีในจังหวัด/มีในเขต แต่สัดส่วนแพทย์นิติเวช:ศพ น้อยกว่า 1:5 (6 คะแนน)": 6
},
"morgue_capacity": {
"มีเพียงพอในจังหวัด (1 คะแนน)": 1,
"มีน้อยกว่าจำนวนศพ (2 คะแนน)": 2,
"ไม่เพียงพอแม้รวมในระดับเขต (3 คะแนน)": 3
},
"body_condition": {
"สภาพศพเปลี่ยนแปลง <25% (1 คะแนน)": 1,
"สภาพศพเปลี่ยนแปลง 25–50% (2 คะแนน)": 2,
"สภาพศพเปลี่ยนแปลง >50% (3 คะแนน)": 3
}
}
# ============================================================
# 2. Image Mapping by Severity Level
# ============================================================
SEVERITY_IMAGES = {
"ระดับรุนแรงน้อย (Minor Severity)": "assets/minor.png",
"ระดับรุนแรงปานกลาง (Moderate Severity)": "assets/moderate.png",
"ระดับรุนแรงมาก (Major Severity)": "assets/severe.png"
}
# ============================================================
# 3. Assessment Function + Safety Check
# ============================================================
def assess_mass_fatality(num_bodies_input, forensic_path_input, morgue_capacity_input, body_change_input):
# --------- Check required inputs (no crash) ---------
if not num_bodies_input or not forensic_path_input or not morgue_capacity_input or not body_change_input:
warning = """
⚠️ **กรุณาเลือกข้อมูลให้ครบทั้ง 4 ข้อก่อนประเมินผล**
"""
return warning, None, None
# -----------------------------------------------------
# Normal calculation
score_bodies = CRITERIA_MAP['num_bodies'][num_bodies_input]
score_available = CRITERIA_MAP['forensic_available'][forensic_path_input]
score_morgue = CRITERIA_MAP['morgue_capacity'][morgue_capacity_input]
score_condition = CRITERIA_MAP['body_condition'][body_change_input]
total_score = score_bodies + score_available + score_morgue + score_condition
if total_score == 6:
severity = "ระดับรุนแรงน้อย (Minor Severity)"
recommendation = "สามารถบริหารจัดการในระดับอำเภอหรือจังหวัดได้"
elif 7 <= total_score <= 12:
severity = "ระดับรุนแรงปานกลาง (Moderate Severity)"
recommendation = "ใช้ทรัพยากรจากระดับเขตบริการสุขภาพ"
else:
severity = "ระดับรุนแรงมาก (Major Severity)"
recommendation = "ต้องใช้ทรัพยากรจากเขตอื่นหรือระดับประเทศ"
image_path = SEVERITY_IMAGES.get(severity, None)
markdown_text = (
f"**คะแนนรวม:** {total_score}/18\n\n"
f"**ระดับความรุนแรง:** {severity}\n\n"
f"**คำแนะนำ:** {recommendation}"
)
return markdown_text, None, image_path
# ============================================================
# 4. Prepare UI Options
# ============================================================
bodies_options = list(CRITERIA_MAP['num_bodies'].keys())
path_options = list(CRITERIA_MAP['forensic_available'].keys())
morgue_options = list(CRITERIA_MAP['morgue_capacity'].keys())
change_options = list(CRITERIA_MAP['body_condition'].keys())
# ============================================================
# 5. Footer
# ============================================================
APP_FOOTER = """
<div style='text-align:center; margin-top:25px; font-size:14px; color:#777;'>
<hr>
<p>
📘 <a href="https://drive.google.com/file/d/1D_AzqPkTaRKaw14y6lsCU4OkKJ524c03/view" target="_blank">
คู่มือการใช้งาน (Manual)</a>
</p>
<p>🔖 Version & License: v1.0.0 | © BH 2025 | CC BY-NC-SA 4.0</p>
</div>
"""
# ============================================================
# 6. Build UI
# ============================================================
with gr.Blocks() as demo:
# Custom CSS
gr.HTML("""
<style>
.title-box {
text-align:center;
font-size:27px;
font-weight:700;
padding:12px;
}
.card {
background:#f9f9f9;
padding:20px;
border-radius:12px;
border:1px solid #ddd;
margin-bottom:18px;
}
</style>
""")
gr.HTML("<div class='title-box'>🕊️ Mass Fatality Severity Assessment Tool</div>")
# ---------------- Inputs ----------------
with gr.Column(elem_classes="card"):
gr.Markdown("### 🔍 โปรดกรอกข้อมูล")
inp_bodies = gr.Radio(bodies_options, label="1. จำนวนศพที่คาดการณ์")
inp_path = gr.Radio(path_options, label="2. จำนวนแพทย์นิติเวช")
inp_morgue = gr.Radio(morgue_options, label="3. จำนวนตู้เก็บศพ")
inp_change = gr.Radio(change_options, label="4. การเปลี่ยนแปลงของสภาพศพ")
# ---------------- Outputs ----------------
with gr.Column(elem_classes="card"):
gr.Markdown("### 📊 ผลการประเมิน")
out_md = gr.Markdown()
out_img = gr.Image(label="ผลลัพธ์ระดับความรุนแรง", height=250)
run_btn = gr.Button("ประเมินผล", variant="primary")
run_btn.click(
fn=assess_mass_fatality,
inputs=[inp_bodies, inp_path, inp_morgue, inp_change],
outputs=[out_md, out_img, out_img] # Markdown, NULL, Image
)
gr.HTML(APP_FOOTER)
demo.launch()