- 论坛徽章:
- 1
|
本帖最后由 chenhao392 于 2014-12-16 05:15 编辑
可能的小老乡你好.
既然你是洛阳上的本科,我猜我们多半 算半个老乡。我也有高中时代的哥们在那所大学读本科。看在我们是老乡的份上,看在你不停的积极讨论的份上,我也就不潜水了。程序大概给你写完了,请查收。
我理解你的需求是:根据OrthoMCL计算出的同源基因名称,从不同的植物的基因序列 (200 Gb)中,拿到OrthoMCL提到的基因,并把一个同源基因组的存放在一个文件里。
但是!
每一次提问前,请一定要想一想自己的问题是否问的够有效率。这次你忽略了几个比较关键的信息:
1. Step 1-3 似乎是你自己的programming想法。其实不妨把整个需求描述出来,也许别人有更好的办法呢? 比如我的code,用到了hash of hash.
2. 一个基因会有多个isoforms,你的ortholog 信息是gene的,而你提供的Allseq.fa 是根据isoform的,直接的ID当然一个match都没有。我的code假设你的Allseq.fa 里的isoform是加了 . (点) 或者 _(下划线) 的。这cover了玉米,水稻和拟南芥,并不一定cover了所有的情况。所以,这个代码你可能还要改。
3. Again, 一个gene有多个isoforms,要选哪一个呢?这要看你的研究课题了。我知道通常会选最长的那一个。
4. 请以后尽量学习用linux,你用windows 下载的Allseq.fa 的换行符,需要多用一个chop,将来记不住自己的代码干了什么的话,会出错。
5. 最重要的是,你真的理解你提供的文件么?
Quote- 其中要求生成的ID文件如下:
- APK_ORTHOMCL0
- 416
- 2
- rice sorghum
- LOC_Os04g04140
- LOC_Os05g29160
- LOC_Os10g02640
复制代码 在我看来,数字416 是说这个ortholog在这些物种里一共有多少个copy,数字 2是说有多少个物种里有这个ortholog,在上文中是rice(水稻)和 sorghum(高粱)。我的程序已经考虑了这一点,会从类似 LOC_Os04g04140 的位置读取。
请用严谨认真的态度来做科研和在版面上提出问题。将来perl玩熟练的话,也请回到版面上帮助别人。
此致,
你的半个老乡: chenhao392
run- perl orthoMCL_picker.pl orthol-msu.txt Allseq.fa
复制代码 code- #!/usr/bin/perl
- use strict;
- use warnings;
- my %id;
- my %seq;
- #load orthoMCL result from MSU
- open FILE, "<$ARGV[0]" or die "$!\n";
- while(<FILE>){
- chomp;
- #skip header line
- if($. == 1){
- next;
- }
- #get ortholog groups
- my ($orthoID,undef,$speciesCount,@line)=split(/\s+/,$_);
- for(my $i=$speciesCount;$i<scalar(@line);$i++){
- $id{$orthoID}{$line[$i]}="";
- $seq{$line[$i]}="";
- }
- }
- close FILE;
- #scanning through the seq
- my $switch=0;
- my $id="";
- open FILE, "<$ARGV[1]" or die "$!\n";
- while(<FILE>){
- chomp;
- chop;
- if($_ =~ />(.*?)\s.*/){
- $switch =0;
- $id=$1;
- $id=~s/[\._].*//;
- if(defined $seq{$id}){
- $switch = 1;
- }
- }
- elsif($_ =~ /^[ATCGatcg]/ && $switch == 1){
- $seq{$id}.=$_;
- }
- }
- close FILE;
- foreach my $orthoID(keys %id){
- open OUT, ">$orthoID.fa" or die "$!\n";
- foreach my $id(keys %{$id{$orthoID}}){
- print OUT ">$id\n$seq{$id}\n";
- }
- close OUT;
- }
复制代码 |
|