bluebutton
Version:
BlueButton.js helps developers navigate complex health data with ease.
88 lines (72 loc) • 2.88 kB
JavaScript
/*
* Parser for the C32 results (labs) section
*/
Parsers.C32.results = function (c32) {
var parseDate = Documents.parseDate;
var parseName = Documents.parseName;
var parseAddress = Documents.parseAddress;
var data = [], el;
var results = c32.section('results');
results.entries().each(function(entry) {
el = entry.tag('effectiveTime');
var panel_date = parseDate(entry.tag('effectiveTime').attr('value'));
if (!panel_date) {
panel_date = parseDate(entry.tag('effectiveTime').tag('low').attr('value'));
}
// panel
el = entry.tag('code');
var panel_name = el.attr('displayName'),
panel_code = el.attr('code'),
panel_code_system = el.attr('codeSystem'),
panel_code_system_name = el.attr('codeSystemName');
var observation;
var tests = entry.elsByTag('component');
var tests_data = [];
for (var i = 0; i < tests.length; i++) {
observation = tests[i];
// sometimes results organizers contain non-results. we only want tests
if (observation.template('2.16.840.1.113883.10.20.1.31').val()) {
var date = parseDate(observation.tag('effectiveTime').attr('value'));
el = observation.tag('code');
var name = el.attr('displayName'),
code = el.attr('code'),
code_system = el.attr('codeSystem'),
code_system_name = el.attr('codeSystemName');
el = observation.tag('value');
var value = parseFloat(el.attr('value')),
unit = el.attr('unit');
el = observation.tag('referenceRange');
var reference_range_text = Core.stripWhitespace(el.tag('observationRange').tag('text').val()),
reference_range_low_unit = el.tag('observationRange').tag('low').attr('unit'),
reference_range_low_value = el.tag('observationRange').tag('low').attr('value'),
reference_range_high_unit = el.tag('observationRange').tag('high').attr('unit'),
reference_range_high_value = el.tag('observationRange').tag('high').attr('value');
tests_data.push({
date: date,
name: name,
value: value,
unit: unit,
code: code,
code_system: code_system,
code_system_name: code_system_name,
reference_range: {
text: reference_range_text,
low_unit: reference_range_low_unit,
low_value: reference_range_low_value,
high_unit: reference_range_high_unit,
high_value: reference_range_high_value,
}
});
}
}
data.push({
name: panel_name,
code: panel_code,
code_system: panel_code_system,
code_system_name: panel_code_system_name,
date: panel_date,
tests: tests_data
});
});
return data;
};