annotate pfamScan/Bio/Pfam/Active_site/as_search.pm @ 0:68a3648c7d91 draft default tip

Uploaded
author matteoc
date Thu, 22 Dec 2016 04:45:31 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
1 package Bio::Pfam::Active_site::as_search;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
2
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
3 use strict;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
4 use warnings;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
5
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
6 use Bio::SeqFeature::Generic;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
7 use Bio::SimpleAlign;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
8 use Bio::Pfam::Scan::Seq;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
9
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
10 =head2 find_as
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
11
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
12 Title : find_as
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
13 Usage : find_as($as_aln, $as_res, $seq_id, $seq_se, $seq_region, $family, $hmm_file)
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
14 Function: finds active sites in a query sequence which
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
15 has a match to a Pfam active site family
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
16
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
17 Returns : An array reference of active site postions
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
18 Args : Alignment object of active site sequences, hash of arrays containing seq ids => active site positions,
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
19 start-end sequence in the format "3-50", sequence region, family, file containing all Pfam models
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
20
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
21 =cut
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
22
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
23 sub find_as {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
24 my ($as_aln, $as_res, $seq_id, $seq_se, $seq_region, $family, $hmm_file) = @_;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
25
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
26
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
27 system("hmmfetch $hmm_file $family > /tmp/hmm.$$") and die "FATAL: Problem running [hmmfetch $hmm_file $family > /tmp/hmm.$$]\n";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
28
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
29 $seq_id = "Query_".$seq_id;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
30
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
31 my $fasta;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
32 foreach my $seq ($as_aln->each_seq) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
33 my $s = $seq->seq;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
34 $s =~ s/[\-\.]//g; #Remove gaps
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
35
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
36 $fasta .= ">" . $seq->id . "/" . $seq->start . "-" . $seq->end . "\n$s\n";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
37 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
38 $fasta .= ">$seq_id/$seq_se\n$seq_region";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
39 open(SEQ, ">/tmp/seqs.$$") or die "Couldn't open file seqs.$$ $!\n";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
40 print SEQ $fasta;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
41 close SEQ;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
42
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
43
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
44 open(OUT, "hmmalign --outformat Pfam /tmp/hmm.$$ /tmp/seqs.$$ |") or die "Couldn't open fh to hmmalign $!\n";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
45
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
46 my $aln = new Bio::SimpleAlign;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
47 my ($name, $start, $end, $seq);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
48 while(<OUT>) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
49 if( /^(\S+)\/(\d+)-(\d+)\s+(\S+)\s*/ ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
50 $name = $1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
51 $start = $2;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
52 $end = $3;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
53 $seq = $4;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
54
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
55 $aln->add_seq(Bio::Pfam::Scan::Seq->new('-seq'=>$seq, '-id'=>$name, '-start'=>$start, '-end'=>$end, '-type'=>'aligned'));
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
56 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
57 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
58 close OUT;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
59
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
60
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
61 unlink "/tmp/seqs.$$";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
62 unlink "/tmp/hmm.$$";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
63
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
64 #Locate exp as in fam
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
65 _exp_as($aln, $as_res);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
66
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
67 #Store as patterns
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
68 my $pattern_aln = new Bio::SimpleAlign;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
69 _pattern_info($aln, $pattern_aln);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
70 #find pred as
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
71 my $array_ref = _add_pred_as($aln, $pattern_aln, $seq_id);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
72 return $array_ref;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
73 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
74
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
75 =head2 _exp_as
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
76
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
77 Title : _exp_as
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
78 Usage : _exp_as($aln, $hash_of_arrays)
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
79 Function : Adds experimental active site data to alignment object
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
80 Returns : Nothing, populates the alignment object with active site residue info
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
81 Args : alignment object
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
82
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
83 =cut
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
84
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
85 sub _exp_as {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
86
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
87 my ($aln, $as_res) = @_;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
88
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
89
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
90 foreach my $seq ($aln->each_seq) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
91
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
92 foreach my $pos ( @{$as_res->{$seq->id}}) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
93
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
94 if($pos >= $seq->start and $pos <= $seq->end) { #Feature is in the alignment
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
95
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
96 #store column position for seq
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
97 my $col = $aln->column_from_residue_number($seq->id, $pos);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
98
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
99 #add feature to seq
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
100 my $aa .= uc substr($seq->seq(), $col-1, 1);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
101
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
102 my $feat = new Bio::SeqFeature::Generic ( -display_name => 'experimental',
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
103 -primary => $aa,
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
104 -start => $col);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
105
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
106
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
107
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
108 $seq->add_SeqFeature($feat);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
109 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
110
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
111 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
112 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
113 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
114
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
115
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
116 =head2 _pattern_info
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
117
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
118 Title : _pattern_info
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
119 Usage : _pattern_info($aln_object, $aln_object)
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
120 Function : Takes an alignment and extracts active site patterns into a second alignment
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
121 Returns : Nothing, populates a second alignment object with active site seqences
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
122 Args : alignment object, empty alignment object
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
123
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
124 =cut
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
125
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
126
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
127 sub _pattern_info {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
128 my ($aln, $pattern_aln) = @_;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
129 my (%pat_col_seq);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
130
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
131 foreach my $seq ( $aln->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
132
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
133 next unless($seq->all_SeqFeatures());
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
134 my ($pat, $col);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
135 foreach my $feat ( sort {$a->start <=> $b->start } $seq->all_SeqFeatures() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
136 $pat .= $feat->primary_tag(); #HEK
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
137 $col .= $feat->start() . " "; #33 44 55
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
138 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
139
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
140 unless(exists($pat_col_seq{"$pat:$col"})) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
141 $pattern_aln->add_seq($seq);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
142 $pat_col_seq{"$pat:$col"}=1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
143 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
144
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
145 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
146 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
147
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
148
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
149
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
150 =head2 _add_pred_as
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
151
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
152 Title : _add_pred_as
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
153 Usage : _add_pred_as($aln_object, $aln_object)
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
154 Function : Predicts active sites based on known active site data
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
155 Returns : array of active site pos
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
156 Args : alignment, alignment of known active sites
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
157
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
158 =cut
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
159
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
160
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
161
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
162
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
163 sub _add_pred_as {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
164 my ($aln, $pattern_aln, $query_seq_id) = @_;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
165 my $num_seq=0;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
166 my ($query_seq, @as_res);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
167
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
168 #locate query seq
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
169 foreach my $seq ( $aln->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
170 if($seq->id eq $query_seq_id) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
171 $query_seq = $seq;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
172 last;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
173 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
174 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
175 die "FATAL: Can't locate query sequence [$query_seq_id] in active site alignement\n" unless($query_seq);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
176
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
177
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
178 my $aligns_with = new Bio::SimpleAlign;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
179 foreach my $seq1 ( $pattern_aln->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
180
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
181
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
182 #See if all active site residues from seq1 exist in query seq
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
183 my $mismatch;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
184 foreach my $feat ( sort {$a->start <=> $b->start } $seq1->all_SeqFeatures() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
185
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
186 my $aa1 = $feat->primary_tag();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
187 my $col = $feat->start();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
188
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
189 my $aa2 = uc substr($query_seq->seq, $col-1, 1);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
190 unless($aa1 eq $aa2) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
191 $mismatch = 1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
192 last;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
193
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
194 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
195
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
196 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
197
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
198 #Store seq1 if all active site residues are present in seq1
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
199 unless($mismatch) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
200 $aligns_with->add_seq($seq1);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
201 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
202 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
203
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
204
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
205
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
206 $num_seq = $aligns_with->num_sequences();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
207 return unless($num_seq);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
208 my (%seq_to_remove, %seq_to_rem); #two hashes used to collect seq that need removing
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
209
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
210
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
211 #if query seq matches more than one pattern remove subpatterns and any patterns that overlap
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
212
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
213 #first remove sub pat
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
214 if($num_seq>1) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
215 foreach my $sequence1 ($aligns_with->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
216 foreach my $sequence2 ($aligns_with->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
217
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
218 next if($sequence1 eq $sequence2);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
219
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
220 my (%hash1, %hash2, $num_1, $num_2, %smaller, %larger);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
221 #collect column positions
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
222 foreach my $feat1 ($sequence1->all_SeqFeatures() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
223 $hash1{$feat1->start} =1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
224 $num_1++;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
225 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
226 foreach my $feat2 ($sequence2->all_SeqFeatures() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
227 $hash2{$feat2->start} =1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
228 $num_2++;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
229 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
230
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
231
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
232 #see if one is a subpattern of the other
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
233 my $diff=0;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
234 unless($num_1 eq $num_2) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
235
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
236 my $remove_seq;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
237
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
238 if($num_1 > $num_2) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
239 %smaller = %hash2;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
240 %larger = %hash1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
241 $remove_seq = $sequence2;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
242
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
243 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
244 else {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
245 %smaller = %hash1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
246 %larger = %hash2;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
247 $remove_seq = $sequence1;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
248 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
249
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
250
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
251 foreach my $key (keys %smaller) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
252 $diff = 1 unless(exists($larger{$key})); #diff is true if it is not a subpattern
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
253 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
254
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
255
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
256 $seq_to_rem{$remove_seq}= $remove_seq unless($diff) ;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
257 next unless($diff);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
258 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
259 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
260
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
261 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
262 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
263
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
264 #Now remove any patterns which need removing
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
265 foreach my $remove (keys %seq_to_rem) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
266 $aligns_with->remove_seq($seq_to_rem{$remove});
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
267 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
268
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
269
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
270 unless($num_seq >=1) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
271 die "FATAL: All sequences that align with active site sequences have been removed - this should never happen\n";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
272 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
273
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
274
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
275
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
276 $num_seq = $aligns_with->num_sequences();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
277 #and then any patterns that overlap
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
278 if($num_seq>1) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
279
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
280 foreach my $sequence1 ($aligns_with->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
281
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
282 foreach my $sequence2 ($aligns_with->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
283 next if($sequence1 eq $sequence2);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
284
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
285 my ($seq1_st, $seq1_en, $seq2_st, $seq2_en);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
286
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
287 my (%hash1, %hash2, $num_1, $num_2, %smaller, %larger);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
288
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
289 #see if patterns overlap - find pattern start ends and collect column positions
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
290 foreach my $feat1 ($sequence1->all_SeqFeatures() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
291
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
292 $seq1_st = $feat1->start() if(!$seq1_st or $feat1->start() < $seq1_st);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
293 $seq1_en = $feat1->start() if(!$seq1_en or $feat1->start() > $seq1_en);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
294 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
295
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
296 foreach my $feat2 ($sequence2->all_SeqFeatures() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
297
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
298 $seq2_st = $feat2->start() if(!$seq2_st or $feat2->start() < $seq2_st);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
299 $seq2_en = $feat2->start() if(!$seq2_en or $feat2->start() > $seq2_en);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
300 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
301
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
302 #then see if patterns overlap - remove sequence with pattern of least identity
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
303 if(($seq1_st >= $seq2_st and $seq1_st <= $seq2_en) or ($seq2_st >= $seq1_st and $seq2_st <= $seq1_en)) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
304 my $remove = _identity($query_seq, $sequence1, $sequence2);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
305 $seq_to_remove{$remove}= $remove;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
306 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
307 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
308
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
309 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
310 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
311
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
312 #Now remove any patterns which need removing
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
313 foreach my $remove (keys %seq_to_remove) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
314 $aligns_with->remove_seq($seq_to_remove{$remove});
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
315 $num_seq = $aligns_with->num_sequences();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
316 last if($num_seq eq "1"); #just in case the % identities are identical
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
317 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
318
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
319
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
320 $num_seq = $aligns_with->num_sequences();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
321 unless($num_seq >=1) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
322 die "FATAL: All sequences that align with active site sequences have been removed - this should never happen\n";
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
323 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
324
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
325
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
326
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
327 #Add features to seq
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
328 foreach my $sequence ($aligns_with->each_seq() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
329 foreach my $feat ($sequence->all_SeqFeatures() ) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
330
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
331 my $actual_pos = $query_seq->location_from_column($feat->start);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
332 $actual_pos = $actual_pos->start();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
333
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
334
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
335 push(@as_res, $actual_pos);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
336
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
337
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
338
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
339 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
340 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
341 return \@as_res
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
342
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
343 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
344
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
345
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
346 =head2 _identity
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
347
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
348 Title : _identity
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
349 Usage : _identity($sequence1 , $sequence2, $sequence3)
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
350 Function : Identifies seq with lowest % identity to sequence1
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
351 Returns : The sequence which has the lowest % id to sequence 1
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
352 Args : sequence1, sequence2, sequence3.
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
353
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
354 =cut
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
355
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
356
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
357 sub _identity {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
358 my $seq1 = shift;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
359 my @aligns_with = @_;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
360 my $lower_identity=100;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
361 my $lower_identity_seq;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
362 foreach my $s (@aligns_with) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
363 my $tmp_aln = new Bio::SimpleAlign;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
364 $tmp_aln->add_seq($s);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
365 $tmp_aln->add_seq($seq1);
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
366
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
367 my $identity = $tmp_aln->percentage_identity();
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
368 if($identity < $lower_identity) {
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
369 $lower_identity = $identity;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
370 $lower_identity_seq = $s;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
371 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
372
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
373 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
374 return $lower_identity_seq;
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
375 }
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
376
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
377 =head1 COPYRIGHT
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
378
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
379 Copyright (c) 2007: Genome Research Ltd.
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
380
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
381 Authors: Rob Finn (rdf@sanger.ac.uk), John Tate (jt6@sanger.ac.uk),
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
382 Jaina Mistry (jm14@sanger.ac.uk)
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
383
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
384 This is free software; you can redistribute it and/or modify it under
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
385 the terms of the GNU General Public License as published by the Free Software
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
386 Foundation; either version 2 of the License, or (at your option) any later
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
387 version.
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
388
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
389 This program is distributed in the hope that it will be useful, but WITHOUT
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
390 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
391 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
392 details.
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
393
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
394 You should have received a copy of the GNU General Public License along with
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
395 this program. If not, see <http://www.gnu.org/licenses/>.
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
396
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
397 =cut
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
398
68a3648c7d91 Uploaded
matteoc
parents:
diff changeset
399 1;