#include #include 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"); }