Approach to failed thr long answer for post graduate
approach to failed total hip replacement revision arthroplasty postgraduate orthopedics
failed total hip replacement revision arthroplasty radiograph loosening

Anteroposterior (AP) pelvis radiograph showing a failed total hip arthroplasty (THA) in the left hip. The image highlights significant periprosthetic pathology, specifically massive acetabular bone loss consistent with a high-grade Paprosky classification. There is evidence of aseptic loosening of the acetabular cup, characterized by prominent radiolucent lines at the bone-implant interface and superior migration of the component. The native acetabular contour is irregular and indistinct, indicating extensive bone resorption and rarefaction, particularly at the superior and medial walls. The femoral component consists of a cemented self-locking femoral stem and a femoral head; the stem appears relatively stable, though the proximal femoral bone stock shows mild signs of remodeling. This diagnostic image illustrates the clinical challenge of revision hip arthroplasty in the setting of severe osteolysis and implant failure, serving as an educational example of mechanical instability and compromised bone quality in orthopedic surgery.

Anteroposterior (AP) radiograph of the hip demonstrating a failed total hip arthroplasty (THA). The primary finding is a completely loosened and displaced acetabular cup. The metallic hemispheric shell shows a significant loss of fixation, characterized by its inferior and lateral migration from the anatomical acetabular roof. A wide, continuous radiolucent zone is visible at the bone-implant interface, indicating a complete lack of osseointegration and separation from the surrounding pelvic bone. The cup also exhibits a significant change in inclination (tilting) compared to standard physiological alignment. The femoral component, including the prosthetic head and neck, remains articulated within the cup, but the entire assembly is malaligned. This image serves as a clinical example of aseptic loosening and prosthetic migration, highlighting key diagnostic signs for orthopedic evaluation of implant failure and the need for revision surgery.

This composite figure illustrates a complex case of failed total hip arthroplasty (THA) and its subsequent revision. Image A is an anteroposterior (AP) pelvic radiograph of a 54-year-old male demonstrating bilateral hip prostheses. The right hip shows clear signs of prosthetic aseptic loosening 24 years post-operation, characterized by significant radiolucency around the acetabular cup and proximal femoral stem. Image B displays a 3D-printed additive manufacturing (AM) model of the patient’s right pelvis. This anatomical diagram highlights severe Type IV pelvic osteolysis with massive bone defects in the superior and inferior acetabulum, ischial ramus, and pubic ramus, rendering the acetabular ring non-functional. Image C is a post-operative AP radiograph showing the reconstruction of the right hip using a customized cage fixed with multiple screws and cerclage wires. The educational focus is on identifying extensive periprosthetic bone loss and the challenges of achieving mechanical stability in revision arthroplasty when native bone stock is insufficient for standard commercial implants.

This comparison chart features two anteroposterior (AP) radiographs of the hip demonstrating a revision arthroplasty due to aseptic loosening. Image (a) depicts the preoperative state of a total hip arthroplasty. The visual findings show a modular acetabular cup and a long, smooth femoral stem. Key indicators of instability or aseptic loosening are present, including radiolucent zones at the bone-implant interface, suggesting a failure of biological or cement fixation. Image (b) shows the postoperative result following a revision surgery. This image illustrates the replacement of both components: a new, larger acetabular cup has been implanted, and the femoral stem has been exchanged for a modular revision system with a distinct geometry designed for enhanced stability in the femoral canal. The radiograph confirms improved alignment and mechanical fixation. This visual is used for medical education to teach orthopaedic residents about radiographic signs of implant failure and the surgical management of complex hip revision using modular arthroplasty systems.
| Cause | Frequency (approx.) |
|---|---|
| Aseptic loosening / osteolysis | ~23-45% |
| Instability / dislocation | ~22% |
| Periprosthetic joint infection (PJI) | ~22% |
| Periprosthetic fracture | ~10-15% |
| Implant fracture / mechanical failure | ~5% |
| Bearing surface failure (wear, corrosion, trunnionosis) | ~5% |
| Soft tissue impingement, nerve injury, LLD | Rare |

