#!/usr/bin/perl # file: plot_waveforms.pm G. Moody 11 March 2009 # Last revised: 8 March 2012 # _____________________________________________________________________________ # plot_waveforms module for PhysioBank's Automated Teller Machine # Copyright (C) 2009-2012 George B. Moody sub mod_plot_waveforms { # Exit immediately if no output is possible. unless ($slist[0]) { show_html("no-samples"); return; } # Set defaults. $gflag = "-G"; $mflag = "-M"; $sm = 4; $ts = 25; $pw = 300; $tend = $tstart + 10; # Adjust options based on user's choices of signal, length, and time format. if ($dt > 10) { $ts = 5; $pw = 360; $tend = $tstart + 60; } if ($dt > 60) { $gflag = "-l"; # suppress grid $mflag = "-M0"; # suppress marker bars $sm = 0; # suppress scales $ts = 0.07; $tend = $tstart + 3600; } if ($dt > 3600 && $sfreq <= 2) { $ts = 0.005; $tend = $tstart + 43200; } $tm = 2; # default: time/date if available, otherwise elapsed time if ($tfmt eq "elapsed time") { $tm = 1; } # Set the path, URL, and final output filenames and URLs for this request. $wd = "chart/$ts/$tm"; $wu = "$baseurl/$wd"; $wp = "$basepath/$wd"; $script = "$wp/script"; $ps = "$wp/chart.ps"; $png = "$wp/chart.png"; # If results for this request are already in the cache, return them. if (-s $png && -s $ps && -s $script) { mod_plot_waveforms_out(); return; } # Create the working directory for this request. mkpath($wp); # Make temporary filenames. $tscript = "$wp/$$.script"; $tps = "$wp/$$.ps"; $tpng = "$wp/$$.png"; # Create a script for pschart. open(SCRIPT, ">$tscript"); print SCRIPT "$database/$record $tstart-$tend\n"; close(SCRIPT); # Create and save the PostScript chart. unless (fork) { open(STDOUT, ">$tps"); if (defined $signal_num) { exec($PSCHART, "-a", $annotator, "-c", "", "-C", "-E", $gflag, "-CG", "1", ".5", ".5", "-Cs", "0", "0", "0", "-H", "-l", "-P", $pw . "x100", # -P must precede -m "-m", "20", "20", "5", "5", $mflag, "-n", "0", "-s", $signal_num, "-S", $sm, $tm, "-t", $ts, "-T", "", "-v", "10", "-w", "0.5", $tscript); } else { exec($PSCHART, "-a", $annotator, "-c", "", "-C", "-E", $gflag, "-CG", "1", ".5", ".5", "-Cs", "0", "0", "0", "-H", "-l", "-P", $pw . "x250", # -P must precede -m "-m", "20", "20", "5", "5", $mflag, "-n", "0", "-S", $sm, $tm, "-t", $ts, "-T", "", "-v", "10", "-w", "0.5", $tscript); } } # When pschart is finished, check if it wrote anything. wait; if (-s $tps) { # pschart was successful! # Convert the PostScript to PNG. unless (fork) { exec($CONVERT, "-density", "100x100", $tps, $tpng); } # Wait for convert to finish writing the PNG file. wait; } if (-s $script) { # there was a race, and this process lost! unlink($tscript); } else { rename($tscript, $script); } if (-s $ps) { unlink($tps); } else { rename($tps, $ps); } if (-s $png) { unlink($tpng); } else { rename($tpng, $png); } mod_plot_waveforms_out(); } sub mod_plot_waveforms_out { # Show the commands and the chart. if (-s $png) { print "\n" . 'The output below was prepared using these', ' commands:
' . "\n" . '
pschart -a ';
	if ($annotator) { print $annotator; }
	else { print '""'; }
	print ' -c "" -C -E ', $gflag, ' -CG 1 .5 .5 -Cs 0 0 0 -H -l',
	      ' -P ', $pw . "x250 -m 20 20 5 5 $mflag -n 0 \\\n";
	if (defined $signal_num) {
	    print " -s '$signal_num' \n";
	}
	print " -S $sm $tm -t $ts" . ' -T "" -v 10 -w 0.5 ' . "\n",
	"script" . "\n",
	" >chart.ps
" . "\n"; print '' . "\n" . 'convert -density 100x100 chart.ps' . "\n", " chart.png" . "\n" . "

"; print "
" . "\n"; } else { show_html("no-samples"); } } 1;