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