annotate StructVar.pm @ 1:4f6952e0af48 default tip

CREST - add crest.loc.sample
author Jim Johnson <jj@umn.edu>
date Wed, 08 Feb 2012 16:08:01 -0600
parents acc8d8bfeb9a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1 package StructVar;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
2
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
3 # $Id: StructVar.pm, v 1.00 2010/09/24 jianmin.wang Exp $
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
4
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
5 use strict;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
6 use Bio::DB::Sam;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
7 use Carp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
8 use Data::Dumper;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
9 use English;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
10 use Bio::SearchIO;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
11 use GeneModel;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
12 use Cwd;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
13 use SVExtTools;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
14 use List::MoreUtils qw/ uniq /;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
15 use SVUtil qw( prepare_reads read_fa_file get_sclip_reads rev_comp);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
16 use SCValidator qw(LEFT_CLIP RIGHT_CLIP);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
17
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
18 use constant UNK => 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
19 use constant CTX => 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
20 use constant INV => 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
21 use constant INS => 3;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
22 use constant DEL => 4;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
23 use constant ITX => 5;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
24
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
25 # type of SVs and thier string
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
26 my %type2str = (
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
27 0 => 'UNKNOWN', # unknow type, not single event
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
28 1 => 'CTX', # cross chromosome translocation
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
29 2 => 'INV', # inversion, requires both breakpoints available
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
30 3 => 'INS', # (tandem) insertion
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
31 4 => 'DEL', # deletion
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
32 5 => 'ITX', # within chromosome translocation
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
33 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
34 # class static variables
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
35 my $sam_d;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
36 my $sam_g;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
37 my $gm;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
38 my $assembler;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
39 my $aligner;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
40 my $mapper;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
41 my @filters = (\&_germline_sclip_filter, \&_type_distance_filter, \&_germline_indel_filter);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
42 my $RNASeq;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
43 my $read_len;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
44 my $genome;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
45 my $tr_max_indel_size; #tandem repeat mediated indel size
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
46 my $tr_min_size;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
47 my $tr_max_size; #tandem repeat max_size of single repeat
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
48 my $tr_min_num; #tandem repeat minimum number of occurence
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
49
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
50 my $max_bp_dist = 15;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
51 my $germline_seq_width = 100;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
52 my $germline_search_width = 50;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
53 my $min_percent_cons_of_read = 0.75;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
54
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
55 my %default_filters = (
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
56 'germline_sclip' => \&_germline_sclip_filter,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
57 'type_distance' => \&_type_distance_filter,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
58 'germline_indel' => \&_germline_indel_filter,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
59 # 'mapping_artifact' => \&_mapping_artifact_filter,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
60 'mapping_quality' => \&_mapping_quality_filter,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
61 'tandem_repeat' => \&_tandem_repeat_filter,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
62 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
63
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
64 sub new {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
65 my $class = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
66 my %param = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
67 my $self = {};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
68 $self->{first_bp} = {};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
69 $self->{second_bp} = {};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
70 $self->{first_bp} = $param{-FIRST_BP} if($param{-FIRST_BP});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
71 $self->{second_bp} = $param{-SECOND_BP} if($param{-SECOND_BP});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
72 $self->{consensus} = $param{-CONSENSUS} ? $param{-CONSENSUS} : "";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
73 $self->{type} = "";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
74 bless $self, ref($class) || $class;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
75 return $self;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
76 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
77
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
78 sub add_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
79 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
80 my $name = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
81 my $f = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
82 croak "you must specify a filter" if(!$f);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
83 croak "the filter must be a subroutine" if(ref($f) ne 'CODE');
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
84 $default_filters{$name} = $f;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
85 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
86
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
87 sub add_RNASeq_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
88 $default_filters{'RNASeq_strand'} = \&_RNASeq_strand_filter;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
89 $default_filters{'RNASeq_INS'} = \&_RNASeq_INS_filter;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
90 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
91
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
92 sub remove_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
93 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
94 my $name = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
95 if($default_filters{$name}){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
96 delete $default_filters{$name};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
97 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
98 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
99 print STDERR "Filter $name is not in filter list";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
100 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
101 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
102
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
103 sub tr_max_indel_size { #tandem repeat mediated indel size
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
104 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
105 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
106 $tr_max_indel_size = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
107 return $tr_max_indel_size;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
108 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
109
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
110 sub min_percent_cons_of_read {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
111 my $self= shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
112 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
113 $min_percent_cons_of_read = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
114 return $min_percent_cons_of_read;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
115 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
116
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
117 sub tr_min_size {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
118 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
119 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
120 $tr_min_size = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
121 return $tr_min_size;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
122 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
123 sub germline_seq_width {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
124 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
125 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
126 $germline_seq_width = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
127 return $germline_seq_width;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
128 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
129
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
130 sub germline_search_width {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
131 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
132 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
133 $germline_search_width = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
134 return $germline_search_width;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
135 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
136
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
137 sub max_bp_dist {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
138 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
139 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
140 $max_bp_dist = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
141 return $max_bp_dist;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
142 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
143
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
144 sub tr_max_size { #tandem repeat max_size of single repeat
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
145 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
146 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
147 $tr_max_size = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
148 return $tr_max_size;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
149 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
150
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
151 sub tr_min_num { #tandem repeat minimum number of occurence
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
152 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
153 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
154 $tr_min_num = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
155 return $tr_min_num;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
156 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
157 sub genome {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
158 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
159 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
160 $genome = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
161 return $genome;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
162 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
163 sub sam_d {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
164 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
165 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
166 $sam_d = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
167 return $sam_d;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
168 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
169
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
170 sub sam_g {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
171 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
172 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
173 $sam_g = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
174 return $sam_g;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
175 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
176
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
177 sub assembler {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
178 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
179 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
180 $assembler = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
181 return $assembler;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
182 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
183
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
184 sub aligner {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
185 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
186 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
187 $aligner = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
188 return $aligner;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
189 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
190
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
191 sub RNASeq {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
192 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
193 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
194 $RNASeq = 1 if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
195 return $RNASeq;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
196 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
197
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
198 sub mapper {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
199 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
200 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
201 $mapper = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
202 return $mapper;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
203 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
204
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
205 sub gene_model {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
206 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
207 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
208 $gm = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
209 return $gm;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
210 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
211
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
212 sub read_len {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
213 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
214 my $value = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
215 $read_len = $value if($value);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
216 return $read_len;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
217
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
218 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
219 sub first_bp {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
220 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
221 my %param = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
222 if(%param) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
223 $self->{first_bp}{left_chr} = $param{-LEFT_CHR};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
224 $self->{first_bp}{left_pos} = $param{-LEFT_POS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
225 $self->{first_bp}{left_ort} = $param{-LEFT_ORT};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
226 $self->{first_bp}{right_chr} = $param{-RIGHT_CHR};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
227 $self->{first_bp}{right_pos} = $param{-RIGHT_POS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
228 $self->{first_bp}{right_ort} = $param{-RIGHT_ORT};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
229 $self->{first_bp}{sc_reads} = $param{-SC_READS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
230 $self->{first_bp}{pos} = $param{-POS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
231 $self->{first_bp}{cover} = $param{-COVER};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
232 $self->{first_bp}{sc_seq} = $param{-SC_SEQ};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
233 $self->{first_bp}{chr} = $param{-CHR};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
234 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
235 return $self->{first_bp};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
236 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
237
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
238 sub second_bp {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
239 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
240 my %param = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
241 if(%param) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
242 $self->{second_bp}{left_chr} = $param{-LEFT_CHR};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
243 $self->{second_bp}{left_pos} = $param{-LEFT_POS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
244 $self->{second_bp}{left_ort} = $param{-LEFT_ORT};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
245 $self->{second_bp}{right_chr} = $param{-RIGHT_CHR};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
246 $self->{second_bp}{right_pos} = $param{-RIGHT_POS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
247 $self->{second_bp}{right_ort} = $param{-RIGHT_ORT};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
248 $self->{second_bp}{sc_reads} = $param{-SC_READS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
249 $self->{second_bp}{pos} = $param{-POS};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
250 $self->{second_bp}{cover} = $param{-COVER};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
251 $self->{second_bp}{sc_seq} = $param{-SC_SEQ};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
252 $self->{second_bp}{chr} = $param{-CHR};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
253 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
254 return $self->{second_bp};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
255 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
256
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
257 sub type {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
258 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
259 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
260 if($bp1->{left_chr} ne $bp1->{right_chr}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
261 return CTX if($bp1->{left_ort} eq $bp2->{left_ort} &&
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
262 $bp1->{right_ort} eq $bp2->{right_ort});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
263
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
264 return UNK;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
265 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
266 if( $bp1->{left_ort} eq $bp1->{right_ort} &&
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
267 $bp2->{left_ort} eq $bp2->{right_ort} ) { # Insertion or deletion
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
268 return DEL if( $bp1->{left_pos} <= $bp1->{right_pos} &&
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
269 $bp2->{left_pos} <= $bp2->{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
270 return INS if( $bp1->{left_pos} >= $bp1->{right_pos} &&
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
271 $bp2->{left_pos} >= $bp2->{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
272 return UNK;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
273 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
274 if( $bp1->{left_ort} ne $bp1->{right_ort} &&
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
275 $bp2->{left_ort} ne $bp2->{right_ort} ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
276 return INV if( ($bp1->{left_ort} eq '+' && $bp2->{left_ort} eq '-')
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
277 || ($bp2->{left_ort} eq '+' && $bp1->{left_ort} eq '-'));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
278 return ITX if( ($bp1->{left_ort} eq '+' && $bp2->{left_ort} eq '+')
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
279 || ($bp1->{left_ort} eq '-' && $bp2->{left_ort} eq '-') );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
280 return UNK;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
281 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
282 return UNK;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
283 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
284
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
285 sub to_string {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
286 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
287 my $type = $self->type;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
288 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
289 my ($left_len, $right_len) = (0, 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
290 if(exists $bp1->{left_len}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
291 ($left_len, $right_len ) = ($bp1->{left_len}, $bp1->{right_len});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
292 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
293 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
294 $left_len = length($bp1->{sc_seq}) if($bp1->{sc_seq});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
295 $right_len = length($bp2->{sc_seq}) if($bp2->{sc_seq});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
296 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
297 if($type == INV && $bp1->{pos} > $bp2->{pos}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
298 ($bp1, $bp2) = ($bp2, $bp1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
299 ($left_len, $right_len) = ($right_len, $left_len);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
300 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
301 my ($cover1, $cover2) = ($bp1->{cover}, $bp2->{cover});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
302
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
303 my ($chrA, $chrB, $ortA, $ortB) = ($bp1->{left_chr}, $bp1->{right_chr},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
304 $bp1->{left_ort}, $bp1->{right_ort});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
305 my ($posA, $posB, $countA, $countB) = ($bp1->{pos}, $bp2->{pos}, $bp1->{sc_reads}, $bp2->{sc_reads});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
306 if($bp1->{chr} eq $bp1->{right_chr} && $bp1->{pos} == $bp1->{right_pos}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
307 $posA = $bp2->{pos};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
308 $posB = $bp1->{pos};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
309 $countA = $bp2->{sc_reads};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
310 $countB = $bp1->{sc_reads};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
311 ($cover1, $cover2) = ($cover2, $cover1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
312 ($left_len, $right_len) = ($right_len, $left_len);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
313 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
314
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
315 my $rtn = join("\t", ($chrA, $posA, $ortA, $countA, $chrB, $posB, $ortB, $countB,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
316 $type2str{$type}, $cover1, $cover2, $left_len, $right_len, $self->get_statistics(100),
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
317 $self->{c_start}, $self->{start_chr}, $self->{t_start},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
318 $self->{c_end}, $self->{end_chr}, $self->{t_end}, $self->{consensus}));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
319 if($self->{type} == INV) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
320 $rtn = join("\t", ($rtn, $self->{c_start2}, $self->{start_chr2}, $self->{t_start2},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
321 $self->{c_end2}, $self->{end_chr2}, $self->{t_end}, $self->{consensus2}));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
322 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
323 return $rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
324 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
325
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
326 sub set_consensus {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
327 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
328 my ($validator, $paired ) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
329 if(!$assembler) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
330 print STDERR "No assembler set, no consensus generated\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
331 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
332 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
333 my %all_reads;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
334 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
335 my $N = 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
336
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
337 my @s_reads1 = $self->_get_reads($sam_d, $bp1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
338 my @s_reads2 = $self->_get_reads($sam_d, $bp2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
339
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
340 if($self->{type} == INV) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
341 $self->{consensus} = _generate_consensus(\@s_reads1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
342 $self->{consensus2} = _generate_consensus(\@s_reads2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
343 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
344 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
345 push @s_reads1, @s_reads2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
346 $self->{consensus} = _generate_consensus(\@s_reads1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
347 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
348 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
349
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
350 sub _generate_consensus {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
351 my $s_reads = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
352 my $N = scalar(@{$s_reads});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
353 return $s_reads->[0]{seq} if($N == 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
354 my $fa_name = prepare_reads($s_reads);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
355 my ($contig_file, $sclip_count) = $assembler->run($fa_name);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
356 if(!$contig_file || -s $contig_file == 0) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
357 system ("rm $fa_name"); system("rm $fa_name*");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
358 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
359 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
360 my $n = 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
361 my $contig_name;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
362 foreach my $c (keys %{$sclip_count}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
363 if($sclip_count->{$c} > $n) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
364 $n = $sclip_count->{$c};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
365 $contig_name = $c;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
366 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
367 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
368 return if($N * 8 > $n * 10);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
369 my $contig_seqs = read_fa_file($contig_file);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
370 return $contig_seqs->{$contig_name};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
371 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
372
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
373 sub _get_reads{
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
374 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
375 my ($sam, $bp) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
376
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
377 my ($chr, $pos) = ($bp->{chr}, $bp->{pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
378 my ($start, $end) = ($pos, $pos);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
379 if($bp->{all_pos}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
380 my @tmp = @{$bp->{all_pos}};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
381 @tmp = sort {$a <=> $b} @tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
382 ($start, $end) = ($tmp[0], $tmp[$#tmp]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
383 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
384 my %reads;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
385 return if(scalar @{$bp->{reads}} == 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
386 foreach my $r (@{$bp->{reads}}){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
387 $reads{$r} = 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
388 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
389
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
390 #my ($sam, $chr, $start, $end, $reads) =
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
391 # ($args{-SAM}, $args{-CHR}, $args{-START}, $args{-END}, $args{-READS}) ;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
392
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
393 my @rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
394 my $range = $chr;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
395 $range = $chr . ":" . $start . "-" . $end;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
396 my($s, $e) = ($start, $end);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
397 $sam->fetch($range, sub {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
398 my $a = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
399 return unless (exists $reads{$a->qname});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
400 return unless ($a->start && $a->end);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
401 return unless (($a->start >= $start && $a->start <= $end)
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
402 || ($a->end >= $start && $a->end <= $end));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
403 $s = $a->start if($s > $a->start);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
404 $e = $a->end if($e < $a->end);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
405 my $qscore = $a->qscore;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
406 delete $reads{$a->qname};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
407 push @rtn, {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
408 name => $a->qname,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
409 seq => $a->query->dna,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
410 qual => $qscore,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
411 };
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
412 } );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
413 # $bp->{range} = [$s, $e];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
414 if($self->{type} == INV) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
415 if($start == $bp->{left_pos} || $end == $bp->{left_pos}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
416 $bp->{left_range} = [$s, $e];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
417 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
418 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
419 $bp->{right_range} = [$s, $e];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
420 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
421 return @rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
422 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
423 if($chr eq $self->{first_bp}{left_chr} && ($start == $self->{first_bp}{left_pos} || $end == $self->{first_bp}{left_pos})){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
424 $self->{first_bp}{left_range} = [$s, $e];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
425 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
426 if($chr eq $self->{first_bp}{right_chr} && ($start == $self->{first_bp}{right_pos} || $end == $self->{first_bp}{right_pos})){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
427 $self->{first_bp}{right_range} = [$s, $e];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
428 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
429
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
430 return @rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
431 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
432
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
433 my $start_dir;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
434 BEGIN {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
435 $start_dir = getcwd;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
436 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
437
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
438 sub _cat_genes {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
439 my ($ort, @genes) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
440 my $rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
441 my @names;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
442 foreach my $g (@genes) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
443 push @names, $g->val->name;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
444 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
445 @names = uniq @names;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
446 $rtn = join(";", @names);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
447 $rtn = $rtn . "($ort)" if($rtn);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
448 return $rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
449 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
450
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
451 sub get_genes {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
452 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
453 return ['NA', 'NA', 'NA'] unless $gm;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
454
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
455 my ($gene1, $gene2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
456 my $dist;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
457 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
458 my ($ort1, $ort2) = ($bp1->{left_ort}, $bp1->{right_ort});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
459 my ($chr1, $chr2) = ($bp1->{left_chr}, $bp1->{right_chr});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
460 my ($pos1, $pos2) = ($bp1->{pos}, $bp2->{pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
461 ($pos1, $pos2) = ($pos2, $pos1) if($bp1->{right_pos} == $pos1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
462 my $range1 = $ort1 eq "+" ? [$pos1 - 5, $pos1] : [$pos1, $pos1 + 5];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
463 my $range2 = $ort2 eq "+" ? [$pos2, $pos2 + 5] : [$pos2 - 5, $pos2];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
464
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
465 my ($tmp1, $tmp2) = ($chr1 =~ m/chr/ ? $chr1 : "chr" . $chr1,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
466 $chr2 =~ m/chr/ ? $chr2 : "chr" . $chr2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
467 my ($r_tree1, $f_tree1) = ($gm->sub_model($tmp1, "-"), $gm->sub_model($tmp1, "+"));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
468 my ($r_tree2, $f_tree2) = ($gm->sub_model($tmp2, "-"), $gm->sub_model($tmp2, "+"));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
469
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
470 my ($g_ort1, $g_ort2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
471 my @genes;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
472 @genes = $r_tree1->intersect($range1) if($r_tree1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
473 $gene1 = _cat_genes("-", @genes) if(scalar @genes > 0 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
474 undef @genes;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
475 @genes = $f_tree1->intersect($range1) if($f_tree1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
476 if(scalar @genes > 0) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
477 my $tmp = _cat_genes("+", @genes);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
478 if($gene1) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
479 $gene1 .= ";" . $tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
480 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
481 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
482 $gene1 = $tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
483 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
484 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
485 undef @genes;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
486 @genes = $r_tree2->intersect($range2) if($r_tree2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
487 $gene2 = _cat_genes("-", @genes) if(scalar @genes > 0 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
488 undef @genes;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
489 @genes = $f_tree2->intersect($range2) if($f_tree2);;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
490 if(scalar @genes > 0) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
491 my $tmp = _cat_genes("+", @genes);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
492 if($gene2) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
493 $gene2 .= ";" . $tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
494 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
495 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
496 $gene2 = $tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
497 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
498 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
499
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
500 $gene1 = 'NA' unless $gene1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
501 $gene2 = 'NA' unless $gene2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
502 my $type = $self->{type};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
503 if( $type == INS or $type == DEL ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
504 ($pos1, $pos2) = ($pos2, $pos1) if($pos1 > $pos2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
505 @genes = $r_tree1->intersect([$pos1 - 5, $pos2 + 5]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
506 if(scalar @genes >= 2) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
507 $dist = scalar(@genes) - 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
508 $dist .= "(-)";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
509 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
510 @genes = $f_tree1->intersect([$pos1 - 5, $pos2 + 5]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
511 if(scalar @genes >= 2) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
512 if($dist) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
513 $dist .= ":" . (scalar (@genes) - 2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
514 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
515 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
516 $dist = scalar (@genes) - 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
517 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
518 $dist .= "(+)";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
519 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
520 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
521 $dist = 'NA' unless $dist;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
522 return [$gene1, $gene2, $dist];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
523 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
524
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
525 sub to_full_string {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
526 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
527 my $type = $self->{type};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
528 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
529 return join("\t", ( $bp1->{left_chr}, $bp1->{left_pos}, $bp1->{left_ort},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
530 $bp1->{right_chr}, $bp1->{right_pos}, $bp1->{right_ort}, $bp1->{sc_reads},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
531 $bp2->{left_chr}, $bp2->{left_pos}, $bp2->{left_ort},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
532 $bp2->{right_chr}, $bp2->{right_pos}, $bp2->{right_ort}, $bp2->{sc_reads},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
533 $type2str{$type}));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
534 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
535
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
536 sub filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
537 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
538 print STDERR "SV filter starting....\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
539 $self->{type} = $self->type;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
540 $self->set_consensus;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
541
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
542 if(!$self->{consensus} || length $self->{consensus} < $read_len * $min_percent_cons_of_read) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
543 $self->{error} = "No Consensus or consensus too short";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
544 print STDERR "FAILED\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
545 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
546 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
547 if($self->{type} == INV && (!$self->{consensus2} || length $self->{consensus2} < $read_len * $min_percent_cons_of_read)) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
548 $self->{error} = "No Consensus or consensus too short";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
549 print STDERR "FAILED\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
550 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
551 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
552
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
553 foreach my $f (values(%default_filters) ){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
554 if(! $f->($self)){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
555 print STDERR "FAILED\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
556 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
557 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
558 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
559 print STDERR "PASSED\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
560 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
561 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
562
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
563 sub _mapping_quality_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
564 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
565 if($self->{type} == INV) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
566 my $tmp1 = $self->_mapping_quality($self->{first_bp}, $self->{consensus}, 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
567 my $tmp2 = $self->_mapping_quality($self->{second_bp}, $self->{consensus2}, 2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
568 return $tmp1 && $tmp2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
569 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
570 return $self->_mapping_quality($self->{first_bp}, $self->{consensus}, 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
571 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
572
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
573 sub _mapping_quality {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
574 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
575 my $bp = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
576 my $con = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
577 my $which = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
578 $which = "" unless $which == 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
579 my $l = length($con);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
580 print STDERR "Mapping quality filter ... ";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
581
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
582 open my $QUERY, ">query.fa" or croak "can't open query.fa : $OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
583 print $QUERY ">query\n", $con, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
584 close $QUERY;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
585
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
586 my ($range1, $range2) = $self->_find_bp_ref_range($bp, $con);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
587 my ($s1, $e1, $t_s1, $t_e1) = $self->_map_consensus($range1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
588 return unless $e1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
589 my ($chr, $s, $e) = split /[:|-]/, $range2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
590 my $offset = 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
591 if($s < $t_e1 && $e > $t_s1) { #overlap
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
592 my $tmp = substr $con, 0, $s;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
593 if($s1 < $l - $e1) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
594 $offset = $e1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
595 $tmp = substr $con, $e1 + 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
596 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
597 open my $QUERY, ">query.fa" or croak "can't open query.fa : $OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
598 print $QUERY ">query\n", $tmp, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
599 close $QUERY;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
600 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
601 my ($s2, $e2, $t_s2, $t_e2) = $self->_map_consensus($range2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
602 return unless $e2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
603 $s2 += $offset;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
604 $e2 += $offset;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
605 if($s1 < $s2) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
606 if($e1 < $s2) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
607 $self->{"insert" . $which} = substr($con, $e1, $s2 - $e1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
608 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
609 $self->{"c_start" . $which} = $s1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
610 $self->{"t_start" . $which} = $t_s1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
611 $self->{"start_chr" . $which} = $bp->{left_chr};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
612 $self->{"c_end" . $which} = $e2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
613 $self->{"t_end" . $which} = $t_e2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
614 $self->{"end_chr". $which} = $bp->{right_chr};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
615 $s1 = 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
616 ($e1, $s2) = ($s2, $e1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
617 $e2 = $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
618 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
619 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
620 if($e2 < $s1) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
621 $self->{"insert" . $which} = substr($con, $e2, $s1 - $e2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
622 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
623 $self->{"c_start" . $which} = $s2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
624 $self->{"t_start" . $which} = $t_s2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
625 $self->{"start_chr" . $which} = $bp->{right_chr};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
626 $self->{"c_end" . $which} = $e1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
627 $self->{"t_end" . $which} = $t_e1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
628 $self->{"end_chr" . $which } = $bp->{left_chr};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
629 $s2 = 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
630 ($e2, $s1) = ($s1, $e2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
631 $e1 = $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
632 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
633
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
634 my $n = 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
635 foreach my $r( ($range1, $range2) ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
636 my $r_a = $r eq $range1 ? $range2 : $range1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
637 my($chr, $s, $e) = split /[:|-]/, $r;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
638 my($chr_a, $s_a, $e_a) = split /[:|-]/, $r_a;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
639 my($s_c, $e_c) = $n == 1 ? ($s1, $e1) : ($s2, $e2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
640 $n++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
641 open my $QUERY, ">query.fa" or croak "can't open query.fa : $OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
642 print $QUERY ">query\n", substr($self->{consensus}, $s_c, $e_c - $s_c + 1), "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
643 close $QUERY;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
644 my $hit = $aligner->run(-TARGET => $genome . ":" . $r, -QUERY => "query.fa");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
645 my $h = $hit->{query};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
646 return unless $h;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
647 my $hsp = $h->next_hsp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
648 my @matches = $hsp->matches;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
649 $hit = $mapper->run(-QUERY => "query.fa");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
650 foreach $h (@{$hit->{query}}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
651 next if($h->{tchr} eq $chr && $h->{tstart} >= $s - $l && $h->{tend} <= $e + $l); # the same one
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
652 return if($h->{matches} >= $matches[0]); #find a better or as good as match
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
653 return if($h->{tchr} eq $chr_a && $h->{matches} - $matches[0] >= -5 && $self->{type} == CTX);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
654 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
655 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
656 print STDERR "PASSED\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
657 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
658 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
659
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
660 sub _map_consensus {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
661 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
662 my $range = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
663 my ($s_c, $e_c, $s_t, $e_t);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
664
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
665 my $hits = $aligner->run(-TARGET => $genome . ":" . $range, -QUERY => "query.fa");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
666 my ($chr, $s, $e) = split /[:|-]/, $range;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
667 my $h = $hits->{query};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
668 return unless $h; # can't find a good enough match
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
669 my $hsp = $h->next_hsp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
670 my @matches = $hsp->matches;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
671 ($s_c, $e_c, $s_t, $e_t) = ($hsp->start('query'), $hsp->end('query'),
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
672 $hsp->start('hit'), $hsp->end('hit'));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
673 return if( ($e_c - $s_c + 1) * 0.97 > $matches[0]); # the alignment is not good
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
674 ($s_t, $e_t) = $hsp->strand == 1 ? ($s_t + $s, $e_t + $s) : ($e_t + $s, $s_t + $s);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
675 return ($s_c, $e_c, $s_t, $e_t);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
676 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
677
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
678 sub _find_bp_ref_range {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
679 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
680 my $bp = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
681 my $con = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
682
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
683 my $l = int(length($con)/2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
684 my $ext = $l * 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
685 $ext = 100000 if($RNASeq);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
686 if($self->{type} == DEL && abs($bp->{left_pos} - $bp->{right_pos}) < $l ){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
687 $l = abs($bp->{left_pos} - $bp->{right_pos}) - 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
688 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
689
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
690 my($range1, $range2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
691 my ($chr, $p) = ($bp->{left_chr}, $bp->{left_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
692 my $ort = $bp->{left_ort};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
693 my ($s, $e);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
694 if($bp->{left_range} ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
695 $s = $bp->{left_range}->[0] - $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
696 $e = $bp->{left_range}->[1] + $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
697 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
698 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
699 $s = $e = $p;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
700 $s = $ort eq "+" ? $p - $ext : $p - $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
701 $e = $ort eq "+" ? $p + $l : $p + $ext;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
702 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
703 $s = 1 if($s < 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
704 $e = $bp->{left_pos} + $l if($self->{type} == DEL);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
705 $range1 = $chr . ":" . $s . "-" . $e;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
706
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
707 ($chr, $p) = ($bp->{right_chr}, $bp->{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
708 $ort = $bp->{left_ort};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
709 if($bp->{right_range} ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
710 $s = $bp->{right_range}->[0] - $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
711 $e = $bp->{right_range}->[1] + $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
712 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
713 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
714 $s = $e = $p;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
715 $s = $ort eq "-" ? $p - $ext : $p - $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
716 $e = $ort eq "-" ? $p + $l : $p + $ext;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
717 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
718 $s = $bp->{right_pos} - $l if($self->{type} == DEL);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
719 $s = 1 if($s < 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
720 $range2 = $chr . ":" . $s . "-" . $e;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
721
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
722 return ($range1, $range2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
723 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
724
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
725 sub _find_ref_range {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
726 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
727 my $l = int(length($self->{consensus})/2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
728 my ($range1, $range2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
729 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
730
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
731 my ($chr, $p) = ($bp1->{chr}, $bp1->{pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
732 my ($s, $e);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
733 my $ext = $l*2 ;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
734 $ext = 100000 if($RNASeq);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
735 if($self->{type} == DEL && abs($bp1->{pos} - $bp2->{pos}) < $l ){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
736 $l = abs($bp1->{pos} - $bp2->{pos}) - 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
737 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
738
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
739 my $ort = $bp1->{pos} == $bp1->{left_pos} ?
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
740 ($bp1->{left_ort} eq "+" ? "-" : "+") : $bp1->{right_ort};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
741 if($bp1->{range}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
742 $s = $bp1->{range}->[0] - $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
743 $s = 1 if($s < 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
744 $e = $bp1->{range}->[1] + $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
745 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
746 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
747 $s = $e = $p;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
748 $s = $ort eq "+" ? $p - $l : $p - $ext;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
749 $e = $ort eq "+" ? $p + $ext : $p + $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
750 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
751 $s = 1 if($s < 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
752 $e = $bp1->{pos} + $l if($self->{type} == DEL);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
753
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
754 $range1 = $chr . ":" . $s . "-" . $e;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
755
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
756 ($chr, $p) = ($bp2->{chr}, $bp2->{pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
757 $ort = $bp2->{pos} == $bp2->{left_pos} ?
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
758 ($bp2->{left_ort} eq '+' ? '-' : '+') : $bp2->{right_ort};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
759 if($self->{type} == INV) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
760 $ort = $bp1->{pos} == $bp1->{left_pos} ?
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
761 $bp1->{right_ort} : ($bp1->{left_ort} eq '+' ? '-' : '+');
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
762 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
763
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
764 if($bp2->{range} && $self->{type} != INV) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
765 $s = $bp2->{range}->[0] - $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
766 $e = $bp2->{range}->[1] + $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
767 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
768 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
769 $s = $e = $p;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
770 $s = $ort eq "+" ? $p - $l : $p - $ext;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
771 $e = $ort eq "+" ? $p + $ext : $p + $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
772 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
773 $s = $bp2->{pos} - $l if($self->{type} == DEL);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
774 $s = 1 if($s < 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
775
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
776 $range2 = $chr . ":" . $s . "-" . $e;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
777 return($range1, $range2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
778 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
779
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
780 my $GAP = -5;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
781 my $MATCH = 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
782 my $MISMATCH = -5;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
783 sub _refine_bp {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
784 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
785 my $h = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
786 my $ref_seq = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
787 my $con = $self->{consensus};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
788 my $hsp = $h->next_hsp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
789 my ($i, $j) = ($hsp->start("hit"), $hsp->start("query"));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
790 if($hsp->strand == -1) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
791 $con = rev_comp($con);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
792 $j = length($con) - $hsp->end("query");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
793 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
794
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
795 my ($score, $g, $max_score, $s) = (0, 0, 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
796 my ($current_s_r, $current_s_c) = ($i, $j);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
797 my ($s_r, $s_c, $e_r, $e_c);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
798 my $p;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
799 my ($n_matches, $n_max_matches) = (0, 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
800 my @bl_r = @{$hsp->gap_blocks('hit')};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
801 my @bl_c = @{$hsp->gap_blocks('query')};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
802 for( my $n = 0; $n < scalar @bl_r; $n++) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
803 my $m = $bl_r[$n]->[1];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
804 if($p) { #gaps
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
805 if (!$RNASeq || $bl_r[$n]->[0] - $p < 25) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
806 $score += $GAP * ($bl_r[$n]->[0] - $p);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
807 $score = 0 if($score < 0 )
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
808 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
809 $i += $m;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
810 $j += $bl_c[$n]->[1];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
811 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
812
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
813 while($m) { #matches / mismatches
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
814 ($current_s_r, $current_s_c, $n_matches) = ($i, $j, 0)
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
815 if($score == 0); #reset
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
816
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
817 if(substr($ref_seq, $i, 1) eq substr($con, $j, 1)) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
818 $score += $MATCH;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
819 $n_matches++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
820 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
821 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
822 $score += $MISMATCH;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
823 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
824 if($score > $max_score) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
825 $n_max_matches = $n_matches;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
826 $max_score = $score;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
827 ($s_r, $s_c) = ($current_s_r, $current_s_c);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
828 ($e_r, $e_c) = ($i, $j);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
829 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
830 $n_matches = $score = 0 if($score < 0 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
831 $m--; $i++; $j++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
832 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
833 $p = $bl_r[$n]->[0] + $bl_r[$n]->[1];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
834 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
835 return($n_max_matches, $s_r, $e_r, $s_c, $e_c);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
836 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
837
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
838 sub _mapping_artifact_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
839 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
840 if($self->{type} == INV) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
841 return ($self->_mapping_artifact($self->{consensus})
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
842 || $self->_mapping_artifact($self->{consensus2}) );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
843 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
844 return $self->_mapping_artifact($self->{consensus});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
845 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
846
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
847 sub _mapping_artifact {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
848 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
849 my $con = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
850 my $l = length $con;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
851 print STDERR "Mapping artifact filter ... ";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
852 $self->{error} = "Mapping Artifact";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
853 $l = $l - 5;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
854 my $options = " minIdentity=97 -out=psl -nohead";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
855 $options = $options . " -maxIntron=5 " unless $RNASeq;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
856 my $exp = $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
857 if($self->{type} == DEL && $RNASeq) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
858 $exp = $self->{second_bp}{pos} - $self->{first_bp}{pos};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
859 $options = $options . " -maxIntron=" . ($exp + 100) if($exp > 75000);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
860 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
861
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
862 open my $QUERY, ">query.fa" or croak "can't open query.fa : $OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
863 print $QUERY ">query\n", $con, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
864 close $QUERY;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
865 my $tmp_mapping = $mapper->run(-QUERY => "query.fa", -OPTIONS => $options);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
866 system("rm query.fa"); system("rm query.fa*");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
867
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
868 $l = $l + 5;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
869 if($RNASeq) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
870 #can't find a decent mapping for DEL event
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
871 return if($self->{type} == DEL && !$tmp_mapping->{query});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
872 foreach my $h(@{$tmp_mapping->{query}}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
873 #next if($h->{tend} - $h->{tstart} < $exp - 10);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
874 return if ($self->{type} != DEL && $h->{qend} - $h->{qstart} > $l - 10);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
875 my $chr = $h->{tchr};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
876 $chr = "chr" . $chr unless $chr =~ m/^chr/;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
877 my ($r_tree, $f_tree) = ($gm->sub_model($chr, "-"), $gm->sub_model($chr, "+"));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
878 return unless ($f_tree && $r_tree);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
879 my @f_genes = $f_tree->intersect([$h->{tstart}, $h->{tend}]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
880 my @r_genes = $r_tree->intersect([$h->{tstart}, $h->{tend}]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
881 return if(scalar @f_genes <= 1 && scalar @r_genes <= 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
882 my @f_tmp_genes;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
883 my @r_tmp_genes;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
884
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
885 foreach my $g (@f_genes) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
886 foreach my $block (@{$h->{blocks}}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
887 if($g->val->overlap($block)){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
888 push @f_tmp_genes, $g;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
889 last;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
890 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
891 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
892 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
893 foreach my $g (@r_genes) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
894 foreach my $block (@{$h->{blocks}}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
895 if($g->val->overlap($block)){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
896 push @r_tmp_genes, $g;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
897 last;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
898 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
899 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
900 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
901 return if(scalar @f_tmp_genes < 1 && scalar @r_tmp_genes < 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
902 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
903 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
904 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
905 foreach my $h (@{$tmp_mapping->{query}}){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
906 return if($h->{tend} - $h->{tstart} < $l + 10 && $h->{qend} - $h->{qstart} > $l - 5);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
907 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
908 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
909 $self->{error} = undef;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
910 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
911 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
912
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
913 sub _germline_sclip_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
914 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
915 print STDERR "Germline sclip filter\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
916 return 1 if(!$sam_g);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
917 $self->{error} = "Germline Event";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
918 my $rtn = _compare_seq($self->{first_bp}) &&
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
919 _compare_seq($self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
920 $self->{error} = undef if($rtn);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
921 return $rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
922
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
923 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
924
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
925 sub _compare_seq {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
926 my $bp = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
927 my $seq;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
928 if($bp->{pos} == $bp->{left_pos}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
929 my $seg = $sam_d->segment($bp->{right_chr}, $bp->{right_pos} -
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
930 $germline_seq_width, $bp->{right_pos} + $germline_seq_width);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
931 $seq = $seg->dna;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
932 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
933 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
934 my $seg = $sam_d->segment($bp->{left_chr}, $bp->{left_pos} - $germline_seq_width,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
935 $bp->{left_pos} + $germline_seq_width);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
936 $seq = $seg->dna;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
937 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
938 my $sclip_seq = _get_sclip_seqs($sam_g, $bp->{chr}, $bp->{pos} - $germline_search_width,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
939 $bp->{pos} + $germline_search_width);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
940
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
941
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
942 open my $TARGET, ">target.fa" or croak "can't open target.fa : $OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
943 print $TARGET ">target\n", $seq, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
944 close $TARGET;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
945
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
946 if(keys(%{$sclip_seq})) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
947 open my $QUERY, ">query.fa" or croak "can't open query.fa : $OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
948 foreach my $s (keys(%{$sclip_seq})) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
949 print $QUERY ">", $s, "\n", $sclip_seq->{$s}, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
950 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
951 close($QUERY);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
952 my $hits = $aligner->run(-TARGET => "target.fa", -QUERY => 'query.fa');
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
953 return if(keys(%{$hits}));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
954 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
955 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
956 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
957
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
958 sub _type_distance_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
959 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
960 my $type = $self->{type};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
961 $self->{error} = "Type Distance";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
962 print STDERR "Type distance filter\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
963 if($type == UNK) { #those events are not sure, always ignore them
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
964 print STDERR $self->to_full_string, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
965 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
966 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
967 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
968 return 1 if($bp2->{sc_reads} == 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
969 my ($d1, $d2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
970 if($type == INS || $type == DEL) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
971 ($d1, $d2) = ($bp1->{left_pos} - $bp2->{left_pos},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
972 $bp1->{right_pos} - $bp2->{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
973 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
974 if( $type == INV ){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
975 ($d1, $d2) = ($bp1->{left_pos} - $bp2->{left_pos},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
976 $bp2->{right_pos} - $bp1->{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
977 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
978 if( $type == ITX ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
979 ($d1, $d2) = ($bp1->{left_pos} - $bp2->{right_pos},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
980 $bp2->{left_pos} - $bp1->{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
981 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
982 if($type == CTX ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
983 if($bp1->{left_ort} eq $bp1->{right_ort} ||
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
984 $bp1->{sc_reads} == 0 || $bp2->{sc_reads} == 0) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
985 ($d1, $d2) = ($bp1->{left_pos} - $bp2->{left_pos}, $bp1->{right_pos} - $bp2->{right_pos}) ;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
986 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
987 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
988 ($d1, $d2) = ($bp1->{left_pos} - $bp2->{right_pos}, $bp2->{left_pos} - $bp1->{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
989 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
990 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
991 print STDERR $self->to_full_string, "\t", $d1, "\t", $d2, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
992 if($d1 <= 1 && $d2 <= 1 || abs($d1 - $d2) <= 5) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
993 $self->{error} = undef;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
994 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
995 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
996 if(abs($d1) > $max_bp_dist || abs($d2) > $max_bp_dist){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
997 print STDERR "Distance fail\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
998 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
999 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1000 $self->{error} = undef;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1001 return 1; # the distance is small enough
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1002 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1003
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1004 sub _germline_indel_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1005 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1006 my $type = $self->{type};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1007 print STDERR "Germline INDEL FILTER test\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1008 return if(abs($self->{first_bp}{pos} - $self->{second_bp}{pos}) < 40);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1009 return 1 if(!$sam_g);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1010 return 1 if( $type != INS && $type != DEL);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1011 return 1 if( abs($self->{first_bp}{pos} - $self->{second_bp}{pos}) > 50 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1012 $self->{error} = "Germline INDEL";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1013 my ($start, $end ) = ($self->{first_bp}{left_pos}, $self->{first_bp}{right_pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1014 my $indel_len = abs($end - $start);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1015 ($start, $end) = ($end, $start) if($start > $end);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1016
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1017 my $itr = $sam_g->features(-iterator => 1, -seq_id => $self->{first_bp}{chr},
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1018 -start => $start, -end => $end);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1019 while( my $a = $itr->next_seq ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1020 next if($type == DEL && $a->cigar_str !~ m/D/);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1021 next if($type == INS && $a->cigar_str !~ m/I/);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1022 my $cigar_array = $a->cigar_array;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1023 my $pos = $a->pos;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1024 foreach my $ca (@{$cigar_array}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1025 if($ca->[0] eq 'M') {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1026 $pos += $ca->[1];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1027 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1028 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1029 if($ca->[0] eq 'I' && $type == INS ){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1030 return if(abs($ca->[1] - $indel_len) <= 20 && abs($pos - $start) <= 20);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1031 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1032 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1033 if($ca->[0] eq 'D' && $type == DEL) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1034 return if(abs($ca->[1] - $indel_len) <= 20 && abs($pos - $start) <= 20);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1035 $pos += $ca->[1];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1036 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1037 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1038 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1039 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1040 $self->{error} = undef;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1041 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1042 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1043
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1044 sub _tandem_repeat_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1045 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1046 my $con = $self->{consensus};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1047 print STDERR "low compexity filter\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1048 open my $QUERY, ">query.fa" or croak "can't open query.fa : $OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1049 print $QUERY ">query\n", $self->{consensus}, "\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1050 close $QUERY;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1051
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1052 system("ptrfinder -seq query.fa -repsize $tr_min_size,$tr_max_size -minrep $tr_min_num > query.fa.rep");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1053 if(-e "query.fa.rep") {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1054 open my $REP, "<query.fa.rep" or croak "can't open query.fa.rep:$OS_ERROR";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1055 while( my $line = <$REP>) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1056 chomp $line;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1057 my($pattern, $len, $times, $s, $e) =
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1058 $line =~ m/PATTERN\s(\w+)\sLENGTH\s(\d+)\sTIMES\s(\d+)\sSTART\s(\d+)\sSTOP\s(\d+)\sID/;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1059 if($self->{type} == DEL || $self->{type} == INS){
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1060 if(abs($self->{first_bp}{left_pos} - $self->{first_bp}{right_pos}) < $tr_max_indel_size) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1061 print STDERR "Tandem repeat mediated INDEL!\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1062 close $REP;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1063 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1064 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1065 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1066 else{
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1067 if(($s < 5 || length($self->{consensus}) - $e < 5) && $len * $times > 30 ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1068 print STDERR "Tandem repeat mediated events!\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1069 close $REP;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1070 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1071 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1072 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1073 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1074 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1075 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1076 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1077
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1078 sub _get_sclip_seqs {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1079 my ($sam, $chr, $start, $end) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1080 my %rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1081 my $range = $chr . ":" . $start . "-" . $end;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1082
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1083 $sam->fetch($range, sub {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1084 my $a = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1085 my $cigar_str = $a->cigar_str;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1086 return if($cigar_str !~ /S/);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1087 my ($sclip_len, $pos, $seq, $qual);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1088 my @cigar_array = @{$a->cigar_array};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1089 if($cigar_array[0]->[0] eq 'S' ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1090 $sclip_len = $cigar_array[0]->[1]; $pos = $a->start;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1091 return if($pos < $start or $pos > $end); # the softclipping position is not in range
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1092 $seq = substr($a->query->dna, 0, $sclip_len );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1093 $rtn{$a->qname} = $seq if($sclip_len >= 10);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1094 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1095 #if($cigar_str =~ m/S(\d+)$/) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1096 if($cigar_array[$#cigar_array]->[0] eq 'S') {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1097 $sclip_len = $cigar_array[$#cigar_array]->[1];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1098 $pos = $a->end;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1099 return if($pos < $start or $pos > $end); # the softclipping position is not in range
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1100 $seq = substr($a->qseq, $a->l_qseq - $sclip_len );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1101 $rtn{$a->qname} = $seq if($sclip_len >= 10);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1102 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1103 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1104 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1105 return \%rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1106 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1107
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1108 sub _RNASeq_strand_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1109 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1110 my $type = $self->type;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1111 print STDERR "RNASeq strand filter\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1112 return 1 unless $gm;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1113 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1114 my ($ort1, $ort2) = ($bp1->{left_ort}, $bp1->{right_ort});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1115 my ($chr1, $chr2) = ($bp1->{left_chr}, $bp1->{right_chr});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1116 my ($pos1, $pos2) = ($bp1->{pos}, $bp2->{pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1117 ($pos1, $pos2) = ($pos2, $pos1) if($bp1->{right_pos} == $pos1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1118 my ($tmp1, $tmp2) = ($chr1 =~ m/chr/ ? $chr1 : "chr" . $chr1,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1119 $chr2 =~ m/chr/ ? $chr2 : "chr" . $chr2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1120 $tmp1 = "chrM" if($tmp1 eq "chrMT");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1121 $tmp2 = "chrM" if($tmp2 eq "chrMT");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1122 my ($r_tree1, $f_tree1) = ($gm->sub_model($tmp1, "-"), $gm->sub_model($tmp1, "+"));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1123 my ($r_tree2, $f_tree2) = ($gm->sub_model($tmp2, "-"), $gm->sub_model($tmp2, "+"));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1124 my ($g_ort1, $g_ort2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1125 return 1 unless($r_tree1 && $r_tree2 && $f_tree1 && $f_tree2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1126 $g_ort1 = "-" if(scalar($r_tree1->intersect([$pos1 - 5, $pos1])) > 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1127 $g_ort1 = "+" if(scalar($f_tree1->intersect([$pos1 - 5, $pos1])) > 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1128 $g_ort2 = "-" if(scalar($r_tree2->intersect([$pos2, $pos2 + 5])) > 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1129 $g_ort2 = "+" if(scalar($f_tree2->intersect([$pos2, $pos2 + 5])) > 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1130 return 1 unless($g_ort1 && $g_ort2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1131 return 1 if($g_ort1 eq $ort1 && $g_ort2 eq $ort2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1132 return 1 if($g_ort1 ne $ort1 && $g_ort2 ne $ort2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1133 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1134 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1135
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1136 # INS filter check to make sure that the INS part overlap with any gene
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1137 # if the INS part only in intron will return as a false positive
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1138 sub _RNASeq_INS_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1139 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1140 my $type = $self->{type};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1141 return 1 if($type != INS);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1142 print STDERR "RNAseq INS filter\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1143 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1144 my ($pos1, $pos2) = ($bp1->{pos}, $bp2->{pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1145 ($pos1, $pos2) = ($pos2, $pos1) if($pos2 < $pos1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1146 my $chr = $bp1->{chr};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1147 $chr = "chr" . $chr unless $chr =~ m/chr/;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1148 my ($r_tree, $f_tree) = ($gm->sub_model($chr, "-"), $gm->sub_model($chr, "+"));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1149 foreach my $tree( ($r_tree, $f_tree) ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1150 my @tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1151 @tmp = $f_tree->intersect([$pos1, $pos2]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1152 foreach my $g (@tmp) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1153 return 1 if($g->val->overlap([$pos1, $pos2]));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1154 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1155 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1156 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1157 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1158
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1159 sub _RNASeq_DEL_filter {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1160 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1161 my $type = $self->type;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1162 return 1 if($type != DEL);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1163 print STDERR "RNAseq DEL filter\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1164
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1165 my ($gene1, $gene2, $dist) = @{$self->get_genes};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1166 return if($gene1 eq $gene2);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1167 my ($d_plus, $d_minus) = (0, 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1168 $d_plus = $1 if($dist =~ m/(\d+)\(\+\)/);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1169 $d_minus = $1 if($dist =~ m/(\d+)\(\-\)/);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1170 return if($d_plus == 0 && $d_minus == 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1171 my ($bp1, $bp2) = ($self->{first_bp}, $self->{second_bp});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1172 return if($bp1->{cover} == 0 || $bp2->{cover} == 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1173 my($left_len, $right_len);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1174 if(exists $bp1->{left_len}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1175 ($left_len, $right_len ) = ($bp1->{left_len}, $bp1->{right_len});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1176 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1177 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1178 $left_len = length($bp1->{sc_seq}) if($bp1->{sc_seq});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1179 $right_len = length($bp2->{sc_seq}) if($bp2->{sc_seq});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1180 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1181 return if($left_len < 30 || $right_len < 30);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1182 return if($bp1->{sc_reads} < 10 || $bp2->{sc_reads} < 10);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1183 return unless $bp1->{left_gene}->overlap([$bp1->{pos} - $left_len, $bp1->{pos}]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1184 return unless $bp1->{right_gene}->overlap([$bp2->{pos} + $right_len, $bp2->{pos}]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1185 return 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1186 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1187
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1188 sub get_statistics {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1189 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1190 my $half_width = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1191 my $sam = $self->sam_d;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1192 my @rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1193
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1194 foreach my $bp ( ($self->{first_bp}, $self->{second_bp})) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1195 my ($chr, $pos ) = ($bp->{chr}, $bp->{pos});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1196 my $range = $chr . ":" . ($pos - $half_width) . "-" . ($pos + $half_width);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1197 my ($n_seq, $n_rep, $total_pid) = (0, 0, 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1198
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1199 $sam->fetch($range, sub {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1200 my $a = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1201 return unless ($a->start && $a->end);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1202 return unless ($a->start >= $pos - $half_width && $a->end <= $pos + $half_width);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1203 $n_seq++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1204 $total_pid += _cal_pid($a);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1205 if($a->has_tag("XT")) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1206 $n_rep++ if($a->aux_get("XT") ne "U");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1207 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1208 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1209 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1210 if($n_seq == 0) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1211 push @rtn, (0, 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1212 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1213 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1214 push @rtn, ($total_pid/$n_seq, $n_rep/$n_seq);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1215 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1216 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1217 return @rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1218 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1219
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1220 sub _cal_pid {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1221 my $a = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1222 my ($ref, $matches, $query) = $a->padded_alignment;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1223 my ($n_match, $n) = (0, 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1224 for( my $i = 0; $i < length($matches); $i++) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1225 my $c = substr $matches, $i, 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1226 $n_match++ if($c eq "|");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1227 $n++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1228 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1229 return 0 if($n == 0);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1230 return $n_match/$n;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1231 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1232
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1233
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1234 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1235 __END__;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1236
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1237 =pod
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1238
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1239 =head1 NAME
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1240