免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yanglc2013
打印 上一主题 下一主题

20积分悬赏,求个perl程序,新手,写了好几个都无果。 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2013-03-28 18:38 |只看该作者
回复 19# rubyish
能加上注释吗

论坛徽章:
0
32 [报告]
发表于 2013-03-28 18:40 |只看该作者
回复 32# picbhan
不考虑正负啊。我只是想学学,应该怎么改程序。加上注释,我就可以看明白了。有些地方我不太懂。


   

论坛徽章:
0
33 [报告]
发表于 2013-03-28 19:36 |只看该作者
本帖最后由 picbhan 于 2013-03-28 19:58 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my (%ref, %data);

  5. open my $in , '<', 'refGene.txt'
  6.     or die "Can't open 'refGene.txt' for reading. $!\n";
  7. while (<$in>) {
  8.     chomp;
  9.     my @t = split;
  10.     push @{$ref{$t[1]}}, [@t];
  11. }
  12. close $in;

  13. open $in , '<', 'lncipedia_location.txt'
  14.     or die "Can't open 'lncipedia_location.txt' for reading. $!\n";
  15. while (<$in>) {
  16.     chomp;
  17.     my @t = split;
  18.     push @{$data{$t[1]}}, [@t];
  19. }
  20. close $in;

  21. open my $ref_include_inc , '>', 'ref_include_inc.txt'
  22.     or die "Can't create 'ref_include_inc.txt' for writing. $!\n";
  23. open my $inc_include_ref , '>', 'inc_include_ref.txt'
  24.     or die "Can't create 'inc_include_ref.txt' for writing. $!\n";
  25. open my $non_include , '>', 'non_include.txt'
  26.     or die "Can't create 'non_include.txt' for writing. $!\n";
  27. open my $overlap , '>', 'overlap.txt'
  28.     or die "Can't create 'overlap.txt' for writing. $!\n";
  29. open my $to , '>', 'ref_sorted.txt' or die "Can't create  for writing. $!\n";


  30. while (my ($chr, $v) = each %ref) {
  31.     # sort region using start sites, if equal, using end sites
  32.     my @ref_data = sort {$a->[2] <=> $b->[2] or $a->[3] <=> $b->[3]} @$v;
  33.     # output sorted refGenes
  34.     print {$to} join("\t", @$_) . "\n" for @ref_data;
  35.     # if no such chromosome in inc, ignore and try next chr
  36.     next unless exists $data{$chr};
  37.     # sort region using start sites, if equal, using end sites
  38.     my @inc_data = sort {$a->[2] <=> $b->[2] or $a->[3] <=> $b->[3]} @{$data{$chr}};
  39.     my @store; # use to store some ref regions, since inc regions may overlapped
  40.     for (@inc_data) {
  41.         my @id = @$_;
  42.         if (@ref_data) {
  43.             my $result; # one of ref_include_inc, inc_include_ref, overlap or undef
  44.             while (@ref_data) {
  45.                 my @rd = @{+shift @ref_data};
  46.                 # igore genes on the left side of inc region
  47.                 next if $rd[3] < $id[2];
  48.                 # record each overlapped genes
  49.                 push @store, [@rd];
  50.                 # stop when this gene is on the right side of inc region
  51.                 last if $rd[2] > $id[3];
  52.                 # this gene must overlap with this inc region
  53.                 if ($id[2] >= $rd[2] && $id[3] <= $rd[3]) {
  54.                     $result = 'ref_include_inc';
  55.                 }
  56.                 elsif ($rd[2] >= $id[2] && $rd[3] <= $id[3]) {
  57.                     $result = 'inc_include_ref';
  58.                 }
  59.                 else {
  60.                     $result = 'overlap';
  61.                 }
  62.             }
  63.             # output result
  64.             if ($result) {
  65.                 if ($result eq 'ref_include_inc') {
  66.                     print {$ref_include_inc} join("\t", @id), "\n";
  67.                 }
  68.                 elsif ($result eq 'inc_include_ref') {
  69.                     print {$inc_include_ref} join("\t", @id), "\n";
  70.                 }
  71.                 else {
  72.                     print {$overlap} join("\t", @id), "\n";
  73.                 }
  74.             }
  75.             else { # if $result is undef, means no overlapped genes
  76.                 print {$non_include} join("\t", @id), "\n";
  77.             }
  78.             
  79.             # put this genes back into @ref_data, use to check next inc region
  80.             unshift @ref_data, @store;
  81.             @store = ();
  82.         }
  83.         else {
  84.             # no regions in ref left, print all regions left in inc to non_include
  85.             print {$non_include} join("\t", @id), "\n";
  86.             next;
  87.         }
  88.     }
  89.     delete $data{$chr};
  90. }

  91. while (my ($chr, $v) = each %data) {
  92.     my @inc_data = @$v;
  93.     for (@inc_data) {
  94.         print {$non_include} join("\t", @$_), "\n";
  95.     }
  96. }

  97. close $to;
  98. close $ref_include_inc;
  99. close $inc_include_ref;
  100. close $non_include;
  101. close $overlap;
