首页 > 其他分享 >重测序数据处理得到vcf文件

重测序数据处理得到vcf文件

时间:2024-07-23 15:26:11浏览次数:16  
标签:文件 bam vcf df 测序 gz 数据处理 txt

重测序数据处理得到vcf文件

文章目录


重测序数据处理

所属目录:紫菜

创建时间:2024/7/8

作者:星云<XingYun>

更新时间:2024/7/22

URL:https://blog.csdn.net/2301_78630677/article/details/140570255

前言

本文主要是记录了重测序数据处理流程:对于送往公司的DNA样品进行重测序后,得到的数据进行一系列处理得到vcf文件。

有关于重测序数据处理的理论以及其它相关了解内容,若想了解,请查看另一篇为此专门写的博客:补充——重测序数据处理的理论以及其它相关了解内容

数据处理程序流程图
在这里插入图片描述

!!!注意: 后续处理流程的代码仅供参考,请根据自己的实际情况自行修改!

1. 数据是rawdata,需用fastp对数据进行质控和过滤

有关使用fastp对数据进行质控和过滤,推荐阅读:fastp:数据质控 + 过滤

fastp -i GQS10_1_T_1.fq.gz -I GQS10_1_T_2.fq.gz -o GQS10_1_T_1.clean.fq.gz -O GQS10_1_T_2.clean.fq.gz

2. 利用getorganelle软件组装叶绿体基因组

有关使用getorganelle软件组装叶绿体基因组,推荐阅读:零基础教程 | 叶绿体基因组组装 - GetOrganelle

get_organelle_from_reads.py -1 GQS10_1_T_1.clean.fq.gz -2 GQS10_1_T_2.clean.fq.gz
-F embplant_pt -o GQS10_1_T-cp -R 10 -t 30 -k 21,45,65,85,105

3. 检查基因组大小,确认是否完整,然后和已知的红毛菜科叶绿体基因组一起构树

有关如何构树,请参考之前我的另一篇博客:实验篇——多序列比对,构树 , 只不过用的是muscle比对,但具体流程差不多。

有关于mafft比对与muscle比对。推荐查看这篇文章:4-【mafft、muscle】的安装和使用

先用mafft比对
trimal修剪改格式
iqtree2构树

4. 根据树形结果挑选坛紫菜个体,为了后续分析方便,对所有个体进行重命名

在这一步,标记好哪些文件是坛紫菜,用于后续的挑选(如果此时就将需要的样品直接挑选出来进行后续的分析,那么第11步就直接使用第一个脚本文件;如果此时只是记录,没有直接挑选出来,而是一起进行后续分析,那么第11步使用第二个脚本文件)

5. 给参考基因组建索引

T2T_genome.fa为参考基因组;
这段代码是用于对一个名为 T2T_genome.fa 的基因组序列文件进行索引和字典创建。

bwa index T2T_genome.fa  
samtools faidx T2T_genome.fa
samtools dict T2T_genome.fa>T2T_genome.dict

在这里插入图片描述
在这里插入图片描述

6. clean reads 比对到参考基因组生成bam文件并对bam文件进行排序

这段代码的主要目的是使用bwa对clean.fq.gz文件(_1.clean.fq.gz与_2.clean.fq.gz)进行比对,并将结果保存为bam格式,然后进行排序

工作路径:在存放.clean.fq.gz数据的目录

for fname in *_1.clean.fq.gz
do
	base=${fname%_1.clean.fq.gz}
	sample=${fname%%_*}
	bwa mem -t 20 -M -R "@RG\tID:${sample}\tSM:${sample}\tPL:illumina\tLB:${sample}" ../Ref-T2T/T2T_genome.fa "$fname" "${base}_2.clean.fq.gz" |samtools view -b -@ 5 -|samtools sort -m 5g -@ 5 - > "../1.sortbam/${base}_sort.bam"
done
##代码解释:
../Ref-T2T/T2T_genome.fa表示参考基因组文件的路径。(按具体情况修改)

"$fname"表示输入的clean.fq.gz文件的路径。

"${base}_2.clean.fq.gz"表示对应的_2.clean.fq.gz文件的路径。

|samtools view -b -@ 5 -表示将比对结果从SAM格式转换为BAM格式。

|samtools sort -m 5g -@ 5 -表示对BAM文件进行排序。

"../1.sortbam/${base}_sort.bam"表示排序后的bam文件的输出路径。(按具体情况修改)

