美文网首页
未比对上序列的提取遇到的问题及解决策略

未比对上序列的提取遇到的问题及解决策略

作者: 花生学生信 | 来源:发表于2024-02-23 17:15 被阅读0次

    未必对序列提取的方法请看:
    请看前期:
    泛基因组提取未必对上序列 - 简书 (jianshu.com)

    脚本会自动把其他染色体上的序列给补上 提取序列,full表示完全没有比上,partial表示部分未比上

    这里其实应该是脚本的缺陷,如果quast的比对的是两个完整的chr级的序列(水稻12条,不含contig)

    实际上未必对的结果约占1/10是比较合理的,约40Mb的序列

    因为序列名称等各种原因,直接提取出来的结果会有各种问题,这里我写了几个脚本,但是解决起来还是很繁琐,如果有更好的办法后面会更新,

    首先使用脚本提取quast结果,考虑到后面批处理及提取的问题,所以提取的文件fasta文件id编号不添加样本名

    python3 unalign_drop_direct.py \
        DL651.500.fa \
        H7L1/contigs_reports/contigs_report_DL651-500.unaligned.info \
        unalign/651_unalign_500.fa \
        500 \
    #   DL651
    
    提取出的contig比原来多200多,因为有的contig是部分比对上的

    首先是把quast/contig_report/unalign.info文件第一列提取出来,在序列前加_符号(unalign_drop_direct.py脚本的问题),

    ##提取第一列
    cut -f 1  unalign.info |sed '1d' >contigid
    
    ###tj.py
    import sys
    
    if len(sys.argv) != 3:
        print("Usage: python add_underscore.py input_file output_file")
        sys.exit(1)
    
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    
    with open(input_file, 'r') as fin:
        lines = fin.readlines()
    
    with open(output_file, 'w') as fout:
        for line in lines:
            new_line = '_'+line.strip() + '\n'
            fout.write(new_line)
    
    print("文件处理完成,结果已保存到", output_file)
    

    结果是模糊匹配,这里写一个脚本提取。
    即写一个脚本,读取id文件和fasta文件,根据id文件的内容提取fasta文件,fasta文件只要:前匹配id的都提取,并保存成新的fasta文件,命令行形式

    #tq1.py
    import sys
    
    if len(sys.argv) != 4:
        print("Usage: python extract_fasta_by_id_prefix.py id_file fasta_file output_file")
        sys.exit(1)
    
    id_file = sys.argv[1]
    fasta_file = sys.argv[2]
    output_file = sys.argv[3]
    
    # 读取 ID 文件中的 ID 前缀列表
    with open(id_file, 'r') as id_f:
        id_prefixes = [line.strip() for line in id_f]
    
    # 读取 FASTA 文件,提取匹配的序列
    with open(fasta_file, 'r') as fasta_f:
        sequences = {}
        curr_id = None
        for line in fasta_f:
            if line.startswith('>'):
                curr_id = line.strip().split(':')[0][1:]
                sequences[curr_id] = ''
            else:
                sequences[curr_id] += line.strip()
    
    # 将匹配的序列保存到输出文件中
    with open(output_file, 'w') as out_f:
        for seq_id in sequences.keys():
            for id_prefix in id_prefixes:
                if seq_id.startswith(id_prefix):
                    out_f.write('>' + seq_id + '\n')
                    out_f.write(sequences[seq_id] + '\n')
    
    print("序列提取完成,结果已保存到", output_file)
    
    这是最终提取出来的结果,应该没有什么问题了
    cat ../../fqid|while read id 
    do
    cut -f 1 /public/home/fengting/work/zyyy/DK/jelly/DK_pan/02_quast/$id/contigs_reports/contigs_report_${id}-500.unaligned.info|sed '1d' >000unid/$id
    done
    
    cat ../../fqid|while read id
    do
    python tj.py 000unid/$id 001unid/$id 
    python tq1.py 001unid/$id ../03_unmapp/${id}_unalign_500.fa 002unmap/$id.fa
    done
    

    关于不同软件组装,如spadas、soapdenovo、megahit等组装效果对结果的影响会在后面的分析中检测。

    相关文章

      网友评论

          本文标题:未比对上序列的提取遇到的问题及解决策略

          本文链接:https://www.haomeiwen.com/subject/lbhnadtx.html