基因组结构注释

1. 组装基因组质控

得到组装好的基因组序列之后,首先要使用多种方法评估组装质量。这里用到2款可用于基因组组装质量评估的软件——QUAST和BUSCO。

1.1 quast——序列长度、N50、GC含量

quast分有参评估和无参评估。

1.1.1主要参数说明

-t 程序运行线程数
-o 输出路径。程序运行完毕后可在该路径查看结果
-R 有参评估时,指定参考基因组文件
-G 有参评估时,指定参考基因组的gff注释文件
quast assembledGenome -t 8 -o out_dir

1.1.2. 指标简要说明:

  • contigs/scaffolds序列总数越少、序列总长度合理、N50越长组装结果越好
  • 组装序列与参考物种序列的unalign数量及长度数值越低,组装结果越好

1.1.3. 结果文件简要说明:

  • 在icarus.html目录页点击QUAST report,查看评估结果的基本统计内容。包括拼接后的序列总数、序列长度、GC含量、N50、长度累计曲线、参考基因组的序列长度、GC含量等信息,以及组装序列与参考物种序列的align信息。
  • 在icarus.html目录页点击contig size viewer,可以查看基因组序列组成、长度、N50。可通过在start和end中输入特定区间数值,自定义区间长度。相较于上述的“无参评估”结果,该界面还根据组装结果与参考基因组的align信息,在该组装结果的展示图中将组装结果与参考基因组之间的一致区域、非一致区域等标记出来,以更好地帮助我们对组装基因组结果进行评估。

参考链接:http://blog.sciencenet.cn/blog-3406804-1163959.html

1.2 busco——评估基因组组装完整度

1.2.1. 主要参数说明:

-i,输入基因组fasta文件;

-o,输出结果目录的名称,会在当前工作路径下生成结果目录,不支持使用绝对路径;

-m,评估模式,包含3种类型:基因组序列;转录本序列;蛋白氨基酸序列;

-l,指定单拷贝基因数据集,可以从BUSCO官网上下载

-c,程序运行线程数;

-e,比对e值,通常为1e-5;

-f,强制覆盖先前的结果得到新结果;

-sp,当使用基因组评估模式时,需要指定Augustus物种基因训练集,用于在基因组中较为准确地预测基因序列。
run_busco -i assembledGenome -o busco -l ascomycota_odb9 -m genome -c 7 -e 1e-05 -sp aspergillus_fumigatus

1.2.2. 指标简要说明:

  • Complete:完整性,在被评估的基因组中BUSCO基因的预测分数以及比对上的长度打到了要求,可具体划分为Complete and single-copy和Complete and duplicated。
    Complete and single-copy:完整且在该基因组中只有一个拷贝的数目,该指标越高说明组装效果越好
    Complete and duplicated:完整且在该基因组中有多个拷贝的数目,由于BUSCO基因集中的基因都是单拷贝的基因,因此如果出现了多个拷贝,就说明在单体型组装过程中出现了错误,因此该指标越高说明组装效果越差。另外如果是多倍体组装的话,该值也可能大。

  • Fragmented:Fragmented的基因虽然达到了预测分数,但是长度并没达到要求。有可能基因组组装过程中没有将该片段组装出来,也有可能是基因预测的时候由于基因结构的特殊性没能完整地将该基因预测出来。该指标越低越好

  • Missing:Fragmented的基因在基因组中完全没有找到,或者预测分数低于要求。有可能基因组组装过程中没有将该片段组装出来,也有可能是基因预测的时候由于基因结构的特殊性没能完整地将该基因预测出来。该指标越低越好

1.2.3. 结果文件简要说明:

  • short_summary_busco.txt:BUSCO评估结果的简要统计结果
    Complete BUSCOs (C) :多少个BUSCO测试基因被覆盖;
    Complete and single-copy BUSCOs (S):多少个基因经过比对发现是单拷贝;
    Complete and duplicated BUSCOs (D):多少个基因经过比对发现是多拷贝;
    Fragmented BUSCOs (F):多少个基因经过比对覆盖不完全,只是部分比对上;
    Missing BUSCOs (M):没有得到比对结果的基因数;
    Total B“Missing”USCO groups searched (n):测试基因的总条目。

  • full_table_busco.tsv:组装基因组序列与BUSCO测试基因的详细比对结果
    Busco id:BUSCO参考数据集中测试基因的id;
    Status:比对结果类型,包含Complete、Fragmented等;
    Contig:基因组组装结果中的contigs/scaffolds id;
    Start/End:组装基因组中与测试基因对齐的序列(预测基因)在contigs/scaffolds中的起始/终止位置。
    Score:比对结果的score值;
    Length:对齐长度。

  • missing_busco_list_busco.tsv:“Missing”比对结果

