#! /bin/sh # file: make-pbi G. Moody 5 March 2008 # Last revised: 24 May 2013 # # If the PhysioBank Index is out-of-date, this script rebuilds and reloads it # into the PhysioBank Simple Query Server (pbsqs), starting pbsqs if needed. # Otherwise, it checks to see if pbsqs is running, restarts it if needed, and # does nothing else. # # Rebuilding the entire index from scratch may require several hours. The # processing is input-bound since each .hea and each annotation file must be # read, but they can be parsed very quickly. If multiple copies of the data # on different physical devices are available, it's easy to parallelize the # process by building two or more single-collection indices simultaneously, # but this won't help if all of the inputs are located on the same device. BINDIR=/usr/local/bin PBDIR=/home/physionet/html/physiobank/database PATH=$BINDIR:$PATH:/sbin export PATH UPDATE=0 cd $PBDIR # Update the single-collection indices as needed. for D in `wfdbcat DBS | cut -f 1` do I=`echo $D | sed s+/+_+g` # If a collection's RECORDS list is newer than its index, update the index. if [ $D/RECORDS -nt pbi/$I ] then ( # The order of records in the index is important! Don't change the # next line, which determines the record order. (The search # algorithm exploits the ordering for speed; the server checks the # record order when loading the index and refuses to run if it # finds sorting errors.) for R in `wfdbcat $D/RECORDS | LC_ALL=C sort` do echo $D/$R case $D in mimic2db) T=`echo $R | cut -c 1-6`T echo $D/${R}${T} ;; mimic2wdb/3*) N=`basename $R`n echo $D/$R$N ;; esac done ) | pbindex >/tmp/pbi-$I-$$ 2>/tmp/pbi-errors-$I-$$ mv -f /tmp/pbi-$I-$$ pbi/$I if [ -s /tmp/pbi-errors-$I-$$ ] then mv -f /tmp/pbi-errors-$I-$$ /tmp/pbi-errors-$I else rm -f /tmp/pbi-errors-$I-$$ fi UPDATE=1 fi done case $UPDATE in 0) # The index is up-to-date already -- just restart the PhysioBank Simple # Query Server if it isn't running. pidof pbsqsd >/dev/null || ( pbsqsd; echo pbsqsd restarted ) ;; 1) # An update is needed. First, save the most recent version of the index. mv physiobank-index physiobank-index~ # Rebuild the index from the single-collection indices. Note that the # indices are ordered using the same sort as for the records within each # index. for D in `wfdbcat DBS | cut -f 1 | LC_ALL=C sort | sed s+/+_+g` do cat pbi/$D >>physiobank-index done echo PhysioBank Index updated # Force the server to reload the index, or start the server if needed. killall -HUP pbsqsd 2>/dev/null || ( pbsqsd; echo pbsqsd restarted ) # Give the server a chance to start loading the index. sleep 2 # Regenerate the list of all records known to the server by querying it. # This list is needed by 'pbs-not'. pbsqsc "record ?" >RECORDS-ALL ;; esac