7. 按个体文件编号统计sort.bam文件

depth.txt是测序深度,coverage.txt是覆盖度,coverage_4X.txt是4x覆盖度

这段代码主要用于统计和分析 bam 文件中的比对结果和覆盖度信息

工作目录:在前一步创建的1.sortbam目录下运行

#运行此脚本
for filename in *_sort.bam
do
samtools flagstat $filename|paste -sd "/t" - >> stat_res.txt
samtools depth $filename|awk '{sum+=$3}END{print sum/NR}' >> depth.txt
samtools depth $filename|awk '{if($3>0)a+=1}END{print a/NR}' >> coverage.txt
samtools depth $filename|awk '{if($3>4)a+=1}END{print a/NR}' >> coverage_4X.txt
done

stat_res.txt文件解读:
在这里插入图片描述

在这里插入图片描述

上述结果是按照bam文件在文件夹中的排序得到的:
(1)获得所有bam文件的id

ls *bam>bam.id.txt

(2)合并个体编号的stat的结果

paste bam.id.txt stat_res.txt >248stat_res.txt #用excel提取总total 和mapped的 reads数,以及mapped的比例,

(3)利用vi 给depth.txt、coverage.txt 和coverage_4X.txt加抬头,并合并

paste depth.txt coverage.txt coverage_4X.txt >248.txt

(4)去掉excel处理后的文件中的^M,然后再和上述结果合并

sed -e 's/.$//' 248stat_res.txt >248stat_res.new.txt    #将每行文本的最后一个字符删除
paste 248stat_res.new.txt 248.txt >248tongji.txt

补充:用代码提取总total 和mapped的 reads数,以及mapped的比例,(以下代码皆为本人使用,至于是否具有普适性,请自行修改和判断)

#1.
import pandas as pd
#按照文件中第二列内容中的“/”号分割为多列(N/A不分割)
df = pd.read_csv(r"C:\Users\Desktop\248stat_res.txt", delimiter="\t", header=None)
# 提取第一列数据
column1 = df.iloc[:, 0]
# 将第二列按 "/" 分割成多列
df_split = df.iloc[:, 1].str.split('/', expand=True)
# 创建一个空的列表用于存储处理后的列
processed_columns = []
# 合并相邻的首尾为 "N" 或 "A" 的列
i = 0
while i < len(df_split.columns):
    if i < len(df_split.columns) - 1 and (df_split[i].str.endswith('N') | df_split[i].str.endswith('A')).all() and (df_split[i + 1].str.startswith('N') | df_split[i + 1].str.startswith('A')).all():
        processed_columns.append(df_split[i] + '/' + df_split[i + 1])
        i += 2
    else:
        processed_columns.append(df_split[i])
        i += 1
# 将处理后的列合并成新的DataFrame
df_processed = pd.concat([column1, pd.concat(processed_columns, axis=1)], axis=1)
# 打印处理后的数据
# print(df_processed)
# df_l = df_processed.iloc[1,:]
# print(len(df_l))
# for i in df_l:
#     print(i)
# 将处理后的DataFrame保存为txt文件
df_processed.to_csv(r"C:\Users\Desktop\processed_248stat_res.txt", sep='\t', index=False, header=False)



#2.
 #用excel提取总total 和mapped的 reads数,以及mapped的比例,
 #即形成四列(Sample、total reads、mapped reads、mapping rate)
 # 读取txt文件
df = pd.read_csv(r"C:\Users\Desktop\processed_248stat_res.txt", delimiter="\t", header=None)
Sample = df.iloc[:, 0]
print(Sample)
# 提取第二列和第五列数据
column2 = df.iloc[:, 1]
column5 = df.iloc[:, 4]
# # 打印提取的数据
# print("第二列数据:")
# print(column2)
#
# print("\n第五列数据:")
# print(column5)

# 使用正则表达式提取数字
total_reads = column2.str.extract(r'(\d+)')[0]
# print(total_reads)

# 提取第五列数据中的数字和百分比
extracted_data = column5.str.extract(r'duplicatest(\d+) \+ \d+ mapped \((\d+\.\d+)% :')

# 添加列标签
extracted_data.columns = ['mapped reads', 'mapping rate']

# 添加百分号到 Mapping Rate 列
extracted_data['mapping rate'] = extracted_data['mapping rate'] + '%'