参考链接:http://blog.sciencenet.cn/blog-3406804-1164809.htm

2. 重复序列屏蔽

有些物种的基因组中很大一部分是重复序列。重复序列分两类

  • 简单重复(Low-complexity repeats):由串联重复组成,没有什么信息含量。比如AAAAAAA, GGGGGG和各种各样的微卫星DNA(STR)。
  • 复杂重复(Interspersed repeats ):转座子和逆转录转座子。它们包含编码基因,比如逆转录酶,可以转移和复制其周围的基因。

简单重复序列可以以很高的统计学显著性比对到蛋白质的低复杂性片段,从而造成假同源。
复杂重复序列包含真正的蛋白质编码基因,会干扰从头预测过程。比如,gene predictor会将位于物种特异性蛋白质编码基因 内含子部分的转座元件误认为是该基因的一部分外显子。
所以识别、标识基因组重复区域非常重要。

2.1 RepeatMasker:

依赖于已有的重复序列参考库Repbase作同源预测。对于绝大部分目标真核物种,都在Repbase中有收录

2.1.1主要参数说明
输入文件:fasta 格式。

-species:组装基因组的物种来源。
-lib:如果物种不在species里或者自己有一个更大的重复序列库,可以指定自定义的重复序列库(fasta格式)。要给出绝对路径,否则默认与序列文件在同一目录
-pa:指定进程数。我用的搜索引擎是RMBlast,每次用四个核。因为服务器只有8个核,所以只能设置-pa=2
-xsmall:指定soft masking,以小写字母标识重复序列,其余序列还是大写。默认为hard mask,即用N表示重复序列
-dir:输出文件目录

备注:

  • 可以将多个fasta序列合成一个文件,也可以同时运行多个fasta文件,每个文件都会有一份单独的报告。比起多个小文件,处理一个大文件会有更快的运行速度,summary文件也会有更多信息。但单个文件(长于2kb)的分析会更准确,因为会根据不同的GC含量调整不同的参数。
  • util/queryRepeatDatabase.pl: -h 给出帮助文档;-species可以列出分析指定物种时所用的重复序列,通常包括该物种及进化枝上其祖先的重复序列;-tree 给出进化树,可以通过这个查询是否有你感兴趣的物种;-stat 返回序列的统计信息;-id 给出指定id的重复序列


2.1.2. 指标简要说明:
列举.out文件各列代表的含义:

  • SW score:Smith-Waterman序列比对打分。因为基于不同的GC含量使用不同的打分矩阵,所以有时候这个分数不可以直接比较。
  • perc div.:分歧度=mismatches/(matches+mismatches)
  • perc del.:query序列中的delete比例
  • per ins.:query序列中的insert比例
  • query sequence:查询序列的名称
  • begin:比对区域在查询序列中的起点
  • end:比对区域在查询序列中的终点
  • (num):查询序列中超过match终点的碱基数
  • C:与其互补链匹配
    -(num):重复序列中match起点之前的碱基数
  • begin:match在重复序列中的起点
  • end:match在重复序列中的重点
  • ID:单个插入的唯一识别符
    -*:星号表明存在一个更高得分的match B。当前match A的结构域在高得分match B中,占比不超过B的80%

2.1.3. 结果文件简要说明:

  • .masked:重复序列已被屏蔽的组装基因组
  • .out:masked序列的详细信息
  • .tbl:组装基因组重复序列的summary信息

备注:.tbl文件中类的总和有时会高于子类加和。因为有些重复元素不属于任何一类,还有一些小类没有列出。

2.2 RepeatModeler:

在组装了新物种或RepBase对已知物种存在覆盖度不好的情况下,直接通过现有的RepBase数据库来计算重复序列,可能只找到较少的重复序列。此时Repbase可能已经无法满足我们的需求了。这种情况下可考虑执行重复序列的从头预测,即通过当前的全基因组序列,训练重复序列集构建本地repeat library,再通过RepeatMasker注释重复序列。
2.2.1主要参数说明

BuildDatabase——构建基因组索引
-name: 将要创建的database的名称
-dir:输入文件fasta所处的位置
-batch:一个文件名称,该文件存储了要分析的fasta文件的名称

