对整个文件夹进行codeml,同时执行几个进程

#!/usr/bin/perl -w

# input: directory(contain files to be codeml)
#        numberofproceses(how many processes to produce)
#        tempDirectoryName(child processes will work under
#                          directory based on this name)
# output: output files will be in the same directory as input files;
#
# input files must end with .codeml

use strict;
use warnings;
my($dir,$num,$tempDir)=@ARGV;
die ("$0: dir numberOfProcesses tempDirectoryName") unless($dir && $num && $tempDir);
$dir=~s///$//;
# read control file
my $ctlFile;
open(my $f,"<codeml.ctl") or die "cannot find codeml.ctl";
{
    local $/;
    $ctlFile=<$f>;
}
close($f);
# distribute files
opendir(my $d,$dir) or die $!;
my @files=sort grep {//.codeml$/} readdir($d);
close($d);
my $fileNum=@files;
my $fileno=0;
my @processes;
for(my $i=0;$i<$num;$i++)
{
    # assign files
    $processes[$i]{'startNo'}=$fileno;
    if($fileno+int($fileNum/$num)>$fileNum)
    {
        $fileno=$fileNum;
    }
    else
    {
        $fileno+=int($fileNum/$num);
    }
    $processes[$i]{'endNo'}=$fileno-1;
    # make directories for child processes;
    if(-e "${tempDir}_$i")
    {
        die "${tempDir}_$i exists!! aborted./n";
    }
    else
    {
        `mkdir ${tempDir}_$i`;
    }
}
# ready to work
my $pid;
my @child_pid;
my $id;
for($id=0;$id<$num;$id++)
{
    $pid=fork();
    if($pid==0){last;}
    else{push(@child_pid,$pid);}
}
# child procese  $id
if($pid==0)
{
    print STDERR "$id pid=$$ get to work/n";
    for(my $fileid=$processes[$id]{'startNo'};$fileid<=$processes[$id]{'endNo'};$fileid++)
    {
        my $myctlFile=$ctlFile;
        `rm ${tempDir}_$id/* 1>>${tempDir}_$id.log`;
        open($f,">${tempDir}_$id/codeml.ctl") or die $!;
        my $newFileName="$dir/$files[$fileid]";
        #$myctlFile=~s/SEQFILE/$newFileName/g;
        print $f $myctlFile;
        close($f);
        my $pwd=`pwd`;
        chomp($pwd);
        my $exec="cd $pwd/${tempDir}_$id;".
                 "cp /"$dir/$files[$fileid]/" SEQFILE;".
                 "codeml codeml.ctl 1>>../${tempDir}_$id.log;".
                 "mv mlc /"$dir/$files[$fileid].mlc/"";
        `$exec`;
    }
    print STDERR "$id pid=$$ finished./n";
    exit(0);
}
# parent process
if($pid!=0)
{
    while(wait()!=-1){}
    print STDERR "All finished/n";
    exit(0);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值