annotate _modules/functions_PhageTerm.py @ 24:c8f88ae512f3 draft default tip

Uploaded
author mmonot
date Tue, 17 Sep 2024 13:35:16 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1 #! /usr/bin/env python
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
2 # -*- coding: utf-8 -*-
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
3
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
4 # This file is a part of PhageTerm software
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
5 # A tool to determine phage termini and packaging strategy
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
6 # and other useful informations using raw sequencing reads.
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
7 # (This programs works with sequencing reads from a randomly
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
8 # sheared DNA library preparations as Illumina TruSeq paired-end or similar)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
9 #
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
10 # ----------------------------------------------------------------------
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
11 # Copyright (C) 2017 Julian Garneau
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
12 #
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
13 # This program is free software; you can redistribute it and/or modify
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
14 # it under the terms of the GNU General Public License as published by
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
15 # the Free Software Foundation; either version 3 of the License, or
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
16 # (at your option) any later version.
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
17 # <http://www.gnu.org/licenses/gpl-3.0.html>
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
18 #
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
19 # This program is distributed in the hope that it will be useful,
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
22 # GNU General Public License for more details.
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
23 # ----------------------------------------------------------------------
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
24 #
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
25 # @author Julian Garneau <julian.garneau@usherbrooke.ca>
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
26 # @author Marc Monot <marc.monot@pasteur.fr>
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
27 # @author David Bikard <david.bikard@pasteur.fr>
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
28
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
29
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
30 ### PYTHON Module
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
31 # Base
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
32 import os
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
33 import shlex
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
34 import subprocess
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
35 import re
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
36 import random
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
37 import sys
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
38 import struct
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
39 import heapq
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
40 import itertools
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
41 import gzip
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
42
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
43 import matplotlib
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
44 matplotlib.use('Agg')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
45 import matplotlib.pyplot as plt
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
46 from matplotlib import patches
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
47 from matplotlib.path import Path
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
48
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
49 import numpy as np
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
50 import pandas as pd
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
51 import pylab as pl
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
52
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
53 # Statistics
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
54 from scipy import stats
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
55 from statsmodels.sandbox.stats.multicomp import multipletests
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
56 from sklearn.tree import DecisionTreeRegressor
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
57
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
58 # collections
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
59 from collections import OrderedDict, namedtuple
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
60
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
61 # String
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
62 from string import maketrans
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
63 import cStringIO
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
64
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
65 # PDF report building
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
66 import time
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
67 from reportlab.lib.enums import TA_JUSTIFY, TA_CENTER, TA_LEFT, TA_RIGHT
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
68 from reportlab.lib.pagesizes import letter, landscape
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
69 from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle, PageBreak
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
70 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
71 from reportlab.lib.units import inch
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
72 from reportlab.lib import colors
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
73 from reportlab.lib.utils import ImageReader
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
74 from reportlab.pdfgen import canvas
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
75
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
76
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
77 ### FILE function
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
78 def checkFastaFile(filin):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
79 """Check sequence Fasta file given by user"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
80 first_line = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
81 infil = open(filin, 'rU')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
82 try:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
83 for line in infil:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
84 # Test '>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
85 if first_line :
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
86 if line[0] != '>':
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
87 return 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
88 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
89 first_line = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
90 continue
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
91 # Test 1st base per line : 'ATGCN'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
92 base = changeCase(line[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
93 if base != 'A' and base != 'T' and base != 'C' and base != 'G' and base != 'N' and base != '\n' and base != '\r':
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
94 infil.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
95 return 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
96 infil.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
97 return 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
98 except IOError:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
99 sys.exit('ERROR: No such file %s' % filin)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
100
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
101 def checkPhageName(phagename):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
102 """Normalise phagename (take out any special char)"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
103 phagenameNorm = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
104 charok = range(48,58) + range(65,91) + range(97,123) + [45,95]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
105 for char in phagename:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
106 if ord(char) in charok:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
107 phagenameNorm += char
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
108 if len(phagenameNorm) > 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
109 return phagenameNorm
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
110 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
111 return "Phage"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
112
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
113
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
114 ### UTILITY function
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
115 def chunks(l, n):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
116 """Yield n successive chunks from l."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
117 newn = int(1.0 * len(l) / n + 0.5)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
118 for i in xrange(0, n-1):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
119 yield l[i*newn:i*newn+newn]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
120 yield l[n*newn-newn:]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
121
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
122
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
123 ### SEQUENCE parsing function
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
124 def genomeFastaRecovery(filin):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
125 """Get genome sequence from fasta file"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
126 if filin == "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
127 return ''
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
128 infile = open(filin, 'r')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
129 genome_forward = ''.join(map(str,[changeCase(line).replace(' ', '').split('\r')[0].split('\n')[0] for line in infile if line[0] != '>']))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
130 infile.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
131 return genome_forward
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
132
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
133 def RemoveEdge(tableau, edge):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
134 return tableau[edge:-edge]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
135
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
136
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
137 ### SEQUENCE manipulation function
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
138 def changeCase(seq):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
139 """Change lower case to UPPER CASE for a sequence string."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
140 return seq.upper()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
141
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
142 def reverseComplement(seq, transtab=maketrans('ATGCN', 'TACGN')):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
143 """Reverse Complement a sequence."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
144 return changeCase(seq).translate(transtab)[::-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
145
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
146
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
147 ### COVERAGE Starting and Whole function
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
148 def readsCoverage(fastq, refseq, hostseq, tot_reads, seed, edge, paired, insert_max, core, core_id, return_dict, line_start, line_end, limit_coverage):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
149 """Calculate whole coverage and first base coverage. """
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
150 gen_len = len(refseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
151 host_len = len(hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
152 termini_coverage = np.array([gen_len*[0], gen_len*[0]])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
153 whole_coverage = np.array([gen_len*[0], gen_len*[0]])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
154 paired_whole_coverage = np.array([gen_len*[0], gen_len*[0]])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
155 phage_hybrid_coverage = np.array([gen_len*[0], gen_len*[0]])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
156 host_hybrid_coverage = np.array([host_len*[0], host_len*[0]])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
157 host_whole_coverage = np.array([host_len*[0], host_len*[0]])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
158 list_hybrid = np.array([0,0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
159 insert = []
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
160 paired_missmatch = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
161 read_match = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
162 test_read_seq = match = k = count_line = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
163
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
164
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
165 # Timer
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
166 if core_id == (core-1):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
167 sys.stdout.write(" 0.0 %")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
168 sys.stdout.flush()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
169
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
170 # Mapping
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
171 if fastq.endswith('.gz'):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
172 filin = gzip.open(fastq, 'rb')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
173 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
174 filin = open(fastq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
175 line = filin.readline()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
176
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
177 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
178 if paired.endswith('.gz'):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
179 filin_paired = gzip.open(paired, 'rb')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
180 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
181 filin_paired = open(paired)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
182 line_paired = filin_paired.readline()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
183
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
184
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
185 while line:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
186
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
187 count_line += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
188
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
189 if count_line/4 <= line_start:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
190 test_read_seq = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
191 if count_line/4 > line_end:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
192 break
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
193
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
194 if test_read_seq:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
195 k += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
196
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
197 # Read sequence
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
198 read = line.split("\n")[0].split("\r")[0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
199 line = filin.readline()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
200
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
201 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
202 read_paired = line_paired.split("\n")[0].split("\r")[0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
203 line_paired = filin_paired.readline()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
204
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
205 readlen = len(read)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
206 if readlen < seed:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
207 continue
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
208 corlen = readlen-seed
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
209
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
210 ### Match sense + (multiple, random pick one)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
211 matchPplus_start, matchPplus_end = applyCoverage(read[:seed], refseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
212
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
213 ## Phage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
214 if matchPplus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
215 match = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
216 termini_coverage[0][matchPplus_start]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
217 position_end = matchPplus_end+corlen
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
218
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
219 # whole coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
220 for i in range(matchPplus_start, min(gen_len,position_end)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
221 whole_coverage[0][i]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
222
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
223 # Paired-read
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
224 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
225 matchPplus_start_paired, matchPplus_end_paired = applyCoverage(reverseComplement(read_paired)[-seed:], refseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
226 insert_length = matchPplus_end_paired - matchPplus_start
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
227 if insert_length > 0 and insert_length < insert_max:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
228 position_end = matchPplus_end_paired
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
229 insert.append(insert_length)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
230 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
231 paired_missmatch += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
232 # Paired hybrid
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
233 if hostseq != "" and matchPplus_start_paired == -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
234 matchHplus_start, matchHplus_end = applyCoverage(read_paired[:seed], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
235 if matchHplus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
236 list_hybrid[0] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
237 phage_hybrid_coverage[0] = hybridCoverage(read, refseq, phage_hybrid_coverage[0], matchPplus_start, min(gen_len,matchPplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
238 host_hybrid_coverage[0] = hybridCoverage(read_paired, hostseq, host_hybrid_coverage[0], matchHplus_start, min(host_len,matchHplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
239 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
240 matchHminus_start, matchHminus_end = applyCoverage(reverseComplement(read_paired)[:seed], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
241 if matchHminus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
242 list_hybrid[0] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
243 phage_hybrid_coverage[0] = hybridCoverage(read, refseq, phage_hybrid_coverage[0], matchPplus_start, min(gen_len,matchPplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
244 host_hybrid_coverage[1] = hybridCoverage(reverseComplement(read_paired), hostseq, host_hybrid_coverage[1], matchHminus_start, min(host_len,matchHminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
245
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
246 # Single hybrid
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
247 elif hostseq != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
248 matchPFplus_start, matchPFplus_end = applyCoverage(read[-seed:], refseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
249 if matchPFplus_start == -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
250 matchHplus_start, matchHplus_end = applyCoverage(read[-seed:], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
251 if matchHplus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
252 list_hybrid[0] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
253 phage_hybrid_coverage[0] = hybridCoverage(read, refseq, phage_hybrid_coverage[0], matchPplus_start, min(gen_len,matchPplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
254 host_hybrid_coverage[0] = hybridCoverage(read, hostseq, host_hybrid_coverage[0], matchHplus_start, min(host_len,matchHplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
255 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
256 matchHminus_start, matchHminus_end = applyCoverage(reverseComplement(read)[-seed:], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
257 if matchHminus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
258 list_hybrid[0] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
259 phage_hybrid_coverage[0] = hybridCoverage(read, refseq, phage_hybrid_coverage[0], matchPplus_start, min(gen_len,matchPplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
260 host_hybrid_coverage[1] = hybridCoverage(reverseComplement(read), hostseq, host_hybrid_coverage[1], matchHminus_start, min(host_len,matchHminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
261
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
262 # whole coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
263 for i in range(matchPplus_start, min(gen_len,position_end)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
264 paired_whole_coverage[0][i]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
265
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
266 ### if no match sense +, then test sense -
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
267 if not match:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
268 matchPminus_start, matchPminus_end = applyCoverage(reverseComplement(read)[-seed:], refseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
269
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
270 ## Phage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
271 if matchPminus_end != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
272 match = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
273 termini_coverage[1][matchPminus_end-1]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
274 position_start = matchPminus_start-corlen
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
275
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
276 # whole coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
277 for i in range(max(0,position_start), matchPminus_end):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
278 whole_coverage[1][i]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
279
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
280 # Paired-read
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
281 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
282 matchPminus_start_paired, matchPminus_end_paired = applyCoverage(read_paired[:seed], refseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
283 insert_length = matchPminus_end - matchPminus_start_paired
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
284 if insert_length > 0 and insert_length < insert_max:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
285 position_start = matchPminus_start_paired
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
286 insert.append(insert_length)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
287 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
288 paired_missmatch += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
289 # Paired hybrid
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
290 if hostseq != "" and matchPminus_start_paired == -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
291 matchHplus_start, matchHplus_end = applyCoverage(read_paired[:seed], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
292 if matchHplus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
293 list_hybrid[1] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
294 phage_hybrid_coverage[1] = hybridCoverage(reverseComplement(read), refseq, phage_hybrid_coverage[1], matchPminus_start, min(gen_len,matchPminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
295 host_hybrid_coverage[0] = hybridCoverage(read_paired, hostseq, host_hybrid_coverage[0], matchHplus_start, min(host_len,matchHplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
296
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
297 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
298 matchHminus_start, matchHminus_end = applyCoverage(reverseComplement(read_paired)[-seed:], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
299 if matchHminus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
300 list_hybrid[1] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
301 phage_hybrid_coverage[1] = hybridCoverage(reverseComplement(read), refseq, phage_hybrid_coverage[1], matchPminus_start, min(gen_len,matchPminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
302 host_hybrid_coverage[1] = hybridCoverage(reverseComplement(read_paired), hostseq, host_hybrid_coverage[1], matchHminus_start, min(host_len,matchHminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
303
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
304 # Single hybrid
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
305 elif hostseq != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
306 matchPRplus_start, matchPRplus_end = applyCoverage(reverseComplement(read)[:seed], refseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
307 if matchPRplus_start == -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
308 matchHplus_start, matchHplus_end = applyCoverage(read[:seed], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
309 if matchHplus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
310 list_hybrid[1] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
311 phage_hybrid_coverage[1] = hybridCoverage(reverseComplement(read), refseq, phage_hybrid_coverage[1], matchPminus_start, min(gen_len,matchPminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
312 host_hybrid_coverage[0] = hybridCoverage(read, hostseq, host_hybrid_coverage[0], matchHplus_start, min(host_len,matchHplus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
313 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
314 matchHminus_start, matchHminus_end = applyCoverage(reverseComplement(read)[:seed], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
315 if matchHminus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
316 list_hybrid[1] += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
317 phage_hybrid_coverage[1] = hybridCoverage(reverseComplement(read), refseq, phage_hybrid_coverage[1], matchPminus_start, min(gen_len,matchPminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
318 host_hybrid_coverage[1] = hybridCoverage(reverseComplement(read), hostseq, host_hybrid_coverage[1], matchHminus_start, min(host_len,matchHminus_end+corlen) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
319
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
320 # whole coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
321 for i in range(max(0,position_start), matchPminus_end):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
322 paired_whole_coverage[1][i]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
323
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
324 ### if no match on Phage, test Host
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
325 if not match:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
326 matchHplus_start, matchHplus_end = applyCoverage(read[:seed], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
327 if matchHplus_start != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
328 for i in range(matchHplus_start, min(host_len,matchHplus_end+corlen)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
329 host_whole_coverage[0][i]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
330 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
331 matchHminus_start, matchHminus_end = applyCoverage(reverseComplement(read)[-seed:], hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
332 if matchHminus_end != -1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
333 for i in range(max(0,matchHminus_start-corlen), matchHminus_end):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
334 host_whole_coverage[1][i]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
335
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
336 # TEST limit_coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
337 read_match += match*readlen
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
338
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
339 match = test_read_seq = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
340 # Timer
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
341 if core_id == (core-1):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
342 if k%1000 == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
343 sys.stdout.write("\b\b\b\b\b\b\b\b\b%3.1f %%" %( float(read_match/gen_len) / limit_coverage * 100 ))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
344 sys.stdout.flush()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
345
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
346 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
347 if line[0] == "@":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
348 test_read_seq = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
349
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
350 line = filin.readline()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
351 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
352 line_paired = filin_paired.readline()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
353
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
354 # TEST limit_coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
355 if (read_match/gen_len) > limit_coverage:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
356 line = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
357
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
358
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
359 if core_id == (core-1):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
360 sys.stdout.write("\b\b\b\b\b\b\b\b\b%3.1f %%" %( 100 ))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
361 sys.stdout.flush()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
362
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
363 # Close file
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
364 filin.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
365 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
366 filin_paired.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
367
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
368
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
369 # Correct EDGE coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
370 if sum(termini_coverage[0]) + sum(termini_coverage[1]) == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
371 exit("ERROR: No read Match, please check your fastq file")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
372
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
373 termini_coverage = correctEdge(termini_coverage, edge)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
374 whole_coverage = correctEdge(whole_coverage, edge)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
375 phage_hybrid_coverage = correctEdge(phage_hybrid_coverage, edge)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
376 if hostseq != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
377 host_whole_coverage = correctEdge(host_whole_coverage, edge)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
378 host_hybrid_coverage = correctEdge(host_hybrid_coverage, edge)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
379
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
380 insert = np.array(insert)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
381
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
382 return_dict[core_id] = [termini_coverage, whole_coverage, paired_whole_coverage, phage_hybrid_coverage, host_hybrid_coverage, host_whole_coverage, list_hybrid, insert, paired_missmatch, k]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
383
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
384 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
385
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
386 def hybridCoverage(read, sequence, hybrid_coverage, start, end):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
387 """Return hybrid coverage."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
388 aligned_part_only = longest_common_substring(read, sequence[start:end])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
389 for i in range(start, min(len(sequence),start+len(aligned_part_only))):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
390 hybrid_coverage[i]+=1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
391 return hybrid_coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
392
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
393 def applyCoverage(readPart, sequence):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
394 """Return a random match of a read onto the sequence. """
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
395 position = []
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
396 for pos in re.finditer(readPart,sequence):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
397 position.append(pos)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
398 if len(position) > 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
399 match = random.choice(position)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
400 return match.start(), match.end()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
401 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
402 return -1, -1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
403
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
404 def correctEdge(coverage, edge):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
405 """Correction of the Edge coverage. """
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
406 correctCov = np.array([len(coverage[0])*[0], len(coverage[0])*[0]])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
407 End = len(coverage[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
408 covSta = range(edge)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
409 covEnd = range(End-edge,End)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
410 for i in range(len(coverage)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
411 for j in range(len(coverage[i])):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
412 correctCov[i][j] = coverage[i][j]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
413 for k in covSta:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
414 correctCov[i][k+edge] += coverage[i][k+End-edge]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
415 for l in covEnd:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
416 correctCov[i][l-edge] += coverage[i][l-End+edge]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
417 return correctCov
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
418
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
419 def normCov(termini_coverage, whole_coverage, covLimit, edge):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
420 """Return the termini_coverage normalised by the whole coverage (% of coverage due to first base)."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
421 normalised_coverage = [len(termini_coverage[0])*[0], len(termini_coverage[0])*[0]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
422 termini_len = len(termini_coverage[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
423 mean_nc = [1,1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
424 for i in range(len(termini_coverage)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
425 for j in range(len(termini_coverage[i])):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
426 if j < edge or j > termini_len-edge:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
427 continue
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
428 if whole_coverage[i][j] >= covLimit:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
429 if float(whole_coverage[i][j]) != 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
430 normalised_coverage[i][j] = float(termini_coverage[i][j]) / float(whole_coverage[i][j])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
431 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
432 normalised_coverage[i][j] = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
433 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
434 normalised_coverage[i][j] = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
435 normalised_coverage[i], mean_nc[i] = replaceNormMean(normalised_coverage[i])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
436 return normalised_coverage, mean_nc
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
437
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
438 def maxPaired(paired_whole_coverage, whole_coverage):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
439 """Max paired coverage using whole coverage, counter edge effect with paired-ends."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
440 pwc = paired_whole_coverage[:]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
441 wc = whole_coverage[:]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
442 for i in range(len(pwc)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
443 for j in range(len(pwc[i])):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
444 if pwc[i][j] < wc[i][j]:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
445 pwc[i][j] = wc[i][j]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
446 return pwc
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
447
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
448 def replaceNormMean(norm_cov):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
449 """Replace the values not normalised due to covLimit by mean."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
450 nc_sum = nc_count = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
451 for nc in norm_cov:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
452 if nc > 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
453 nc_sum += nc
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
454 nc_count += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
455 if nc_count == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
456 mean_nc = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
457 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
458 mean_nc = nc_sum / float(nc_count)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
459 for i in range(len(norm_cov)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
460 if norm_cov[i] == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
461 norm_cov[i] = mean_nc
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
462 return norm_cov, mean_nc
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
463
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
464 def wholeCov(whole_coverage, gen_len):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
465 """Calculate the coverage for whole read alignments and its average"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
466 if gen_len == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
467 return whole_coverage, 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
468 total_cov = sum(whole_coverage[0]) + sum(whole_coverage[1])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
469 ave_whole_cov = float(total_cov)/(2*float(gen_len))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
470 added_whole_coverage = [x + y for x, y in zip(whole_coverage[0], whole_coverage[1])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
471 return added_whole_coverage, ave_whole_cov
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
472
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
473 def testwholeCov(added_whole_coverage, ave_whole_cov, test):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
474 """Return information about whole coverage."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
475 if test:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
476 return ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
477 if ave_whole_cov < 50:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
478 print "\nWARNING: average coverage is under the limit of the software (50)"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
479 elif ave_whole_cov < 200:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
480 print "\nWARNING: average coverage is low (<200), Li's method is presumably unreliable\n"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
481 drop_cov = []
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
482 start_pos = last_pos = count_pos = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
483 for pos in range(len(added_whole_coverage)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
484 if added_whole_coverage[pos] < (ave_whole_cov / 1.5):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
485 if pos == last_pos+1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
486 count_pos += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
487 last_pos = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
488 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
489 if count_pos > 100:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
490 drop_cov.append( (start_pos,last_pos+1) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
491 last_pos = start_pos = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
492 count_pos = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
493 last_pos = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
494 return drop_cov
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
495
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
496 def longest_common_substring(read, refseq):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
497 """Longest common substring between two strings."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
498 m = [[0] * (1 + len(refseq)) for i in xrange(1 + len(read))]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
499 longest, x_longest = 0, 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
500 for x in xrange(1, 1 + len(read)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
501 for y in xrange(1, 1 + len(refseq)):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
502 if read[x - 1] == refseq[y - 1]:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
503 m[x][y] = m[x - 1][y - 1] + 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
504 if m[x][y] > longest:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
505 longest = m[x][y]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
506 x_longest = x
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
507 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
508 m[x][y] = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
509 return read[x_longest - longest: x_longest]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
510
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
511
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
512 ### READS Functions
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
513 def totReads(filin):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
514 """Verify and retrieve the number of reads in the fastq file before alignment"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
515 if filin.endswith('.gz'):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
516 filein = gzip.open(filin, 'rb')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
517 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
518 filein = open(filin, 'r')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
519
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
520 line = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
521 while filein.readline():
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
522 line += 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
523 seq = float(round(line / 4))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
524 filein.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
525 return seq
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
526
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
527 def usedReads(coverage, tot_reads):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
528 """Retrieve the number of reads after alignment and calculate the percentage of reads lost."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
529 used_reads = sum(coverage[0]) + sum(coverage[1])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
530 lost_reads = tot_reads - used_reads
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
531 lost_perc = (float(tot_reads) - float(used_reads))/float(tot_reads) * 100
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
532 return used_reads, lost_reads, lost_perc
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
533
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
534
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
535 ### PEAK functions
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
536 def picMax(coverage, nbr_pic):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
537 """COORDINATES (coverage value, position) of the nbr_pic largest coverage value."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
538 if coverage == [[],[]] or coverage == []:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
539 return "", "", ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
540 picMaxPlus = heapq.nlargest(nbr_pic, zip(coverage[0], itertools.count()))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
541 picMaxMinus = heapq.nlargest(nbr_pic, zip(coverage[1], itertools.count()))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
542 TopFreqH = max(max(np.array(zip(*picMaxPlus)[0])), max(np.array(zip(*picMaxMinus)[0])))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
543 return picMaxPlus, picMaxMinus, TopFreqH
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
544
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
545
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
546 ### SCORING functions
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
547 # Li's methodology
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
548 def ratioR1(TopFreqH, used_reads, gen_len):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
549 """Calculate the ratio H/A (R1) = highest frequency/average frequency. For Li's methodology."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
550 AveFreq = (float(used_reads)/float(gen_len)/2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
551 if AveFreq == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
552 return 0, 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
553 R1 = float(TopFreqH)/float(AveFreq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
554 return R1, AveFreq
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
555
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
556 def ratioR(picMax):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
557 """Calculate the T1/T2 = Top 1st frequency/Second higher frequency. For Li's methodology."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
558 T1 = picMax[0][0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
559 T2 = max(1,picMax[1][0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
560 R = float(T1)/float(T2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
561 return round(R)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
562
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
563 def packMode(R1, R2, R3):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
564 """Make the prognosis about the phage packaging mode and termini type. For Li's methodology."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
565 packmode = "OTHER"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
566 termini = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
567 forward = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
568 reverse = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
569
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
570 if R1 < 30:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
571 termini = "Absence"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
572 if R2 < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
573 forward = "No Obvious Termini"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
574 if R3 < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
575 reverse = "No Obvious Termini"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
576 elif R1 > 100:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
577 termini = "Fixed"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
578 if R2 < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
579 forward = "Multiple-Pref. Term."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
580 if R3 < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
581 reverse = "Multiple-Pref. Term."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
582 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
583 termini = "Preferred"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
584 if R2 < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
585 forward = "Multiple-Pref. Term."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
586 if R3 < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
587 reverse = "Multiple-Pref. Term."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
588
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
589 if R2 >= 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
590 forward = "Obvious Termini"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
591 if R3 >= 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
592 reverse = "Obvious Termini"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
593
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
594 if R2 >= 3 and R3 >= 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
595 packmode = "COS"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
596 if R2 >= 3 and R3 < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
597 packmode = "PAC"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
598 if R2 < 3 and R3 >= 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
599 packmode = "PAC"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
600 return packmode, termini, forward, reverse
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
601
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
602 def RemoveClosePicMax(picMax, gen_len, nbr_base):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
603 """Remove peaks that are too close of the maximum (nbr_base around)"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
604 if nbr_base == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
605 return picMax[1:], [picMax[0]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
606 picMaxRC = picMax[:]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
607 posMax = picMaxRC[0][1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
608 LimSup = posMax + nbr_base
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
609 LimInf = posMax - nbr_base
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
610 if LimSup < gen_len and LimInf >= 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
611 PosOut = range(LimInf,LimSup)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
612 elif LimSup >= gen_len:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
613 TurnSup = LimSup - gen_len
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
614 PosOut = range(posMax,gen_len)+range(0,TurnSup) + range(LimInf,posMax)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
615 elif LimInf < 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
616 TurnInf = gen_len + LimInf
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
617 PosOut = range(0,posMax)+range(TurnInf,gen_len) + range(posMax,LimSup)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
618 picMaxOK = []
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
619 picOUT = []
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
620 for peaks in picMaxRC:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
621 if peaks[1] not in PosOut:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
622 picMaxOK.append(peaks)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
623 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
624 picOUT.append(peaks)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
625 return picMaxOK, picOUT
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
626
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
627 def addClosePic(picList, picClose, norm = 0):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
628 """Add coverage value of close peaks to the top peak. Remove picClose in picList if exist."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
629 if norm:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
630 if picClose[0][0] >= 0.5:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
631 return picList, [picClose[0]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
632 picListOK = picList[:]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
633 cov_add = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
634 for cov in picClose:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
635 cov_add += cov[0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
636 picListOK[cov[1]] = 0.01
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
637 picListOK[picClose[0][1]] = cov_add
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
638 return picListOK, picClose
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
639
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
640
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
641 # STATISTICS
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
642 def test_pics_decision_tree(whole_coverage, termini_coverage, termini_coverage_norm, termini_coverage_norm_close):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
643 """Fits a gamma distribution using a decision tree."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
644 L=len(whole_coverage[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
645 res=pd.DataFrame({"Position":np.array(range(L))+1, "termini_plus": termini_coverage[0], "SPC_norm_plus":termini_coverage_norm[0], "SPC_norm_minus":termini_coverage_norm[1], "SPC_norm_plus_close":termini_coverage_norm_close[0], "SPC_norm_minus_close":termini_coverage_norm_close[1], "termini_minus": termini_coverage[1],"cov_plus": whole_coverage[0], "cov_minus": whole_coverage[1]})
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
646 res["cov"]=res["cov_plus"].values+res["cov_minus"].values
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
647 res["R_plus"]=map(float,termini_coverage[0])/np.mean(termini_coverage[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
648 res["R_minus"]=map(float,termini_coverage[1])/np.mean(termini_coverage[1])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
649
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
650 regr = DecisionTreeRegressor(max_depth=3,min_samples_leaf=100)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
651 X = np.arange(L)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
652 X = X[:,np.newaxis]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
653 y = res["cov"].values
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
654 regr.fit(X,y)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
655
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
656 # Predict
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
657 y_1 = regr.predict(X)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
658 res["covnode"] = y_1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
659 covnodes = np.unique(y_1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
660 thres = np.mean(whole_coverage[0])/2
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
661 covnodes = [n for n in covnodes if n>thres]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
662
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
663 for node in covnodes:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
664 X = res[res["covnode"]== node]["termini_plus"].values
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
665 res.ix[res["covnode"]==node,"pval_plus"] = gamma(X)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
666 X = res[res["covnode"]==node]["termini_minus"].values
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
667 res.ix[res["covnode"]==node,"pval_minus"] = gamma(X)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
668
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
669 res.ix[res.pval_plus > 1, 'pval_plus'] = 1.00
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
670 res.ix[res.pval_minus > 1, 'pval_minus'] = 1.00
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
671 res = res.fillna(1.00)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
672
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
673 res['pval_plus_adj'] = multipletests(res["pval_plus"].values, alpha=0.01, method="bonferroni")[1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
674 res['pval_minus_adj'] = multipletests(res["pval_minus"].values, alpha=0.01, method="bonferroni")[1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
675
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
676 res = res.fillna(1.00)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
677
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
678 res_plus = pd.DataFrame({"Position": res['Position'], "SPC_std": res['SPC_norm_plus']*100, "SPC": res['SPC_norm_plus_close']*100, "pval_gamma": res['pval_plus'] , "pval_gamma_adj": res['pval_plus_adj']})
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
679 res_minus = pd.DataFrame({"Position": res['Position'], "SPC_std": res['SPC_norm_minus']*100, "SPC": res['SPC_norm_minus_close']*100, "pval_gamma": res['pval_minus'] , "pval_gamma_adj": res['pval_minus_adj']})
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
680
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
681 res_plus.sort_values("SPC", ascending=False, inplace=True)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
682 res_minus.sort_values("SPC", ascending=False, inplace=True)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
683
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
684 res_plus.reset_index(drop=True, inplace=True)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
685 res_minus.reset_index(drop=True, inplace=True)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
686
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
687 return res, res_plus, res_minus
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
688
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
689 def gamma(X):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
690 """Apply a gamma distribution."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
691 X = np.array(X,dtype=np.int64)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
692 v = remove_pics(X,3)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
693
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
694 dist_max = float(max(v))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
695 if dist_max == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
696 return np.array([1.00]*len(X))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
697
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
698 actual = np.bincount(v)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
699 fit_alpha, fit_loc, fit_beta = stats.gamma.fit(v)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
700 expected=stats.gamma.pdf(np.arange(0,dist_max+1,1),fit_alpha,loc=fit_loc,scale=fit_beta)*sum(actual)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
701
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
702 return stats.gamma.pdf(X,fit_alpha,loc=fit_loc,scale=fit_beta)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
703
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
704 def remove_pics(arr,n):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
705 '''Removes the n highest values from the array'''
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
706 arr=np.array(arr)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
707 pic_pos=arr.argsort()[-n:][::-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
708 arr2=np.delete(arr,pic_pos)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
709 return arr2
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
710
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
711 def selectSignificant(table, pvalue, limit):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
712 """Return significant peaks over a limit"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
713 table_pvalue = table.loc[lambda df: df.pval_gamma_adj < pvalue,:]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
714 table_pvalue_limit = table_pvalue.loc[lambda df: df.SPC > limit,:]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
715 table_pvalue_limit.reset_index(drop=True, inplace=True)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
716 return table_pvalue_limit
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
717
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
718
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
719 ### DECISION Process
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
720 def decisionProcess(plus_significant, minus_significant, limit_fixed, gen_len, paired, insert, R1, list_hybrid, used_reads, seed, phage_hybrid_coverage, Mu_threshold, refseq, hostseq):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
721 """ ."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
722 P_orient = "NA"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
723 P_seqcoh = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
724 P_concat = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
725 P_type = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
726 Mu_like = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
727 P_left = "Random"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
728 P_right = "Random"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
729 # 2 peaks sig.
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
730 if not plus_significant.empty and not minus_significant.empty:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
731 # Multiple
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
732 if ( len(plus_significant["SPC"]) > 1 or len(minus_significant["SPC"]) > 1 ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
733 if not ( plus_significant["SPC"][0] > limit_fixed or minus_significant["SPC"][0] > limit_fixed ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
734 Redundant = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
735 P_left = "Multiple"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
736 P_right = "Multiple"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
737 Permuted = "Yes"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
738 P_class = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
739 P_type = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
740 return Redundant, Permuted, P_class, P_type, P_seqcoh, P_concat, P_orient, P_left, P_right, Mu_like
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
741
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
742 dist_peak = abs(plus_significant['Position'][0] - minus_significant['Position'][0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
743 dist_peak_over = abs( abs(plus_significant['Position'][0] - minus_significant['Position'][0]) - gen_len )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
744 P_left = plus_significant['Position'][0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
745 P_right = minus_significant['Position'][0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
746 # COS
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
747 if ( dist_peak <= 2 ) or ( dist_peak_over <= 2 ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
748 Redundant = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
749 Permuted = "No"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
750 P_class = "COS"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
751 P_type = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
752 elif ( dist_peak < 20 and dist_peak > 2 ) or ( dist_peak_over < 20 and dist_peak_over > 2 ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
753 Redundant = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
754 Permuted = "No"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
755 P_class, P_type = typeCOS(plus_significant["Position"][0], minus_significant["Position"][0], gen_len/2 )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
756 P_seqcoh, packstat = sequenceCohesive("COS", refseq, [((plus_significant["SPC"][0]),(plus_significant["Position"][0])-1)], [((minus_significant["SPC"][0]),(minus_significant["Position"][0])-1)], gen_len/2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
757 # DTR
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
758 elif ( dist_peak <= 1000 ) or ( dist_peak_over <= 1000 ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
759 Redundant = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
760 Permuted = "No"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
761 P_class = "DTR (short)"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
762 P_type = "T7"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
763 P_seqcoh, packstat = sequenceCohesive("DTR", refseq, [((plus_significant["SPC"][0]),(plus_significant["Position"][0])-1)], [((minus_significant["SPC"][0]),(minus_significant["Position"][0])-1)], gen_len/2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
764 elif ( dist_peak <= 0.1*gen_len ) or ( dist_peak_over <= 0.1*gen_len ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
765 Redundant = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
766 Permuted = "No"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
767 P_class = "DTR (long)"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
768 P_type = "T5"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
769 P_seqcoh, packstat = sequenceCohesive("DTR", refseq, [((plus_significant["SPC"][0]),(plus_significant["Position"][0])-1)], [((minus_significant["SPC"][0]),(minus_significant["Position"][0])-1)], gen_len/2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
770 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
771 Redundant = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
772 Permuted = "No"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
773 P_class = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
774 P_type = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
775 # 1 peak sig.
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
776 elif not plus_significant.empty and minus_significant.empty or plus_significant.empty and not minus_significant.empty:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
777 Redundant = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
778 Permuted = "Yes"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
779 P_class = "Headful (pac)"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
780 P_type = "P1"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
781 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
782 if R1 == 0 or len(insert) == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
783 P_concat = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
784 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
785 P_concat = round( (sum(insert)/len(insert)) / R1) - 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
786 if not plus_significant.empty:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
787 P_left = plus_significant['Position'][0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
788 P_right = "Distributed"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
789 P_orient = "Forward"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
790 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
791 P_left = "Distributed"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
792 P_right = minus_significant['Position'][0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
793 P_orient = "Reverse"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
794 # 0 peak sig.
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
795 elif plus_significant.empty and minus_significant.empty:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
796 Mu_like, Mu_term_plus, Mu_term_minus, P_orient = testMu(paired, list_hybrid, gen_len, used_reads, seed, insert, phage_hybrid_coverage, Mu_threshold, hostseq)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
797 if Mu_like:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
798 Redundant = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
799 Permuted = "No"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
800 P_class = "Mu-like"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
801 P_type = "Mu"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
802 P_left = Mu_term_plus
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
803 P_right = Mu_term_minus
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
804 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
805 Redundant = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
806 Permuted = "Yes"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
807 P_class = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
808 P_type = "-"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
809
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
810 return Redundant, Permuted, P_class, P_type, P_seqcoh, P_concat, P_orient, P_left, P_right, Mu_like
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
811
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
812
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
813
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
814 def testMu(paired, list_hybrid, gen_len, used_reads, seed, insert, phage_hybrid_coverage, Mu_threshold, hostseq):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
815 """Return Mu if enough hybrid reads compared to theory."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
816 if hostseq == "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
817 return 0, -1, -1, ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
818 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
819 insert_mean = sum(insert) / len(insert)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
820 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
821 insert_mean = max(100, seed+10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
822 Mu_limit = ((insert_mean - seed) / float(gen_len)) * used_reads/2
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
823 test = 0
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
824 Mu_term_plus = "Random"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
825 Mu_term_minus = "Random"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
826 picMaxPlus_Mu, picMaxMinus_Mu, TopFreqH_phage_hybrid = picMax(phage_hybrid_coverage, 1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
827 picMaxPlus_Mu = picMaxPlus_Mu[0][1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
828 picMaxMinus_Mu = picMaxMinus_Mu[0][1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
829
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
830 # Orientation
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
831 if list_hybrid[0] > list_hybrid[1]:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
832 P_orient = "Forward"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
833 elif list_hybrid[1] > list_hybrid[0]:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
834 P_orient = "Reverse"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
835 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
836 P_orient = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
837
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
838 # Termini
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
839 if list_hybrid[0] > ( Mu_limit * Mu_threshold ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
840 test = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
841 pos_to_check = range(picMaxPlus_Mu+1,gen_len) + range(0,100)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
842 for pos in pos_to_check:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
843 if phage_hybrid_coverage[0][pos] >= max(1,phage_hybrid_coverage[0][picMaxPlus_Mu]/4):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
844 Mu_term_plus = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
845 picMaxPlus_Mu = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
846 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
847 Mu_term_plus = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
848 break
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
849 # Reverse
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
850 if list_hybrid[1] > ( Mu_limit * Mu_threshold ):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
851 test = 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
852 pos_to_check = range(0,picMaxMinus_Mu)[::-1] + range(gen_len-100,gen_len)[::-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
853 for pos in pos_to_check:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
854 if phage_hybrid_coverage[1][pos] >= max(1,phage_hybrid_coverage[1][picMaxMinus_Mu]/4):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
855 Mu_term_minus = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
856 picMaxMinus_Mu = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
857 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
858 Mu_term_minus = pos
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
859 break
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
860 return test, Mu_term_plus, Mu_term_minus, P_orient
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
861
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
862
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
863 ### PHAGE Information
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
864 def orientation(picMaxPlus, picMaxMinus):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
865 """Return phage termini orientation."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
866 if not picMaxPlus and not picMaxMinus:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
867 return "NA"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
868 if picMaxPlus and not picMaxMinus:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
869 return "Forward"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
870 if not picMaxPlus and picMaxMinus:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
871 return "Reverse"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
872 if picMaxPlus and picMaxMinus:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
873 if picMaxPlus[0][0] > picMaxMinus[0][0]:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
874 return "Forward"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
875 elif picMaxMinus[0][0] > picMaxPlus[0][0]:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
876 return "Reverse"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
877 elif picMaxMinus[0][0] == picMaxPlus[0][0]:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
878 return "NA"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
879
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
880 def sequenceCohesive(Packmode, refseq, picMaxPlus, picMaxMinus, nbr_lim):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
881 """Return cohesive sequence for COS phages or repeat region for DTR phages"""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
882 if Packmode != 'COS' and Packmode != 'DTR':
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
883 return '', Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
884 PosPlus = picMaxPlus[0][1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
885 PosMinus = picMaxMinus[0][1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
886
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
887 if Packmode == 'COS':
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
888 SC_class, SC_type = typeCOS(PosPlus, PosMinus, nbr_lim)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
889
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
890 if SC_class == "COS (5')":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
891 if abs(PosMinus - PosPlus) < nbr_lim:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
892 seqcoh = refseq[min(PosPlus, PosMinus):max(PosPlus,PosMinus)+1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
893 return seqcoh, Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
894 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
895 seqcoh = refseq[max(PosPlus,PosMinus)+1:] + refseq[:min(PosPlus, PosMinus)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
896 return seqcoh, Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
897
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
898 elif SC_class == "COS (3')":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
899 if abs(PosMinus - PosPlus) < nbr_lim:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
900 seqcoh = refseq[min(PosPlus, PosMinus)+1:max(PosPlus,PosMinus)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
901 return seqcoh, Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
902 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
903 seqcoh = refseq[max(PosPlus,PosMinus)+1:] + refseq[:min(PosPlus, PosMinus)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
904 return seqcoh, Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
905 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
906 return '', Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
907
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
908 elif Packmode == 'DTR':
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
909 if PosPlus < PosMinus:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
910 seqcoh = refseq[PosPlus:PosMinus+1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
911 return seqcoh, Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
912 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
913 seqcoh = refseq[PosPlus:] + refseq[:PosMinus+1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
914 return seqcoh, Packmode
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
915
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
916 def typeCOS(PosPlus, PosMinus, nbr_lim):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
917 """ Return type of COS sequence."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
918 if PosPlus < PosMinus and abs(PosPlus-PosMinus) < nbr_lim:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
919 return "COS (5')", "Lambda"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
920 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
921 return "COS (3')", "HK97"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
922
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
923 ### IMAGE Functions
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
924 def GraphCov(termini_coverage, picMaxPlus, picMaxMinus, phagename, norm, draw, hybrid = 0):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
925 """Produces a plot with termini coverage values."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
926 # Remove old plot
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
927 plt.clf()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
928 plt.cla()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
929 plt.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
930 # Create figure
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
931 plt.figure(1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
932 term_len = len(termini_coverage[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
933 term_range = range(term_len)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
934 if norm == 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
935 ylim = 1.2
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
936 elif hybrid == 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
937 offset = 0.2*(max(np.array(zip(*picMaxPlus)[0]))) + 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
938 ylim = max(np.array(zip(*picMaxPlus)[0])) + offset
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
939 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
940 offset = 0.2*(max(max(np.array(zip(*picMaxPlus)[0])), max(np.array(zip(*picMaxMinus)[0]))))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
941 ylim = max(max(np.array(zip(*picMaxPlus)[0])), max(np.array(zip(*picMaxMinus)[0]))) + offset
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
942 # Strand (+)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
943 plt.subplot(211)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
944 if norm == 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
945 plt.scatter(term_range,termini_coverage[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
946 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
947 plt.plot(termini_coverage[0],linewidth=2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
948 plt.title('strand (+)')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
949 plt.ylabel('')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
950 # Axes
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
951 axes = plt.gca()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
952 axes.set_ylim([0,ylim])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
953 # Maximum
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
954 x_strandplus = np.array(zip(*picMaxPlus)[1])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
955 y_strandplus = np.array(zip(*picMaxPlus)[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
956 # Plot
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
957 plt.plot(x_strandplus, y_strandplus, 'ro')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
958 if norm == 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
959 axes.axhline(y=0.5, xmin=0, xmax=x_strandplus, color='grey', linestyle='dashed', linewidth=1.5)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
960 axes.axhline(y=1.0, xmin=0, xmax=x_strandplus, color='grey', linestyle='dashed', linewidth=1.5)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
961 # Annotation
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
962 for i,j in zip(x_strandplus,y_strandplus):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
963 plt.text(i+(term_len*0.03), j, str(i+1), fontsize=15, bbox=dict(boxstyle='round', facecolor='white', alpha=1))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
964 # Plot Option
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
965 plt.margins(0.1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
966 plt.locator_params(axis = 'x', nbins = 10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
967 plt.locator_params(axis = 'y', nbins = 3)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
968 plt.xticks(rotation=75)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
969 # Strand (-)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
970 plt.subplot(212)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
971 if norm == 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
972 plt.scatter(term_range,termini_coverage[1])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
973 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
974 plt.plot(termini_coverage[1],linewidth=2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
975 plt.title('strand (-)')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
976 plt.ylabel('')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
977 # Axes
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
978 if hybrid == 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
979 offset = 0.2*(max(np.array(zip(*picMaxMinus)[0]))) + 1
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
980 ylim = max(np.array(zip(*picMaxMinus)[0])) + offset
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
981 axes = plt.gca()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
982 axes.set_ylim([0,ylim])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
983 # Maximum
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
984 x_strandminus = np.array(zip(*picMaxMinus)[1])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
985 y_strandminus = np.array(zip(*picMaxMinus)[0])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
986 # Plot
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
987 plt.plot(x_strandminus, y_strandminus, 'ro')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
988 if norm == 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
989 axes.axhline(y=0.5, xmin=0, xmax=x_strandplus, color='grey', linestyle='dashed', linewidth=1.5)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
990 axes.axhline(y=1.0, xmin=0, xmax=x_strandplus, color='grey', linestyle='dashed', linewidth=1.5)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
991 # Annotation
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
992 for i,j in zip(x_strandminus,y_strandminus):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
993 plt.text(i+(term_len*0.03), j, str(i+1), fontsize=15, bbox=dict(boxstyle='round', facecolor='white', alpha=1))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
994 # Plot Option
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
995 plt.margins(0.1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
996 plt.locator_params(axis = 'x', nbins = 10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
997 plt.locator_params(axis = 'y', nbins = 3)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
998 plt.xticks(rotation=75)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
999 # Plot Adjustments
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1000 plt.tight_layout()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1001 # Draw graph
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1002 if draw:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1003 plt.savefig("%s_TCov.png" % phagename, dpi=200)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1004 fig = plt.figure(1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1005 return fig
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1006
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1007 def GraphWholeCov(added_whole_coverage, phagename, draw, P_left = "", P_right = "", pos_left = 0, pos_right = 0, graphZoom = 0, title = "WHOLE COVERAGE"):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1008 """Produces a plot with whole coverage values."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1009 # Remove old plot
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1010 plt.clf()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1011 plt.cla()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1012 plt.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1013 # Create figure
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1014 offset = 0.2*(max(added_whole_coverage))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1015 ylim = max(added_whole_coverage) + offset
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1016 # Cumulative both strands
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1017 plt.figure(figsize=(15,8))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1018 plt.plot(added_whole_coverage,linewidth=2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1019 plt.title(title)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1020 # Axes
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1021 axes = plt.gca()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1022 axes.set_ylim([0,ylim])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1023 # Plot Option
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1024 plt.margins(0.1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1025 plt.locator_params(axis = 'x', nbins = 10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1026 plt.xticks(rotation=75)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1027 # Termini vertical dashed line display
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1028 if graphZoom and isinstance(P_left, int):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1029 plt.axvline(x=pos_left, ymin=0, ymax=ylim, color='red', zorder=2, linestyle='dashed', linewidth=1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1030 if graphZoom and isinstance(P_right, int):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1031 plt.axvline(x=pos_right, ymin=0, ymax=ylim, color='green', zorder=2, linestyle='dashed', linewidth=1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1032 # Draw graph
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1033 if draw:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1034 plt.savefig("%s_plot_WCov.png" % phagename, dpi=200)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1035 fig = plt.figure(1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1036 return fig
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1037
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1038 def GraphLogo(P_class, P_left, P_right, draw):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1039 """Produce logo."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1040 # Remove old plot
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1041 plt.clf()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1042 plt.cla()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1043 plt.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1044 # Create figure
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1045 plt.figure(figsize=(10,10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1046 #axes = plt.add_subplot(111)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1047 axes = plt.gca()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1048 axes.set_frame_on(False)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1049 axes.xaxis.set_visible(False)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1050 axes.yaxis.set_visible(False)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1051 # Cadre
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1052 axes.add_artist(patches.Rectangle((0.1, 0.1), 0.8, 0.8, edgecolor = 'black', fill = False, linewidth = 15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1053
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1054 if P_class == "Headful (pac)":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1055 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1056 axes.text(0.17, 0.7, r"Headful (pac)", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1057 # PAC (blue line)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1058 axes.axhline(y=0.35, xmin=0.2, xmax=0.8, color='blue', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1059 # PAC (red line)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1060 axes.axvline(x=0.19, ymin=0.30, ymax=0.40, color='red', linewidth=10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1061 axes.axvline(x=0.42, ymin=0.30, ymax=0.40, color='red', linewidth=10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1062 axes.axvline(x=0.65, ymin=0.30, ymax=0.40, color='red', linewidth=10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1063 # PAC (Arrow)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1064 axes.axvline(x=0.19, ymin=0.45, ymax=0.55, color='red', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1065 axes.arrow(0.19, 0.55, 0.07, 0, color='red', linewidth=15, head_width=0.07, head_length=0.1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1066
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1067 elif P_class == "COS (5')":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1068 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1069 axes.text(0.3, 0.7, r"COS (5')", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1070 axes.add_artist(patches.Ellipse(xy=(0.5,0.4), width=0.5, height=0.35 , edgecolor = 'blue', fill=False, lw=15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1071 axes.add_artist(patches.Ellipse(xy=(0.5,0.4), width=0.58, height=0.43 , edgecolor = 'blue', fill=False, lw=15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1072 axes.add_artist(patches.Rectangle((0.4, 0.5), 0.20, 0.20, edgecolor = 'white', facecolor = 'white', fill = True))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1073 axes.axhline(y=0.56, xmin=0.415, xmax=0.48, color='red', linewidth=16)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1074 axes.axhline(y=0.601, xmin=0.52, xmax=0.585, color='red', linewidth=16)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1075
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1076 elif P_class == "COS (3')":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1077 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1078 axes.text(0.3, 0.7, r"COS (3')", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1079 axes.add_artist(patches.Ellipse(xy=(0.5,0.4), width=0.5, height=0.35 , edgecolor = 'blue', fill=False, lw=15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1080 axes.add_artist(patches.Ellipse(xy=(0.5,0.4), width=0.58, height=0.43 , edgecolor = 'blue', fill=False, lw=15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1081 axes.add_artist(patches.Rectangle((0.4, 0.5), 0.20, 0.20, edgecolor = 'white', facecolor = 'white', fill = True))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1082 axes.axhline(y=0.601, xmin=0.415, xmax=0.48, color='red', linewidth=16)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1083 axes.axhline(y=0.56, xmin=0.52, xmax=0.585, color='red', linewidth=16)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1084
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1085 elif P_class == "COS":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1086 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1087 axes.text(0.4, 0.7, r"COS", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1088 axes.add_artist(patches.Ellipse(xy=(0.5,0.4), width=0.5, height=0.35 , edgecolor = 'blue', fill=False, lw=15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1089 axes.add_artist(patches.Ellipse(xy=(0.5,0.4), width=0.58, height=0.43 , edgecolor = 'blue', fill=False, lw=15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1090 axes.add_artist(patches.Rectangle((0.4, 0.5), 0.20, 0.20, edgecolor = 'white', facecolor = 'white', fill = True))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1091
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1092 elif P_class == "DTR (short)":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1093 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1094 axes.text(0.22, 0.7, r"DTR (short)", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1095
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1096 verts = [(0.5, 0.5), (0.9, 0.4), (0.9, 0.3), (0.5,0.2)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1097 codes = [Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.CURVE4]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1098 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1099 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'blue', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1100 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1101
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1102 verts = [(0.5, 0.2), (0.1, 0.30), (0.1, 0.45), (0.5,0.55)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1103 codes = [Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.CURVE4]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1104 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1105 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'blue', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1106 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1107
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1108 verts = [(0.5, 0.55), (0.52, 0.545), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1109 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1110 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1111 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1112 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1113
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1114 verts = [(0.56, 0.536), (0.58, 0.530), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1115 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1116 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1117 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1118 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1119
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1120 verts = [(0.5, 0.50), (0.56, 0.480), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1121 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1122 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1123 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'white', lw=20)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1124 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1125
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1126 verts = [(0.5, 0.50), (0.52, 0.495), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1127 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1128 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1129 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1130 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1131
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1132 verts = [(0.56, 0.486), (0.58, 0.480), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1133 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1134 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1135 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1136 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1137
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1138 elif P_class == "DTR (long)":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1139 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1140 axes.text(0.25, 0.7, r"DTR (long)", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1141 verts = [(0.5, 0.5), (0.9, 0.4), (0.9, 0.3), (0.5,0.2)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1142 codes = [Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.CURVE4]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1143 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1144 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'blue', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1145 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1146
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1147 verts = [(0.5, 0.2), (0.1, 0.30), (0.1, 0.45), (0.5,0.55)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1148 codes = [Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.CURVE4]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1149 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1150 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'blue', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1151 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1152
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1153 verts = [(0.5, 0.55), (0.52, 0.545), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1154 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1155 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1156 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1157 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1158
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1159 verts = [(0.56, 0.536), (0.58, 0.530), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1160 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1161 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1162 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1163 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1164
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1165 verts = [(0.62, 0.521), (0.64, 0.516), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1166 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1167 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1168 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1169 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1170
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1171 verts = [(0.68, 0.507), (0.70, 0.501), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1172 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1173 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1174 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1175 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1176
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1177 verts = [(0.5, 0.50), (0.65, 0.460), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1178 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1179 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1180 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'white', lw=25)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1181 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1182
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1183 verts = [(0.5, 0.50), (0.52, 0.495), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1184 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1185 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1186 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1187 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1188
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1189 verts = [(0.56, 0.486), (0.58, 0.480), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1190 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1191 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1192 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1193 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1194
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1195 verts = [(0.62, 0.471), (0.64, 0.465), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1196 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1197 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1198 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1199 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1200
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1201 verts = [(0.68, 0.456), (0.70, 0.450), (0, 0)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1202 codes = [Path.MOVETO, Path.LINETO, Path.CLOSEPOLY]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1203 path = Path(verts, codes)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1204 patch = patches.PathPatch(path, facecolor='none', edgecolor = 'red', lw=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1205 axes.add_patch(patch)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1206
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1207 elif P_class == "Mu-like":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1208 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1209 axes.text(0.33, 0.7, r"Mu-like", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1210 axes.axhline(y=0.43, xmin=0.3, xmax=0.7, color='blue', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1211 axes.axhline(y=0.47, xmin=0.3, xmax=0.7, color='blue', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1212 axes.axhline(y=0.43, xmin=0.7, xmax=0.8, color='green', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1213 axes.axhline(y=0.47, xmin=0.7, xmax=0.8, color='green', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1214 axes.axhline(y=0.43, xmin=0.2, xmax=0.3, color='green', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1215 axes.axhline(y=0.47, xmin=0.2, xmax=0.3, color='green', linewidth=15)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1216
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1217 elif P_left == "Random" and P_right == "Random":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1218 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1219 axes.text(0.25, 0.7, r"UNKNOWN", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1220 axes.text(0.44, 0.3, r"?", fontsize=200, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1221 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1222 # Texte
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1223 axes.text(0.4, 0.7, r"NEW", fontsize=50, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1224 axes.text(0.44, 0.3, r"!", fontsize=200, fontweight='bold')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1225
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1226 # Draw graph
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1227 if draw:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1228 plt.savefig("%s_logo.png" % phagename, dpi=200)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1229 fig = plt.figure(1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1230 return fig
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1231
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1232
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1233 ### OUTPUT Result files
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1234 def exportDataSplit(sequence, split):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1235 """Export sequence with split line length."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1236 seq = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1237 for i in xrange((len(sequence)/split)+1):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1238 seq += "".join(map(str,sequence[i*split:(i+1)*split])) + '\n'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1239 return seq
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1240
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1241 def ExportStatistics(phagename, whole_coverage, paired_whole_coverage, termini_coverage, phage_plus_norm, phage_minus_norm, paired, test_run):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1242 """Export peaks statistics."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1243 if test_run:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1244 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1245 export = pd.DataFrame()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1246 # ORGANIZE Column
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1247 export["Position"] = list(phage_plus_norm.sort_values("Position")["Position"])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1248 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1249 export["Coverage +"] = paired_whole_coverage[0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1250 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1251 export["Coverage +"] = whole_coverage[0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1252 export["SPC +"] = termini_coverage[0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1253 export["T +"] = [format(x/100.0,'0.2') for x in list(phage_plus_norm.sort_values("Position")["SPC_std"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1254 export["T + (close)"] = [format(x/100.0,'0.2') for x in list(phage_plus_norm.sort_values("Position")["SPC"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1255 export["pvalue +"] = [format(x,'0.2e') for x in list(phage_plus_norm.sort_values("Position")["pval_gamma"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1256 export["padj +"] = [format(x,'0.2e') for x in list(phage_plus_norm.sort_values("Position")["pval_gamma_adj"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1257 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1258 export["Coverage -"] = whole_coverage[1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1259 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1260 export["Coverage -"] = paired_whole_coverage[1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1261 export["SPC -"] = termini_coverage[1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1262 export["T -"] = [format(x/100.0,'0.2') for x in list(phage_minus_norm.sort_values("Position")["SPC_std"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1263 export["T - (close)"] = [format(x/100.0,'0.2') for x in list(phage_minus_norm.sort_values("Position")["SPC"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1264 export["pvalue -"] = [format(x,'0.2e') for x in list(phage_minus_norm.sort_values("Position")["pval_gamma"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1265 export["padj -"] = [format(x,'0.2e') for x in list(phage_minus_norm.sort_values("Position")["pval_gamma_adj"])]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1266 filout = open(phagename + "_statistics.csv", "w")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1267 filout.write(export.to_csv(index=False))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1268 filout.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1269 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1270
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1271 def ExportCohesiveSeq(phagename, ArtcohesiveSeq, P_seqcoh, test_run):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1272 """Export cohesive sequence of COS phages."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1273 if test_run:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1274 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1275 if len(ArtcohesiveSeq) < 3 and len(P_seqcoh) < 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1276 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1277 if len(ArtcohesiveSeq) < 20 and len(P_seqcoh) < 20:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1278 export_text = "cohesive sequence"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1279 filout = open(phagename + "_cohesive-sequence.fasta", "w")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1280 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1281 export_text = "direct terminal repeats sequence"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1282 filout = open(phagename + "_direct-term-repeats.fasta", "w")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1283 if P_seqcoh != '':
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1284 filout.write(">" + phagename + " " + export_text + " (Analysis: Statistics)\n" + exportDataSplit(P_seqcoh, 60))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1285 if ArtcohesiveSeq != '':
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1286 filout.write(">" + phagename + " " + export_text + " (Analysis: Li)\n" + exportDataSplit(ArtcohesiveSeq, 60))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1287 filout.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1288 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1289
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1290 def ExportPhageSequence(phagename, P_left, P_right, refseq, P_orient, Redundant, Mu_like, P_class, P_seqcoh, test_run):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1291 """Export the phage sequence reorganized and completed if needed."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1292 if test_run:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1293 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1294 seq_out = ""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1295 # Mu-like
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1296 if Mu_like:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1297 if P_orient == "Forward":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1298 if P_right != "Random":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1299 if P_left > P_right:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1300 seq_out = refseq[P_right-1:P_left-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1301 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1302 seq_out = refseq[P_right-1:] + refseq[:P_left-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1303 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1304 seq_out = refseq[P_left-1:] + refseq[:P_left-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1305 elif P_orient == "Reverse":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1306 if P_left != "Random":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1307 if P_left > P_right:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1308 seq_out = reverseComplement(refseq[P_right-1:P_left-1])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1309 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1310 seq_out = reverseComplement(refseq[P_right-1:] + reverseComplement(refseq[:P_left-1]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1311 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1312 seq_out = reverseComplement(refseq[P_right-1:] + reverseComplement(refseq[:P_right-1]) )
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1313
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1314 # COS
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1315 elif isinstance(P_left, int) and isinstance(P_right, int):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1316 # Cos or DTR
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1317 if P_class == "COS (3')":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1318 if abs(P_left-P_right) > len(refseq)/2:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1319 seq_out = refseq[min(P_left,P_right)-1:max(P_left,P_right)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1320 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1321 seq_out = refseq[max(P_left,P_right)-1:] + refseq[:min(P_left,P_right)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1322 seq_out = seq_out + P_seqcoh
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1323 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1324 # Genome
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1325 if abs(P_left-P_right) > len(refseq)/2:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1326 seq_out = refseq[min(P_left,P_right)-1:max(P_left,P_right)]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1327 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1328 seq_out = refseq[max(P_left,P_right):] + refseq[:min(P_left,P_right)-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1329 # COS 5'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1330 if P_class == "COS (5')":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1331 seq_out = P_seqcoh + seq_out
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1332 # DTR
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1333 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1334 seq_out = P_seqcoh + seq_out + P_seqcoh
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1335 # PAC
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1336 elif isinstance(P_left, int) or isinstance(P_right, int):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1337 if P_orient == "Reverse":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1338 seq_out = reverseComplement(refseq[:P_right]) + reverseComplement(refseq[P_right:])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1339 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1340 seq_out = refseq[P_left-1:] + refseq[:P_left-1]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1341
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1342 if seq_out != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1343 filout = open(phagename + "_sequence.fasta", "w")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1344 filout.write(">" + phagename + " sequence re-organized\n" + exportDataSplit(seq_out, 60))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1345 filout.close()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1346 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1347
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1348 def CreateReport(phagename, seed, added_whole_coverage, draw, Redundant, P_left, P_right, Permuted, P_orient, termini_coverage_norm_close, picMaxPlus_norm_close, picMaxMinus_norm_close, gen_len, tot_reads, P_seqcoh, phage_plus_norm, phage_minus_norm, ArtPackmode, termini, forward, reverse, ArtOrient, ArtcohesiveSeq, termini_coverage_close, picMaxPlus_close, picMaxMinus_close, picOUT_norm_forw, picOUT_norm_rev, picOUT_forw, picOUT_rev, lost_perc, ave_whole_cov, R1, R2, R3, host, host_len, host_whole_coverage, picMaxPlus_host, picMaxMinus_host, surrounding, drop_cov, paired, insert, phage_hybrid_coverage, host_hybrid_coverage, added_paired_whole_coverage, Mu_like, test_run, P_class, P_type, P_concat):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1349 """Produce a PDF report."""
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1350 doc = SimpleDocTemplate("%s_PhageTerm_report.pdf" % phagename, pagesize=letter, rightMargin=10,leftMargin=10, topMargin=5, bottomMargin=10)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1351 report=[]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1352 styles=getSampleStyleSheet()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1353 styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1354 styles.add(ParagraphStyle(name='Center', alignment=TA_CENTER))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1355 styles.add(ParagraphStyle(name='Right', alignment=TA_RIGHT))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1356 styles.add(ParagraphStyle(name='Left', alignment=TA_LEFT))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1357
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1358 ### GENERAL INFORMATION
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1359
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1360 # TITLE
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1361 ptext = '<b><font size=16>' + phagename + ' PhageTerm Analysis</font></b>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1362 report.append(Paragraph(ptext, styles["Center"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1363 report.append(Spacer(1, 15))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1364
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1365 ## ZOOMED TERMINI GRAPH AND LOGO RESULT
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1366
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1367 # LOGO SLECTION
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1368
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1369 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1370 fig_logo = GraphLogo(P_class, P_left, P_right, draw)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1371 fig_logo.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1372 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1373 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1374 IMAGE_2 = Image(IMG.fileName, width=150, height=150, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1375 IMAGE_2.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1376
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1377 # Zoom on inter-termini seq
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1378 if isinstance(P_left, int) and isinstance(P_right, int) and not Mu_like:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1379 Zoom_left = min(P_left-1000, P_right-1000)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1380 Zoom_right = max(P_left+1000, P_right+1000)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1381 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1382 if P_orient == "Reverse":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1383 zoom_pos_left = P_right-max(0,Zoom_left)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1384 zoom_pos_right = P_left-max(0,Zoom_left)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1385 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1386 zoom_pos_left = P_left-max(0,Zoom_left)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1387 zoom_pos_right = P_right-max(0,Zoom_left)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1388
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1389 figZ_whole = GraphWholeCov(added_whole_coverage[max(0,Zoom_left):min(gen_len,Zoom_right)], phagename + "-zoom", draw, P_left, P_right, zoom_pos_left, zoom_pos_right, 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1390 figZ_whole.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1391 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1392 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1393 IMAGE = Image(IMG.fileName, width=275, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1394 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1395
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1396 data = [[IMAGE, IMAGE_2]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1397 t=Table(data, 1*[4*inch]+1*[3*inch], 1*[2*inch], hAlign='CENTER', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1398 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1399 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1400
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1401 elif isinstance(P_left, int) and P_orient == "Forward":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1402 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1403
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1404 if Mu_like:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1405 figZL_whole = GraphWholeCov(phage_hybrid_coverage[0][max(0,P_left-1000):min(gen_len,P_left+1000)], phagename + "-zoom-left", draw, P_left, "", P_left-max(0,P_left-1000), 0, 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1406 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1407 figZL_whole = GraphWholeCov(added_whole_coverage[max(0,P_left-1000):min(gen_len,P_left+1000)], phagename + "-zoom-left", draw, P_left, P_right, P_left-max(0,P_left-1000), 0, 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1408 figZL_whole.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1409 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1410 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1411 IMAGE = Image(IMG.fileName, width=275, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1412 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1413
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1414 data = [[IMAGE, IMAGE_2]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1415 t=Table(data, 1*[5*inch]+1*[3*inch], 1*[2*inch], hAlign='CENTER', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1416 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1417
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1418 elif isinstance(P_right, int) and P_orient == "Reverse":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1419 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1420
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1421 if Mu_like:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1422 figZR_whole = GraphWholeCov(phage_hybrid_coverage[1][max(0,P_right-1000):min(gen_len,P_right+1000)], phagename + "-zoom-right", draw, "", P_right, 0, P_right-max(0,P_right-1000), 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1423 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1424 figZR_whole = GraphWholeCov(added_whole_coverage[max(0,P_right-1000):min(gen_len,P_right+1000)], phagename + "-zoom-right", draw, P_left, P_right, 0, P_right-max(0,P_right-1000), 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1425 figZR_whole.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1426 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1427 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1428 IMAGE = Image(IMG.fileName, width=275, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1429 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1430
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1431 data = [[IMAGE, IMAGE_2]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1432 t=Table(data, 1*[5*inch]+1*[3*inch], 1*[2*inch], hAlign='CENTER', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1433 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1434 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1435 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1436 data = [[IMAGE_2]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1437 t=Table(data, 1*[1.5*inch], 1*[2*inch], hAlign='CENTER', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1438 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1439
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1440 # Warning coverage message
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1441 if ave_whole_cov < 50 and test_run == 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1442 ptextawc = "- - - - - - - - - WARNING: Coverage (" + str(int(ave_whole_cov)) + ") is under the limit of the software, Please consider results carrefuly. - - - - - - - - -"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1443 data = [[ptextawc]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1444 t=Table(data, 1*[5*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('TEXTCOLOR',(0,0),(-1,-1),'RED'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1445 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1446
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1447 ## Statistics
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1448 ptext = '<u><font size=14>PhageTerm Method</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1449 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1450 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1451
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1452 if Redundant:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1453 Ends = "Redundant"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1454 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1455 Ends = "Non Red."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1456
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1457 data = [["Ends", "Left (red)", "Right (green)", "Permuted", "Orientation", "Class", "Type"], [Ends, P_left, P_right, Permuted, P_orient, P_class, P_type]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1458 t=Table(data, 7*[1.10*inch], 2*[0.25*inch], hAlign='CENTER', style=[('FONT',(0,0),(-1,-2),'Helvetica-Bold'), ('GRID',(0,0),(-1,-1),0.5,colors.grey), ('FONTSIZE',(0,0),(-1,-1),12), ('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1459 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1460 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1461
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1462 # Seq cohesive or Direct terminal repeats
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1463 if P_seqcoh != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1464 if len(P_seqcoh) < 20:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1465 ptext = '<i><font size=12>*Sequence cohesive: ' + P_seqcoh + '</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1466 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1467 ptext = '<i><font size=12>*Direct Terminal Repeats: ' + str(len(P_seqcoh)) + ' bp</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1468 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1469
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1470 # Multiple / Multiple (Nextera)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1471 if P_left == "Multiple" and P_right == "Multiple":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1472 ptext = '<i><font size=12>*This results could be due to a non-random fragmented sequence (e.g. Nextera)</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1473 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1474
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1475 # Concatermer
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1476 elif P_class[:7] == "Headful" and paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1477 ptext = '<i><font size=12>*concatemer estimation: ' + str(P_concat) + '</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1478 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1479
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1480 # Mu hybrid
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1481 elif Mu_like:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1482 if P_orient == "Forward":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1483 Mu_termini = P_left
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1484 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1485 Mu_termini = P_right
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1486 ptext = '<i><font size=12>*Mu estimated termini position with hybrid fragments: ' + str(Mu_termini) + '</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1487 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1488
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1489 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1490
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1491 # Results
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1492 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1493 figP_norm = GraphCov(termini_coverage_norm_close, picMaxPlus_norm_close[:1], picMaxMinus_norm_close[:1], phagename + "-norm", 1, draw)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1494 figP_norm.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1495 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1496 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1497 IMAGE = Image(IMG.fileName, width=240, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1498 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1499
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1500 data = [["Strand", "Location", "T", "pvalue", "T (Start. Pos. Cov. / Whole Cov.)"], ["+",phage_plus_norm["Position"][0],format(phage_plus_norm["SPC"][0]/100.0, '0.2f'),format(phage_plus_norm["pval_gamma_adj"][0], '0.2e'),IMAGE], ["",phage_plus_norm["Position"][1],format(phage_plus_norm["SPC"][1]/100.0, '0.2f'),format(phage_plus_norm["pval_gamma_adj"][1], '0.2e'),""], ["",phage_plus_norm["Position"][2],format(phage_plus_norm["SPC"][2]/100.0, '0.2f'),format(phage_plus_norm["pval_gamma_adj"][2], '0.2e'),""], ["",phage_plus_norm["Position"][3],format(phage_plus_norm["SPC"][3]/100.0, '0.2f'),format(phage_plus_norm["pval_gamma_adj"][3], '0.2e'),""], ["",phage_plus_norm["Position"][4],format(phage_plus_norm["SPC"][4]/100.0, '0.2f'),format(phage_plus_norm["pval_gamma_adj"][4], '0.2e'),""], ["-",phage_minus_norm["Position"][0],format(phage_minus_norm["SPC"][0]/100.0, '0.2f'),format(phage_minus_norm["pval_gamma_adj"][0], '0.2e'),""], ["",phage_minus_norm["Position"][1],format(phage_minus_norm["SPC"][1]/100.0, '0.2f'),format(phage_minus_norm["pval_gamma_adj"][1], '0.2e'),""], ["",phage_minus_norm["Position"][2],format(phage_minus_norm["SPC"][2]/100.0, '0.2f'),format(phage_minus_norm["pval_gamma_adj"][2], '0.2e'),""], ["",phage_minus_norm["Position"][3],format(phage_minus_norm["SPC"][3]/100.0, '0.2f'),format(phage_minus_norm["pval_gamma_adj"][3], '0.2e'),""], ["",phage_minus_norm["Position"][4],format(phage_minus_norm["SPC"][4]/100.0, '0.2f'),format(phage_minus_norm["pval_gamma_adj"][4], '0.2e'),""]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1501 t=Table(data, 4*[1*inch]+1*[4*inch], 11*[0.25*inch], hAlign='CENTER', style=[('SPAN',(0,1),(0,5)), ('SPAN',(0,6),(0,10)), ('SPAN',(4,1),(4,10)), ('LINEABOVE',(0,1),(4,1),1.5,colors.black), ('LINEABOVE',(0,6),(4,6),1.5,colors.grey), ('FONT',(0,0),(-1,0),'Helvetica-Bold'), ('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),12), ('FONTSIZE',(0,1),(0,-1),16), ('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1502
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1503 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1504 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1505
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1506 ## Li's Analysis
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1507 ptext = '<u><font size=14>Li\'s Method</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1508 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1509 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1510
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1511 data = [["Packaging", "Termini", "Forward", "Reverse", "Orientation"], [ArtPackmode, termini, forward, reverse, ArtOrient]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1512 t=Table(data, 2*[1*inch] + 2*[2*inch] + 1*[1*inch], 2*[0.25*inch], hAlign='CENTER', style=[('FONT',(0,0),(-1,-2),'Helvetica-Bold'), ('GRID',(0,0),(-1,-1),0.5,colors.grey), ('FONTSIZE',(0,0),(-1,-1),12), ('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1513
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1514 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1515 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1516
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1517 # Seq cohesive or Direct terminal repeats
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1518 if len(ArtcohesiveSeq) > 2:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1519 if len(ArtcohesiveSeq) < 20:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1520 ptext = '<i><font size=12>*Sequence cohesive: ' + ArtcohesiveSeq + '</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1521 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1522 ptext = '<i><font size=12>*Direct Terminal Repeats: ' + str(len(ArtcohesiveSeq)) + ' bp</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1523 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1524 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1525
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1526 # Results
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1527 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1528 figP = GraphCov(termini_coverage_close, picMaxPlus_close[:1], picMaxMinus_close[:1], phagename, 0, draw)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1529 figP.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1530 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1531 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1532 IMAGE = Image(IMG.fileName, width=240, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1533 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1534
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1535 data = [["Strand", "Location", "SPC", "R", "SPC"],["+",picMaxPlus_close[0][1]+1,picMaxPlus_close[0][0],R2,IMAGE],["",picMaxPlus_close[1][1]+1,picMaxPlus_close[1][0],"-",""],["",picMaxPlus_close[2][1]+1,picMaxPlus_close[2][0],"-",""],["",picMaxPlus_close[3][1]+1,picMaxPlus_close[3][0],"-",""],["",picMaxPlus_close[4][1]+1,picMaxPlus_close[4][0],"-",""],["-",picMaxMinus_close[0][1]+1,picMaxMinus_close[0][0],R3,""], ["",picMaxMinus_close[1][1]+1,picMaxMinus_close[1][0],"-",""], ["",picMaxMinus_close[2][1]+1,picMaxMinus_close[2][0],"-",""], ["",picMaxMinus_close[3][1]+1,picMaxMinus_close[3][0],"-",""], ["",picMaxMinus_close[4][1]+1,picMaxMinus_close[4][0],"-",""]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1536 t=Table(data, 4*[1*inch]+1*[4*inch], 11*[0.25*inch], hAlign='CENTER', style=[('SPAN',(0,1),(0,5)), ('SPAN',(0,6),(0,10)), ('SPAN',(4,1),(4,10)), ('LINEABOVE',(0,1),(4,1),1.5,colors.black), ('LINEABOVE',(0,6),(4,6),1.5,colors.grey), ('FONT',(0,0),(-1,0),'Helvetica-Bold'), ('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),12), ('FONTSIZE',(0,1),(0,-1),16), ('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1537
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1538 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1539
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1540
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1541 # NEW PAGE
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1542 report.append(PageBreak())
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1543
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1544 # HOST RESULTS
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1545 if host != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1546 # Host coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1547 ptext = '<u><font size=14>Host Analysis</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1548 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1549 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1550
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1551 ptext = '<i><font size=10></font>Reads that does not match on the phage genome are tested on the host genome. These reads could come from Phage transduction but also Host DNA contamination.</i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1552 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1553 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1554
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1555 data = [["Host Genome", str(host_len) + " bp"]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1556 t=Table(data, 2*[2.25*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),12), ('ALIGN',(0,0),(-1,-1),'LEFT') ,('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1557
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1558 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1559 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1560
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1561 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1562 figH = GraphCov(host_whole_coverage, picMaxPlus_host[:1], picMaxMinus_host[:1], "", 0, draw)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1563 figH.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1564 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1565 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1566 IMAGE = Image(IMG.fileName, width=240, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1567 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1568
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1569 data = [["Strand", "Location", "Coverage", "-", "Whole Coverage"],["+",picMaxPlus_host[0][1]+1,picMaxPlus_host[0][0],"-",IMAGE],["",picMaxPlus_host[1][1]+1,picMaxPlus_host[1][0],"-",""],["",picMaxPlus_host[2][1]+1,picMaxPlus_host[2][0],"-",""],["",picMaxPlus_host[3][1]+1,picMaxPlus_host[3][0],"-",""],["",picMaxPlus_host[4][1]+1,picMaxPlus_host[4][0],"-",""],["-",picMaxMinus_host[0][1]+1,picMaxMinus_host[0][0],"-",""], ["",picMaxMinus_host[1][1]+1,picMaxMinus_host[1][0],"-",""], ["",picMaxMinus_host[2][1]+1,picMaxMinus_host[2][0],"-",""], ["",picMaxMinus_host[3][1]+1,picMaxMinus_host[3][0],"-",""], ["",picMaxMinus_host[4][1]+1,picMaxMinus_host[4][0],"-",""]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1570 t=Table(data, 4*[1*inch]+1*[4*inch], 11*[0.25*inch], hAlign='CENTER', style=[('SPAN',(0,1),(0,5)), ('SPAN',(0,6),(0,10)), ('SPAN',(4,1),(4,10)), ('LINEABOVE',(0,1),(4,1),1.5,colors.black), ('LINEABOVE',(0,6),(4,6),1.5,colors.grey), ('FONT',(0,0),(-1,0),'Helvetica-Bold'), ('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),12), ('FONTSIZE',(0,1),(0,-1),16), ('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1571
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1572 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1573 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1574
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1575 # Hybrid coverage
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1576 ptext = '<u><font size=14>Hybrid Analysis</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1577 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1578 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1579
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1580 ptext = '<i><font size=10></font>Hybrid reads with one edge on the phage genome and the other edge on the host genome are detected. Phage Hybrid Coverages are used to detect Mu-like packaging mode. Host Hybrid Coverages could be used to detect Phage Transduction but also genome integration location of prophages.</i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1581 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1582 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1583
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1584 picMaxPlus_phage_hybrid, picMaxMinus_phage_hybrid, TopFreqH_phage_hybrid = picMax(phage_hybrid_coverage, 5)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1585 picMaxPlus_host_hybrid, picMaxMinus_host_hybrid, TopFreqH_host_hybrid = picMax(host_hybrid_coverage, 5)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1586
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1587 imgdataPH = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1588 figPH = GraphCov(phage_hybrid_coverage, picMaxPlus_phage_hybrid[:1], picMaxMinus_phage_hybrid[:1], "", 0, draw, 1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1589 figPH.savefig(imgdataPH, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1590 imgdataPH.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1591 IMGPH = ImageReader(imgdataPH)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1592 IMAGEPH = Image(IMGPH.fileName, width=240, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1593 IMAGEPH.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1594
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1595
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1596 imgdataHH = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1597 figHH = GraphCov(host_hybrid_coverage, picMaxPlus_host_hybrid[:1], picMaxMinus_host_hybrid[:1], "", 0, draw, 1)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1598 figHH.savefig(imgdataHH, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1599 imgdataHH.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1600 IMGHH = ImageReader(imgdataHH)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1601 IMAGEHH = Image(IMGHH.fileName, width=240, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1602 IMAGEHH.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1603
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1604 data = [["Phage Hybrid Coverage", "Host Hybrid Coverage"],[IMAGEPH,IMAGEHH]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1605 t=Table(data, 2*[4*inch], 1*[0.25*inch]+1*[2.5*inch], hAlign='CENTER', style=[('LINEABOVE',(0,1),(1,1),1.5,colors.black),('FONT',(0,0),(-1,-1),'Helvetica-Bold'),('FONTSIZE',(0,0),(-1,-1),12), ('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1606
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1607 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1608 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1609
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1610 # NEW PAGE
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1611 report.append(PageBreak())
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1612
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1613
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1614 # DETAILED RESULTS
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1615 ptext = '<u><font size=14>Analysis Methodology</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1616 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1617 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1618
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1619 ptext = '<i><font size=10>PhageTerm software uses raw reads of a phage sequenced with a sequencing technology using random fragmentation and its genomic reference sequence to determine the termini position. The process starts with the alignment of NGS reads to the phage genome in order to calculate the starting position coverage (SPC), where a hit is given only to the position of the first base in a successfully aligned read (the alignment algorithm uses the lenght of the seed (default: 20) for mapping and does not accept gap or missmatch to speed up the process). Then the program apply 2 distinct scoring methods: i) a statistical approach based on the Gamma law; and ii) a method derived from LI and al. 2014 paper.</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1620 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1621 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1622
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1623
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1624 # INFORMATION
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1625 ptext = '<u><font size=12>General set-up and mapping informations</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1626 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1627 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1628
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1629 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1630
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1631 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1632 figP_whole = GraphWholeCov(added_paired_whole_coverage, phagename, draw)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1633 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1634 figP_whole = GraphWholeCov(added_whole_coverage, phagename, draw)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1635 figP_whole.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1636 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1637 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1638 IMAGE = Image(IMG.fileName, width=275, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1639 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1640
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1641 if host == "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1642 host_analysis = "No"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1643 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1644 host_analysis = "Yes"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1645
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1646 if paired == "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1647 sequencing_reads = "Single-ends Reads"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1648 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1649 sequencing_reads = "Paired-ends Reads"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1650
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1651 data = [["Phage Genome ", str(gen_len) + " bp",IMAGE], ["Sequencing Reads", int(tot_reads),""], ["Mapping Reads", str(int(100 - lost_perc)) + " %",""], ["OPTIONS","",""], ["Mapping Seed",seed,""], ["Surrounding",surrounding,""], ["Host Analysis ", host_analysis,""], ["","",""]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1652 t=Table(data, 1*[2.25*inch]+1*[1.80*inch]+1*[4*inch], 8*[0.25*inch], hAlign='LEFT', style=[('SPAN',(2,0),(2,-1)), ('FONT',(0,0),(0,2),'Helvetica-Bold'), ('FONT',(0,3),(0,3),'Helvetica-Oblique'), ('FONT',(0,4),(1,-1),'Helvetica-Oblique'), ('FONT',(2,0),(2,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),12), ('ALIGN',(0,0),(-1,-2),'LEFT'), ('ALIGN',(2,0),(2,-1),'CENTER') ,('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1653
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1654 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1655 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1656
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1657
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1658 # Img highest peaks of each side even if no significative
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1659 ptext = '<u><font size=12>Highest peak of each side coverage graphics</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1660 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1661 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1662
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1663 imgdata = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1664
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1665 if Mu_like and isinstance(P_left, int):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1666 figHL_whole = GraphWholeCov(phage_hybrid_coverage[0][max(0,P_left-1000):min(gen_len,P_left+1000)], phagename + "-zoom-left", draw, P_left, "", P_left-max(0,P_left-1000), 0, 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1667 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1668 P_left = phage_plus_norm["Position"][0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1669 figHL_whole = GraphWholeCov(added_whole_coverage[max(0,P_left-1000):min(gen_len,P_left+1000)], phagename + "-zoom-left", draw, P_left, "", P_left-max(0,P_left-1000), 0, 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1670 figHL_whole.savefig(imgdata, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1671 imgdata.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1672 IMG = ImageReader(imgdata)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1673 IMAGE = Image(IMG.fileName, width=275, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1674 IMAGE.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1675
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1676 imgdata2 = cStringIO.StringIO()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1677
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1678 if Mu_like and isinstance(P_right, int):
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1679 figHR_whole = GraphWholeCov(phage_hybrid_coverage[1][max(0,P_right-1000):min(gen_len,P_right+1000)], phagename + "-zoom-right", draw, "", P_right, 0, P_right-max(0,P_right-1000), 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1680 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1681 P_right = phage_minus_norm["Position"][0]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1682 figHR_whole = GraphWholeCov(added_whole_coverage[max(0,P_right-1000):min(gen_len,P_right+1000)], phagename + "-zoom-right", draw, "", P_right, 0, P_right-max(0,P_right-1000), 1, "Zoom Termini")
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1683 figHR_whole.savefig(imgdata2, format='png')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1684 imgdata2.seek(0)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1685 IMG2 = ImageReader(imgdata2)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1686 IMAGE2 = Image(IMG2.fileName, width=275, height=340, kind='proportional')
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1687 IMAGE2.hAlign = 'CENTER'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1688
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1689 if Mu_like:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1690 data = [["Hybrid Coverage Zoom (Left)", "Hybrid Coverage Zoom (Right)"],[IMAGE,IMAGE2]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1691 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1692 data = [["Whole Coverage Zoom (Left)", "Whole Coverage Zoom (Right)"],[IMAGE,IMAGE2]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1693 t=Table(data, 2*[4*inch], 1*[0.25*inch]+1*[2*inch], hAlign='CENTER', style=[('LINEABOVE',(0,1),(1,1),1.5,colors.black),('FONT',(0,0),(-1,-1),'Helvetica-Bold'),('FONTSIZE',(0,0),(-1,-1),12), ('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1694 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1695
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1696 # Controls
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1697 ptext = '<u><font size=12>General controls information</font></u>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1698 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1699 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1700
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1701 if ave_whole_cov < 50:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1702 ptextawc = "WARNING: Under the limit of the software (50)"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1703 elif ave_whole_cov < 200:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1704 ptextawc = "WARNING: Low (<200), Li's method could not be reliable\n"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1705 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1706 ptextawc = "OK"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1707
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1708 data = [["Whole genome coverage", int(ave_whole_cov), ptextawc]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1709 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[3.5*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1710 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1711
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1712 drop_perc = len([i for i in added_whole_coverage if i < (ave_whole_cov/2)]) / float(len(added_whole_coverage))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1713 if drop_perc < 1:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1714 ptextdp = "OK"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1715 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1716 ptextdp = "Check your genome reference"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1717
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1718 data = [["Weak genome coverage", "%.1f %%" %drop_perc, ptextdp]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1719 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[4*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1720 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1721
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1722 if paired != "":
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1723 insert_mean = sum(insert)/len(insert)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1724 data = [["Insert mean size", insert_mean, "Mean insert estimated from paired-end reads"]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1725 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[4*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1726 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1727
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1728 if lost_perc > 25:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1729 ptextlp = "Warning : high percentage of reads lost"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1730 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1731 ptextlp = "OK"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1732
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1733 data = [["Reads lost during alignment", "%.1f %%" %lost_perc, ptextlp]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1734 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[4*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1735 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1736 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1737
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1738 # DETAILED SCORE
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1739 ptext = '<b><font size=14>i) PhageTerm method</font></b>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1740 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1741 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1742
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1743 ptext = '<i><font size=10>Reads are mapped on the reference to determine the starting position coverage (SPC) as well as the coverage (COV) in each orientation. These values are then used to compute the variable T = SPC / COV. The average value of T at positions along the genome that are not termini is expected to be 1/F, where F is the average fragment size. For the termini that depends of the packaging mode. Cos Phages: no reads should start before the terminus and therefore X=1. DTR phages: for N phages present in the sample, there should be N fragments that start at the terminus and N fragments that cover the edge of the repeat on the other side of the genome as a results T is expected to be 0.5. Pac phages: for N phages in the sample, there should be N/C fragments starting at the pac site, where C is the number of phage genome copies per concatemer. In the same sample N fragments should cover the pac site position, T is expected to be (N/C)/(N+N/C) = 1/(1+C). To assess whether the number of reads starting at a given position along the genome can be considered a significant outlier, PhageTerm first segments the genome according to coverage using a regression tree. A gamma distribution is then fitted to SPC for each segment and an adjusted p-value is computed for each position. Finally if several significant peaks are detected within a small sequence window (default: 20bp), their T values are merged.</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1744 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1745 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1746
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1747 # surrounding
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1748 if surrounding > 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1749 data = [["Nearby Termini (Forward / Reverse)", str(len(picOUT_norm_forw)-1) + " / " + str(len(picOUT_norm_rev)-1), "Peaks localized %s bases around the maximum" %surrounding]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1750 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[4*inch], 1*[0.25*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1751 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1752 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1753
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1754 report.append(Spacer(1, 20))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1755
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1756 # Li's Method
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1757 ptext = '<b><font size=14>ii) Li\'s method</font></b>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1758 report.append(Paragraph(ptext, styles["Left"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1759 report.append(Spacer(1, 10))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1760
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1761 ptext = '<i><font size=10>The second approach is based on the calculation and interpretation of three specific ratios R1, R2 and R3 as suggested in a previous publication from Li et al. 2014. The first ratio, is calculated as follow: the highest starting frequency found on either the forward or reverse strands is divided by the average starting frequency, R1 = (highest frequency/average frequency). Li’s et al. have proposed three possible interpretation of the R1 ratio. First, if R1 < 30, the phage genome does not have any termini, and is either circular or completely permuted and terminally redundant. The second interpretation for R1 is when 30 ≤ R1 ≥ 100, suggesting the presence of preferred termini with terminal redundancy and apparition of partially circular permutations. At last if R1 > 100 that is an indication that at least one fixed termini is present with terminase recognizing a specific site. The two other ratios are R2 and R3 and the calculation is done in a similar manner. R2 is calculated using the highest two frequencies (T1-F and T2-F) found on the forward strand and R3 is calculated using the highest two frequencies (T1-R and T2-R) found on the reverse strand. To calculate these two ratios, we divide the highest frequency by the second highest frequency T2. So R2 = (T1-F / T2-F) and R3 = (T1-R / T2-R). These two ratios are used to analyze termini characteristics on each strand taken individually. Li et al. suggested two possible interpretations for R2 and R3 ratios combine to R1. When R1 < 30 and R2 < 3, we either have no obvious termini on the forward strand, or we have multiple preferred termini on the forward strand, if 30 ≤ R1 ≤ 100. If R2 > 3, it is suggested that there is an obvious unique termini on the forward strand. The same reasoning is applicable for the result of R3. Combining the results for ratios found with this approach, it is possible to make the first prediction for the viral packaging mode of the analyzed phage. A unique obvious termini present at both ends (both R2 and R3 > 3) reveals the presence of a COS mode of packaging. The headful mode of packaging PAC is concluded when we have a single obvious termini only on one strand. A whole coverage around 500X is needed for this method to be reliable.</font></i>'
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1762 report.append(Paragraph(ptext, styles["Justify"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1763 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1764
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1765 if surrounding > 0:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1766 data = [["Nearby Termini (Forward / Reverse)", str(len(picOUT_forw)-1) + " / " + str(len(picOUT_rev)-1), "Peaks localized %s bases around the maximum" %surrounding]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1767 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[3.5*inch], 1*[0.25*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1768 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1769 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1770
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1771 if R1 > 100:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1772 ptextR1 = "At least one fixed termini is present with terminase recognizing a specific site."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1773 elif R1 > 30:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1774 ptextR1 = "Presence of preferred termini with terminal redundancy and apparition of partially circular permutations."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1775 else:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1776 ptextR1 = "Phage genome does not have any termini, and is either circular or completely permuted and terminally redundant."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1777
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1778 data = [["R1 - highest freq./average freq.", int(R1), Paragraph(ptextR1, styles["Justify"])]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1779 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[3.5*inch], 1*[0.25*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1780 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1781 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1782
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1783 if R2 < 3 and R1 < 30:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1784 ptextR2 = "No obvious termini on the forward strand."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1785 elif R2 < 3 :
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1786 ptextR2 = "Multiple preferred termini on the forward strand."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1787 elif R2 >= 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1788 ptextR2 = "Unique termini on the forward strand."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1789
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1790 data = [["R2 Forw - highest freq./second freq.", int(R2), Paragraph(ptextR2, styles["Justify"])]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1791 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[3.5*inch], 1*[0.25*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1792 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1793 report.append(Spacer(1, 5))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1794
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1795 if R3 < 3 and R1 < 30:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1796 ptextR3 = "No obvious termini on the reverse strand."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1797 elif R3 < 3 :
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1798 ptextR3 = "Multiple preferred termini on the reverse strand."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1799 elif R3 >= 3:
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1800 ptextR3 = "Unique termini on the reverse strand."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1801
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1802 data = [["R3 Rev - highest freq./second freq.", int(R3), Paragraph(ptextR3, styles["Justify"])]]
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1803 t=Table(data, 1*[3.5*inch]+1*[1*inch]+1*[3.5*inch], 1*[0.25*inch], hAlign='LEFT', style=[('FONT',(0,0),(0,-1),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),10), ('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE')])
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1804 report.append(t)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1805
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1806 # CREDITS and TIME
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1807 ptext = '<font size=8>%s</font>' % "Please cite: Sci. Rep. DOI 10.1038/s41598-017-07910-5"
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1808 report.append(Paragraph(ptext, styles["Center"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1809 ptext = '<font size=8>%s</font>' % "Garneau, Depardieu, Fortier, Bikard and Monot. PhageTerm: Determining Bacteriophage Termini and Packaging using NGS data."
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1810 report.append(Paragraph(ptext, styles["Center"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1811 ptext = '<font size=8>Report generated : %s</font>' % time.ctime()
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1812 report.append(Paragraph(ptext, styles["Center"]))
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1813
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1814 # CREATE PDF
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1815 doc.build(report)
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1816 return
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1817
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1818
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1819
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1820
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1821
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1822
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1823
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1824
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1825
c8f88ae512f3 Uploaded
mmonot
parents:
diff changeset
1826