RepeatModeler——构建library
-database:序列数据库的名称。与BuildDatabase的-name一致
-pa:进程数。

备注:一个线程4个核。所以如果服务器有12个核,-pa应该设成3
2.2.2. 指标简要说明:

没用到什么评估指标。

2.2.3. 结果文件简要说明:

  • *-families.fa:训练得到的重复序列

参考链接:http://blog.sciencenet.cn/blog-3406804-1202562.html

2.3. 步骤:

I. 合并RepeatMasker的同源重复库和RepeatModeler的从头预测重复库,构建新库
II. 借助新库,通过RepeatMasker预测重复序列

#!/bin/bash

#1.repeatmasker
/picb/evolgen/users/gushanshan/GenomeAnnotation/RepeatMasker/RepeatMasker/util/queryRepeatDatabase.pl -species Aspergillus > Aspergillus_repeats.lib 

#2.RepeatModeler
BuildDatabase -name Aspergillus ../contigs.fa

RepeatModeler -database Aspergillus -pa 2 >& run.out

#3.combind
cat Aspergillus_repeats.lib Aspergillus-families.fa > myGenome.custom.repeat.lib

#4.run

RepeatMasker -lib myGenome.custom.repeat.lib -pa 2  -xsmall -dir repeat ../contigs.fa

2.4 不同阶段使用不同的基因组

unmasked: EVM合并、从头预测
softmasked:蛋白质预测、转录本预测

备注:

  1. 有时候masking工具会产生一些假阳性结果。softmasking保留了基因组的全部信息,在用gene predictor预测时,如果有转录本可以比对到假阳性区域,它就可能成为一个valid gene。但是,如果我们采用hardmasking方式,预测工具完全不了解这一区域的真实序列,更别提修复了。

  2. 转录本为什么会比对到标示为重复序列的区域呢?
    比对会先选择一个种子,再沿着种子向两侧延伸。不会将重复序列定义为种子,但可以延伸到它。


3. 同源预测

3.1. gth

3.1.1主要参数说明

-species:指定物种,从而选择针对特定物种的贝叶斯剪切位点文件
-gff3out:以gff3格式保存结果
-intermediate:会生成中间文件。如果之后有更新,程序运行会比较快
-duplicatecheck:防止“相同”的参考序列参与分析,有"none","id","desc","seq","both"五种模式。
-translationtable:密码子翻译模式。1是标准模式
-protein:参考蛋白质文件
-genomic:要分析的基因组
-o:输出文件存储位置

详情参考https://www.jianshu.com/p/bb2dcfd4d24f

3.1.2. 指标简要说明:
无。如果非要说有的话,就是gff各列表示的含义。
可以参考https://www.cnblogs.com/djx571/p/9497707.html

3.1.3. 结果文件简要说明:
genomethreader虽然产生了gff文件,但还是需要用evm里的程序进行转换

PATH/EVidenceModeler-1.1.1/EvmUtils/misc/genomeThreader_to_evm_gff3.pl homo_protein.gff3 > evm_pro.gff3
3.2. 程序
gth -species aspergillus -gff3out -intermediate -duplicatecheck seq \
-protein ncbi_Aspergillus_protein_raw.fasta -translationtable 1 \
-genomic contigs.fa.masked \
-o ./output/homo_protein.gff3 

gth -species aspergillus -gff3out -intermediate -duplicatecheck seq \
-cdna ncbi_Aspergillus_est.fasta   -translationtable 1 \
-genomic contigs.fa.masked\
 -o ./output/homo_est.gff3
3.2. exonerate

3.1.1主要参数说明

exonerate \
-q ../ncbi_Aspergillus_est.fasta -t ../../repeat/repeat/contigs.fa.masked  -Q dna -T dna \
--model est2genome --bestn 1 \
--targetchunkid $targetchunkid \
--targetchunktotal 8 \
--softmasktarget TRUE --showtargetgff --showalignment no

-q:query sequence
-t:target sequence
-Q:query type. dna/protein
-T:target type. dna/protein
--model:比对模型。
--bestn:显示每个query的前n个最佳比对
--targetchunkid:n部分中对应的第几部分
--targetchunktotal:把target分成n部分,放在不同节点上运行,加速运算
--softmasktarget :target序列被softmasked
--showtargetgff :以gff格式报告target序列的特征情况
--showalignment:以可读格式显示比对结果

