The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! /usr/bin/perl

use warnings;
use strict;
use Bio::SeqIO;
use SVG;

my $USAGE = <<END_USAGE;
$0 <file>

This simple example script reads the ABI data and uses the trace data to
generate a SVG-formatted chromatogram. Requires the CPAN SVG module and
Bio::SeqIO::staden::read (from bioperl-ext), which itself requires io_lib from
the Staden package.

END_USAGE

my $file = shift || die $USAGE;

my $img_width = 6000;
my $img_height = 200;

my $svg = SVG->new(width => $img_width, height => $img_height, xmlns => "http://www.w3.org/2000/svg");

my $seq_io = Bio::SeqIO->new( -file => $file, -format => 'abi', -get_trace_data => 1);

my $seq = $seq_io->next_seq;

my $points = scalar($seq->get_trace_graph( -trace => 'a' ));

my @xdata = map { $_ / $points * $img_width } (0..$points-1);

my %colours = ( 'a' => 'green', 'c' => 'blue', 'g' => 'black', 't' => 'red' );
foreach my $element ('a', 'c', 'g', 't')
{
	my @trace = $seq->get_trace_graph( -trace => $element, -scale => $img_height); 
	@trace = map { $img_height - $_ } @trace;
	my $points = $svg->get_path(-type => 'polyline', -closed => 0, x => \@xdata, y => \@trace);
	$svg->polyline(%$points, id=> $element, 'stroke-width' => 0.5, stroke => $colours{$element}, 'fill-opacity' => 0, 'fill' => 'white');
}

my $count = 0;
my $text_group = $svg->group( id => 'text_layer');
foreach my $base_loc (@{$seq->trace})
{
	$text_group->text(x => ($base_loc / $points * $img_width), y => 50, 'text-anchor' => 'middle', fill => 'black', 'font-size' => '5pt')->cdata(substr($seq->seq,$count,1));
	++$count;
}

print $svg->xmlify();