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

192 lines
7.8 KiB
C#

public record MimicPatient(int SubjectId, string Gender, int AnchorAge, int AnchorYear, string? Dod);
public record MimicAdmission(
int SubjectId, int HadmId,
DateTime AdmitTime, DateTime DischTime, DateTime? DeathTime,
string AdmissionType, string? AdmissionLocation, string? DischargeLocation,
int HospitalExpireFlag);
public record MimicIcuStay(
int SubjectId, int HadmId, int StayId,
string FirstCareUnit, string LastCareUnit,
DateTime InTime, DateTime OutTime, decimal Los);
public record MimicChartEvent(
int StayId, DateTime ChartTime, int ItemId,
string? TextValue, decimal? ValueNum);
public record MimicLabEvent(
int HadmId, DateTime ChartTime, int ItemId,
decimal? ValueNum, string? ValueUom);
public record MimicPrescription(
int HadmId, DateTime StartTime,
string Drug, string? DoseValRx, string? DoseUnitRx, string? Route);
public class MimicDataLoader
{
private readonly string _dataDir;
public MimicDataLoader(string dataDir)
{
if (!Directory.Exists(dataDir))
throw new DirectoryNotFoundException($"MIMIC data directory not found: {dataDir}");
_dataDir = dataDir;
}
private string Path(string fileName) => System.IO.Path.Combine(_dataDir, fileName);
public List<MimicPatient> LoadPatients()
{
return MimicCsvReader.ReadAll(Path("patients.csv"), (f, h) =>
{
var id = MimicCsvReader.ColInt(f, h, "subject_id");
var age = MimicCsvReader.ColInt(f, h, "anchor_age");
var year = MimicCsvReader.ColInt(f, h, "anchor_year");
if (id is null || age is null || year is null) return null;
return new MimicPatient(
id.Value,
MimicCsvReader.Col(f, h, "gender"),
age.Value,
year.Value,
MimicCsvReader.Col(f, h, "dod") is { Length: > 0 } dod ? dod : null);
});
}
public List<MimicAdmission> LoadAdmissions()
{
return MimicCsvReader.ReadAll(Path("admissions.csv"), (f, h) =>
{
var subjectId = MimicCsvReader.ColInt(f, h, "subject_id");
var hadmId = MimicCsvReader.ColInt(f, h, "hadm_id");
var admitTime = MimicCsvReader.ColDateTime(f, h, "admittime");
var dischTime = MimicCsvReader.ColDateTime(f, h, "dischtime");
if (subjectId is null || hadmId is null || admitTime is null || dischTime is null)
return null;
return new MimicAdmission(
subjectId.Value, hadmId.Value,
admitTime.Value, dischTime.Value,
MimicCsvReader.ColDateTime(f, h, "deathtime"),
MimicCsvReader.Col(f, h, "admission_type"),
MimicCsvReader.Col(f, h, "admission_location") is { Length: > 0 } loc ? loc : null,
MimicCsvReader.Col(f, h, "discharge_location") is { Length: > 0 } dloc ? dloc : null,
MimicCsvReader.ColInt(f, h, "hospital_expire_flag") ?? 0);
});
}
public List<MimicIcuStay> LoadIcuStays()
{
return MimicCsvReader.ReadAll(Path("icustays.csv"), (f, h) =>
{
var subjectId = MimicCsvReader.ColInt(f, h, "subject_id");
var hadmId = MimicCsvReader.ColInt(f, h, "hadm_id");
var stayId = MimicCsvReader.ColInt(f, h, "stay_id");
var inTime = MimicCsvReader.ColDateTime(f, h, "intime");
var outTime = MimicCsvReader.ColDateTime(f, h, "outtime");
if (subjectId is null || hadmId is null || stayId is null
|| inTime is null || outTime is null)
return null;
return new MimicIcuStay(
subjectId.Value, hadmId.Value, stayId.Value,
MimicCsvReader.Col(f, h, "first_careunit"),
MimicCsvReader.Col(f, h, "last_careunit"),
inTime.Value, outTime.Value,
MimicCsvReader.ColDecimal(f, h, "los") ?? 0m);
});
}
public IEnumerable<MimicChartEvent> StreamChartEvents(int stayId)
{
var stayIdStr = stayId.ToString();
return MimicCsvReader.Read(
Path("chartevents.csv"),
parser: (f, h) =>
{
var itemId = MimicCsvReader.ColInt(f, h, "itemid");
if (itemId is null || !MimicItemMap.AllChartItemIds.Contains(itemId.Value))
return null;
var chartTime = MimicCsvReader.ColDateTime(f, h, "charttime");
if (chartTime is null) return null;
var valueNum = MimicCsvReader.ColDecimal(f, h, "valuenum");
var textValue = MimicCsvReader.Col(f, h, "value");
if (MimicItemMap.IsGcsItem(itemId.Value))
{
var gcsVal = MimicItemMap.ResolveGcsValue(itemId.Value, textValue, valueNum);
if (gcsVal is null) return null;
return new MimicChartEvent(stayId, chartTime.Value, itemId.Value, textValue, gcsVal);
}
if (valueNum is null) return null;
return new MimicChartEvent(stayId, chartTime.Value, itemId.Value, textValue, valueNum);
},
filter: (f, h) =>
{
var sid = MimicCsvReader.Col(f, h, "stay_id");
return sid == stayIdStr;
});
}
public IEnumerable<MimicLabEvent> StreamLabEvents(int hadmId, DateTime? after = null, DateTime? before = null)
{
var hadmIdStr = hadmId.ToString();
return MimicCsvReader.Read(
Path("labevents.csv"),
parser: (f, h) =>
{
var itemId = MimicCsvReader.ColInt(f, h, "itemid");
if (itemId is null || !MimicItemMap.AllLabItemIds.Contains(itemId.Value))
return null;
var chartTime = MimicCsvReader.ColDateTime(f, h, "charttime");
if (chartTime is null) return null;
if (after.HasValue && chartTime.Value < after.Value) return null;
if (before.HasValue && chartTime.Value > before.Value) return null;
var valueNum = MimicCsvReader.ColDecimal(f, h, "valuenum");
if (valueNum is null) return null;
return new MimicLabEvent(
hadmId, chartTime.Value, itemId.Value, valueNum,
MimicCsvReader.Col(f, h, "valueuom") is { Length: > 0 } uom ? uom : null);
},
filter: (f, h) =>
{
var hid = MimicCsvReader.Col(f, h, "hadm_id");
return hid == hadmIdStr;
});
}
public IEnumerable<MimicPrescription> StreamPrescriptions(
int hadmId, DateTime? after = null, DateTime? before = null)
{
var hadmIdStr = hadmId.ToString();
return MimicCsvReader.Read(
Path("prescriptions.csv"),
parser: (f, h) =>
{
var startTime = MimicCsvReader.ColDateTime(f, h, "starttime");
if (startTime is null) return null;
if (after.HasValue && startTime.Value < after.Value) return null;
if (before.HasValue && startTime.Value > before.Value) return null;
var drug = MimicCsvReader.Col(f, h, "drug");
if (string.IsNullOrWhiteSpace(drug)) return null;
return new MimicPrescription(
hadmId, startTime.Value, drug,
MimicCsvReader.Col(f, h, "dose_val_rx") is { Length: > 0 } d ? d : null,
MimicCsvReader.Col(f, h, "dose_unit_rx") is { Length: > 0 } u ? u : null,
MimicCsvReader.Col(f, h, "route") is { Length: > 0 } r ? r : null);
},
filter: (f, h) =>
{
var hid = MimicCsvReader.Col(f, h, "hadm_id");
return hid == hadmIdStr;
});
}
}