| 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", |
| } |
|
|