Created
February 11, 2014 13:01
-
-
Save sgsfak/8934431 to your computer and use it in GitHub Desktop.
Parses an SCP-ECG file and prints the demographics/data acquisition information (in Section 1)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var fs = require('fs') | |
var DEBUG = true; | |
var log = console.log; | |
if (!DEBUG) | |
log = function() {}; | |
function parse_scp_time(fval) { | |
var hour = fval.readInt8(0); | |
var min = fval.readInt8(1); | |
var sec = fval.readInt8(2); | |
return hour + ":" + min + ":" + sec; | |
} | |
function parse_scp_date(fval) { | |
var year = fval.readUInt16LE(0); | |
var month = fval.readInt8(2); | |
var day = fval.readInt8(3); | |
return day + "/" + month + "/"+ year; | |
} | |
function parse_scp_ecg_demo(b) { | |
var secHdrLen = 16; | |
var ptrFldLen = 2 + 4 + 4; // Section Number | Section Length | Index to section | |
var section0_start = 6; | |
var section0_data_start = section0_start + secHdrLen; | |
var ptrFld1_start = section0_data_start + ptrFldLen; // Move over Section0 pointer field | |
var section1_len = b.readUInt32LE(ptrFld1_start + 2); | |
var section1_start = b.readUInt32LE(ptrFld1_start + 2 + 4)-1; // It appers to be 1-based not 0-based pointer | |
var section1_end = section1_start+section1_len; | |
// var section1_hdr = b.slice(section1_start, section1_start +secHdrLen); | |
// var section1_data = b.slice(section1_start+secHdrLen, section1_end); | |
// log('== Section ' + section1_hdr.readUInt16LE(2)); | |
var fstart = section1_start + secHdrLen; | |
var js = {}; | |
while (fstart < section1_end) { | |
var tag = b.readUInt8(fstart); | |
if (tag == 255) { | |
// log('Found Demographic section terminator!'); | |
break; | |
} | |
var flen = b.readUInt16LE(fstart+1); | |
var val_start = fstart + 3; | |
var fval= b.slice(val_start, val_start+flen); | |
var val_str = fval.slice(0, flen-1).toString(); // Strings are null terminated! | |
var val_int = b.readUInt16LE(val_start); | |
var val_b = b.readUInt8(val_start); | |
//log(tag + " (" + flen + ") ==>" + b.readInt8(val_start)); | |
switch (tag) { | |
case 0: log('Last name: ' + val_str); js.lname = val_str; break; | |
case 1: log('First name: ' + val_str); js.fname = val_str; break; | |
case 2: log('Patient ID: ' + val_str); js.patid = val_str; break; | |
case 3: log('2nd Last name: ' + val_str); break; | |
case 4: log('Age: ' + val_int); js.age = val_int; break; | |
case 5: log('DoB: ' + parse_scp_date(fval)); break; | |
case 6: log('Height: ' + val_int + "cm"); js.height = val_int; break; | |
case 7: log('Weight: ' + val_int + "kg"); js.weight = val_int; break; | |
case 8: log('Sex: ' + (val_b==1? "Male" : (val_b==2 ? "Female" : "Other"))); break; | |
case 11: log('Sys Pressure: ' + val_int + "mmHg"); js.syspres = val_int; break; | |
case 12: log('Dia Pressure: ' + val_int + "mmHg"); js.diapres = val_int; break; | |
case 25: log('Date of Acq. : ' + parse_scp_date(fval)); break; | |
case 26: log('Time of Acq. : ' + parse_scp_time(fval)); break; | |
default: | |
//log(tag + " (" + flen + ") ==>" + val_str); | |
} | |
fstart = fstart + 3 + flen; | |
} | |
return js; | |
} | |
var fns = ['ECGSamples/scp_redred/P120N00.scp']; | |
var args = process.argv.slice(2); | |
if (args.length > 0) | |
fns = args; | |
fns.forEach(function(fn) { | |
fs.readFile(fn, function (err, data) { | |
if (err) | |
throw err; | |
log("====== " + fn ); | |
var js = parse_scp_ecg_demo(data); | |
if (!DEBUG) { | |
console.log(fn +"==> " + JSON.stringify(js)); | |
} | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment