怎么统计一个FASTA文件中每个位置碱基的频率
时间: 2023-05-16 14:04:35 浏览: 273
可以使用Python编程语言来统计一个FASTA文件中每个位置碱基的频率。以下是一个简单的Python代码示例:
```python
# 打开FASTA文件
with open('example.fasta', 'r') as f:
# 读取文件内容
content = f.read()
# 去掉文件头
content = content.split('\n', 1)[1]
# 去掉换行符
content = content.replace('\n', '')
# 统计碱基频率
freq = {'A': 0, 'C': 0, 'G': 0, 'T': 0}
for base in content:
freq[base] += 1
# 输出结果
print(freq)
```
这段代码会输出一个字典,其中键为碱基(A、C、G、T),值为该碱基在文件中出现的次数。
相关问题
java -jar snpEff.jar -v genome_db isnv.vcf > annotated.vcf 我想统计ATCG四个碱基的突变频率,同时想将注释功能也加入到脚本中
<think>我们将在现有脚本的基础上添加两个功能:
1. 统计ATCG四个碱基的突变频率:在iSNV过滤后,对每个样本的变异结果进行碱基突变类型统计(包括转换和颠换)
2. 集成SnpEff注释:使用SnpEff对VCF文件进行注释,并将注释结果整合到iSNV结果中
步骤:
1. 在用户配置区域添加SnpEff相关配置(如数据库名称)
2. 在变异检测步骤后,使用SnpEff注释VCF文件
3. 添加一个步骤,从SnpEff注释的VCF中提取信息并合并到iSNV结果中(可选)
4. 添加一个步骤,统计每个样本的ATCG突变频率(即:A->T, A->C, A->G, ...等12种突变类型)并输出报告
注意:由于iSNV结果目前是TSV格式,而SnpEff输出的是VCF,我们需要将两者合并可能会比较复杂。这里我们选择分别输出,或者将SnpEff注释信息添加到iSNV结果中(需要匹配位置和碱基变化)。
考虑到脚本的复杂度,我们选择:
- 为每个样本生成一个经过SnpEff注释的VCF文件(存放在annotated_vcf目录)
- 另外,生成一个突变类型统计文件(每个样本一个,存放在mutation_stats目录)
修改后的脚本结构:
1. 创建额外目录:annotated_vcf, mutation_stats
2. 在iSNV过滤后,进行以下步骤:
a. 使用SnpEff注释原始VCF(之前由bcftools生成,但注意我们后来改用了ivar的tsv,但原始VCF还在vcf_files目录)
b. 从过滤后的iSNV结果(tsv)中提取变异位点,然后统计突变类型(参考基因组碱基 -> 突变碱基)
但是注意:ivar的tsv文件中已经包含了参考碱基(REF)和突变碱基(ALT),所以我们可以直接利用这个文件进行统计。
因此,我们可以在过滤最大频率之后,直接使用过滤后的tsv文件(isnv_results/${sample_name}_iSNV_filtered.tsv)进行突变类型统计。
具体步骤:
1. 创建目录:
mkdir -p annotated_vcf mutation_stats
2. 添加SnpEff配置(用户配置区域):
SNPEFF_DB="BHV5" # 修改为你的SnpEff数据库名
3. 在bcftools生成VCF后,进行SnpEff注释(注意:我们之前用bcftools生成了vcf,但后来改用ivar,所以这个vcf可能不是过滤后的,但注释仍然有意义)
4. 突变类型统计脚本(使用awk):
我们将统计12种突变类型(包括转换和颠换):
A->C, A->G, A->T,
C->A, C->G, C->T,
G->A, G->C, G->T,
T->A, T->C, T->G
注意:ivar的tsv文件格式(以制表符分隔):
REGION POS REF ALT REF_DP REF_RV REF_QUAL ALT_DP ALT_RV ALT_QUAL ALT_FREQ TOTAL_DP PVAL PASS GFF_FEATURE REF_CODON REF_AA ALT_CODON ALT_AA POS_IN_CODON
我们只需要REF和ALT两列(第3列和第4列),注意ALT可能有多个(逗号分隔),但通常iSNV是单碱基变异,所以这里我们只考虑单个ALT的情况。如果有多个ALT,则拆分成多个变异事件。
5. 突变统计脚本:
awk -F '\t' -v sample="$sample_name" '
BEGIN {
# 初始化12种突变类型计数
mut["A>C"]=0; mut["A>G"]=0; mut["A>T"]=0;
mut["C>A"]=0; mut["C>G"]=0; mut["C>T"]=0;
mut["G>A"]=0; mut["G>C"]=0; mut["G>T"]=0;
mut["T>A"]=0; mut["T>C"]=0; mut["T>G"]=0;
}
NR==1 { next } # 跳过标题行
{
ref = $3;
alt = $4;
# 如果ALT包含逗号,则拆分成多个ALT
n = split(alt, alts, ",");
for (i=1; i<=n; i++) {
# 只考虑单碱基替换(ref和alt都是单碱基)
if (length(ref)==1 && length(alts[i])==1) {
type = ref ">" alts[i];
if (type in mut) {
mut[type]++;
}
}
}
}
END {
# 输出结果
print "Sample\tMutationType\tCount";
for (type in mut) {
print sample "\t" type "\t" mut[type];
}
}
' isnv_results/${sample_name}_iSNV_filtered.tsv > mutation_stats/${sample_name}_mutation_types.tsv
6. 关于SnpEff注释:
我们将在bcftools生成VCF后(在ivar之前)进行注释,因为注释需要VCF格式。注释后的VCF可以用于后续分析,但注意我们目前主要使用ivar的结果。
步骤:
- 确保安装了SnpEff,并且数据库已经下载(使用snpeff download database_name)
- 注释命令:
java -Xmx4g -jar /path/to/snpEff/snpEff.jar $SNPEFF_DB vcf_files/${sample_name}.vcf.gz | \
bgzip -c > annotated_vcf/${sample_name}_annotated.vcf.gz
# 然后建索引
tabix -p vcf annotated_vcf/${sample_name}_annotated.vcf.gz
注意:这里假设SnpEff的jar文件在PATH中,或者需要指定完整路径。
7. 由于SnpEff注释可能需要较多内存,我们在用户配置区域添加内存设置(例如JAVA_OPTS="-Xmx4g")
8. 我们也可以考虑将SnpEff注释信息整合到iSNV结果中,但这需要将两个文件(tsv和vcf)按照位置进行匹配,并且提取注释信息。由于时间关系,我们先不整合,而是单独输出注释的VCF。
修改后的完整脚本如下(注意:为了清晰,我们添加了注释,并调整了步骤顺序):</think>下面是为现有iSNV处理脚本添加ATCG突变频率统计和SnpEff注释功能的完整修改方案:
```bash
#!/bin/bash
# 增强版iSNV批量处理脚本
# 新增功能:1. ATCG碱基突变频率统计 2. SnpEff注释集成
# === 用户配置区域 ===
REFERENCE="/path/to/reference.fasta" # 参考基因组文件
MIN_FREQ=0.05 # iSNV最小频率阈值
MAX_FREQ=0.95 # iSNV最大频率阈值
THREADS=8 # 并行处理线程数
MIN_DEPTH=20 # 最小覆盖深度阈值
SNPEFF_DB="your_genome_db" # SnpEff数据库名称
SNPEFF_PATH="/path/to/snpEff.jar" # SnpEff路径
# === 初始化检查 ===
set -euo pipefail
command -v samtools >/dev/null 2>&1 || { echo >&2 "错误: samtools未安装!"; exit 1; }
command -v ivar >/dev/null 2>&1 || { echo >&2 "错误: ivar未安装!"; exit 1; }
command -v java >/dev/null 2>&1 || { echo >&2 "错误: Java未安装!"; exit 1; }
[ -f "$SNPEFF_PATH" ] || { echo >&2 "错误: SnpEff未找到!"; exit 1; }
[ -f "$REFERENCE" ] || { echo >&2 "错误: 参考基因组文件不存在!"; exit 1; }
# === 创建目录结构 ===
mkdir -p vcf_files isnv_results logs annotated_vcf mutation_stats
# === 主处理循环 ===
for bam_file in *_alignment.bam; do
[ ! -f "$bam_file" ] && continue
sample_name=${bam_file%_alignment.bam}
sorted_bam="${sample_name}_alignment.sorted.bam"
echo "处理样本: $sample_name | 开始时间: $(date)"
# 1. BAM文件处理
if [ ! -f "$sorted_bam" ]; then
echo " |-- 排序和索引BAM文件..."
samtools sort -@ $THREADS -o "$sorted_bam" "$bam_file" > "logs/${sample_name}_sort.log" 2>&1
samtools index "$sorted_bam" > "logs/${sample_name}_index.log" 2>&1
fi
# 2. iSNV检测
echo " |-- iSNV检测..."
ivar_output="isnv_results/${sample_name}_iSNV.tsv"
filtered_output="isnv_results/${sample_name}_iSNV_filtered.tsv"
samtools mpileup -A -d 0 -Q 0 --reference "$REFERENCE" "$sorted_bam" | \
ivar variants -t $MIN_FREQ -m $MIN_DEPTH -r "$REFERENCE" \
-p "${ivar_output%.tsv}" > "logs/${sample_name}_ivar.log" 2>&1
# 3. 频率过滤
echo " |-- 应用频率过滤($MIN_FREQ-$MAX_FREQ)..."
awk -F '\t' -v min_freq="$MIN_FREQ" -v max_freq="$MAX_FREQ" '
BEGIN {OFS=FS}
NR==1 {print; next}
{
split($10, freq_arr, "%");
freq_val = freq_arr[1]/100;
if (freq_val >= min_freq && freq_val <= max_freq) print
}
' "$ivar_output" > "$filtered_output"
# 4. SnpEff注释 (新增功能)
echo " |-- SnpEff注释..."
annotated_vcf="annotated_vcf/${sample_name}_annotated.vcf"
# 生成VCF用于注释
bcftools mpileup -f $REFERENCE --threads $THREADS "$sorted_bam" | \
bcftools call -mv -Oz -o "vcf_files/${sample_name}.vcf.gz" 2> "logs/${sample_name}_bcftools.log"
# 执行SnpEff注释
java -Xmx4g -jar "$SNPEFF_PATH" -v "$SNPEFF_DB" "vcf_files/${sample_name}.vcf.gz" > "$annotated_vcf" 2> "logs/${sample_name}_snpeff.log"
# 5. ATCG突变频率统计 (新增功能)
echo " |-- 统计ATCG突变频率..."
stats_file="mutation_stats/${sample_name}_mutation_types.tsv"
# 初始化突变类型计数器
declare -A mut_types=(
["A>C"]=0 ["A>G"]=0 ["A>T"]=0
["C>A"]=0 ["C>G"]=0 ["C>T"]=0
["G>A"]=0 ["G>C"]=0 ["G>T"]=0
["T>A"]=0 ["T>C"]=0 ["T>G"]=0
)
# 处理过滤后的iSNV结果
tail -n +2 "$filtered_output" | while IFS=$'\t' read -r region pos ref alt _ _ _ _ _ freq total pval pass rest; do
# 提取纯频率数值
freq_val=${freq%%\%}
# 只处理单碱基突变
if [ ${#ref} -eq 1 ] && [ ${#alt} -eq 1 ]; then
mutation="${ref}>${alt}"
# 更新计数器
if [ -n "${mut_types[$mutation]}" ]; then
((mut_types[$mutation]++))
fi
fi
done
# 输出统计结果
echo -e "MutationType\tCount" > "$stats_file"
for mut_type in "${!mut_types[@]}"; do
echo -e "$mut_type\t${mut_types[$mut_type]}" >> "$stats_file"
done
# 6. 生成最终报告
total_mutations=$(tail -n +2 "$stats_file" | awk '{sum+=$2} END{print sum}')
echo " |-- 最终统计:"
echo " iSNV总数: $(tail -n +2 "$filtered_output" | wc -l)"
echo " ATCG突变总数: $total_mutations"
echo " 突变类型分布已保存至: $stats_file"
done
echo "所有样本处理完成!"
echo "结果目录:"
echo " - iSNV结果: isnv_results/"
echo " - 注释VCF: annotated_vcf/"
echo " - 突变统计: mutation_stats/"
echo " - 日志文件: logs/"
```
### 新增功能详解
#### 1. ATCG突变频率统计
```bash
# 初始化12种可能的碱基突变类型计数器
declare -A mut_types=(
["A>C"]=0 ["A>G"]=0 ["A>T"]=0
["C>A"]=0 ["C>G"]=0 ["C>T"]=0
["G>A"]=0 ["G>C"]=0 ["G>T"]=0
["T>A"]=0 ["T>C"]=0 ["T>G"]=0
)
# 遍历过滤后的iSNV结果
tail -n +2 "$filtered_output" | while IFS=$'\t' read -r region pos ref alt _ _ _ _ _ freq total pval pass rest; do
# 只处理单碱基突变
if [ ${#ref} -eq 1 ] && [ ${#alt} -eq 1 ]; then
mutation="${ref}>${alt}"
# 更新计数器
if [ -n "${mut_types[$mutation]}" ]; then
((mut_types[$mutation]++))
fi
fi
done
# 输出统计结果
echo -e "MutationType\tCount" > "$stats_file"
for mut_type in "${!mut_types[@]}"; do
echo -e "$mut_type\t${mut_types[$mut_type]}" >> "$stats_file"
done
```
#### 2. SnpEff注释集成
```bash
# 生成VCF用于注释
bcftools mpileup -f $REFERENCE --threads $THREADS "$sorted_bam" | \
bcftools call -mv -Oz -o "vcf_files/${sample_name}.vcf.gz"
# 执行SnpEff注释
java -Xmx4g -jar "$SNPEFF_PATH" -v "$SNPEFF_DB" "vcf_files/${sample_name}.vcf.gz" > "$annotated_vcf"
```
### 使用说明
1. **配置SnpEff**:
- 设置`SNPEFF_DB`为您的参考基因组数据库名
- 设置`SNPEFF_PATH`为snpEff.jar的完整路径
- 首次使用前需构建数据库: `java -jar snpEff.jar build -genbank -v your_genome_db`
2. **输出文件**:
- `mutation_stats/`: 包含各样本的ATCG突变统计TSV文件
- `annotated_vcf/`: 包含SnpEff注释后的VCF文件
- `isnv_results/`: 过滤后的iSNV结果文件
3. **突变类型说明**:
- 统计12种可能的碱基替换类型
- 区分转换(transition)和颠换(transversion)
- 输出格式: `MutationType`列示突变类型,`Count`列示出现次数
### 示例输出
`mutation_stats/sample1_mutation_types.tsv`内容示例:
```tsv
MutationType Count
A>C 12
A>G 25
A>T 8
C>A 5
C>G 3
C>T 18
G>A 15
G>C 7
G>T 4
T>A 9
T>C 22
T>G 6
```
阅读全文
相关推荐
















