sequenceserver 2.0.0.beta4 → 2.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sequenceserver might be problematic. Click here for more details.

Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +7 -4
  3. data/AppImage/sequenceserver.sh +5 -0
  4. data/lib/sequenceserver.rb +9 -5
  5. data/lib/sequenceserver/blast/job.rb +7 -24
  6. data/lib/sequenceserver/blast/report.rb +66 -33
  7. data/lib/sequenceserver/routes.rb +28 -2
  8. data/lib/sequenceserver/version.rb +1 -1
  9. data/public/SequenceServer_logo.png +0 -0
  10. data/public/css/grapher.css +8 -15
  11. data/public/css/sequenceserver.css +115 -55
  12. data/public/css/sequenceserver.min.css +3 -3
  13. data/public/js/circos.js +1 -1
  14. data/public/js/download_fasta.js +17 -0
  15. data/public/js/grapher.js +7 -9
  16. data/public/js/hit.js +217 -0
  17. data/public/js/hits_overview.js +12 -13
  18. data/public/js/hsp.js +104 -84
  19. data/public/js/{sequenceserver.js → jquery_world.js} +1 -18
  20. data/public/js/kablammo.js +337 -334
  21. data/public/js/length_distribution.js +1 -1
  22. data/public/js/query.js +147 -0
  23. data/public/js/report.js +203 -830
  24. data/public/js/search.js +176 -169
  25. data/public/js/sequence_modal.js +167 -0
  26. data/public/js/sidebar.js +210 -0
  27. data/public/js/utils.js +2 -19
  28. data/public/js/visualisation_helpers.js +2 -2
  29. data/public/sequenceserver-report.min.js +19 -19
  30. data/public/sequenceserver-search.min.js +11 -11
  31. data/public/vendor/github/twbs/bootstrap@3.3.5/js/bootstrap.js +2 -2
  32. data/spec/blast_versions/blast_2.2.30/import_spec_capybara_local_2.2.30.rb +5 -5
  33. data/spec/blast_versions/blast_2.2.31/import_spec_capybara_local_2.2.31.rb +5 -5
  34. data/spec/blast_versions/blast_2.3.0/import_spec_capybara_local_2.3.0.rb +5 -5
  35. data/spec/blast_versions/blast_2.4.0/import_spec_capybara_local_2.4.0.rb +5 -5
  36. data/spec/blast_versions/blast_2.5.0/import_spec_capybara_local_2.5.0.rb +5 -5
  37. data/spec/blast_versions/blast_2.6.0/import_spec_capybara_local_2.6.0.rb +5 -5
  38. data/spec/blast_versions/blast_2.7.1/import_spec_capybara_local_2.7.1.rb +5 -5
  39. data/spec/blast_versions/blast_2.8.1/import_spec_capybara_local_2.8.1.rb +5 -5
  40. data/spec/blast_versions/blast_2.9.0/import_spec_capybara_local_2.9.0.rb +5 -5
  41. data/spec/blast_versions/diamond_0.9.24/import_spec_capybara_local_0.9.24.rb +2 -2
  42. data/spec/capybara_spec.rb +1 -1
  43. data/views/layout.erb +1 -1
  44. metadata +9 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8617ffb07710b984f84dfc0dfb7d43c66cac4c3
4
- data.tar.gz: 14ddad09e8dcb15793d8e06227138ee4c862b280
3
+ metadata.gz: a05949fcff69da464c286499cb974ea9c2cbe2c2
4
+ data.tar.gz: 5b697c08198c4424561fa226136719d2fb49c3cd
5
5
  SHA512:
