sequenceserver 2.0.0.beta4 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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
+ }