mirror of
https://github.com/This-weiyuqing/ECG_by_Diffenert_CNN_Test.git
synced 2026-10-19 03:43:39 +08:00
160 lines
4.0 KiB
C
160 lines
4.0 KiB
C
/* 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\\-");
|
|
}
|