6
- metadata.gz: c130d6e3828eae5dae108786e08433d5641112305962884dc2dada918a6a92c17632f7c46400c58ea0adabf106cb02e348bf6adc35dc8cbf296300081221fc99
7
- data.tar.gz: 17a41dcb923c2e64337b960de1e3717b458077a9658a9e7785ab5815c43860aff09033aacd7812146e0f1fe368878f649794b1aa5bd8bbaf13c8a4a34fe7b0ac
6
+ metadata.gz: 9bdb8c9a31a2323d587c1f1e3a79357c22b0c4f6b0612e5872b1c0f6a6e1f7c720718ae7ef9e0f168dc0d420957cfa98d72ae6335c888c2360c609a8d98c21b8
7
+ data.tar.gz: d58521faa39150d36ac2df81b21ad68e80d8c465e792049ff10ca46e7ca8a60fb84a9f43404eb01c4efa8c799796e645108e0a46cb53b8494c30a9657a50a8b1
@@ -24,14 +24,17 @@ before_install:
24
24
  - wget -c "https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-linux64.tar.gz" && tar xvf geckodriver-*.tar.gz -C bin
25
25
  # Download codeclimate test reporter to bin and make it executable
26
26
  - wget -c "https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64" -O bin/cc-test-reporter && chmod +x bin/cc-test-reporter
27
- # Download and extract NCBI BLAST+ 2.9.0
28
- - wget -c "ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.9.0/ncbi-blast-2.9.0+-x64-linux.tar.gz" && tar xvf ncbi-blast-*.tar.gz
27
+ # Download and extract NCBI BLAST+ 2.10.0
28
+ - wget -c "ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.10.0/ncbi-blast-2.10.0+-x64-linux.tar.gz" && tar xvf ncbi-blast-*.tar.gz
29
29
  # Conclude installation by adding opt/bin/ containing codeclimate test reporter
30
- # and geckodriver, and opt/ncbi-blast-2.9.0+/bin containing BLAST+ binaries to
30
+ # and geckodriver, and opt/ncbi-blast-2.10.0+/bin containing BLAST+ binaries to
31
31
  # PATH.
32
- - export PATH="$PWD/bin:$PWD/ncbi-blast-2.9.0+/bin:$PATH"
32
+ - export PATH="$PWD/bin:$PWD/ncbi-blast-2.10.0+/bin:$PATH"
33
33
  # Reset working directory or subsequent steps may fail.
34
34
  - cd ..
35
+ # Update bundler. Travis was using bundler 1.16.2 at the time of this writing
36
+ # and the builds were failing because Gemfile.lock requires bundler > 2.0
37
+ - gem install bundler -v 2.1.4
35
38
 
36
39
  env:
37
40
  global:
@@ -1,3 +1,8 @@
1
+ # cd back to the directory where the AppImage was launched from. AppRun changes
2
+ # the working directory so as to work with binaries that have /usr hard-coded;
3
+ # we don't.
4
+ cd $OWD
5
+
1
6
  # Set GEM_PATH to where we installed gems in the AppImage.
2
7
  export GEM_PATH=$APPDIR/var/lib/gems/2.3.0
3
8
 
@@ -5,7 +5,7 @@ require 'resolv'
5
5
  # Top level module / namespace.
6
6
  module SequenceServer
7
7
  # Use a fixed minimum version of BLAST+
8
- BLAST_VERSION = '2.9.0+'.freeze
8
+ BLAST_VERSION = '2.10.0+'.freeze
9
9
 
10
10
  # Default location of configuration file.
11
11
  DEFAULT_CONFIG_FILE = '~/.sequenceserver.conf'.freeze
@@ -138,10 +138,14 @@ module SequenceServer
138
138
  puts
139
139
  puts '** Thank you for using SequenceServer :).'
140
140
  puts ' Please cite: '
