Skip to content

Instantly share code, notes, and snippets.

@ddbj-repo
Created December 18, 2017 00:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ddbj-repo/e317ec4fa1ea3bf42594334f8264f241 to your computer and use it in GitHub Desktop.
Save ddbj-repo/e317ec4fa1ea3bf42594334f8264f241 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
# usage: perl wabi-client conf.json
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request::Common;
use JSON qw/encode_json decode_json/;
# JSONファイルからweb APIにPOSTする値を取り出す。
my $json_file = $ARGV[0];
open IN, $json_file or die;
my $json_in = '';
while (<in>) {
chomp;
$json_in .= $_;
}
close IN;
my $data_ref = decode_json($json_in);
my %data = %$data_ref;
my $format = 'text';
my $url = $data{'urlStr'};
my $infile = $data{'infile'};
my $profile1_file = $data{'profile1'};
my $profile2_file = $data{'profile2'};
my $guidetree1_file = $data{'guidetree1'};
my $guidetree2_file = $data{'guidetree2'};
my $pwdnamatrix_file = $data{'pwdnamatrix'};
my $pwaamatrix_file = $data{'pwaamatrix'};
my $dnamatrix_file = $data{'dnamatrix'};
my $aamatrix_file = $data{'aamatrix'};
my $parameters = $data{'parameters'};
my $result = $data{'result'};
my $address = $data{'address'};
# Multiple Alignmentを行う。
print "Execute multiple sequence alignment.\n";
my $input_data = '';
my $profile1_data = '';
my $profile2_data = '';
my $guidetree1_data = '';
my $guidetree2_data = '';
my $pwdnamatrix_data = '';
my $pwaamatrix_data = '';
my $dnamatrix_data = '';
my $aamatrix_data = '';
$input_data = &open_read($infile) if $infile;
$profile1_data = &open_read($profile1_file) if $profile1_file;
$profile2_data = &open_read($profile2_file) if $profile2_file;
$guidetree1_data = &open_read($guidetree1_file) if $guidetree1_file;
$guidetree2_data = &open_read($guidetree2_file) if $guidetree2_file;
$pwdnamatrix_data = &open_read($pwdnamatrix_file) if $pwdnamatrix_file;
$pwaamatrix_data = &open_read($pwaamatrix_file) if $pwaamatrix_file;
$dnamatrix_data = &open_read($dnamatrix_file) if $dnamatrix_file;
$aamatrix_data = &open_read($aamatrix_file) if $aamatrix_file;
# 取り出した値をPOSTする。
my %post_data = (
'querySequence' => $input_data,
'profile1' => $profile1_data,
'profile2' => $profile2_data,
'guidetree1' => $guidetree1_data,
'guidetree2' => $guidetree2_data,
'pwDnaMatrix' => $pwdnamatrix_data,
'pwAaMatrix' => $pwaamatrix_data,
'dnaMatrix' => $dnamatrix_data,
'aaMatrix' => $aamatrix_data,
'format' => $format,
'parameters' => $parameters,
'result' => $result,
'address' => $address,
);
my $request = POST($url, \%post_data);
my $ua = LWP::UserAgent -> new;
my $res = $ua -> request( $request );
my $request_id = '';
if ($res->is_success) {
my $content = $res->content;
if ($content =~ /requestId: (.*)/) {
$request_id = $1;
}
} else {
my $content = $res->content;
print "$content\n";
die $res->status_line;
}
print "request-ID: $request_id\n";
# request-IDでGETする。
my $status = '';
while (1) {
$request = GET($url . $request_id);
$res = $ua -> request( $request );
if ($res->is_success) {
my $content = $res->content;
if ($content =~/status: (.*)/) {
$status = $1;
}
} else {
die $res->status_line;
}
print "$status\n";
if ($status eq 'waiting') {
sleep(10);
} elsif ($status eq 'running') {
sleep(10);
} elsif ($status eq 'finished') {
last;
}
}
# clustalwの出力結果を取得する。
$request = GET($url . $request_id . '?info=result');
$res = $ua -> request( $request );
if ($res->is_success) {
open OUT, ">${request_id}.txt" or die;
print OUT $res->content;
close OUT;
print "ClustalW2 result is outputed to ${request_id}.txt\n";
} else {
die $res->status_line;
}
$request = GET($url . $request_id . '?info=result_guide1');
$res = $ua -> request( $request );
if ($res->is_success) {
open OUT, ">${request_id}_guidetree1.txt" or die;
print OUT $res->content;
close OUT;
print "Guide Tree 1 is outputed to ${request_id}_guidetree1.txt\n";
} else {
if ($res->code != 404) {
die $res->status_line;
}
}
$request = GET($url . $request_id . '?info=result_guide2');
$res = $ua -> request( $request );
if ($res->is_success) {
open OUT, ">${request_id}_guidetree2.txt" or die;
print OUT $res->content;
close OUT;
print "Guide Tree 2 is outputed to ${request_id}_guidetree1.txt\n";
} else {
if ($res->code != 404) {
die $res->status_line;
}
}
$request = GET($url . $request_id . '?info=result_pim');
$res = $ua -> request( $request );
if ($res->is_success) {
open OUT, ">${request_id}_pim.txt" or die;
print OUT $res->content;
close OUT;
print "PIM file is outputed to ${request_id}_pim.txt\n";
} else {
if ($res->code != 404) {
die $res->status_line;
}
}
sub open_read {
my $file = $_[0];
my $content = '';
open FILE, $file or die;
while (<file>) {
$content .= $_;
}
close FILE;
return $content;
}
</file></in>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment