#!/usr/bin/env perl
#
# Copyright 2008-2010 Tim Rayner
#
# This file is part of Bio::MAGETAB.
#
# Bio::MAGETAB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Bio::MAGETAB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Bio::MAGETAB. If not, see <http://www.gnu.org/licenses/>.
#
# $Id: read_magetab.pl 333 2010-06-02 16:41:31Z tfrayner $
# This is a very simplistic example script to illustrate how one might
# use the Reader modules to parse a MAGE-TAB document into
# Bio::MAGETAB objects in memory or in a database, and generate an
# output GraphViz visualization.
use strict;
use warnings;
use Getopt::Long;
use File::Path;
use Bio::MAGETAB::Util::Reader;
use Bio::MAGETAB::Util::Writer::GraphViz;
my ( $idf,
$is_relaxed,
$ignore_datafiles,
$authority,
$namespace,
$want_help,
$want_version,
$graph_file,
$dsn,
$write );
GetOptions(
"i|idf=s" => \$idf,
"a|authority=s" => \$authority,
"n|namespace=s" => \$namespace,
"r|relaxed" => \$is_relaxed,
"x|ignore-data" => \$ignore_datafiles,
"g|graph=s" => \$graph_file,
"d|dsn=s" => \$dsn,
"w|write=s" => \$write,
"h|help" => \$want_help,
"v|version" => \$want_version,
);
if ( $want_help || ! ($idf && -r $idf) ) {
print (<<"USAGE");
Usage: read_magetab.pl -i <IDF file>
Options:
-r : Use "relaxed" parsing, where undeclared objects are created for you on the fly.
-x : Do not attempt to parse any data files listed in the SDRF (specifically, data matrices).
-n : Use the specified namespace string.
-a : Use the specified authority string.
-g : Filename to use for SDRF graph output using GraphViz.
-d : DSN, or SQLite database file to load the generated objects into.
-w : Attempt to round-trip the MAGE-TAB information by writing a new document
to the specified directory.
-v : Print version information.
-h : Print this help.
USAGE
exit 255;
}
if ( $want_version ) {
print "This is Bio::MAGETAB::Util::Reader version $Bio::MAGETAB::Util::Reader::VERSION\n";
exit 255;
}
$namespace ||= q{};
$authority ||= q{};
my $reader = Bio::MAGETAB::Util::Reader->new(
idf => $idf,
relaxed_parser => $is_relaxed,
ignore_datafiles => $ignore_datafiles,
namespace => $namespace,
authority => $authority,
);
# If a database file was specified, dump the Investigation and all
# associated objects into a SQLite schema.
if ( $dsn ) {
warn("Attempting to connect to database...\n");
# We default to SQLite here for the sake of simplicity. In
# principle, any database backend supported by Tangram should
# work. NOTE that during testing, SQLite performance didn't scale
# terribly well; MySQL worked better.
require Bio::MAGETAB::Util::Persistence;
require Bio::MAGETAB::Util::DBLoader;
unless ( $dsn =~ /\A dbi:\w+:\w+ /ixms ) {
$dsn = "dbi:SQLite:$dsn";
}
my $db = Bio::MAGETAB::Util::Persistence->new({
dbparams => [ $dsn ],
});
# Connect to the database and dump the objects.
$db->connect();
my $builder = Bio::MAGETAB::Util::DBLoader->new({
database => $db,
namespace => $namespace,
authority => $authority,
});
$reader->set_builder( $builder );
}
# Parse the IDF and any associated SDRFs/ADFs.
warn("Parsing MAGE-TAB document...\n");
my ( $inv, $magetab ) = $reader->parse();
# If a graph file was specified, attempt to use GraphViz to draw the
# experimental design graph.
if ( $graph_file ) {
warn("Attempting to generate a graph visualisation...\n");
open ( my $fh, '>', $graph_file )
or die("Error: Unable to open output file: $!");
my $writer = Bio::MAGETAB::Util::Writer::GraphViz->new({
sdrfs => [ $inv->get_sdrfs() ],
});
my $g = $writer->draw();
print $fh $g->as_png();
}
if ( $write ) {
warn("Attempting to write out a new set of MAGE-TAB documents...\n");
require Bio::MAGETAB::Util::Writer;
mkpath( $write );
chdir( $write );
my $writer = Bio::MAGETAB::Util::Writer->new({
magetab => $magetab,
});
$writer->write();
}
warn("Done.\n");