Files

51 lines
2.2 KiB
C#

public static class LoincCodeMapper
{
// LOINC → internal observation code. Covers all codes in DataSeeder + PlausibilityValidator.
private static readonly Dictionary<string, LoincMapping> _map = new(StringComparer.OrdinalIgnoreCase)
{
["8867-4"] = new("HEART_RATE", "/min"),
["8310-5"] = new("TEMP_C", "Cel", AllowFahrenheit: true),
["2823-3"] = new("POTASSIUM_MEQ_L", "mmol/L"),
["2708-6"] = new("SPO2", "%"),
["9279-1"] = new("RESP_RATE", "/min"),
["6690-2"] = new("WBC_K_UL", "10*3/uL"),
["8480-6"] = new("SYSTOLIC_BP", "mm[Hg]"),
["8462-4"] = new("DIASTOLIC_BP", "mm[Hg]"),
["2524-7"] = new("LACTATE_MMOL_L", "mmol/L"),
["2339-0"] = new("GLUCOSE_MG_DL", "mg/dL"),
["777-3"] = new("PLATELET_K_UL", "10*3/uL"),
["1975-2"] = new("BILIRUBIN_MG_DL", "mg/dL"),
["2160-0"] = new("CREATININE_MG_DL", "mg/dL"),
["2703-7"] = new("PAO2_MMHG", "mm[Hg]"),
["3150-0"] = new("FIO2_PCT", "%"),
["9187-6"] = new("URINE_OUTPUT_ML_H", "mL/h"),
// GCS — often sent as panel with components; also map individual LOINC codes used by some EHRs
["80288-7"] = new("GCS_EYE", "{score}"),
["80289-5"] = new("GCS_VERBAL", "{score}"),
["80290-3"] = new("GCS_MOTOR", "{score}"),
};
// SNOMED CT fallbacks for non-LOINC sites
private static readonly Dictionary<string, LoincMapping> _snomedMap = new(StringComparer.OrdinalIgnoreCase)
{
["364075005"] = new("HEART_RATE", "/min"),
["431314004"] = new("SPO2", "%"),
["86290005"] = new("RESP_RATE", "/min"),
};
public static bool TryMap(string system, string code, out LoincMapping mapping)
{
if (system.Contains("loinc", StringComparison.OrdinalIgnoreCase) &&
_map.TryGetValue(code, out mapping!))
return true;
if (system.Contains("snomed", StringComparison.OrdinalIgnoreCase) &&
_snomedMap.TryGetValue(code, out mapping!))
return true;
mapping = null!;
return false;
}
public static IReadOnlyCollection<string> SupportedLoincCodes => _map.Keys;
}