Predicting Acute Hypotensive Episodes: The PhysioNet/Computing in Cardiology Challenge 2009 1.0.0
(2,603 bytes)
#include <stdio.h>
#include <wfdb/wfdb.h>
tprint(double tin)
{
static char tstring[32];
WFDB_Time t = tin;
printf("\t%s", timstr(-t)); /* time and date */
printf(" %s", timstr(t)); /* elapsed time since start of record */
}
main(int argc, char **argv)
{
char buf[40], tstring[20], *p = buf;
static double map[30], m, msum;
double t;
static int i, j, h, n, spm, state, v;
spm = 60 * sampfreq(argv[1]); /* samples per minute */
if (spm <= 0.) exit(1);
printf("Episode\t.-----------Start------------.\t"
".----------- End ------------.\n");
printf("type \t time date elapsed\t"
" time date elapsed\n");
while (1) { /* process 1 minute of MAP per iteration, until end of data */
if (++i >= 30) i = 0;
if (map[i] > 60.0) n--; /* oldest MAP is normal */
else if (map[i] > 10.0) h--; /* oldest MAP is low */
else if (t > 30*spm) n--; /* assume invalid sample is normal */
for (j=v=0, msum = 0; j < spm && fgets(buf, sizeof(buf), stdin); j++) {
for (p = buf; *p; p++)
if (*p == '\t') {
m = atof(p+1);
break;
}
if (m > 0.0) { msum += m; v++; }
}
*p = '\0';
t = strtim(buf);
if (t < 0) t = -t; /* absolute times returned as < 0 */
if (j < spm) break; /* stop at end of data, discard remaining <60 sec */
if (v > 0) map[i] = msum/v;
else map[i] = 0;
if (map[i] > 60.0) n++; /* newest MAP is normal */
else if (map[i] > 10.0) h++; /* newest MAP is low */
else n++; /* assume invalid sample is normal */
// printf("state = %d, t = %s, map[%d] = %g, h = %d, n = %d, v = %d\n",
// state, timstr(-t), i, map[i], h, n, v);
switch (state) {
case 0: /* indeterminate state */
if (h >= 27) { /* hypotensive for >= 90% of last 30 minutes */
printf("AHE");
tprint(t > 30*spm ? t-30*spm : 1.0);
state = 1;
}
else if (n == 30) { /* normotensive for 100% of last 30 minutes */
printf(">60mmHg");
tprint(t > 30*spm ? t-30*spm : 1.0);
state = 2;
}
break;
case 1: /* hypotensive episode in progress */
// printf("t = %s, h = %d\n", timstr(-t), h);
if (h < 27) { /* episode has ended */
tprint(t-1); /* AHE definition last satisfied at t-1 */
printf("\n");
state = 0;
}
break;
case 2: /* normotensive episode in progress */
if (n < 30) { /* episode has ended */
tprint(t-2); /* first low MAP was at t-1, so last known
non-low was at t-2 */
printf("\n");
state = 0;
}
break;
}
}
if (state == 0)
printf("End");
tprint(t);
printf("\n");
}