Files
vigilcare-clinical/VigilCare.Simulator/Mimic/MimicItemMap.cs
T

111 lines
4.1 KiB
C#

public static class MimicItemMap
{
public record ChartItemMapping(
string Code, string Unit, string Source,
int Priority = 0,
bool ConvertFahrenheit = false);
public record LabItemMapping(string Code, string Unit);
private static readonly Dictionary<int, ChartItemMapping> ChartMappings = new()
{
[220045] = new("HEART_RATE", "bpm", "Device"),
[220210] = new("RESP_RATE", "/min", "Device"),
[220179] = new("SYSTOLIC_BP", "mmHg", "Device"),
[220180] = new("DIASTOLIC_BP", "mmHg", "Device"),
[220050] = new("SYSTOLIC_BP", "mmHg", "Device", Priority: 1),
[220051] = new("DIASTOLIC_BP", "mmHg", "Device", Priority: 1),
[223762] = new("TEMP_C", "°C", "Manual"),
[223761] = new("TEMP_C", "°C", "Manual", ConvertFahrenheit: true),
[220277] = new("SPO2", "%", "Device"),
[223835] = new("FIO2_PCT", "%", "Device"),
[220739] = new("GCS_EYE", "score", "Manual"),
[223900] = new("GCS_VERBAL", "score", "Manual"),
[223901] = new("GCS_MOTOR", "score", "Manual"),
[220615] = new("CREATININE_MG_DL", "mg/dL", "Lab"),
[225690] = new("BILIRUBIN_MG_DL", "mg/dL", "Lab"),
[225678] = new("PLATELET_K_UL", "k/µL", "Lab"),
[220224] = new("PAO2_MMHG", "mmHg", "Lab"),
};
private static readonly Dictionary<int, LabItemMapping> LabMappings = new()
{
[50912] = new("CREATININE_MG_DL", "mg/dL"),
[51704] = new("PLATELET_K_UL", "k/µL"),
[50885] = new("BILIRUBIN_MG_DL", "mg/dL"),
[50813] = new("LACTATE_MMOL_L", "mmol/L"),
[51301] = new("WBC_K_UL", "k/µL"),
[50971] = new("POTASSIUM_MEQ_L", "mEq/L"),
[50931] = new("GLUCOSE_MG_DL", "mg/dL"),
[50821] = new("PAO2_MMHG", "mmHg"),
};
// GCS text → numeric fallback (in case valuenum is missing)
private static readonly Dictionary<string, int> GcsEyeText = new(StringComparer.OrdinalIgnoreCase)
{
["None"] = 1, ["No Response"] = 1,
["To Pain"] = 2,
["To Speech"] = 3,
["Spontaneously"] = 4,
};
private static readonly Dictionary<string, int> GcsVerbalText = new(StringComparer.OrdinalIgnoreCase)
{
["No Response"] = 1, ["No Response-ETT"] = 1,
["Incomprehensible sounds"] = 2, ["Incomprehensible Sounds"] = 2,
["Inappropriate Words"] = 3,
["Confused"] = 4,
["Oriented"] = 5,
};
private static readonly Dictionary<string, int> GcsMotorText = new(StringComparer.OrdinalIgnoreCase)
{
["No response"] = 1, ["No Response"] = 1,
["Abnormal extension"] = 2, ["Abnormal Extension"] = 2,
["Abnormal Flexion"] = 3,
["Flex-withdraws"] = 3, ["Flex-Withdraws"] = 3,
["Localizes Pain"] = 4,
["Obeys Commands"] = 6,
};
public static readonly HashSet<int> AllChartItemIds = new(ChartMappings.Keys);
public static readonly HashSet<int> AllLabItemIds = new(LabMappings.Keys);
public static bool TryMapChartEvent(int itemId, out ChartItemMapping mapping)
=> ChartMappings.TryGetValue(itemId, out mapping!);
public static bool TryMapLabEvent(int itemId, out LabItemMapping mapping)
=> LabMappings.TryGetValue(itemId, out mapping!);
public static decimal ConvertValue(decimal rawValue, ChartItemMapping mapping)
{
if (mapping.ConvertFahrenheit)
return Math.Round((rawValue - 32m) * 5m / 9m, 1);
return rawValue;
}
public static decimal? ResolveGcsValue(int itemId, string? textValue, decimal? numericValue)
{
if (numericValue.HasValue && numericValue.Value > 0)
return numericValue.Value;
if (string.IsNullOrWhiteSpace(textValue))
return null;
var lookup = itemId switch
{
220739 => GcsEyeText,
223900 => GcsVerbalText,
223901 => GcsMotorText,
_ => null
};
if (lookup is not null && lookup.TryGetValue(textValue, out var score))
return score;
return null;
}
public static bool IsGcsItem(int itemId) => itemId is 220739 or 223900 or 223901;
}