141
- puts ' Priyam A, Woodcroft BJ, Rai V, Munagala A, Moghul I, Ter F,'
142
- puts ' Gibbins MA, Moon H, Leonard G, Rumpf W & Wurm Y. 2015.'
143
- puts ' Sequenceserver: a modern graphical user interface for'
144
- puts ' custom BLAST databases. biorxiv doi: 10.1101/033142.'
141
+ puts ' Priyam A, Woodcroft BJ, Rai V, Moghul I, Munagala A, Ter F,'
142
+ puts ' Chowdhary H, Pieniak I, Maynard LJ, Gibbins MA, Moon H,'
143
+ puts ' Davis-Richardson A, Uludag M, Watson-Haigh N, Challis R,'
144
+ puts ' Nakamura H, Favreau E, Gómez EA, Pluskal T, Leonard G,'
145
+ puts ' Rumpf W & Wurm Y.'
146
+ puts ' Sequenceserver: A modern graphical user interface for'
147
+ puts ' custom BLAST databases.'
148
+ puts ' Molecular Biology and Evolution (2019)'
145
149
  end
146
150
 
147
151
  # This method is invoked by the -i switch to start an IRB shell with
@@ -13,7 +13,6 @@ module SequenceServer
13
13
  # itself is self-contained. This will help with tests among
14
14
  # other things.
15
15
  FileUtils.cp(params[:xml], dir)
16
- @advanced_params = {}
17
16
  @databases = []
18
17
  done!
19
18
  end
@@ -23,17 +22,19 @@ module SequenceServer
23
22
  @method = params[:method]
24
23
  @qfile = store('query.fa', params[:sequence])
25
24
  @databases = Database[params[:databases]]
26
- @options = params[:advanced].to_s.strip + defaults
27
- @advanced_params = parse_advanced params[:advanced]
25
+ @advanced = params[:advanced].to_s.strip
26
+ @options = @advanced + defaults
28
27
  end
29
28
  end
30
29
  end
31
30
 
32
- attr_reader :advanced_params
33
-
34
31
  # :nodoc:
35
32
  # Attributes used by us - should be considered private.
36
- attr_reader :method, :qfile, :databases, :options
33
+ attr_reader :method, :qfile, :databases, :advanced, :options
34
+
35
+ # :nodoc:
36
+ # Deprecated; see Report#extract_params
37
+ attr_reader :advanced_params
37
38
 
38
39
  # :nodoc:
39
40
  # Returns path to the imported xml file if the job was created using the
@@ -94,24 +95,6 @@ module SequenceServer
94
95
 
95
96
  private
96
97
 
97
- def parse_advanced(param_line)
98
- param_list = (param_line || '').split(' ')
99
- res = {}
100
-
101
- param_list.each_with_index do |word, i|
102
- nxt = param_list[i + 1]
103
- if word.start_with? '-'
104
- word.sub!('-', '')
105
- unless nxt.nil? || nxt.start_with?('-')
106
- res[word] = nxt
107
- else
108
- res[word] = 'True'
109
- end
110
- end
111
- end
112
- res
113
- end
114
-
115
98
  def validate(params)
116
99
  validate_method params[:method]
117
100
  validate_sequences params[:sequence]
@@ -24,34 +24,15 @@ module SequenceServer
24
24
  class Report < Report
25
25
  def initialize(job)
26
26
  super do
27
- @querydb = job.databases
28
27
  @queries = []
29
28
  end
30
29
  end
31
30
 
32
- # Attributes parsed out from XML output.
33
- attr_reader :program, :program_version, :params, :stats, :queries
34
-
35
- # This is obtained from the job object.
36
- attr_reader :querydb
31
+ # Attributes parsed out from BLAST output.
32
+ attr_reader :program, :program_version, :stats, :queries
37
33
 
38
- # Returns database type (nucleotide or protein) used for running BLAST
39
- # search. If we ran the BLAST search, this information is available
40
- # from Job#databases. For imported XML, this is inferred from
41
- # Report#program (i.e., the BLAST algorithm)
42
- def dbtype
43
- return @dbtype if @dbtype
44
- @dbtype = if @querydb.empty?
45
- case program
46
- when /blastn|tblastn|tblastx/
47
- 'nucleotide'
48
- when /blastp|blastx/
49
- 'protein'
50
- end
51
- else
52
- @querydb.first.type
53
- end
54
- end
34
+ # Attributes parsed from job metadata and BLAST output.
35
+ attr_reader :querydb, :dbtype, :params
55
36
 