extracted_data['Sample'] = Sample
extracted_data['total reads'] = total_reads
extracted_data =extracted_data[['Sample','total reads','mapped reads','mapping rate']]
# 打印提取的数据
print(extracted_data)
# 将处理后的extracted_data保存为txt文件
extracted_data.to_csv(r"C:\Users\Desktop\finally_248stat_res.txt", sep='\t', index=False)




#3.
# 按照另一个表格文件的样本名相应的将本txt文件中对应的内容填写(将填写的表格内容复制即可)
df = pd.read_csv(r"C:\Users\Desktop\248tongji.txt", delimiter="\t")
# print(df)
Sample = df.iloc[:, 0]
split_Sample = Sample.str.split("_")
first_elements = [item[0] for item in split_Sample]
print(first_elements)
df['Sample'] = first_elements
print(df)
# print(new_Sample)
#读取xlsx文件中的一个表(248比对到T2T统计)
# 读取xlsx文件
file_path = r"C:\Users\Desktop\248重测序样本20240706.xlsx"  
df_xlsx = pd.read_excel(file_path, sheet_name='248比对到T2T统计')
# 打印读取的表格内容
print(df_xlsx)
# 根据第一列Sample列的样本数据查询并填充信息
df_merged = df.merge(df_xlsx, on="Sample", how="right")
print(df_merged)
df_merged.to_csv(r"C:\Users\Desktop\248比对到T2T统计.txt", sep='\t', index=False)

8. 简单过滤,去除unmapped和mate unmapped的reads生成sort_flt.bam文件

先在上一级目录创建2.sort_flt.bam文件夹
代码工作目录:在1.sortbam目录下运行

#运行guolv.sh脚本:
for fname in *_sort.bam
do
sample=${fname%_sort.bam}
samtools view -q 20 -f 0x0002 -F 0X0004 -F 0X0008 -b $fname
>../2.sort_flt.bam/${sample}_sort_flt.bam
done

9.标记重复生成srt_flt_dup.bam文件

先在上一级目录创建3.srt_flt_dup.bam文件夹

代码工作目录:在上面创建的2.sort_flt.bam目录下运行

#运行bioajichongfu.sh脚本
for fname in *_sort_flt.bam
do
sample=${fname%_sort_flt.bam}
picard MarkDuplicates I=$fname O=../3.srt_flt_dup.bam/${sample}_srt_flt_dup.bam
M=../3.srt_flt_dup.bam/${sample}.duplicates.log
done

10. 使用GATK的HaplotypeCaller进行SNP/INDEL分析

先在上一级目录创建4.srt_flt_dup.g.vcf文件夹

工作路径:上一步创建的3.srt_flt_dup.bam文件夹

#先对文件夹中的bam文件建索引
for fname in *_srt_flt_dup.bam
do
samtools index $fname
done
#再使用gatk HaplotypeCaller进行SNP/INDEL分析
for fname in *_srt_flt_dup.bam
do
sample=${fname%_srt_flt_dup.bam}
gatk HaplotypeCaller -R ../Ref-T2T/T2T_genome.fa -I $fname -ERC GVCF -O
../4.srt_flt_dup.g.vcf/${sample}_srt_flt_dup.g.vcf.gz
done

11.使用gatk的CombineGVCFs命令将前面鉴定的坛紫菜样品的.g.vcf文件整合到一起

这里for循环不好用,需要用-V 把每个文件依次输入。最终获得248toTZC.g.vcf.gz文件
先在上一级目录创建5.haitanensis文件夹

工作路径:上一步创建的4.srt_flt_dup.g.vcf文件夹

可以直接用-V 来一个一个添加待整合的vcf文件(但是太慢了,可以考虑使用脚本来循环处理)
在这里插入图片描述

为了方便,可以在当前目录下创建一个combine.sh脚本,用于合并vcf文件(注意:如果是之前第4步已经挑选了所需要的坛紫菜样品,则直接获取当前目录中所有匹配的 VCF 文件,也就是用以下的代码)

#!/bin/bash

# 指定参考基因组文件
REF_GENOME="../Ref-T2T/T2T_genome.fa"

# 指定输出文件
OUTPUT="../5.haitanensis/248toTZC.g.vcf.gz"

# 获取当前目录中所有匹配的 VCF 文件
VCF_FILES=$(ls *_srt_flt_dup.g.vcf.gz)

# 初始化 -V 参数
V_ARGS=""

