File size: 6,873 Bytes
bf07f10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import json
from typing import Dict, Any

class EducationalAgent:
    """
    Translates technical diagnosis and explanation into simple, patient-friendly terms.
    """
    def __init__(self, doctor_name: str = "your treating doctor"):
        self.doctor_name = doctor_name
        
    def translate_to_layman_terms(self, diagnosis_result: Dict[str, Any], explanation_text: str) -> Dict[str, str]:
        """
        Generates simple summaries and next steps for the patient.

        Args:
            diagnosis_result: The dictionary output from DiagnosticAgent.
            explanation_text: The string output from ExplainabilityAgent.

        Returns:
            A dictionary containing patient-friendly summary, severity, and next steps.
        """
        
        # 1. Extract Key Findings
        fracture_detected = diagnosis_result.get("fracture_detected", False)
        predicted_class = diagnosis_result.get("predicted_class", "a specific type of injury")
        confidence = diagnosis_result.get("confidence_score", 0.0)
        
        # 2. Determine Severity in Layman Terms
        severity_map = {
            "Healthy": "None",
            "Greenstick": "Mild (The bone is cracked but not completely broken through.)",
            "Transverse": "Moderate (A clean break straight across the bone.)",
            "Oblique": "Moderate (A clean break at an angle.)",
            "Spiral": "Serious (A twisting break that spirals around the bone.)",
            "Comminuted": "Severe (The bone has broken into three or more pieces.)",
            "Oblique Displaced": "Serious (The bone is broken at an angle, and the pieces are shifted out of place.)",
            "Transverse Displaced": "Serious (The bone is broken straight across, and the pieces are shifted out of place.)",
        }
        
        layman_severity = severity_map.get(predicted_class, "We need more information on this type of break.")
        
        # 3. Simplify the Explanation
        
        # Clean up the technical explanation to remove technical jargon like 'centroid' or 'activation'
        simple_explanation = explanation_text.replace("consistent with a", "which looks like a")
        simple_explanation = simple_explanation.replace("Confidence:", "Our computer model is highly sure (")
        simple_explanation = simple_explanation.replace("The model's focus is", "The computer saw a clear sign of this")
        simple_explanation = simple_explanation.replace("distal end", "end of the bone near the hand/foot")
        simple_explanation = simple_explanation.replace("proximal end", "end of the bone near the shoulder/hip")
        simple_explanation = simple_explanation.replace("humerus", "upper arm bone")
        simple_explanation = simple_explanation.replace("radius", "lower arm bone")
        simple_explanation = simple_explanation.replace("tibia", "shin bone")
        simple_explanation = simple_explanation.replace("mild", "small")
        simple_explanation = simple_explanation.replace("strong", "very clear")
        
        
        # 4. Generate Final Summary and Next Steps
        
        if not fracture_detected or predicted_class == "Healthy":
            patient_summary = (
                f"**Great news!** Our analysis suggests your bone is **healthy** "
                f"with high confidence ({confidence:.2f}). There are no signs of a fracture."
            )
            next_steps = (
                "You can discuss your pain symptoms with your doctor, but based on this image, "
                "a fracture is highly unlikely. No immediate orthopedic action is needed."
            )
        else:
            patient_summary = (
                f"Our computer analysis strongly indicates a **break in the bone** (a fracture). "
                f"The specific type appears to be a **{predicted_class}** fracture."
            )
            
            # Combine simple explanation and confidence
            patient_summary += f"\n\n**What the computer saw:** {simple_explanation}"
            patient_summary += f".\n\n**Severity Level:** {layman_severity}"
            
            next_steps = (
                "This finding requires immediate medical follow-up. Please do the following:\n"
                f"* **Do not move** the affected area.\n"
                f"* **Immediately share these findings** with {self.doctor_name}.\n"
                f"* Your doctor will confirm the diagnosis and determine the best treatment, "
                "which may involve a cast, splint, or surgery."
            )
            
        return {
            "patient_summary": patient_summary,
            "patient_severity_assessment": layman_severity,
            "next_steps_action_plan": next_steps,
        }

# --- EXAMPLE USAGE ---

if __name__ == '__main__':
    # --- SIMULATED INPUT from Diagnostic & Explainability Agents ---
    
    # Example 1: Serious Fracture
    SIMULATED_DIAGNOSIS_1 = {
        "image_path": "fracture_image.jpg",
        "fracture_detected": True,
        "predicted_class": "Spiral",
        "severity_type": "Spiral",
        "confidence_score": 0.96,
        "uncertainty_score": 0.04,
        "all_probabilities": [0.01, 0.01, 0.01, 0.01, 0.01, 0.96, 0.01, 0.01]
    }
    SIMULATED_EXPLANATION_1 = (
        "A fracture pattern consistent with a **Spiral** type is detected (Confidence: 0.96). "
        "The model's focus is clear near the **middle region** of the humerus in the center. "
        "This is based on a distinct linear focus."
    )

    # Example 2: Healthy Bone
    SIMULATED_DIAGNOSIS_2 = {
        "image_path": "healthy_image.jpg",
        "fracture_detected": False,
        "predicted_class": "Healthy",
        "severity_type": "Healthy",
        "confidence_score": 0.99,
        "uncertainty_score": 0.01,
        "all_probabilities": [0.00, 0.00, 0.99, 0.00, 0.00, 0.00, 0.00, 0.01]
    }
    SIMULATED_EXPLANATION_2 = (
        "The bone appears **healthy** with high confidence (0.99). No fracture pattern was detected."
    )


    # --- Run Agent ---
    
    agent = EducationalAgent(doctor_name="Dr. Smith")

    # Run Example 1
    results_1 = agent.translate_to_layman_terms(SIMULATED_DIAGNOSIS_1, SIMULATED_EXPLANATION_1)
    
    print("\n--- PATIENT REPORT (FRACTURE DETECTED) ---")
    print(f"**SUMMARY:** {results_1['patient_summary']}")
    print("\n**ACTION PLAN:**")
    print(results_1['next_steps_action_plan'])
    print("-------------------------------------------\n")
    
    # Run Example 2
    results_2 = agent.translate_to_layman_terms(SIMULATED_DIAGNOSIS_2, SIMULATED_EXPLANATION_2)

    print("\n--- PATIENT REPORT (HEALTHY BONE) ---")
    print(f"**SUMMARY:** {results_2['patient_summary']}")
    print("\n**ACTION PLAN:**")
    print(results_2['next_steps_action_plan'])
    print("-------------------------------------\n")