aimedicalcoding 0.3.8__tar.gz → 0.3.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. {aimedicalcoding-0.3.8/aimedicalcoding.egg-info → aimedicalcoding-0.3.9}/PKG-INFO +1 -1
  2. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/cvx/patterns.py +6 -5
  3. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/icd10cm/patterns.py +8 -5
  4. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/loinc/patterns.py +5 -0
  5. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/rxnorm/patterns.py +6 -5
  6. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/snomed/patterns.py +9 -8
  7. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9/aimedicalcoding.egg-info}/PKG-INFO +1 -1
  8. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/setup.py +1 -1
  9. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/LICENSE +0 -0
  10. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/MANIFEST.in +0 -0
  11. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/README.md +0 -0
  12. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/README_PYPI.md +0 -0
  13. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/__init__.py +0 -0
  14. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/__main__.py +0 -0
  15. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/__init__.py +0 -0
  16. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/base.py +0 -0
  17. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/ccda/__init__.py +0 -0
  18. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/ccda/adapter.py +0 -0
  19. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/ccda/codes.py +0 -0
  20. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/ccda/narrative.py +0 -0
  21. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/ccda/sections.py +0 -0
  22. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/custom_json/__init__.py +0 -0
  23. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/custom_json/adapter.py +0 -0
  24. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/fhir/__init__.py +0 -0
  25. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/fhir/adapter.py +0 -0
  26. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/fhir/codes.py +0 -0
  27. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/adapters/fhir/mapping.py +0 -0
  28. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/api.py +0 -0
  29. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/core/__init__.py +0 -0
  30. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/core/checkdigits.py +0 -0
  31. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/core/models.py +0 -0
  32. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/core/system_registry.py +0 -0
  33. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/pipeline/__init__.py +0 -0
  34. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/pipeline/orchestrator.py +0 -0
  35. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/recovery/__init__.py +0 -0
  36. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/recovery/engine.py +0 -0
  37. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/serialize.py +0 -0
  38. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/__init__.py +0 -0
  39. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/base.py +0 -0
  40. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/cvx/__init__.py +0 -0
  41. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/cvx/handler.py +0 -0
  42. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/cvx/normalize.py +0 -0
  43. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/icd10cm/__init__.py +0 -0
  44. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/icd10cm/handler.py +0 -0
  45. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/icd10cm/icdformat.py +0 -0
  46. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/loinc/__init__.py +0 -0
  47. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/loinc/axes.py +0 -0
  48. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/loinc/handler.py +0 -0
  49. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/loinc/normalize.py +0 -0
  50. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/rxnorm/__init__.py +0 -0
  51. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/rxnorm/handler.py +0 -0
  52. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/rxnorm/normalize.py +0 -0
  53. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/snomed/__init__.py +0 -0
  54. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/snomed/handler.py +0 -0
  55. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/snomed/hierarchy.py +0 -0
  56. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/systems/snomed/qualifiers.py +0 -0
  57. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/terminology/__init__.py +0 -0
  58. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding/terminology/service.py +0 -0
  59. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding.egg-info/SOURCES.txt +0 -0
  60. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding.egg-info/dependency_links.txt +0 -0
  61. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding.egg-info/entry_points.txt +0 -0
  62. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding.egg-info/requires.txt +0 -0
  63. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/aimedicalcoding.egg-info/top_level.txt +0 -0
  64. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/ARCHITECTURE.md +0 -0
  65. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/GAP_SCHEMA.md +0 -0
  66. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/OUTPUT_GUIDE.md +0 -0
  67. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/patterns/CVX_pattern_analysis.md +0 -0
  68. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/patterns/ICD10CM_pattern_analysis.md +0 -0
  69. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/patterns/LOINC_pattern_analysis.md +0 -0
  70. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/patterns/RxNorm_pattern_analysis.md +0 -0
  71. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/docs/patterns/SNOMED_pattern_analysis.md +0 -0
  72. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/pyproject.toml +0 -0
  73. {aimedicalcoding-0.3.8 → aimedicalcoding-0.3.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aimedicalcoding
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: Detect missing/broken clinical codes (LOINC / SNOMED CT / RxNorm / ICD-10-CM / CVX) in CCDA and FHIR documents, with recovery evidence
5
5
  Author: Aakash Kag, Vinay Shankar Miryala, Siva Karthik, Mohammed Rayaan
6
6
  License: MIT
@@ -73,13 +73,14 @@ def classify(stmt: ClinicalStatement) -> Optional[CvxGapPattern]:
73
73
  if cc and cc.code and cc.system not in STRUCTURAL:
74
74
  return CvxGapPattern.LOCAL_CODE_ONLY
75
75
 
76
+ # no usable code + no vaccine name -> nothing to recover -> not a gap
77
+ if not stmt.raw_text:
78
+ return None
76
79
  if _has_nullflavor(stmt):
77
80
  return CvxGapPattern.NULLFLAVOR
78
- if stmt.raw_text:
79
- if "/text" in (stmt.source_ref or ""):
80
- return CvxGapPattern.NARRATIVE_ONLY
81
- return CvxGapPattern.DISPLAY_ONLY
82
- return None
81
+ if "/text" in (stmt.source_ref or ""):
82
+ return CvxGapPattern.NARRATIVE_ONLY
83
+ return CvxGapPattern.DISPLAY_ONLY
83
84
 
84
85
 
85
86
  # --------------------------------------------------------------------------
@@ -67,13 +67,16 @@ def classify(stmt: ClinicalStatement) -> Optional[Icd10cmGapPattern]:
67
67
  if other: # ICD-9 / local / anything else
68
68
  return Icd10cmGapPattern.LOCAL_CODE_ONLY
69
69
 
70
+ # diagnosis is value-slot: require a value-slot label to recover from.
71
+ # No code AND no value label (e.g. dataAbsentReason, no text) -> not a gap.
72
+ val_label = stmt.value and (stmt.value.original_text or stmt.value.raw)
73
+ if not val_label:
74
+ return None
70
75
  if _has_nullflavor(stmt):
71
76
  return Icd10cmGapPattern.NULLFLAVOR
72
- if stmt.raw_text or (stmt.value and (stmt.value.original_text or stmt.value.raw)):
73
- if "/text" in (stmt.source_ref or ""):
74
- return Icd10cmGapPattern.NARRATIVE_ONLY
75
- return Icd10cmGapPattern.DISPLAY_ONLY
76
- return None
77
+ if "/text" in (stmt.source_ref or ""):
78
+ return Icd10cmGapPattern.NARRATIVE_ONLY
79
+ return Icd10cmGapPattern.DISPLAY_ONLY
77
80
 
78
81
 
79
82
  # --------------------------------------------------------------------------
@@ -77,6 +77,11 @@ def classify(stmt: ClinicalStatement) -> Optional[GapPattern]:
77
77
  if clinical_codes:
78
78
  return GapPattern.LOCAL_CODE_ONLY
79
79
 
80
+ # No usable code: a gap is only actionable if a concept label exists to
81
+ # search with. No code AND no label (e.g. dataAbsentReason with no text)
82
+ # -> nothing to fill -> not a gap.
83
+ if not stmt.raw_text:
84
+ return None
80
85
  has_nullflavor = any(c.system == System.NULLFLAVOR for c in stmt.codings)
81
86
  if has_nullflavor:
82
87
  return GapPattern.NULLFLAVOR
@@ -68,13 +68,14 @@ def classify(stmt: ClinicalStatement) -> Optional[RxnormGapPattern]:
68
68
  if cc and cc.code and cc.system not in STRUCTURAL:
69
69
  return RxnormGapPattern.LOCAL_CODE_ONLY # local/formulary/other
70
70
 
71
+ # no usable code + no drug name -> nothing to recover -> not a gap
72
+ if not stmt.raw_text:
73
+ return None
71
74
  if _has_nullflavor(stmt):
72
75
  return RxnormGapPattern.NULLFLAVOR
73
- if stmt.raw_text:
74
- if "/text" in (stmt.source_ref or ""):
75
- return RxnormGapPattern.NARRATIVE_ONLY
76
- return RxnormGapPattern.DISPLAY_ONLY
77
- return None
76
+ if "/text" in (stmt.source_ref or ""):
77
+ return RxnormGapPattern.NARRATIVE_ONLY
78
+ return RxnormGapPattern.DISPLAY_ONLY
78
79
 
79
80
 
80
81
  # --------------------------------------------------------------------------
@@ -113,16 +113,17 @@ def classify(stmt: ClinicalStatement) -> Optional[SnomedGapPattern]:
113
113
  if cc and cc.code and cc.system not in STRUCTURAL:
114
114
  return SnomedGapPattern.LOCAL_CODE_ONLY # CPT / local / other
115
115
 
116
- # no usable concept code. The label must come from the CONCEPT's slot
117
- # (value display/originalText for value-slot contexts) — raw_text alone
118
- # misses e.g. reaction observations whose code tag is a bare ASSERTION.
116
+ # no usable concept code. A gap is only actionable if a recoverable label
117
+ # exists for the concept's slot (value display/originalText for value-slot
118
+ # contexts). If there is neither a code NOR a label (e.g. dataAbsentReason
119
+ # with no value text/note), there is nothing to fill -> not a gap.
120
+ if not concept_term(stmt):
121
+ return None
119
122
  if _has_nullflavor(stmt):
120
123
  return SnomedGapPattern.NULLFLAVOR
121
- if concept_term(stmt):
122
- if "/text" in (stmt.source_ref or ""):
123
- return SnomedGapPattern.NARRATIVE_ONLY
124
- return SnomedGapPattern.DISPLAY_ONLY
125
- return None
124
+ if "/text" in (stmt.source_ref or ""):
125
+ return SnomedGapPattern.NARRATIVE_ONLY
126
+ return SnomedGapPattern.DISPLAY_ONLY
126
127
 
127
128
 
128
129
  # --------------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aimedicalcoding
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: Detect missing/broken clinical codes (LOINC / SNOMED CT / RxNorm / ICD-10-CM / CVX) in CCDA and FHIR documents, with recovery evidence
5
5
  Author: Aakash Kag, Vinay Shankar Miryala, Siva Karthik, Mohammed Rayaan
6
6
  License: MIT
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="aimedicalcoding",
5
- version="0.3.8",
5
+ version="0.3.9",
6
6
  author="Aakash Kag, Vinay Shankar Miryala, Siva Karthik, Mohammed Rayaan",
7
7
  description=(
8
8
  "Detect missing/broken clinical codes (LOINC / SNOMED CT / RxNorm / "
File without changes