草庐IT

hifiasm 单倍型组装: 挂载后手动调整嵌合错误

jcf的学习笔记 2023-09-21 原文
记录下如何手动解决hifiasm 装单倍型失败的例子, 许多之前做过的分析,写过的脚本,没整理都有点模糊了,遇到同样的问题又要重新想一遍。所以还是对典型问题多记录一下,帮助自己回忆

问题来源:

hifiasm 的HIC 模式可以分出两套hap1和hap2,而且质量较高,当然如果没有父母本的二代测序,仅用HIC mode分单倍型,在某些区域是有可能由于物种杂合度过低而分不出来的,我用同一套参数组装挂载了两个物种,其中杂合度高的物种分单倍型hap的效果非常好,但另一个杂合度低的物种在调图时遇到了这样的情况

我是将两套hap cat到一起挂载的,这样可以识别出一些潜在的组装错误。 在这两张hic图中,可以发现有些contig的部分片段和两个单倍型都有着很强的互作,在juicer调图的时候,我把他当作污染或者杂质将它从scaffold上切下来放到contig里面了。
e93ca7cb744ed8ace0baf68e4b4e1c6.png

a1c8ee0f7b7c96101229b28d72affc4.png
在挂载结束后,我将这两个物种的两个hap与已发表的近缘物种做共线性发现这是个组装错误,是hifiasm在面对杂合度很低的片段时,将本应分成两个单倍型的片段仅仅组装出了一个单倍型,这样在挂载的时候,这个片段和两套单倍型都有很强的互作,下图所示
image.png

问题

因此这里应该把这个剪下来的片段*2,手动插入到这两个scaffold中间。

实现方法

提取这三个scaffold, 将他们根据500个N拆成contig,做比对,看看这个嵌合的片段应该插入到哪里,代码如下
#!/usr/bin/envs perl -w

use strict;

my $usage=<<USAGE;
###usage:

perl $0 target_scaffold_name_list.txt scaffolding.fasta > result.fa


###Explanation:

target_scaffold_name_list.txt:
---Start---
HiC_scaffold_19
HiC_scaffold_20
---End---

scaffold.fasta
---Start---
>HiC_scaffold_1
...
...
>HiC_scaffold_19
...
>HiC_scaffold_20
...
---End---


USAGE

die "$usage\n" unless @ARGV == 2;

my $list=shift;
my $fa=shift;

my %name;

open IN, "$list" or die "";

while (<IN>){
        chomp;
        $name{$_}=1;
}

close IN;

my ($seqID, %seq);
open FA, "$fa" or die "";

while (<FA>){
        chomp;
        if (m/^>(\S+)/){$seqID=$1;}
        else{$seq{$seqID}.=$_;}
}

close FA;

foreach my $tar_ID (sort keys %name){
        die "target_id can't be found in scaffolding.fa, please check Names of target_list\n" unless my $seq=$seq{$tar_ID};
        my $N=("N") x 500;
        $seq=~ s/$N/1/g;
        my @fragment=split /1/, $seq;
        my $num=1;
        foreach my $contig (@fragment){
                next if $contig eq "";
                print ">${tar_ID}_${num}\n$contig\n";
                $num++;
        }
}

第一个输入文件为所需提取的scaffold名称如下图,第二个为总的scaffold.fasta,结果文件是如下图
image.png

image.png
再做共线性
Ptri_Chr06-21_22_1202.PNG
观察共线性图可知,我们可以将这些contig 重新按照正确的顺序用N连接,需要反向的contig则在其名字后面标注":R"即可,文件如下
image.png
代码如下
#!/usr/bin/envs perl -w

use strict;

my $usage=<<USAGE;

#usage:

perl $0 contig_name_for_scaffolding.list total_contig.fa > after_joint.fa

#explanation

contig_name_for_scaffolding.list
---start---
HiC_scaffold_21_1 HiC_scaffold_21_2
HiC_scaffold_22_2 HiC_scaffold_22_4 HiC_scaffold_1202_7
---end---


USAGE

die "$usage\n" unless @ARGV == 2;

my %hash;
my $ad=\%hash;
my @name;

open ID, "$ARGV[0]" or die "";

while (<ID>){
        chomp;
        my @line = split/\s+/, $_;
        my $name= shift @line;
        push @name, $name;
        push @{$ad -> {$name}}, @line;


}

close ID;


my ($seqID, %seq);
open FA, "$ARGV[1]" or die "";

while (<FA>){
        chomp;
        if (m/>(\S+)/){$seqID=$1;}
        else{$seq{$seqID}.=$_;}
}

close FA;

my $N=("N") x 500;
#$seq=~ s/$N/1/g;

foreach my $id (keys %hash){
        my @line = @{$hash{$id}};
        my @seq;
        foreach my $contig ( @line ){
                if ($contig=~ m/:R$/){
                        $contig =~s/:R//;
                        my $seq = $seq{$contig};
                        $seq=~ tr/ATCGagtc/TAGCtcag/;
                        $seq=reverse ($seq);
                        push @seq, $seq;
                }else{
                        my $seq = $seq{$contig};
                        push @seq, $seq;
                }
        }
        my $scaffold=join "$N", @seq;
        print ">$id\n$scaffold\n";
}
再做共线性:问题解决。这里我们注意到HiC_scaffold_22中间是有一块空白的,这是因为我用的是last比对软件,由于我们是直接将一个片段复制成两个片段,因此这个片段被last软件过滤掉了,所以图中没有任何共线性,但其实他和HiC_scaffold_21的片段是完全一样的。这里用last的话,一定要把过滤1e-5去掉,不然我们复制进去的两个片段是没有任何映射的。
image.png

问题解决

hifiasm这个软件速度快,效果好,还能自动装出两套单倍型,是现在hifi数据的热门选择之一,但这个模式也不是完美的,他在某些纯合度片段也会分不开两套单倍型,当然如果有父本母本的二代reads,用hifiasm的另一个模式的话效果应该比hic 模式好很多。这里主要记录了怎么手动将这种大片段的嵌合错误纠正过来。

有关hifiasm 单倍型组装: 挂载后手动调整嵌合错误的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  3. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  4. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  5. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  6. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  7. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  8. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  9. arrays - 这是 Ruby 中 Array.fill 方法的错误吗? - 2

    这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]

  10. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

随机推荐