3.1.2. 指标简要说明:
3.1.3. 结果文件简要说明:

4. 从头预测

4.1. augustus

AUGUSTUS用于预测真核生物的基因。其中已经存储了很多物种的训练注释文件,使用还是蛮简单的...

4.1.1主要参数说明
输入文件:fasta格式

--genemodel:有多种模式。默认是partial,允许预测不完整的基因结构;intronless指定预测单外显子基因,比如原核生物
--gff3:on指定以gff3格式输出结果
--exonnames:on指定输出exon。但它会用initial、internal、terminal、single来指代
--protein=off:不输出蛋白质信息
--strand:预测哪条链,有"both","forward","backward"三种模式
--alternatives-from-sampling=false:同一个基因只预测一个转录本
--singlestrand:独立预测每条链的基因,允许相反链上出现基因重叠。默认false
 --species:指定分析的物种,从而选择特定的训练注释文件
augustus --species=aspergillus_fumigatus --strand=both --singlestrand=false --genemodel=partial \
--sample=100 --keep_viterbi=true --alternatives-from-sampling=false \
--exonnames=on  --protein=off \
../contigs.fa > denovo.gtf

备注:
augustus --species=help 查看物种列表
4.1.2. 指标简要说明:
gtf文件各列代表的意思,可以参考https://www.cnblogs.com/djx571/p/9497707.html
4.1.3. 结果文件简要说明:
虽然设置了gff3out ,但输出依旧是gtf文件。EVM里有程序可以把gtf转为evm需要的格式。

PATH/EVidenceModeler-1.1.1/EvmUtils/misc/augustus_GTF_to_EVM_GFF3.pl denovo.gtf > evm_denovo.gff3

备注:
evm中有验证gene_predictions文件格式的程序

PATH/EVidenceModeler-1.1.1/EvmUtils/gff3_gene_prediction_file_validator.pl evm_denovo.gff3
4.2. genemark

genemark在README中详细介绍了为什么程序叫gmes_petap.pl:

GeneMark.hmm  -> gm
Eukaryotic    -> e
Self-training -> s
Plus          -> p
Evidence      -> e
Transcripts   -> t
And           -> a
Proteins      -> p

总结一下,即采用隐马尔可夫模型通过self-training或evidence(transcripts和protein)预测真核生物基因

4.2.1主要参数说明

GeneMark-ES:self-training

--sequence:序列文件,FASTA格式
--ES:代表self-training,不需要设置值

GeneMark-ET:transcript

--sequence:序列文件,FASTA格式
--ET:RNA-Seq read通过剪切比对map到genome上得到的intron坐标文件,gff格式
--et_score:内含子分数阈值(最低)。根据使用的RNA-Seq read 比对工具,需要设置不同的et-score值。TopHat2:10;UnSplicer/TrueSight:0.5。默认10

GeneMark-EP:protein

--sequence:序列文件,FASTA格式
--EP:蛋白质剪切比对map到genome上得到的intron坐标文件,gff格式(ProtHint pipeline的输出结果)
--dbep:FASTA格式的蛋白质库文件
--ep_score:内含子分数阈值

GeneMark.hmm

--predict_with:物种特异性的基因预测参数

intron坐标文件-GFF格式

"seqname"  "source"  "feature"  "start"  "end"  "score"  "strait" "frame" "attribute"
2L     TopHat2 intron  2740    2888    25      +       .       .

tophat result➡️gff
path_to/bed_to_gff.pl  --bet path_to_tophat_out/junctions.bed   --gff introns.gff  --label TopHat2

STAR result➡️gff
path_to/star_to_gff.pl --star path_to_star_out/SJ.out.tab  --gff introns.gff  --label STAR

code

gmes_petap.pl --sequence ../contigs.fa -ES --fungus --cores=8

4.2.2. 指标简要说明:

结果文件每列分别是:

"seqname"  "source"  "feature"  "start"  "end"  "score"  "strait" "frame" "attribute"

4.2.3. 结果文件简要说明:
genemark.gtf:输出结果,gtf格式
gmhmm.mod:genemark的训练模型,可以作为maker的输入

同样,evm中也有转换格式的程序

#两者选一个就可
PATH/EVidenceModeler-1.1.1/EvmUtils/GeneMarkHMM_GTF_to_EVM_GFF3.pl genemark.gtf > evm.genemark.gff3

PATH/maker3/maker/bin/genemark_gtf2gff3 genemark.gtf > evm.genemark.gff3
4.3.glimmerhmm

