sequenceserver-beta 0.8.7.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE.Apache.txt +176 -0
  4. data/LICENSE.txt +69 -0
  5. data/README.txt +5 -0
  6. data/bin/sequenceserver +82 -0
  7. data/config.ru +6 -0
  8. data/example.config.yml +39 -0
  9. data/lib/profile_code.rb +217 -0
  10. data/lib/sequenceserver.rb +527 -0
  11. data/lib/sequenceserver/blast.rb +92 -0
  12. data/lib/sequenceserver/customisation.rb +60 -0
  13. data/lib/sequenceserver/database.rb +29 -0
  14. data/lib/sequenceserver/database_formatter.rb +190 -0
  15. data/lib/sequenceserver/helpers.rb +136 -0
  16. data/lib/sequenceserver/sequencehelpers.rb +93 -0
  17. data/lib/sequenceserver/sinatralikeloggerformatter.rb +12 -0
  18. data/lib/sequenceserver/version.rb +9 -0
  19. data/public/css/beige.css.css +254 -0
  20. data/public/css/bootstrap.dropdown.css +29 -0
  21. data/public/css/bootstrap.icons.css +155 -0
  22. data/public/css/bootstrap.min.css +415 -0
  23. data/public/css/bootstrap.modal.css +28 -0
  24. data/public/css/custom.css +232 -0
  25. data/public/img/glyphicons-halflings-white.png +0 -0
  26. data/public/img/glyphicons-halflings.png +0 -0
  27. data/public/js/bootstrap.dropdown.js +92 -0
  28. data/public/js/bootstrap.modal.js +7 -0
  29. data/public/js/bootstrap.transition.js +7 -0
  30. data/public/js/jquery-scrollspy.js +98 -0
  31. data/public/js/jquery-ui.js +14987 -0
  32. data/public/js/jquery.activity.js +10 -0
  33. data/public/js/jquery.enablePlaceholder.min.js +10 -0
  34. data/public/js/jquery.js +5 -0
  35. data/public/js/sequenceserver.blast.js +208 -0
  36. data/public/js/sequenceserver.js +304 -0
  37. data/public/js/store.min.js +2 -0
  38. data/sequenceserver.gemspec +49 -0
  39. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta +5486 -0
  40. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta.nhr +0 -0
  41. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta.nin +0 -0
  42. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta.nsq +0 -0
  43. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta +6449 -0
  44. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta.phr +0 -0
  45. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta.pin +0 -0
  46. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta.psq +0 -0
  47. data/tests/run +26 -0
  48. data/tests/test_sequencehelpers.rb +77 -0
  49. data/tests/test_sequenceserver_blast.rb +60 -0
  50. data/tests/test_ui.rb +104 -0
  51. data/tests/test_ui.rb~ +104 -0
  52. data/tests/ui.specs.todo +10 -0
  53. data/views/500.erb +22 -0
  54. data/views/_options.erb +144 -0
  55. data/views/search.erb +220 -0
  56. metadata +226 -0
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ # Usage:
3
+ #
4
+ # run all test suites
5
+ #
6
+ # $ tests/run
7
+ #
8
+ # run a particular test suite
9
+ #
10
+ # $ tests/run tests/test_sequencehelpers.rb
11
+ #
12
+
13
+ # script dir
14
+ dir = File.dirname(__FILE__)
15
+
16
+ # setup load path
17
+ require 'rubygems'
18
+ $LOAD_PATH.unshift(File.join(dir, '..', 'lib'))
19
+
20
+ # user specified or glob all?
21
+ files = ARGV.empty? ? Dir[File.join(dir, 'test_*.rb')] : ARGV
22
+
23
+ # run!
24
+ files.each do |file|
25
+ require File.expand_path(file)
26
+ end
@@ -0,0 +1,77 @@
1
+ require 'sequenceserver'
2
+ require 'sequenceserver/sequencehelpers'
3
+ require 'test/unit'
4
+
5
+ class Tester < Test::Unit::TestCase
6
+ include SequenceServer::SequenceHelpers
7
+ def test_guess_sequence_type_nucleotide
8
+ #must 'correctly detect nucleotide sequence, even when it includes crap' do
9
+ ['AAAAAAAAAAAAAAAAAAAAAT',
10
+ ' CAGATGCRRCAAAGCAAACGGCAA 34523453 652352',
11
+ 'ACCNNNNNNXXXXCAUUUUUU',
12
+ "ACGT\n\t\t\nACCACGGACCACGAAAGCG" ].each do |seq|
13
+ assert_equal(:nucleotide, guess_sequence_type(seq), message="for #{seq}")
14
+ end
15
+ end
16
+
17
+ def test_guess_sequence_type_aminoacid
18
+ #must 'correctly detect aminoacid sequence, even when it includes a lot of crap' do
19
+ ['ADSACGHKSJLFCVMGTL',
20
+ ' 345 KSSYPHYSPPPPHS 345 23453 652352',
21
+ 'GEYSNLNNNNNNXXXXSSSSSSSSSSSSSSSSSSSSSSS',
22
+ "EE\n\t\t\n \t\t\EEQRRQQSARTSRRQR" ].each do |seq|
23
+ assert_equal(:protein, guess_sequence_type(seq) , message="for #{seq}")
24
+ end
25
+ end
26
+
27
+ def test_guess_sequence_type_impossible
28
+ assert_equal(nil, guess_sequence_type('ACSFGT'), message='too little sequence')
29
+ end
30
+
31
+ ## Tests for type_of_sequences (multi-fasta kind of thing the user would enter)
32
+ def test_type_of_sequences
33
+ aa_multifasta = ">SDFDSF\nACGTGSDLKJGNLDKSJFLSDKJFLSDKOIU\n>asdfas\nasfasdfffffffffffffffffffff\n>alksjflkasdj slakdjf\nasdfasdfasdfljaslkdjf"
34
+ aa_multifasta_including_short_seq_missing_lead = "ACGTGSDLKJGNLDKSJFLSDKJFLSDKOIU\n>asdfas\nasf\n>alksjflkasdj slakdjf\nasdfasdfasdfljaslkdjf"
35
+ aa_singlesequence = "ACGTGSDLKJGNLDKSJFLSDKJFLSDKOIU\n"
36
+ nt_multifasta = ">asdf\nAAAAAAAAAAAAAAAAAAAAT\n>sfaslkj\nCAGATGCRRCAAAGCAAACGGCAA\n>asssssjlkj\nACCCANNNNNNXXXXCAUUUUUU"
37
+ aa_nt_mix = ">alksjflkasdj slakdjf\nasdfasdfasdfljaslkdjf\n>ffffffassdf\nACGCNAGTGCCCCCCCCGANATGGGTGGTTXXXXXGGTG"
38
+
39
+ assert_equal(:protein, type_of_sequences(aa_multifasta), 'aa_multifasta')
40
+ assert_equal(:protein, type_of_sequences(aa_multifasta_including_short_seq_missing_lead ), 'aa_multifasta_short_seq_and_no_>')
41
+ assert_equal(:protein, type_of_sequences(aa_singlesequence), 'single AA sequence')
42
+ assert_equal(:nucleotide, type_of_sequences(nt_multifasta), 'nt_multifasta')
43
+ assert_raise(ArgumentError, 'mixed aa and nt should raise') { type_of_sequences(aa_nt_mix) }
44
+ end
45
+
46
+ def test_composition
47
+ expected_comp = {"a"=>2, "d"=>3, "f"=>7, "s"=>3, "A"=>1}
48
+ assert_equal(expected_comp, composition('asdfasdfffffAsdf'))
49
+ end
50
+
51
+ def test_construct_standard_sequence_hyperlink
52
+ assert_equal "/get_sequence/?id=one&db=abc def", construct_standard_sequence_hyperlink({:sequence_id => 'one', :databases => %w(abc def)})
53
+ assert_equal nil, construct_standard_sequence_hyperlink({:sequence_id => ' one', :databases => %w(abc def)})
54
+ assert_equal "/get_sequence/?id=MAL13P1.218&db=abc def", construct_standard_sequence_hyperlink({:sequence_id => 'lcl|MAL13P1.218', :databases => %w(abc def)})
55
+ end
56
+ end
57
+
58
+ class AppTester < Test::Unit::TestCase
59
+ def test_process_advanced_blast_options
60
+ app = SequenceServer::App.new!
61
+
62
+ assert_nothing_raised {app.validate_advanced_parameters('')}
63
+ assert_nothing_raised {app.validate_advanced_parameters('-word_size 5')}
64
+ assert_raise(ArgumentError, 'security advanced option parser'){app.validate_advanced_parameters('-word_size 5; rm -rf /')}
65
+ assert_raise(ArgumentError, 'conflicting advanced option'){app.validate_advanced_parameters('-db roar')}
66
+ end
67
+ end
68
+
69
+ class SystemHelpersTester < Test::Unit::TestCase
70
+ include SequenceServer::Helpers::SystemHelpers
71
+
72
+ def test_multipart_database_name?
73
+ assert_equal true, multipart_database_name?('/home/ben/pd.ben/sequenceserver/db/nr.00')
74
+ assert_equal false, multipart_database_name?('/home/ben/pd.ben/sequenceserver/db/nr')
75
+ assert_equal true, multipart_database_name?('/home/ben/pd.ben/sequenceserver/db/img3.5.finished.faa.01')
76
+ end
77
+ end
@@ -0,0 +1,60 @@
1
+ require 'sequenceserver'
2
+ require 'minitest/spec'
3
+ require 'minitest/autorun'
4
+ require 'rack/test'
5
+
6
+ ENV['RACK_ENV'] = 'test'
7
+
8
+ module SequenceServer
9
+ describe "App" do
10
+ include Rack::Test::Methods
11
+
12
+ def app
13
+ App
14
+ end
15
+
16
+ def setup
17
+ @params = {'method' => 'blastn', 'sequence' => 'AGCTAGCTAGCT', 'databases' => ['123']}
18
+ end
19
+
20
+ it 'returns Bad Request (400) if no blast method is provided' do
21
+ @params.delete('method')
22
+ post '/', @params
23
+ last_response.status.must_equal 400
24
+ end
25
+
26
+ it 'returns Bad Request (400) if no input sequence is provided' do
27
+ @params.delete('sequence')
28
+ post '/', @params
29
+ last_response.status.must_equal 400
30
+ end
31
+
32
+ it 'returns Bad Request (400) if no database id is provided' do
33
+ @params.delete('databases')
34
+ post '/', @params
35
+ last_response.status.must_equal 400
36
+ end
37
+
38
+ it 'returns Bad Request (400) if an empty database list is provided' do
39
+ @params['databases'].pop
40
+
41
+ # ensure the list of databases is empty
42
+ @params['databases'].length.must_equal 0
43
+
44
+ post '/', @params
45
+ last_response.status.must_equal 400
46
+ end
47
+
48
+ it 'returns Bad Request (400) if an incorrect blast method is supplied' do
49
+ @params['method'] = 'foo'
50
+ post '/', @params
51
+ last_response.status.must_equal 400
52
+ end
53
+
54
+ it 'returns Bad Request (400) if incorrect advanced params are supplied' do
55
+ @params['advanced'] = '-word_size 5; rm -rf /'
56
+ post '/', @params
57
+ last_response.status.must_equal 400
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,104 @@
1
+ require 'rspec'
2
+ require 'watir-webdriver'
3
+ require 'headless'
4
+
5
+ # These shared examples should work for
6
+ shared_examples_for 'a browser' do
7
+ let(:seqserv_url){'http://localhost:4567'}
8
+
9
+ it 'should simply go the seqserv webpage' do
10
+ b.goto seqserv_url
11
+ b.url.gsub(/\/$/,'').should eq(seqserv_url)
12
+ b.ready_state.should eq('complete')
13
+ end
14
+
15
+ it 'should do a simple blastp' do
16
+ b.goto seqserv_url
17
+
18
+ # Nucleotide database should be available
19
+ b.checkbox(:value => 'ed4250adc44601256f6bbbd4ab5cc80c').enabled?.should eq(true)
20
+
21
+ # First up the blast button should be disabled
22
+ b.button(:id => 'method').text.should eq('BLAST')
23
+ b.button(:id => 'method').enabled?.should eq(false)
24
+
25
+ # Pick a protein blast database
26
+ b.checkbox(:value => 'b9a05001b93ca2587b447dacb9906f2a').set
27
+ b.checkbox(:value => 'b9a05001b93ca2587b447dacb9906f2a').checked?.should eq(true)
28
+
29
+ # nuc dbs now disabled
30
+ b.checkbox(:value => 'ed4250adc44601256f6bbbd4ab5cc80c').enabled?.should eq(false)
31
+
32
+ # The blast button should still be disabled
33
+ b.button(:id => 'method').text.should eq('BLAST')
34
+ b.button(:id => 'method').enabled?.should eq(false)
35
+
36
+ # Give a sequence we know should hit
37
+ b.textarea(:name => 'sequence').set 'YTLPPPPTKLYSAPISCRKNKTGHWMDDILSIKTGESCPVNNYLHSGFLA'
38
+
39
+ #blast butn now active
40
+ b.button(:id => 'method').text.should eq('BLASTP')
41
+ b.button(:id => 'method').enabled?.should eq(true)
42
+
43
+ # Run the blast
44
+ b.button(:id => 'method').click
45
+
46
+ while b.div(:id => 'result').text.include?('Waiting for BLAST to be run')
47
+ end
48
+
49
+ # blast should have worked
50
+ b.div(:id => 'result').text.include?('FASTA of 11 retrievable').should eq(true)
51
+ end
52
+ end
53
+
54
+ #####################################################################################
55
+ #+++++++++++ Below is admin code, hopefully not necessary to mess around with to test new UI specs
56
+
57
+ # NOT thread-safe, at least because of the interaction with headless
58
+ class BrowserAdmin
59
+ def self.setup_browser(type)
60
+ case type
61
+ when :firefox then
62
+ Watir::Browser.new :firefox
63
+ when :chrome then
64
+ Watir::Browser.new :chrome
65
+ when :headless_firefox then
66
+ @headless = Headless.new
67
+ @headless.start
68
+ Watir::Browser.new :firefox
69
+ when :headless_chrome then
70
+ @headless = Headless.new
71
+ @headless.start
72
+ Watir::Browser.new :chrome
73
+ else
74
+ raise "Unknown browser type asked for: #{type.inspect}"
75
+ end
76
+ end
77
+
78
+ def self.teardown_browser(browser)
79
+ browser.close
80
+
81
+ # Re-head again, but maybe this makes no difference
82
+ @headless.destroy unless @headless.nil?
83
+ @headless = nil
84
+ end
85
+ end
86
+
87
+
88
+ describe 'ui' do
89
+ [:firefox, :chrome, :headless_firefox, :headless_chrome].each do |bro|
90
+ context bro.to_s do
91
+ it_behaves_like 'a browser' do
92
+ browser = nil
93
+ before do
94
+ browser = BrowserAdmin.setup_browser bro
95
+ end
96
+ after do
97
+ BrowserAdmin.teardown_browser browser
98
+ end
99
+ let(:b){browser}
100
+ end
101
+ end
102
+ end
103
+ end
104
+
@@ -0,0 +1,104 @@
1
+ require 'rspec'
2
+ require 'watir-webdriver'
3
+ require 'headless'
4
+
5
+ # These shared examples should work for
6
+ shared_examples_for 'a browser' do
7
+ let(:seqserv_url){'http://localhost:4567'}
8
+
9
+ it 'should simply go the seqserv webpage' do
10
+ b.goto seqserv_url
11
+ b.url.gsub(/\/$/,'').should eq(seqserv_url)
12
+ b.ready_state.should eq('complete')
13
+ end
14
+
15
+ it 'should do a simple blastp' do
16
+ b.goto seqserv_url
17
+
18
+ # Nucleotide database should be available
19
+ b.checkbox(:value => 'e205221dd32dc53ebfc9fb48cbdecd9e').enabled?.should eq(true)
20
+
21
+ # First up the blast button should be disabled
22
+ b.button(:id => 'method').text.should eq('BLAST')
23
+ b.button(:id => 'method').enabled?.should eq(false)
24
+
25
+ # Pick a protein blast database
26
+ b.checkbox(:value => '6669b1c88665158621afc06407ce88ea').set
27
+ b.checkbox(:value => '6669b1c88665158621afc06407ce88ea').checked?.should eq(true)
28
+
29
+ # nuc dbs now disabled
30
+ b.checkbox(:value => 'e205221dd32dc53ebfc9fb48cbdecd9e').enabled?.should eq(false)
31
+
32
+ # The blast button should still be disabled
33
+ b.button(:id => 'method').text.should eq('BLAST')
34
+ b.button(:id => 'method').enabled?.should eq(false)
35
+
36
+ # Give a sequence we know should hit
37
+ b.textarea(:name => 'sequence').set 'YTLPPPPTKLYSAPISCRKNKTGHWMDDILSIKTGESCPVNNYLHSGFLA'
38
+
39
+ #blast butn now active
40
+ b.button(:id => 'method').text.should eq('BLASTP')
41
+ b.button(:id => 'method').enabled?.should eq(true)
42
+
43
+ # Run the blast
44
+ b.button(:id => 'method').click
45
+
46
+ while b.div(:id => 'result').text.include?('Waiting for BLAST to be run')
47
+ end
48
+
49
+ # blast should have worked
50
+ b.div(:id => 'result').text.include?('Sequences producing significant alignments: ').should eq(true)
51
+ end
52
+ end
53
+
54
+ #####################################################################################
55
+ #+++++++++++ Below is admin code, hopefully not necessary to mess around with to test new UI specs
56
+
57
+ # NOT thread-safe, at least because of the interaction with headless
58
+ class BrowserAdmin
59
+ def self.setup_browser(type)
60
+ case type
61
+ when :firefox then
62
+ Watir::Browser.new :firefox
63
+ when :chrome then
64
+ Watir::Browser.new :chrome
65
+ when :headless_firefox then
66
+ @headless = Headless.new
67
+ @headless.start
68
+ Watir::Browser.new :firefox
69
+ when :headless_chrome then
70
+ @headless = Headless.new
71
+ @headless.start
72
+ Watir::Browser.new :chrome
73
+ else
74
+ raise "Unknown browser type asked for: #{type.inspect}"
75
+ end
76
+ end
77
+
78
+ def self.teardown_browser(browser)
79
+ browser.close
80
+
81
+ # Re-head again, but maybe this makes no difference
82
+ @headless.destroy unless @headless.nil?
83
+ @headless = nil
84
+ end
85
+ end
86
+
87
+
88
+ describe 'ui' do
89
+ [:firefox, :chrome, :headless_firefox, :headless_chrome].each do |bro|
90
+ context bro.to_s do
91
+ it_behaves_like 'a browser' do
92
+ browser = nil
93
+ before do
94
+ browser = BrowserAdmin.setup_browser bro
95
+ end
96
+ after do
97
+ BrowserAdmin.teardown_browser browser
98
+ end
99
+ let(:b){browser}
100
+ end
101
+ end
102
+ end
103
+ end
104
+
@@ -0,0 +1,10 @@
1
+ it "should automatically focus sequence input box" do
2
+ # when the page loads, check that sequence input box is focussed
3
+ #
4
+ # NOTE: unless #75 is resolved, make sure to test this functionality only if
5
+ # HTML5 autofocus attribute is supported
6
+ end
7
+
8
+ it "should ensure spell checking is disabled for sequence input box" do
9
+ # NOTE: only if the browser supports it
10
+ end
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xml:lang="en" lang="en" xmlns="http://www.w3.org/1999/xhtml">
4
+ <head>
5
+ <title>SequenceServer</title>
6
+ <meta name="author" content="Anurag Priyam" />
7
+ <meta name="author" content="Yannick Wurm" />
8
+ <meta name="author" content="Cedric Wurm" />
9
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
10
+
11
+ <%# without a space after erb's closing tag, a / gets appended to css' path %>
12
+ <link rel="stylesheet" media="screen" type="text/css" href=<%= uri('/css/beige.css') %> />
13
+ </head>
14
+
15
+ <body>
16
+ <div class="container">
17
+ <h1>Oops! Something went wonky!</h1>
18
+ <p>Apologies, there was an error with your request:
19
+ <strong><%=request.env['sinatra.error'].message %> </strong></p>
20
+ <p>If the error persists please contact the administrator</p>
21
+ </div>
22
+ </body>
@@ -0,0 +1,144 @@
1
+ <%#
2
+
3
+ NOTE: The markup below is displayed in a modal window. Use less than 70
4
+ characters per line to preserve formatting.
5
+ %>
6
+
7
+ <h6>General Search Options</h6>
8
+
9
+ <br/>
10
+
11
+ <ul class="unstyled">
12
+ <li>
13
+ <pre><%= ERB::Util.h %q|-evalue <Real>
14
+ Expectation value (E) threshold for saving hits
15
+ Default = '10'| %></pre>
16
+ </li>
17
+ <li>
18
+ <pre><%= ERB::Util.h %q|-word_size <Integer, >=2>
19
+ Word size for wordfinder algorithm| %></pre>
20
+ </li>
21
+ <li>
22
+ <pre><%= ERB::Util.h %q|-gapopen <Integer>
23
+ Cost to open a gap| %></pre>
24
+ </li>
25
+ <li>
26
+ <pre><%= ERB::Util.h %q|-gapextend <Integer>
27
+ Cost to extend a gap| %></pre>
28
+ </li>
29
+ <li>
30
+ <pre><%= ERB::Util.h %q|-matrix <String>
31
+ Scoring matrix name (normally BLOSUM62)| %></pre>
32
+ </li>
33
+ <li>
34
+ <pre><%= ERB::Util.h %q|-threshold <Real, >=0>
35
+ Minimum word score such that the word is added to the BLAST lookup
36
+ table| %></pre>
37
+ </li>
38
+ <li>
39
+ <pre><%= ERB::Util.h %q|-comp_based_stats <String>
40
+ Use composition-based statistics for blastp / tblastn:
41
+ D or d: default (equivalent to 2)
42
+ 0 or F or f: no composition-based statistics
43
+ 1: Composition-based statistics as in NAR 29:2994-3005, 2001
44
+ 2 or T or t : Composition-based score adjustment as in
45
+ Bioinformatics 21:902-911, 2005, conditioned on sequence
46
+ properties
47
+ 3: Composition-based score adjustment as in Bioinformatics
48
+ 21:902-911, 2005, unconditionally
49
+ For programs other than tblastn, must either be absent or be D, F
50
+ or 0
51
+ Default = `2'| %></pre>
52
+ </li>
53
+ <li>
54
+ <pre><%= ERB::Util.h %q|-num_descriptions <Integer, >=0>
55
+ Number of database sequences to show one-line descriptions for
56
+ Default = `500'| %></pre>
57
+ </li>
58
+ <li>
59
+ <pre><%= ERB::Util.h %q| -num_alignments <Integer, >=0>
60
+ Number of database sequences to show alignments for
61
+ Default = `250'| %></pre>
62
+ </li>
63
+ </ul>
64
+
65
+ <br/>
66
+
67
+ <h6>Query filtering options</h6>
68
+
69
+ <br/>
70
+
71
+ <ul class="unstyled">
72
+ <li>
73
+ <pre><%= ERB::Util.h %q|-seg <String>
74
+ Filter query sequence with SEG (Format: 'yes', 'window locut hicut',
75
+ or 'no' to disable)
76
+ Default = `no'| %></pre>
77
+ </li>
78
+ <li>
79
+ <pre><%= ERB::Util.h %q|-soft_masking <Boolean>
80
+ Apply filtering locations as soft masks
81
+ Default = `false'| %></pre>
82
+ </li>
83
+ <li>
84
+ <pre><%= ERB::Util.h %q|-lcase_masking
85
+ Use lower case filtering in query and subject sequence(s)?| %></pre>
86
+ </li>
87
+ </ul>
88
+
89
+ <br/>
90
+
91
+ <h6>Restrict search or results</h6>
92
+
93
+ <br/>
94
+
95
+ <ul class="unstyled">
96
+ <li>
97
+ <pre><%= ERB::Util.h %q|-gilist <String>
98
+ Restrict search of database to list of GI's
99
+ * Incompatible with: negative_gilist, seqidlist, remote, subject,
100
+ subject_loc| %></pre>
101
+ </li>
102
+ <li>
103
+ <pre><%= ERB::Util.h %q|-seqidlist <String>
104
+ Restrict search of database to list of SeqId's
105
+ * Incompatible with: gilist, negative_gilist, remote, subject,
106
+ subject_loc| %></pre>
107
+ </li>
108
+ <li>
109
+ <pre><%= ERB::Util.h %q|-negative_gilist <String>
110
+ Restrict search of database to everything except the listed GIs
111
+ * Incompatible with: gilist, seqidlist, remote, subject,
112
+ subject_loc| %></pre>
113
+ </li>
114
+ <li>
115
+ <pre><%= ERB::Util.h %q|-entrez_query <String>
116
+ Restrict search with the given Entrez query
117
+ * Requires: remote| %></pre>
118
+ </li>
119
+ <li>
120
+ <pre><%= ERB::Util.h %q|-db_soft_mask <String>
121
+ Filtering algorithm ID to apply to the BLAST database as soft masking
122
+ * Incompatible with: subject, subject_loc| %></pre>
123
+ </li>
124
+ <li>
125
+ <pre><%= ERB::Util.h %q|-culling_limit <Integer, >=0>
126
+ If the query range of a hit is enveloped by that of at least this
127
+ many higher-scoring hits, delete the hit
128
+ * Incompatible with: best_hit_overhang, best_hit_score_edge| %></pre>
129
+ </li>
130
+ <li>
131
+ <pre><%= ERB::Util.h %q|-best_hit_overhang <Real, (>0 and <0.5)>
132
+ Best Hit algorithm overhang value (recommended value: 0.1)
133
+ * Incompatible with: culling_limit| %></pre>
134
+ </li>
135
+ <li>
136
+ <pre><%= ERB::Util.h %q|-best_hit_score_edge <Real, (>0 and <0.5)>
137
+ Best Hit algorithm score edge value (recommended value: 0.1)
138
+ * Incompatible with: culling_limit| %></pre>
139
+ </li>
140
+ <li>
141
+ <pre><%= ERB::Util.h %q|-max_target_seqs <Integer, >=1>
142
+ Maximum number of aligned sequences to keep| %></pre>
143
+ </li>
144
+ </ul>