1
1
#!/bin/env python
2
2
# coding: utf-8
3
- from .RunCmdsMP import logger
4
- from .WGDI import AK
5
- from .ploidy_plotter import add_ploidy_opts , get_ploidy , plot_bars
6
- from .mcscan import Collinearity , Gff , XCollinearity
7
3
import logging
8
4
import argparse
9
5
import sys
17
13
18
14
mpl .use ("Agg" )
19
15
mpl .rcParams ['pdf.fonttype' ] = 42
20
- # mpl.rcParams['ps.fonttype'] = 42
21
- # mpl.rcParams['font.family'] = 'sans-serif'
22
- # mpl.rcParams['font.sans-serif'] = 'Arial'
16
+
17
+ from .RunCmdsMP import logger
18
+ from .WGDI import AK
19
+ from .ploidy_plotter import add_ploidy_opts , get_ploidy , plot_bars
20
+ from .mcscan import Collinearity , Gff , XCollinearity
23
21
24
22
25
23
def dotplot_args (parser ):
@@ -34,13 +32,13 @@ def dotplot_args(parser):
34
32
parser .add_argument ('--format' , metavar = 'FORMAT' , action = 'append' , default = ['pdf' , 'png' ],
35
33
help = "output figure format [default=%(default)s]" )
36
34
parser .add_argument ('--homology' , action = 'store_true' , default = False ,
37
- help = "`-s` is in homology format (gene1<tab>gene2). [default=%(default)s]" )
35
+ help = argparse . SUPPRESS ) # "`-s` is in homology format (gene1<tab>gene2). [default=%(default)s]")
38
36
parser .add_argument ('--number-plots' , action = 'store_true' , default = False ,
39
37
help = "number subplots with (a-d). [default=%(default)s]" )
40
38
parser .add_argument ('--min-block' , metavar = 'INT' , type = int , default = None ,
41
39
help = "min gene number in a block. [default=%(default)s]" )
42
- parser .add_argument ('--min-same-block' , metavar = 'INT' , type = int , default = 25 ,
43
- help = "min gene number in a block on the same chromosome. [default=%(default)s]" )
40
+ parser .add_argument ('--min-same-block' , metavar = 'INT' , type = int , default = None ,
41
+ help = argparse . SUPPRESS ) # "min gene number in a block on the same chromosome. [default=%(default)s]")
44
42
parser .add_argument ('--min-dist' , dest = 'tandem_dist' , metavar = 'INT' , type = int , default = None ,
45
43
help = "remove tandem with distance shorter than this value. [default=%(default)s]" )
46
44
parser .add_argument ('--plot-dot' , action = 'store_true' , default = None ,
@@ -126,14 +124,14 @@ def dotplot_args(parser):
126
124
group_ks .add_argument ('--hist-ylim' , type = float , default = None ,
127
125
help = argparse .SUPPRESS ) # "max y axis of Ks histgram. [default=%(default)s]")
128
126
129
- group_ploidy = parser .add_argument_group ('ploidy plot' ,
127
+ group_ploidy = parser .add_argument_group ('Ploidy plot' ,
130
128
'options to plot relative ploidy (synteny depth)' )
131
129
group_ploidy .add_argument ('--plot-ploidy' , action = 'store_true' , default = False ,
132
130
help = "plot relative ploidy. [default=%(default)s]" )
133
131
add_ploidy_opts (group_ploidy )
134
132
135
133
group_bin = parser .add_argument_group (
136
- 'plot Ks by bins' , 'options to plot binned Ks' )
134
+ 'Plot Ks by bins' , 'options to plot binned Ks' )
137
135
group_bin .add_argument ('--plot-bin' , action = 'store_true' , default = False ,
138
136
help = "plot binned Ks. [default=%(default)s]" )
139
137
@@ -169,7 +167,6 @@ def makeArgparse():
169
167
args = parser .parse_args (['-h' ])
170
168
else :
171
169
args = parser .parse_args ()
172
-
173
170
return args
174
171
175
172
@@ -207,7 +204,8 @@ def main(args):
207
204
lower_ks = args .lower_ks , upper_ks = args .upper_ks ,
208
205
cluster = args .cluster , diagonal = args .diagonal , gene_axis = args .gene_axis ,
209
206
matrix = args .matrix , min_same_block = args .min_same_block ,
210
- min_block = args .min_block , tandem_dist = args .tandem_dist , ** ks_args )
207
+ min_block = args .min_block , tandem_dist = args .tandem_dist ,
208
+ ploidy = args .plot_ploidy , ** ks_args )
211
209
212
210
logger .info ('{} blocks to plot' .format (len (blocks )))
213
211
# positions of chromosome labels
@@ -255,49 +253,6 @@ def main(args):
255
253
)
256
254
257
255
258
- def is_mcscan_style (labels ):
259
- matches = [re .compile (
260
- r'[A-Za-z]{2}\d{1,5}[A-Za-z]*$' ).match (lab ) for lab in labels ]
261
- return all (matches )
262
-
263
-
264
- def match_paptern (lab , pattern ):
265
- match = re .compile (pattern ).match (lab )
266
- if match :
267
- return match .groups ()[0 ]
268
- else :
269
- return
270
-
271
-
272
- def is_same_prefix (labels ):
273
- matches = [match_paptern (lab , r'(\D+)' ) for lab in labels ]
274
- matches = list (set (matches ))
275
- if len (matches ) == 1 and matches [0 ] is not None :
276
- return len (matches [0 ])
277
- else :
278
- return False
279
-
280
-
281
- def is_same_prefix2 (labels ):
282
- lst_labels = list (zip (* labels ))
283
- for i , strs in enumerate (lst_labels ):
284
- if len (set (strs )) > 1 :
285
- if i > 0 : # retrieve number preifx
286
- for j in range (i - 1 , 0 , - 1 ):
287
- strj = lst_labels [j ][0 ]
288
- if not re .compile (r'[1-9]' ).match (strj ):
289
- return j + 1
290
- return i
291
-
292
-
293
- def _remove_prefix (labels ):
294
- '''remove prefix of chromosome id'''
295
- same_prefix = is_same_prefix2 (labels )
296
- if same_prefix :
297
- return [label [same_prefix :] for label in labels ]
298
- return labels
299
-
300
-
301
256
def plot_blocks (blocks , outplots , ks = None , max_ks = None , ks_hist = False , ks_cmap = None ,
302
257
clip_ks = None , min_block = None , ks_step = 0.02 ,
303
258
xlabels = None , ylabels = None , xpositions = None , ypositions = None ,
@@ -553,6 +508,7 @@ def plot_collapse(kXs, kYs, Ks, xlabels, ylabels, xpositions, ypositions,
553
508
554
509
555
510
def plot_label (ax , label , ** kargs ):
511
+ '''a/b/c/d labels'''
556
512
xmin , xmax = ax .get_xlim ()
557
513
ymin , ymax = ax .get_ylim ()
558
514
xoffset = (xmax - xmin ) / 60
@@ -565,6 +521,7 @@ def plot_label(ax, label, **kargs):
565
521
566
522
def plot_fold (ax , titles , ref_coord_paths , ref_coord_graph , qry_coord_graph ,
567
523
rq_ortholog_graph , ** kargs ):
524
+ '''c/d subplots'''
568
525
d_fold = get_ploidy (ref_coord_paths , ref_coord_graph ,
569
526
qry_coord_graph , rq_ortholog_graph , ** kargs )
570
527
data = [np .array (sorted (d_fold .items ()))]
@@ -573,6 +530,7 @@ def plot_fold(ax, titles, ref_coord_paths, ref_coord_graph, qry_coord_graph,
573
530
574
531
def _histgram (ax , allKs , cmap = None , xlim = None , ylim = None , bins = 100 , normed = False ,
575
532
xlabel = 'Ks' , ylabel = ' of syntenic gene pairs' , fontsize = None , output_hist = False ):
533
+ '''b subplot'''
576
534
if cmap is None :
577
535
cmap = cm .jet
578
536
allKs = [v for v in allKs if v >= 0 and v is not None ]
@@ -611,6 +569,49 @@ def _histgram(ax, allKs, cmap=None, xlim=None, ylim=None, bins=100, normed=False
611
569
return xlim , ylim
612
570
613
571
572
+ def is_mcscan_style (labels ):
573
+ matches = [re .compile (
574
+ r'[A-Za-z]{2}\d{1,5}[A-Za-z]*$' ).match (lab ) for lab in labels ]
575
+ return all (matches )
576
+
577
+
578
+ def match_paptern (lab , pattern ):
579
+ match = re .compile (pattern ).match (lab )
580
+ if match :
581
+ return match .groups ()[0 ]
582
+ else :
583
+ return
584
+
585
+
586
+ def is_same_prefix (labels ):
587
+ matches = [match_paptern (lab , r'(\D+)' ) for lab in labels ]
588
+ matches = list (set (matches ))
589
+ if len (matches ) == 1 and matches [0 ] is not None :
590
+ return len (matches [0 ])
591
+ else :
592
+ return False
593
+
594
+
595
+ def is_same_prefix2 (labels ):
596
+ lst_labels = list (zip (* labels ))
597
+ for i , strs in enumerate (lst_labels ):
598
+ if len (set (strs )) > 1 :
599
+ if i > 0 : # retrieve number preifx
600
+ for j in range (i - 1 , 0 , - 1 ):
601
+ strj = lst_labels [j ][0 ]
602
+ if not re .compile (r'[1-9]' ).match (strj ):
603
+ return j + 1
604
+ return i
605
+
606
+
607
+ def _remove_prefix (labels ):
608
+ '''remove the same prefix of chromosome id'''
609
+ same_prefix = is_same_prefix2 (labels )
610
+ if same_prefix :
611
+ return [label [same_prefix :] for label in labels ]
612
+ return labels
613
+
614
+
614
615
def parse_hvlines (bedfile , min_span = 10 ):
615
616
lines = []
616
617
for line in open (bedfile ):
@@ -712,7 +713,7 @@ def parse_collinearity(collinearity, gff, chrs1, chrs2, kaks, homology,
712
713
hide_blocks = None , use_median = False , lower_ks = None , upper_ks = None ,
713
714
cluster = False , diagonal = False , gene_axis = False , source = None , use_frac = False ,
714
715
ofdir = None , of_ratio = 0 , of_color = False , tandem_dist = None , min_block = None ,
715
- matrix = None , min_same_block = None , ** ks_args ):
716
+ matrix = None , min_same_block = None , ploidy = None , ** ks_args ):
716
717
blocks = XCollinearity (collinearity , orthologs = ofdir , gff = gff , kaks = kaks ,
717
718
homology = homology , source = source , ** ks_args )
718
719
chrs1s , chrs2s = set (chrs1 ), set (chrs2 )
@@ -757,16 +758,18 @@ def parse_collinearity(collinearity, gff, chrs1, chrs2, kaks, homology,
757
758
if use_median :
758
759
ks = [rc .median_ks ] * len (ks )
759
760
760
- # use OI
761
- if ofdir :
762
- ratio = rc .oi
761
+ # use OI or fractionation_rate
762
+ if ofdir or use_frac :
763
763
if use_frac :
764
764
ratio = rc .fractionation_rate (both = True )
765
+ else :
766
+ ratio = rc .oi
765
767
if not ratio > of_ratio :
766
768
continue
767
769
if of_color :
768
770
ks = [ratio ] * len (genes1 )
769
- ortholog_graph .add_edges_from (rc .pairs )
771
+ if ploidy :
772
+ ortholog_graph .add_edges_from (rc .pairs )
770
773
try :
771
774
d_blocks [(chr1 , chr2 )] += [(genes1 , genes2 , ks )]
772
775
except KeyError :
0 commit comments