- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566881 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175287
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
基因组测序模拟: G0 `/ P* R7 Q2 M0 y C! F$ ? `
基因组测序模拟
" J: ?8 R$ c/ @* {
4 c3 a) Y8 s% c一、摘要
& H5 T% O/ @; P
% X6 R# Z) M/ e* J/ w3 _3 v通过熟悉已有的基因组测序模拟和评估程序,加深全基因组鸟枪法测序原理的理解,并且能够编写程序模拟全基因组鸟枪法测序,理解覆盖度、测序深度、拷贝数等概念,设置测序相关参数,生成单端/双端测序结果文件2 v; w" s t6 i% m3 ?+ X9 P
, ?9 ?9 C# l2 ~; `9 `二、材料和方法* t$ k+ p- Y% E& O( {" y
j. f7 N2 J; V Y D
1、硬件平台# r, O' U( N& J" d, s
+ B/ G- M8 v4 o: }2 h* o; `3 w
处理器:Intel(R) Core(TM)i7-4710MQ CPU @ 2.50GHz
7 e" k" w) V, k" J安装内存(RAM):16.0GB! `1 g m4 ^1 C
$ u- ~6 @: Q% @& U5 t" r0 a A2、系统平台( I9 M) y V& y3 ~1 [- |
Windows 8.1,Ubuntu% p! O r4 {2 q9 ]+ {8 w
$ D2 O. i; i; ~1 E3、软件平台
! U% w. R; E4 ] _7 b
3 g& p" t9 B4 a4 ?* C/ M' Sart_4540 l' X* E o* |! X6 r
GenomeABC http://crdd.osdd.net/raghava/genomeabc/
5 r; `) X$ i3 ]9 g! APython3.52 i- h. e. j- G' a
Biopython7 @. V: q/ i; ^: N* f9 x1 s% L9 d- {( k
4、数据库资源- ]1 q7 A3 u# r# `) o) |( ]& |
+ l8 z3 ?0 N& x. l# J" m# B
NCBI数据库:https://www.ncbi.nlm.nih.gov/
' F6 ]. X$ l. H& F* I7 _
9 E K( {; Z; t. M3 v4 S3 c5、研究对象
+ [( S4 d% t3 ^8 T: c8 A6 Q
5 M" L! T* l; k" \% o E酵母基因组Saccharomyces cerevisiae S288c (assembly R64) # j) w X c8 P: |: ] ^( c" H
ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/146/045/GCF_000146045.2_R64/GCF_000146045.2_R64_genomic.fna.gz6 t2 p0 Y- V6 d+ c6 m* h
2 ^4 D8 O0 f; N. r$ E- E/ i
6、方法8 P# k3 |% A: O! F2 K& i5 N: [
0 A4 k6 X2 I P4 ?3 o+ B8 n
art_454的使用
& J j, g8 F+ f6 _/ p1 @首先至art系列软件的官网,下载软件,在ubuntu系统安装,然后阅读相关参数设置的帮助文档,运行程序。* X9 b: l6 X; ~ w( T9 H/ j; \
GenomeABC / e( Y, Y6 b7 S
进入GenomeABC(http://crdd.osdd.net/raghava/genomeabc/),输入参数,获得模拟测序结果。
" ]2 l0 O. H( `编程模拟测序
0 L! E/ ^. N: m) d2 U! Z7 z下载安装python,并且安装biopython扩展模块,编写程序,模拟单端/双端测序。
+ t C" F' K9 m# G! }1 ~三、结果
) _- x" P& ^9 t# K1 [
* S& T' k/ r8 H1、art_454的运行结果
Q3 z2 W) J+ \7 D! A3 t2 b" i5 i; q9 }6 d
无参数art_454运行,阅读帮助文档
% F: q; s6 B2 H6 j
5 B2 f" h4 m+ o! ]5 x& S$ g: Z2 a图表 1无参数art_454运行 2 S! g) Z( Q" i# W c3 O
对酵母基因组进行基因组单端测序模拟,FOLD_COVERAGE设为20,即覆盖度为20.
8 N2 @/ v7 t* u4 x% Q下图为模拟单端测序,程序运行过程及结果 9 G0 C/ a, X, u7 W, u+ Q; y
3 u5 ~ p+ \3 ~6 @+ j
图表 2 art454单端测序
! I. ]+ G M4 v, Z
3 {) f" y V' ]0 }) k( m图表 3 art454单端模拟结果 5 P$ D& B, r/ t5 S O, c4 x
双端测序模拟,FOLD_COVERAGE设为20,即覆盖度为20;MEAN_FRAG_LEN设为1500,即平均片段长度为1500;STD_DEV设为20,即长度的标准差为20
5 G' t' k8 h1 n% H3 B! i1 s1 n# i; M" X下图为模拟双端测序,程序运行过程及结果 ?3 q8 \5 T6 ]1 I' H' b' t
; H/ ^. H% T2 h5 z8 z图表 4 art454双端测序
) [! ^, ?: k4 R1 ^% w5 q# K5 s) K: ]* L+ F' O# J
图表 5 art454双端模拟结果 ( B# W; x B+ o8 J3 J: `
2、GenomeABC $ ~0 ?5 a4 g( H$ |3 B) D6 D$ l1 O
下图为设置参数页面 - d& q7 d: m: T! b6 ` P1 J
1 m3 ?; o7 A3 m4 X( ^
下图为结果下载页面 3 e9 A1 R0 J! X6 u) V
5 @3 _" I1 |" \. [图表 6 结果下载页面 ) t3 s# _5 B1 ^4 w2 x- a& s, n
3、编程模拟测序结果
/ [4 ?2 d$ f/ B拷贝数是这里的N值;覆盖度是m,测序深度是宏观的量,在这里与覆盖度意思相同,就是测序仪10X,20X。
& e1 l, X' M) v! x: C单端测序
6 @4 k4 w$ j1 S
& O/ g4 F2 b! i: X2 c7 q0 J图表 7 程序模拟单端测序 # N8 b& N% y, d2 J# ]6 j8 v
双端测序 * |$ P! \0 Y% t
! {! W- @6 a# V& i" q
图表 8 程序模拟双端测序 * I& A8 B; @3 g4 G7 n; m4 I
测序结果
; u* `; ~, V! o0 N* d& g
! l! B+ ]5 |: v# r: U图表 9 结果文件- w) N. O% ^! B P* j
& B& K' D$ ?4 x' `% `. d1 A因为期望片段长度是600bp,在片段长度区间200-1000bp内,所以大部分的片段都没有删除。 ( u& Z' e# c& {
测序结果统计表
5 o! f- G' N+ G: p, g3 t0 t, }5 r; k' \* `' w K
测序方式 基因组大小(bp) 片段长度区间 (bp) N值 期望片段长度 克隆保留率 片段数量 Reads长度范围(bp) Reads总数量 Reads总长度 覆盖度(m值) 理论丢失率(e-m) 覆盖率(1-e-m)) r/ B! \0 f8 q* i5 D" S/ {
单端 12157kb 200-1000 10 600 0.95 107378 50-100 101968 7645.541kb 0.62889 0.53318 0.46682
' O* P# K4 {$ T单端 12157kb 200-1000 20 600 0.95 213722 50-100 202996 15227.882kb 1.25259 0.28576 0.71424
5 ?$ L) f) a& _2 `$ e8 D双端 12157kb 200-1000 10 600 0.95 106704 50-100 202770 15212.662kb 1.25134 0.28612 0.71388
|, A" g a2 u/ `# Q# M双端 12157kb 200-1000 20 600 0.95 214212 50-100 407186 30534.265kb 2.51164 0.08114 0.918868 W$ I# t) b2 l }
四、讨论和结论
9 g% V& N. ?+ G
1 L: W% h3 n6 ^- c6 J' u程序运行方法
! \, T8 C3 p, X1 ]) T) N) z) [( n; J3 P
在类的构造方法init()中,调整参数。 : ~; N3 J) f) h+ c, h
Averagefragmentlength为片段平均的长度;
& p3 Y$ D( J& e' e" x1 zminfragmentlength和maxfragmentlength是保留片段的范围;
' c8 L/ X' |9 FcloneRetainprobability是克隆的保留率;
) T) {+ h& q+ Aminreadslength和maxreadslength是测序reads的长度范围
, R! _# [; q5 V9 V. O
Z( ]. O6 H) }" u( R. u$ W1 j0 T模拟测序的诸多方法都封装成了Sequencing类,只需要创建类,并调用singlereadsequencing()和pairreadsequencing()方法,传入文件名的参数即可。8 E. m4 |+ r3 D9 M
( N ?. l! b- ?附录
+ ^- g4 J# [& J) O. ^) ]0 ?# l3 G% X
' F% a$ a' w. [$ P! H3 ]: Ufrom Bio import SeqIO- D% m& F; A9 C: r4 G$ v8 e
from math import exp
e! K# A d' J' ?7 \$ pimport random
. X0 z: P8 ~% V: j8 C+ g. R- F1 g+ U; [% I1 l/ A& A9 i
class Sequencing:3 |5 l. e6 O0 B3 I) l5 v
# N代表拷贝份数
0 I( u2 z& H" g0 h; H def __init__(self)
0 [ S6 `4 L- @( ]. U self.fragmentList = []
& z7 ]. e8 |0 f self.readsID = 1
; J2 f0 T: k5 Z% J; Y/ y self.readsList = []5 }& w% U" M. e4 z4 B7 _2 C1 f
self.averagefragmentlength = 650 s! f% O+ v f; Y6 ?
self.minfragmentlength = 500 G( ^# b% g; d) G
self.maxfragmentlength = 800
* I) O, U1 {8 r self.cloneRetainprobability = 1' T9 p, P2 O8 n4 H3 l. R
self.minreadslength = 50
- L5 g! Q+ l$ P: B9 b5 y self.maxreadslength = 150* w$ w) ~+ F% u8 f, b$ H5 U
self.N = 102 d1 e9 x9 H* i/ |
self.genomeLength = 0# i2 g4 Y$ K+ t
self.allreadslength = 0
1 S2 n- k6 R5 Y- I% V) d
2 @: [- F( M- h/ p # 生成断裂点
/ F3 H$ ^8 U% D& M def generatebreakpoint(self, seqlen, averageLength):- O1 Z u2 ~$ {$ H* C
# 假设平均每500bp 产生一个断裂点(averageLength = 500),通过随机函数生成seqlen/500个随机断裂点(1到seqlen之间的随机整数)3 |+ _9 V1 s0 n3 ~' N ~/ |
breakpoint = [random.randint(0, seqlen) for _ in range(int(seqlen / averageLength))]; q r, G) D3 ^7 ]
breakpoint.append(seqlen)# N) x- ~2 D( Z/ s
breakpoint.append(0)
) [5 D3 T9 E. B7 g4 p | # 把随机断裂点从小到大排序
6 V- W1 k' d; I8 l/ f" I6 D breakpoint.sort() w ?( X- }4 |# [
return breakpoint
$ R) \+ o5 o- z' Q) q* v
) v8 o% H6 R3 i # 沿断裂点打断基因组,并删除不符合长度要求的序列片段,定义片段范围:200-1000bp
' E' x1 ~2 U% n& n* ^0 o+ M; @ def breakgenome(self, seq, breakpoint, minfragmentlength, maxfragmentlength):
. S; ^0 \& a0 Z" s4 I) i$ N& P for i in range(len(breakpoint) - 1):
) P: m9 i# ?: }( l0 L. ?+ y4 L, N fragment = seq[breakpoint:breakpoint[i + 1]]+ m4 `: Y P( C( U5 \& V
if maxfragmentlength > len(fragment) > minfragmentlength:
: \: U& {, m( z self.fragmentList.append(fragment)
7 Z" r# C) F6 n: \ return self.fragmentList; O# _5 M5 ?8 x( e
, N+ R A& M1 @# `, l- g
# 模拟克隆时的随机丢失情况,random.random()生成0-1的保留概率
2 n& I$ `4 e# W0 P/ G: h6 W def clonefragment(self, fragmentList, cloneRetainprobability):/ V4 o' }- E! R0 j
clonedfragmentList = []- H6 x3 {7 R4 w, m* `
Lossprobability = [random.random() for _ in range(len(fragmentList))]* e$ Q5 ^0 Z" s5 A! l4 f: Q
for i in range(len(fragmentList)):
9 q+ R0 F7 I/ Y, \ if Lossprobability <= cloneRetainprobability:
+ ]' v6 Z4 f; b% r clonedfragmentList.append(fragmentList)
8 Z L, o3 F+ Y& M return clonedfragmentList" \# h; D" C1 |% ~( w
/ N' }0 u& p* z% | g5 W # 模拟单端测序,并修改reads的ID号
4 c5 p! n/ G4 A1 Q+ [: ? def singleread(self, clonedfragmentList):9 j1 |4 s4 Q2 j! Q1 h2 r. R
for fragment in clonedfragmentList:
! a+ j% }! Q( M, g# X fragment.id = "". H6 q1 d" }9 X: ?* H0 W, b4 B
fragment.name = ""
0 ?) B6 K$ U$ p2 c; G fragment.description = fragment.description[12:].split(",")[0]7 x) b0 S9 `% E- _ o$ F2 z
fragment.description = str(self.readsID) + "." + fragment.description
7 s E5 t5 X0 A self.readsID += 1
; \/ C1 D, P a6 n( t readslength = random.randint(self.minreadslength, self.maxreadslength)
% i( f6 h; q. L" \ self.allreadslength += readslength
/ n9 D4 U8 ^% j+ Z* M self.readsList.append(fragment[:readslength])
4 @3 B( n- {1 z7 ]/ x6 u4 z7 N& \) G# J
def singlereadsequencing(self, genomedata, sequencingResult):
* V& |+ W) r0 }. n8 i1 x for seq_record in SeqIO.parse(genomedata, "fasta"):
+ h1 T. Q& w. ^' }1 `! l seqlen = len(seq_record)
0 |1 K9 o0 Z4 W5 \% y5 ? self.genomeLength += seqlen
; C2 i1 z! n8 b; [1 i for i in range(self.N):' U0 K1 L X# L' _4 p+ y
# 生成断裂点0 m6 m' u5 @ X# K+ X0 ?9 e' K( X
breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)
: J+ N- R- a$ j& A3 q, B' D5 i # 沿断裂点打断基因组) ]. u. K/ l- n
self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)
/ \- j4 `* }6 D' r8 E# ?$ F9 h/ D # 模拟克隆时的随机丢失情况
2 G4 m2 N9 N8 E5 s0 B clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability)# Y7 B- X/ s; B N- S
# 模拟单端测序
8 Z2 ~4 u: i! f self.singleread(clonedfragmentList)1 P/ U7 G. f$ i. q9 j- K7 r
SeqIO.write(self.readsList, sequencingResult, "fasta")" S. O) J7 \* m% t
3 C5 Q; r5 E: U# T" @
def pairread(self, clonedfragmentList): s8 m* v7 x( |, K/ @
for fragment in clonedfragmentList:
9 R: W" _9 {& o$ q" T; I' Z+ Q fragment.id = ""
) V4 @: I4 B" n9 t: I6 {: z% W fragment.name = ""
9 L, m |; c; N. C5 A description = fragment.description[12:].split(",")[0]
. H1 p1 ^$ F0 U0 x( M# l& N fragment.description = str(self.readsID) + "." + description3 f8 n) f) d( x: F
readslength = random.randint(self.minreadslength, self.maxreadslength)
. M7 `' B& o& ?9 n. G self.allreadslength += readslength T$ K. m1 c" n% U* U4 Z# \
self.readsList.append(fragment[:readslength])
, ^$ t" z0 N9 w, J2 O/ o8 N7 D
6 o g, {9 E8 U! F8 K: U readslength = random.randint(self.minreadslength, self.maxreadslength)* ]- u+ p# C4 x- i: G+ c$ H
self.allreadslength += readslength% E0 w- x6 A; u) e8 j
6 k- K- I% E' ~; n, g% q* A& v3 I
fragmentcomplement = fragment.reverse_complement()
7 \) U6 N0 t8 t, X2 C$ u$ m fragmentcomplement.id = ""
, `" d% N. n' S2 ~3 w5 i fragmentcomplement.name = ""
4 D% [' j- Y# w& B+ n/ w fragmentcomplement.description = str(self.readsID) + "." + description
0 r0 Z9 k: r6 k% }& j9 R self.readsList.append(fragmentcomplement[:readslength])) M, i' ~/ V ]8 Q! ]- D! I
% T# O- g! N2 ~9 o. z( R4 M
self.readsID += 1
# S% ^- v/ h. P- m9 n
/ f1 r/ w# T! r" e D1 @2 q( V def pairreadsequencing(self,genomedata, sequencingResult_1, sequencingResult_2): @4 R/ @0 F( T- s& c4 h: I9 ~
for seq_record in SeqIO.parse(genomedata, "fasta"):
G( N `9 `' v seqlen = len(seq_record)
6 q5 b! V; c; G {8 ]# p self.genomeLength += seqlen
' h: W8 J' Q) u7 d/ J6 y# { for i in range(self.N):
- o; O8 C; [1 V5 d7 f- y # 生成断裂点) h+ Z2 M4 F6 F; K& p5 w) t* M9 ^
breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)5 v4 V5 O- K- J; K |/ `+ t! B
# 沿断裂点打断基因组* @/ L- `* Z, {! n% C
self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)
+ n! e% o7 M: ]5 _- a4 s2 T* J2 k # 模拟克隆时的随机丢失情况5 d3 P* y9 V* i# S7 m3 A* J
clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability) f. r. A6 }! h6 \
# 模拟双端测序% d7 t( ^% x& I0 t8 O2 P: f
self.pairread(clonedfragmentList)/ |, \' E& F' _/ D+ z
readsList_1 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 0]( U* ` {2 | }$ D
readsList_2 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 1]
! J: t! ~/ I; P SeqIO.write(readsList_1, sequencingResult_1, "fasta")# k" e" ^' V9 u1 o0 U
SeqIO.write(readsList_2, sequencingResult_2, "fasta")$ h/ L; p3 t, _$ }2 ?
. R9 v; \ d- k; R* N( C E) c
def resultsummary(self):
R, s: _9 L4 d( E3 \8 s, j print("基因组长度:" + str(self.genomeLength / 1000) + "kb")# q+ e: C8 ]9 }1 D6 |
print("片段长度区间:" + str(self.minfragmentlength) + "-" + str(self.maxfragmentlength)); J6 W; ]3 D) a, s
print("N值:" + str(self.N))5 N. A! L6 C* E: i
print("期望片段长度:" + str(self.averagefragmentlength))' M5 X" q1 C$ E3 h5 D9 b
print("克隆保留率:" + str(self.cloneRetainprobability))/ `) S' r' |( {& D
print("片段数量:" + str(len(self.fragmentList)))8 K$ q0 ?4 m1 h, ]2 l, p
print("reads长度:" + str(self.minreadslength) + "-" + str(self.maxreadslength))
* v2 E4 P9 \8 b! m* F print("reads总数量:" + str(len(self.readsList)))
8 z7 I/ M) Q' V# q3 n print("reads总长度:" + str(self.allreadslength / 1000) + "kb")# R+ c8 ?5 q; E' T: d' f. x4 o$ s
m = self.allreadslength / self.genomeLength7 k6 a3 `& s6 g
print("覆盖度(m值):" + str(round(m, 5)))
7 ], _$ s8 q7 b0 |3 D7 i" m- C print("理论丢失率(e^-m):" + str(round(exp(-m), 5)))
; y) @% O1 N! I: e print("覆盖率(1-e^-m):" + str(round(1 - exp(-m), 5)))
( d; N* D$ P# O/ R( k" Q/ x1 j T# -------------------------------------------主程序-------------------------------------------( U0 _6 e1 C# J( W/ D+ Q2 K5 l; D; G- E) k
# 模拟单端测序, D0 i% ~; Q% N# K+ G) `+ ~
sequencingObj = Sequencing()3 q n1 h* R9 u# H* V% H
sequencingObj.singlereadsequencing("data/NC_025452.fasta", "result/virusSingleRead.fa")" }0 }- F7 n- {1 S* j
sequencingObj.resultsummary(), }2 F) d7 A o2 C7 t' e
& ]+ S2 q0 w" D& }! |# 模拟双端测序5 Z8 n( V" [' O$ y: [' }& a
sequencingObj = Sequencing()
$ r, Q7 ]& \/ X5 psequencingObj.pairreadsequencing("data/GCF_000146045.2_R64_genomic.fna", "result/yeastPairRead_1.fa", "result/yeastPairRead_2.fa")& J( b* Z- _9 S) q/ K9 j
sequencingObj.resultsummary()" C8 H6 o7 r% Q( R& Z
from Bio import SeqIO% V* T3 ^' N. ?2 `
from math import exp% z8 ? ^, j! s1 ]# U2 ~6 h8 ]
import random4 \3 M5 n; w; s
; L- d& T2 z7 Y) g: _% D7 V Q8 rclass Sequencing:# y" C: j0 _! \) c% y W K
# N代表拷贝份数1 t5 I$ y0 l9 u& `. _% Y, W
def __init__(self):
$ w7 N( L$ x. p) z3 n2 e self.fragmentList = []$ V1 s7 |" Q C' Z
self.readsID = 1. \% [; i& K& k) @, G
self.readsList = []: @/ c- W$ G$ M" v' y! L2 d
self.averagefragmentlength = 650
! l' V6 K9 W: r0 _, }2 H/ P self.minfragmentlength = 500
2 y6 A" D: | L" Y/ F) p0 s self.maxfragmentlength = 800
- ~: S, R* A% @ self.cloneRetainprobability = 1
0 d# Y; L! q9 [+ g2 R5 F4 b self.minreadslength = 50
% _* g" U6 ~* N self.maxreadslength = 150. s8 A! r, ~ p3 [
self.N = 10& t+ i; C/ X6 I% ?6 |
self.genomeLength = 07 V9 U/ ? H' y! l6 w; y
self.allreadslength = 0/ g$ Q! s: T/ X! h
& n% u8 H/ u% ]3 B
# 生成断裂点
) a% I6 z$ Y" k+ Y6 Q def generatebreakpoint(self, seqlen, averageLength):
5 h5 M; E: v8 \9 f* x5 b # 假设平均每500bp 产生一个断裂点(averageLength = 500),通过随机函数生成seqlen/500个随机断裂点(1到seqlen之间的随机整数)9 [2 S W4 z9 u4 B
breakpoint = [random.randint(0, seqlen) for _ in range(int(seqlen / averageLength))]
& q/ J3 G" `8 E( P breakpoint.append(seqlen)
3 s- H$ q4 K* ?- y" ?% ~ breakpoint.append(0)2 n. }, B$ c% h. F* \
# 把随机断裂点从小到大排序
1 B& J3 W# Z" R/ h breakpoint.sort(). }2 t0 K" M: h
return breakpoint
. }% @+ n! p0 J* X$ A/ ?6 x
) Z9 ~* c& G. a # 沿断裂点打断基因组,并删除不符合长度要求的序列片段,定义片段范围:200-1000bp
0 W' I, Q" y. s+ ?3 {. K def breakgenome(self, seq, breakpoint, minfragmentlength, maxfragmentlength):
4 L3 P9 e1 {7 Z for i in range(len(breakpoint) - 1):; C3 `4 B, r" i b: v2 G
fragment = seq[breakpoint:breakpoint[i + 1]]" z) n- B y3 S* d! Q. U% i. P
if maxfragmentlength > len(fragment) > minfragmentlength:4 [, e( M. n! K7 i3 ~2 B- V7 t5 } ]( W
self.fragmentList.append(fragment)9 k4 G4 L I4 i; m- g+ Y6 y& A
return self.fragmentList
2 S6 A9 e% n( [% t0 C' Y2 l" }# K: l W* T3 X1 O
# 模拟克隆时的随机丢失情况,random.random()生成0-1的保留概率. f. b5 s& R" v* L3 ?7 k4 _
def clonefragment(self, fragmentList, cloneRetainprobability):
, u- U8 P/ g5 B. c: ]; f clonedfragmentList = [] c# F: R# O+ D1 [: C
Lossprobability = [random.random() for _ in range(len(fragmentList))]3 n+ y3 e& C" T8 O4 B& o! w; x# a
for i in range(len(fragmentList)):: H3 m0 O$ \3 n9 [# S2 O; H7 T/ W- o
if Lossprobability <= cloneRetainprobability:
2 d4 H) j0 X7 e3 K3 I& S" \ clonedfragmentList.append(fragmentList)" v( t9 o# {- K$ G# [9 j" `0 Q
return clonedfragmentList
5 [3 S1 l. B \, h8 N' }
0 t4 ~9 C- m y+ g; \0 |/ K9 y. C# l # 模拟单端测序,并修改reads的ID号# W* T! N$ n. y
def singleread(self, clonedfragmentList):& p: u1 W* R& s& D/ S: _- M6 Z
for fragment in clonedfragmentList:% q7 g$ b- J* |. y
fragment.id = ""
3 c5 |6 S. Q9 ]9 O6 ~4 i fragment.name = "" t+ N% I. k4 C4 \- p0 n, A# j+ [4 @
fragment.description = fragment.description[12:].split(",")[0]5 E$ l. B0 j& n. I% I! y5 z% ?
fragment.description = str(self.readsID) + "." + fragment.description/ m- P' W1 B% p! U
self.readsID += 1+ V" A- g& h& S8 q: g6 f- M& M S7 y/ p
readslength = random.randint(self.minreadslength, self.maxreadslength)
- w. D# R* x7 w5 ~ self.allreadslength += readslength
' R# A5 P8 F9 R& ^ self.readsList.append(fragment[:readslength])
' p; [! b: h: N: k1 I$ O* z! [" v. ]3 J
def singlereadsequencing(self, genomedata, sequencingResult):
/ ^! K$ l) k2 W0 U; Y, i for seq_record in SeqIO.parse(genomedata, "fasta"):
x2 u! H8 e4 O4 X3 d( M ` seqlen = len(seq_record); g0 h& C. ~6 m8 k
self.genomeLength += seqlen
* d+ G9 L) }& ?. n for i in range(self.N):. t& W' Q( n& ^" A# Q
# 生成断裂点
/ ^9 Q; h0 v0 N% q( i$ ? breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)$ c3 k8 C1 D4 v* y3 y, U4 a/ Z1 e
# 沿断裂点打断基因组. L7 u% X ^7 {+ q' \8 y
self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)2 l3 d* ~5 e' O8 t9 e: S) ?
# 模拟克隆时的随机丢失情况
! i% D8 `! A' f! B- x0 g3 o2 \ m clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability)8 c/ L+ |, {. k. z! n
# 模拟单端测序( o) k* {& L- p8 [: f
self.singleread(clonedfragmentList)
+ x' c+ E% O' k" C; A SeqIO.write(self.readsList, sequencingResult, "fasta")
* f# F" y* d! X" h2 b5 i7 N% n _2 ?
def pairread(self, clonedfragmentList):
5 ~: ^; f w! Q% H' J for fragment in clonedfragmentList:4 ?( o6 g. K2 k" [1 w4 d1 [( }
fragment.id = ""3 F5 Z9 R6 C" L B# E
fragment.name = ""2 K9 ^: @9 G/ q* N
description = fragment.description[12:].split(",")[0]. {9 R+ w* g. q& y- l1 @( \& |
fragment.description = str(self.readsID) + "." + description3 x: { q0 v8 ]- S
readslength = random.randint(self.minreadslength, self.maxreadslength)
* N( B, c4 D! R& x O self.allreadslength += readslength- r" W) {; W" q/ v
self.readsList.append(fragment[:readslength])& Q" W0 O! W2 \/ |$ E+ T
- ^" H3 x$ x3 x; o$ K$ \ readslength = random.randint(self.minreadslength, self.maxreadslength)
( M3 r7 z7 v8 Z" h self.allreadslength += readslength
6 d: m( M: S4 N$ H8 l4 v7 {; v" w: X$ I" u w7 X4 Y X6 O( u& j8 A6 O
fragmentcomplement = fragment.reverse_complement()2 T( \" ^( E& r3 I0 \- p
fragmentcomplement.id = ""0 }! Z' E$ S1 O/ G2 l# l
fragmentcomplement.name = ""
+ k. w# _8 f6 F fragmentcomplement.description = str(self.readsID) + "." + description" n# t8 D8 G& ~6 r6 ` t; |4 N* _
self.readsList.append(fragmentcomplement[:readslength])
) d' Q$ A- @( R8 J/ S$ f+ m! ?- `5 E# a
self.readsID += 1' v6 M8 c/ }- T8 o
/ \; Y9 w5 P, Y2 R3 W4 a def pairreadsequencing(self,genomedata, sequencingResult_1, sequencingResult_2):
( X1 ^( P F Y q8 U m* B, P for seq_record in SeqIO.parse(genomedata, "fasta"):2 n; M2 j t1 C w
seqlen = len(seq_record)& @) z5 H( c- b, w" ]+ L
self.genomeLength += seqlen" a. v& D. r |8 R4 p' a- @/ B
for i in range(self.N):) G9 O9 ?: K4 q/ H6 A4 d. v
# 生成断裂点
3 ^1 z8 F; E& z$ j& O: c breakpoint = self.generatebreakpoint(seqlen, self.averagefragmentlength)
6 H8 D2 @$ w; k9 f, Z9 M/ A+ P # 沿断裂点打断基因组
5 c) x9 X, `8 B2 ?! X8 M self.breakgenome(seq_record, breakpoint, self.minfragmentlength, self.maxfragmentlength)
0 [# B& D8 X! s$ A$ H1 `- ] # 模拟克隆时的随机丢失情况% j+ i6 F) P" |
clonedfragmentList = self.clonefragment(self.fragmentList, self.cloneRetainprobability)3 w7 }' ~: a) _# ?& @! T; V Y1 G
# 模拟双端测序
" X' }( @$ A* R0 g self.pairread(clonedfragmentList)) P$ ^! ]: l4 F+ E6 Y
readsList_1 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 0]
& e+ z! S) W f1 O* L; r readsList_2 = [self.readsList for i in range(len(self.readsList)) if i % 2 == 1]
$ u& _# @! B$ t5 v; _ SeqIO.write(readsList_1, sequencingResult_1, "fasta")
5 T6 h: F! P4 ^ SeqIO.write(readsList_2, sequencingResult_2, "fasta")( ^* R- h% d! I0 U+ I' ]! Y/ d0 j
" E5 ?3 K# k% `3 ~" k/ u def resultsummary(self):
2 v9 r O$ W" }! e1 n7 w, U# J print("基因组长度:" + str(self.genomeLength / 1000) + "kb")/ v. p, `3 I4 q2 v) Q
print("片段长度区间:" + str(self.minfragmentlength) + "-" + str(self.maxfragmentlength))
! _# k! @) g7 ]# h print("N值:" + str(self.N)): a E g% ?$ i+ G8 ?
print("期望片段长度:" + str(self.averagefragmentlength))) {9 q( x M( |" u% q
print("克隆保留率:" + str(self.cloneRetainprobability))
, _" K- k, b' Y" g7 ` print("片段数量:" + str(len(self.fragmentList)))
* b! c5 C1 L4 F4 O% s; o# B, i print("reads长度:" + str(self.minreadslength) + "-" + str(self.maxreadslength))
# ]' c# ^# c8 T. Y. f print("reads总数量:" + str(len(self.readsList)))
+ m+ Z7 s% Y( |: w3 L3 K0 ^ print("reads总长度:" + str(self.allreadslength / 1000) + "kb") A9 {4 ^8 D0 \- D% Q' k
m = self.allreadslength / self.genomeLength
1 ]/ c. g2 h8 P! s$ E print("覆盖度(m值):" + str(round(m, 5))) \1 @, a) U+ `: e4 w
print("理论丢失率(e^-m):" + str(round(exp(-m), 5)))
" V# S8 I8 d! ]& ^ A print("覆盖率(1-e^-m):" + str(round(1 - exp(-m), 5)))* b- M* ?. J; Y! D* d5 ]% P
# -------------------------------------------主程序-------------------------------------------' [% j0 Q1 e$ {1 g" w( B
# 模拟单端测序+ \" r& i' P; _* U
sequencingObj = Sequencing()
7 D% E) h& U* l0 F/ G3 w. TsequencingObj.singlereadsequencing("data/NC_025452.fasta", "result/virusSingleRead.fa")0 V' r6 g. B, r& n6 @' D6 Q
sequencingObj.resultsummary()
% o$ I N# Q! I9 e6 k. W
; ~7 [8 ?4 ]1 z# 模拟双端测序0 J+ O2 W$ b5 f/ Q2 h6 C. H
sequencingObj = Sequencing()2 d2 x1 r) ]6 u
sequencingObj.pairreadsequencing("data/GCF_000146045.2_R64_genomic.fna", "result/yeastPairRead_1.fa", "result/yeastPairRead_2.fa")2 e" w& r8 S! [) m8 O
sequencingObj.resultsummary()4 P# C. E( s: k& y1 f1 T
, |, r3 R9 H8 ?' P8 ^
' l* n7 y5 X6 a5 M& b5 q
% q+ q2 ~# h1 t( b& ? + Z: Z+ ]& b' B% D
|
zan
|