Predicting Acute Hypotensive Episodes: The PhysioNet/Computing in Cardiology Challenge 2009 1.0.0

File: <base>/ahe-detect-1.0/findahe.c (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");
}