56
37
  def to_json
57
38
  [:querydb, :program, :program_version, :params, :stats,
@@ -68,6 +49,8 @@ module SequenceServer
68
49
  # Generate report.
69
50
  def generate
70
51
  job.raise!
52
+ xml_ir = nil
53
+ tsv_ir = nil
71
54
  if job.imported_xml_file
72
55
  xml_ir = parse_xml File.read(job.imported_xml_file)
73
56
  tsv_ir = Hash.new do |h1,k1|
@@ -75,18 +58,15 @@ module SequenceServer
75
58
  h2[k2]=['','',[]]
76
59
  end
77
60
  end
78
- extract_program_info xml_ir
79
- extract_params xml_ir
80
- extract_stats xml_ir
81
- extract_queries xml_ir, tsv_ir
82
61
  else
83
62
  xml_ir = parse_xml File.read(Formatter.run(job, 'xml').file)
84
- tsv_ir = parse_tsv File.read(Formatter.run(job, 'custom_tsv').file )
85
- extract_program_info xml_ir
86
- extract_params xml_ir
87
- extract_stats xml_ir
88
- extract_queries xml_ir, tsv_ir
63
+ tsv_ir = parse_tsv File.read(Formatter.run(job, 'custom_tsv').file)
89
64
  end
65
+ extract_program_info xml_ir
66
+ extract_db_info xml_ir
67
+ extract_params xml_ir
68
+ extract_stats xml_ir
69
+ extract_queries xml_ir, tsv_ir
90
70
  end
91
71
 
92
72
  # Make program name and program name + version available via `program`
@@ -96,6 +76,20 @@ module SequenceServer
96
76
  @program_version = ir[1]
97
77
  end
98
78
 
79
+ # Get database information (title and type) from job yaml or from XML.
80
+ # Sets `querydb` and `dbtype` attributes.
81
+ def extract_db_info(ir)
82
+ if job.databases.empty?
83
+ @querydb = ir[3].split.map do |path|
84
+ { title: File.basename(path) }
85
+ end
86
+ @dbtype = dbtype_from_program
87
+ else
88
+ @querydb = job.databases
89
+ @dbtype = @querydb.first.type
90
+ end
91
+ end
92
+
99
93
  # Make search params available via `params` attribute.
100
94
  #
101
95
  # Search params tweak the results. Like evalue cutoff or penalty to open
@@ -103,11 +97,20 @@ module SequenceServer
103
97
  # matrix, evalue, gapopen, gapextend, and filters are available from XML
104
98
  # output.
105
99
  def extract_params(ir)
100
+ # Parse/get params from the job first.
101
+ job_params = parse_advanced(job.advanced)
102
+ # Old jobs from beta releases may not have the advanced key but they
103
+ # will have the deprecated advanced_params key.
104
+ job_params.update(job.advanced_params) if job.advanced_params
105
+
106
+ # Parse params from BLAST XML.
106
107
  @params = Hash[
107
108
  *ir[7].first.map { |k, v| [k.gsub('Parameters_', ''), v] }.flatten
108
109
  ]
109
110
  @params['evalue'] = @params.delete('expect')
110
- @params = job.advanced_params.merge(@params)
111
+
112
+ # Merge into job_params.
113
+ @params = job_params.merge(@params)
111
114
  end
112
115
 
113
116
  # Make search stats available via `stats` attribute.
@@ -232,6 +235,36 @@ module SequenceServer
232
235
  end
233
236
  ir
234
237
  end
238
+
239
+ # Parse BLAST CLI string from job.advanced.
240
+ def parse_advanced(param_line)
241
+ param_list = (param_line || '').split(' ')
242
+ res = {}
243
+
244
+ param_list.each_with_index do |word, i|
245
+ nxt = param_list[i + 1]
246
+ if word.start_with? '-'
247
+ word.sub!('-', '')
248
+ unless nxt.nil? || nxt.start_with?('-')
249
+ res[word] = nxt
250
+ else
251
+ res[word] = 'True'
252
+ end
253
+ end
254
+ end
255
+ res
256
+ end
257
+
258
+ # Returns database type (nucleotide or protein) inferred from
259
+ # Report#program (i.e., the BLAST algorithm)
260
+ def dbtype_from_program
261
+ case program
262
+ when /blastn|tblastn|tblastx/
263
+ 'nucleotide'
264
+ when /blastp|blastx/
265
+ 'protein'
266
+ end
267
+ end
235
268
  end
236
269
  end
237
270
  end
@@ -69,10 +69,16 @@ module SequenceServer
69
69
  # include available databases and user-defined search options.
70
70
  get '/searchdata.json' do
71
71
  searchdata = {
72
+ query: Database.retrieve(params[:query]),
72
73
  database: Database.all,
73
- options: SequenceServer.config[:options],
74
- query: Database.retrieve(params[:query])
74
+ options: SequenceServer.config[:options]
75
75
  }
76
+
77
+ # If a job_id is specified, update searchdata from job meta data (i.e.,
78
+ # query, pre-selected databases, advanced options used). Query is only
79
+ # updated if params[:query] is not specified.
80
+ update_searchdata_from_job(searchdata) if params[:job_id]
81
+
76
82
  searchdata.to_json
77
83
  end
78
84
 
@@ -180,5 +186,25 @@ module SequenceServer
180
186
 
181
187
  error_data.to_json
182
188
  end
189
+
190
+ # Get the query sequences, selected databases, and advanced params used.
191
+ def update_searchdata_from_job(searchdata)
192
+ job = Job.fetch(params[:job_id])
193
+ return if job.imported_xml_file
194
+
195
+ # Only read job.qfile if we are not going to use Database.retrieve.
196
+ searchdata[:query] = File.read(job.qfile) if !params[:query]
197
+
198
+ # Which databases to pre-select.
199
+ searchdata[:preSelectedDbs] = job.databases
200
+
201
+ # job.advanced may be nil in case of old jobs. In this case, we do not
202
+ # override searchdata so that default advanced parameters can be applied.
203
+ # Note that, job.advanced will be an empty string if a user deletes the
204
+ # default advanced parameters from the advanced params input field. In
205
+ # this case, we do want the advanced params input field to be empty when
206
+ # the user hits the back button. Thus we do not test for empty string.
207
+ searchdata[:options][job.method] = [job.advanced] if job.advanced
208
+ end
183
209
  end
184
210
  end
@@ -1,4 +1,4 @@
1
1
  # Define version number.
2
2
  module SequenceServer
3
- VERSION = '2.0.0.beta4'.freeze
3
+ VERSION = '2.0.0.rc1'.freeze
4
4
  end
@@ -1,18 +1,20 @@
1
1
  /** Common styles for container element of all graphs. **/
2
2
  .grapher {
3
- margin: 20px 0;
3
+ margin: 0;
4
+ }
5
+ .grapher-header {
6
+ padding-right: 1px;
4
7
  }
5
8
  .caption {
6
9
  display: inline-block;
7
- letter-spacing: 1px;
8
- padding: 0 0 0 5px;
10
+ padding: 0 0 0 1px;
9
11
  margin: 0 0;
10
12
  cursor: pointer;
11
13
  }
12
14
  .graph-links {
13
15
  float: right;
14
- padding: 0 7px 0 0;
15
16
  text-align: right;
17
+ color: #174465;
16
18
  }
17
19
 
18
20
  /** Common SVG styles for all graphs. **/
@@ -35,22 +37,16 @@ svg .axis path,
35
37
 
36
38
  .grapher.circos .caption {
37
39
  padding: 0;
40
+ font-size: 16px;
41
+ font-weight: bold;
38
42
  }
39
43
 
40
44
  /* Graphical overview of hits */
41
- .grapher.alignment-overview {
42
- margin-top: 10px;
43
- margin-bottom: 0;
44
- }
45
45
  .alignment-overview.svg-container {
46
46
  text-align: center;
47
47
  }
48
48
 
49
49
  /* Length distribution of hits */
50
- .grapher.length-distribution {
51
- margin-top: 0;
52
- margin-bottom: 0;
53
- }
54
50
  .length-distribution.svg-container {
55
51
  height: 150px;
56
52
  }
@@ -59,9 +55,6 @@ svg .bar:hover {
59
55
  }
60
56
 
61
57
  /* Graphical overview of HSP */
62
- .kablammo.grapher {
63
- margin: 10px 0 10px 0;
64
- }
65
58
  .kablammo.svg-container {
66
59
  height: 150px;
67
60
  }
@@ -22,6 +22,15 @@ body {
22
22
  */
23
23
  a:hover, .btn-link:hover {
24
24
  text-decoration: none;
25
+ color: #c74f14;
26
+ }
27
+
28
+ a {
29
+ color: #1b557a;
30
+ }
31
+
32
+ label:hover {
33
+ color: #c74f14;
25
34
  }
26
35
 
27
36
  /**
@@ -32,6 +41,10 @@ textarea {
32
41
  min-height: 214px;
33
42
  }
34
43
 
44
+ hr {
45
+ border-top: transparent;
46
+ }
47
+
35
48
  /**
36
49
  * Use normal font weight for labels and indicate they are clickable by setting
37
50
  * `cursor: pointer`.
@@ -40,17 +53,27 @@ label {
40
53
  cursor: pointer;
41
54
  margin-bottom: 0;
42
55
  font-weight: normal;
56
+ color: #1b557a;
43
57
  }
44
58
 
45
59
  small {
46
60
  color: inherit !important;
47
61
  }
48
62
 
63
+ h3 {
64
+ font-size: 16px;
65
+ }
66
+ h4 {
67
+ font-size: 14px;
68
+ }
69
+ h3 > .fa, h4 > .fa {
70
+ vertical-align: bottom;
71
+ }
49
72
  /**
50
73
  * Without this .disabled elements hardly look disabled.
51
74
  */
52
75
  .disabled {
53
- color: #ccc;
76
+ color: #ccc !important;
54
77
  }
55
78
  a.disabled:hover,
56
79
  .btn-link[disabled]:hover {
@@ -64,34 +87,49 @@ a.disabled:hover,
64
87
  .navbar {
65
88
  margin-bottom: 0;
66
89
  border-radius: 0;
67
- border-bottom: 1px solid #eee;
90
+ border-bottom: 1px solid #c74f14;
68
91
  }
69
92
  .navbar-brand {
70
93
  height: auto;
71
- padding: 20px 15px;
94
+ padding: 10px 7.5px;
72
95
  font-size: 32px;
73
96
  color: rgb(51, 51, 51);
74
97
  }
75
98
  .navbar-brand > small {
76
99
  font-size: 50%;
100
+ vertical-align: text-bottom;
77
101
  }
78
102
 
79
103
  .navbar-nav > li > a {
80
- padding: 24px 15px;
104
+ padding: 10px 7.5px;
81
105
  font-size: 14px;
82
- color: rgb(51, 51, 51);
106
+ color: #174465;
107
+ }
108
+ /* logo */
109
+ .navbar-brand > img {
110
+ display: inline-block;
83
111
  }
84
112
 
85
113
  /**
86
114
  * Like BS' .page-header but without extra margin and the ability to display a
87
115
  * sub-text on right.
88
116
  */
117
+ /* Hit header styling */
89
118
  .section-header {
90
- border-bottom: 1px solid #ddd;
91
- padding-bottom: 5px;
119
+ border-bottom: 1px solid #c74f14;
120
+ padding-left: 1px;
121
+ display: table;
122
+ width: 100%;
123
+ }
124
+ .section-header-sidebar {
125
+ padding-left: 1px;
92
126
  display: table;
93
127
  width: 100%;
94
128
  }
129
+ .section-header-sidebar > h4 {
130
+ font-weight: bold;
131
+ margin-bottom: 0px;
132
+ }
95
133
  .section-header > * {
96
134
  display: table-cell;
97
135
  }
@@ -99,7 +137,7 @@ a.disabled:hover,
99
137
  width: 100%;
100
138
  }
101
139
  .section-content {
102
- padding: 5px 0 0 0px;
140
+ padding: 0 0 0 1px;
103
141
  }
104
142
  /**
105
143
  * Take out border, cut down margin and padding, and remove background color
@@ -112,11 +150,14 @@ a.disabled:hover,
112
150
  box-shadow: none;
113
151
  }
114
152
  .panel .panel-heading {
115
- padding: 4px 0 5px 0;
153
+ padding: 0;
116
154
  background-color: inherit;
155
+ border-bottom: 1px solid #c74f14;
117
156
  }
118
157
  .panel .panel-heading h4 {
119
158
  margin: 0;
159
+ font-size: 16px;
160
+ font-weight: bold;
120
161
  }
121
162
 
122
163
  /**
@@ -140,11 +181,12 @@ a.disabled:hover,
140
181
  .table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td,
141
182
  .table>tbody>tr>td, .table>tfoot>tr>td {
142
183
  border-top: none;
143
- padding-left: 0;
144
184
  font-weight: normal;
185
+ padding: 0 0 0 4px;
145
186
  }
146
187
  .table>thead>tr>th {
147
- border-bottom: 1px solid #ddd;
188
+ border-bottom: none;
189
+ color: #5f5f5f;
148
190
  }
149
191
 
150
192
  /**
@@ -216,12 +258,15 @@ a.disabled:hover,
216
258
  */
217
259
  .nav.hover-reset>li>a:hover {
218
260
  background-color: inherit;
261
+ color: #c74f14;
219
262
  }
220
263
  .nav.focus-reset>li>a:focus {
221
264
  background-color: inherit;
265
+ color: #c74f14;
222
266
  }
223
267
  .nav.active-bold>.active>a {
224
268
  font-weight: bold;
269
+ color: #c74f14;
225
270
  }
226
271
 
227
272
  /**
@@ -231,8 +276,11 @@ a.disabled:hover,
231
276
  color: inherit;
232
277
  line-height: inherit;
233
278
  font-weight: normal;
279
+ font-size: inherit;
280
+ }
281
+ .pos-label {
282
+ padding: 0 0 0 0.6em;
234
283
  }
235
-
236
284
  /**
237
285
  * Reset Bootstrap's CSS for pre tags.
238
286
  */
@@ -297,7 +345,7 @@ a.disabled:hover,
297
345
 
298
346
  .databases .list-group-item {
299
347
  border: none;
300
- padding: 3px 0 0;
348
+ padding: 1px 0 0;
301
349
  }
302
350
 
303
351
  #help pre:hover {
@@ -346,13 +394,11 @@ input[type=checkbox] {
346
394
  **********************/
347
395
  .sidebar > div {
348
396
  /* To line up with the results on the right */
349
- margin-top: 20px;
350
- }
351
- .sidebar h4 {
352
- font-size: 14px;
397
+ margin-top: 0px;
353
398
  }
399
+
354
400
  .sidebar li a {
355
- padding: 7px 10px;
401
+ padding: 3px 10px;
356
402
  }
357
403
 
358
404
  .sidebar.affix {
@@ -375,10 +421,13 @@ input[type=checkbox] {
375
421
  /* Result per query. */
376
422
  .overview {
377
423
  /* To line up with the sidebar on the left */
378
- margin: 20px 0;
424
+ margin: 10px 0 6px 0;
425
+ }
426
+ .overview p {
427
+ margin: 0;
379
428
  }
380
429
  .resultn {
381
- margin-bottom: 25px;
430
+ margin-top: 6px;
382
431
  }
383
432
 
384
433
  .graphical-overview {
@@ -390,61 +439,41 @@ input[type=checkbox] {
390
439
  padding-bottom: 0;
391
440
  }
392
441
 
393
- .tabular-view {
394
- margin-top: 14px;
395
- margin-left: 6px;
396
- margin-bottom: 14px;
397
- }
398
-
399
442
  .hit {
400
- padding-top: 14px;
401
443
  margin-top: 4px;
402
444
  }
403
- .hit:first-child {
404
- padding-top: 0;
405
- }
406
- .hit h4 {
445
+ .hit .section-header h4 {
407
446
  cursor: pointer;
447
+ padding-left: 1px;
408
448
  }
409
- .hit h4 span {
449
+ .hit .section-header h4 span,
450
+ .hit .section-header h4 strong {
410
451
  cursor: text;
411
452
  }
412
- .hit > p {
413
- margin-top: 0;
414
- margin-bottom: 0;
453
+ .hit-links {
454
+ height: 16px;
415
455
  }
416
456
 
417
- .hsps {
418
- padding: 0 0 10px 10px;
419
- }
420
457
  .hsp {
421
- padding-bottom: 14px;
422
- }
423
- .hsp:last-child {
424
- padding-bottom: 0;
458
+ padding: 1px 0 1px 2px;
425
459
  }
426
-
427
460
  .hsp-stats {
428
461
  font-size: 12px;
462
+ color:#5f5f5f;
429
463
  }
430
- .hsp .hsp-lines {
464
+ .hsp-lines {
431
465
  margin-top: 5px;
432
- font-size: 10px;
466
+ font-size: 11px;
433
467
  letter-spacing: 1.2px;
434
468
  }
435
- .hsp .hsp-coords {
436
- color: rgb(110, 110, 110);
469
+ .hsp-coords {
470
+ color: #5f5f5f;
437
471
  }
438
472
 
439
- .hit-links * {
440
- padding-left: 3px;
441
- letter-spacing: 1px;
442
- vertical-align: baseline;
443
- }
444
473
  .btn-link {
445
474
  border: none;
446
475
  padding: 0px;
447
- letter-spacing: 1px;
476
+ color: #1b557a;
448
477
  }
449
478
 
450
479
  .fastan > .section-header {
@@ -480,11 +509,42 @@ input[type=checkbox] {
480
509
  .dnd-overlay-container p {
481
510
  font-size: 48px;
482
511
  }
483
-
512
+ /* higlight when hit is selected */
484
513
  .glow {
485
- border-left: 2px solid #f0ad4e;
514
+ border-left: 2px solid #c74f14;
486
515
  }
487
516
 
488
517
  .downloads a {
489
518
  cursor: pointer;
490
519
  }
520
+ /* CSS class for logo */
521
+ .logo {
522
+ width: 205.05px;
523
+ max-height: 35px;
524
+ }
525
+ /* CSS class for vertical line separating the hit links */
526
+ .line {
527
+ color: #c74f14;
528
+ margin: 0 5px 0 5px;
529
+ }
530
+ /* override bootstrap focus color in the text field of the search page */
531
+ .form-control:focus {
532
+ border-color: #1b557a;
533
+ }
534
+ /* override bootstrap btn-color for the search "BlAST" button on the search page.*/
535
+ .btn-primary {
536
+ background-color: #1b557a;
537
+ border-color: #174465;
538
+ }
539
+ .btn-primary:hover {
540
+ background-color: #174465;
541
+ border-color: #174465;
542
+ }
543
+ .btn-primary:disabled, .btn-primary[disabled]:hover {
544
+ background-color: #881C14;
545
+ border-color: #881C14;
546
+ }
547
+ /* CSS class to facilitate the hit header wrapping */
548
+ .hit-header {
549
+ display: table-cell;
550
+ }