# 遍历 VCF 文件列表
for VCF_FILE in $VCF_FILES; do
    # 获取文件名(不包括扩展名)
    FILE_BASE=$(basename $VCF_FILE _srt_flt_dup.g.vcf.gz)

    # 为每个文件添加 -V 参数
    V_ARGS="$V_ARGS -V $FILE_BASE\_srt_flt_dup.g.vcf.gz"
done

# 使用 CombineGVCFs 合并 VCF 文件
gatk CombineGVCFs -R $REF_GENOME $V_ARGS -O $OUTPUT

如果之前第4步没有立即挑选出所需要的坛紫菜样品,而是只是用一个表格记录下来;那么要从当前目录中获取坛紫菜样品的vcf文件。使用以下代码:

#!/bin/bash
# 指定参考基因组文件
REF_GENOME="../Ref-T2T/T2T_genome.fa"
# 指定输出文件
OUTPUT="../5.haitanensis/149toTZC.g.vcf.gz"
# 获取当前目录中所有匹配的 VCF 文件
VCF_FILES=$(cat tang_fixed.txt | xargs -n 1 ls)
# 初始化 -V 参数
V_ARGS=""

# 遍历 VCF 文件列表
for VCF_FILE in $VCF_FILES; do
    if [ -f "$VCF_FILE" ]; then
        echo "文件存在: $VCF_FILE"
        # 获取文件名(不包括扩展名)
        FILE_BASE=$(basename $VCF_FILE _srt_flt_dup.g.vcf.gz)
         # 为每个文件添加 -V 参数
        V_ARGS="$V_ARGS -V $FILE_BASE\_srt_flt_dup.g.vcf.gz"
    else
        echo "文件不存在: $VCF_FILE"
    fi
done
# 使用 CombineGVCFs 合并 VCF 文件
gatk CombineGVCFs -R $REF_GENOME $V_ARGS -O $OUTPUT

补充:(tang_fixed.txt文件形成)
在这之前需要将cp构树鉴定结果为“坛紫菜”的挑选出来,获取对应重测序分析编号,以便获取对应的vcf文件名称。

在这里插入图片描述

#使用代码形成为坛紫菜的vcf文件名称,保存到tang.txt文件中
import pandas as pd
file_path = r"C:\Users\Desktop\tang.xlsx"
df_xlsx= pd.read_excel(file_path)
# print(df_xlsx)
print(df_xlsx.columns)
# print(df_xlsx.index)
# # 筛选数据
filtered_data = df_xlsx[df_xlsx["cp构树鉴定结果"] == "坛紫菜"]
# 重置索引
filtered_data.reset_index(drop=True, inplace=True)
# 输出结果
print(filtered_data)
# 获取第一列数据
first_column = filtered_data.iloc[:, 0]
# 将第一列数据写入文本文件
with open("tang.txt", "w") as f:
    for item in first_column:
        f.write(str(item) + "_srt_flt_dup.g.vcf.gz\n")

如果文件名之间有分隔符,可能会导致问题。

#删除 tang.txt 文件中的所有 \r 字符,然后将结果保存到名为tang_fixed.txt 的新文件
tr -d '\r' < tang.txt > tang_fixed.txt

12. 获得原始vcf文件

工作路径:上一步创建的5.haitanensis文件夹
运行此脚本

echo 'start_get_rawVCF'
gatk GenotypeGVCFs -R ../Ref-T2T/T2T_genome.fa -O
149toTZC.variant.raw.vcf.gz -V 149toTZC.g.vcf.gz -all-sites 1>
log_GenotypeGVCFs_all_sites.txt 2>&1
echo 'done_get_rawVCF'

13.保留双等位基因型

工作路径:5.haitanensis文件夹

vcftools --gzvcf 149toTZC.variant.raw.vcf.gz --min-alleles 2 --max-alleles 2 --
recode --recode-INFO-all --out 149toTZC.2allele.vcf

14.最终得到vcf文件

查看一下得到的文件

less -N 149toTZC.2allele.vcf.recode.vcf

在这里插入图片描述

sed -n '40,70p' 149toTZC.2allele.vcf.recode.vcf | cut -f 1-6,10-14

在这里插入图片描述


总结

本文主要了对重测序数据进行处理得到vcf文件的流程,从得到rawdata,用fastp对数据进行质控和过滤,使用getorganelle软件对叶绿体基因组进行组装、通过构树鉴定所需个体;
再到后期的给参考基因组建索引、clean reads比对到参考基因组生成bam文件、对bam文件进行一系列处理、使用gatk软件进行SNP/INDEL分析、文件整合、获得原始vcf文件。

