美文网首页群体遗传学走进转录组
MISA+Primer3设计SSR引物(二):修改脚本使其便于批

MISA+Primer3设计SSR引物(二):修改脚本使其便于批

作者: 学生信的大叔 | 来源:发表于2021-11-16 19:08 被阅读0次

有看到文章里分析几个叶绿体基因组SSR位点的,但是MISA+Primer3 直接批量跑的话,所有脚本、输入和输出文件全放在一个文件夹里(由misa脚本所制约),过于杂乱。想让其分开的话就不得不修改下脚本。本文提供下修改misa 脚本思路(最好还是先熟悉下misa脚本)。

没系统学习过perl,用词可能不准,大家领会精神即可。
下面开始胡说八道。

  1. 需要修改的脚本

misa.plp3_in.pl, p3out.pl

  1. 需要的知识点
  • 知识点一: $ARGV[0], $ARGV[1] 等是perl脚本中顺序传参的变量,类似shell脚本中的$1,$2… , 只不过perl中式从0开始,作为传递参数的第一个变量。@ARGV 在知识点二中表示数组@ARGV的物理大小。
  • 知识点二:misa.pl脚本中
if (@ARGV == 0)
  {
  open (IN,"<$0");
  while (<IN>) {if (/^\#\# (.*)/) {$message .= "$1\n"}};
  close (IN);
  die $message;
  };

这部分代码意思就是:执行脚本,当参数数量为0时,将该脚本中以 两个# 开头的行作为错误信息(或者说时帮助信息)输出到标准输出。

  • 知识点三:模块File::Basename

用其中的basename()函数 获取文件名,便于输出文件命名。

  1. 思路:针对三个知识点分别作出修改
  • 关于知识点一:

    • misa.plmisa.in配置文件指向路径写活;输出结果文件前加传参变量,加入一个用于结果路径的传参变量,将结果文件路径写活。最终该脚本需要传入三个参数。

    运行示例:perl ./misa/misa.pl ./misa/misa.ini ./fasta/seqs.fasta ./results/

    一般我们是将misa和misa.ini脚本放在一个文件夹下的,但是我不会在perl中写这一部分(获取当前将本路径),就只能单独作为变量了。

    • p3_in.pl中实际需要的文件是seqs.fasta.misa 文件和 seqs.fasta 文件,所以,在seqs.fasta 位置处加入一个传参变量;输出结果文件前加入一个用于结果路径的传参变量。最终该脚本需要传入三个参数。

    运行示例: perl ./msia/p3_in.pl ./results/seqs.fasta.misa ./fasta/seqs.fasta ./results/

    • p3_out.pl中修改类似p3_in.pl

    运行示例:perl p3_out.pl ./results/seqs.fasta.p3out ./results/seqs.fasta.misa ./results/

    另一种改法:如果是将所有结果放到一个文件中,其实可以将上面的参数精简为2个,一个是结果路径./results/,一个是序列名称seqs.fasta ,但是个人感觉这样有点乱,不能从参数中直观获取所需要的输入文件,也就没这么改。

  • 关于知识点二: p3_in.plp3_out.pl 中并不自带帮助信息。通过知识点一的修改,路径就有些乱了,所以利用知识点二给两个脚本添加帮助信息。

    • 将需要作为帮助信息的内容以##作为一行的开头,后面添加帮助信息内容即可。
    • 经过知识点一中的修改,misa.pl p3_in.plp3_out.pl 都带有了三个参数,所以可以将知识点二中的命令稍作修改。如果传入参数不是3个,打印帮助信息。
if (@ARGV != 3)
  {
  open (IN,"<$0");
  while (<IN>) {if (/^\#\# (.*)/) {$message .= "$1\n"}};
  close (IN);
  die $message;
  };

脚本内,我们只限定了3个参数数量,并没有检查文件或者文件夹是否存在。这部分检查可以放到shell批量脚本中进行。

  • 关于知识点三:主要是将带有路径的文件参数,去掉路径,获取文件名。

p3_in.pl 为例,修改后其第一个参数$ARGV[0]./results/seqs.fasta.misa

原脚本中:

open (IN,"<$ARGV[0]") || die ("\nError: Couldn't open misa.pl results file (*.misa) !\n\n");

my $filename = $ARGV[0];
$filename =~ s/\.misa//;

将上面内容修改为:

open (IN,"<$ARGV[0]") || die ("\nError: Couldn't open misa.pl results file (*.misa) !\n\n");
use File::Basename;
my $filename = $ARGV[0];       #此时$filename=./results/seqs.fasta.misa
$filename=basename("$ARGV[0]") #此时$filename=seqs.fasta.misa
$filename =~ s/\.misa//;       #此时$filename=seqs.fasta

此时便获取了$filename 便于命名结果文件。

为了使代码更简洁,可以合并第3,4行,修改为:

open (IN,"<$ARGV[0]") || die ("\nError: Couldn't open misa.pl results file (*.misa) !\n\n");
use File::Basename;
my $filename = basename("$ARGV[0]"); #此时$filename=seqs.fasta.misa
$filename =~ s/\.misa//;  

然后模仿着再修改misa.plp3_out.pl

如果你不想按知识点三内容修改,可以按照知识点一修改,不过要传入更多的变量用于输出文件,但这无疑会增加shell脚本的出错率。

  1. 小结

顺序传参、增加的传参变量都增加了shell脚本出错率,如果不是自己修改,可能还是觉得有些乱的。梳理脚本后可以写好批量运行的shell脚本,减少修改参数,使其不那么凌乱。但不管怎么说,修改后的文件,批量运行后可以将

输入文件、脚本和结果文件分开了。后期还可以加入长选项用于指定参数。

下一篇内容将更新搭配这次修改的shell脚本,只需要修改如下几个参数就可以完成一次任务。脚本还可以支持断点接续。批量模式只需要将$FASTA作为shell脚本的$1即可批量运行。

##path of programe
MISA_PATH=./misa
PRIMER3_CORE=primer3_core
##input file
FASTA=./fasta/test.fa
##output path
RESULT_PATH=./results

参考: https://www.jianshu.com/p/33b835f79713

相关文章

网友评论

    本文标题:MISA+Primer3设计SSR引物(二):修改脚本使其便于批

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