学习一下ARG-OAP的python代码

Step1. 认识该软件使用的db

1)src/args_oap/db/ko30.fasta

19,951个氨基酸序列,都是些核糖体蛋白

2) src/args_oap/db/ko30_structure.txt

共19,950行,给ko30.fasta的序列名分配了一个BA号

 3)gg85 (green gene 85%)

5,088条DNA序列

Step2. 看看stage_one

1)def __init__(运行前的基本检查)

比如有没有input文件夹,output文件夹里原来有没有东西,检查数据库文件是否齐全...看看就好。

这一部分在def __init__中

 2)功能函数

def count_16s(self, file)

使用bwa(预过滤)和blastn(后过滤)提取16S(GreenGenes 16S rRNA数据库85%)读数。

i) 使用bwa预过滤

subprocess.run(['bwa', 'mem', '-t', str(self.thread), '-o', _tmp_16s_sam, settings._gg85, file], check=True, stderr=subprocess.DEVNULL)

  • self.thread:bwa的线程数
  • settings._gg85GreenGenes 16S rRNA 数据库的路径
  • check=True:这个参数表示在命令执行过程中,如果返回的退出状态码不为零,会引发一个CalledProcessError异常。换句话说,如果命令执行出错,将会引发异常。
  • stderr=subprocess.DEVNULL:将标准错误输出重定向到subprocess.DEVNULL,即将其丢弃,不保存到任何地方。

iI) 将 SAM 格式转换为 FASTA 格式

with open(_tmp_16s_fa, 'w') as f:
            subprocess.run(['samtools', 'fasta', '-F4', '-F0x900', _tmp_16s_sam], check=True, stderr=subprocess.DEVNULL, stdout=f)

 将结果写入指定的文件 _tmp_16s_fa 中。samtools fasta 命令用于此转换过程。选项 -F4 和 -F0x900 用于过滤未匹配的 reads 和二级质量不合格的 reads。

 iii)使用 blastn 进行后续筛选

mt_mode = '1' if simple_count(_tmp_16s_fa)[0] / self.thread >= 2500000 else '0' 
        subprocess.run([
            'blastn', 
            '-db', settings._gg85, 
            '-query', _tmp_16s_fa, 
            '-out', _tmp_16s_txt, 
            '-outfmt', ' '.join(['6']+settings.cols),
            '-evalue', str(self.e1), 
            '-max_hsps', '1', 
            '-max_target_seqs', '1',
            '-mt_mode', mt_mode, 
            '-num_threads', str(self.thread)], check=True, stderr=subprocess.DEVNULL)

