yy951010 发表于 2024-9-16 15:25

核心基因筛选

1.gene_family_analysis.py
from Bio import SeqIO
from collections import defaultdict

class GeneFamilyAnalysis:
    def __init__(self, fasta_files):
      """
      初始化GeneFamilyAnalysis类
      :param fasta_files: 10个品种的FASTA文件列表,每个文件包含该品种的基因家族蛋白序列
      """
      self.fasta_files = fasta_files
      self.gene_presence = defaultdict(set)# 记录基因在哪些品种中出现

    def parse_fasta_files(self):
      """
      解析所有FASTA文件,记录基因在哪些品种中出现
      """
      for index, fasta_file in enumerate(self.fasta_files):
            species_name = f"species_{index + 1}"# 假设每个文件代表一个品种
            with open(fasta_file, "r") as file:
                for record in SeqIO.parse(file, "fasta"):
                  gene_id = record.id
                  self.gene_presence.add(species_name)

    def classify_genes(self):
      """
      根据基因在多少个品种中出现,将其分类为核心基因、非核心基因和特有基因
      :return: 核心基因、非核心基因和特有基因的列表
      """
      core_genes = []
      non_core_genes = []
      unique_genes = defaultdict(list)# 记录每个品种中的特有基因

      total_species = len(self.fasta_files)
      for gene, species_set in self.gene_presence.items():
            if len(species_set) == total_species:
                core_genes.append(gene)# 核心基因:所有品种中都存在
            elif len(species_set) == 1:
                unique_genes].append(gene)# 特有基因:只在一个品种中存在
            else:
                non_core_genes.append(gene)# 非核心基因:存在于部分但不是所有品种

      return core_genes, non_core_genes, unique_genes

    def save_results(self, core_file, non_core_file, unique_file):
      """
      保存结果到文件
      :param core_file: 保存核心基因的文件
      :param non_core_file: 保存非核心基因的文件
      :param unique_file: 保存特有基因的文件
      """
      core_genes, non_core_genes, unique_genes = self.classify_genes()

      # 保存核心基因
      with open(core_file, "w") as f:
            f.write("\n".join(core_genes))
      print(f"核心基因已保存到 {core_file}")

      # 保存非核心基因
      with open(non_core_file, "w") as f:
            f.write("\n".join(non_core_genes))
      print(f"非核心基因已保存到 {non_core_file}")

      # 保存特有基因
      with open(unique_file, "w") as f:
            for species, genes in unique_genes.items():
                f.write(f">{species}\n")
                f.write("\n".join(genes) + "\n")
      print(f"特有基因已保存到 {unique_file}")
2.__init__.py
from .gene_family_analysis import GeneFamilyAnalysis

__all__ = ["GeneFamilyAnalysis"]
3.以下是如何使用这个包来筛选基因家族中的核心基因、非核心基因和特有基因
from mygenefamily import GeneFamilyAnalysis

# 假设我们有10个品种的FASTA文件
fasta_files = [
    "species_1.fasta",
    "species_2.fasta",
    "species_3.fasta",
    "species_4.fasta",
    "species_5.fasta",
    "species_6.fasta",
    "species_7.fasta",
    "species_8.fasta",
    "species_9.fasta",
    "species_10.fasta"
]

# 初始化分析对象
gene_analysis = GeneFamilyAnalysis(fasta_files)

# 解析FASTA文件
gene_analysis.parse_fasta_files()

# 保存结果到文件
gene_analysis.save_results(
    core_file="core_genes.txt",
    non_core_file="non_core_genes.txt",
    unique_file="unique_genes.txt"
)
4. 代码说明
[*]
GeneFamilyAnalysis 类:

[*]__init__: 初始化类,传入多个个品种的FASTA文件列表。
[*]parse_fasta_files: 解析FASTA文件,并记录每个基因在哪些品种中存在。
[*]classify_genes: 将基因分类为核心基因、非核心基因和特有基因。
[*]save_results: 将分类结果保存为三个不同的文件,分别保存核心基因、非核心基因和特有基因。
[*]
核心基因:出现在所有品种中的基因。
[*]
非核心基因:出现在部分品种中的基因。
[*]
特有基因:只出现在某个品种中的基因,特有基因按照品种进行分类保存。

Jack-lee 发表于 2024-9-16 15:49

biopython有没有模块可以画出基因的序列图,像snapgen一样

yy951010 发表于 2024-9-26 10:02

Jack-lee 发表于 2024-9-16 15:49
biopython有没有模块可以画出基因的序列图,像snapgen一样

Biopython 中好像没有像 SnapGene 那样专门用于生成基因序列图的模块,Bio.Graphics 模块应该能生成简单的基因序列图
页: [1]
查看完整版本: 核心基因筛选