1# tRNAscanSE/Options.pm 2# This class defines options used in tRNAscan-SE. 3# 4# -------------------------------------------------------------- 5# This module is part of the tRNAscan-SE program. 6# Copyright (C) 2017 Patricia Chan and Todd Lowe 7# -------------------------------------------------------------- 8# 9 10package tRNAscanSE::Options; 11 12use strict; 13use tRNAscanSE::Utils; 14use tRNAscanSE::CM; 15 16sub new { 17 my $class = shift; 18 my $self = {}; 19 20 initialize($self); 21 22 bless ($self, $class); 23 return $self; 24} 25 26sub DESTROY 27{ 28 my $self = shift; 29} 30 31sub initialize 32{ 33 my $self = shift; 34 $self->{fafile} = ""; 35 $self->{fasta_file} = ""; # input sequence file 36 $self->{multiple_files} = 0; # multiple input sequence files 37 $self->{out_file} = "-"; # output result file -- send to 38 # stdout ("-") by default 39 40 $self->{results_to_stdout} = 1; # send results to stdout by default 41 42 $self->{ace_output} = 0; # output in ACeDB format if non-zero 43 $self->{brief_output} = 0; # don't print tabular output column headers 44 # if non-zero 45 $self->{quiet_mode} = 0; # don't print credits & selected run options 46 # if non-zero 47 $self->{display_progress} = 0; # print program progress info if non-zero 48 $self->{save_progress} = 0; # save progress to log file if non-zero 49 $self->{log_file} = ""; # name of log file 50 51 $self->{seq_key} = ""; # require seq names to match this key 52 $self->{raw_seq_key} = ""; # unmodified user-input key 53 $self->{start_at_key} = 0; # read all seqs after finding seqname=KEY? 54 55 $self->{tscan_mode} = 1; # run tRNAscan if non-zero 56 $self->{eufind_mode} = 1; # run eufindtRNA (pavesi) if non-zero 57 $self->{strict_params} = 1; # use original strict tRNAscan params if non-zero 58 $self->{infernal_fp} = 0; # run infernal hmm as first pass 59 60 $self->{CM_mode} = "cove"; # run covariance model search in second pass 61 # cove - run Cove if non-zero 62 # infernal - run Infernal if non-zero 63 # run Infernal by default 64 65 $self->{hmm_filter} = 0; # run infernal with hmm filter in second pass 66 67 $self->{second_pass_label} = "Cove"; # Second scan pass label: Cove by default 68 69 $self->{search_mode} = ""; # tRNA search mode 70 # euk - run eukaryotic cov model if set 71 # bacteria - run covariance model for bacteria if set 72 # archaea - run archaea cov model if set 73 # organelle - run general cov model 74 # general - run general cov model (combines tRNAs from all 3 domains) 75 # mito mammal - run mammalian mito cov models 76 # mito vert - run vertebrate mito cov models 77 # metagenome 78 # numt 79 80 $self->{no_isotype} = 0; # flag for disabling isotype specific cm scan 81 82 $self->{mito_model} = ""; # mito CM for isotype specific scan 83 84 $self->{org_mode} = 0; # run in organellar mode 85 # run eukaryotic model by default 86 87 $self->{alt_gcode} = 0; # use alternate genetic translation table 88 # file if non-zero 89 $self->{gc_file} = ""; # alternate transl table file 90 91 $self->{save_stats} = 0; # save statistics for search 92 $self->{stats_file} = ""; 93 94 $self->{detail} = 0; # display detailed prediction info 95 96 $self->{save_odd_struct} = 0; # save structures for which Cove 97 # was unable to determine anticodon 98 $self->{odd_struct_file} = ""; 99 100 $self->{save_all_struct} = 0; # save secondary structures if nonzero 101 102 $self->{bed_file} = ""; # bed file 103 $self->{output_fasta_file} = ""; # predicted tRNA fasta file 104 $self->{all_struct_file} = ""; # sec struct file, set with -f option 105 $self->{isotype_specific_file} = ""; # isotype specific result file 106 107 $self->{split_fragment_file} = ""; # split fragment file, set with --frag option 108 109 $self->{save_verbose} = 0; # save verbose output from tRNAscan 110 $self->{verb_file} = ""; 111 112 $self->{save_firstpass_res} = 0; # save tabular tRNAscan results 113 $self->{firstpass_result_file} = ""; 114 $self->{firstpass_flanking_file} = ""; 115 $self->{secondpass_int_result_file} = ""; 116 $self->{isotype_int_result_file} = ""; 117 $self->{truncated_int_result_file} = ""; 118 119 $self->{use_prev_ts_run} = 0; # specify result file from previous 120 # tRNA search for Cove-confirmation 121 122 $self->{default_Padding} = 10; 123 $self->{padding} = $self->{default_Padding}; # pad both ends of first-pass hits with this 124 # many extra bases before passing to Cove 125 126 $self->{save_falsepos} = 0; # save false positive tRNAs in 127 # fasta file 128 $self->{falsepos_file} = ""; 129 130 $self->{save_missed} = 0; # save seqs without a hit 131 $self->{missed_seq_file} = ""; 132 133 $self->{save_source} = 0; # save source of first-pass hit 134 135 $self->{output_codon} = 0; # output tRNA codon instead of anticodon 136 # (off by default) 137 138 $self->{infernal_score} = 0; # flag to output infernal score 139 140# $self->{use_orig_cm} = 0; # use original covariance model that 141# # contains tRNAS from all three domains 142 143 $self->{def_max_int_len} = 200; # default MAX intron+variable loop region size 144 # used in EufindtRNA 145 146 $self->{max_int_len} = $self->{def_max_int_len}; 147 148 $self->{prompt_for_overwrite} = 1; # prompt user before overwriting a pre-existing 149 # output file, disabled with -Q option 150} 151 152sub fafile 153{ 154 my $self = shift; 155 if (@_) { $self->{fafile} = shift; } 156 return $self->{fafile}; 157} 158 159sub fasta_file 160{ 161 my $self = shift; 162 if (@_) { $self->{fasta_file} = shift; } 163 return $self->{fasta_file}; 164} 165 166sub multiple_files 167{ 168 my $self = shift; 169 if (@_) { $self->{multiple_files} = shift; } 170 return $self->{multiple_files}; 171} 172 173sub out_file 174{ 175 my $self = shift; 176 if (@_) { $self->{out_file} = shift; } 177 return $self->{out_file}; 178} 179 180sub results_to_stdout 181{ 182 my $self = shift; 183 if (@_) { $self->{results_to_stdout} = shift; } 184 return $self->{results_to_stdout}; 185} 186 187sub ace_output 188{ 189 my $self = shift; 190 if (@_) { $self->{ace_output} = shift; } 191 return $self->{ace_output}; 192} 193 194sub brief_output 195{ 196 my $self = shift; 197 if (@_) { $self->{brief_output} = shift; } 198 return $self->{brief_output}; 199} 200 201sub quiet_mode 202{ 203 my $self = shift; 204 if (@_) { $self->{quiet_mode} = shift; } 205 return $self->{quiet_mode}; 206} 207 208sub display_progress 209{ 210 my $self = shift; 211 if (@_) { $self->{display_progress} = shift; } 212 return $self->{display_progress}; 213} 214 215sub save_progress 216{ 217 my $self = shift; 218 if (@_) { $self->{save_progress} = shift; } 219 return $self->{save_progress}; 220} 221 222sub log_file 223{ 224 my $self = shift; 225 if (@_) { $self->{log_file} = shift; } 226 return $self->{log_file}; 227} 228 229sub seq_key 230{ 231 my $self = shift; 232 if (@_) { $self->{seq_key} = shift; } 233 return $self->{seq_key}; 234} 235 236sub raw_seq_key 237{ 238 my $self = shift; 239 if (@_) { $self->{raw_seq_key} = shift; } 240 return $self->{raw_seq_key}; 241} 242 243sub start_at_key 244{ 245 my $self = shift; 246 if (@_) { $self->{start_at_key} = shift; } 247 return $self->{start_at_key}; 248} 249 250sub tscan_mode 251{ 252 my $self = shift; 253 if (@_) { $self->{tscan_mode} = shift; } 254 return $self->{tscan_mode}; 255} 256 257sub eufind_mode 258{ 259 my $self = shift; 260 if (@_) { $self->{eufind_mode} = shift; } 261 return $self->{eufind_mode}; 262} 263 264sub strict_params 265{ 266 my $self = shift; 267 if (@_) { $self->{strict_params} = shift; } 268 return $self->{strict_params}; 269} 270 271sub infernal_fp 272{ 273 my $self = shift; 274 if (@_) { $self->{infernal_fp} = shift; } 275 return $self->{infernal_fp}; 276} 277 278sub CM_mode 279{ 280 my $self = shift; 281 if (@_) { $self->{CM_mode} = shift; } 282 return $self->{CM_mode}; 283} 284 285sub cove_mode 286{ 287 my $self = shift; 288 return ($self->{CM_mode} eq 'cove'); 289} 290 291sub infernal_mode 292{ 293 my $self = shift; 294 return ($self->{CM_mode} eq 'infernal'); 295} 296 297sub hmm_filter 298{ 299 my $self = shift; 300 if (@_) { $self->{hmm_filter} = shift; } 301 return $self->{hmm_filter}; 302} 303 304sub second_pass_label 305{ 306 my $self = shift; 307 if (@_) { $self->{second_pass_label} = shift; } 308 return $self->{second_pass_label}; 309} 310 311sub search_mode 312{ 313 my $self = shift; 314 if (@_) { $self->{search_mode} = shift; } 315 return $self->{search_mode}; 316} 317 318sub euk_mode 319{ 320 my $self = shift; 321 return ($self->{search_mode} eq 'euk'); 322} 323 324sub bact_mode 325{ 326 my $self = shift; 327 return ($self->{search_mode} eq 'bacteria'); 328} 329 330sub arch_mode 331{ 332 my $self = shift; 333 return ($self->{search_mode} eq 'archaea'); 334} 335 336sub mito_mammal_mode 337{ 338 my $self = shift; 339 return ($self->mito_mode() and $self->{mito_model} eq 'mammal'); 340} 341 342sub mito_vert_mode 343{ 344 my $self = shift; 345 return ($self->mito_mode() and $self->{mito_model} eq 'vert'); 346} 347 348sub mito_mode 349{ 350 my $self = shift; 351 return ($self->{search_mode} eq 'mito'); 352} 353 354sub metagenome_mode 355{ 356 my $self = shift; 357 return ($self->{search_mode} eq 'metagenome'); 358} 359 360sub numt_mode 361{ 362 my $self = shift; 363 return ($self->{search_mode} eq 'numt'); 364} 365 366sub alternate_mode 367{ 368 my $self = shift; 369 return ($self->{search_mode} eq 'alt'); 370} 371 372sub no_isotype 373{ 374 my $self = shift; 375 if (@_) { $self->{no_isotype} = shift; } 376 return $self->{no_isotype}; 377} 378 379sub mito_model 380{ 381 my $self = shift; 382 if (@_) { $self->{mito_model} = shift; } 383 return $self->{mito_model}; 384} 385 386sub organelle_mode 387{ 388 my $self = shift; 389 return ($self->{search_mode} eq 'organelle'); 390} 391 392sub general_mode 393{ 394 my $self = shift; 395 return ($self->{search_mode} eq 'general'); 396} 397 398sub org_mode 399{ 400 my $self = shift; 401 if (@_) { $self->{org_mode} = shift; } 402 return $self->{org_mode}; 403} 404 405sub alt_gcode 406{ 407 my $self = shift; 408 if (@_) { $self->{alt_gcode} = shift; } 409 return $self->{alt_gcode}; 410} 411 412sub gc_file 413{ 414 my $self = shift; 415 if (@_) { $self->{gc_file} = shift; } 416 return $self->{gc_file}; 417} 418 419sub save_stats 420{ 421 my $self = shift; 422 if (@_) { $self->{save_stats} = shift; } 423 return $self->{save_stats}; 424} 425 426sub stats_file 427{ 428 my $self = shift; 429 if (@_) { $self->{stats_file} = shift; } 430 return $self->{stats_file}; 431} 432 433sub save_odd_struct 434{ 435 my $self = shift; 436 if (@_) { $self->{save_odd_struct} = shift; } 437 return $self->{save_odd_struct}; 438} 439 440sub odd_struct_file 441{ 442 my $self = shift; 443 if (@_) { $self->{odd_struct_file} = shift; } 444 return $self->{odd_struct_file}; 445} 446 447sub save_all_struct 448{ 449 my $self = shift; 450 if (@_) { $self->{save_all_struct} = shift; } 451 return $self->{save_all_struct}; 452} 453 454sub all_struct_file 455{ 456 my $self = shift; 457 if (@_) { $self->{all_struct_file} = shift; } 458 return $self->{all_struct_file}; 459} 460 461sub bed_file 462{ 463 my $self = shift; 464 if (@_) { $self->{bed_file} = shift; } 465 return $self->{bed_file}; 466} 467 468sub output_fasta_file 469{ 470 my $self = shift; 471 if (@_) { $self->{output_fasta_file} = shift; } 472 return $self->{output_fasta_file}; 473} 474 475sub isotype_specific_file 476{ 477 my $self = shift; 478 if (@_) { $self->{isotype_specific_file} = shift; } 479 return $self->{isotype_specific_file}; 480} 481 482sub split_fragment_file 483{ 484 my $self = shift; 485 if (@_) { $self->{split_fragment_file} = shift; } 486 return $self->{split_fragment_file}; 487} 488 489sub save_verbose 490{ 491 my $self = shift; 492 if (@_) { $self->{save_verbose} = shift; } 493 return $self->{save_verbose}; 494} 495 496sub verb_file 497{ 498 my $self = shift; 499 if (@_) { $self->{verb_file} = shift; } 500 return $self->{verb_file}; 501} 502 503sub save_firstpass_res 504{ 505 my $self = shift; 506 if (@_) { $self->{save_firstpass_res} = shift; } 507 return $self->{save_firstpass_res}; 508} 509 510sub firstpass_result_file 511{ 512 my $self = shift; 513 if (@_) { $self->{firstpass_result_file} = shift; } 514 return $self->{firstpass_result_file}; 515} 516 517sub firstpass_flanking_file 518{ 519 my $self = shift; 520 if (@_) { $self->{firstpass_flanking_file} = shift; } 521 return $self->{firstpass_flanking_file}; 522} 523 524sub secondpass_int_result_file 525{ 526 my $self = shift; 527 if (@_) { $self->{secondpass_int_result_file} = shift; } 528 return $self->{secondpass_int_result_file}; 529} 530 531sub isotype_int_result_file 532{ 533 my $self = shift; 534 if (@_) { $self->{isotype_int_result_file} = shift; } 535 return $self->{isotype_int_result_file}; 536} 537 538sub truncated_int_result_file 539{ 540 my $self = shift; 541 if (@_) { $self->{truncated_int_result_file} = shift; } 542 return $self->{truncated_int_result_file}; 543} 544 545sub use_prev_ts_run 546{ 547 my $self = shift; 548 if (@_) { $self->{use_prev_ts_run} = shift; } 549 return $self->{use_prev_ts_run}; 550} 551 552sub default_Padding 553{ 554 my $self = shift; 555 if (@_) { $self->{default_Padding} = shift; } 556 return $self->{default_Padding}; 557} 558 559sub padding 560{ 561 my $self = shift; 562 if (@_) { $self->{padding} = shift; } 563 return $self->{padding}; 564} 565 566sub save_falsepos 567{ 568 my $self = shift; 569 if (@_) { $self->{save_falsepos} = shift; } 570 return $self->{save_falsepos}; 571} 572 573sub falsepos_file 574{ 575 my $self = shift; 576 if (@_) { $self->{falsepos_file} = shift; } 577 return $self->{falsepos_file}; 578} 579 580sub save_missed 581{ 582 my $self = shift; 583 if (@_) { $self->{save_missed} = shift; } 584 return $self->{save_missed}; 585} 586 587sub missed_seq_file 588{ 589 my $self = shift; 590 if (@_) { $self->{missed_seq_file} = shift; } 591 return $self->{missed_seq_file}; 592} 593 594sub save_source 595{ 596 my $self = shift; 597 if (@_) { $self->{save_source} = shift; } 598 return $self->{save_source}; 599} 600 601sub output_codon 602{ 603 my $self = shift; 604 if (@_) { $self->{output_codon} = shift; } 605 return $self->{output_codon}; 606} 607 608sub detail 609{ 610 my $self = shift; 611 if (@_) { $self->{detail} = shift; } 612 return $self->{detail}; 613} 614 615sub infernal_score 616{ 617 my $self = shift; 618 if (@_) { $self->{infernal_score} = shift; } 619 return $self->{infernal_score}; 620} 621 622sub def_max_int_len 623{ 624 my $self = shift; 625 if (@_) { $self->{def_max_int_len} = shift; } 626 return $self->{def_max_int_len}; 627} 628 629sub max_int_len 630{ 631 my $self = shift; 632 if (@_) { $self->{max_int_len} = shift; } 633 return $self->{max_int_len}; 634} 635 636sub prompt_for_overwrite 637{ 638 my $self = shift; 639 if (@_) { $self->{prompt_for_overwrite} = shift; } 640 return $self->{prompt_for_overwrite}; 641} 642 643sub display_run_options 644{ 645 my $self = shift; 646 my ($cm, $tscan, $eufind, $global_constants, $FHAND) = @_; 647 648 print $FHAND ('-' x 60,"\n", "Sequence file(s) to search: ",join(', ',@ARGV),"\n"); 649 if ($self->{seq_key} ne '\S*') 650 { 651 if ($self->{start_at_key}) 652 { 653 print $FHAND "Starting at sequence name: $self->{raw_seq_key}\n"; 654 } 655 else 656 { 657 print $FHAND "Search only names matching: $self->{raw_seq_key}\n"; 658 } 659 } 660 661 print $FHAND "Search Mode: "; 662 if ($self->euk_mode()) 663 { 664 print $FHAND "Eukaryotic"; 665 } 666 elsif ($self->bact_mode()) 667 { 668 print $FHAND "Bacterial"; 669 } 670 elsif ($self->arch_mode()) 671 { 672 print $FHAND "Archaeal"; 673 } 674 elsif ($self->mito_mammal_mode()) 675 { 676 print $FHAND "Mitochondrial in mammals"; 677 } 678 elsif ($self->mito_vert_mode()) 679 { 680 print $FHAND "Mitochondrial in vertebrates"; 681 } 682 elsif ($self->organelle_mode()) 683 { 684 print $FHAND "Organellar"; 685 } 686 elsif ($self->general_mode()) 687 { 688 print $FHAND "General"; 689 } 690 elsif ($self->metagenome_mode()) 691 { 692 print $FHAND "Metagenome"; 693 } 694 elsif ($self->numt_mode()) 695 { 696 print $FHAND "Numt"; 697 } 698 else 699 { 700 print $FHAND "Eukaryotic"; 701 } 702 print $FHAND "\n"; 703 704 print $FHAND "Results written to: ", &print_filename($self->{out_file}),"\n"; 705 706 print $FHAND "Output format: "; 707 if ($self->{ace_output}) 708 { 709 print $FHAND "ACeDB\n"; 710 } 711 else 712 { 713 print $FHAND "Tabular\n"; 714 } 715 716 print $FHAND "Searching with: "; 717 if ($self->{eufind_mode}) 718 { 719 if ($self->{tscan_mode}) 720 { 721 if ($self->{CM_mode} =~ /infernal|cove/) 722 { 723 print $FHAND "tRNAscan + EufindtRNA -> $self->{second_pass_label}\n"; 724 } 725 else 726 { 727 print $FHAND "tRNAscan + EufindtRNA\n"; 728 } 729 } 730 elsif ($self->{CM_mode} =~ /infernal|cove/) 731 { 732 print $FHAND "EufindtRNA->$self->{second_pass_label}\n"; 733 } 734 else 735 { 736 print $FHAND "EufindtRNA only\n"; 737 } 738 } 739 elsif ($self->{tscan_mode}) 740 { 741 if ($self->{CM_mode} =~ /infernal|cove/) 742 { 743 print $FHAND "tRNAscan->$self->{second_pass_label}\n"; 744 } 745 else 746 { 747 print $FHAND "tRNAscan only\n"; 748 } 749 } 750 elsif ($self->{infernal_fp}) 751 { 752 if ($self->{CM_mode} =~ /infernal|cove/) 753 { 754 print $FHAND "Infernal First Pass->$self->{second_pass_label}\n"; 755 } 756 else 757 { 758 print $FHAND "Infernal First Pass only\n"; 759 } 760 } 761 else 762 { 763 print $FHAND "$self->{second_pass_label} single-pass scan\n"; 764 } 765 766 if ($self->{CM_mode} eq "infernal" and !$self->{infernal_fp}) 767 { 768 if ($self->{hmm_filter}) 769 { 770 print $FHAND " Fast mode\n"; 771 } 772 else 773 { 774 print $FHAND " Maximum sensitivity mode\n"; 775 } 776 } 777 778 if (!$self->{no_isotype} and ($self->euk_mode() or $self->bact_mode() or $self->arch_mode())) 779 { 780 print $FHAND "Isotype-specific model scan: Yes\n"; 781 } 782 elsif ($self->{no_isotype} and ($self->euk_mode() or $self->bact_mode() or $self->arch_mode())) 783 { 784 print $FHAND "Isotype-specific model scan: No\n"; 785 } 786 787 if ($self->euk_mode() and $self->mito_model() ne "") 788 { 789 print $FHAND "Mito isotype model scan: ".$self->mito_model()."\n"; 790 } 791 792 if ($cm->CM_check_for_introns()) 793 { 794 print $FHAND "Scan for noncanonical introns\n"; 795 } 796 if ($cm->CM_check_for_split_halves()) 797 { 798 print $FHAND "Scan for fragments of split tRNAs\n"; 799 } 800 801 my $ct = 0; 802 my %cms = $cm->main_cm_file_path(); 803 foreach my $cur_cm (sort keys %cms) 804 { 805 $ct++; 806 if ($ct == 1) 807 { 808 print $FHAND "Covariance model: ".$cms{$cur_cm}."\n"; 809 } 810 else 811 { 812 print $FHAND " ".$cms{$cur_cm}."\n"; 813 } 814 } 815 816# if ($self->mito_mode()) 817# { 818# if ($cm->organelle_cm_cutoff() != $global_constants->get("organelle_cm_cutoff")) 819# { 820# print $FHAND "tRNA covariance model search \n"." cutoff score: ".$cm->organelle_cm_cutoff()."\n"; 821# } 822# } 823# else 824# { 825 if ($cm->cm_cutoff() != $global_constants->get("cm_cutoff")) 826 { 827 print $FHAND "tRNA covariance model search \n"." cutoff score: ".$cm->cm_cutoff()."\n"; 828 } 829# } 830 831 if ($self->{use_prev_ts_run}) 832 { 833 print $FHAND "Using previous\n", 834 "tabular output file: $self->{firstpass_result_file}\n"; 835 } 836 837 if ($self->{tscan_mode}) 838 { 839 print $FHAND "tRNAscan parameters: "; 840 if ($self->{strict_params}) 841 { 842 print $FHAND "Strict\n"; 843 } 844 else 845 { 846 print $FHAND "Relaxed\n"; 847 } 848 } 849 850 if ($self->{eufind_mode}) 851 { 852 print $FHAND "EufindtRNA parameters: "; 853 if ($eufind->eufind_params() eq $global_constants->get_subvalue("eufind", "relaxed_param")) 854 { 855 print $FHAND "Relaxed (Int Cutoff= ".$eufind->eufind_intscore().")\n"; 856 } 857 elsif ($eufind->eufind_params() eq "") 858 { 859 print $FHAND "Normal\n"; 860 } 861 elsif ($eufind->eufind_params() eq $global_constants->get_subvalue("eufind", "strict_param")) 862 { 863 print $FHAND "Strict\n"; 864 } 865 else 866 { 867 print $FHAND "?\n"; 868 } 869 } 870 871 if ($self->{infernal_fp}) 872 { 873 print $FHAND "Infernal first pass cutoff score: ".$cm->infernal_fp_cutoff()."\n"; 874 } 875 876 if ($self->{padding} != $self->{default_Padding}) 877 { 878 print $FHAND "First-pass tRNA hit padding: $self->{padding} bp\n"; 879 } 880 881 if ($self->{alt_gcode}) 882 { 883 print $FHAND "Alternate transl code used: ", "from file $self->{gc_file}\n"; 884 } 885 print $FHAND "\nTemporary directory: ".$global_constants->get("temp_dir")."\n"; 886 if ($self->{save_all_struct}) 887 { 888 print $FHAND "tRNA secondary structure\n", " predictions saved to: "; 889 if ($self->{all_struct_file} eq "-") 890 { 891 print $FHAND "Standard output\n"; 892 } 893 else 894 { 895 print $FHAND "$self->{all_struct_file}\n"; 896 } 897 } 898 if ($self->{bed_file} ne "") 899 { 900 print $FHAND "tRNA predictions saved to: "; 901 if ($self->{bed_file} eq "-") 902 { 903 print $FHAND "Standard output\n"; 904 } 905 else 906 { 907 print $FHAND "$self->{bed_file}\n"; 908 } 909 } 910 if ($self->{output_fasta_file} ne "") 911 { 912 print $FHAND "Predicted tRNA sequences\n", " saved to: "; 913 if ($self->{output_fasta_file} eq "-") 914 { 915 print $FHAND "Standard output\n"; 916 } 917 else 918 { 919 print $FHAND "$self->{output_fasta_file}\n"; 920 } 921 } 922 if ($self->{isotype_specific_file} ne "") 923 { 924 print $FHAND "Isotype specific\n", " predictions saved to: "; 925 if ($self->{isotype_specific_file} eq "-") 926 { 927 print $FHAND "Standard output\n"; 928 } 929 else 930 { 931 print $FHAND "$self->{isotype_specific_file}\n"; 932 } 933 } 934 if ($self->{split_fragment_file} ne "") 935 { 936 print $FHAND "Split tRNA fragment\n", " predictions saved to: "; 937 if ($self->{split_fragment_file} eq "-") 938 { 939 print $FHAND "Standard output\n"; 940 } 941 else 942 { 943 print $FHAND "$self->{split_fragment_file}\n"; 944 } 945 } 946 if ($self->{save_odd_struct}) 947 { 948 print $FHAND "Sec structures for tRNAs\n", " with no anticodon predictn: $self->{odd_struct_file}\n"; 949 } 950 if ($self->{save_firstpass_res}) 951 { 952 print $FHAND "First-pass results saved in: ", "$self->{firstpass_result_file}\n"; 953 } 954 if ($self->{log_file} ne "") 955 { 956 print $FHAND "Search log saved in: $self->{log_file}\n"; 957 } 958 if ($self->{save_stats}) 959 { 960 print $FHAND "Search statistics saved in: $self->{stats_file}\n"; 961 } 962 if ($self->{save_falsepos}) 963 { 964 print $FHAND "False positives saved in: $self->{falsepos_file}\n"; 965 } 966 if ($self->{save_missed}) 967 { 968 print $FHAND "Seqs with 0 hits saved in: $self->{missed_seq_file}\n"; 969 } 970 if ($cm->skip_pseudo_filter() | $cm->get_hmm_score() | $tscan->keep_tscan_repeats()) 971 { 972 print $FHAND "\n"; 973 } 974 if ($self->{max_int_len} != $self->{def_max_int_len}) 975 { 976 print $FHAND "Max intron + var. length: $self->{max_int_len}\n"; 977 } 978 if ($cm->skip_pseudo_filter()) 979 { 980 print $FHAND "Pseudogene checking disabled\n"; 981 } 982 if ($cm->get_hmm_score()) 983 { 984 print $FHAND "Reporting HMM/2' structure score breakdown\n"; 985 } 986 if ($tscan->keep_tscan_repeats()) 987 { 988 print $FHAND "Redundant tRNAscan hits not merged\n"; 989 } 990 991 print $FHAND ('-' x 60,"\n\n"); 992} 993 9941; 995 996