| Test | Significance |
|---|---|
| ESR, CRP | Screening for infection; CRP > 10 mg/L and ESR > 30 mm/hr are thresholds (MSIS/ICM criteria) |
| Serum WBC | Usually normal in PJI (low sensitivity) |
| Serum Co and Cr levels | If MoM bearing or trunnionosis suspected |
| IL-6 | High sensitivity for PJI (>12 pg/mL) |
| D-dimer | Emerging marker; non-inferior to CRP for PJI diagnosis |
| Synovial fluid analysis | Key investigation - see below |
| Type | Description | Management |
|---|---|---|
| I | No bone loss, supportive rim intact | Hemispherical cup |
| IIA | Superior medial defect, <2 cm superior migration | Hemispherical cup ± screws |
| IIB | >50% of cup uncovered, ≤2 cm migration | Hemispherical cup + screws |
| IIC | Medial wall defect | Hemispherical cup |
| IIIA | Severe superior migration 2-3 cm, 40-60% host bone | Cup + augments, tantalum |
| IIIB | >3 cm migration, severe destruction (<40% bone) | Cup-cage, triflange, custom |
| Type | Proximal Bone Stock | Diaphyseal Integrity | Stem Choice |
|---|---|---|---|
| I | Minimal loss | Intact | Any primary or revision stem |
| II | Extensive proximal loss | Intact | Modular revision stem |
| IIIA | Severe proximal; ≥4 cm diaphyseal bone | Intact | Extensively coated/tapered fluted |
| IIIB | Severe proximal; <4 cm diaphyseal | Compromised | Tapered fluted modular titanium |
| IV | Minimal diaphyseal bone | Compromised | Proximal femoral replacement (tumor prosthesis) |
| Type | Location | Stem Stability | Management |
|---|---|---|---|
| AG | Greater trochanter | Stable stem | ORIF vs. conservative |
| AL | Lesser trochanter | Stable stem | Conservative |
| B1 | Around stem | Well-fixed stem | ORIF with plates + cables |
| B2 | Around stem | Loose stem | Revision stem (long bypass) |
| B3 | Around stem | Loose stem + bone loss | Revision ± allograft/prosthesis |
| C | Below stem tip | Stable stem | ORIF |
| Complication | Rate |
|---|---|
| Dislocation (most common post-revision) | 5-15% |
| Periprosthetic fracture | 3-10% |
| Nerve injury (sciatic most common) | 1-3% |
| Wound complications / infection | 3-5% |
| DVT/PE | 1-3% |
| Aseptic re-loosening | 5-15% at 10 years |
| Leg length discrepancy | 10-20% |
| Rerevision | Higher in obese (BMI >30) and age <55 years |
FAILED THR
|
├── EXCLUDE INFECTION FIRST
│ ESR, CRP, aspiration (WBC, alpha-defensin, culture)
│ |
│ ├── PJI confirmed → DAIR (early acute) / Two-stage revision (chronic)
│ └── Not infected → proceed below
|
├── RADIOLOGICAL ASSESSMENT
│ X-ray → Loosening? Migration? Osteolysis? Fracture? Malposition?
│ CT → Bone loss (Paprosky), Component version
│ MARS MRI → MoM failure, pseudotumor
|
├── IDENTIFY CAUSE
│ ├── Aseptic loosening → Revision with cementless implants, bone grafting
│ ├── Instability → Dual mobility, component revision
│ ├── Periprosthetic fracture → Vancouver classification → ORIF or revision stem
│ ├── Bearing failure → Head/liner exchange, trunnion revision
│ └── Impingement / LLD → Component repositioning
|
└── PLAN REVISION SURGERY
Templating, bone graft, ETO if needed, implant inventory
Make it in to pdf format
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"
mkdir -p /tmp/workspace/failed-thr && cat > /tmp/workspace/failed-thr/generate_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm, mm from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, PageBreak, KeepTogether ) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.platypus import Flowable from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont import datetime OUTPUT = "/tmp/workspace/failed-thr/Approach_to_Failed_THR.pdf" # ── Page setup ────────────────────────────────────────────────────────────── doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=2*cm, rightMargin=2*cm, topMargin=2.5*cm, bottomMargin=2.5*cm, title="Approach to Failed Total Hip Replacement", author="Orris Medical Education" ) W, H = A4 PW = W - 4*cm # usable page width # ── Colour palette ─────────────────────────────────────────────────────────── DARK_BLUE = colors.HexColor("#1A3A5C") MID_BLUE = colors.HexColor("#2E6DA4") LIGHT_BLUE = colors.HexColor("#D6E8F7") ACCENT = colors.HexColor("#E8522A") # orange-red for key points TABLE_HEADER= colors.HexColor("#2E6DA4") TABLE_ODD = colors.HexColor("#EBF3FA") TABLE_EVEN = colors.white RULE_COLOR = colors.HexColor("#2E6DA4") # ── Styles ─────────────────────────────────────────────────────────────────── styles = getSampleStyleSheet() Title = ParagraphStyle( "Title", parent=styles["Normal"], fontSize=22, textColor=colors.white, leading=28, spaceAfter=4, alignment=TA_CENTER, fontName="Helvetica-Bold" ) Subtitle = ParagraphStyle( "Subtitle", parent=styles["Normal"], fontSize=11, textColor=colors.HexColor("#B0CDE8"), leading=16, spaceAfter=0, alignment=TA_CENTER, fontName="Helvetica-Oblique" ) H1 = ParagraphStyle( "H1", parent=styles["Normal"], fontSize=14, textColor=colors.white, leading=18, spaceBefore=14, spaceAfter=4, fontName="Helvetica-Bold", leftIndent=0 ) H2 = ParagraphStyle( "H2", parent=styles["Normal"], fontSize=11.5, textColor=DARK_BLUE, leading=16, spaceBefore=10, spaceAfter=3, fontName="Helvetica-Bold" ) H3 = ParagraphStyle( "H3", parent=styles["Normal"], fontSize=10.5, textColor=MID_BLUE, leading=15, spaceBefore=7, spaceAfter=2, fontName="Helvetica-Bold" ) Body = ParagraphStyle( "Body", parent=styles["Normal"], fontSize=9.5, textColor=colors.HexColor("#222222"), leading=14, spaceAfter=4, alignment=TA_JUSTIFY, fontName="Helvetica" ) Bullet = ParagraphStyle( "Bullet", parent=Body, leftIndent=14, bulletIndent=4, spaceAfter=2.5 ) SubBullet = ParagraphStyle( "SubBullet", parent=Body, leftIndent=28, bulletIndent=18, spaceAfter=2 ) KeyPoint = ParagraphStyle( "KeyPoint", parent=Body, fontSize=9.5, textColor=DARK_BLUE, leading=14, leftIndent=10, rightIndent=10, spaceAfter=4, backColor=LIGHT_BLUE, borderPad=5, borderColor=MID_BLUE, borderWidth=0 ) CodeStyle = ParagraphStyle( "Code", parent=styles["Normal"], fontSize=8.5, textColor=colors.HexColor("#333333"), leading=13, fontName="Courier", leftIndent=10, spaceAfter=3 ) RefStyle = ParagraphStyle( "Ref", parent=Body, fontSize=8.5, textColor=colors.HexColor("#555555"), leading=13, leftIndent=10 ) # ── Helper: coloured section-header banner ──────────────────────────────────── def section_banner(text, color=DARK_BLUE): data = [[Paragraph(text, H1)]] t = Table(data, colWidths=[PW]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), color), ("LEFTPADDING", (0,0), (-1,-1), 8), ("RIGHTPADDING", (0,0), (-1,-1), 8), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0), (-1,-1), 5), ("ROUNDEDCORNERS", [4]), ])) return t def sub_banner(text): return section_banner(text, color=MID_BLUE) def kp(text): """Key point box.""" return Table( [[Paragraph(f"<b>Key Point:</b> {text}", Body)]], colWidths=[PW], style=TableStyle([ ("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0), (-1,-1), 5), ("LINEAFTER", (0,0), (0,-1), 3, MID_BLUE), ]) ) def hr(): return HRFlowable(width="100%", thickness=0.5, color=RULE_COLOR, spaceAfter=4, spaceBefore=4) def sp(h=4): return Spacer(1, h) # ── Standard table builder ──────────────────────────────────────────────────── def make_table(headers, rows, col_widths=None): if col_widths is None: n = len(headers) col_widths = [PW / n] * n data = [[Paragraph(f"<b>{h}</b>", ParagraphStyle( "TH", parent=Body, textColor=colors.white, fontSize=9, fontName="Helvetica-Bold" )) for h in headers]] for i, row in enumerate(rows): data.append([Paragraph(str(c), ParagraphStyle( "TD", parent=Body, fontSize=9, backColor=TABLE_ODD if i % 2 == 0 else TABLE_EVEN )) for c in row]) style = TableStyle([ ("BACKGROUND", (0,0), (-1,0), TABLE_HEADER), ("ROWBACKGROUNDS", (0,1), (-1,-1), [TABLE_ODD, TABLE_EVEN]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING",(0,0),(-1,-1), 4), ("LEFTPADDING",(0,0),(-1,-1), 5), ("RIGHTPADDING",(0,0),(-1,-1), 5), ("VALIGN", (0,0), (-1,-1), "TOP"), ]) t = Table(data, colWidths=col_widths, repeatRows=1) t.setStyle(style) return t # ── Cover-page builder ──────────────────────────────────────────────────────── def cover_page(): elems = [] # Full-width dark blue header bar cover_data = [[ Paragraph("APPROACH TO FAILED<br/>TOTAL HIP REPLACEMENT", Title), Paragraph("Postgraduate Orthopaedics Long Answer", Subtitle), ]] cover = Table( [[Paragraph("APPROACH TO FAILED TOTAL HIP REPLACEMENT (THR)", Title)], [Paragraph("Postgraduate Orthopaedics · Long Answer", Subtitle)], [Paragraph(f"Prepared by Orris Medical Education · {datetime.date.today().strftime('%B %Y')}", Subtitle)]], colWidths=[PW], style=TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE), ("LEFTPADDING", (0,0),(-1,-1), 20), ("RIGHTPADDING",(0,0),(-1,-1), 20), ("TOPPADDING", (0,0),(-1,-1), 30), ("BOTTOMPADDING",(0,0),(-1,-1), 30), ]) ) elems.append(cover) elems.append(sp(16)) # Intro paragraph elems.append(Paragraph( "Failed total hip replacement (THR) - also called failed total hip arthroplasty (THA) - refers to a " "prosthetic hip joint that no longer achieves its intended goals of pain relief, function, and stability. " "It is a growing clinical problem given the rising number of primary THRs performed globally and the " "longer survival of younger, more active patients. A systematic approach is essential because the <b>cause " "of failure determines the management</b>.", Body )) elems.append(sp(8)) elems.append(PageBreak()) return elems # ══════════════════════════════════════════════════════════════════════════════ # BUILD DOCUMENT # ══════════════════════════════════════════════════════════════════════════════ story = [] story += cover_page() # ─── 1. CAUSES ─────────────────────────────────────────────────────────────── story.append(section_banner("1. CAUSES OF FAILURE (AETIOLOGY)")) story.append(sp(6)) story.append(make_table( ["Cause of Failure", "Approximate Frequency"], [ ["Aseptic loosening / osteolysis", "23–45%"], ["Instability / dislocation", "~22%"], ["Periprosthetic joint infection (PJI)", "~22%"], ["Periprosthetic fracture", "10–15%"], ["Implant fracture / mechanical failure", "~5%"], ["Bearing surface failure (wear, corrosion, trunnionosis)", "~5%"], ["Soft tissue impingement, nerve injury, LLD", "Rare"], ], col_widths=[PW*0.70, PW*0.30] )) story.append(sp(8)) # ─── 2. HISTORY ────────────────────────────────────────────────────────────── story.append(section_banner("2. HISTORY AND CLINICAL EVALUATION")) story.append(sp(6)) story.append(Paragraph("A. Symptom Analysis", H2)) story.append(Paragraph("The character of pain is the most important diagnostic clue:", Body)) story.append(make_table( ["Pain Character", "Most Likely Diagnosis"], [ ["Start-up pain (improves after first few steps)", "Aseptic loosening (most characteristic)"], ["Constant rest pain / night pain", "Periprosthetic joint infection"], ["Pain on weight-bearing that never settles", "Loosening or periprosthetic fracture"], ["Sudden giving way / frank dislocation", "Instability"], ["Groin pain", "Acetabular loosening, iliopsoas impingement, anterior impingement"], ["Thigh pain", "Femoral stem loosening (especially cemented)"], ], col_widths=[PW*0.50, PW*0.50] )) story.append(sp(6)) story.append(Paragraph("B. Timing of Onset", H2)) story.append(make_table( ["Time from Surgery", "Likely Cause"], [ ["< 3 months (early)", "Acute PJI, wound complication, dislocation, periprosthetic fracture"], ["3–24 months (intermediate)", "Haematogenous PJI, early loosening, instability"], ["> 2 years (late)", "Aseptic loosening, wear/osteolysis, late PJI, periprosthetic fracture"], ], col_widths=[PW*0.30, PW*0.70] )) story.append(sp(6)) story.append(Paragraph("C. Relevant History to Document", H2)) bullets_hist = [ "Original indication for THR (OA, AVN, fracture, dysplasia)", "Type of implant, surgical approach, fixation method used", "Previous complications (dislocation, wound infection, re-operations)", "Comorbidities: diabetes, immunosuppression, obesity, rheumatoid arthritis", "Medications: steroids, anticoagulants, bisphosphonates", "Social history: activity level, smoking, BMI", ] for b in bullets_hist: story.append(Paragraph(f"\u2022 {b}", Bullet)) story.append(sp(8)) # ─── 3. EXAMINATION ────────────────────────────────────────────────────────── story.append(section_banner("3. PHYSICAL EXAMINATION")) story.append(sp(6)) exam_items = [ ("<b>Gait:</b>", "Trendelenburg gait (abductor weakness), antalgic gait"), ("<b>Leg length discrepancy:</b>", "Clinical (apparent vs. true) and radiological measurement"), ("<b>Range of motion:</b>", "Restricted or painful ROM; note direction of pain provocation"), ("<b>Trendelenburg sign:</b>", "Indicates abductor insufficiency"), ("<b>FADIR test:</b>", "Flexion-adduction-internal rotation – anterior impingement"), ("<b>Neurovascular exam:</b>", "Sciatic (dorsiflexion, sensation) and femoral nerve function"), ("<b>Wound:</b>", "Sinuses, erythema, warmth, discharge – strongly suggestive of PJI"), ("<b>Limb alignment:</b>", "Offset restoration, mechanical axis"), ] for label, val in exam_items: story.append(Paragraph(f"\u2022 {label} {val}", Bullet)) story.append(sp(8)) # ─── 4. INVESTIGATIONS ─────────────────────────────────────────────────────── story.append(section_banner("4. INVESTIGATIONS")) story.append(sp(6)) story.append(Paragraph("A. Radiological Investigations", H2)) story.append(Paragraph("Plain X-rays (AP Pelvis + Lateral Hip + Full-length Femur)", H3)) xray_bullets = [ "<b>Component migration</b> – compare with immediate post-op films", "<b>Radiolucent lines</b> at cement-bone / implant-bone interface (Gruen zones for femur, DeLee & Charnley zones for acetabulum)", "<b>Continuous radiolucent line ≥ 2 mm</b> in all zones = definite loosening", "<b>Osteolysis</b> – expansile radiolucent lesions around implant", "<b>Subsidence</b> – vertical migration of femoral stem", "<b>Polyethylene wear</b> – eccentric position of femoral head within cup", "<b>Periprosthetic fracture</b>", "<b>Component orientation</b> – cup inclination (ideal 40–45°) and anteversion (15–20°)", ] for b in xray_bullets: story.append(Paragraph(f"\u2022 {b}", Bullet)) story.append(sp(4)) story.append(Paragraph("Advanced Imaging", H3)) story.append(make_table( ["Modality", "Indication", "Key Finding"], [ ["CT scan", "Bone loss assessment, component version", "Paprosky classification, pelvic discontinuity"], ["MARS MRI", "MoM bearing failure; suspected pseudotumor", "ALTR, pseudotumor, soft tissue planes"], ["Bone scan (Tc-99m)", "Loosening vs. infection screening", "Increased uptake; low specificity after 2 yrs"], ["Labelled leucocyte + bone-marrow scan", "Suspected PJI (higher specificity)", "Mismatch = infection"], ], col_widths=[PW*0.18, PW*0.42, PW*0.40] )) story.append(sp(8)) story.append(Paragraph("B. Laboratory Investigations", H2)) story.append(make_table( ["Test", "Significance / Threshold"], [ ["ESR", "Screening for PJI; threshold > 30 mm/hr (MSIS criteria)"], ["CRP", "Most sensitive routine marker; > 10 mg/L threshold for PJI"], ["IL-6", "High sensitivity; > 12 pg/mL suggestive of PJI"], ["D-dimer", "Emerging marker; non-inferior to CRP for PJI diagnosis"], ["Serum Co & Cr", "If metal-on-metal bearing or trunnionosis suspected"], ["Serum WBC", "Usually normal in PJI – low sensitivity"], ], col_widths=[PW*0.30, PW*0.70] )) story.append(sp(6)) story.append(Paragraph("C. Joint Aspiration (KEY Investigation)", H2)) story.append(kp("Indicated whenever PJI is suspected. Must be done before antibiotics. Stop antibiotics ≥ 2 weeks before aspiration if possible.")) story.append(sp(4)) story.append(make_table( ["Aspirate Parameter", "Chronic PJI Threshold", "Acute PJI Threshold"], [ ["Synovial WBC count", "≥ 3,000 cells/mm³", "≥ 10,000 cells/mm³"], ["Neutrophil % (PMN)", "≥ 80%", "≥ 90%"], ["Alpha-defensin", "Positive (>1 signal-to-noise)", "Positive"], ["Leukocyte esterase (strip)", "++ (colorimetric)", "++"], ["Culture & sensitivity", "3+ samples; hold 14 days", "Same"], ], col_widths=[PW*0.38, PW*0.31, PW*0.31] )) story.append(sp(4)) story.append(Paragraph( "<b>2018 ICM / MSIS Criteria for PJI:</b> Score-based system. " "<b>Major criteria (either alone = PJI):</b> (1) Sinus tract communicating with implant; " "(2) Two positive cultures of same organism. " "<b>Minor criteria (scored):</b> Elevated ESR/CRP, elevated synovial WBC, positive alpha-defensin, " "elevated synovial PMN%, positive histology, single positive culture.", Body )) story.append(sp(10)) # ─── 5. BONE LOSS CLASSIFICATION ───────────────────────────────────────────── story.append(section_banner("5. CLASSIFICATION OF BONE LOSS")) story.append(sp(6)) story.append(Paragraph("A. Acetabular Bone Loss – Paprosky Classification", H2)) story.append(make_table( ["Type", "Description", "Management"], [ ["I", "Minimal bone loss; supportive rim intact", "Hemispheric cup"], ["IIA", "Superior medial defect; < 2 cm superior migration", "Hemispheric cup ± screws"], ["IIB", "> 50% cup uncovered; ≤ 2 cm migration", "Hemispheric cup + screws"], ["IIC", "Medial wall defect", "Hemispheric cup"], ["IIIA", "Severe: 2–3 cm superior migration; 40–60% host bone", "Cup + augments, tantalum metal"], ["IIIB", "> 3 cm migration; severe destruction (< 40% bone)", "Cup-cage, triflange, custom implant"], ], col_widths=[PW*0.10, PW*0.55, PW*0.35] )) story.append(sp(4)) story.append(kp("Pelvic discontinuity – fracture separating superior and inferior pelvis – is addressed with cup-cage constructs or custom triflange implants.")) story.append(sp(6)) story.append(Paragraph("B. Femoral Bone Loss – Paprosky Classification", H2)) story.append(make_table( ["Type", "Proximal Bone", "Diaphysis", "Preferred Implant"], [ ["I", "Minimal loss", "Intact", "Any primary or revision stem"], ["II", "Extensive proximal", "Intact", "Modular revision stem"], ["IIIA", "Severe; ≥ 4 cm bone", "Intact", "Extensively coated / tapered fluted titanium"], ["IIIB", "Severe; < 4 cm bone", "Compromised", "Tapered fluted modular titanium stem (mainstay)"], ["IV", "Minimal diaphyseal", "Compromised", "Proximal femoral replacement (tumour prosthesis)"], ], col_widths=[PW*0.10, PW*0.25, PW*0.22, PW*0.43] )) story.append(sp(4)) story.append(kp("Most femoral revisions use cementless tapered fluted modular titanium stems. Cemented femoral revision is AVOIDED in revision settings due to high early mechanical failure.")) story.append(sp(6)) story.append(Paragraph("C. Vancouver Classification – Periprosthetic Fracture around THA", H2)) story.append(make_table( ["Type", "Location", "Stem Stability", "Management"], [ ["AG", "Greater trochanter", "Stable", "ORIF vs. conservative"], ["AL", "Lesser trochanter", "Stable", "Conservative"], ["B1", "Around stem", "Well-fixed", "ORIF with locking plates + cables"], ["B2", "Around stem", "Loose stem", "Revision long-stem (bypass by 2 cortical diameters)"], ["B3", "Around stem", "Loose + bone loss", "Revision ± allograft / proximal femoral prosthesis"], ["C", "Below stem tip", "Stable", "Standard ORIF"], ], col_widths=[PW*0.08, PW*0.22, PW*0.18, PW*0.52] )) story.append(sp(10)) story.append(PageBreak()) # ─── 6. MANAGEMENT ─────────────────────────────────────────────────────────── story.append(section_banner("6. MANAGEMENT APPROACH")) story.append(sp(6)) story.append(Paragraph("General Principles", H2)) principles = [ "<b>Treat the cause</b> – identify the specific failure mode before operating", "<b>Exclude infection first</b> – every revision must rule out PJI before aseptic revision", "<b>Pre-operative planning</b> – templating, bone graft requirements, implant selection", "<b>Preserve bone stock</b> – impaction allografting preferred in younger patients", "<b>Restore biomechanics</b> – offset, leg length, version, centre of rotation", ] for p in principles: story.append(Paragraph(f"\u2022 {p}", Bullet)) story.append(sp(6)) # 6A Aseptic loosening story.append(sub_banner(" 6A. Aseptic Loosening / Osteolysis")) story.append(sp(4)) story.append(Paragraph("Well-fixed components with contained osteolysis:", H3)) story.append(Paragraph("\u2022 Debridement + bone grafting + liner exchange (if well-positioned)", Bullet)) story.append(Paragraph("Loose components – Revision arthroplasty:", H3)) story.append(Paragraph("\u2022 <b>Acetabular revision:</b> Hemispheric porous cup with multiple screws (majority of cases); modular metal augments for severe bone loss; cup-cage / triflange for Paprosky IIIB / pelvic discontinuity", Bullet)) story.append(Paragraph("\u2022 <b>Femoral revision:</b> Cementless tapered fluted modular titanium stem (preferred); extensively porous-coated cylindrical stem; impaction allografting (younger patients – preserves bone stock)", Bullet)) story.append(sp(6)) # 6B PJI story.append(sub_banner(" 6B. Periprosthetic Joint Infection (PJI)")) story.append(sp(4)) story.append(Paragraph("Early Acute PJI (< 4–6 weeks from index surgery or < 3 weeks of symptoms):", H3)) story.append(Paragraph( "<b>DAIR</b> (Debridement, Antibiotics, Implant Retention): Irrigation and debridement + " "exchange of modular components (head and liner) + 3–6 months targeted antibiotics. " "Success rate: 60–80% if done early with susceptible organism.", Body )) story.append(sp(4)) story.append(Paragraph("Chronic / Late PJI:", H3)) story.append(make_table( ["Approach", "Description", "Success Rate"], [ ["Two-stage exchange\n(GOLD STANDARD)", "Stage 1: Explant all components + debridement + antibiotic-loaded cement spacer (static or articulating)\n" "→ 6–8 weeks IV antibiotics (culture-directed)\n" "→ Check ESR, CRP, aspiration\n" "Stage 2: Reimplantation when markers normalise", "~85–90%"], ["One-stage exchange", "Selected cases: sensitive organism, good bone stock, healthy patient. Lower morbidity.", "~75–85%"], ["Suppressive antibiotics", "Palliative. For medically unfit patients or low-virulence organism.", "Not curative"], ["Girdlestone procedure\n(excision arthroplasty)", "Last resort when repeated revisions fail or patient unfit for reimplantation. " "Gives pain relief at cost of function (shortening, limp, walking aid).", "Salvage only"], ], col_widths=[PW*0.22, PW*0.55, PW*0.23] )) story.append(sp(6)) # 6C Instability story.append(sub_banner(" 6C. Instability / Dislocation")) story.append(sp(4)) story.append(Paragraph("\u2022 <b>Immediate:</b> Closed reduction under conscious sedation (urgent)", Bullet)) story.append(Paragraph("\u2022 Assess cause: component malposition, soft tissue laxity, impingement, inadequate offset", Bullet)) story.append(Paragraph("Conservative (first dislocation, no malposition):", H3)) story.append(Paragraph("\u2022 Hip brace, activity modification, rehabilitation", Bullet)) story.append(Paragraph("Surgical Management:", H3)) story.append(make_table( ["Scenario", "Intervention"], [ ["Malpositioned components", "Component revision to safe zone"], ["Well-positioned; recurrent dislocation", "Dual-mobility cup (most popular – increases jump distance)"], ["Severe abductor deficiency / cognitive impairment", "Constrained liner"], ["Abductor deficiency + malposition", "Trochanteric advancement + component repositioning"], ["Large head option", "36–40 mm femoral head (if acetabular geometry permits)"], ], col_widths=[PW*0.48, PW*0.52] )) story.append(sp(6)) # 6D Periprosthetic fracture story.append(sub_banner(" 6D. Periprosthetic Fracture (Vancouver Classification)")) story.append(sp(4)) peripro_items = [ ("<b>Vancouver B1:</b>", "ORIF with lateral locking plates + cables (stem stable, well-fixed)"), ("<b>Vancouver B2:</b>", "Long-stem revision arthroplasty bypassing fracture by ≥ 2 cortical diameters"), ("<b>Vancouver B3:</b>", "Long-stem revision + impaction allografting / strut grafts / proximal femoral replacement"), ("<b>Vancouver C:</b>", "Standard ORIF distal to stem (stem stable, not involved)"), ] for label, val in peripro_items: story.append(Paragraph(f"\u2022 {label} {val}", Bullet)) story.append(sp(6)) # 6E Bearing failure story.append(sub_banner(" 6E. Bearing Surface Failure / Trunnionosis")) story.append(sp(4)) bearing_items = [ ("<b>Trunnionosis</b> (fretting corrosion at modular junction):", "Replace metal head with ceramic head + titanium sleeve adaptor; assess soft tissues for pseudotumor/ALTR"), ("<b>Metal-on-metal (MoM) failure / ALVAL</b>:", "Revise when serum cobalt > 7 ppb and/or pseudotumor on MARS MRI; remove MoM bearing; pseudotumor excision"), ("<b>Ceramic fracture:</b>", "Remove ALL ceramic fragments (use MARS MRI); replace with new ceramic on ceramic or ceramic on HCLPE"), ("<b>Polyethylene wear:</b>", "Head and liner exchange if components well-fixed and positioned; address acetabular position if malpositioned"), ] for label, val in bearing_items: story.append(Paragraph(f"\u2022 {label} {val}", Bullet)) story.append(sp(10)) # ─── 7. SURGICAL APPROACH ──────────────────────────────────────────────────── story.append(section_banner("7. SURGICAL APPROACH FOR REVISION THR")) story.append(sp(6)) story.append(Paragraph("Choice of Surgical Approach", H2)) story.append(make_table( ["Approach", "Features", "Best For"], [ ["Posterior", "Most common; extensile; good acetabular and femoral access", "Most revision cases"], ["Transtrochanteric (standard / slide)", "Best exposure; trochanteric slide preserves abductor; risk of trochanteric nonunion ~10–15%", "Difficult revisions requiring wide exposure"], ["Extended Trochanteric Osteotomy (ETO)", "Gold standard for removing well-fixed cementless stems or cement mantles; splits proximal femur reflecting GT with anterior cortex", "Well-fixed ingrown stems; long cement columns"], ], col_widths=[PW*0.22, PW*0.48, PW*0.30] )) story.append(sp(6)) story.append(Paragraph("Component Removal (Campbell's 15th Ed)", H2)) story.append(Paragraph("<b>Cemented femoral component:</b>", H3)) story.append(Paragraph("\u2022 Grossly loose: manual removal", Bullet)) story.append(Paragraph("\u2022 Fixed: ultrasonic cement removal tools, osteotomes, reverse hooks; ETO provides best access to cement column", Bullet)) story.append(Paragraph("<b>Cementless femoral component:</b>", H3)) story.append(Paragraph("\u2022 Ingrown stems require ETO; custom extraction devices (Moreland, endoscope-assisted)", Bullet)) story.append(Paragraph("<b>Acetabular component:</b>", H3)) story.append(Paragraph("\u2022 Curved osteotomes at cup-bone interface; Cup-ex system for cementless cups; minimise bone loss during extraction", Bullet)) story.append(sp(10)) # ─── 8. PREOPERATIVE PLANNING ───────────────────────────────────────────────── story.append(section_banner("8. PREOPERATIVE PLANNING")) story.append(sp(6)) preop = [ "<b>Templating</b> on calibrated digital radiographs", "<b>Implant records</b> from index surgery (type, size, manufacturer)", "<b>CT scan</b> for bone loss quantification (Paprosky type)", "<b>Blood bank</b> crossmatch – revision THR has high blood loss (transfusion rates 30–50%)", "<b>Infectious disease review</b> if PJI suspected or cannot be excluded", "<b>Bone graft availability</b> – allograft bank, demineralised bone matrix", "<b>Implant inventory:</b> Full range of modular revision femoral stems and acetabular augments", "<b>Anaesthetic assessment:</b> Regional (spinal/epidural preferred – reduces blood loss) vs. general", "<b>VTE prophylaxis plan</b> and cell salvage (intraoperative)", ] for p in preop: story.append(Paragraph(f"\u2022 {p}", Bullet)) story.append(sp(10)) # ─── 9. COMPLICATIONS ───────────────────────────────────────────────────────── story.append(section_banner("9. COMPLICATIONS OF REVISION THR")) story.append(sp(6)) story.append(make_table( ["Complication", "Approximate Rate"], [ ["Dislocation (most common post-revision)", "5–15%"], ["Periprosthetic fracture", "3–10%"], ["Nerve injury (sciatic most common)", "1–3%"], ["Wound complications / superficial infection", "3–5%"], ["DVT / PE", "1–3%"], ["Aseptic re-loosening", "5–15% at 10 years"], ["Leg length discrepancy", "10–20%"], ["Re-revision (markedly higher in obese patients and age < 55 years)", "Higher risk groups"], ], col_widths=[PW*0.70, PW*0.30] )) story.append(sp(10)) # ─── 10. OUTCOMES ───────────────────────────────────────────────────────────── story.append(section_banner("10. OUTCOMES")) story.append(sp(6)) story.append(Paragraph( "Revision THR has significantly worse outcomes than primary THR. Key outcome data:", Body )) story.append(make_table( ["Revision Indication", "10-Year Survival (no re-revision)"], [ ["Aseptic loosening", "~70–80%"], ["PJI two-stage exchange", "~85–90%"], ["Instability", "~70–75%"], ["Periprosthetic fracture", "~65–75%"], ], col_widths=[PW*0.55, PW*0.45] )) story.append(sp(6)) story.append(Paragraph("<b>Predictors of poor outcome:</b>", H3)) poor_pred = [ "Infection (vs. aseptic cause)", "Severe bone loss (Paprosky IIIB acetabular or femoral IV)", "Young age (< 55 years) – higher activity demands", "Obesity (BMI > 30) – markedly higher re-revision rates (p < 0.01)", "Multiple prior revisions", "Abductor deficiency", ] for p in poor_pred: story.append(Paragraph(f"\u2022 {p}", Bullet)) story.append(sp(10)) # ─── 11. ALGORITHM ───────────────────────────────────────────────────────────── story.append(section_banner("11. DIAGNOSTIC & MANAGEMENT ALGORITHM")) story.append(sp(6)) algo_lines = [ ("FAILED THR", 0), ("│", 0), ("├── STEP 1: EXCLUDE INFECTION (always first)", 0), ("│ ESR, CRP → Elevated? → Joint aspiration", 1), ("│ Aspirate: WBC, neutrophil %, alpha-defensin, culture", 1), ("│ ├── PJI CONFIRMED → Early: DAIR | Chronic: Two-stage exchange", 1), ("│ └── NOT INFECTED → proceed to Step 2", 1), ("│", 0), ("├── STEP 2: RADIOLOGICAL ASSESSMENT", 0), ("│ Plain X-ray → Loosening? Migration? Fracture? Malposition? Wear?", 1), ("│ CT → Bone loss (Paprosky type), Component version", 1), ("│ MARS MRI → MoM failure, pseudotumor, soft tissue", 1), ("│", 0), ("├── STEP 3: IDENTIFY CAUSE & MANAGE", 0), ("│ Aseptic loosening → Revision with cementless implants ± bone graft", 1), ("│ Instability → Dual-mobility cup / component revision", 1), ("│ PPF → Vancouver classification → ORIF or revision stem", 1), ("│ Bearing failure → Head/liner/trunnion revision", 1), ("│ LLD / impingement → Component repositioning", 1), ("│", 0), ("└── STEP 4: PLAN REVISION SURGERY", 0), (" Templating, bone graft, ETO if needed, implant inventory", 1), ] algo_data = [[Paragraph(line, ParagraphStyle( "Algo", parent=styles["Normal"], fontName="Courier", fontSize=8.5, leading=13, textColor=colors.HexColor("#1A3A5C"), leftIndent=indent*12 ))] for line, indent in algo_lines] algo_table = Table(algo_data, colWidths=[PW]) algo_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#EBF3FA")), ("TOPPADDING", (0,0), (-1,-1), 2), ("BOTTOMPADDING", (0,0), (-1,-1), 2), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ("BOX", (0,0), (-1,-1), 1, MID_BLUE), ])) story.append(algo_table) story.append(sp(12)) # ─── REFERENCES ─────────────────────────────────────────────────────────────── story.append(section_banner("REFERENCES")) story.append(sp(6)) refs = [ "Miller's Review of Orthopaedics, 9th Edition – Section 6: Revision Total Hip Arthroplasty", "Campbell's Operative Orthopaedics, 15th Ed 2026 – Revision THA; Transtrochanteric Approach; Loosening/Osteolysis", "Schwartz's Principles of Surgery, 11th Ed – Complications in Joint Arthroplasty; Osteolysis and Aseptic Loosening", "Rockwood and Green's Fractures in Adults, 10th Ed 2025 – Revision Arthroplasty for Periprosthetic Fractures", "Systematic review of causes of revision THA failure. J Orthop. 2019; PMC6512562", "Diagnosis of the failed total hip replacement. EFORT Open Rev. 2020; PMC6985031", "2018 ICM / MSIS Criteria for Periprosthetic Joint Infection", ] for i, r in enumerate(refs, 1): story.append(Paragraph(f"{i}. {r}", RefStyle)) story.append(sp(6)) # ─── Footer note ─────────────────────────────────────────────────────────────── story.append(hr()) story.append(Paragraph( f"Generated by Orris Medical Education · {datetime.date.today().strftime('%d %B %Y')} · " "For postgraduate orthopaedics examination preparation", ParagraphStyle("Footer", parent=Body, fontSize=8, textColor=colors.grey, alignment=TA_CENTER) )) # ── Build ───────────────────────────────────────────────────────────────────── doc.build(story) print(f"PDF created: {OUTPUT}") PYEOF echo "Script written"
cd /tmp/workspace/failed-thr && python generate_pdf.py
ls -lh /tmp/workspace/failed-thr/Approach_to_Failed_THR.pdf
Approach to Failed THR
PDF Document · PDF