这段代码使用 blastn 命令对转换后的 FASTA 文件进行进一步筛选。blastn 命令用于将查询序列与数据库中的序列进行比对。具体选项和参数包括:

  • -db:指定要比对的数据库,这里是 settings._gg85
  • -query:指定要进行比对的查询序列文件,这里是 _tmp_16s_fa
  • -out:指定输出比对结果的文件路径,这里是 _tmp_16s_txt
  • -outfmt:指定输出结果的格式,这里使用的是 Blast tabular 格式,列名为 settings.cols 中的值。
  • -evalue:指定比对的 E-value 阈值。
  • -max_hsps 和 -max_target_seqs:分别指定每个查询序列的最大比对结果数和每个数据库序列的最大比对结果数。
  • -mt_mode 和 -num_threads:用于设定多线程模式和线程数。
  • mt_mode = '1' if simple_count(_tmp_16s_fa)[0] / self.thread >= 2500000 else '0' 也就是选择是设定多线程模式,关于mt_mode的解释如下
  •  -mt_mode <Integer, (>=0 and =<1)>
       Multi-thread mode to use in BLAST search:
        0 (auto) split by database 
        1 split by queries
       Default = `0'

iv) 处理比对结果并计算覆盖率

        df = pd.read_table(_tmp_16s_txt, header=None, names=settings.cols)
        if len(df)==0:
            logger.warning("No 16S-like sequences found in file <{}>.".format(file))
            return 0
        else:
            df['scov'] = df['length'] / df['slen']
            if df['qseqid'].duplicated().sum()>0:
                logger.warning('Duplicated qseqid in 16S.')
                df = df[~df['qseqid'].duplicated()]
            return df['scov'].sum()

def count_cells(self, file)

使用diamond计数基本单拷贝标记基因(细胞数)

df.groupby('ko30').apply(lambda x: sum(x['length'] / x['slen'])).sum() / 30

def extract_seqs(self, file)

def run(self)

 3)运行

def run_stage_one(options):
    StageOne(vars(options)).run()

Step3. 看看stage_two

1)函数

def merge_files

logger.info打印log文件

nbps, nlines = simple_count(self.setting.extracted):调用了一个名为simple_count的函数,并将返回的结果赋值给nbpsnlines两个变量。它用于计算文件中的碱基数和行数。

mt_mode = '1' if nbps / self.thread >= 2500000 else '0':这是一个条件语句,根据nbps / self.thread的值是否大于等于2500000,将mt_mode变量设置为'1'或'0'。它用于决定一种处理模式。

根据self.dbtype的值是否为'prot',将blast_mode变量设置为'blastx'或'blastn'

def extract_seqs

将提取的目标序列与metadata数据和structure文件合并,并根据不同的层级(type/subtype/gene)进行聚合。

df['qcov'] = df['length'] / df['qlen']

def run

如果self.blastout为空,那么会执行self.extract_seqs()函数来提取序列

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 下面是一个简单的使用Python实现的K-Means算法的代码: ``` import numpy as np import matplotlib.pyplot as plt # 生成随机数据 np.random.seed(0) X = np.random.randn(100, 2) # 初始化聚类中心 k = 3 centers = X[:k, :] # 迭代更新聚类中心 while True: # 计算每个样本与聚类中心的距离 distances = np.sqrt(((X - centers[:, np.newaxis]) ** 2).sum(axis=2)) # 分配样本到最近的聚类中心 labels = distances.argmin(axis=0) # 更新聚类中心 new_centers = np.array([X[labels == i].mean(axis=0) for i in range(k)]) # 判断是否收敛 if np.all(centers == new_centers): break centers = new_centers # 可视化聚类结果 plt.scatter(X[:, 0], X[:, 1], c=labels) plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, c='r') plt.show() ``` 上述代码中,我们首先生成了一个二维的随机数据集X,然后初始化了三个聚类中心,接着进行了迭代更新聚类中心的过程,直到聚类中心不再变化为止。最后,我们用matplotlib库将聚类结果可视化出来。 ### 回答2: k-means是一种基本的聚类算法,它的目标是将数据集划分为k个簇,使得每个数据点与所属簇中的均值最接近。以下是一个简单的使用Python实现k-means算法的代码: ```python import numpy as np def kmeans(data, k, max_iters=100): # 随机选择k个初始质心 centers = data[np.random.choice(range(len(data)), k, replace=False)] for _ in range(max_iters): # 计算每个数据点与质心的距离 distances = np.sqrt(((data - centers[:, np.newaxis])**2).sum(axis=2)) # 将数据点分配到最近的质心 labels = np.argmin(distances, axis=0) # 更新质心位置为所属簇的均值 new_centers = np.array([data[labels == i].mean(axis=0) for i in range(k)]) # 如果质心位置没有变化,则停止迭代 if np.all(centers == new_centers): break centers = new_centers return labels, centers # 测试代码 data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) k = 2 labels, centers = kmeans(data, k) print("数据点所属簇的标签:", labels) print("质心坐标:", centers) ``` 上述代码中,将数据集表示为一个二维numpy数组。在算法开始时,通过随机选择k个数据点作为初始质心。然后,通过多次迭代计算每个数据点与质心的距离,将数据点分配到最近的质心所属的簇,然后更新质心的位置为所属簇的均值。重复这个过程直到质心位置不再发生变化或达到最大迭代次数。 最后,打印每个数据点所属的簇的标签以及最终的质心坐标。 ### 回答3: k-means是一种常用的聚类算法,其思想是根据样本之间的相似度进行聚类,将样本划分为K个不重叠的簇。下面是一个用Python实现k-means算法的例子: ```python import numpy as np import random def k_means(data, k, max_iters): centroids = random.sample(list(data), k) # 随机选择k个初始质心 for _ in range(max_iters): clusters = [[] for _ in range(k)] # 存储每个簇的样本 for point in data: distances = [np.linalg.norm(point - centroid) for centroid in centroids] # 计算样本与每个质心的距离 cluster_idx = np.argmin(distances) # 找到距离最近的质心索引 clusters[cluster_idx].append(point) # 将样本添加到对应的簇中 new_centroids = [] for cluster in clusters: if cluster: new_centroid = np.mean(cluster, axis=0) # 计算簇中样本的均值作为新的质心 new_centroids.append(new_centroid) else: new_centroids.append(random.choice(list(data))) # 若某个簇为空,则随机选择一个样本作为新的质心 if np.all(centroids == new_centroids): break # 若质心不再更新,则停止迭代 centroids = new_centroids return centroids, clusters # 测试代码 data = np.array([[1, 2], [1, 4], [3, 4], [5, 7], [3, 2], [8, 1]]) k = 2 max_iters = 10 centroids, clusters = k_means(data, k, max_iters) for i, cluster in enumerate(clusters): print('Cluster {}:'.format(i)) print(cluster) ``` 上述代码中,`data`是一个包含样本的numpy数组,`k`是簇的数量,`max_iters`是最大迭代次数。代码首先在样本中随机选择`k`个作为初始质心,然后进行迭代,直到质心不再更新或达到最大迭代次数为止。对于每个迭代周期,代码计算每个样本与质心的距离,将样本分配到距离最近的簇中,然后重新计算每个簇的质心。最后,返回最终的质心和簇的分配结果。 测试代码中,我们给定了一个简单的二维数据集,将其分为两个簇,然后输出每个簇的样本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值