- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565543 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174886
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
基因组测序模拟
3 z- g$ ?5 z, d) \基因组测序模拟 V- d% O5 k+ Q a: u( n$ s
+ `' N. V" q( G& [1 \: t, l1 A% p2 y一、摘要; H4 a3 j4 m& _. l. e% w' u
0 A* G" O+ P E$ Q通过熟悉已有的基因组测序模拟和评估程序,加深全基因组鸟枪法测序原理的理解,并且能够编写程序模拟全基因组鸟枪法测序,理解覆盖度、测序深度、拷贝数等概念,设置测序相关参数,生成单端/双端测序结果文件
/ U6 w5 }5 A+ v; [- P5 a2 j$ k+ m. x2 B1 T" Y- N0 ^/ w
二、材料和方法2 J0 p+ k9 L$ D) ] w) F% O9 i5 Y
" w3 |' }% j+ @8 A9 m1、硬件平台/ L' z3 A, C3 N x3 O
; r0 J3 z6 Q: y! }2 I/ f! P
处理器:Intel(R) Core(TM)i7-4710MQ CPU @ 2.50GHz % W0 Z* z; B, w4 G4 V- c
安装内存(RAM):16.0GB; R$ O9 S$ ]* o
. {( y& e8 Q- v! c
2、系统平台
* F( {. B& ?; K- E2 \( L1 ?- |- t& S: LWindows 8.1,Ubuntu. X* {# t8 S0 J T) o6 A9 m
4 C! Y, o* r3 W7 q* c6 a
3、软件平台/ ^. P; r8 q% r* N7 {$ ]7 x5 O
: }# t9 x' |. k2 O# ^2 R3 yart_4540 d0 x7 J/ |9 k, {4 u5 t
GenomeABC http://crdd.osdd.net/raghava/genomeabc/
# f# i; r! B, D+ Y, [# Q$ I# NPython3.5, M( E5 G, m( }; p+ m. B1 E* f
Biopython3 Q K1 F$ V: z+ v" Y
4、数据库资源
% y" Z6 k; h( s# E' U
- U( E& R1 C3 g8 b5 `7 l' ENCBI数据库:https://www.ncbi.nlm.nih.gov/% N6 u1 a( _$ S2 ^0 \
- Z8 \4 C) C; \; {2 [+ Z p5、研究对象/ _ Z# L! S/ W, _$ {: ~
5 Q7 R. @: ?% [1 ~酵母基因组Saccharomyces cerevisiae S288c (assembly R64) * n2 j/ r" p, o( j- k
ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/146/045/GCF_000146045.2_R64/GCF_000146045.2_R64_genomic.fna.gz
9 ]) x y5 Q2 |! j; F3 K h0 e+ S
0 I" X. i/ D3 h6、方法
f3 m" r4 Z# z" q7 \! L* |1 Z
/ s) z& p# G0 r t+ w0 Dart_454的使用 ' ^. l: f* T4 O, }+ B' V% X2 @+ K
首先至art系列软件的官网,下载软件,在ubuntu系统安装,然后阅读相关参数设置的帮助文档,运行程序。
# m. o. S. N1 J6 X9 T' K1 Q yGenomeABC - q' p& _8 g6 N* f+ c6 |& K! R% X
进入GenomeABC(http://crdd.osdd.net/raghava/genomeabc/),输入参数,获得模拟测序结果。
/ N+ _0 g2 @) u/ s: F3 v编程模拟测序 & \' }. R9 E! ?5 q! j, n% e
下载安装python,并且安装biopython扩展模块,编写程序,模拟单端/双端测序。/ x& W3 y* Q7 t" b# i
三、结果
5 |4 b+ a8 J' T$ f* y0 n9 Q! P& O
& g' V# ]* K5 v1 `9 {! t$ z% ^1、art_454的运行结果
' p: F6 q; u: K5 L! _0 F M/ P0 F/ C/ T
无参数art_454运行,阅读帮助文档
4 l) S8 \# P9 P: P
; }" u* v2 Y5 n2 K+ q- V# e: P图表 1无参数art_454运行
2 L# f; @! ?( _- \对酵母基因组进行基因组单端测序模拟,FOLD_COVERAGE设为20,即覆盖度为20.
: K! h' D O- A Y# y0 Q2 R. c下图为模拟单端测序,程序运行过程及结果
' U1 p- E- L: B* F" J% B4 e% m
- k" i+ M* l$ R; u3 Z图表 2 art454单端测序
6 G% l/ l6 p. v( j
0 c( {2 j( `# Z* r: c图表 3 art454单端模拟结果
% B( j8 P5 d5 e9 i双端测序模拟,FOLD_COVERAGE设为20,即覆盖度为20;MEAN_FRAG_LEN设为1500,即平均片段长度为1500;STD_DEV设为20,即长度的标准差为20 ; ]3 r! e9 q0 h8 R& w2 r
下图为模拟双端测序,程序运行过程及结果 ! R1 a# |/ u/ R! ~( k# n
. P) S, A% z% t/ S9 R! W/ Q& y图表 4 art454双端测序 7 D3 B5 N4 k) W8 m& H" L8 C
2 t5 b9 A( s8 _9 r图表 5 art454双端模拟结果 " t+ Z0 h& k- f/ E8 {
2、GenomeABC
6 h! [. B# T: D: ]下图为设置参数页面 w/ |# l7 U+ P+ L# ]
/ z U! | G' z0 }下图为结果下载页面 " J& H: T9 |1 `8 r0 M: O, I: q( y
% F/ [' f4 b5 }& { N
图表 6 结果下载页面
0 u) r+ z" f/ _! F9 ?+ v4 C% p/ P% N3、编程模拟测序结果 5 r" ? P" j5 g: _2 T
拷贝数是这里的N值;覆盖度是m,测序深度是宏观的量,在这里与覆盖度意思相同,就是测序仪10X,20X。
9 ]! Y. x: [+ i. c4 d单端测序 2 r* d& t* k, a) v- S+ l3 I4 u
9 n+ O8 Q7 i" e
图表 7 程序模拟单端测序
% M0 d1 |; a' u6 T; C- {! q; t双端测序 % c* N, O. K9 W) f! }
7 D: n2 c+ D0 f' s* W
图表 8 程序模拟双端测序
: w3 |8 `# m1 ]测序结果 ! P1 }6 M7 F/ n& _
: Y5 F$ @5 S4 Y/ u( J
图表 9 结果文件
m5 _: z q+ \6 ^& W0 U- z9 C8 O- t0 K9 Y) H" f
因为期望片段长度是600bp,在片段长度区间200-1000bp内,所以大部分的片段都没有删除。 * L. z: I7 E! I- ? G) d; B; ?
测序结果统计表
" W) ]) a; B+ y" V) b Z/ x+ E+ J9 o- Z9 W0 \- F4 `# v) l5 |: ^! c# S
测序方式 基因组大小(bp) 片段长度区间 (bp) N值 期望片段长度 克隆保留率 片段数量 Reads长度范围(bp) Reads总数量 Reads总长度 覆盖度(m值) 理论丢失率(e-m) 覆盖率(1-e-m)4 r5 S4 S0 r5 F) k# g& `1 H
单端 12157kb 200-1000 10 600 0.95 107378 50-100 101968 7645.541kb 0.62889 0.53318 0.46682" f4 r. w! |! }5 V8 f, U) z
单端 12157kb 200-1000 20 600 0.95 213722 50-100 202996 15227.882kb 1.25259 0.28576 0.71424$ q; a: B* t% u, G+ N" T7 J
双端 12157kb 200-1000 10 600 0.95 106704 50-100 202770 15212.662kb 1.25134 0.28612 0.71388
# U( @, K, L; s. |+ v7 D, m双端 12157kb 200-1000 20 600 0.95 214212 50-100 407186 30534.265kb 2.51164 0.08114 0.91886
$ J' ~. x; k+ ] ?四、讨论和结论
' z+ M/ \. A* z5 e# n# K' b% T6 [9 E, f
程序运行方法; ~: \0 g% V" n% w/ a0 d; v. {
! h+ |/ Z# g; h9 F6 j在类的构造方法init()中,调整参数。 $ ~$ ]( b1 |4 k6 F- l" D& i
Averagefragmentlength为片段平均的长度; 2 r" ^4 c2 \1 m4 ?! g5 ^+ ?
minfragmentlength和maxfragmentlength是保留片段的范围; $ T+ q( J! D! j' Y7 N' g8 g4 S8 n
cloneRetainprobability是克隆的保留率;
0 B5 v5 d8 G! d7 e# Iminreadslength和maxreadslength是测序reads的长度范围
' u* L1 ^) Y N
8 A& B6 E/ i! {6 W* l, N模拟测序的诸多方法都封装成了Sequencing类,只需要创建类,并调用singlereadsequencing()和pairreadsequencing()方法,传入文件名的参数即可。
n4 m+ g2 W K. G% \7 @; N) t# y+ P, [$ L
附录7 z7 T# y/ i1 r
( G- H& U+ ^$ a* k
from Bio import SeqIO
$ s1 S* F) L. ^from math import exp; U% `2 j1 X/ w7 f
import random$ |7 a) i9 P' b0 t; \9 Z7 ?; |0 k
$ ~! l( N' o- a# o2 M( g7 O- _, z
class Sequencing:
+ }+ t3 D5 r) w$ B9 H$ Y0 R # N代表拷贝份数* M5 F, v% L8 p3 }2 Z. u; x# q
def __init__(self)/ Y! o8 p+ s) t$ M' G0 g7 L
self.fragmentList = []2 y6 I' d6 K. `: D u) I. C( y- f/ k" Y
self.readsID = 1
0 a7 K& J3 l/ x o& p$ t self.readsList = []) s/ g7 f$ L3 d9 d* u G
self.averagefragmentlength = 650
- Q$ A3 {" H! w$ n ] self.minfragmentlength = 500
e: ?! [& n" T4 |7 k self.maxfragmentlength = 800
7 N/ [! t# m& Z7 n) K self.cloneRetainprobability = 1
9 x: q. t. j2 @$ R self.minreadslength = 50; d8 {% Y' `7 r: ^5 w
self.maxreadslength = 150, `* ?: e$ K) p% J
self.N = 10
2 H& `3 }& m, C4 I( N3 A3 h self.genomeLength = 0
$ h- |; ?& i$ Y# {9 ?6 N self.allreadslength = 0
) M" `8 G) `# l) i+ W& d6 M: g1 K0 C6 c8 x' F0 S }
# 生成断裂点- k: d* P( j) _8 O1 o3 C5 N6 C
def generatebreakpoint(self, seqlen, averageLength):6 ^ p; M8 q6 f% v1 z: P
# 假设平均每500bp 产生一个断裂点(averageLength = 500),通过随机函数生成seqlen/500个随机断裂点(1到seqlen之间的随机整数)% R* q7 E) C2 A; n. b
breakpoint = [random.randint(0, seqlen) for _ in range(int(seqlen / averageLength))]/ f3 \* {: g: _; |! z9 H+ v
breakpoint.append(seqlen)
9 j9 _9 S* D$ @# r$ A1 v. G/ Y; r6 J breakpoint.append(0)( i" M* A7 I. _ \
# 把随机断裂点从小到大排序 q/ d1 k5 A+ V/ r5 \6 M
breakpoint.sort()' k. b6 G n- E
return breakpoint8 h+ P5 U3 ^4 V i( K: }4 f4 t6 S
% N; e4 d& A& D3 w* r* c" n
# 沿断裂点打断基因组,并删除不符合长度要求的序列片段,定义片段范围:200-1000bp
5 B' X' h/ n- P def breakgenome(self, seq, breakpoint, minfragmentlength, maxfragmentlength):
" B& a$ H/ w! ]1 J1 t2 |: ~* ^- n for i in range(len(breakpoint) - 1):. i9 n6 T; C+ S' x3 z
fragment = seq[breakpoint:breakpoint[i + 1]]
/ |2 C1 I* z" l$ G/ ?8 g if maxfragmentlength > len(fragment) > minfragmentlength:
% o; \% A4 ~) I$ S7 X W self.fragmentList.append(fragment)
4 Z7 B, M p3 M& h% X% V return self.fragmentList
2 ^& { q& A. ]% n G0 g M! j2 O9 U' A! }4 k: j& z
# 模拟克隆时的随机丢失情况,random.random()生成0-1的保留概率5 a: C- [4 `1 U2 ^6 P6 J- J
def clonefragment(self, fragmentList, cloneRetainprobability):! \9 P3 {. `& e6 D( N
clonedfragmentList = []+ d" U/ P2 Q# X- v% ~9 w* J
Lossprobability = [random.random() for _ in range(len(fragmentList))]
. n: @0 F- {5 j/ [( a% M for i in range(len(fragmentList)):
+ S8 o& X0 F1 [% U if Lossprobability <= cloneRetainprobability:
' Y) z8 ~7 e; d% i: R3 N clonedfragmentList.append(fragmentList); |0 b: Q3 i1 w1 l2 `* ]) X; V
return clonedfragmentList
9 e$ ^1 I; i6 X9 s5 S9 S
+ W& P: W2 j9 f1 G # 模拟单端测序,并修改reads的ID号! P1 ?8 E j- X& m
def singleread(self, clonedfragmentList):
: U" ?. U" {8 f/ Z6 S for fragment in clonedfragmentList:
# A j, s" ^2 F7 Y- H/ [7 w/ T fragment.id = ""
+ e. D4 F1 \: z0 b fragment.name = ""; a9 b3 b/ f9 E" C ?6 B) I: o
fragment.description = fragment.description[12:].split(",")[0]6 j* P# U: e4 G8 a" ^2 E
fragment.description = str(self.readsID) + "." + fragment.description
O1 K: r- g# E3 t) ^0 k) q- r o self.readsID += 16 |" A; D& z: g, X/ H1 r. \ t
readslength = random.randint(self.minreadslength, self.maxreadslength)' Z: m P! {9 Z
self.allreadslength += readslength8 E4 K0 v3 v3 j* f
self.readsList.append(fragment[:readslength])
0 C5 p. b% H! h: ^* U
, i3 O" M3 _/ R) i& S' ~1 m1 M) D6 A2 B def singlereadsequencing(self, genomedata, sequencingResult):
- {, B& |; Q4 H# t for seq_record in SeqIO.parse(genomedata, "fasta"):
5 f& W; P! `$ L$ G seqlen = len(seq_record)6 G' N$ M/ B5 }( o6 P$ e
self.genomeLength += seqlen
6 P/ j6 r, H' G6 i2 o! M for i in range(self.N):
+ b( f( f! V0 I4 i4 m # 生成断裂点9 o, x$ n) J7 ~, |) W: p
breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)
: S7 f ?- j( z$ k3 _- r # 沿断裂点打断基因组
. Q2 O' Y3 t1 w* i1 `2 @ self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)
( w, X" K8 \+ {; w. \' A2 J # 模拟克隆时的随机丢失情况2 w. z5 ~% k5 G5 h4 S ^/ y
clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability)
% J% j" R! c' C9 { # 模拟单端测序
6 U- A3 W3 J# ~+ `! f- m' i self.singleread(clonedfragmentList)
7 N9 m' ^% G; n, e3 \ SeqIO.write(self.readsList, sequencingResult, "fasta"), F9 z% ~* [' I
, B6 q6 j p5 v# D% l8 C; X
def pairread(self, clonedfragmentList):
% V# e' U2 L+ {6 O for fragment in clonedfragmentList:
' p. z5 K4 X+ z2 D7 g fragment.id = ""3 m; o8 D x! J9 e/ V1 r
fragment.name = """ C4 R& a+ V: M$ G2 L
description = fragment.description[12:].split(",")[0]4 ]7 [# Y: w: M5 d" R
fragment.description = str(self.readsID) + "." + description
4 A; ^! a2 t& y( J- n readslength = random.randint(self.minreadslength, self.maxreadslength)/ k/ v! U- P7 O2 h* A' l& X
self.allreadslength += readslength
. a- S. v. g% f4 [, s self.readsList.append(fragment[:readslength])* q8 u1 K# |( y" s' t
+ `- F( L8 h* P) k7 D' M6 U! W2 [ readslength = random.randint(self.minreadslength, self.maxreadslength)
3 B1 y0 M7 P9 {; V# G, g; C( K2 o self.allreadslength += readslength O8 d' a( y3 ^ W0 ?
0 {' Y+ w) t6 A# P& H- s" Z8 |
fragmentcomplement = fragment.reverse_complement()5 c: S# n! A( {+ a' O3 b
fragmentcomplement.id = ""
6 [7 x Q/ A# h1 u. w1 J+ V fragmentcomplement.name = ""
2 x. y( k, \2 Q2 P. V: z7 e fragmentcomplement.description = str(self.readsID) + "." + description) N L1 V$ p) Z
self.readsList.append(fragmentcomplement[:readslength])
% x7 g q8 o" W2 L' q
+ F: E& f/ O' }( N- k1 ]+ d7 w$ K6 v self.readsID += 16 _; B. A* I3 S0 Y
% ]8 {8 r3 D l# k# a def pairreadsequencing(self,genomedata, sequencingResult_1, sequencingResult_2):. I/ V1 w& x( G P
for seq_record in SeqIO.parse(genomedata, "fasta"):1 v( K+ _2 q4 z* O( `
seqlen = len(seq_record)2 G1 Q( w7 v# _9 U: J0 V3 }2 v& c
self.genomeLength += seqlen
$ {9 c" i6 s- P$ B+ N for i in range(self.N): z: q7 d9 e) s/ {8 p: c8 j9 }/ j4 _, i
# 生成断裂点
6 C7 a& d7 C) Q breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)5 H4 D: B. n6 L& [. U
# 沿断裂点打断基因组
- K" Q: s6 s. K self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)
5 s) \ I, {( i7 d7 U( l) A! w # 模拟克隆时的随机丢失情况& E0 f2 I0 m: u
clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability)
% |: ]8 }% t8 N7 f$ d6 V # 模拟双端测序
" p" k0 A+ k8 O c self.pairread(clonedfragmentList)& E4 w( \- f; y9 ^, p" R
readsList_1 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 0]
" A4 b/ W' M* [8 T$ N readsList_2 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 1]' H9 d E7 [" Y9 Z
SeqIO.write(readsList_1, sequencingResult_1, "fasta")4 e9 M6 b" o) Q
SeqIO.write(readsList_2, sequencingResult_2, "fasta")
; L5 H7 F8 b4 P l0 Y, Z
( G: t1 \0 B! @* z; a# v def resultsummary(self):1 n; W: O2 W% @
print("基因组长度:" + str(self.genomeLength / 1000) + "kb")
3 v3 ^' p' X' Y" n8 o print("片段长度区间:" + str(self.minfragmentlength) + "-" + str(self.maxfragmentlength))( K* I. }+ Q" m1 q- ?0 A
print("N值:" + str(self.N))
6 b% E) D4 f3 g% @3 ^7 g print("期望片段长度:" + str(self.averagefragmentlength))
! l( Q# H9 ^) y; w. ] print("克隆保留率:" + str(self.cloneRetainprobability))
, j9 G- P8 Z* Z9 h& l print("片段数量:" + str(len(self.fragmentList)))
% G5 x& o( R( j# ?1 ^0 P x" m" { print("reads长度:" + str(self.minreadslength) + "-" + str(self.maxreadslength))8 Y1 y' h. b5 d9 ^( E; e
print("reads总数量:" + str(len(self.readsList)))4 G5 E$ P; \6 @
print("reads总长度:" + str(self.allreadslength / 1000) + "kb"): x1 s. B9 K4 D4 k' [
m = self.allreadslength / self.genomeLength7 x6 R9 Y$ {9 S) c' a
print("覆盖度(m值):" + str(round(m, 5)))& a) o6 G$ `3 m, s; ?) _
print("理论丢失率(e^-m):" + str(round(exp(-m), 5)))% p) B* x% t. H' f& V5 n w
print("覆盖率(1-e^-m):" + str(round(1 - exp(-m), 5)))' P8 C$ T `4 D. K
# -------------------------------------------主程序-------------------------------------------& I6 q$ e% C1 Z! J2 B! K# u! b
# 模拟单端测序
, C4 X' p7 L! c1 K+ h- b3 k7 msequencingObj = Sequencing()
2 r7 {# l _% NsequencingObj.singlereadsequencing("data/NC_025452.fasta", "result/virusSingleRead.fa")
4 A" [' y% \0 `; m9 A; TsequencingObj.resultsummary()! E' Z* ^: L! k: l* Z
( [4 f! u% }# n" B: a
# 模拟双端测序3 ]+ E, S: G4 \8 b1 d
sequencingObj = Sequencing()
; W+ Z! k: h+ esequencingObj.pairreadsequencing("data/GCF_000146045.2_R64_genomic.fna", "result/yeastPairRead_1.fa", "result/yeastPairRead_2.fa")
. p) y B" @. G" L5 `4 CsequencingObj.resultsummary()
: u) d& w5 u' gfrom Bio import SeqIO
/ s: @. h0 P' E4 ]: Nfrom math import exp9 B* e+ o: l; ^1 H) v$ C
import random
- g, z8 M5 a3 W+ s4 p r% a; T6 m" L+ ~
class Sequencing:$ I k6 O" R* r
# N代表拷贝份数+ E8 U1 E7 l) T+ o' b* \; [
def __init__(self): @1 a5 U5 m" @% \
self.fragmentList = []
+ ^0 f5 v1 j, N7 T8 H self.readsID = 1
. d+ y# p; C9 u* J f self.readsList = []
8 R8 k& \% ~4 @3 a self.averagefragmentlength = 650
* ?# y! P; H- A6 e+ x' z self.minfragmentlength = 500/ ?) `) ?: b1 K! `8 N
self.maxfragmentlength = 800
7 g+ v$ ~+ o% J# A0 r self.cloneRetainprobability = 1
6 Q! A2 Q$ m6 n* J6 T3 z self.minreadslength = 50% O0 [* {$ u! x- n. {$ m( g' n
self.maxreadslength = 150; B2 S0 e5 y! [1 m+ z" C
self.N = 10
2 o# S2 ~0 I; d# }) v self.genomeLength = 08 Q9 r4 _- `0 L! g
self.allreadslength = 0& o, z/ X" [9 Y, [) r$ ?. w( V
! K7 r/ p2 N- } # 生成断裂点9 s1 ?" X6 |$ j- z
def generatebreakpoint(self, seqlen, averageLength):
" ?+ O; d P: e u# @ # 假设平均每500bp 产生一个断裂点(averageLength = 500),通过随机函数生成seqlen/500个随机断裂点(1到seqlen之间的随机整数)* o$ t" u2 a7 e2 H Z" R
breakpoint = [random.randint(0, seqlen) for _ in range(int(seqlen / averageLength))]! k4 e- ~, c, G
breakpoint.append(seqlen)& C. Q) Y9 ^% y6 x2 l
breakpoint.append(0); B8 {2 n8 i$ I+ o
# 把随机断裂点从小到大排序
; z6 o+ q2 V3 P& ^$ L# }4 q breakpoint.sort()/ j6 s4 }3 Y1 n
return breakpoint
: s& S ?! i7 w% J" f3 S
3 e( l- O4 W8 |0 K( C8 H! V5 N; ^ # 沿断裂点打断基因组,并删除不符合长度要求的序列片段,定义片段范围:200-1000bp. s1 Y! {7 W& O3 n
def breakgenome(self, seq, breakpoint, minfragmentlength, maxfragmentlength):
- G9 T( A1 r5 b# F) @; M for i in range(len(breakpoint) - 1):" j. L; S( \- C6 J
fragment = seq[breakpoint:breakpoint[i + 1]]
7 }# R/ k6 Y! X7 K- V2 ^ if maxfragmentlength > len(fragment) > minfragmentlength:
8 h, P1 p' r q$ T self.fragmentList.append(fragment)
- p; Y) j/ t. \; e% D" X3 x return self.fragmentList
0 @/ o* j8 A' C2 H: L2 X1 }; n' M7 o" x( D" j9 o( l
# 模拟克隆时的随机丢失情况,random.random()生成0-1的保留概率
* q2 _7 u: ?8 A. `( N4 T def clonefragment(self, fragmentList, cloneRetainprobability):' C) h& q4 T. C" Q, W
clonedfragmentList = []
' m7 N9 E4 u+ e1 ?2 u, n& } Lossprobability = [random.random() for _ in range(len(fragmentList))]
! B" ?+ T! `7 q. g3 ?& o for i in range(len(fragmentList)):
' I; o$ B3 T, j4 A: v# F1 F0 S. A, w/ F/ k: z if Lossprobability <= cloneRetainprobability:
+ R. X- u, X6 b5 P+ }8 p clonedfragmentList.append(fragmentList)
9 i% z" A) t/ @1 K3 r0 S* ~ return clonedfragmentList
& \/ p; a7 w( N" ~" j3 m# o
5 o% {5 u9 [5 K7 T" P0 A # 模拟单端测序,并修改reads的ID号6 B( V: Q; y7 {1 {! r$ H( V0 X
def singleread(self, clonedfragmentList):: o9 q8 {; `" i8 h4 p& f
for fragment in clonedfragmentList:
% B% d5 X/ r3 ? fragment.id = ""
' C! j& Z: b v! k; }' h fragment.name = ""
. A3 W4 X* U8 d6 a/ B/ R0 [4 ~8 N; @ fragment.description = fragment.description[12:].split(",")[0]$ a; T( a4 B; l# k; F2 d& g
fragment.description = str(self.readsID) + "." + fragment.description
0 u( \% A; \: z; N3 Q self.readsID += 1$ ^( T1 h8 \% E( Z" ?! T6 ^0 z
readslength = random.randint(self.minreadslength, self.maxreadslength)
' M; M8 P' j# I8 B self.allreadslength += readslength
, w7 y; w; h: v A self.readsList.append(fragment[:readslength])8 o; A# K, |6 }
! O0 @7 }$ i; t! e* g% C
def singlereadsequencing(self, genomedata, sequencingResult):2 k4 u9 y4 _9 V8 @8 m; L0 [
for seq_record in SeqIO.parse(genomedata, "fasta"):2 k- g# z+ \2 q: z
seqlen = len(seq_record)+ c: q7 h- G6 o" R7 v; G) {3 y, N
self.genomeLength += seqlen6 i2 g6 Y! B9 R! b
for i in range(self.N):' V& t; m2 j3 f
# 生成断裂点
, o9 X! b4 m X7 p( z' y% m9 b breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)
# v' {$ _9 w- E # 沿断裂点打断基因组
+ O l5 j' Z$ q z+ Y self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)
0 r! M r& M8 A+ t8 X # 模拟克隆时的随机丢失情况
/ |- \0 A( J/ A4 U# v7 y clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability)' A" E9 ]2 C' G( j6 O
# 模拟单端测序
+ [, e; C S8 {$ L4 n3 K self.singleread(clonedfragmentList)
8 l9 z8 W4 ^7 f" q4 _ SeqIO.write(self.readsList, sequencingResult, "fasta")8 |, c' J5 |: n8 d! ?6 N& D
, I2 L6 s! q; d def pairread(self, clonedfragmentList):
: w4 _, z. K- q Y/ } for fragment in clonedfragmentList:* v$ a2 ?2 z. ~# r7 D
fragment.id = ""
0 z) c9 f1 q* C+ x! p7 m2 H fragment.name = ""
0 g4 B! _+ Q& P description = fragment.description[12:].split(",")[0]
7 q& ]9 A, X9 G fragment.description = str(self.readsID) + "." + description
! ^& J# s. Y8 T7 p3 R+ c4 ] readslength = random.randint(self.minreadslength, self.maxreadslength)- o) k9 p$ m: w( B9 c
self.allreadslength += readslength
$ }( |3 _5 h$ f6 @ self.readsList.append(fragment[:readslength])
; @; ]7 l! z1 a. c4 c& T9 L' ?/ Q& z: u
readslength = random.randint(self.minreadslength, self.maxreadslength)
" i4 m- K1 {/ \+ g% `+ {& Q$ p0 S" |' e self.allreadslength += readslength
% ~6 o1 f: E; X( K9 e4 U' a- f: C- D8 q9 x6 {) {8 w, U
fragmentcomplement = fragment.reverse_complement()
! A5 d* \3 ?7 B6 G& k F+ }9 f fragmentcomplement.id = ""
5 ?3 h3 X7 M' T/ o( q fragmentcomplement.name = ""
9 A# o/ M' \: g' K0 T0 R fragmentcomplement.description = str(self.readsID) + "." + description# j+ r+ Z! |& k% V+ H* O; E$ r- y/ V
self.readsList.append(fragmentcomplement[:readslength])" o! o) u' C& Z, y/ Y* R( W7 M) V
; z% u* a% g! X7 n0 g9 z" P) D self.readsID += 1- `" v% l7 |, y0 e; C' D8 d' i
1 |, k0 F/ Q: o b8 B" h
def pairreadsequencing(self,genomedata, sequencingResult_1, sequencingResult_2):% `: a* L2 m% Y' J X
for seq_record in SeqIO.parse(genomedata, "fasta"):
( _ G1 v+ k/ \0 r4 g seqlen = len(seq_record)$ y3 J! m8 P% S3 o1 U3 j! g1 a! L
self.genomeLength += seqlen/ k& }* N, G" L. r/ a6 y7 P
for i in range(self.N):
- f9 H9 e$ t q4 _8 I" o # 生成断裂点
% p. @$ R% C5 L1 ^- n' _: h& S breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)! {' Z8 J, [6 {7 F9 A0 H4 X
# 沿断裂点打断基因组9 X% P% i' M7 F* Q% F+ A
self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)( i I* ?) V( Z+ Z
# 模拟克隆时的随机丢失情况" n' L. S9 a: B5 z& N; }1 [+ z
clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability)
$ C" c/ _" _( I' D+ | # 模拟双端测序
9 K, F* b: s6 R0 r* { self.pairread(clonedfragmentList)6 J: b5 ^' C; T; a# q" I% b5 ?
readsList_1 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 0]0 M3 C9 E* F2 C) ^4 D/ B, y% w
readsList_2 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 1]
$ L9 r, z' |3 P SeqIO.write(readsList_1, sequencingResult_1, "fasta")
: }2 y" ~3 H( ?% ~ SeqIO.write(readsList_2, sequencingResult_2, "fasta")
% t2 b( p1 Y N3 y* d2 U, N
, W9 \/ ?+ M- _# w8 Z) R# e/ d1 S) Y def resultsummary(self):
5 j* H/ _! @! A( j6 s5 _ print("基因组长度:" + str(self.genomeLength / 1000) + "kb")
. w$ `1 \& J& K3 [ print("片段长度区间:" + str(self.minfragmentlength) + "-" + str(self.maxfragmentlength))/ ^/ H( C6 h. G0 L
print("N值:" + str(self.N))
. v$ i. L6 o6 G' s! w$ }$ B( T, ? print("期望片段长度:" + str(self.averagefragmentlength))# m; F" ]/ Z9 m+ F6 i! _$ d9 j1 V
print("克隆保留率:" + str(self.cloneRetainprobability))
. V$ u+ K W* w+ q( B% A print("片段数量:" + str(len(self.fragmentList)))
9 g& J! d( [7 C print("reads长度:" + str(self.minreadslength) + "-" + str(self.maxreadslength)) f/ k7 g6 W4 D" \" H8 f+ K
print("reads总数量:" + str(len(self.readsList)))
+ [& g# E% L L5 W) m print("reads总长度:" + str(self.allreadslength / 1000) + "kb")7 |4 c/ s7 z1 ~7 y: r8 w# H8 t
m = self.allreadslength / self.genomeLength
( c6 X4 Y: t4 b" b3 V4 N% d print("覆盖度(m值):" + str(round(m, 5)))
/ `% w/ I! P8 u2 g print("理论丢失率(e^-m):" + str(round(exp(-m), 5)))
$ Y9 `. g9 x$ w5 V print("覆盖率(1-e^-m):" + str(round(1 - exp(-m), 5)))
) n: e- l9 t$ Y! u# -------------------------------------------主程序-------------------------------------------9 }" w" \, g) `( v
# 模拟单端测序
6 i- k. w8 {2 vsequencingObj = Sequencing()+ j( e2 P7 u8 u) ~
sequencingObj.singlereadsequencing("data/NC_025452.fasta", "result/virusSingleRead.fa")
3 c7 t: x# {3 g" hsequencingObj.resultsummary()
. h4 J' r+ z0 e; K6 O4 A+ c, p ?' [4 F6 ^2 B Q
# 模拟双端测序
( O( X+ R1 C! j8 osequencingObj = Sequencing()
- }: I& C# K" o! {. I6 ^# HsequencingObj.pairreadsequencing("data/GCF_000146045.2_R64_genomic.fna", "result/yeastPairRead_1.fa", "result/yeastPairRead_2.fa")! K: n: P( V" M) L ^0 I3 Q" k
sequencingObj.resultsummary()
& { Z9 b* k$ c* y( k7 U3 V! @5 k0 M) @9 [2 f, ?0 v
- k3 g* M1 `# [9 X3 q, x* G: J5 R C5 w* y3 ]
1 U! ]7 ^$ e3 [8 e9 L9 Y |
zan
|