@@ -84,7 +84,7 @@ function* k8_readline(fn) {
84
84
85
85
function merge_hits ( b ) {
86
86
if ( b . length == 1 )
87
- return { name1 :b [ 0 ] . name1 , name2 :b [ 0 ] . name2 , len1 :b [ 0 ] . len1 , len2 :b [ 0 ] . len2 , min_cov :b [ 0 ] . min_cov , max_cov :b [ 0 ] . max_cov , s1 :b [ 0 ] . s1 , dv :b [ 0 ] . dv } ;
87
+ return { name1 :b [ 0 ] . name1 , name2 :b [ 0 ] . name2 , len1 :b [ 0 ] . len1 , len2 :b [ 0 ] . len2 , min_cov :b [ 0 ] . min_cov , max_cov :b [ 0 ] . max_cov , cov1 : b [ 0 ] . cov1 , cov2 : b [ 0 ] . cov2 , s1 :b [ 0 ] . s1 , dv :b [ 0 ] . dv } ;
88
88
b . sort ( function ( x , y ) { return x . st1 - y . st1 } ) ;
89
89
let f = [ ] , bt = [ ] ;
90
90
for ( let i = 0 ; i < b . length ; ++ i )
@@ -133,20 +133,22 @@ function merge_hits(b) {
133
133
const min_cov = cov1 < cov2 ? cov1 : cov2 ;
134
134
const max_cov = cov1 > cov2 ? cov1 : cov2 ;
135
135
//warn(d.length, b[0].name1, b[0].name2, min_cov, max_cov);
136
- return { name1 :b [ 0 ] . name1 , name2 :b [ 0 ] . name2 , len1 :b [ 0 ] . len1 , len2 :b [ 0 ] . len2 , min_cov :min_cov , max_cov :max_cov , s1 :max_f , dv :dv } ;
136
+ return { name1 :b [ 0 ] . name1 , name2 :b [ 0 ] . name2 , len1 :b [ 0 ] . len1 , len2 :b [ 0 ] . len2 , min_cov :min_cov , max_cov :max_cov , cov1 : cov1 , cov2 : cov2 , s1 :max_f , dv :dv } ;
137
137
}
138
138
139
139
function main ( args ) {
140
- let opt = { min_cov :.8 , max_dv :.015 } ;
141
- for ( const o of getopt ( args , "c:d:" , [ ] ) ) {
140
+ let opt = { min_cov :.9 , max_dv :.015 , max_diff : 20000 } ;
141
+ for ( const o of getopt ( args , "c:d:e: " , [ ] ) ) {
142
142
if ( o . opt == '-c' ) opt . min_cov = parseFloat ( o . arg ) ;
143
143
else if ( o . opt == '-d' ) opt . max_dv = parseFloat ( o . arg ) ;
144
+ else if ( o . opt == '-e' ) opt . max_diff = parseFloat ( o . arg ) ;
144
145
}
145
146
if ( args . length == 0 ) {
146
147
print ( "Usage: pafcluster.js [options] <ava.paf>" ) ;
147
148
print ( "Options:" ) ;
148
149
print ( ` -c FLOAT min coverage [${ opt . min_cov } ]` ) ;
149
150
print ( ` -d FLOAT max divergence [${ opt . max_dv } ]` ) ;
151
+ print ( ` -e FLOAT max difference [${ opt . max_diff } ]` ) ;
150
152
return ;
151
153
}
152
154
@@ -172,7 +174,7 @@ function main(args) {
172
174
const max_cov = cov1 > cov2 ? cov1 : cov2 ;
173
175
name2len [ t [ 0 ] ] = len1 ;
174
176
name2len [ t [ 5 ] ] = len2 ;
175
- a . push ( { name1 :t [ 0 ] , name2 :t [ 5 ] , len1 :len1 , len2 :len2 , min_cov :min_cov , max_cov :max_cov , s1 :s1 , dv :dv , st1 :t [ 2 ] , en1 :t [ 3 ] , st2 :t [ 7 ] , en2 :t [ 8 ] , blen :t [ 10 ] } ) ;
177
+ a . push ( { name1 :t [ 0 ] , name2 :t [ 5 ] , len1 :len1 , len2 :len2 , min_cov :min_cov , max_cov :max_cov , s1 :s1 , dv :dv , cov1 : cov1 , cov2 : cov2 , st1 :t [ 2 ] , en1 :t [ 3 ] , st2 :t [ 7 ] , en2 :t [ 8 ] , blen :t [ 10 ] } ) ;
176
178
len [ t [ 0 ] ] = len1 , len [ t [ 5 ] ] = len2 ;
177
179
}
178
180
warn ( `Read ${ a . length } hits` ) ;
@@ -206,7 +208,9 @@ function main(args) {
206
208
for ( let i = 0 ; i < a . length ; ++ i ) {
207
209
if ( a [ i ] . name1 != max_name && a [ i ] . name2 != max_name )
208
210
continue ;
209
- if ( a [ i ] . min_cov >= opt . min_cov && a [ i ] . dv <= opt . max_dv )
211
+ const diff1 = a [ i ] . len1 * ( 1.0 - a [ i ] . cov1 ) ;
212
+ const diff2 = a [ i ] . len2 * ( 1.0 - a [ i ] . cov2 ) ;
213
+ if ( a [ i ] . min_cov >= opt . min_cov && a [ i ] . dv <= opt . max_dv && diff1 <= opt . max_diff && diff2 <= opt . max_diff )
210
214
h [ a [ i ] . name1 ] = h [ a [ i ] . name2 ] = 1 ;
211
215
}
212
216
let n = 0 ;
0 commit comments