| | import re, json |
| | from typing import Dict, Any, List, Tuple |
| |
|
| | |
| | def _norm(s: str) -> str: |
| | if not s: return "" |
| | s = s.replace("\u2013","-").replace("\u2014","-").replace("—","-").replace("–","-").replace("\u00A0"," ") |
| | s = re.sub(r"\s+", " ", s.strip().lower()) |
| | return s |
| |
|
| | def _has(text: str, pat: str) -> bool: |
| | return re.search(pat, text, flags=re.I) is not None |
| |
|
| | def _level_sort_key(lv: str) -> Tuple[int, int]: |
| | band = {"C":100, "T":200, "L":300, "S":400}.get(lv[0], 999) |
| | num = int(re.sub(r"\D", "", lv) or 0) |
| | return (band, num) |
| |
|
| | def _extract_levels(t: str) -> List[str]: |
| | levels = set() |
| | |
| | for m in re.finditer(r"\b([CTLS])\s?(\d{1,2})\s*[-–]\s*([CTLS])?\s?(\d{1,2})\b", t, flags=re.I): |
| | pfx1, n1, pfx2, n2 = m.group(1).upper(), int(m.group(2)), (m.group(3) or m.group(1)).upper(), int(m.group(4)) |
| | if pfx1 != pfx2: |
| | levels.add(f"{pfx1}{n1}"); levels.add(f"{pfx2}{n2}") |
| | else: |
| | lo, hi = sorted([n1, n2]) |
| | for k in range(lo, hi+1): levels.add(f"{pfx1}{k}") |
| | |
| | for m in re.finditer(r"\b([CTLS])\s?(\d{1,2})\b", t, flags=re.I): |
| | levels.add(f"{m.group(1).upper()}{int(m.group(2))}") |
| | return sorted(levels, key=_level_sort_key) |
| |
|
| | def _count_interspaces(levels: List[str]) -> int: |
| | if not levels: return 0 |
| | by_band: Dict[str, List[int]] = {} |
| | for lv in levels: |
| | by_band.setdefault(lv[0], []).append(int(re.sub(r"\D", "", lv))) |
| | for b in list(by_band): |
| | by_band[b] = sorted(set(by_band[b])) |
| | inters = 0 |
| | for arr in by_band.values(): |
| | if len(arr) >= 2: |
| | inters += sum(1 for i in range(1, len(arr)) if arr[i]-arr[i-1]==1) |
| | |
| | if "L5" in levels and "S1" in levels: inters += 1 |
| | |
| | if inters == 0: |
| | for arr in by_band.values(): |
| | if len(arr) >= 2: |
| | inters = 1 |
| | break |
| | return inters |
| |
|
| | def _span_segments(levels: List[str]) -> int: |
| | if not levels: return 0 |
| | by_band: Dict[str, List[int]] = {} |
| | for lv in levels: |
| | by_band.setdefault(lv[0], []).append(int(re.sub(r"\D", "", lv))) |
| | spans = [] |
| | for arr in by_band.values(): |
| | arr = sorted(set(arr)) |
| | spans.append(arr[-1]-arr[0]+1 if len(arr)>=2 else 1) |
| | |
| | return (max(spans) if spans else 0) if len(spans)==1 else max(spans + [2]) |
| |
|
| | def _laterality_mods(t: str) -> List[str]: |
| | mods: List[str] = [] |
| | if _has(t, r"\bleft\b|left-sided|left side|leftward|hemilam\w* left|foraminotomy left|\blt\b"): |
| | mods.append("LT") |
| | |
| | if _has(t, r"\bright\b|right-sided|right side|rightward|hemilam\w* right|foraminotomy right"): |
| | mods.append("RT") |
| | return list(sorted(set(mods))) |
| |
|
| | def _add(suggestions: List[Dict[str, Any]], cpt: str, desc: str, rationale: str, |
| | category: str, primary: bool, confidence: float = 0.8, units: int = 1, |
| | mods: List[str] = None, score: float = None): |
| | suggestions.append({ |
| | "cpt": cpt, "desc": desc, "rationale": rationale, "category": category, |
| | "primary": primary, "confidence": confidence, "units": units, |
| | "modifiers": mods or [], "score": score if score is not None else confidence |
| | }) |
| |
|
| | def _inst_code_by_span(span_segments: int, anterior: bool) -> str: |
| | if span_segments <= 1: return "" |
| | if anterior: |
| | return "22845" if span_segments <= 3 else ("22846" if span_segments <= 7 else "22847") |
| | else: |
| | return "22842" if span_segments <= 3 else ("22843" if span_segments <= 7 else "22844") |
| |
|
| | |
| | def suggest_with_cpt_billing(note: str, payer: str = "Medicare", top_k: int = 10) -> Dict[str, Any]: |
| | t = _norm(note) |
| | suggestions: List[Dict[str, Any]] = [] |
| | case_modifiers: List[Dict[str, str]] = [] |
| |
|
| | |
| | |
| | exposure_only = ( |
| | _has(t, r"\bexpos(e|ed|ure)\b|\bapproach\b") and |
| | _has(t, r"\banterior\b|retroperitoneal|vascular (surgeon|exposure)|access\b") and |
| | _has(t, r"\bno (fusion|arthrodesis|interbody|implants?|cage|plate|screw|instrumentation)\b|without (fusion|interbody|instrumentation)") and |
| | not _has(t, r"\bfusion|arthrodesis|discectom\w+|interbody|tlif|plif|alif|acdf|arthroplasty|stimulator|instrument|hardware|screw|rod|plate|cage") |
| | ) |
| | if exposure_only: |
| | return { |
| | "payer": payer, |
| | "region": "unknown", |
| | "levels": [], |
| | "interspaces_est": 0, |
| | "span_segments_est": 0, |
| | "suggestions": [{ |
| | "cpt": "00000", |
| | "desc": "No recognizable spine CPT pattern found", |
| | "rationale": "Exposure-only access without decompression/fusion/instrumentation.", |
| | "confidence": 0.0, "category": "none", "primary": True, "modifiers": [], "units": 1, "score": 0.0 |
| | }], |
| | "case_modifiers": [], |
| | "flags": [], |
| | "flags_map": {}, |
| | "laterality": "na", |
| | "build": "FINAL-v2.1", |
| | "mode": "standard", |
| | } |
| |
|
| | |
| | levels = _extract_levels(t) |
| | inters = _count_interspaces(levels) |
| | span = _span_segments(levels) |
| | lat_mods = _laterality_mods(t) |
| |
|
| | |
| | region = "unknown" |
| | if any(l.startswith("C") for l in levels) or _has(t, r"\bcervic"): |
| | region = "cervical" |
| | elif any(l.startswith("T") for l in levels) or _has(t, r"\bthorac"): |
| | region = "thoracic" |
| | elif any(l.startswith(("L","S")) for l in levels) or _has(t, r"\blumbar|sacrum"): |
| | region = "lumbar" |
| |
|
| | |
| | has_c7 = any(l.upper() == "C7" for l in levels) or _has(t, r"\bc7\b") |
| | has_t1_3 = any(l.upper() in {"T1","T2","T3"} for l in levels) or _has(t, r"\bt[1-3]\b") |
| | if has_c7 and has_t1_3: |
| | region = "cervicothoracic" |
| |
|
| | |
| | mentions_plate_ant = _has(t, r"\b(anterior (plate|instrument(ation)?)|plate fixed|plating)\b") or _has(t, r"\bplate\b") |
| | mentions_pedicle = _has(t, r"\bpedicle screw|pedicle-screw|pedicle fixation|s2ai\b") |
| | mentions_rod = _has(t, r"\brod(s)?\b") |
| | mentions_inst_post = mentions_pedicle or mentions_rod or _has(t, r"\binstrument(ation)?\b") |
| |
|
| | did_corpectomy = False |
| | no_decompression_due_to_revision = False |
| | avoid_decompression_for_stimulator = False |
| |
|
| | |
| | rem_pat_either = ( |
| | r"(?:\b(hardware|instrumentation|implant|plate|rod|screw)\b.{0,40}\b(remov\w+|explant\w+|taken out))" |
| | r"|(?:\bremov\w+\b.{0,40}\b(hardware|instrumentation|implant|plate|rod|screw)\b)" |
| | ) |
| | if _has(t, rem_pat_either): |
| | if _has(t, r"\banterior\b|acdf|alif|anterior plate|smith[- ]?robinson"): |
| | _add(suggestions, "22855", "Removal of anterior instrumentation", |
| | "Anterior hardware removal documented.", "hardware_removal", True, 0.85, mods=lat_mods) |
| | elif _has(t, r"non[- ]?segmental|hook|wire") and not _has(t, r"segmental|pedicle"): |
| | _add(suggestions, "22850", "Removal of posterior non-segmental instrumentation", |
| | "Posterior non-segmental removal documented.", "hardware_removal", True, 0.82, mods=lat_mods) |
| | else: |
| | _add(suggestions, "22852", "Removal of posterior segmental instrumentation", |
| | "Posterior segmental hardware removal documented.", "hardware_removal", True, 0.85, mods=lat_mods) |
| |
|
| | |
| | if _has(t, r"\b(reinsertion|remove and replace|revision of instrumentation|hardware revision)\b"): |
| | _add(suggestions, "22849", "Reinsertion/revision of spinal instrumentation", |
| | "Revision/reinsertion documented.", "revision", True, 0.85) |
| | no_decompression_due_to_revision = True |
| |
|
| | |
| | if ( |
| | not _has(t, r"\btlif\b|\bplif\b|posterolateral\b.*\bfusion|posterior\b.*\bfusion") |
| | and (mentions_inst_post or _has(t, r"\b(new|placed|inserted|reinserted)\b.{0,20}\b(screw|rod|construct|instrumentation)\b")) |
| | and region in {"cervical","thoracic","lumbar"} |
| | ): |
| | est_segments = span or max(2, inters + 1) |
| | code = _inst_code_by_span(est_segments, anterior=False) |
| | if code: |
| | desc = {"22842":"Posterior segmental instrumentation (2–3 segments)", |
| | "22843":"Posterior segmental instrumentation (4–7 segments)", |
| | "22844":"Posterior segmental instrumentation (8+ segments)"}[code] |
| | _add(suggestions, code, desc, "New posterior instrumentation documented.", "instrumentation", False, 0.82) |
| |
|
| | |
| | found_removal = _has(t, rem_pat_either) |
| | acdf_history = _has(t, r"\b(prior|previous|history of|s/?p)\s*acdf\b") |
| | acdf_current = ( |
| | _has(t, r"\banterior cervical discectomy|anterior cervical fusion|smith[- ]?robinson\b") |
| | or ( |
| | (region in {"cervical","cervicothoracic"}) |
| | and _has(t, r"\bdiscectom\w+\b") |
| | and (_has(t, r"\b(interbody|cage|arthrodesis|plate)\b") or mentions_plate_ant) |
| | ) |
| | or _has(t, r"\bacdf\b") |
| | ) |
| |
|
| | if acdf_current and not (found_removal and not _has(t, r"\bacdf\b")) and not exposure_only: |
| | n = max(1, inters or 1) |
| | _add(suggestions, "22551", "ACDF, first interspace (includes discectomy)", |
| | "Anterior cervical fusion pattern detected.", "ACDF", True, 0.95, mods=lat_mods) |
| | if n > 1: |
| | _add(suggestions, "22552", f"ACDF, each additional interspace ×{n-1}", |
| | "Multi-level ACDF.", "ACDF add-on", False, 0.9, units=(n-1), mods=lat_mods) |
| |
|
| | |
| | m_span = re.search(r"\bspan\w*\s*(c\d)\s*[-–—]\s*(c\d)\b", t, flags=re.I) |
| | plate_span_est = None |
| | if m_span: |
| | try: |
| | c_lo = int(re.sub(r"\D","", m_span.group(1))) |
| | c_hi = int(re.sub(r"\D","", m_span.group(2))) |
| | if c_hi >= c_lo: |
| | plate_span_est = c_hi - c_lo + 1 |
| | except Exception: |
| | plate_span_est = None |
| |
|
| | if mentions_plate_ant: |
| | est_span = (plate_span_est if plate_span_est and plate_span_est >= 2 |
| | else (span if (span and span >= 2) else (n + 1))) |
| | code = _inst_code_by_span(est_span, anterior=True) |
| | if code: |
| | desc = {"22845":"Anterior instrumentation (2–3 segments)", |
| | "22846":"Anterior instrumentation (4–7 segments)", |
| | "22847":"Anterior instrumentation (8+ segments)"}[code] |
| | _add(suggestions, code, desc, "Anterior plate present; span estimated from levels/plate span.", "instrumentation", False, 0.8) |
| |
|
| | |
| | if ( |
| | not _has(t, r"\btlif\b|\bplif\b|posterior interbody fusion") |
| | and _has(t, r"\bfacetectom(y|ies)\b|complete facetectomy|hemifacetectomy|transforaminal") |
| | and _has(t, r"\binterbody (cage|device|spacer)\b|peek (cage|spacer)|titanium (cage|spacer)|allograft spacer") |
| | and (mentions_pedicle or _has(t, r"\bpedicle screw(s)?\b")) |
| | and region in {"lumbar", "thoracic"} |
| | ): |
| | n = max(1, inters or 1) |
| | _add(suggestions, "22633", "Posterior/posterolateral + posterior interbody, single level", |
| | "Implicit TLIF/PLIF: facetectomy + interbody device + pedicle screws.", "TLIF/PLIF", True, 0.93, mods=lat_mods) |
| | if n > 1: |
| | _add(suggestions, "22634", f"Posterior interbody each additional interspace ×{n-1}", |
| | "Multi-level implicit TLIF/PLIF.", "TLIF/PLIF add-on", False, 0.89, units=(n-1), mods=lat_mods) |
| | code = _inst_code_by_span(span or (n+1), anterior=False) |
| | if code: |
| | desc = {"22842":"Posterior segmental instrumentation (2–3 segments)", |
| | "22843":"Posterior segmental instrumentation (4–7 segments)", |
| | "22844":"Posterior segmental instrumentation (8+ segments)"}[code] |
| | _add(suggestions, code, desc, "Posterior instrumentation detected (implicit TLIF).", "instrumentation", False, 0.83) |
| |
|
| | |
| | if _has(t, r"\btlif\b|\bplif\b|posterior interbody fusion"): |
| | n = max(1, inters or 1) |
| | _add(suggestions, "22633", "Posterior/posterolateral + posterior interbody, single level", |
| | "TLIF/PLIF pattern: posterior approach + cage + screws.", "TLIF/PLIF", True, 0.92, mods=lat_mods) |
| | if n > 1: |
| | _add(suggestions, "22634", f"Posterior interbody each additional interspace ×{n-1}", |
| | "Multi-level TLIF/PLIF.", "TLIF/PLIF add-on", False, 0.88, units=(n-1), mods=lat_mods) |
| | if mentions_inst_post: |
| | code = _inst_code_by_span(span or (n+1), anterior=False) |
| | if code: |
| | desc = {"22842":"Posterior segmental instrumentation (2–3 segments)", |
| | "22843":"Posterior segmental instrumentation (4–7 segments)", |
| | "22844":"Posterior segmental instrumentation (8+ segments)"}[code] |
| | _add(suggestions, code, desc, "Posterior instrumentation detected.", "instrumentation", False, 0.82) |
| |
|
| | |
| | if _has(t, r"\balif\b|anterior lumbar interbody fusion"): |
| | n = max(1, inters or 1) |
| | _add(suggestions, "22558", "Anterior lumbar interbody fusion, single interspace", |
| | "ALIF detected.", "ALIF", True, 0.9) |
| | if n > 1: |
| | _add(suggestions, "22585", f"ALIF each additional interspace ×{n-1}", |
| | "Multi-level ALIF.", "ALIF add-on", False, 0.86, units=(n-1)) |
| | if mentions_plate_ant: |
| | est_span = span if (span and span >= 2) else (n + 1) |
| | code = _inst_code_by_span(est_span, anterior=True) |
| | if code: |
| | desc = {"22845":"Anterior instrumentation (2–3 segments)", |
| | "22846":"Anterior instrumentation (4–7 segments)", |
| | "22847":"Anterior instrumentation (8+ segments)"}[code] |
| | _add(suggestions, code, desc, "Anterior plate present; span estimated from levels.", "instrumentation", False, 0.8) |
| |
|
| | |
| | if (_has(t, r"posterolateral\b.*\bfusion|post[- ]?lat\b.*\bfusion|posterior\b.*\bfusion|in situ\b.*\bfusion") |
| | and not _has(t, r"\btlif\b|\bplif\b|posterior interbody")): |
| | base_map = {"cervical":"22600", "thoracic":"22610", "lumbar":"22612"} |
| | base = base_map.get(region, "22612") |
| | _add(suggestions, base, f"Posterolateral/posterior fusion, first level ({region})", |
| | "Posterior fusion without interbody.", "posterior_fusion", True, 0.78, mods=lat_mods) |
| | add_units = max(0, inters) |
| | if add_units: |
| | _add(suggestions, "22614", f"Posterior fusion each additional segment ×{add_units}", |
| | "Multi-level posterior fusion.", "posterior_fusion add-on", False, 0.72, units=add_units, mods=lat_mods) |
| | if mentions_inst_post: |
| | n_seg = span or max(2, (inters + 1)) |
| | code = _inst_code_by_span(n_seg, anterior=False) |
| | if code: |
| | desc = {"22842":"Posterior segmental instrumentation (2–3 segments)", |
| | "22843":"Posterior segmental instrumentation (4–7 segments)", |
| | "22844":"Posterior segmental instrumentation (8+ segments)"}[code] |
| | _add(suggestions, code, desc, "Posterior instrumentation detected.", "instrumentation", False, 0.8) |
| |
|
| | |
| | if _has(t, r"\bstimulator\b|paddle lead|spinal cord stimulator|scs") and _has(t, r"\blaminectomy\b|laminotomy"): |
| | _add(suggestions, "63655", "Laminectomy for implantation of neurostimulator paddle electrodes", |
| | "Paddle lead placed via laminectomy.", "neurostimulator", True, 0.86) |
| | if _has(t, r"\bpulse generator\b|ipg|implantable pulse generator|battery\b"): |
| | _add(suggestions, "63685", "Insertion or replacement of IPG", |
| | "Pulse generator implanted.", "neurostimulator", False, 0.84) |
| | avoid_decompression_for_stimulator = True |
| |
|
| | |
| | if (not no_decompression_due_to_revision) and (not avoid_decompression_for_stimulator): |
| | if _has(t, r"\bdecompression(s)?\b|laminectom(y|ies)|laminotom(y|ies)|foraminotom(y|ies)|foraminal decompression(s)?|neuroforamen|lateral recess|central stenosis") \ |
| | and not _has(t, r"\b(prior|previous|history of|s/?p)\s+(decompression|laminectomy|laminotomy|foraminotomy)\b"): |
| | base_map = {"cervical":"63045", "thoracic":"63046", "lumbar":"63047"} |
| | base = base_map.get(region, "63047") |
| | _add(suggestions, base, "Decompression, first level", "Decompression terms detected.", "decompression", True, 0.82, mods=lat_mods) |
| | if _has(t, r"additional level|two levels|three levels|multi|levels|l\d-?l\d|c\d-?c\d|t\d-?t\d"): |
| | extra = max(1, inters) |
| | _add(suggestions, "63048", f"Decompression, each additional level ×{extra}", |
| | "Multi-level decompression inferred.", "decompression add-on", False, 0.78, units=extra, mods=lat_mods) |
| |
|
| | |
| | if _has(t, r"\bcoflex\b|interspinous|interlaminar device|ipd"): |
| | _add(suggestions, "22868", "Insertion of interspinous/interlaminar device", |
| | "Coflex/IPD insertion documented.", "interspinous", True, 0.86, mods=lat_mods) |
| |
|
| | |
| | if _has(t, r"cervical (arthroplasty|artificial disc|disc replacement)|\bcda\b") or ( |
| | (region == "cervical") and _has(t, r"\barthroplasty\b|artificial disc|disc replacement") |
| | ): |
| | n = max(1, inters or 1) |
| | _add(suggestions, "22856", "Cervical disc arthroplasty, single level", |
| | "Cervical disc arthroplasty documented.", "arthroplasty", True, 0.87, mods=lat_mods) |
| | if n > 1: |
| | _add(suggestions, "22858", f"Cervical disc arthroplasty, each additional level ×{n-1}", |
| | "Multi-level arthroplasty.", "arthroplasty add-on", False, 0.84, units=(n-1), mods=lat_mods) |
| |
|
| | |
| | |
| | if _has(t, r"\bcorpectomy\b") and (region == "cervical" or _has(t, r"\bcervic")): |
| | _add(suggestions, "63081", "Cervical corpectomy for decompression, first segment", |
| | "Cervical corpectomy documented.", "tumor/corpectomy", True, 0.86) |
| | if _has(t, r"additional (level|segment)|two levels|three levels|multi|c\d-?c\d"): |
| | extra = max(1, inters or 1) |
| | _add(suggestions, "63082", f"Each additional cervical segment ×{extra}", |
| | "Multi-segment cervical corpectomy.", "tumor/corpectomy add-on", False, 0.82, units=extra) |
| | did_corpectomy = True |
| | |
| | if _has(t, r"\btumou?r\b|metastatic|metastasis|en bloc") or (_has(t, r"\bcorpectomy\b") and region in {"thoracic","lumbar"}): |
| | _add(suggestions, "63085", "Vertebral corpectomy for decompression (thoracic/lumbar), first segment", |
| | "Tumor/corpectomy documented.", "tumor/corpectomy", True, 0.84) |
| | if _has(t, r"additional (level|segment)|two levels|three levels|multi|t\d-?t\d|l\d-?l\d"): |
| | _add(suggestions, "63086", "Each additional segment (thoracic/lumbar) ×1+", |
| | "Multi-segment corpectomy.", "tumor/corpectomy add-on", False, 0.8) |
| | did_corpectomy = True |
| |
|
| | |
| | if did_corpectomy: |
| | suggestions = [r for r in suggestions if r["category"] != "decompression" and r["cpt"] not in {"63045","63046","63047","63048"}] |
| |
|
| | |
| | if _has(t, r"\bspo\b|smith[- ]?petersen|posterior column osteotomy|osteotomy"): |
| | base_map = {"cervical":"22210", "thoracic":"22214", "lumbar":"22206"} |
| | base = base_map.get(region, "22206") |
| | _add(suggestions, base, "Posterior column osteotomy (Smith-Petersen), first level", |
| | "Deformity correction with SPO documented.", "deformity", True, 0.83) |
| | if _has(t, r"additional (level|segment)|two levels|three levels|multi"): |
| | _add(suggestions, str(int(base)+1), "Each additional vertebral segment ×1+", |
| | "Multi-level osteotomy.", "deformity add-on", False, 0.78) |
| |
|
| | |
| | if _has(t, r"\bkyphoplasty\b|vertebroplasty|cement (augmentation|injection)"): |
| | base_map = {"cervical":"22510", "thoracic":"22513", "lumbar":"22514"} |
| | base = base_map.get(region, "22514") |
| | _add(suggestions, base, "Percutaneous vertebral augmentation, first level", |
| | "Vertebral augmentation terms present.", "percutaneous", True, 0.82) |
| | if _has(t, r"additional (level|segment)|two levels|three levels|multi"): |
| | _add(suggestions, "22515", "Each additional vertebral body ×1+", |
| | "Multi-level augmentation.", "percutaneous add-on", False, 0.8) |
| |
|
| | |
| | if _has(t, r"\bpelvic fixation\b|iliac bolt|iliac screw|s2ai|to pelvis\b"): |
| | _add(suggestions, "22848", "Pelvic fixation (attach instrumentation to pelvis)", |
| | "Iliac/pelvic fixation documented.", "pelvic_fixation", False, 0.84) |
| |
|
| | |
| | structural_like = _has(t, r"\b(structural allograft|fibular strut|strut graft|allograft spacer(s)?|interbody allograft spacer(s)?)\b") |
| | any_allograft = _has(t, r"\ballograft\b|dbm|demineralized|osteo.?promotive|morselized local bone|local autograft") |
| |
|
| | if _has(t, r"\bautograft\b|iliac crest harvest|icbg|iliac crest bone"): |
| | _add(suggestions, "20937", "Autograft (separate incision)", |
| | "Autograft harvest documented.", "bone_graft", False, 0.8) |
| |
|
| | if structural_like: |
| | _add(suggestions, "20931", "Structural allograft", |
| | "Structural allograft documented.", "bone_graft", False, 0.8) |
| | elif any_allograft: |
| | _add(suggestions, "20930", "Allograft, morselized / osteopromotive material", |
| | "Allograft/DBM documented.", "bone_graft", False, 0.8) |
| |
|
| | if _has(t, r"\bbmp\b|biologic|recombinant growth factor|rhbmp"): |
| | _add(suggestions, "20939", "Osteopromotive biologic (e.g., BMP)", |
| | "BMP/biologic documented.", "bone_graft", False, 0.8) |
| |
|
| | |
| | mod_map = { |
| | "22": r"\b(complex|difficult|prolonged|adhesiolysis|severe deformity|morbid obesity)\b", |
| | "50": r"\b(both sides|bilaterally|bilateral(?!\s*(pedicle|screw|screws|rod|rods|instrumentation)))\b", |
| | "52": r"\bpartial|limited|reduced service\b", |
| | "53": r"\baborted|terminated|discontinued\b", |
| | "59": r"\bseparate (site|incision)|distinct|different level\b", |
| | "62": r"\bco[- ]?surgeon|two surgeons|co-surgeons\b", |
| | "78": r"\breturn to or\b|\bunplanned return\b", |
| | "79": r"\bunrelated procedure\b", |
| | "80": r"\bassistant surgeon|assistant present\b", |
| | "82": r"\bresident not available\b" |
| | } |
| | reasons = { |
| | "22": "Increased procedural service (complexity).", |
| | "50": "Bilateral procedure documented.", |
| | "52": "Reduced service (limited portion performed).", |
| | "53": "Procedure discontinued for safety.", |
| | "59": "Distinct procedural service (separate site/level).", |
| | "62": "Two surgeons (co-surgeons) documented.", |
| | "78": "Unplanned return to OR during global period.", |
| | "79": "Unrelated procedure during postoperative period.", |
| | "80": "Assistant surgeon documented.", |
| | "82": "Assistant surgeon; resident not available." |
| | } |
| | for k, pat in mod_map.items(): |
| | if _has(t, pat): case_modifiers.append({"modifier": k, "reason": reasons[k]}) |
| |
|
| | |
| | if not any(m["modifier"]=="50" for m in case_modifiers): |
| | if _has(t, r"\bbilateral\b") and _has(t, r"(foraminotom(y|ies)|facetectom(y|ies)|laminectom(y|ies)|laminotom(y|ies))"): |
| | case_modifiers.append({"modifier":"50","reason": reasons["50"]}) |
| |
|
| | |
| | if any(m["modifier"]=="82" for m in case_modifiers): |
| | case_modifiers = [m for m in case_modifiers if m["modifier"]!="80"] |
| | if any(m["modifier"]=="53" for m in case_modifiers): |
| | case_modifiers = [m for m in case_modifiers if m["modifier"]!="52"] |
| |
|
| | |
| | if not suggestions: |
| | suggestions = [{ |
| | "cpt": "00000", |
| | "desc": "No recognizable spine CPT pattern found", |
| | "rationale": "No fusion/decompression pattern detected.", |
| | "confidence": 0.0, "category": "none", "primary": True, "modifiers": [], "units": 1, "score": 0.0 |
| | }] |
| |
|
| | |
| | merged: Dict[Tuple[str, str, str, str], Dict[str, Any]] = {} |
| | for r in suggestions: |
| | key = (r["cpt"], r["desc"], r["category"], "|".join(sorted(r.get("modifiers", [])))) |
| | if key not in merged: |
| | merged[key] = r.copy() |
| | else: |
| | merged[key]["units"] = merged[key].get("units", 1) + r.get("units", 1) |
| | merged[key]["confidence"] = max(merged[key]["confidence"], r.get("confidence", 0.0)) |
| | merged[key]["score"] = max(merged[key]["score"], r.get("score", 0.0)) |
| | merged[key]["primary"] = merged[key]["primary"] or r.get("primary", False) |
| |
|
| | out = list(merged.values()) |
| |
|
| | |
| | has_53 = any(m["modifier"] == "53" for m in case_modifiers) |
| | if has_53: |
| | for r in out: |
| | if r.get("primary", False): |
| | r.setdefault("modifiers", []) |
| | if "53" not in r["modifiers"]: |
| | r["modifiers"].append("53") |
| | |
| | for r in out: |
| | if not r.get("primary", False) and r.get("modifiers"): |
| | r["modifiers"] = [m for m in r["modifiers"] if m != "53"] |
| |
|
| | |
| | has_50 = any(m["modifier"] == "50" for m in case_modifiers) |
| | lat_row_mods = [] if has_50 else lat_mods |
| | for row in out: |
| | if row["category"] in {"decompression","decompression add-on","TLIF/PLIF","posterior_fusion","posterior_fusion add-on"}: |
| | if lat_row_mods and not row.get("modifiers"): |
| | row["modifiers"] = lat_row_mods[:] |
| | if has_50: |
| | for row in out: |
| | if row.get("modifiers"): |
| | row["modifiers"] = [m for m in row["modifiers"] if m not in ("LT","RT")] |
| |
|
| | |
| | def _cpt_num(x: Dict[str, Any]) -> int: |
| | try: return int(re.sub(r"\D","", x.get("cpt","0")) or 0) |
| | except: return 0 |
| | out.sort(key=lambda r: (not r.get("primary", False), -(r.get("score", r.get("confidence",0.0))), _cpt_num(r))) |
| | if isinstance(top_k, int) and top_k > 0: |
| | out = out[:top_k] |
| |
|
| | |
| | flags_map = { |
| | "microscope": _has(t, r"\bmicroscope\b|microdissection"), |
| | "nav": _has(t, r"\bnavigation\b|o-?arm|stealth|mazor|7d|image[- ]?guided"), |
| | "io_monitor": _has(t, r"\bneuromonitor\w*|ssep|tcem|tcme|emg\b|\bintra[- ]?op(erative)? monitoring\b"), |
| | "fluoro": _has(t, r"\bfluoro\w*|c[- ]?arm\b|fluoroscop\w*"), |
| | } |
| | flags_list = [k for k, v in flags_map.items() if v] |
| |
|
| | |
| | bilateral_procedure_pat = ( |
| | r"\bboth sides\b" |
| | r"|" |
| | r"\bbilateral\b(?!\s*(pedicle|screw|screws|rod|rods|instrument|instrumentation|hardware|construct))" |
| | ) |
| | case_laterality = "na" |
| | if _has(t, r"\bleft[- ]sided|\bleft\b"): |
| | case_laterality = "left" |
| | elif _has(t, r"\bright[- ]sided|\bright\b"): |
| | case_laterality = "right" |
| | elif _has(t, bilateral_procedure_pat): |
| | case_laterality = "bilateral" |
| |
|
| | |
| | if flags_list: |
| | for r in out: |
| | if r.get("primary", False): |
| | r["rationale"] = (r.get("rationale","") + f" (Tech: {', '.join(flags_list)})").strip() |
| | break |
| |
|
| | return { |
| | "payer": payer, |
| | "region": region, |
| | "levels": levels, |
| | "interspaces_est": inters, |
| | "span_segments_est": span, |
| | "suggestions": out, |
| | "case_modifiers": case_modifiers, |
| | "flags": flags_list, |
| | "flags_map": flags_map, |
| | "laterality": case_laterality, |
| | "build": "FINAL-v2.1", |
| | "mode": "standard", |
| | } |
| |
|