--- a +++ b/mit-bih-arrhythmia-database-1.0.0/mitdbdir/src/dbtab.c @@ -0,0 +1,159 @@ +/* file: dbtab.c G. Moody 25 August 1988 + Last revised: 22 July 1992 +Add a line to the database summary table + +Copyright (C) Massachusetts Institute of Technology 1992. All rights reserved. + +This program generates tabular data that are eventually stuffed into a +tbl/troff format file to be printed in the MIT-BIH Arrhythmia Database +Directory. The code is *not* pretty. Sorry about that... +*/ + +#include <stdio.h> +#include <ecg/db.h> +#include <ecg/ecgmap.h> + +/* Rhythm codes. These may be rearranged arbitrarily, but the table rstring[] + must be kept in agreement. The order of these codes determines the order + in which rhythms are printed in the rhythm table. */ +#define NSR 1 +#define SBR 2 +#define BII 3 +#define PREX 4 +#define AB 5 +#define SVTA 6 +#define AFL 7 +#define AFIB 8 +#define PR 9 +#define NOD 10 +#define VBG 11 +#define VTG 12 +#define IVR 13 +#define VT 14 +#define VFL 15 + +#define MAXR 15 /* largest assigned rhythm code */ + +static char *rstring[] = { /* rhythm strings in DB annotation files */ + "", "N", "SBR", "BII", "PREX", + "AB", "SVTA", "AFL", "AFIB", "P", + "NOD", "B", "T", "IVR", "VT", + "VFL" }; + +/* Beat tables and counters: the number of beats of annotation type i during + the learning period (first 5 minutes) is ltab[i], and during the test period + (the remainder of the record) is ttab[i]; bstats() accumulates the sum of + all elements of ltab[] in lsum, and the sum of all elements of ttab[] in + tsum. */ +static long ltab[ACMAX+1], ttab[ACMAX+1], lsum, tsum; +static int tflag = 0; + +main(argc, argv) +int argc; +char *argv[]; +{ + int i, rhythm = 0; + long r0 = 0L; + static struct siginfo si[MAXSIG]; + struct anninfo af[1]; + struct ann annot; + static char *tape; + static long rtab[MAXR+2], rtime[MAXR+2], ttest; + +/* Check command-line arguments. */ + if (argc < 3) { + fprintf(stderr, "usage: %s annotator tape [-t]\n", argv[0]); + exit(1); + } + +/* Open the database files. */ + af[0].name = argv[1]; af[0].stat = READ; tape = argv[2]; + if (dbinit(tape, af, 1, si, MAXSIG) < 0) + exit(2); + +/* Initialize variables. */ + ttest = strtim("5:0"); + rtime[0] = strtim("0.5"); + for (i = 1; i <= MAXR; i++) + rtime[i] = rtime[0]; + +/* If specified, skip the learning period. */ + if (argc > 3 && strcmp("-t", argv[3]) == 0) { + tflag = 1; + r0 = ttest; + } +/* Read the annotation file. */ + while (getann(0, &annot) >= 0) { + + /* Count the annotation in the test or learning period as appropriate. */ + if (annot.time >= ttest) ttab[annot.anntyp]++; + else ltab[annot.anntyp]++; + + if (annot.anntyp == RHYTHM) { + if (rhythm) { /* This condition is true except for the first + rhythm label. For the second and subsequent + rhythm labels, update the number of episodes + and duration of the rhythm just ended. */ + if (annot.time > r0) { + rtab[rhythm]++; + rtime[rhythm] += annot.time - r0; + r0 = annot.time; + } + } + /* Identify the new rhythm. */ + for (i = 1, rhythm = MAXR+1; i <= MAXR; i++) + if (strcmp(annot.aux+2, rstring[i]) == 0) { + rhythm = i; + break; + } + } + } + +/* At the end of the annotation file, adjust the counter for the current + rhythm. */ + if (si[0].nsamp > annot.time) annot.time = si[0].nsamp; + if (rhythm) { + rtab[rhythm]++; + rtime[rhythm] += annot.time - r0; + } + + printf("%s", tape); + +/* Print the beat table. */ + bstats(NORMAL); + bstats(LBBB); + bstats(RBBB); + bstats(APC); + bstats(ABERR); + bstats(NPC); + bstats(SVPB); + bstats(PVC); + bstats(FUSION); + bstats(FLWAV); + bstats(AESC); + bstats(NESC); + bstats(VESC); + bstats(PACE); + bstats(PFUS); + bstats(NAPC); + bstats(UNKNOWN); + +/* Print the rhythm table. */ + for (i = 1; i <= MAXR; i++) + if (rtab[i] != 0L) + printf("\t%s", timstr(rtime[i])); + else + printf("\t\\-"); + printf("\n"); + exit(0); +} + + +bstats(i) /* print an entry in the beat table */ +int i; +{ + if (tflag) ltab[i] = 0L; + if (ltab[i] > 0L || ttab[i] > 0L) + printf("\t%ld", ltab[i]+ttab[i]); + else printf("\t\\-"); +}