全基因组重测序


#!/usr/local/bin/python3

-- coding: utf-8 --

This script file shoud be at the same directory with Cleandata

2022.02.09

delete redundancy bamFile

python3 $0 -t 9 -i input_dir -r ReferenceFile

import os, sys, glob, time, argparse,threading

my_parser = argparse.ArgumentParser()

my_parser.add_argument(‘-t’, dest=’thread’,type=int,default=’4’) #线程数

my_parser.add_argument(‘-i’, dest=’input_dir’) #线程数

my_parser.add_argument(‘-r’, dest=’reference’) #线程数

args = my_parser.parse_args()

TimeTable = open(args.input_dir+’TimeTable.txt’,’w’)

ref=args.reference

output_bam_dir = args.input_dir + ‘_bam_dir’

output_gvcf_dir = args.input_dir + ‘_gvcf_dir’

if os.path.exists(output_bam_dir):

sys.exit(output_bam_dir+' exist!!!')

elif os.path.exists(output_gvcf_dir):

sys.exit(output_gvcf_dir+' exist!!!')

else:

os.makedirs(output_bam_dir)

os.makedirs(output_gvcf_dir)

def mult(funct, ls, n=3):

pool = []  # 线程池

length = len(ls)

step = int(length / n) + 1

for i in range(0, length, step):

    p = threading.Thread(target=funct, args=(ls[i: i + step],)) #把ls切成了n段,每段step长,最后段可能断一点

    pool.append(p)

for p in pool: #pool包含列表的列表,长度为n(即n个列表),每一个列表长度为step。

    p.start() #这里同时启动n个进程,一个进程里加入参数ls[i: i + step],funct函数会对ls[i: i + step]慢慢处理。

for p in pool:

    p.join() #等待所有进程结束

print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'_Main thread STAR exiting', file=TimeTable)

TimeTable.flush()