总之,得到了vcf文件后,是用于后续的继续分析。

2024/7/21

标签:文件,bam,vcf,df,测序,gz,数据处理,txt
From: https://blog.csdn.net/2301_78630677/article/details/140570255

相关文章

  • linux执行vcfmaf命令perl vcf2maf.pl xxx,如何将vcf2maf.pl添加到环境变量,使得脚本可以
    要将vcf2maf.pl(或任何其他Perl脚本)添加到环境变量中,以便能够直接在命令行中调用它,你实际上不需要将脚本本身添加到PATH环境变量。PATH环境变量用于查找可执行文件(通常是编译后的二进制文件),而不是脚本。但是,由于Perl脚本可以通过Perl解释器执行,你可以通过几种方式来实现类似的功能......
  • AI - 数据处理 - fit、transform、fit_transform 区别
    总结fit_transform=fit+transform的组合,整个过程既包括了训练又包含了转换。fit_transform对数据先拟合fit,找到数据的整体指标,如均值、方差、最大值最小值等,然后对数据集进行转换transform,从而实现数据的标准化、归一化操作。如果要想在fit_transform的过程中查看数......
  • 数据处理
    数据处理:主要利用的库importnumpyasnpimportpandasaspd函数的使用:1.读取:path="路径"c=pd.read_csv(path,sep="")参数sep是数据的分割符号,如果不输入在读取csv文件中将默认为“,”返回的内容是属于pandas库的特殊数据类型DataFrame。在读取过程中,该函数会根据......
  • 激光雷达数据处理
    激光雷达技术以其高精度、高效率的特点,已经成为地表特征获取、地形建模、环境监测等领域的重要工具。掌握激光雷达数据处理技能,不仅可以提升工作效率,还能够有效提高数据的质量和准确性,为决策提供可靠的数据支持。随着激光雷达技术在地理信息系统(GIS)、遥感和测绘领域的广泛应用......
  • 学习数据处理的三要点
    (只是用MapReduce举例,只要是数据处理任何工具都可以从这三点去学习 ) 用MapReduce做数据分析处理或统计等这类和数据进行交互处理的编程计算可简单归纳出几个要点:1.弄清要处理的数据进行程序的结构首先第一个要弄清楚的就是你的程序读取进来的数据是什么样子的,是什么......
  • Java中的流式数据处理与Apache Flink应用
    Java中的流式数据处理与ApacheFlink应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何使用Java与ApacheFlink进行流式数据处理。ApacheFlink是一个开源的流处理框架,支持大规模数据流的实时处理和分析。它以其高性能、低延迟和强大......
  • 基于Python星载气溶胶数据处理与反演分析
    在当前全球气候变化和环境污染问题日益突出的背景下,气溶胶研究显得尤为重要。气溶胶在大气中由直径范围在0.01微米至10微米固体和液体颗粒构成,直接或间接影响地球辐射平衡、气候变化和空气质量。尤其在“碳中和”目标的驱动下,研究气溶胶对“碳中和”的气候影响及其环境效应,不仅......
  • 【VMware VCF】VMware Cloud Foundation Part 02:部署 Cloud Builder。
    VMwareCloudBuilder是用于构建VMwareCloudFoundation第一个管理域的自动化部署工具,通过将一个预定义信息的Excel参数表导入到CloudBuilder以启动VCF的初始构建过程(Bring-up)。VMwareCloudBuilder通常是以OVA文件的形式与VMwareCloudFoundation一同发行并在......
  • 【稳定检索】2024年数据处理与人工智能国际会议(ICDPAI 2024)
    2024年数据处理与人工智能国际会议2024InternationalConferenceonDataProcessingandArtificialIntelligence【1】会议简介        2024年数据处理与人工智能国际会议是数据处理和人工智能领域的一次重要盛会。会议旨在通过全球范围内专家学者的深入交流,探......
  • 数据处理
    数据处理:主要利用的库importnumpyasnpimportpandasaspd函数的使用:1.读取:path="路径"c=pd.read_csv(path,sep="")参数sep是数据的分割符号,如果不输入在读取csv文件中将默认为“,”返回的内容是属于pandas库的特殊数据类型DataFrame。在读取过程中,该函数会根据......