4.3.1主要参数说明

trainGlimmerHMM <mfasta_file> <exon_file> [optional_parameters]
trainGlimmerHMM GCF_000002655.1_ASM265v1_genomic.fna exonfile.txt -d Aspergillus_train

<mfasta_file>:用于训练的序列数据,fasta格式
<exon_file>:<mfasta_file>中各序列对应的exon坐标。
-i:isochore。如果有两种isochore,GC比例分别是0-40%,40-100%,这里就应该设成 -i 0,40,100。默认是-i 0,100
-d:训练目录

备注:

  1. <exon_file>坐标:正链升序、负链降序,基因间以空行分割。例子中第一个基因位于正链,第二个位于负链
seq1 5 15
seq1 20 34
 
seq1 50 48
seq1 45 36
 
seq2 17 20
  1. isochore:isochore是指对温血动物的基因组片段做密度梯度离心实验时,发现有些基因在离心管中聚集在一层,就像等高线(isochore)。这些基因长度大多长于300kb,GC含量相对均匀,将其被命名为isochore,认为与脊椎动物的温血、冷血与否有关。
    https://www.cnblogs.com/southern-xyx/p/4523304.html
glimmerhmm <genome1-file> <training-dir-for-genome1> [options] 
glimmerhmm ../contigs.fa train/Aspergillus_train -g > glimmerhmm.gff

<genome1-file>:要预测的基因组序列
<training-dir-for-genome1>:训练数据目录
-g:以gff格式输出结果

4.3.2. 指标简要说明:
结果是一个gff文件

4.3.3. 结果文件简要说明:
用evm内置程序转换下格式

PATH/EVidenceModeler-1.1.1/EvmUtils/misc/glimmerHMM_to_GFF3.pl glimmerhmm.gff > evm.glimmergmm.gff3

5.EVM合并

5.1.1主要参数说明

#Partitioning the Inputs
PATH/EVidenceModeler-1.1.1/EvmUtils/partition_EVM_inputs.pl \
--genome ../contigs.fa --gene_predictions gene_predictions.gff3 \
--segmentSize 100000 \
--overlapSize 10000 --partition_listing partitions_list.out

#Generating the EVM Command Set
PATH/EVidenceModeler-1.1.1/EvmUtils/write_EVM_commands.pl \
--genome ../contigs.fa --weights ABSOLUTEPATH/weights.txt \
--gene_predictions gene_predictions.gff3 \
--output_file_name evm.out --partitions partitions_list.out >  commands.list

#run evm
PATH/EVidenceModeler-1.1.1/EvmUtils/execute_EVM_commands.pl commands.list


#Combining the Partitions
PATH/EVidenceModeler-1.1.1/EvmUtils/recombine_EVM_partial_outputs.pl \
--partitions partitions_list.out --output_file_name evm.out


#Convert to GFF3 Format
PATH/EVidenceModeler-1.1.1/EvmUtils/convert_EVM_outputs_to_GFF3.pl  \
--partitions partitions_list.out --output evm.out --genome contigs.fa

#combine these gff3 files into a single output file
find . -regex ".*evm.out.gff3" -exec cat {} \; > EVM_final_result.gff3

#less EVM_final_result.gff3| grep -E "[[:space:]]{1}gene[[:space:]]{1}"| wc -l

weights.txt需要绝对路径

5.1.2文件格式说明
EVM参数都用的默认的,主要是注意输入文件的格式,weight文件的设置要符合要求。

  • 输入文件:只接受gene_predictions.gff3、protein_alignments.gff3 和 transcript_alignments.gff3三种类型的名字。用cat命令将各种软件(同一预测类型)的结果放在一起
  • weight:包含三列: evidence type, source, weight。source那一列应该和输入文件的第二列一致,如等

备注:
1.genomethreader的文件应该cat进gene_prediction.gff3文件里,作为OTHER PREDICTION参与合并

2.和evm的开发者brianjohnhaas在github上交流了几天,人家是真的负责,一直在更新软件。这次教训也警示我一定要下载最新的软件,旧版本说不定有什么bug就被我碰到了···

6.导入IGV中查看结果


写在最后:
本文主要参考了https://blog.csdn.net/u012110870/article/details/82500684这篇文章。

三轮轮转的时候老师让做这个,没给提供转录组数据,所以这里就没做转录组的。做到这里其实还是很粗糙,慢慢补充吧,这份文章应该还会更新的···

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342