]> git.donarmstrong.com Git - function2gene.git/blob - bin/combine_results
8125c11fb517f270e953bf30c0c42574b65e07ca
[function2gene.git] / bin / combine_results
1 #! /usr/bin/perl
2
3 # parse_ncbi_results retreives files of search results from ncbi,
4 # and is released under the terms of the GPL version 2, or any later
5 # version, at your option. See the file README and COPYING for more
6 # information.
7
8 # Copyright 2004 by Don Armstrong <don@donarmstrong.com>.
9
10 # $Id: ss,v 1.1 2004/06/29 05:26:35 don Exp $
11
12
13 use warnings;
14 use strict;
15
16
17 use Getopt::Long;
18 use Pod::Usage;
19
20 =head1 NAME
21
22   parse_ncbi_results [options]
23
24 =head1 SYNOPSIS
25
26
27  Options:
28   --dir, -D directory to stick results into [default .]
29   --name, -n file naming scheme [default ${search}_results.$format]
30   --terms, -t file of search terms [default -]
31   --debug, -d debugging level [default 0]
32   --help, -h display this help
33   --man, -m display manual
34
35 =head1 OPTIONS
36
37 =over
38
39 =item B<--debug, -d>
40
41 Debug verbosity. (Default 0)
42
43 =item B<--help, -h>
44
45 Display brief useage information.
46
47 =item B<--man, -m>
48
49 Display this manual.
50
51 =back
52
53 =head1 EXAMPLES
54
55   parse_ncbi_results -D ./ncbi_results/ -n '${search}_name.html' < search_parameters
56
57 Will pretty much do what you want
58
59 =cut
60
61
62
63 use vars qw($DEBUG $REVISION);
64
65 BEGIN{
66      ($REVISION) = q$LastChangedRevision: 1$ =~ /LastChangedRevision:\s+([^\s]+)/;
67      $DEBUG = 0 unless defined $DEBUG;
68 }
69
70 use XML::Parser::Expat;
71 use IO::File;
72
73 # XXX parse config file
74
75 my %options = (debug    => 0,
76                help     => 0,
77                man      => 0,
78                dir      => '.',
79                keyword  => undef,
80               );
81
82 GetOptions(\%options,'keyword|k=s','debug|d+','help|h|?','man|m');
83
84
85 pod2usage() if $options{help};
86 pod2usage({verbose=>2}) if $options{man};
87
88 $DEBUG = $options{debug};
89
90 # CSV columns
91 use constant {NAME        => 0,
92               REFSEQ      => 1,
93               LOCATION    => 2,
94               ALIAS       => 3,
95               FUNCTION    => 4,
96               DESCRIPTION => 5,
97               KEYWORD     => 6,
98               DBNAME      => 7,
99               FILENAME    => 8,
100              };
101
102 my @csv_fields = qw(name hits rzscore refseq location alias database terms description function);
103
104 my %genes;
105
106 for my $file_name (@ARGV) {
107      my $file = new IO::File $file_name, 'r' or die "Unable to open file $file_name $!";
108      while (<$file>) {
109           next if /^"Name"/;
110           my @gene = map {s/^\"//; s/\"$//; $_;} split /(?<=\")\,(?=\")/, $_;
111           $genes{$gene[NAME]}{name} = $gene[NAME];
112           $genes{$gene[NAME]}{database}{$gene[DBNAME]}++;
113           $genes{$gene[NAME]}{hits}++;
114           $genes{$gene[NAME]}{terms}{$gene[KEYWORD]}++;
115           add_unique_parts($genes{$gene[NAME]},'refseq',$gene[REFSEQ]);
116           add_if_better($genes{$gene[NAME]},'description',$gene[DESCRIPTION]);
117           add_if_better($genes{$gene[NAME]},'location',$gene[LOCATION]);
118           add_unique_parts($genes{$gene[NAME]},'function',split(/; /, $gene[FUNCTION]));
119           add_unique_parts($genes{$gene[NAME]},'alias', split(/; /, $gene[ALIAS]));
120      }
121 }
122
123 print join(',',map {qq("$_")} @csv_fields),qq(\n);
124 for my $gene (keys %genes) {
125      $genes{$gene}{rzscore} = scalar keys %{$genes{$gene}{terms}};
126      next if $genes{$gene}{rzscore} == 1 and exists $genes{$gene}{terms}{antigen};
127      $genes{$gene}{rzscore} -= 1 if exists $genes{$gene}{terms}{antigen};
128      print STDOUT join (',',
129                         map {s/"//g; qq("$_")}
130                         map {
131                              my $value = $_;
132                              if (ref $value eq 'HASH') {
133                                   join('; ',map {qq($_:$$value{$_})} keys %$value);
134                              }
135                              elsif (ref $value eq 'ARRAY') {
136                                   join('; ', @$value);
137                              }
138                              else {
139                                   $value;
140                              }
141                         } @{$genes{$gene}}{@csv_fields}
142                        ), qq(\n);
143 }
144
145
146 sub add_unique_parts{
147      my ($hr,$key,@values) = @_;
148      if (not defined $$hr{key}) {
149           $$hr{$key} = [@values];
150      }
151      else {
152           my %temp_hash;
153           @temp_hash{@{$$hr{$key}}} = (1) x scalar @{$$hr{$key}};
154           $temp_hash{@values} = (1) x scalar @values;
155           $$hr{$key} = [keys %temp_hash];
156      }
157 }
158
159 sub add_if_better{
160      my ($hash, $key, $value) = @_;
161      if (not defined $$hash{$key}) {
162           $$hash{$key} = $value;
163      }
164      elsif (length $$hash{$key} < length $value and $value !~ /^NO\s+(LOCATION|DESCRIPTION)+$/) {
165           $$hash{$key} = $value;
166      }
167 }
168
169
170
171
172 __END__