复制代码

论坛徽章:
0
34 [报告]
发表于 2013-03-28 20:43 |只看该作者
回复 35# picbhan

这个程序思路确实很好,希望能加上注释。这样比较容易看。

论坛徽章:
0
35 [报告]
发表于 2013-03-28 20:51 |只看该作者
回复 35# picbhan

抱歉啊,刚复制到editplus才看到有注释,非常感谢啊。


   

论坛徽章:
0
36 [报告]
发表于 2013-03-29 09:42 |只看该作者
回复 36# yanglc2013


    还可以更改一下,在判断是否属于包含还是overlap的时候加上last,这样可以在同一个inc的region与refgene存在多种情况时优先选择包含的情况,也可以减少运行时间。
  1. if ($id[2] >= $rd[2] && $id[3] <= $rd[3]) {
  2.                     $result = 'ref_include_inc';
  3.                     last;
  4.                 }
  5.                 elsif ($rd[2] >= $id[2] && $rd[3] <= $id[3]) {
  6.                     $result = 'inc_include_ref';
  7.                     last;
  8.                 }
复制代码

论坛徽章:
0
37 [报告]
发表于 2013-03-29 14:49 |只看该作者
回复 38# picbhan

大哥,输出结果中,有两种情况(non_include和overlap)少了数据,我没找到原因。请教你下。

    test for help.rar (3.17 KB, 下载次数: 3)

论坛徽章:
0
38 [报告]
发表于 2013-03-29 15:06 |只看该作者
picbhan 发表于 2013-03-28 09:28
回复 8# dahe_1984


我自己写的是把ref中ch*作为Key值,然后foreach($ref[2]..$ref[3]),$hash{$[1]}++;  

Inc中判断exists($hash{}), 然后判断in,out,还是overlap, 生成的时候就跑死了,跟您的程度无关。

论坛徽章:
0
39 [报告]
发表于 2013-03-29 18:28 |只看该作者
本帖最后由 picbhan 于 2013-03-29 18:29 编辑

回复 40# dahe_1984


    我只能说你太暴力,比inc中每一个region对ref中整个chr*的比较还要暴力。呵呵

论坛徽章:
0
40 [报告]
发表于 2013-03-29 18:49 |只看该作者
回复 39# yanglc2013


    不是因为少了,而是inc中每个region我都确保只输出到一个文件中,没有输出到多个文件中,如果某个region与ref中的gene存在完全包含关系,就不会输出到overlap中。比如你说overlap中少了 lnc-TAF12-1:4        chr2        9        15        - , 那是因为ref中 NM_001097613        chr2        11 13        -        1697完全落在了inc的区间内,所以那个region就只输出到了inc_include_ref这个文件中。你如果要想一个region输出到多个文件中(对每种情况都输出)的话,可以稍微改一下代码就行,把标量$result改为%result,然后用不同情况下的字符串作为key,最近依据key值输出到不同文件中就行。但是这种情况下不能在找到包含关系之后就立即last(就是我最后帮你加的那两个last语句)。

另外你说non_include 少了 lnc-HES5-1:2        chr3        14 100        - ,这是因为你说不需要考虑正负链,那么这个region与ref中 NM_016505        chr3        50 128        +        827 是overlap的,所以输出在overlap中。
你再好好检查下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP