1. ncRNA

非编码RNA(Non-coding RNA, ncRNA) 包括rRNA,tRNA,snRNA,snoRNA 和microRNA 等不编码蛋白质的RNA,它们转录后直接在RNA 水平上就能行使各自的生物学功能,并不需要翻译成蛋白质。

2. 软件

tRNA注释

一般用tRNAscan-SE,老牌软件。

rRNA注释

可用RNAMMER注释。但需要edu邮箱下载。

或者用barrnap,开源软件,也非常好用。

其他ncRNA注释

Infernal软件+Rfam数据库是注释其他复杂ncRNA的常用组合,它的结果同时包含了tRNA,rRNA,snRNA,snoRNA和miRNA等。

对比以上两款软件的tRNA和rRNA结果,Infernal得到的结果差不太多。所以如果不重点研究ncRNA,用这个组合也可。

3. 注释

tRNA

以tRNAscan为例:

  1. tRNAscan-SE genome.fa -o tRNA.out -f tRNA.ss -m tRNA.stats

tRNA.stats文件中包含了tRNA预测的结果统计。



可通过脚本将tRNA.out整理为gff3。

  1. perl convert_tRNAScanSE_to_gff3.pl -i tRNA.out >tRNAscan.gff3

PS:convert_tRNAScanSE_to_gff3.pl 可参考:github: https://github.com/jorvis/biocode/blob/master/gff/convert_tRNAScanSE_to_gff3.pl

rRNA

以barrnap为例:

  1. barrnap-master/bin/barrnap \
  2. --kingdom euk \ #euk bac arc mito
  3. --threads 10 \
  4. --outseq rRNA.fa \ #rRNA结果序列
  5. genome.fa >rRNA.gff3 #rRNA gff结果

PS:不建议用conda安装使用,会报错。如[barrnap] ERROR: nhmmer failed to run - Error: Invalid alphabet type in target for nhmmer. Expect DNA or RNA.

得到的结果可进一步统计各核糖体亚基数目。

  • 细菌bacteria (5S,23S,16S)
  • 古菌archaea (5S,5.8S,23S,16S)
  • 多细胞生物线粒体metazoan mitochondria (12S,16S)
  • 真核生物eukaryotes (5S,5.8S,28S,18S)

snRNA、miRNA等

首次下载安装infernal和Rfam数据库。infernal使用conda方便,Rfam数据库重点是Rfam.cm和Rfam.clanin的下载:

  1. # install the package with conda
  2. conda install -c bioconda infernal
  3. # download Rfam data
  4. wget ftp://ftp.ebi.ac.uk/pub/databases/Rfam/CURRENT/Rfam.cm.gz
  5. gunzip Rfam.cm.gz
  6. wget ftp://ftp.ebi.ac.uk/pub/databases/Rfam/CURRENT/Rfam.clanin
  7. # cmpress 索引
  8. cmpress Rfam.cm

然后使用cmscan注释ncRNA:

  1. genome_total=400000000 #基因组大小
  2. CMnumber=`grep "ACC" /database/Rfam/Rfam.cm|wc -l`
  3. Z=`echo $genome_total*2*$CMnumber/1000000 |bc`
  4. #echo $Z
  5. cmscan -Z $Z --cut_ga --rfam --nohmmonly --tblout genome.tblout \
  6. --fmt 2 --cpu 30 --clanin /database/Rfam/Rfam.clanin \
  7. /database/Rfam/Rfam.cm genome.fa > genome.cmscan

主要有两个结果文件genome.cmscan(比对结果)和genome.tblout(table格式)。要想得到进一步分类统计结果,需要做一些处理。

4. snRNA、miRNA等结果的统计

首先,提取必须的列和非重叠区域或重叠区域中得分高的区域。

  1. awk 'BEGIN{OFS="\t";}{if(FNR==1) print "target_name\taccession\tquery_name\tquery_start\tquery_end\tstrand\tscore\tEvalue"; if(FNR>2 && $20!="=" && $0!~/^#/) print $2,$3,$4,$10,$11,$12,$17,$18; }' my-genome.tblout >genome.tblout.final.xls

然后,需要根据Rfam数据库的注释来对结果进行分类。Rfam的注释可从官网拷贝(命名tmp):https://rfam.xfam.org/search/type



  1. # 拆分第三列
  2. less tmp | awk 'BEGIN {FS=OFS="\t"}{split($3,x,";");class=x[2];print $1,$2,$3,$4,class}' > rfam_anno.txt

最后统计各类ncRNA注释结果。

  1. awk 'BEGIN{OFS=FS="\t"}ARGIND==1{a[$2]=$5;}ARGIND==2{type=a[$1]; if(type=="") type="Others"; count[type]+=1;}END{for(type in count) print type, count[type];}' rfam_anno.txt genome.tblout.final.xls

统计结果如下:

  1. riboswitch 1
  2. tRNA 813
  3. ribozyme 1
  4. Others 217
  5. miRNA 1948
  6. antisense 7
  7. rRNA 1451
  8. sRNA 1
  9. snRNA 667

也可将注释结果整理为gff3文件:

  1. perl infernal-tblout2gff.pl --cmscan --fmt2 genome.tblout >genome.infernal.ncRNA.gff3

附infernal-tblout2gff.pl

  1. #!/usr/bin/env perl
  2. # infernal-tblout2gff.pl: convert cmsearch or cmscan tblout files to GFF format
  3. # an important point of above ref:
  4. # "Start is always less than or equal to end"
  5. # EPN, Fri Jun 7 11:07:38 2019
  6. #
  7. #
  8. use strict;
  9. use warnings;
  10. use Getopt::Long;
  11. my $in_tblout = ""; # name of input tblout file
  12. my $usage;
  13. $usage = "infernal-tblout2gff.pl\n\n";
  14. $usage .= "Usage:\n\n";
  15. $usage .= "infernal-tblout2gff.pl [OPTIONS] <cmsearch tblout file>\n\tOR\n";
  16. $usage .= "infernal-tblout2gff.pl --cmscan [OPTIONS] <cmscan tblout file>\n\tOR\n";
  17. $usage .= "infernal-tblout2gff.pl --cmscan --fmt2 [OPTIONS] <cmscan --fmt 2 tblout file>\n\n";
  18. $usage .= "\tOPTIONS:\n";
  19. $usage .= "\t\t-T <n> : minimum bit score to include is <n>\n";
  20. $usage .= "\t\t-E <x> : maximum E-value to include is <x>\n";
  21. $usage .= "\t\t--cmscan : tblout file was created by cmscan\n";
  22. $usage .= "\t\t--source <s> : specify 'source' field should be <s> (e.g. tRNAscan-SE)\n";
  23. $usage .= "\t\t--fmt2 : tblout file was created with cmscan --fmt 2 option\n";
  24. $usage .= "\t\t--all : output all info in 'attributes' column [default: E-value]\n";
  25. $usage .= "\t\t--none : output no info in 'attributes' column [default: E-value]\n";
  26. $usage .= "\t\t--desc : output desc field in 'attributes' column [default: E-value]\n";
  27. $usage .= "\t\t--version <s>: append \"-<s>\" to 'source' column\n";
  28. $usage .= "\t\t--extra <s> : append \"<s>;\" to 'attributes' column\n";
  29. $usage .= "\t\t--hidedesc : do not includ \"desc\:\" prior to desc value in 'attributes' column\n";
  30. my $do_minscore = 0; # set to '1' if -T used
  31. my $do_maxevalue = 0; # set to '1' if -E used
  32. my $minscore = undef; # defined if if -T used
  33. my $maxevalue = undef; # defined if -E used
  34. my $do_cmscan = 0; # set to '1' if --cmscan used
  35. my $do_fmt2 = 0; # set to '1' if --fmt
  36. my $do_all_attributes = 0; # set to '1' if --all
  37. my $do_no_attributes = 0; # set to '1' if --none
  38. my $do_de_attributes = 0; # set to '1' if --desc
  39. my $version = undef; # defined if --version used
  40. my $extra = undef; # defined if --extra used
  41. my $do_hidedesc = 0; # set to 1 if --hidedesc used
  42. my $opt_source = undef; # set to <s> if --source <s> used
  43. &GetOptions( "T=s" => \$minscore,
  44. "E=s" => \$maxevalue,
  45. "cmscan" => \$do_cmscan,
  46. "source=s" => \$opt_source,
  47. "fmt2" => \$do_fmt2,
  48. "all" => \$do_all_attributes,
  49. "none" => \$do_no_attributes,
  50. "desc" => \$do_de_attributes,
  51. "version=s" => \$version,
  52. "extra=s" => \$extra,
  53. "hidedesc" => \$do_hidedesc);
  54. if(scalar(@ARGV) != 1) { die $usage; }
  55. my ($tblout_file) = @ARGV;
  56. if(defined $minscore) { $do_minscore = 1; }
  57. if(defined $maxevalue) { $do_maxevalue = 1; }
  58. if($do_minscore && $do_maxevalue) {
  59. die "ERROR, -T and -E cannot be used in combination. Pick one.";
  60. }
  61. if(($do_all_attributes) && ($do_no_attributes)) {
  62. die "ERROR, --all and --none cannot be used in combination. Pick one.";
  63. }
  64. if(($do_all_attributes) && ($do_de_attributes)) {
  65. die "ERROR, --all and --desc cannot be used in combination. Pick one.";
  66. }
  67. if(($do_no_attributes) && ($do_de_attributes)) {
  68. die "ERROR, --none and --desc cannot be used in combination. Pick one.";
  69. }
  70. if(($do_fmt2) && (! $do_cmscan)) {
  71. die "ERROR, --fmt2 only makes sense in combination with --cmscan";
  72. }
  73. if((defined $opt_source) && (defined $version)) {
  74. die "ERROR, --source and --version are incompatible";
  75. }
  76. if(! -e $tblout_file) { die "ERROR tblout file $tblout_file does not exist"; }
  77. if(! -s $tblout_file) { die "ERROR tblout file $tblout_file is empty"; }
  78. my $source = ($do_cmscan) ? "cmscan" : "cmsearch";
  79. if(defined $version) { $source .= "-" . $version; }
  80. if(defined $opt_source) { $source = $opt_source; }
  81. open(IN, $tblout_file) || die "ERROR unable to open $tblout_file for reading";
  82. my $line;
  83. my $i;
  84. while($line = <IN>) {
  85. if($line !~ m/^\#/) {
  86. chomp $line;
  87. my @el_A = split(/\s+/, $line);
  88. my $nfields = scalar(@el_A);
  89. if((! $do_fmt2) && ($nfields < 18)) {
  90. die "ERROR expected at least 18 space delimited fields in tblout line (fmt 1, default) but got $nfields on line:\n$line\n";
  91. }
  92. if(($do_fmt2) && ($nfields < 27)) {
  93. die "ERROR expected at least 27 space delimited fields in tblout line (fmt 2, --fmt2) but got $nfields on line:\n$line\n";
  94. }
  95. # ref Infernal 1.1.2 user guide, pages 59-61
  96. my $idx = undef;
  97. my $seqname = undef;
  98. my $seqaccn = undef;
  99. my $mdlname = undef;
  100. my $mdlaccn = undef;
  101. my $clan = undef;
  102. my $mdl = undef;
  103. my $mdlfrom = undef;
  104. my $mdlto = undef;
  105. my $seqfrom = undef;
  106. my $seqto = undef;
  107. my $strand = undef;
  108. my $trunc = undef;
  109. my $pass = undef;
  110. my $gc = undef;
  111. my $bias = undef;
  112. my $score = undef;
  113. my $evalue = undef;
  114. my $inc = undef;
  115. my $olp = undef;
  116. my $anyidx = undef;
  117. my $anyfrct1= undef;
  118. my $anyfrct2= undef;
  119. my $winidx = undef;
  120. my $winfrct1= undef;
  121. my $winfrct2= undef;
  122. my $desc = undef;
  123. if($do_fmt2) { # 27 fields
  124. $idx = $el_A[0];
  125. $seqname = ($do_cmscan) ? $el_A[3] : $el_A[1];
  126. $seqaccn = ($do_cmscan) ? $el_A[4] : $el_A[2];
  127. $mdlname = ($do_cmscan) ? $el_A[1] : $el_A[3];
  128. $mdlaccn = ($do_cmscan) ? $el_A[2] : $el_A[4];
  129. $clan = $el_A[5];
  130. $mdl = $el_A[6];
  131. $mdlfrom = $el_A[7];
  132. $mdlto = $el_A[8];
  133. $seqfrom = $el_A[9];
  134. $seqto = $el_A[10];
  135. $strand = $el_A[11];
  136. $trunc = $el_A[12];
  137. $pass = $el_A[13];
  138. $gc = $el_A[14];
  139. $bias = $el_A[15];
  140. $score = $el_A[16];
  141. $evalue = $el_A[17];
  142. $inc = $el_A[18];
  143. $olp = $el_A[19];
  144. $anyidx = $el_A[20];
  145. $anyfrct1= $el_A[21];
  146. $anyfrct2= $el_A[22];
  147. $winidx = $el_A[23];
  148. $winfrct1= $el_A[24];
  149. $winfrct2= $el_A[25];
  150. $desc = $el_A[26];
  151. for($i = 27; $i < $nfields; $i++) { $desc .= "_" . $el_A[$i]; }
  152. }
  153. else { # fmt 1, default
  154. $seqname = ($do_cmscan) ? $el_A[2] : $el_A[0];
  155. $seqaccn = ($do_cmscan) ? $el_A[3] : $el_A[1];
  156. $mdlname = ($do_cmscan) ? $el_A[0] : $el_A[2];
  157. $mdlaccn = ($do_cmscan) ? $el_A[1] : $el_A[3];
  158. $mdl = $el_A[4];
  159. $mdlfrom = $el_A[5];
  160. $mdlto = $el_A[6];
  161. $seqfrom = $el_A[7];
  162. $seqto = $el_A[8];
  163. $strand = $el_A[9];
  164. $trunc = $el_A[10];
  165. $pass = $el_A[11];
  166. $gc = $el_A[12];
  167. $bias = $el_A[13];
  168. $score = $el_A[14];
  169. $evalue = $el_A[15];
  170. $inc = $el_A[16];
  171. $desc = $el_A[17];
  172. for($i = 18; $i < $nfields; $i++) { $desc .= "_" . $el_A[$i]; }
  173. }
  174. # one sanity check, strand should make sense
  175. if(($strand ne "+") && ($strand ne "-")) {
  176. if(($do_fmt2) && (($seqfrom eq "+") || ($seqfrom eq "-"))) {
  177. die "ERROR problem parsing, you specified --fmt2 but tblout file appears to have NOT been created with --fmt 2, retry without --fmt2\nproblematic line:\n$line\n";
  178. }
  179. if((! $do_fmt2) && (($pass eq "+") || ($pass eq "-"))) {
  180. die "ERROR problem parsing, you did not specify --fmt2 but tblout file appears to have been created with --fmt 2, retry with --fmt2\nproblematic line:\n$line\n";
  181. }
  182. die "ERROR unable to parse, problematic line:\n$line\n";
  183. }
  184. if(($do_minscore) && ($score < $minscore)) {
  185. ; # skip
  186. }
  187. elsif(($do_maxevalue) && ($evalue > $maxevalue)) {
  188. ; # skip
  189. }
  190. else {
  191. my $attributes = "evalue=" . $evalue; # default to just evalue
  192. if($do_all_attributes) {
  193. if($do_fmt2) {
  194. $attributes .= sprintf(";idx=$idx;seqaccn=$seqaccn;mdlaccn=$mdlaccn;clan=$clan;mdl=$mdl;mdlfrom=$mdlfrom;mdlto=$mdlto;trunc=$trunc;pass=$pass;gc=$gc;bias=$bias;inc=$inc;olp=$olp;anyidx=$anyidx;anyfrct1=$anyfrct1;anyfrct2=$anyfrct2;winidx=$winidx;winfrct1=$winfrct1;winfrct2=$winfrct2;%s$desc", ($do_hidedesc ? "" : "desc="));
  195. }
  196. else {
  197. $attributes .= sprintf(";seqaccn=$seqaccn;mdlaccn=$mdlaccn;mdl=$mdl;mdlfrom=$mdlfrom;mdlto=$mdlto;trunc=$trunc;pass=$pass;gc=$gc;bias=$bias;inc=$inc;%s$desc", ($do_hidedesc ? "" : "desc="));
  198. }
  199. }
  200. elsif($do_no_attributes) {
  201. $attributes = "-";
  202. }
  203. elsif($do_de_attributes) {
  204. $attributes = $desc;
  205. }
  206. if(defined $extra) {
  207. if($attributes eq "-") { $attributes = ""; }
  208. elsif($attributes !~ m/\;$/) { $attributes .= ";"; }
  209. $attributes .= $extra . ";";
  210. }
  211. printf("%s\t%s\t%s\t%d\t%d\t%.1f\t%s\t%s\t%s\n",
  212. $seqname, # token 1: 'sequence' (sequence name)
  213. $source, # token 2: 'source'
  214. $mdlname, # token 3: 'feature' (model name) you may want to change this to 'ncRNA'
  215. ($strand eq "+") ? $seqfrom : $seqto, # token 4: 'start' in coordinate space [1..seqlen], must be <= 'end'
  216. ($strand eq "+") ? $seqto : $seqfrom, # token 5: 'end' in coordinate space [1..seqlen], must be >= 'start'
  217. $score, # token 6: 'score' bit score
  218. $strand, # token 7: 'strand' ('+' or '-')
  219. ".", # token 8: 'phase' irrelevant for noncoding RNAs
  220. $attributes); # token 9: attributes, currently only E-value, unless --all, --none or --desc
  221. }
  222. }
  223. }

附convert_tRNAScanSE_to_gff3.pl

  1. #!/usr/bin/env perl
  2. =head1 NAME
  3. github:jorvis/biocode
  4. tRNAScan_SE_to_gff3.pl - convert raw output of tRNAScan-SE to gff3
  5. =head1 SYNOPSIS
  6. USAGE: convert_tRNAScanSE_to_gff3.pl
  7. --input=/path/to/some_file.out
  8. =head1 OPTIONS
  9. B<--input,-i>
  10. The raw output from tRNAScan-SE:
  11. Sequence tRNA Bounds tRNA Anti Intron Bounds Cove
  12. Name tRNA # Begin End Type Codon Begin End Score
  13. -------- ------ ---- ------ ---- ----- ----- ---- ------
  14. tp.assembly.567468735.1 1 91820 91902 Tyr GTA 91857 91866 66.58
  15. tp.assembly.567468735.1 2 171777 171849 Phe GAA 0 0 70.28
  16. tp.assembly.567468735.1 3 172144 172215 His GTG 0 0 64.04
  17. tp.assembly.567468735.1 4 852847 852919 Thr AGT 0 0 75.69
  18. tp.assembly.567468735.1 5 877291 877362 Trp CCA 0 0 68.97
  19. tp.assembly.567468735.1 6 1468229 1468300 Cys GCA 0 0 72.10
  20. tp.assembly.567468735.1 7 2507459 2507530 Pro AGG 0 0 62.33
  21. tp.assembly.567468735.1 8 2507198 2507127 Pro CGG 0 0 65.73
  22. tp.assembly.567468735.1 9 2506317 2506246 Pro TGG 0 0 66.60
  23. tp.assembly.567468735.1 10 2463785 2463713 Lys TTT 0 0 79.47
  24. tp.assembly.567468735.1 11 2191149 2191069 Leu CAG 0 0 57.47
  25. tp.assembly.567468735.1 12 1633307 1633237 Gly CCC 0 0 65.52
  26. tp.assembly.567468735.1 13 1255051 1254968 Leu CAA 0 0 60.46
  27. tp.assembly.567468735.1 14 251108 251037 Asp GTC 0 0 59.48
  28. tp.assembly.567468735.1 15 250520 250449 Asp GTC 0 0 59.48
  29. B<--log,-l>
  30. Log file
  31. B<--ignoreIntrons,-g>
  32. Flag to ignore introns. tRNAs split by introns are usually flagged by NCBI's table2asn as too short.
  33. B<--help,-h>
  34. This help message
  35. =head1 DESCRIPTION
  36. File converter
  37. =head1 INPUT
  38. Input above.
  39. =head1 OUTPUT
  40. GFF3 to STDOUT
  41. =head1 CONTACT
  42. Kyle Tretina
  43. kyletretina@gmail.com
  44. =cut
  45. use warnings;
  46. use strict;
  47. use Getopt::Long qw(:config no_ignore_case no_auto_abbrev pass_through);
  48. use Pod::Usage;
  49. my %options = ();
  50. my $results = GetOptions (\%options,
  51. 'input|i=s',
  52. 'log|l=s',
  53. 'ignoreIntrons|g',
  54. 'help|h') || pod2usage();
  55. ## display documentation
  56. if( $options{'help'} ){
  57. pod2usage( {-exitval => 0, -verbose => 2, -output => \*STDERR} );
  58. }
  59. ## make sure everything passed was peachy
  60. &check_parameters(\%options);
  61. ## open the log if requested
  62. my $logfh;
  63. if (defined $options{log}) {
  64. open($logfh, ">$options{log}") || die "can't create log file: $!";
  65. }
  66. ## set ignoreIntrons flag
  67. my $ignoreIntrons = '';
  68. if (defined $options{ignoreIntrons}) {
  69. $ignoreIntrons = 1;
  70. }
  71. ## open the input file
  72. my $ifh;
  73. open($ifh, "<$options{input}") || die "can't open input file: $!";
  74. # all output needs the gff header
  75. print "##gff-version 3\n";
  76. ## globals
  77. my $tRNAGenNum=1;
  78. my $tRNAExonNum=1;
  79. ## parse the file
  80. foreach my $line (<$ifh>){
  81. my @cols = split /[\t]/, $line;
  82. chomp @cols;
  83. my $contig = $cols[0];
  84. if ($contig =~ /^(.+?)\s+$/) {
  85. $contig = $1;
  86. }
  87. ## skip the header lines
  88. next if $contig eq 'Sequence' || $contig eq 'Name' || $contig eq '--------';
  89. my $start = $cols[2] + 0;
  90. my $stop = $cols[3] + 0;
  91. my $trna = $cols[4];
  92. my $score = $cols[8];
  93. my $pseudo = "";
  94. my $anticodon = $cols[5];
  95. my $intron_start = $cols[6]-1; ## offset intron boundaries
  96. my $intron_end = $cols[7]+1;
  97. $pseudo = ";pseudogene=unknown" if $cols[9] =~ m/pseudo/;
  98. # Suppressor (sup) tRNAs are not recognized by NCBI's table2asn
  99. $trna = "Xxx" if $trna =~ m/Sup/ or $trna =~ m/Undet/;
  100. ## Check if tRNAScan-SE predicted a possible intron (value in column 6 > 0)
  101. if ($cols[6] > 0 and not $ignoreIntrons) {
  102. if ($start > $stop){
  103. my $intron_end = $cols[6]+1; ## offset intron boundaries
  104. my $intron_start = $cols[7]-1;
  105. ($start, $stop) = ($stop, $start);
  106. }
  107. print "$contig\ttRNAScan-SE\tgene\t$start\t$stop\t$score\t-\t.\tID=tRNA-$trna$tRNAGenNum\_gene$pseudo\n";
  108. print "$contig\ttRNAScan-SE\ttRNA\t$start\t$intron_start\t$score\t-\t.\tID=tRNA-$trna$tRNAExonNum\_tRNA;Parent=tRNA-$trna$tRNAGenNum\_gene;product=tRNA-$trna;anticodon=$anticodon;\n";
  109. $tRNAExonNum++;
  110. print "$contig\ttRNAScan-SE\ttRNA\t$intron_end\t$stop\t$score\t-\t.\tID=tRNA-$trna$tRNAExonNum\_tRNA;Parent=tRNA-$trna$tRNAGenNum\_gene;product=tRNA-$trna;anticodon=$anticodon;\n";
  111. $tRNAGenNum++;
  112. $tRNAExonNum++;
  113. } else{
  114. ($start, $stop) = ($stop, $start) if ($start > $stop);
  115. print "$contig\ttRNAScan-SE\tgene\t$start\t$stop\t$score\t-\t.\tID=tRNA-$trna$tRNAGenNum\_gene$pseudo\n";
  116. print "$contig\ttRNAScan-SE\ttRNA\t$start\t$stop\t$score\t-\t.\tID=tRNA-$trna$tRNAExonNum\_tRNA;product=tRNA-$trna;anticodon=$anticodon;Parent=tRNA-$trna$tRNAGenNum\_gene\n";
  117. $tRNAGenNum++;
  118. $tRNAExonNum++;
  119. }
  120. }
  121. exit(0);
  122. sub _log {
  123. my $msg = shift;
  124. print $logfh "$msg\n" if $logfh;
  125. }
  126. sub check_parameters {
  127. my $options = shift;
  128. ## make sure required arguments were passed
  129. my @required = qw( input );
  130. for my $option ( @required ) {
  131. unless ( defined $$options{$option} ) {
  132. die "--$option is a required option";
  133. }
  134. }
  135. ## handle some defaults
  136. $options{optional_argument2} = 'foo' unless ($options{optional_argument2});
  137. }

