泛基因组分析-基本流程代码

以下是自己使用map-to-pan分析泛基因组的部分代码,仅供参考:
统计fasta序列的N50、N90以及最短、最长序列

##tj_N50.py 
import sys
from Bio import SeqIO
import os

def calculate_Nx(sequence_lengths, x):
    total_length = sum(sequence_lengths)
    target_length = total_length * x / 100
    sorted_lengths = sorted(sequence_lengths, reverse=True)
    cumulative_length = 0
    for length in sorted_lengths:
        cumulative_length += length
        if cumulative_length >= target_length:
            return length

def calculate_stats(fasta_file):
    stats = []
    for record in SeqIO.parse(fasta_file, "fasta"):
        sequence_length = len(record.seq)
        stats.append((record.id, sequence_length))
    stats.sort(key=lambda x: x[1])

    sequence_lengths = [length for _, length in stats]
    n50 = calculate_Nx(sequence_lengths, 50)
    n90 = calculate_Nx(sequence_lengths, 90)
    min_length = sequence_lengths[0]
    max_length = sequence_lengths[-1]
    return stats, n50, n90, min_length, max_length

fasta_files = sys.argv[1:]  # 通过命令行参数传入FASTA文件路径列表

print("文件名\t最短序列长度\t最长序列长度\tN50\tN90")
for fasta_file in fasta_files:
    sample_stats, n50, n90, min_length, max_length = calculate_stats(fasta_file)
    file_name = os.path.basename(fasta_file)
    print(f"{file_name}\t{min_length}\t{max_length}\t{n50}\t{n90}")
过滤前

现在需要筛选大于500bp的序列做后续分析:

##tiqu_500.py
import sys

def extract_long_sequences(fasta_file):
    long_sequences = []
    current_sequence = ""
    current_sequence_name = ""
    with open(fasta_file, "r") as file:
        for line in file:
            line = line.strip()
            if line.startswith(">"):
                if current_sequence and len(current_sequence) > 500:
                    long_sequences.append((current_sequence_name, current_sequence))
                current_sequence_name = line[1:]
                current_sequence = ""
            else:
                current_sequence += line
        if current_sequence and len(current_sequence) > 500:
            long_sequences.append((current_sequence_name, current_sequence))
    return long_sequences

fasta_file = sys.argv[1]  # 通过命令行参数传入FASTA文件路径
long_sequences = extract_long_sequences(fasta_file)

# 打印提取出的长序列
for sequence_name, sequence in long_sequences:
    print(f">{sequence_name}")
    print(sequence)
过滤后

再写个简单的批处理shell:

cat ../fqid|while read id
do
python tiqu_500.py ../contigs/$id.fa >01_500bp/$id.500.fa
python tj_N50.py 01_500bp/$id_500.fa >>N50_inf.txt
done
quast评估,嫌慢可以写成parallel并行
cat ../fqid|while read samples
do
#mkdir 02_quast/${samples}
ref=/public/home/fengting/work/zyyy/DK/jelly/ref_IR64/IR64.genome
th=4
refgff=/public/home/fengting/work/cax/NIP/new_add/gff/IR64.IGDBv1.Allset.gff
/public/home/fengting/demo/pan111/EUPAN/tools/quast-5.1.0rc1/quast.py \
 -t ${th} \
    --large 01_500bp/${samples}.500.fa \
    -r ${ref} \
    -g ${refgff} \
   -o ./02_quast/${samples} \
    --no-icarus \
    --no-snps \
    --min-identity 90.0
done

使用blastx将未比对上的核苷酸数据与unirice蛋白数据库比对

cat id|while read samples
do 
###为了并行处理
echo "blastx -query 01_500bp/${samples}.500.fa -out bl/${samples}.bl -db os_nr/unirice -outfmt 6 -evalue 1e-6 -num_threads 8" >>blxwo.sh
done

题外话
昨晚挂了一个blastn的任务,跑了一天,导致其它任务进行的极其缓慢,cpu占用也极其低,关掉这个任务就好了。

###去掉文件名的后缀
import os

# 获取当前文件夹路径
folder_path = os.getcwd()

# 遍历当前文件夹中的所有文件
for filename in os.listdir(folder_path):
    # 检查文件是否以.bl为后缀
    if filename.endswith(".bl"):
        # 去掉.bl后缀
        new_filename = filename[:-3]
        
        # 重命名文件
        os.rename(os.path.join(folder_path, filename), os.path.join(folder_path, new_filename))

提取blast结果

cat sxid|while read id
do
cut -f  1 ../bl/$id.bl |uniq|sort -V > blid/$id
perl ~/scripts/perl/per.pl blid/$id ../01_500bp/$id.500.fa >blfa/$id.fa
done

去冗余

###提取核苷酸序列
perl ~/scripts/perl/per.pl DL001 DL001-1.500.fa >DL001.fa
####cd-hit 去冗余,24-1-25更新去冗余命令

cd-hit -i in.fasta -o out.fasta -d 30 -G 1 -M 16000 -T 20  -uL 0.05 -S 2 -U 2 -g 1 -aL 0.95 -aS 1


###euapn去冗余
##blastCluster
eupan rmRedundant blastCluster DL001.fa 1 ~/miniconda3/bin/

##cdhit
eupan rmRedundant cdhitCluster DL001.fa 2 ~/miniconda3/bin/

为了防止合并后有序列的名字是重复的,我们将每个文件的sample名字添加到序列后

import os

# 获取当前文件夹路径
folder_path = os.getcwd()

# 获取当前文件夹中以DL开头的文件列表
file_list = [file for file in os.listdir(folder_path) if file.startswith('DL')]

# 遍历文件列表
for file_name in file_list:
    # 构建原始文件路径和新文件路径
    file_path = os.path.join(folder_path, file_name)
    new_file_path = os.path.join(folder_path, f"new_{file_name}")

    # 打开原始文件和新文件
    with open(file_path, 'r') as file, open(new_file_path, 'w') as new_file:
        # 逐行读取原始文件内容
        for line in file:
            # 如果当前行以>开头,则在该行后面添加文件名
            if line.startswith('>'):
                line = line.strip() + f" {file_name}\n"
            
            # 将修改后的行写入新文件
            new_file.write(line)
    
    print(f"文件 {file_name} 处理完成,生成新文件 {new_file_path}")
每条序列都含有样本名

整合所有fasta文件成新的文件

import os

# 获取当前文件夹路径
folder_path = os.getcwd()

# 获取当前文件夹中以new开头的文件列表
file_list = [file for file in os.listdir(folder_path) if file.startswith('new')]

# 创建一个新的文件用于整合所有内容
new_file_path = os.path.join(folder_path, "combined_file.txt")

# 遍历文件列表
with open(new_file_path, 'w') as new_file:
    for file_name in file_list:
        # 构建原始文件路径
        file_path = os.path.join(folder_path, file_name)
        
        # 打开原始文件
        with open(file_path, 'r') as file:
            # 逐行读取原始文件内容,并写入新文件
            for line in file:
                new_file.write(line)

print(f"所有以new开头的文件已经整合到新文件 {new_file_path} 中")

未完待续

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

推荐阅读更多精彩内容