sample_names_dir = glob.glob(args.input_dir+’/*’) # Every sample has a directory which contain fq.gz file 每个样品单独一个文件夹,文件夹下包含fq.gz的文件 不包含绝对路径

bam_list = []

all_sample_fq = {} # This dictionary will include the sample’s name (key) and fq.gz (value) 字典以样品名为键,以1或2.fq.gz文件名为值

def bwa(part_sample_directory): #把bwa封装

for sample_dir in part_sample_directory:

    sample_head = os.path.basename(sample_dir)

    if not (os.path.exists(sample_dir+'/'+sample_head+'_R1.fq.gz') and os.path.exists(sample_dir+'/'+sample_head+'_R1.fq.gz')):

        sys.exit(sample_dir+'/'+sample_head+'_R1.fq.gz' + ' or '+sample_dir+'/'+sample_head+'_R1.fq.gz' + " don't exist!!!")

    os.system('bwa mem -M -t 4 -R  "@RG\\tID:{0}\\tSM:{0}\\tPL:illumina\\tLB:lib1\\tPU:unit1" {1} {2}/{0}_R1.fq.gz {2}/{0}_R2.fq.gz | samtools view -bhS -o {3}/{0}.bam'.format(sample_head, ref, sample_dir, output_bam_dir))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'bwa programming finished***In threading***'+sample_head, file=TimeTable)

    TimeTable.flush()

    time.sleep(0.2)

    os.system('java -jar picard.jar SortSam INPUT={0}/{1}.bam OUTPUT={0}/{1}_sorted.bam SORT_ORDER=coordinate TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}.bam'.format(output_bam_dir,sample_head))

    os.system('java -jar picard.jar AddOrReplaceReadGroups I={0}/{1}_sorted.bam O={0}/{1}_sorted_add.bam RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM={1} TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}_sorted.bam'.format(output_bam_dir,sample_head))

    os.system('java -jar picard.jar MarkDuplicates I={0}/{1}_sorted_add.bam O={0}/{1}_sorted_add_dedup.bam M={0}/{1}_sorted_add_dedup.metrics CREATE_INDEX=true MAX_FILE_HANDLES_FOR_READ_ENDS_MAP=4000 TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}_sorted_add.bam'.format(output_bam_dir,sample_head))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'java -jar picard.jar BuildBamIndex programming finished***In threading***'+sample_head, file=TimeTable)

    os.system("java -jar /home/data1/renminpeng/SRR2131201/gatk-package-4.1.8.1-local.jar HaplotypeCaller -R {0} GVCF -I {1}/{2}_sorted_add_dedup.bam -o {3}/{2}.g.vcf".format(ref, output_bam_dir,sample_head,output_gvcf_dir))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'java -jar /home/data1/renminpeng/SRR2131201/gatk-package-4.1.8.1-local.jar programming finished***In threading***'+sample_head, file=TimeTable)

    TimeTable.flush()

    bam_list.append('--variant  {0}/{1}.g.vcf'.format(output_gvcf_dir,sample_head))

在linux中,我有一个文件夹名字为 数字,然后下面有很多文件,SRR213201,SRR213202等等,每个文件里有sra文件,我现在想让他们转换成faatq格式,在自己的文件夹下,有什么命令实现吗?

转换命令一般用这个 fastq-dump SRR213201 –outdir /home/data1/renminpeng/SRR213201 –split-files SRR213201

要在Linux中将多个 .sra 文件转换为 fastq 格式,并保持每个文件在其自己的目录中,您可以使用一个简单的 bash 脚本来自动化这个过程。给定您的需求和已提供的转换命令模板,以下是一个示例脚本,它会遍历名为 数字 的文件夹中的所有子文件夹,查找 .sra 文件,并使用 fastq-dump 工具进行转换。

首先,确保您有SRA Toolkit安装在您的系统上,因为 fastq-dump 命令是该工具包的一部分。

然后,您可以创建一个脚本,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

# 设置包含子文件夹的父文件夹路径
PARENT_DIR="/path/to/数字"

# 遍历每个子文件夹
for SUBDIR in ${PARENT_DIR}/*; do
if [ -d "${SUBDIR}" ]; then # 确保它是一个目录
echo "Processing ${SUBDIR}..."
# 在每个子文件夹中查找所有.sra文件
for SRA_FILE in ${SUBDIR}/*.sra; do
if [ -f "${SRA_FILE}" ]; then # 确保.sra文件存在
# 获取不带扩展名的文件名
FILE_NAME=$(basename "${SRA_FILE}" .sra)
# 构建输出目录,这里使用与SRA文件相同的目录
OUT_DIR="${SUBDIR}"
# 调用fastq-dump进行转换
fastq-dump "${SRA_FILE}" --outdir "${OUT_DIR}" --split-files
echo "Converted ${SRA_FILE} to fastq format."
fi
done
fi
done

echo "All .sra files have been converted to fastq format."

请按照以下步骤使用此脚本:

  1. 将上述脚本保存到一个文件中,例如 convert_sra_to_fastq.sh
  2. 修改 PARENT_DIR 变量,使其指向包含所有子文件夹的父文件夹的路径(在您的例子中,这个路径是包含所有SRR开头的文件夹的 数字 文件夹的路径)。
  3. 赋予脚本执行权限:chmod +x convert_sra_to_fastq.sh
  4. 执行脚本:./convert_sra_to_fastq.sh

这个脚本会遍历每个子文件夹,查找所有 .sra 文件,并使用 fastq-dump 将它们转换为 fastq 格式,转换后的文件将保存在源 .sra 文件相同的目录中。

#!/usr/local/bin/python3

-- coding: utf-8 --

Genomic data analysis script adjusted for processing files 1.sra to 68.sra

import os, sys, glob, time, argparse, threading

Setup command line arguments

my_parser = argparse.ArgumentParser(description=’Genomic data analysis pipeline adjusted for specific .sra files’)
my_parser.add_argument(‘-t’, dest=’thread’, type=int, default=4, help=’Number of threads’)
my_parser.add_argument(‘-i’, dest=’input_dir’, default=’/home/data1/renminpeng/New1’, help=’Input directory containing .sra files’)
my_parser.add_argument(‘-r’, dest=’reference’, default=’/home/data1/renminpeng/New/reference.fasta’, help=’Reference genome file path’)
args = my_parser.parse_args()

Create a time log file

TimeTable = open(os.path.join(args.input_dir, ‘TimeTable.txt’), ‘w’)

ref = args.reference

Define output directories

output_bam_dir = args.input_dir + ‘_bam_dir’
output_gvcf_dir = args.input_dir + ‘_gvcf_dir’
fastq_dir = args.input_dir + ‘_fastq’

Check and create output directories if not exist

if not os.path.exists(output_bam_dir):
os.makedirs(output_bam_dir)
if not os.path.exists(output_gvcf_dir):
os.makedirs(output_gvcf_dir)
if not os.path.exists(fastq_dir):
os.makedirs(fastq_dir)

Function for parallel processing

def mult(funct, ls, n=3):
pool = [] # Thread pool
length = len(ls)
step = int(length / n) + 1
for i in range(0, length, step):
p = threading.Thread(target=funct, args=(ls[i: i + step],))
pool.append(p)
for p in pool:
p.start()
for p in pool:
p.join()
print(time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime(time.time())) + ‘_Main thread STAR exiting’, file=TimeTable)
TimeTable.flush()

Convert .sra to .fq and perform alignment

def sra_to_fq_and_bwa(sra_files):
for sra_file in sra_files:
sample_head = os.path.basename(sra_file).split(‘.’)[0] # Assuming filename “1.sra”, sample_head would be “1”
# Convert .sra to .fq.gz using fastq-dump
fq1_path = os.path.join(fastq_dir, f”{sample_head}_1.fastq.gz”)
fq2_path = os.path.join(fastq_dir, f”{sample_head}_2.fastq.gz”)
os.system(f’fastq-dump –split-files –gzip –outdir {fastq_dir} {sra_file}’)
# Check if FASTQ files were created
if not os.path.exists(fq1_path) or not os.path.exists(fq2_path):
sys.exit(f”Error converting {sra_file} to FASTQ format.”)
# Execute BWA alignment, followed by processing steps
bam_output = os.path.join(output_bam_dir, f”{sample_head}.bam”)
# Ensure commands such as BWA, samtools are available in your environment
os.system(f’bwa mem -M -t {args.thread} -R “@RG\tID:{sample_head}\tSM:{sample_head}\tPL:illumina\tLB:lib1\tPU:unit1” {ref} {fq1_path} {fq2_path} | samtools view -bhS - > {bam_output}’)
# Further processing steps can be adjusted here

Prepare a list of .sra files to process

sra_files_to_process = [os.path.join(args.input_dir, f”{i}.sra”) for i in range(1, 69)]

Process .sra files

mult(sra_to_fq_and_bwa, sra_files_to_process, n=args.thread)

运行命令:python3 institute2_DNA_to_VCF1.4.py -t 8 -i /home/data1/renminpeng/New1 -r /home/data1/renminpeng/New/reference.fasta

上一步生成的bam_dir文件

然后

User
NCBI中的全基因组重测序文件有哪些类型?

NCBI (National Center for Biotechnology Information) 是一个重要的公共数据库,用于存储各类生物学数据,包括全基因组重测序(Whole Genome Sequencing, WGS)文件。全基因组重测序文件可以采用多种格式存储,每种格式都有其特定的用途和特点。以下是一些常见的全基因组重测序文件类型:

  1. **FASTA (.fasta 或 .fa)**:这是最基本的序列数据格式,用于存储核酸(DNA或RNA)序列或蛋白质序列。在全基因组重测序中,FASTA格式常用于存储参考序列或重测序后的拼接序列。

  2. **FASTQ (.fastq)**:这种格式包含了序列(nucleotide sequences)及其对应的质量分数(quality scores)。FASTQ是原始测序数据的标准格式,广泛用于存储Illumina、SOLiD等下一代测序技术(Next-Generation Sequencing, NGS)的输出结果。

  3. **SAM/BAM (.sam/.bam)**:序列比对/映射格式(Sequence Alignment/Map Format)和其二进制版本(Binary Alignment/Map)。SAM格式用于存储序列的比对信息,包括序列与参考基因组的对齐情况。BAM是SAM的压缩二进制格式,便于存储和快速访问。

  4. **VCF (.vcf)**:变异调用格式(Variant Call Format),用于存储基因组变异数据,包括单核苷酸多态性(SNPs)、插入缺失(indels)等。VCF文件通常由比对工具(如SAMtools、GATK)生成,用于记录相对于参考基因组的变异信息。

  5. **CRAM (.cram)**:CRAM是一种比BAM更加高效的序列数据压缩格式。它利用参考基因组来实现更高的压缩率,同时保留了与BAM相同的信息内容。

  6. **GFF/GTF (.gff/.gtf)**:基因特征格式(Gene Feature Format)和基因转录格式(Gene Transfer Format)用于描述基因和其他基因组特征的位置和属性。

这些文件类型各有用途,比如原始序列数据(FASTQ),比对结果(SAM/BAM/CRAM),以及变异信息(VCF)。NCBI提供的数据库和工具(如SRA、GenBank等)允许研究人员访问和下载这些不同类型的数据文件,以支持基因组学研究。

vcf文件是不是最后一步?

VCF(Variant Call Format)文件通常出现在全基因组重测序分析流程的较后阶段,主要用于记录相对于参考基因组的变异信息,如单核苷酸多态性(SNPs)、插入缺失(indels)、复杂变异等。VCF文件的生成是变异检测分析的一个重要步骤,但是否是最后一步取决于具体的研究目标和分析流程。

在全基因组重测序的典型工作流程中,VCF文件的生成通常遵循以下步骤:

  1. 原始数据质控:使用如FastQC之类的工具对FASTQ格式的原始测序数据进行质量控制。
  2. 序列比对:将测序得到的短序列(reads)与参考基因组进行比对,通常会使用如BWA或Bowtie之类的工具生成SAM/BAM格式文件。
  3. 后处理:对比对结果进行排序、标记重复序列、重新比对以优化间隙区域等步骤,以提高变异检测的准确性。
  4. 变异检测:分析比对结果,检测基因组变异,如SNPs和indels,通常使用如GATK、Samtools等工具生成VCF格式文件。

在生成了VCF文件之后,可能还会进行以下分析:

  • 变异过滤:根据质量分数、深度、变异频率等标准过滤变异,提高变异检测的准确性。
  • 变异注释:使用如ANNOVAR、SnpEff等工具对检测到的变异进行注释,包括变异对蛋白质功能的影响、变异在已知疾病中的角色等信息。
  • 变异效应预测:评估变异可能对基因或基因产物功能的影响,包括突变对蛋白结构和功能的潜在影响。
  • 统计分析和关联研究:对变异数据进行统计分析,探索变异与特定表型或疾病的关联。

因此,虽然VCF文件的生成是分析流程中的一个关键步骤,但后续的过滤、注释、效应预测和统计分析等步骤同样重要,特别是在寻找与疾病相关的变异或进行基因组关联研究时。

关系

这些文件格式在全基因组重测序(WGS)分析流程中相互关联,每种格式在分析的不同阶段发挥作用。这些格式从原始数据的生成、处理、分析到结果的解释,构成了一个连续的数据处理流程。下面是这些文件格式之间关系的简要概述:

  1. FASTQ:这是分析流程的起点,包含原始的测序读段(reads)及其质量分数。FASTQ文件通常是下一代测序(NGS)技术输出的直接产品,是后续分析的基础。

  2. FASTA:虽然FASTA格式不直接从FASTQ格式生成,但它在分析中扮演重要角色,通常作为参考基因组的存储格式。参考基因组是比对分析的基础,用于将测序读段映射回原来的位置。

  3. SAM/BAM:使用比对工具(如BWA、Bowtie等)将FASTQ文件中的读段比对到参考基因组(通常存储为FASTA格式)上,生成SAM格式文件。SAM文件是序列比对结果的文本表示,包含了读段与参考基因组的对应关系。由于SAM文件体积庞大,通常会被转换成BAM格式,后者是SAM的二进制压缩版本,便于存储和快速访问。

  4. CRAM:CRAM格式是BAM格式的一种更加高效的压缩形式,尤其在参考基因组已知的情况下,可以显著减少文件大小,同时保留了与BAM相同的信息内容。

  5. VCF:在比对(SAM/BAM/CRAM文件)的基础上,使用变异检测工具(如GATK、Samtools等)分析比对结果,识别基因组中的变异(SNPs、indels等),并将这些信息存储在VCF文件中。VCF文件代表了从原始测序数据到最终变异检测结果的转化。

  6. GFF/GTF:这些文件格式用于描述基因和其他基因组特征的位置和属性,常用于注释参考基因组或解释比对和变异检测结果。虽然GFF/GTF文件不直接从上述流程生成,但它们为理解基因组结构和功能、以及变异的生物学影响提供了重要信息。

综上所述,FASTQ文件是分析的起点,包含原始测序数据;FASTA格式存储参考基因组,为读段比对提供基础;SAM/BAM/CRAM文件记录了读段与参考基因组的比对结果;VCF文件存储最终的变异检测结果;GFF/GTF文件则用于基因组特征的注释和描述。这些格式一起构成了从原始数据到最终结果的完整分析流程。

对于之前提及的全基因组测序数据处理步骤,这里提供一个更详细的解释:

  1. 质量控制:使用FastQC对原始的FASTQ格式测序数据进行质量评估,包括识别低质量的序列和可能的污染。这一步骤帮助确定数据是否适合进一步分析。

  2. 序列比对:BWA是一个常用的比对工具,它将测序读段(FASTQ格式)比对到参考基因组(FASTA格式)。比对结果通常保存为SAM格式,这是一种文本格式,详细记录了每个读段与参考基因组的对应关系。

  3. SAM转BAM:SAM文件虽然易于阅读,但体积较大。使用Samtools将SAM格式转换为BAM格式,BAM是SAM的二进制版本,可以显著减小文件大小,便于存储和快速读取。

  4. 排序BAM文件:对BAM文件进行排序是许多分析工具的前提条件。使用Samtools对BAM文件按照参考基因组的坐标进行排序。

  5. 标记重复:重复的读段可能来自PCR扩增等实验过程。使用Picard工具标记重复的读段,有助于提高变异检测的准确性。

  6. 创建BAM索引:为了快速访问BAM文件中的特定区域,需要为其创建索引文件。使用Samtools可以轻松完成这一步骤。

  7. 变异检测:GATK工具的HaplotypeCaller功能用于从比对好的序列(BAM文件)中检测SNPs和indels等变异,结果保存在VCF文件中。

每一步都需要相应的命令行工具和参数。这些步骤构成了从原始数据到变异检测的基本流程,但实际操作中可能需要根据具体情况调整参数或增加其他分析步骤。

对于具体的全基因组重测序数据分析示例,如处理鸡的全基因组数据,详细步骤会包括但不限于以下过程,每一步均需在命令行环境中执行:

  1. 质量控制

    1
    fastqc chicken_data.fastq -o output_dir

    使用FastQC对原始测序数据chicken_data.fastq进行质量评估,输出结果到指定目录output_dir

  2. 序列比对

    1
    bwa mem reference_genome.fasta chicken_data.fastq > chicken_aligned.sam

    使用BWA将数据chicken_data.fastq与参考基因组reference_genome.fasta进行比对,输出SAM文件chicken_aligned.sam

  3. SAM转BAM

    1
    samtools view -S -b chicken_aligned.sam > chicken_aligned.bam

    使用Samtools将SAM文件转换为BAM格式,便于后续处理。

  4. 排序BAM文件

    1
    samtools sort chicken_aligned.bam -o chicken_sorted.bam

    对BAM文件进行排序,输出为chicken_sorted.bam

  5. 标记重复

    1
    picard MarkDuplicates I=chicken_sorted.bam O=chicken_dedup.bam M=dup_metrics.txt

    使用Picard工具标记BAM文件中的重复读段,输出去重后的BAM文件chicken_dedup.bam和重复度量文件dup_metrics.txt

  6. 创建BAM索引

    1
    samtools index chicken_dedup.bam

    为去重后的BAM文件创建索引,以便快速访问。

  7. 变异检测

    1
    gatk HaplotypeCaller -R reference_genome.fasta -I chicken_dedup.bam -O chicken_variants.vcf

    使用GATK的HaplotypeCaller对去重后的BAM文件进行变异检测,输出VCF文件chicken_variants.vcf

请注意,这些命令只是一般性示例,实际使用时需要根据具体情况(如文件路径、参考基因组的确切名称等)进行调整。此外,每个步骤可能需要安装相应的软件和库。

如果有多个chicken_data.fastq格式的文件呢?

如果有多个chicken_data.fastq格式的文件,可以使用循环或合并策略处理这些文件。一个常见的方法是首先对每个文件进行序列比对,然后将所有的BAM文件合并,以进行后续分析。以下是处理多个文件的示例步骤:

  1. 对每个FASTQ文件运行BWA进行比对,生成多个SAM文件。
  2. 将每个SAM文件转换为BAM格式,并对每个BAM文件进行排序。
  3. 使用samtools merge命令合并所有排序后的BAM文件。
  4. 对合并后的BAM文件标记重复并创建索引。
  5. 进行变异检测。

例如,假设有两个文件chicken_data_1.fastqchicken_data_2.fastq,合并步骤可能如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 步骤1-4: 对每个文件重复执行前述步骤
# 合并排序后的BAM文件
samtools merge combined_sorted.bam chicken_sorted_1.bam chicken_sorted_2.bam

# 标记重复
picard MarkDuplicates I=combined_sorted.bam O=combined_dedup.bam M=combined_dup_metrics.txt

# 创建索引
samtools index combined_dedup.bam

# 变异检测
gatk HaplotypeCaller -R reference_genome.fasta -I combined_dedup.bam -O combined_variants.vcf

这只是一个基本的处理流程。实际应用中,可能需要根据具体的项目需求和数据量调整这个流程。

https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-022-08598-2

在Galbase平台上找到全面的鸡全基因组重测序数据进行分析。Galbase整合了从公共资源(如NCBI序列读取存档)收集的多组学数据,提供了928个重测序基因组及相关组学数据集。这个资源旨在支持鸡的广泛基因组和遗传研究。

TBtools | 基因组重测序数据分析常用上游软件「三兄弟」,聚齐了~

https://www.jianshu.com/p/a98b3b69bcfe

当然,我可以向你说明如何在NCBI(美国国家生物技术信息中心)中搜索鸡(Gallus gallus)的全基因组重测序数据的步骤。NCBI 提供了多个数据库来存储不同类型的生物信息数据,对于全基因组重测序数据,通常可以在 SRA(序列读取档案)数据库中找到。以下是步骤:

1. 访问 NCBI 主页

2. 进入 SRA 数据库

  • 在 NCBI 主页的搜索框中,有一个下拉菜单允许你选择不同的数据库。选择 “SRA” 选项。
  • 在搜索框中输入 Gallus gallus 或者 chicken,然后点击搜索图标或按回车键。

3. 精确化搜索

  • 搜索结果出现后,你可能会看到大量的记录。为了精确地找到全基因组重测序数据,可以在搜索框中添加额外的关键词,如 genome sequencingwhole genome resequencingWGS
  • 例如,你可以输入 Gallus gallus whole genome resequencingchicken WGS

4. 使用过滤器

  • 搜索结果页面通常会提供过滤器,以帮助你进一步缩小搜索范围。你可以按照发布日期、研究类型(如 “其他” 或 “基因组学”)、来源(如 “多细胞生物”)等条件来过滤搜索结果。

5. 选择和查看数据集

  • 浏览搜索结果,点击感兴趣的记录标题查看详情。
  • 每个数据集的页面都会提供关于该数据集的详细信息,包括摘要、出版信息、数据访问和下载选项。

6. 下载数据

  • 根据你的需求,你可以下载整个数据集或部分数据。SRA 数据库提供了多种下载选项,包括直接下载和使用 NCBI 的 SRA Toolkit 工具。
  • 如果你不熟悉如何使用 SRA Toolkit,NCBI 提供了详细的使用指南和教程。

以上就是在 NCBI 中搜索鸡的全基因组重测序数据的基本步骤。请注意,随着 NCBI 网站的更新和改进,具体的操作步骤可能会有所变化。如果你在搜索或下载数据时遇到任何问题,建议查阅 NCBI 的帮助文档或联系他们的客服支持。

是的,全基因组测序数据(WGS, Whole Genome Sequencing)确实可以在 NCBI 的 SRA(Sequence Read Archive)数据库中找到。SRA 存储了来自高通量测序平台的原始测序数据和质量信息,这包括了不仅限于全基因组测序数据,还有转录组测序(RNA-Seq)、表观基因组测序(如ChIP-Seq)、以及其他各种测序技术产生的数据。

对于寻找全基因组测序数据,SRA 提供了一个丰富的资源库,其中包含了许多物种的全基因组数据。用户可以通过使用特定的搜索关键词(例如物种名称加上 “whole genome sequencing” 或 “WGS”)来查找目标物种的全基因组数据。此外,SRA 的高级搜索和过滤功能也可以帮助用户更精确地定位到所需的数据集。

一旦找到感兴趣的数据集,用户可以查看数据的详细信息,包括实验设计、样本信息和下载选项。NCBI 还提供了SRA Toolkit,这是一套命令行工具,用于下载、转换和分析SRA中的数据。这些工具可以帮助用户更高效地处理和分析数据,以支持他们的科研项目。

User

NCBI,SRA数据库,下载的sra文件,基因组数据,和转录组数据的sra,转换成fastq格式,他们的方法一样吗?

NCBI SRA (Sequence Read Archive) 数据库是一个公共资源,用于存储来自世界各地的生物科学研究中产生的序列数据。这些数据可以包括基因组数据、转录组数据等。SRA 文件可以转换为更为通用的 FASTQ 格式,以便进行进一步的分析。基因组数据和转录组数据虽然来源不同,但他们从 SRA 格式转换到 FASTQ 格式的基本方法是相同的。

转换 SRA 文件到 FASTQ 格式,通常使用 NCBI 的 fastq-dump 工具,这是 SRA Toolkit 的一部分。以下是一个基本的转换步骤:

  1. 下载 SRA Toolkit:首先,需要从 NCBI 的网站下载并安装 SRA Toolkit。

  2. 使用 fastq-dump 转换 SRA 到 FASTQ:接下来,使用 fastq-dump 命令行工具将 SRA 文件转换成 FASTQ 格式。这一步对于基因组数据和转录组数据来说是一样的。

    1
    fastq-dump --split-files <sra_file_path>

    这里的 --split-files 参数用于处理那些包含成对测序读取的 SRA 文件,确保成对的读取会被分割到不同的文件中。

  3. 其它参数fastq-dump 还有其他参数可以根据需要使用,比如 --gzip 用于压缩输出的 FASTQ 文件,以节省空间。

尽管基因组和转录组数据的来源不同,但从技术角度看,将它们从 SRA 格式转换为 FASTQ 格式的过程是一样的。重要的是要了解你的数据类型(如单端或双端),以便在转换过程中使用正确的参数,确保数据正确处理。对于更复杂的需求,比如只提取特定区域的读取或处理非常大的数据集,SRA Toolkit 提供了其他工具和参数来支持这些高级功能。

使用GATK(Genome Analysis Toolkit)和Picard的MarkDuplicates模块来标记PCR重复是生物信息学数据分析中的一个重要步骤,尤其是在处理高通量测序(HTS)数据时。PCR重复是指因PCR扩增过程中的偏好性扩增或样本制备过程中的其他原因导致的序列重复。标记这些重复是非常重要的,因为它们可以人为地增加特定序列的覆盖度,从而影响变异检测和其他分析的准确性。

Picard MarkDuplicates

在Picard工具中,MarkDuplicates被用来标记BAM或SAM文件中的重复序列,但不会实际删除这些重复。用户可以选择在后续分析中忽略这些标记为重复的序列。

下面是一个使用Picard MarkDuplicates的命令行示例:

1
picard MarkDuplicates I=chicken_sorted.bam O=chicken_dedup.bam M=dup_metrics.txt

这个命令的参数意义如下:

  • I=chicken_sorted.bam:输入文件,必须是排序过的BAM文件。
  • O=chicken_dedup.bam:输出文件,其中重复将被标记(不是删除)。
  • M=dup_metrics.txt:输出的重复指标文件,包含了关于识别出的重复的统计信息。

GATK MarkDuplicates

GATK的MarkDuplicates功能类似于Picard的,因为GATK的很多工具实际上是建立在Picard工具包之上的。GATK4开始提供了一个自己的MarkDuplicates工具,其语法和Picard非常相似,但是集成在了GATK的框架中。GATK的版本通常通过命令行界面的gatk命令调用。

如果你使用的是GATK来标记重复,你需要确保已经安装了GATK,并且按照它的要求准备好了环境。GATK的命令行可能看起来像这样:

1
gatk MarkDuplicates -I chicken_sorted.bam -O chicken_dedup.bam -M dup_metrics.txt

在GATK命令中,参数前缀通常是一个短划线-,而Picard则是直接使用等号=。其他的参数意义和Picard中的类似。

总结

选择使用Picard还是GATK的MarkDuplicates主要取决于你的工作流程以及你对工具的熟悉程度。两者在功能上是非常相似的,但GATK可能提供了一些额外的集成和便利性,特别是如果你已经在使用GATK进行其他分析的情况下。重要的是要确保输入的BAM文件是排序过的,以便工具能正确地标记重复序列。

我之前提供的GATK MarkDuplicates使用示例是一个基本的示例,而您提供的命令行示例展示了更多的选项和参数设置,使其能够更精细地控制过程并适应具体的系统资源。这个示例同样使用GATK来标记重复,但包含了一些高级配置,让我们来详细解析这个命令:

1
2
3
4
5
6
java -Xmx20g -XX:ParallelGCThreads=8 -jar gatk-package-4.1.3.0-local.jar MarkDuplicates \
--REMOVE_DUPLICATES false --MAX_FILE_HANDLES 1000 \
--INPUT sample1.sorted.bam \
--OUTPUT sample1.sorted.mkdup.bam \
--METRICS_FILE sample1.sorted.mkdup_metrics.txt
samtools index -@ 5 sample1.sorted.mkdup.bam
  1. Java Virtual Machine (JVM) 设置:

    • java -Xmx20g:这个参数设置JVM最大堆内存为20GB,确保有足够的内存来处理文件。
    • -XX:ParallelGCThreads=8:这个参数设置垃圾收集器使用的线程数为8,可以根据你的系统的CPU核心数来调整以获得最佳性能。
  2. GATK MarkDuplicates 参数:

    • -jar gatk-package-4.1.3.0-local.jar:指定了GATK的jar文件,这是运行GATK工具的主程序。
    • MarkDuplicates:指定要运行的工具是MarkDuplicates。
    • --REMOVE_DUPLICATES false:告诉程序不要从输出文件中删除重复的读取,而是仅仅标记它们。这是因为在某些情况下,保留这些重复的读取对于后续分析可能是有用的。
    • --MAX_FILE_HANDLES 1000:设置打开文件的句柄的最大数量。这有助于减少磁盘I/O,对于处理大型数据集特别有用。
    • --INPUT sample1.sorted.bam:输入的BAM文件。
    • --OUTPUT sample1.sorted.mkdup.bam:输出的BAM文件,在这个文件中,重复将被标记。
    • --METRICS_FILE sample1.sorted.mkdup_metrics.txt:输出的指标文件,包含了关于识别出的重复的统计信息。
  3. Samtools 索引:

    • samtools index -@ 5 sample1.sorted.mkdup.bam:在标记重复后,使用samtools为输出的BAM文件创建索引。-@ 5参数指定使用5个线程来加速索引过程。

这个命令行示例展示了如何使用GATK的MarkDuplicates工具以及如何为输出文件创建索引,同时也展示了如何通过JVM参数来优化性能。每个选项和参数的选择都可以根据你的具体需求和系统资源来调整。

在比较GATK和Picard的MarkDuplicates命令时,要注意的是,这两个工具在很多方面是相似的,因为GATK的MarkDuplicates是基于Picard的代码开发的。然而,每个工具都有其特定的使用场景和优势。选择哪个更好通常取决于几个因素,包括你的特定需求、工作流程的其他组件以及你对工具的熟悉程度。

GATK MarkDuplicates

  • 集成度:GATK提供了一个广泛的分析工具集合,包括变异检测、基因组注释等。如果你的工作流程大量依赖GATK的其他工具,使用GATK的MarkDuplicates可以更方便地集成。
  • 性能优化:GATK经常更新,包括性能优化和新功能的添加。使用最新版本的GATK可能会带来性能上的优势。
  • 资源管理:GATK提供的命令行选项允许对内存使用和并行处理进行更细致的控制,这对于处理大规模数据集特别重要。

Picard MarkDuplicates

  • 稳定性和可靠性:Picard是一个成熟的工具,长期以来一直被广泛使用于生物信息学社区。它的稳定性和可靠性是经过验证的。
  • 简易性:对于只需进行重复标记而不需要其他复杂分析的用户来说,Picard可能是一个更简单的选择。它直接提供了一个易于理解的命令行界面。
  • 社区支持:Picard有一个活跃的社区,用户可以轻松找到使用技巧和最佳实践。

总结

  • 如果你的工作流程涉及到GATK的其他分析工具,或者你需要进行高级的性能调优,GATK的MarkDuplicates可能是更好的选择。
  • 如果你需要一个稳定、可靠且易于使用的重复标记工具,或者你已经熟悉Picard工具集,Picard的MarkDuplicates可能更适合你。

总的来说,没有一个工具在所有情况下都是最好的。最佳选择取决于你的具体需求、数据大小、以及个人偏好。在决定之前,你可能还需要考虑实验一下两种工具,看看哪个在你的特定数据集和分析流程中表现更好。

在Linux环境下安装Picard和GATK涉及到几个步骤,通常包括获取软件包、设置环境变量以及确认Java环境(因为两者都是Java程序)。以下是一个基本的安装指南:

安装Java

因为Picard和GATK都是Java程序,所以首先确保你的系统中安装了Java。大多数Linux发行版允许你通过包管理器来安装Java。例如,在基于Debian的系统中,你可以使用apt:

1
2
sudo apt update
sudo apt install default-jdk

在安装Java后,通过运行java -version来验证安装是否成功。

安装Picard

  1. 下载Picard工具

  2. 运行Picard

    • 一旦下载完毕,你可以直接使用Java运行下载的jar文件。例如:
      1
      java -jar picard.jar MarkDuplicates I=input.bam O=output.bam M=metrics.txt
    • 你可能想把Picard的.jar文件移动到一个全局可访问的位置,并设置一个别名,以便更容易地运行。

安装GATK

  1. 下载GATK

  2. 解压和设置环境变量

    • 解压下载的GATK包,并可选地设置环境变量,以便在任何地方运行GATK。例如,如果你解压GATK到/opt/gatk,可以在你的.bashrc.bash_profile中添加以下行:
      1
      2
      export GATK_HOME=/opt/gatk
      export PATH=$PATH:$GATK_HOME
    • 之后,你可以通过在命令行中简单地输入gatk来运行GATK。
  3. 运行GATK

    • 使用GATK时,通常的命令格式是:
      1
      gatk --java-options "-Xmx4g" ToolName -OPTION value
    • 例如,使用GATK的MarkDuplicates
      1
      gatk --java-options "-Xmx4g" MarkDuplicates -I input.bam -O output.bam -M metrics.txt

注意

  • 环境变量:在.bashrc.bash_profile中设置环境变量可以让你在任何目录下运行Picard和GATK,无需指定完整路径。
  • 内存分配--java-options "-Xmx4g"这部分是用于给Java虚拟机分配最大内存的,4g代表4GB。根据你机器的实际内存大小和分析需求,这个值可以调整。

通过以上步骤,你应该能够在Linux系统中成功安装和运行Picard和GATK。对于具体的工具使用方法,建议参考各自的官方文档,因为那里会有最详细的选项和使用场景介绍。

java -Xmx20g -XX:ParallelGCThreads=8 -jar gatk-package-4.1.3.0-local.jar HaplotypeCaller
-R genome.fa –emit-ref-confidence GVCF
-L g_1.bed -variant_index_type LINEAR -variant_index_parameter 128000 -mbq 20
-I sample1.sorted.mkdup.bam
-O sample1.g_1.gvcf.gz

解释一下这个

这条命令是使用GATK(Genome Analysis Toolkit)中的HaplotypeCaller工具来调用基因组中的变异。GATK是一个软件包,用于分析高通量测序数据。HaplotypeCaller是用于发现单核苷酸多态性(SNPs)和插入缺失(indels)的工具。下面是这条命令各部分的详细解释:

  • java -Xmx20g -XX:ParallelGCThreads=8: 这是Java虚拟机(JVM)的参数。-Xmx20g指定JVM最多可以使用的内存量为20GB。-XX:ParallelGCThreads=8设置垃圾收集器在执行并行阶段时使用的线程数为8。

  • -jar gatk-package-4.1.3.0-local.jar: 使用-jar选项来运行GATK的jar文件。这里使用的GATK版本是4.1.3.0。

  • HaplotypeCaller: 指定运行GATK中的HaplotypeCaller工具。

  • -R genome.fa: -R指定参考基因组的路径,这里是genome.fa

  • --emit-ref-confidence GVCF: 这个选项让HaplotypeCaller输出GVCF(Genomic VCF)格式的文件,这种格式包含了每个基因座的置信度信息,适合于后续的联合基因型分析。

  • -L g_1.bed: -L指定区间文件,HaplotypeCaller将只对这些区间内的基因组进行变异调用。g_1.bed是指定的区间文件。

  • -variant_index_type LINEAR-variant_index_parameter 128000: 这两个选项一起用来设置变异数据索引的类型和参数。LINEAR指定了索引的类型,128000是与索引类型相关的参数。

  • -mbq 20: -mbq(minimum base quality)指定了最低碱基质量分数,低于此分数的碱基将不被考虑在内。这里设置为20。

  • -I sample1.sorted.mkdup.bam: -I指定输入文件,这里是经过排序和标记重复之后的BAM文件sample1.sorted.mkdup.bam

  • -O sample1.g_1.gvcf.gz: -O指定输出文件,这里是输出的GVCF文件sample1.g_1.gvcf.gz,使用gzip压缩。

总的来说,这条命令是运行GATK的HaplotypeCaller工具,使用了20GB的最大内存和8个并行垃圾收集线程,对sample1.sorted.mkdup.bam文件中的样本,在g_1.bed指定的区间内,基于genome.fa参考基因组,调用变异并输出为GVCF格式的sample1.g_1.gvcf.gz文件。

-L g_1.bed,这个文件也要输入的吗?怎么获得,删掉可以吗

是的,-L g_1.bed指定的g_1.bed文件是一个区间文件,用于告诉HaplotypeCaller只对参考基因组中特定的区间进行变异检测。这样做可以减少计算量,尤其是在只对基因组中的某些特定区域感兴趣时非常有用。

如何获得BED文件?

BED(Browser Extensible Data)文件是一种保存着基因组数据区间信息的简单文本文件。它通常包含至少三列:染色体名(chromosome),起始位置(start position,基于0的计数),和结束位置(end position,不包含在区间内)。

BED文件可以通过多种方式获得:

  • 从公共数据库下载,如UCSC Genome Browser、ENSEMBL等。
  • 使用生物信息学软件或自定义脚本根据研究需求生成。
  • 从文献或合作伙伴处获取特定研究所用的BED文件。

删掉可以吗?

如果不包括-L参数,HaplotypeCaller将对整个参考基因组进行变异检测,而不是只在BED文件指定的区间内。这将会增加分析的时间和资源消耗,但如果你希望对整个基因组进行分析,或者不关心特定的基因区域,可以省略这个参数。

在某些情况下,全基因组分析(WGA)是所需的,特别是当你需要全面了解样本的变异情况时。然而,这会使得计算更加密集和时间消耗更长。如果你的研究只关注基因组中的特定区域,保留这个参数并使用一个精确定义的BED文件会更加高效。

因此,是否删除-L参数取决于你的具体需求和研究目标。

-variant_index_type LINEAR 和 -variant_index_parameter 128000: 这两个选项一起用来设置变异数据索引的类型和参数。LINEAR指定了索引的类型,128000是与索引类型相关的参数。

这里128000是什么意思

在GATK的HaplotypeCaller命令中,-variant_index_type-variant_index_parameter这两个选项一起用于配置产生的变异数据(VCF文件)的索引。

-variant_index_type LINEAR指的是索引类型为线性索引。GATK支持两种类型的索引:线性(LINEAR)和间隔树(INTERVAL_TREE)。线性索引适合于变异较少的场景,而间隔树索引适合于变异较多的场景。

-variant_index_parameter 128000中的128000是与线性索引类型相关的参数,它指定了索引的粒度。在这种情况下,128000意味着每128,000个碱基建立一个索引点。这个参数影响着索引文件的大小和访问索引时的效率:较大的值会减小索引文件的大小,但可能会增加查找特定变异所需的时间;较小的值会使索引更加精细,提高查找效率,但会增加索引文件的大小。

选择这个参数值时,需要在索引文件的大小和查询效率之间做出权衡。128000是GATK推荐的一个平衡值,适用于多数情况。如果你的应用场景对索引性能有特别的要求,可能需要调整这个值。

你遇到的错误信息A USER ERROR has occurred: v is not a recognized option表明你使用的命令中有不被识别的选项,特别是关于-variant_index_type-variant_index_parameter选项的使用。看起来这些选项在你使用的GATK版本(4.1.8.1)中不被识别。

根据我最后更新的信息,GATK 4版本及更高版本已经简化了变异索引的管理,移除了这些选项,或者已经以不需要用户指定的方式将它们的功能整合到了工具中。这意味着在使用HaplotypeCaller进行变异调用时,你不再需要手动指定变异索引的类型和参数。

这里是如何调整你的命令:

1
java -Xmx20g -XX:ParallelGCThreads=8 -jar gatk-package-4.1.8.1-local.jar HaplotypeCaller -R reference.fasta --emit-ref-confidence GVCF -mbq 20 -I output_markerd_chongfu.bam -O sample1.g_1.gvcf.gz

这个修正后的命令移除了-variant_index_type-variant_index_parameter选项,这应该可以解决你遇到的错误。

GATK团队定期对工具进行优化和简化,始终检查特定版本的文档或使用--help选项来获取最新的命令和选项信息是一个好习惯。

1
2
3
4
5
samtools faidx reference.fasta

java -jar picard.jar CreateSequenceDictionary R=reference.fasta O=reference.dict


在基因组学和生物信息学分析中,术语“单样本”和“多样本”通常用来描述分析过程中考虑的样本数量。

单样本 (Single-sample)

单样本分析是指每次处理或分析的是来自一个个体的基因组数据。在这种情况下,分析的目的通常是识别该个体的基因变异,包括单核苷酸多态性(SNPs)、插入和缺失(indels)等。单样本分析可以帮助确定个体的基因型,发现可能与疾病相关的变异,或者用于个体化医疗。

例如,使用GATK的HaplotypeCaller工具对一个人的基因组测序数据进行变异调用时,就是一个单样本分析的例子。

多样本 (Multi-sample)

多样本分析是指同时处理来自多个个体的基因组数据。这种分析可以在多个层面进行,包括对多个个体的数据进行联合变异调用,群体遗传学分析,以及用于研究种群遗传结构、基因频率、连锁不平衡、基因流等。

在多样本分析中,可以对多个样本的数据进行汇总分析,以识别群体中共有的或特异的变异,评估遗传多样性,或者探索特定变异在不同个体或群体中的分布情况。

例如,使用GATK的GenotypeGVCFs工具对多个个体的gVCF文件进行联合基因型分析,就是一个多样本分析的例子。这种分析可以提高变异检测的准确性和灵敏度,因为它允许研究者比较和对照多个样本,以更好地区分遗传变异和测序或处理过程中产生的假阳性。

总结

单样本和多样本分析各有其应用和优势。单样本分析专注于个体的遗传特征,而多样本分析通过比较多个样本提供更广阔的遗传视角,可以揭示遗传变异在种群中的分布和遗传病的共性特征。选择哪种分析方法取决于研究的目的和可用的样本数量。

1
2
3

java -jar /home/data1/renminpeng/SRR2131201/gatk-4.1.8.1/gatk-package-4.1.8.1-local.jar HaplotypeCaller -R /home/data1/renminpeng/SRR2131201/reference.fasta -I sample1_sorted_add_dedup.bam -O sample1.g.vcf --emit-ref-confidence GVCF

全基因组重测序SNP_calliiiiiiiiiiiing!!!(内含python脚本)
原创 南方 生信小破站 2022-06-10 21:33 广东

处理全基因重测序数据——我在研究生接触到的第一个项目,是我接触到的第二个生信流程,这也是关乎我能否顺利毕业的关键。踩过太多坑,现在记录下整个分析流程,以防以后用到又继续掉坑里。

基因组重测序是对已知基因组序列的物种进行不同个体的基因组测序,并在此基础上对个体或群体进行差异性分析,流程的目的是准确检测出每个样本在基因组中的变异集合,也就是物种之间存在差异的那些序列。

0、流程介绍

✅bwa(MEM alignment)

✅picard(SortSam)

✅picard(AddOrReplaceReadGroups)

✅picard(MarkDuplicates)

✅GATK(HaplotypeCaller)

✅GATK(GenotypeGVCFs)

✅GATK(MergeVcfs)

✅Tassel(run_pipeline.pl)

1、软件安装

BWA——是一种能够将差异度较小的序列比对到一个较大的参考基因组上的软件:conda install bwa;

picard——是一个用来处理高通量测序(HTS)的数据和格式的Java命令行工具箱。Picard是通过使用HTSJDK Java 库 HTSJDK来实现的,支持用来存储高通量测序的数据的常见的文件格式,比如 SAM 和 VCF等。功能方面和Samtools有些重叠,但更多的是互补:conda install picard;

GATK——是Broad Institute开发的用于二代重测序数据分析的一款软件,是基因分析的工具集。在4.0以后,GATK包含有Picard工具集,所有Picard工具都能够使用GATK完成:conda install gatk ;

Tassel——在动植物(尤其是植物)的关联分析中,TASSEL软件是最早出现的开源软件,相对于其他软件,TASSEL也是使用的最广泛的,这里我们用它来做vcf到Hapmap的格式转换:conda install tassel 。

2、原始数据质控

关于质控的教程比较多,通过fastqc和fastp就可以进行质控和数据清洗。在我的转录组流程的时候我也给出了具体的方法,所以不再赘述。

3、流程代码

3.1将参考基因组建立索引

bwa index -a is /data/limao/Ref/genome.fasta

为参考基因组的构建索引以便能够在序列比对的时候进行快速的搜索和定位。

3.2比对回参考基因组并转换为bam文件

bwa mem -M -t 4 -R “@RG\tID:sample1\tSM:sample1\tPL:illumina\tLB:lib1\tPU:unit1” /data/limao/Ref/genome.fasta sample1_R1.fq.gz sample1_R2.fq.gz | samtools view -bhS -o sample1.bam

参数option:

-t :线程数,我在这里使用4个线程;

-R:设定头文件,必填!接的是 Read Group的字符串信息,这是一个非常重要的信息,以@RG开头,它是用来将比对的read进行分组的。不同的组之间测序过程被认为是相互独立的,在Read Group中,有如下几个信息非常重要:

ID:通道名或样本名,通过这个信息分组,必须唯一;

SM:样本名,同样非常重要;

LB:⽂库名;这个重要性稍微低一些,主要也是为了协助区分不同的group而存在。

PL:测序平台信息[COMPLETE,ILLUMINA,SANGER]。

以上这些信息对于我们后续对比对数据进行错误率分析和markduplicate时非常重要。

3.3 对bam文件排序

java -jar /data/limao/soft/picard.jar SortSam INPUT=sample1.bam OUTPUT=sample1_sorted.bam SORT_ORDER=coordinate TMP_DIR=./tmp

这一步是将sam文件中同一染色体对应的条目按照坐标顺序从小到大进行排序

 3.4 对bam文件进行加头(head)处理

java -jar /data/limao/soft/picard.jar AddOrReplaceReadGroups I=sample1_sorted.bam O=sample1_sorted_add.bam RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM=sample1 TMP_DIR=./tmp

GATK2.0以上版本将不再支持无头文件的变异检测。加头这一步可以在BWA比对的时候进行,通过-r参数的选择可以完成。如果在BWA比对期间没有选择-r参数,可以增加这一步骤。

参数option:

RGID:输入reads集ID号;

RGLB:read集文库名;

RGPL:测序平台(illunima或solid);

RGPU:测序平台下级单位名称(run的名称);

RGSM:样本名称。

 3.5 去除PCR重复序列

java -jar /data/limao/soft/picard.jar MarkDuplicates I=sample1_sorted_add.bam O=sample1_sorted_add_dedup.bam M=sample1_sorted_add_dedup.metrics CREATE_INDEX=true MAX_FILE_HANDLES_FOR_READ_ENDS_MAP=4000 TMP_DIR=./tmp

现有的工具包括Samtools和Picard都可以去除重复序列。不同的地方在于,samtools的rmdup是直接将这些重复序列从比对BAM文件中删除掉,而Picard的MarkDuplicates默认情况则只是在BAM的FLAG信息中标记出来,并留存这些序列,以便在你需要的时候还可以对其做分析。

3.6 变异检测,生成vcf文件(单样品)

gatk3 -nct 4 -T HaplotypeCaller -R /data/limao/Ref/genome.fasta –emitRefConfidence -I sample1 _sorted_add_dedup.bam -o sample1.g.vcf

单样本到这一步就可以生成VCF了,使用HaplotypeCaller对bam文件进行call variant,就是寻找变异的过程,生成一个VCF文件用于后续位点的质控和注释,从一个bam到一个vcf文件。

 3.7 变异检测,生成gvcf文件(多样品)

gatk3 -nct 4 -T HaplotypeCaller -R /data/limao/Ref/genome.fasta –emitRefConfidence GVCF -I sample1 _sorted_add_dedup.bam -o sample1.g.vcf

随着测序行业的发展,大规模的测序会变得越来越普遍,并且基于群体的数据分析要远优于单样本,意义也更加深远,因此这种多样本的模式将成为常态。gvcf会记录每一个位点到情况,包括有无突变,vcf只记录突变位点情况。

3.6 3.7解释

您提供的两个命令用于使用GATK(Genome Analysis Toolkit)进行变异检测,生成VCF(Variant Call Format)文件。两个命令都调用了HaplotypeCaller工具,但目的和输出略有不同。

命令对比

  1. 生成VCF文件(单样本):

    1
    gatk3 -nct 4 -T HaplotypeCaller -R /data/limao/Ref/genome.fasta --emitRefConfidence -I sample1_sorted_add_dedup.bam -o sample1.g.vcf

    这个命令用于单个样本的变异检测,生成一个VCF文件。--emitRefConfidence选项应该后面还需要指定具体的参数(如GVCF或者其他),但在这个命令里没有完整指定,可能是个遗漏。这个命令应该生成包含变异位点信息的gVCF文件,但由于参数不完整,实际效果可能与预期不符。

  2. 生成gVCF文件(多样本):

    1
    gatk3 -nct 4 -T HaplotypeCaller -R /data/limao/Ref/genome.fasta --emitRefConfidence GVCF -I sample1_sorted_add_dedup.bam -o sample1.g.vcf

    这个命令用于单个样本的变异检测,但输出是gVCF文件。gVCF(Genomic VCF)是VCF的一种扩展格式,它不仅包含变异位点的信息,还包含了参考基因组上所有位置的信息,无论这些位置是否存在变异。这使得gVCF特别适合于多样本的分析,因为它允许后续的合并分析和变异的再调用,以提高变异检测的准确性和效率。

主要区别

  • VCF vs. gVCF: VCF文件仅记录变异位点的信息,而gVCF文件记录了基因组上每一个位置的信息,包括没有变异的位置。这使得gVCF格式非常适合多样本分析和大规模基因组项目,因为它提供了更全面的基因组覆盖信息。

  • 单样本 vs. 多样本分析: 第一个命令(假设正确指定了参数)和第二个命令都可以用于单样本的变异检测。然而,gVCF格式的引入是为了更有效地支持多样本分析,因为它允许后续步骤整合多个样本的数据,以便于发现更多的遗传变异和进行群体遗传学分析。

代码问题

  • 第一个命令中的--emitRefConfidence后应该跟随GVCF参数,以正确生成gVCF文件。
  • 文件名sample1 _sorted_add_dedup.bam中似乎有一个多余的空格,应该是sample1_sorted_add_dedup.bam

修正后的第一个命令如下(如果目的是生成gVCF文件):

1
gatk3 -nct 4 -T HaplotypeCaller -R /data/limao/Ref/genome.fasta --emitRefConfidence GVCF -I sample1_sorted_add_dedup.bam -o sample1.g.vcf

这样,两个命令实际上是相同的,都是用于生成单样本的gVCF文件。

java -jar /home/data1/renminpeng/SRR2131201/gatk-4.1.8.1/gatk-package-4.1.8.1-local.jar -nct 24 -T HaplotypeCaller -R /home/data1/renminpeng/SRR2131201/reference.fasta –emitRefConfidence -I sample1 _sorted_add_dedup.bam -o sample1.g.vcf

这个命令生成的是包含所有的吗?

如果您想分别生成SNPs和InDels的VCF文件,您可以先使用GATK HaplotypeCaller生成包含所有变异类型的VCF文件,然后使用GATK的SelectVariants工具来分别提取SNPs和InDels。这个过程分为两步:

1. 使用HaplotypeCaller生成VCF

首先,使用HaplotypeCaller生成包含所有变异(SNPs和InDels)的VCF文件,如之前所述:

1
2
3
4
gatk HaplotypeCaller \
-R /path/to/reference/genome.fasta \
-I /path/to/sample_sorted_dedup.bam \
-O /path/to/output_variants.vcf.gz

2. 使用SelectVariants分别提取SNPs和InDels

接下来,使用SelectVariants工具从步骤1生成的VCF文件中分别提取SNPs和InDels。

提取SNPs:

1
2
3
4
5
gatk SelectVariants \
-R /path/to/reference/genome.fasta \
-V /path/to/output_variants.vcf.gz \
--select-type-to-include SNP \
-O /path/to/output_snps.vcf.gz

提取InDels:

1
2
3
4
5
gatk SelectVariants \
-R /path/to/reference/genome.fasta \
-V /path/to/output_variants.vcf.gz \
--select-type-to-include INDEL \
-O /path/to/output_indels.vcf.gz

这样,您将得到两个分开的文件:output_snps.vcf.gz包含所有的SNPs,而output_indels.vcf.gz包含所有的InDels。

注意事项

  • 确保替换命令中的路径和文件名以反映您的实际文件和目录结构。
  • 这里使用的命令假设您正在使用GATK 4或更高版本。如果您使用的是GATK 3,命令参数可能需要相应的调整。
  • 如果您对输出的VCF文件有特定的格式要求(比如是否需要压缩),可以根据需要调整输出命令。

检测一下是否为gvcf

是的,您可以从生成的gVCF文件中分离出SNPs(单核苷酸多态性)和InDels(插入和删除),并生成分别只包含这些变异类型的标准VCF文件。这可以通过使用GATK的SelectVariants工具来完成。以下是如何进行操作的步骤:

分离SNPs:

1
2
3
4
5
gatk SelectVariants \
-R /path/to/reference/genome.fasta \
-V /path/to/sample1.g.vcf \
--select-type-to-include SNP \
-O /path/to/sample1_snps.vcf

这个命令会从您的gVCF文件中选择SNPs,并将结果保存到一个新的VCF文件中。

分离InDels:

1
2
3
4
5
gatk SelectVariants \
-R /path/to/reference/genome.fasta \
-V /path/to/sample1.g.vcf \
--select-type-to-include INDEL \
-O /path/to/sample1_indels.vcf

这个命令会从gVCF文件中选择InDels,并将结果保存到另一个新的VCF文件中。

注意:

  • 确保替换命令中的路径和文件名以反映您的实际文件和目录结构。
  • 这些步骤假设您已经使用GATK HaplotypeCaller生成了一个gVCF文件,且该文件包含了全基因组的变异信息以及非变异位点的置信度信息。

通过以上步骤,您可以根据变异类型(SNPs或InDels)将变异信息分离到不同的VCF文件中,这对于后续的特定分析或者数据的进一步处理可能是非常有用的。这种方法允许研究者对数据进行更细致的分析,例如,针对不同类型的变异进行特定的遗传学分析或者关联研究。

多样品处理

我手上的基因组重测序数据就有400多个样品,让人一个一个跑还是很繁琐的。所以写个脚本批量处理是非常有必要的。

4.1 gvcf文件脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243

#!/usr/local/bin/python3

# -*- coding: utf-8 -*-

# This script file shoud be at the same directory with Cleandata

# 2022.02.09

# delete redundancy bamFile

# python3 $0 -t 9 -i input_dir -r ReferenceFile

import os, sys, glob, time, argparse,threading



my_parser = argparse.ArgumentParser()

my_parser.add_argument('-t', dest='thread',type=int,default='4') #线程数

my_parser.add_argument('-i', dest='input_dir') #线程数

my_parser.add_argument('-r', dest='reference') #线程数

args = my_parser.parse_args()

TimeTable = open(args.input_dir+'TimeTable.txt','w')



ref=args.reference



output_bam_dir = args.input_dir + '_bam_dir'

output_gvcf_dir = args.input_dir + '_gvcf_dir'

if os.path.exists(output_bam_dir):

sys.exit(output_bam_dir+' exist!!!')

elif os.path.exists(output_gvcf_dir):

sys.exit(output_gvcf_dir+' exist!!!')

else:

os.makedirs(output_bam_dir)

os.makedirs(output_gvcf_dir)



def mult(funct, ls, n=3):

pool = [] # 线程池

length = len(ls)

step = int(length / n) + 1

for i in range(0, length, step):

p = threading.Thread(target=funct, args=(ls[i: i + step],)) #把ls切成了n段,每段step长,最后段可能断一点

pool.append(p)

for p in pool: #pool包含列表的列表,长度为n(即n个列表),每一个列表长度为step。

p.start() #这里同时启动n个进程,一个进程里加入参数ls[i: i + step],funct函数会对ls[i: i + step]慢慢处理。

for p in pool:

p.join() #等待所有进程结束

print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'_Main thread STAR exiting', file=TimeTable)

TimeTable.flush()



sample_names_dir = glob.glob(args.input_dir+'/*') # Every sample has a directory which contain fq.gz file 每个样品单独一个文件夹,文件夹下包含fq.gz的文件 不包含绝对路径

bam_list = []

all_sample_fq = {} # This dictionary will include the sample's name (key) and fq.gz (value) 字典以样品名为键,以1或2.fq.gz文件名为值

def bwa(part_sample_directory): #把bwa封装

for sample_dir in part_sample_directory:

sample_head = os.path.basename(sample_dir)

if not (os.path.exists(sample_dir+'/'+sample_head+'_R1.fq.gz') and os.path.exists(sample_dir+'/'+sample_head+'_R1.fq.gz')):

sys.exit(sample_dir+'/'+sample_head+'_R1.fq.gz' + ' or '+sample_dir+'/'+sample_head+'_R1.fq.gz' + " don't exist!!!")

os.system('bwa mem -M -t 4 -R "@RG\\tID:{0}\\tSM:{0}\\tPL:illumina\\tLB:lib1\\tPU:unit1" {1} {2}/{0}_R1.fq.gz {2}/{0}_R2.fq.gz | samtools view -bhS -o {3}/{0}.bam'.format(sample_head, ref, sample_dir, output_bam_dir))

print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'bwa programming finished***In threading***'+sample_head, file=TimeTable)

TimeTable.flush()

time.sleep(0.2)

os.system('picard SortSam INPUT={0}/{1}.bam OUTPUT={0}/{1}_sorted.bam SORT_ORDER=coordinate TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

time.sleep(0.2)

os.system('rm {0}/{1}.bam'.format(output_bam_dir,sample_head))

os.system('picard AddOrReplaceReadGroups I={0}/{1}_sorted.bam O={0}/{1}_sorted_add.bam RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM={1} TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

time.sleep(0.2)

os.system('rm {0}/{1}_sorted.bam'.format(output_bam_dir,sample_head))

os.system('picard MarkDuplicates I={0}/{1}_sorted_add.bam O={0}/{1}_sorted_add_dedup.bam M={0}/{1}_sorted_add_dedup.metrics CREATE_INDEX=true MAX_FILE_HANDLES_FOR_READ_ENDS_MAP=4000 TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

time.sleep(0.2)

os.system('rm {0}/{1}_sorted_add.bam'.format(output_bam_dir,sample_head))

print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'picard BuildBamIndex programming finished***In threading***'+sample_head, file=TimeTable)

os.system("gatk3 -nct 4 -T HaplotypeCaller -R {0} --emitRefConfidence GVCF -I {1}/{2}_sorted_add_dedup.bam -o {3}/{2}.g.vcf".format(ref, output_bam_dir,sample_head,output_gvcf_dir))

print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'gatk3 programming finished***In threading***'+sample_head, file=TimeTable)

TimeTable.flush()

bam_list.append('--variant {0}/{1}.g.vcf'.format(output_gvcf_dir,sample_head))








https://mp.weixin.qq.com/s/NKJsdywpHkhtkr4H25iNHg



当然,我将在代码中加入注释,以便更好地理解每个部分的功能和目的:

```python
#!/usr/local/bin/python3

# -*- coding: utf-8 -*-

# 这个脚本用于处理高通量测序数据,包括序列比对、排序、去重复和变异检测

# 设定脚本和Cleandata目录在同一目录下
# 2022.02.09 - 脚本版本日期
# 删除冗余的bam文件

import os, sys, glob, time, argparse, threading

# 设置命令行参数
my_parser = argparse.ArgumentParser()
my_parser.add_argument('-t', dest='thread', type=int, default='4') # 线程数,默认为4
my_parser.add_argument('-i', dest='input_dir') # 输入目录
my_parser.add_argument('-r', dest='reference') # 参考基因组文件
args = my_parser.parse_args()

# 创建记录时间的文件
TimeTable = open(args.input_dir + 'TimeTable.txt', 'w')

# 获取参考基因组文件路径
ref = args.reference

# 准备输出目录路径
output_bam_dir = args.input_dir + '_bam_dir'
output_gvcf_dir = args.input_dir + '_gvcf_dir'

# 检查输出目录是否存在,如果存在则退出
if os.path.exists(output_bam_dir):
sys.exit(output_bam_dir + ' exist!!!')
elif os.path.exists(output_gvcf_dir):
sys.exit(output_gvcf_dir + ' exist!!!')
else:
os.makedirs(output_bam_dir)
os.makedirs(output_gvcf_dir)

# 定义一个函数来并行处理数据
def mult(funct, ls, n=3):
pool = [] # 线程池
length = len(ls)
step = int(length / n) + 1
for i in range(0, length, step):
p = threading.Thread(target=funct, args=(ls[i: i + step],))
pool.append(p)
for p in pool:
p.start()
for p in pool:
p.join()
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '_Main thread STAR exiting', file=TimeTable)
TimeTable.flush()

# 获取样本名目录
sample_names_dir = glob.glob(args.input_dir + '/*')

# 初始化一个字典来存储样本名和对应的fq.gz文件
all_sample_fq = {}

# 定义bwa序列比对的函数
def bwa(part_sample_directory):
for sample_dir in part_sample_directory:
sample_head = os.path.basename(sample_dir)
if not (os.path.exists(sample_dir + '/' + sample_head + '_R1.fq.gz') and os.path.exists(sample_dir + '/' + sample_head + '_R1.fq.gz')):
sys.exit(sample_dir + '/' + sample_head + '_R1.fq.gz' + ' or ' + sample_dir + '/' + sample_head + '_R1.fq.gz' + " don't exist!!!")
# 执行BWA序列比对命令
os.system('bwa mem -M -t 4 -R "@RG\\tID:{0}\\tSM:{0}\\tPL:illumina\\tLB:lib1\\tPU:unit1" {1} {2}/{0}_R1.fq.gz {2}/{0}_R2.fq.gz | samtools view -bhS -o {3}/{0}.bam'.format(sample_head, ref, sample_dir, output_bam_dir))
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + 'bwa programming finished***In threading***' + sample_head, file=TimeTable)
TimeTable.flush()
# 接下来的命令用于处理BAM文件,包括排序、去重复等
# 注意:以下操作需要Picard和GATK工具已经安装并配置好环境变量

# 注意:脚本中的bwa函数只是被定义了,但实际上并没有在脚本中被调用执行。
# 你需要根据实际情况添加相应的调用代码,例如:mult(bwa, sample_names_dir, args.thread)
```

这个脚本的注释主要是为了帮助理解每

个部分的作用,包括设置命令行参数、创建和检查输出目录、多线程处理、样本目录获取和处理以及核心的BWA序列比对流程。希望这些注释能让你更好地理解和使用这个脚本。















脚本名:institute2_DNA_to_VCF1.4.py

由于内存原因,跑太多样品会导致出错停止运行,所以我分40个样品一组运行脚本,流程仅到gvf这一步,等400多个样品全部gvf后再进行整合。

 4.1.1 运行脚本
1
nohup python3 institute2_DNA_to_VCF1.4.py -t 4 -i cleandata/ -r /data/limao/Ref/genome.fasta &

参数option:

-t:线程数,我在这里使用4个线程;

-i:包含质控后的测序数据文件夹。格式如下:

-r:参考基因组。

运行结束,得到gvcf文件。结果如下:

4.2 多gvcf整合并转换为vcf文件脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# python3 $0 -i g.vcf.dir -r ref

import os, sys, glob, time, argparse,threading,re

my_parser = argparse.ArgumentParser()

my_parser = argparse.ArgumentParser()

my_parser.add_argument('-i', dest='input_dir') #

my_parser.add_argument('-r', dest='reference') #

args = my_parser.parse_args()

ref=args.reference

sample_names_dir = glob.glob(args.input_dir+'/*.g.vcf')

gvcf_list=[]

for gvcf_input in sample_names_dir:

gvcf_list.append('--variant '+gvcf_input)

print("java -Djava.io.tmpdir=./tmp -jar /data/jzhao/soft/GenomeAnalysisTK.jar -nt 4 -T GenotypeGVCFs -R {0} -o All.vcf {1}".format(ref, ' '.join(gvcf_list)))

4.2.1 运行代码

python3 g.vcf_to.vcf.sh -i Cleandata_gvcf_dir -r /data/limao/Ref/genome.fasta

脚本名:g.vcf_to.vcf.sh

参数option:

-i:包含全部数据样品的gvcf文件;

-r:参考基因组。

4.2.2 脚本格式已经满足

java -Djava.io.tmpdir=./tmp -jar /data/limao/soft/GenomeAnalysisTK.jar -nt 4 -T GenotypeGVCFs -R /data/jzhao/Ref/genome.fasta -o All.vcf –variant Cleandata_gvcf_dir/B903.g.vcf –variant Cleandata_gvcf_dir/B904.g.vcf –variant Cleandata_gvcf_dir/B908.g.vcf –variant Cleandata_gvcf_dir/B937.g.vcf –variant Cleandata_gvcf_dir/B941.g.vcf –variant Cleandata_gvcf_dir/B963.g.vcf –variant Cleandata_gvcf_dir/P1001.g.vcf –variant Cleandata_gvcf_dir/P1008.g.vcf –variant Cleandata_gvcf_dir/P1031.g.vcf

运行以上代码后得到All.vcf

4.3 SnpEff注释数据库对All.vcf注释

java -Xmx4g -jar /data/limao/soft/snpEff/snpEff.jar genome All.vcf > All.eff.vcf

All.eff.vcf是一个注释结果文件,其就在vcf的info信息新添加了anno一列信息,其具体每个值含义如下:

Allele:突变之后的碱基,第一个突变位点由T碱基突变成了C碱基,对应Allel的值为C。
Annotation:由sequence ontology定义的突变类型
Annotation_Impact:对变异位点有害程度的简单评估,取值有HIGH, MODERATE, LOW, MODIFIER 4种,含义如下:

4.2.2 变异质控(硬过滤)

过滤的时候,需要分SNP和Indel这两个不同的变异类型来进行,它们有些阈值是不同的,需要区别对待

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 使用SelectVariants,选出SNP

gatk3 -T SelectVariants -R /data/limao/Ref/genome.fasta -V All.eff.vcf -selectType SNP -o All.snps.vcf



# 为SNP作硬过滤

gatk3 -T VariantFiltration -R /data/limao/Ref/genome.fasta -V All.snps.vcf --filterExpression "QD < 2.0 || FS > 60.0 || MQ < 40.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" --filterName "my_All_snp_filter" -o All.filtered_snps.vcf



# 使用SelectVariants,选出Indel

gatk3 -T SelectVariants -R /data/limao/Ref/genome.fasta -V All.eff.vcf -selectType INDEL -o All.indels.vcf



# 为Indel作硬过滤

gatk3 -T VariantFiltration -R /data/limao/Ref/genome.fasta -V All.indels.vcf --filterExpression "QD < 2.0 || FS > 200.0 || ReadPosRankSum < -20.0" --filterName "my_All_indel_filter" -o All.filtered_indels.vcf



#重新合并过滤后的SNP和Indel

gatk MergeVcfs -I All.filtered_snps.vcf -I All.filtered_indels.vcf -O All.filtered.vcf

GATK4官网给出的推荐阈值:

For snps:

QD < 2.0
MQ < 40.0
FS > 60.0
SOR > 3.0
MQRankSum < -12.5
ReadPosRankSum < -8.0

For indels:

QD < 2.0
ReadPosRankSum < -20.0
InbreedingCoeff < -0.8
FS > 200.0
SOR > 10.0

5.个性化分析

5.1 vcftools提取一段区域的vcf文件

vcftools –vcf All.filtered.vcf –chr Chrxx –from-bp 252463xx –to-bp 252493xx –out Chrxx.promoter –recode –recode-INFO-all

截取某个基因的启动子或编码区区域进行单倍型分析。

 5.2 数据格式转换(VCF到Hapmap)

perl run_pipeline.pl -Xms4G -fork1 -vcf Chrxx.promoter -export Chrxx.promoter.txt -exportType Hapmap

在这里,整篇文章就结束了。说点心里话,接触生信一年多,我记得刚入门的时候有位老师就告诉我:“生信的主要目的就是解决生物问题”。其实生信流程并非只是硬邦邦地告诉大家几条简单的命令就了事。如果都觉得只要懂得几条命令就可以了的话,那么我们就活该被机器和人工智能所取替,它们一定会操作得更好更高效。我想掌握工具和技术的目的是为了能够更好地发现并解决问题(包括科研和生产),所有的数据分析流程本质上是要服务于我们所要解决的问题的。

毕竟工具是死的,人是活的,需求总是会变的。理解我们所要处理的问题的本质,选择合适的工具,而不是反过来被工具所束缚,这一点很重要。我们的个人能力不能只是会跑一个流程,或者只是会创建流程,因为那都是一个“术”的问题,我觉得我们真正要去掌握的应该是如何分析数据的能力,如何发现问题和解决数据问题等的能力。

上面教程出自 生信小破站

java -jar /home/data1/renminpeng/SRR2131201/gatk-4.1.8.1/gatk-package-4.1.8.1-local.jar -nct 24 -T HaplotypeCaller -R /home/data1/renminpeng/SRR2131201/reference.fasta –emitRefConfidence -I sample1 _sorted_add_dedup.bam -o sample1.g.vcf

上面的文件是这样生成的?但是

java -jar /home/data1/renminpeng/SRR2131201/gatk-package-4.1.8.1-local.jar SelectVariants -R /home/data1/renminpeng/SRR2131201/reference.fasta -V /home/data1/renminpeng/SRR2131201/sample1.g.vcf –select-type-to-include SNP -O /home/data1/renminpeng/SRR2131201/sample1_snps.vcf

java -jar /home/data1/renminpeng/SRR2131201/gatk-package-4.1.8.1-local.jar SelectVariants -R /home/data1/renminpeng/SRR2131201/reference.fasta -V /home/data1/renminpeng/SRR2131201/sample1.g.vcf –select-type-to-include INDEL -O /home/data1/renminpeng/SRR2131201/sample1_indels.vcf 有没有生成有用的东西,应该是怎么回事?

从您提供的信息来看,您首先使用GATK的HaplotypeCaller工具生成了一个gVCF文件,然后尝试使用SelectVariants工具从该gVCF文件中分别提取SNPs和InDels。您的目的是生成两个文件:一个仅包含SNPs的VCF文件和另一个仅包含InDels的VCF文件。然而,根据您的描述,似乎在执行SelectVariants命令时遇到了问题。

分析可能的问题:

  1. 输出文件命名冲突:在提取SNPs和InDels的命令中,您为输出文件使用了相同的文件名sample1_snps.vcf。这意味着第二个命令(提取InDels的命令)实际上会覆盖第一个命令的输出结果,因此您最终只会得到InDels的数据,而SNPs的数据会丢失。

    解决方法是为每种变异类型使用不同的输出文件名,例如:

    • 对于SNPs:sample1_snps.vcf
    • 对于InDels:sample1_indels.vcf
  2. 检查gVCF文件内容:如果执行SelectVariants命令后,输出的VCF文件似乎为空或不包含预期的变异信息,可能是因为原始的gVCF文件中没有足够的或任何对应类型的变异数据。这可能是由于样本中确实没有足够的这类变异,或者变异检测过程中的参数设置影响了变异的识别。

  3. 命令格式和参数:确保使用的命令格式和参数正确无误。例如,GATK的某些版本可能不支持-nct参数(用于指定线程数),因为GATK 4及以上版本使用了不同的并行化策略。请确保您按照GATK 4的要求正确使用命令和参数。

推荐的步骤:

  • 更正输出文件名:确保为不同类型的变异分别指定不同的输出文件名。

  • 验证gVCF内容:使用grep或其他工具查看原始gVCF文件中是否确实包含了SNPs和InDels。您可以查找特定的变异类型标记,如SNPINDEL,来确认它们是否存在。

  • 查看日志和错误信息:执行命令时,GATK通常会输出日志和错误信息。检查这些信息可能会提供为什么变异没有被成功提取的线索。

如果在执行这些步骤后仍然无法成功提取所需的变异信息,可能需要进一步检查GATK的文档,确保所有步骤都符合GATK的最新使用指南和最佳实践。

嗯,名字的时候我改了,验证gVCF内容:使用grep或其他工具查看原始gVCF文件中是否确实包含了SNPs和InDels。您可以查找特定的变异类型标记,如SNP或INDEL,来确认它们是否存在。?怎么做?

要验证gVCF文件中是否确实包含了SNPs和InDels,您可以使用grep命令来搜索文件中的关键词,例如搜索SNPINDEL标记。然而,在VCF或gVCF文件中,变异类型通常不会直接标记为“SNP”或“INDEL”。相反,您可以根据REFALT列的长度来区分它们:SNPs是REFALT长度都为1的情况,而InDels则是这两个字段长度不相等的情况。

下面是一些命令示例,它们可以帮助您查找gVCF文件中的SNPs和InDels:

查找SNPs

SNPs(单核苷酸多态性)的特征是参考(REF)和变异(ALT)等位基因长度都是1。您可以使用grepawk结合使用来尝试找出这种模式的行:

1
grep -v "^#" /path/to/your/file.g.vcf | awk 'length($4) == 1 && length($5) == 1'

这个命令做了以下几件事:

  • grep -v "^#": 过滤掉所有以#开头的头部信息行,只留下包含变异数据的行。
  • awk 'length($4) == 1 && length($5) == 1': 使用awk检查每行的第4和第5字段(即REFALT列),找出长度都为1的行,这些通常代表SNPs。

查找InDels

InDels(插入或删除)的特征是REFALT字段长度不等。对于简单的筛选,您可以查找REFALT长度大于1的情况:

1
grep -v "^#" /path/to/your/file.g.vcf | awk 'length($4) != 1 || length($5) != 1'

这个命令会筛选出那些至少在REFALT之一中长度不为1的行,这些通常代表InDels。

注意

这些命令提供了一种快速检查gVCF文件中是否含有SNPs和InDels的方法。然而,更复杂的变异类型(如多核苷酸多态性、复杂插入和删除等)需要更详细的分析来识别。此外,awk的条件可能需要根据实际情况进行调整,以适应特定的数据特点。

请确保替换/path/to/your/file.g.vcf为您实际的gVCF文件路径。这些命令在Unix-like系统的终端中运行,包括Linux和MacOS。

(base) dell@dell:/home/data1/renminpeng/SRR13786593$ grep -v “^#” sample11.g.vcf | awk ‘length($4) == 1 && length($5) == 1’
(base) dell@dell:/home/data1/renminpeng/SRR13786593$

您运行了一个命令来查找sample11.g.vcf文件中所有可能的SNPs(单核苷酸多态性),即那些REF(参考等位基因)和ALT(替代等位基因)长度都为1的变异。命令执行后,似乎没有输出任何内容,这意味着在您的gVCF文件中没有找到满足条件的行,或者说,没有检测到符合SNP标准(即REFALT长度均为1)的变异。

这种情况可能由以下几个原因导致:

  1. 样本中的真实SNPs数量较少:这可能是因为基因组较为同质,或者变异较少。

  2. 测序或数据质量问题:如果测序数据质量不高,或者覆盖深度不足,可能导致变异检测不准确。

  3. 参数设置问题:在进行变异检测时,如果参数设置过于严格,可能会错过一些真实的变异。

  4. 数据处理步骤可能有问题:数据预处理过程(如比对、重复序列标记、重新排序等)中的任何问题都可能影响最终变异检测的结果。

解决建议

  • 检查数据质量:使用如FastQC之类的工具检查原始测序数据的质量,并确保数据预处理步骤正确无误。

  • 重新考虑变异检测参数:如果您在使用GATK等工具进行变异检测时使用了特别严格的参数,尝试调整这些参数以查看是否能够检测到更多变异。

  • 增加测序深度:对于深度不足的样本,考虑增加测序深度以提高变异检测的灵敏度。

  • 使用其他工具或方法:尝试使用不同的变异检测工具或算法,以及调整分析流程,看是否可以检测到SNPs。

  • 专家咨询:如果您仍然无法解决问题,可能需要咨询具有生物信息学背景的专家,或者在相关的论坛和社区中寻求帮助。

请记住,没有检测到变异并不总是意味着分析失败或不存在变异,它可能是由于多种因素综合作用的结果。综合考虑数据质量、分析方法和生物学背景是理解这一结果的关键。

我下载的基因组文件在/home/data1/renminpeng/New1,命名为1.sra,2.sra等等,一直搭配68.sra
我的参考基因组文件在/home/data1/renminpeng/New里,命名为reference.fasta
我的软件也基本下载了

然后我想让你适当修改下下面的代码,让我能运行分析上面的数据?

#!/usr/local/bin/python3

-- coding: utf-8 --

This script file shoud be at the same directory with Cleandata

2022.02.09

delete redundancy bamFile

python3 $0 -t 9 -i input_dir -r ReferenceFile

import os, sys, glob, time, argparse,threading

my_parser = argparse.ArgumentParser()

my_parser.add_argument(‘-t’, dest=’thread’,type=int,default=’4’) #线程数

my_parser.add_argument(‘-i’, dest=’input_dir’) #线程数

my_parser.add_argument(‘-r’, dest=’reference’) #线程数

args = my_parser.parse_args()

TimeTable = open(args.input_dir+’TimeTable.txt’,’w’)

ref=args.reference

output_bam_dir = args.input_dir + ‘_bam_dir’

output_gvcf_dir = args.input_dir + ‘_gvcf_dir’

if os.path.exists(output_bam_dir):

sys.exit(output_bam_dir+' exist!!!')

elif os.path.exists(output_gvcf_dir):

sys.exit(output_gvcf_dir+' exist!!!')

else:

os.makedirs(output_bam_dir)

os.makedirs(output_gvcf_dir)

def mult(funct, ls, n=3):

pool = []  # 线程池

length = len(ls)

step = int(length / n) + 1

for i in range(0, length, step):

    p = threading.Thread(target=funct, args=(ls[i: i + step],)) #把ls切成了n段,每段step长,最后段可能断一点

    pool.append(p)

for p in pool: #pool包含列表的列表,长度为n(即n个列表),每一个列表长度为step。

    p.start() #这里同时启动n个进程,一个进程里加入参数ls[i: i + step],funct函数会对ls[i: i + step]慢慢处理。

for p in pool:

    p.join() #等待所有进程结束

print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'_Main thread STAR exiting', file=TimeTable)

TimeTable.flush()

sample_names_dir = glob.glob(args.input_dir+’/*’) # Every sample has a directory which contain fq.gz file 每个样品单独一个文件夹,文件夹下包含fq.gz的文件 不包含绝对路径

bam_list = []

all_sample_fq = {} # This dictionary will include the sample’s name (key) and fq.gz (value) 字典以样品名为键,以1或2.fq.gz文件名为值

def bwa(part_sample_directory): #把bwa封装

for sample_dir in part_sample_directory:

    sample_head = os.path.basename(sample_dir)

    if not (os.path.exists(sample_dir+'/'+sample_head+'_R1.fq.gz') and os.path.exists(sample_dir+'/'+sample_head+'_R1.fq.gz')):

        sys.exit(sample_dir+'/'+sample_head+'_R1.fq.gz' + ' or '+sample_dir+'/'+sample_head+'_R1.fq.gz' + " don't exist!!!")

    os.system('bwa mem -M -t 4 -R  "@RG\\tID:{0}\\tSM:{0}\\tPL:illumina\\tLB:lib1\\tPU:unit1" {1} {2}/{0}_R1.fq.gz {2}/{0}_R2.fq.gz | samtools view -bhS -o {3}/{0}.bam'.format(sample_head, ref, sample_dir, output_bam_dir))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'bwa programming finished***In threading***'+sample_head, file=TimeTable)

    TimeTable.flush()

    time.sleep(0.2)

    os.system('picard SortSam INPUT={0}/{1}.bam OUTPUT={0}/{1}_sorted.bam SORT_ORDER=coordinate TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}.bam'.format(output_bam_dir,sample_head))

    os.system('picard AddOrReplaceReadGroups I={0}/{1}_sorted.bam O={0}/{1}_sorted_add.bam RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM={1} TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}_sorted.bam'.format(output_bam_dir,sample_head))

    os.system('picard MarkDuplicates I={0}/{1}_sorted_add.bam O={0}/{1}_sorted_add_dedup.bam M={0}/{1}_sorted_add_dedup.metrics CREATE_INDEX=true MAX_FILE_HANDLES_FOR_READ_ENDS_MAP=4000 TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}_sorted_add.bam'.format(output_bam_dir,sample_head))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'picard BuildBamIndex programming finished***In threading***'+sample_head, file=TimeTable)

    os.system("gatk3 -nct 4 -T HaplotypeCaller -R {0} --emitRefConfidence GVCF -I {1}/{2}_sorted_add_dedup.bam -o {3}/{2}.g.vcf".format(ref, output_bam_dir,sample_head,output_gvcf_dir))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'gatk3 programming finished***In threading***'+sample_head, file=TimeTable)

    TimeTable.flush()

    bam_list.append('--variant  {0}/{1}.g.vcf'.format(output_gvcf_dir,sample_head))

我下载的基因组文件在/home/data1/renminpeng/New1,命名为1.sra,2.sra等等,一直到68.sra,一共68个,上面的代码少了吧
我的参考基因组文件在/home/data1/renminpeng/New里,命名为reference.fasta

看看能不能帮我改改

为了确保代码能够处理从1.sra68.sra的全部文件,并考虑到你的参考基因组文件的位置,我会对之前的代码示例进行相应的修改。下面的代码现在包括了处理特定范围内的文件名,从1.sra68.sra,并假设这些文件都位于/home/data1/renminpeng/New1目录下。同时,参考基因组文件reference.fasta位于/home/data1/renminpeng/New目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/local/bin/python3

# -*- coding: utf-8 -*-

# Genomic data analysis script adjusted for processing files 1.sra to 68.sra

import os, sys, glob, time, argparse, threading

# Setup command line arguments
my_parser = argparse.ArgumentParser(description='Genomic data analysis pipeline adjusted for specific .sra files')
my_parser.add_argument('-t', dest='thread', type=int, default=4, help='Number of threads')
my_parser.add_argument('-i', dest='input_dir', default='/home/data1/renminpeng/New1', help='Input directory containing .sra files')
my_parser.add_argument('-r', dest='reference', default='/home/data1/renminpeng/New/reference.fasta', help='Reference genome file path')
args = my_parser.parse_args()

# Create a time log file
TimeTable = open(os.path.join(args.input_dir, 'TimeTable.txt'), 'w')

ref = args.reference

# Define output directories
output_bam_dir = args.input_dir + '_bam_dir'
output_gvcf_dir = args.input_dir + '_gvcf_dir'
fastq_dir = args.input_dir + '_fastq'

# Check and create output directories if not exist
if not os.path.exists(output_bam_dir):
os.makedirs(output_bam_dir)
if not os.path.exists(output_gvcf_dir):
os.makedirs(output_gvcf_dir)
if not os.path.exists(fastq_dir):
os.makedirs(fastq_dir)

# Function for parallel processing
def mult(funct, ls, n=3):
pool = [] # Thread pool
length = len(ls)
step = int(length / n) + 1
for i in range(0, length, step):
p = threading.Thread(target=funct, args=(ls[i: i + step],))
pool.append(p)
for p in pool:
p.start()
for p in pool:
p.join()
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '_Main thread STAR exiting', file=TimeTable)
TimeTable.flush()

# Convert .sra to .fq and perform alignment
def sra_to_fq_and_bwa(sra_files):
for sra_file in sra_files:
sample_head = os.path.basename(sra_file).split('.')[0] # Assuming filename "1.sra", sample_head would be "1"
# Convert .sra to .fq.gz using fastq-dump
fq1_path = os.path.join(fastq_dir, f"{sample_head}_1.fastq.gz")
fq2_path = os.path.join(fastq_dir, f"{sample_head}_2.fastq.gz")
os.system(f'fastq-dump --split-files --gzip --outdir {fastq_dir} {sra_file}')
# Check if FASTQ files were created
if not os.path.exists(fq1_path) or not os.path.exists(fq2_path):
sys.exit(f"Error converting {sra_file} to FASTQ format.")
# Execute BWA alignment, followed by processing steps
bam_output = os.path.join(output_bam_dir, f"{sample_head}.bam")
# Ensure commands such as BWA, samtools are available in your environment
os.system(f'bwa mem -M -t {args.thread} -R "@RG\\tID:{sample_head}\\tSM:{sample_head}\\tPL:illumina\\tLB:lib1\\tPU:unit1" {ref} {fq1_path} {fq2_path} | samtools view -bhS - > {bam_output}')
# Further processing steps can be adjusted here

# Prepare a list of .sra files to process
sra_files_to_process = [os.path.join(args.input_dir, f"{i}.sra") for i in range(1, 69)]

# Process .sra files
mult(sra_to_fq_and_bwa, sra_files_to_process, n=args.thread)

这个脚本首先会生成一个处理范

围内所有.sra文件(即从1.sra68.sra)的文件列表,然后使用多线程调用fastq-dump进行格式转换,并对转换后的.fq文件进行比对处理。

请确保你有足够的权限访问这些目录和文件,并且已经安装了所有必要的软件,如SRA Toolkit、BWA、Samtools等。此外,根据实际环境和需求,你可能需要对命令行参数和工具的调用方式进行进一步调整。

为了运行上述脚本,你需要确保安装并能正确调用以下软件:

  1. SRA Toolkit - 用于.sra.fq格式的转换。
  2. BWA - 用于序列比对。
  3. Samtools - 用于处理SAM/BAM文件格式。
  4. Picard - 用于BAM文件处理,如排序、去重等。
  5. GATK (可选,如果你计划运行GATK相关命令) - 用于变异检测等复杂分析。

要验证这些软件是否能在你的环境中正确调用,你可以使用命令行执行以下命令:

SRA Toolkit (fastq-dump)

1
fastq-dump --version

这条命令会输出fastq-dump的版本号,如果软件已正确安装。

BWA

1
bwa

这条命令会显示BWA的帮助信息和使用说明,表示BWA已正确安装。

Samtools

1
samtools --version

这条命令会输出samtools的版本号,如果软件已正确安装。

Picard

1
java -jar picard.jar

注意:对于Picard,你需要确保Java已安装,并且picard.jar的路径正确。这条命令会显示Picard的帮助信息。如果你没有看到帮助信息,请确保你提供了正确的picard.jar路径。

GATK

1
gatk --version

或者,如果你使用的是GATK3,

1
java -jar GenomeAnalysisTK.jar --version

同样,对于GATK3,确保提供了正确的GenomeAnalysisTK.jar文件路径。

注意:对于Java应用(Picard和GATK),你需要Java运行环境(JRE)或Java开发工具包(JDK)。使用java -version命令可以检查Java是否安装。

如果上述命令中的任何一个没有按预期工作,可能意味着相应的软件没有被正确安装或者没有被添加到系统的PATH环境变量中。确保按照每个软件的安装指南进行安装,并且如果需要,将其可执行文件的路径添加到你的系统PATH中。

time.sleep(0.2)

    os.system('picard SortSam INPUT={0}/{1}.bam OUTPUT={0}/{1}_sorted.bam SORT_ORDER=coordinate TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}.bam'.format(output_bam_dir,sample_head))

    os.system('picard AddOrReplaceReadGroups I={0}/{1}_sorted.bam O={0}/{1}_sorted_add.bam RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM={1} TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}_sorted.bam'.format(output_bam_dir,sample_head))

    os.system('picard MarkDuplicates I={0}/{1}_sorted_add.bam O={0}/{1}_sorted_add_dedup.bam M={0}/{1}_sorted_add_dedup.metrics CREATE_INDEX=true MAX_FILE_HANDLES_FOR_READ_ENDS_MAP=4000 TMP_DIR=./tmp'.format(output_bam_dir,sample_head))

    time.sleep(0.2)

    os.system('rm {0}/{1}_sorted_add.bam'.format(output_bam_dir,sample_head))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'picard BuildBamIndex programming finished***In threading***'+sample_head, file=TimeTable)

    os.system("gatk3 -nct 4 -T HaplotypeCaller -R {0} --emitRefConfidence GVCF -I {1}/{2}_sorted_add_dedup.bam -o {3}/{2}.g.vcf".format(ref, output_bam_dir,sample_head,output_gvcf_dir))

    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'gatk3 programming finished***In threading***'+sample_head, file=TimeTable)

    TimeTable.flush()

    bam_list.append('--variant  {0}/{1}.g.vcf'.format(output_gvcf_dir,sample_head))

就这些代码,再给我设计一个脚本,运行这代码?你能参考这个,让我进行后续分析吗?开始的代码生成了1.bam到68.bam,在/home/data1/renminpeng/New1_bam_dir路径下,
我的参考基因组文件在/home/data1/renminpeng/New里,命名为reference.fasta,也已经索引了,软件基本也能用

#!/usr/local/bin/python3

-- coding: utf-8 --

“””
Script for processing BAM files and performing variant calling
to generate gVCF files.
“””

import os
import subprocess
import argparse

def parse_arguments():
parser = argparse.ArgumentParser(description=’Perform variant calling on pre-processed BAM files.’)
parser.add_argument(‘-b’, ‘–bam_dir’, required=True, help=’Directory containing pre-processed BAM files (sorted and deduped)’)
parser.add_argument(‘-r’, ‘–reference’, required=True, help=’Path to the reference genome fasta file’)
parser.add_argument(‘-o’, ‘–output_dir’, required=True, help=’Output directory for gVCF files’)
return parser.parse_args()

def call_variants(bam_dir, reference, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)

bam_files = [f for f in os.listdir(bam_dir) if f.endswith('_sorted_add_dedup.bam')]

for bam_file in bam_files:
    sample_name = os.path.splitext(bam_file)[0]
    dedup_bam = os.path.join(bam_dir, bam_file)
    gvcf_file = os.path.join(output_dir, f"{sample_name}.g.vcf")
    
    # Variant Calling with the specified GATK path
    subprocess.run(f'java -jar /home/data1/renminpeng/SRR2131201/gatk-package-4.1.8.1-local.jar HaplotypeCaller -R {reference} -I {dedup_bam} -O {gvcf_file} -ERC GVCF', shell=True)
    
    print(f'Finished processing {bam_file}')

def main():
args = parse_arguments()
call_variants(args.bam_dir, args.reference, args.output_dir)

if name == “main“:
main()


文章作者: 花粱
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 花粱 !
 上一篇
人际圈 人际圈
Here's something encrypted, password is required to continue reading.
2024-03-02 花粱
下一篇 
重装了系统 重装了系统
2024-02-29 花粱
  目录