--- a +++ b/HRV.src/rrlist.c @@ -0,0 +1,220 @@ +/* rrlist.c Joe Mietus Apr 1 2011 */ + +/* rrlist.c Joe Mietus Oct 7 2008 */ + +/* +rrlist : +Usage: rrlist annotator tape [options] +options are : + [-f start] : begin at time 'start' + [-t end] : end at time 'end' + [-l length] : output for duration 'length' + [-n count] : output 'count' intervals + [-c] : output time in hh:mm:ss in first column + [-h] : output time in hours in first column + [-m] : output time in minutes in first column + [-s] : output time in seconds in first column + [-e] : output elapsed time from start + [-a annotation] : list only intervals between consecutive annotations + [-r] : output ratio of specified annotation intervals to RR intervals + [-H] : high precision intervals (8 significant digits vs 3) + [-M] : output intervals in msec +*/ + +#include <stdio.h> +#include <wfdb/wfdb.h> +#include <wfdb/ecgmap.h> + + +main(argc, argv) +int argc; +char *argv[]; +{ + int i, nrr, nann, cnt, annotation; + int cflag, hflag, mflag, sflag, eflag, aflag, rflag, hipre, msec; + long start, end, length; + double sps; + struct WFDB_anninfo ai[1]; + struct WFDB_ann annot[2]; + + if (argc < 3) { + usage(argv[0]); + exit(1); + } + + nrr = nann = cnt = 0; + cflag = hflag = mflag = sflag = eflag = aflag = rflag = hipre = msec = 0; + start = end = length = 0L; + + sps = sampfreq(argv[2]); + ai[0].name = argv[1]; + ai[0].stat = WFDB_READ; + if (annopen(argv[2], ai, 1) < 0) + exit(2); + + for (i=2; ++i < argc && *argv[i] == '-'; ) { + switch(argv[i][1]) { + case 'f': start = strtim(argv[++i]); + break; + case 't': end = strtim(argv[++i]); + break; + case 'l': length = strtim(argv[++i]); + break; + case 'n': cnt = atoi(argv[++i]); + break; + case 'c': cflag = 1; + break; + case 'h': hflag = 1; + break; + case 'm': mflag = 1; + break; + case 's': sflag = 1; + break; + case 'e': eflag = 1; + break; + case 'a': annotation = strann(argv[++i]); + aflag = 1; + break; + case 'r': rflag = 1; + break; + case 'H': hipre = 1; + break; + case 'M': msec = 1; + break; + default: usage(argv[0]); + exit(1); + } + } + if (end == 0L && length != 0L) + end = start + length; + + if (iannsettime(start) < 0) + exit(2); + + if (!eflag) + start = 0L; + + while (getann(0, &annot[0]) >= 0) { + if (isqrs(annot[0].anntyp)) + nrr++; + if ((!aflag && isqrs(annot[0].anntyp)) || + (aflag && annot[0].anntyp == annotation)) + break; + } + nrr--; + + if (cnt != 0) { + while (getann(0, &annot[1]) >= 0 && (nann < cnt)) { + if ((!aflag && isqrs(annot[1].anntyp)) || + (aflag && annot[0].anntyp == annotation && + annot[1].anntyp == annotation)) { + + if (cflag) + printf("%s ", mstimstr(annot[1].time-start)); + else if (hflag) + printf("%.8f ", (annot[1].time-start)/(sps*3600)); + else if (mflag) + printf("%.6f ", (annot[1].time-start)/(sps*60)); + else if (sflag) + printf("%.3f ", (annot[1].time-start)/sps); + if (hipre) { + if(msec) + printf("%.5f %s\n", 1000*(annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + else + printf("%.8f %s\n", (annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + } + else { + if(msec) + printf("%.0f %s\n", 1000*(annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + else + printf("%.3f %s\n", (annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + } + nann++; + } + if (isqrs(annot[1].anntyp)) { + nrr++; + annot[0] = annot[1]; + } + } + if (nann < cnt) + fprintf(stderr, "%s: insufficient data points (n = %d)\n", + argv[0], nann); + } + + else { + while (getann(0, &annot[1]) >= 0 && + (annot[1].time <= end || end == 0L)) { + if ((!aflag && isqrs(annot[1].anntyp)) || + (aflag && annot[0].anntyp == annotation && + annot[1].anntyp == annotation)) { + + if (cflag) + printf("%s ", mstimstr(annot[1].time-start)); + else if (hflag) + printf("%.8f ", (annot[1].time-start)/(sps*3600)); + else if (mflag) + printf("%.6f ", (annot[1].time-start)/(sps*60)); + else if (sflag) + printf("%.3f ", (annot[1].time-start)/sps); + if (hipre) { + if(msec) + printf("%.5f %s\n", 1000*(annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + else + printf("%.8f %s\n", (annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + } + else { + if(msec) + printf("%.0f %s\n", 1000*(annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + else + printf("%.3f %s\n", (annot[1].time - annot[0].time)/sps, + annstr(annot[1].anntyp)); + } + nann++; + } + if (isqrs(annot[1].anntyp)) { + nrr++; + annot[0] = annot[1]; + } + } + } + if (rflag) { + if (nrr == -1) + nrr = 0; + fprintf(stderr, "%s%s : RR = %d : %d = %.3f\n", annstr(annotation), + annstr(annotation), nann, nrr, nrr==0 ? 0 : (float)nann/nrr); + } + + exit(0); +} + + +usage(prog) +char *prog; +{ + fprintf(stderr, "Usage: %s annotator tape [options]\n", prog); + fprintf(stderr, "options are :\n"); + fprintf(stderr, " [-f start] : begin at time 'start'\n"); + fprintf(stderr, " [-t end] : end at time 'end'\n"); + fprintf(stderr, " [-l length] : output for duration 'length'\n"); + fprintf(stderr, " [-n count] : output 'count' intervals\n"); + fprintf(stderr, " [-c] : output time in hh:mm:ss in first column\n"); + fprintf(stderr, " [-h] : output time in hours in first column\n"); + fprintf(stderr, " [-m] : output time in minutes in first column\n"); + fprintf(stderr, " [-s] : output time in seconds in first column\n"); + fprintf(stderr, " [-e] : output elapsed time from start\n"); + fprintf(stderr, " [-a annotation] : "); + fprintf(stderr, " list only intervals between consecutive annotations\n"); + fprintf(stderr, " [-r] : "); + fprintf(stderr, "output ratio of specified annotation intervals "); + fprintf(stderr, "to RR intervals\n"); + fprintf(stderr, " [-H] : high precision intervals "); + fprintf(stderr, "(8 significant digits vs 3)\n"); + fprintf(stderr, " [-M] : output intervals in msec\n"); +}