From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!perl
use strict;
use Carp;
#
# This is a SAS Component
#
=head1 fids_to_genomes
Example:
fids_to_genomes [arguments] < input > output
The standard input should be a tab-separated table (i.e., each line
is a tab-separated set of fields). Normally, the last field in each
line would contain the identifer. If another column contains the identifier
use
-c N
where N is the column (from 1) that contains the subsystem.
This is a pipe command. The input is taken from the standard input, and the
output is to the standard output.
=head2 Documentation for underlying call
This script is a wrapper for the CDMI-API call fids_to_genomes. It is documented as follows:
$return = $obj->fids_to_genomes($fids)
=over 4
=item Parameter and return types
=begin html
<pre>
$fids is a fids
$return is a reference to a hash where the key is a fid and the value is a genome
fids is a reference to a list where each element is a fid
fid is a string
genome is a string
</pre>
=end html
=begin text
$fids is a fids
$return is a reference to a hash where the key is a fid and the value is a genome
fids is a reference to a list where each element is a fid
fid is a string
genome is a string
=end text
=back
=head2 Command-Line Options
=over 4
=item -c Column
This is used only if the column containing the subsystem is not the last column.
=item -i InputFile [ use InputFile, rather than stdin ]
=back
=head2 Output Format
The standard output is a tab-delimited file. It consists of the input
file with extra columns added.
Input lines that cannot be extended are written to stderr.
=cut
my $usage = "usage: fids_to_genomes [-c column] < input > output";
my $column;
my $input_file;
my $geO = Bio::KBase::CDMI::CDMIClient->new_get_entity_for_script('c=i' => \$column,
'i=s' => \$input_file);
if (! $geO) { print STDERR $usage; exit }
my $ih;
if ($input_file)
{
open $ih, "<", $input_file or die "Cannot open input file $input_file: $!";
}
else
{
$ih = \*STDIN;
}
my @from_fields;
my @rel_fields;
my @to_fields = ("id");
my %lines;
while (my @tuples = Bio::KBase::Utilities::ScriptThing::GetBatch($ih, undef, $column)) {
for my $tuple (@tuples) {
my ($id, $line) = @$tuple;
$lines{$id} = $line;
}
my @h = map { $_->[0] } @tuples;
my $h = $geO->get_relationship_IsOwnedBy(\@h, \@from_fields, \@rel_fields, \@to_fields);
for my $result (@$h) {
my @from;
my @rel;
my @to;
my $from_id;
my $res = $result->[0];
for my $key (@from_fields) {
push (@from,$res->{$key});
}
my $res = $result->[1];
$from_id = $res->{'from_link'};
for my $key (@rel_fields) {
push (@rel,$res->{$key});
}
my $res = $result->[2];
for my $key (@to_fields) {
push (@to,$res->{$key});
}
if ($from_id) {
print join("\t", $lines{$from_id}, @from, @rel, @to), "\n";
}
}
}