Heartprints - A Dynamical Portrait of Cardiac Arrhythmia 1.0.0

File: <base>/src/hp_rrlist (4,269 bytes)
#!/bin/sh
# file: hp_rrlist
#
# Create a heartprint from an RR interval list
#
# This script invokes hp_scatter and hp_hist to generate the histograms, and
# then generates a heartprint from them using imageplt and plt.
 
AWK=awk
FREQ=128;
LWCAT=:
NNMAX=2
NNMIN=0.3
PLTOUT=""
RRLIST=""

# Override defaults with user-specified values 
while [ $# -gt 0 ]
do
  case $1 in
    -F) FREQ=$2; shift ;;
    -i) RRLIST=$2; shift ;;
    -m) userNNMIN=$2; shift ;;
    -M) userNNMAX=$2; shift ;;
    -T) case $2 in
          eps|pdf|png|ps) PLTOUT="-T lw"; LWCAT="lwcat -$2"; shift ;;
	esac ;;
    -*)    cat <<EOF
usage: $0 [ OPTIONS ... ] 
 create a heartprint from a list of RR intervals and beat labels
 OPTIONS may include:
  -h        print (this) usage summary
  -i FILE   read intervals from FILE (default: standard input)
  -m NNmin  discard NN intervals less than NNmin
  -M NNmax  discard NN intervals greater than NNmax
  -F FREQ   the original sampling rate, in Hz (default: 128)
  -T FORMAT write to the standard output in the specified FORMAT
            (FORMAT may be eps, pdf, png, or ps;  if the -T option
            is not used, the output will appear on-screen)
EOF
        exit 1 ;;
  esac
  shift
done

# temporary files
HFILE=$RRLIST.hist
SFILE=$RRLIST.scatter
TFILES="$HFILE $SFILE"

# if reading from standard input, capture it in a temporary file
if [ x$RRLIST = x ]
then
  RRLIST=rrlist.$$
  cat >$RRLIST
  TFILES="$TFILES $RRLIST"
fi
    
# determine the file length and histogram bin size
RRLIST_LEN=`wc -l $RRLIST | $AWK '{ print $1 }'`
BINSIZE=`echo $FREQ | awk '{print 1/$FREQ}'`

if [ x$userNNMIN = x -o x$userNNMAX = x ]
# the user did not specify both min and max values
then 
  # autoscale by running the program once to generate a histogram 
  hp_scatter $RRLIST $NNMIN $NNMAX $BINSIZE $RRLIST_LEN >$SFILE
  hp_hist $SFILE $NNMIN $NNMAX $BINSIZE >/dev/null 

  # eliminate bins with fewer than five members 
  MINBIN=5.0
  $AWK "{if (\$2 > $MINBIN) print \$1,\$2}" $SFILE.hist_rr >tempoutfile.$$

  # assign NNMIN and NNMAX to the lowest and highest remaining values
  NNMIN=`head -1 tempoutfile.$$ | $AWK '{ print $1 }'`
  NNMAX=`tail -1 tempoutfile.$$ | $AWK '{ print $1 }'`
  rm tempoutfile.$$
fi

if test "$userNNMIN" 
then NNMIN=$userNNMIN
fi

if test "$userNNMAX"
then NNMAX=$userNNMAX
fi

# run the program with the NNMIN and NNMAX determined either by autoscale or
# user override
hp_scatter $RRLIST $NNMIN $NNMAX $BINSIZE $RRLIST_LEN >$SFILE
hp_hist $SFILE $NNMIN $NNMAX $BINSIZE >$HFILE 

# temporary files containing histogram information used in the plotting
VVHIST=./$SFILE.hist_Tv
NIBHIST=./$SFILE.hist_nib
CIHIST=./$SFILE.hist_coup
NNHIST=./$SFILE.hist_rr
VVSC=./$SFILE.rrTv
NIBSC=./$SFILE.rrnib
CISC=./$SFILE.rrcoup
TFILES="$TFILES $VVHIST $NIBHIST $CIHIST $NNHIST $VVSC $NIBSC $CISC"

# begin the plt code
(
$AWK 'BEGIN{old=0;}{print $1, old;print $1, 0;print $1, $2;old=$2;}' $VVHIST |
plt $PLTOUT 0 1 -F"
sf t Ft-i P18
t ""
X (P14) 0 10
s Xt
s Yt
sf a P10 
W 0.205 0.65 0.435 0.92
B 0. 0. 1 1" 

$AWK '{print $1-0.5, $2; print $1+0.5, $2; print $1+0.5, 0;}' $NIBHIST |
plt $PLTOUT 0 1 -F"
sf t Ft-i P18
t ""
X 0 15
W 0.48 0.65 0.71 0.92
B 0. 0. 1 1
xa (P14) -0.5 15.5 1 - 5 -
sf a P10
s e
s Xt
s Yt"

$AWK 'BEGIN{old=0}{print $1, old; print $1, 0; print $1, $2;old=$2;}' $CIHIST |
plt $PLTOUT 0 1 -F"
sf t Ft-i P18
t ""
X (P14) 0.25 1.25
W 0.755 0.65 0.985 0.92 
B 0. 0. 1 1
sf a P10
s e
s Xt
s Yt"

$AWK 'BEGIN{old=0}{print old, $1;print 0, $1; print $2, $1;old=$2;}' $NNHIST |
plt $PLTOUT 0 1 -F"
y Sinus RR Interval[s] 
W 0.08 0.1 0.165 0.57
B 0. 0. 1 1
t ''
#xa - - 1000  -  5  -
#ya (P12) $2 $3  -   -  -  -
s e
s x
s Xt"  

read a b <$VVSC
imageplt -d $a $b -x 0 10 $VVSC | plt $PLTOUT 0 1 2 -F"
p c
W 0.205 0.1 0.435 0.57
B 0.   0.   1    1
t ""
xa 0 10 1 - 2 -
x VV-Interval[s]
s e
s Y
s n"

read a b <$NIBSC
imageplt -d $a $b -x -0.5 14.5 $NIBSC | plt $PLTOUT 0 1 2 -F"
p c
X 0 15
W 0.48 0.1 0.71 0.57 
B 0. 0. 1 1
t ""
xa -0.5  15.5  1  -  5  -
x NIB
s e
s Y
s n" 

read a b <$CISC
imageplt -d $a $b -x 0.25 1.25 $CISC | plt $PLTOUT 0 1 2 -F"
p c
W 0.755 0.1 0.985 0.57
B 0. 0. 1 1
t ""
xa 0.25 1.25 0.1 - 2 -
x Coupling Interval[s]
s e
s Y
s n" 
) | $LWCAT

# Remove temporary files
rm -f $TFILES NN_intervals