—#!perl
use
strict;
use
Data::Dumper;
use
Carp;
#
# This is a SAS Component
#
=head1 roles_to_subsystems
roles_to_subsystems can be used to access the set of subsystems that include
specific roles. The input is a list of roles (i.e., role descriptions), and a mapping
is returned as a hash with key role description and values composed of sets of susbsystem names.
Example:
roles_to_subsystems [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 roles_to_subsystems. It is documented as follows:
$return = $obj->roles_to_subsystems($roles)
=over 4
=item Parameter and return types
=begin html
<pre>
$roles is a roles
$return is a reference to a hash where the key is a role and the value is a subsystems
roles is a reference to a list where each element is a role
role is a string
subsystems is a reference to a list where each element is a subsystem
subsystem is a string
</pre>
=end html
=begin text
$roles is a roles
$return is a reference to a hash where the key is a role and the value is a subsystems
roles is a reference to a list where each element is a role
role is a string
subsystems is a reference to a list where each element is a subsystem
subsystem 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. For each line of input there can be multiple lines of output, one per subsystem containing the role. The subsystem name is added to the output lines.
Input lines that cannot be extended are written to stderr.
=cut
my
$usage
=
"usage: roles_to_subsystems [-c column] < input > output"
;
my
$column
;
my
$input_file
;
my
$kbO
= Bio::KBase::CDMI::CDMIClient->new_for_script(
'c=i'
=> \
$column
,
'i=s'
=> \
$input_file
);
if
(!
$kbO
) {
STDERR
$usage
;
exit
}
my
$ih
;
if
(
$input_file
)
{
open
$ih
,
"<"
,
$input_file
or
die
"Cannot open input file $input_file: $!"
;
}
else
{
$ih
= \
*STDIN
;
}
while
(
my
@tuples
= Bio::KBase::Utilities::ScriptThing::GetBatch(
$ih
,
undef
,
$column
)) {
my
@h
=
map
{
$_
->[0] }
@tuples
;
my
$h
=
$kbO
->roles_to_subsystems(\
@h
);
for
my
$tuple
(
@tuples
) {
#
# Process output here and print.
#
my
(
$id
,
$line
) =
@$tuple
;
my
$v
=
$h
->{
$id
};
if
(!
defined
(
$v
))
{
STDERR
$line
,
"\n"
;
}
elsif
(
ref
(
$v
) eq
'ARRAY'
)
{
foreach
$_
(
@$v
)
{
"$line\t$_\n"
;
}
}
else
{
"$line\t$v\n"
;
}
}
}