https://www.jianshu.com/p/8f4061c38508

http://blog.genesino.com/2017/06/Rfam/

【基因组注释】ncRNA注释的更多相关文章

  1. osgAnimation例子的注释的注释

    osgAnimation例子的注释的注释 转自:http://www.cnblogs.com/sunliming/archive/2011/12/12/2284995.html #include &l ...

  2. HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释

    <!-- -->是HTML的注释标签,使用<和>是符合HTML标签语法规则的. /* */(注释代码块).//(注释单行)是CSS和JS的注释标签. 两种注释有各自的使用环境, ...

  3. jsp 变量和方法的声明 Java程序片 HTML注释 JSP注释

    <%!...%> 声明变量和方法 <%!...%>之中的变量为JSP页面的成员变量,当多个线程访问本页面时,多个线程共享此变量. <%@ page contentType ...

  4. 改变Emacs下的注释代码方式以支持当前行(未选中情况下)的注释/反注释

    Emacs下支持多行代码的注释/反注释,命令是comment-or-uncomment-region. 我喜欢把它绑定在快捷键C-c C-/上,如下: (global-set-key [?\C-c ? ...

  5. Python中的注释和解注释

    注释 目标 注释的作用 单行注释(行注释) 多行注释(块注释) 01. 注释的作用 使用用自己熟悉的语言,在程序中对某些代码进行标注说明,增强程序的可读性 02. 单行注释(行注释) 以 # 开头,# ...

  6. [No000018D]Vim快速注释/取消注释多行的几种方法-Vim使用技巧(2)

    在使用Vim进行编程时,经常遇到需要快速注释或取消注释多行代码的场景,Vim教程网根据已有的教程介绍,总结了三种快速注释/取消注释多行代码的方法. 一.使用Vim可视化模式快速注释/取消注释多行 在V ...

  7. 【Python全栈】HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释

    HTML <!--...--> 注释 .CSS/JS //注释 和 /*.....*/ 注释 <!-- -->是HTML的注释标签,使用 < 和 > 是符合HTML ...

  8. c#中//注释和///注释的区别

    c#中//注释和///注释的区别 ///会被编译,//不会所以使用///会减慢编译的速度(但不会影响执行速度)///会在其它的人调用你的代码时提供智能感知 也是一种注释,但是这种注释主要有两种作用:1 ...

  9. 【转】HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释

    原文地址:http://www.cnblogs.com/iceflorence/p/5815409.html <!-- -->是HTML的注释标签,使用 < 和 > 是符合HT ...

随机推荐

  1. docker run 的基本用法

    docker run 命令用来创建并启动一个容器 语法:docker run [options] image [command] [args-] 示例:docker run -dit -v 别名:容器 ...

  2. Noip模拟74 2021.10.11

    T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...

  3. 常用JAVA API :HashSet 和 TreeSet

    set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E e)//如果容器中不包含此元素,则添加. clear()//清空 contain ...

  4. 在Ubuntu下安装Solr

    使用wget命令去官网下载solr的压缩包. 1 wget https://mirrors.bfsu.edu.cn/apache/lucene/solr/8.6.3/solr-8.6.3.tgz 使用 ...

  5. 神经网络 感知机 Perceptron python实现

    import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...

  6. linux系列之: 你知道查看文件空间的两种方法吗?

    目录 简介 du命令 df命令 总结 简介 linux系统中查看文件空间大小应该是一个非常常见的命令了,今天给大家介绍linux系统中查看文件空间的两种方法和在使用中可能会遇到的奇怪问题. 为什么会有 ...

  7. druid连接泄露故障分析

    1.问题的如何发生的 1.1.应用功能介绍 系统是一个双数据源双写单独的服务.(两个数据源是不同的存储,所以无法使用主从复制的模式,是一个切换存储介质的过渡态). 历史代码有个更新逻辑update x ...

  8. MarkdownPad2弹窗显示HTML Rendering Error(HTML 渲染错误)的解决办法

    MarkdownPad2弹窗显示HTML Rendering Error(HTML 渲染错误)的解决办法 我在打开.md文件的时候,出现以下错误: 解决方式:下载Awesomium SDK并安装,重启 ...

  9. Java使用assert断言

    Java1.4后新增assert关键字 Idea中开启assert断言 使用 assert boolean表达式 assert boolean表达式 : 错误提示信息 例子 public static ...

  10. 解读Java8的Thread源码

    1.创建的一个无参的Thread对象,默认会有一个线程名,以Thread-开头,从0开始计数,采用了一个static修饰的int变量,当对象初始化一次时一直存放在jvm方法区中 2.构造Thread的 ...