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.
- checksums.yaml +4 -4
- data/.travis.yml +7 -4
- data/AppImage/sequenceserver.sh +5 -0
- data/lib/sequenceserver.rb +9 -5
- data/lib/sequenceserver/blast/job.rb +7 -24
- data/lib/sequenceserver/blast/report.rb +66 -33
- data/lib/sequenceserver/routes.rb +28 -2
- data/lib/sequenceserver/version.rb +1 -1
- data/public/SequenceServer_logo.png +0 -0
- data/public/css/grapher.css +8 -15
- data/public/css/sequenceserver.css +115 -55
- data/public/css/sequenceserver.min.css +3 -3
- data/public/js/circos.js +1 -1
- data/public/js/download_fasta.js +17 -0
- data/public/js/grapher.js +7 -9
- data/public/js/hit.js +217 -0
- data/public/js/hits_overview.js +12 -13
- data/public/js/hsp.js +104 -84
- data/public/js/{sequenceserver.js → jquery_world.js} +1 -18
- data/public/js/kablammo.js +337 -334
- data/public/js/length_distribution.js +1 -1
- data/public/js/query.js +147 -0
- data/public/js/report.js +203 -830
- data/public/js/search.js +176 -169
- data/public/js/sequence_modal.js +167 -0
- data/public/js/sidebar.js +210 -0
- data/public/js/utils.js +2 -19
- data/public/js/visualisation_helpers.js +2 -2
- data/public/sequenceserver-report.min.js +19 -19
- data/public/sequenceserver-search.min.js +11 -11
- data/public/vendor/github/twbs/bootstrap@3.3.5/js/bootstrap.js +2 -2
- data/spec/blast_versions/blast_2.2.30/import_spec_capybara_local_2.2.30.rb +5 -5
- data/spec/blast_versions/blast_2.2.31/import_spec_capybara_local_2.2.31.rb +5 -5
- data/spec/blast_versions/blast_2.3.0/import_spec_capybara_local_2.3.0.rb +5 -5
- data/spec/blast_versions/blast_2.4.0/import_spec_capybara_local_2.4.0.rb +5 -5
- data/spec/blast_versions/blast_2.5.0/import_spec_capybara_local_2.5.0.rb +5 -5
- data/spec/blast_versions/blast_2.6.0/import_spec_capybara_local_2.6.0.rb +5 -5
- data/spec/blast_versions/blast_2.7.1/import_spec_capybara_local_2.7.1.rb +5 -5
- data/spec/blast_versions/blast_2.8.1/import_spec_capybara_local_2.8.1.rb +5 -5
- data/spec/blast_versions/blast_2.9.0/import_spec_capybara_local_2.9.0.rb +5 -5
- data/spec/blast_versions/diamond_0.9.24/import_spec_capybara_local_0.9.24.rb +2 -2
- data/spec/capybara_spec.rb +1 -1
- data/views/layout.erb +1 -1
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a05949fcff69da464c286499cb974ea9c2cbe2c2
|
4
|
+
data.tar.gz: 5b697c08198c4424561fa226136719d2fb49c3cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bdb8c9a31a2323d587c1f1e3a79357c22b0c4f6b0612e5872b1c0f6a6e1f7c720718ae7ef9e0f168dc0d420957cfa98d72ae6335c888c2360c609a8d98c21b8
|
7
|
+
data.tar.gz: d58521faa39150d36ac2df81b21ad68e80d8c465e792049ff10ca46e7ca8a60fb84a9f43404eb01c4efa8c799796e645108e0a46cb53b8494c30a9657a50a8b1
|
data/.travis.yml
CHANGED
@@ -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.
|
28
|
-
- wget -c "ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.
|
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.
|
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.
|
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:
|
data/AppImage/sequenceserver.sh
CHANGED
@@ -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
|
|
data/lib/sequenceserver.rb
CHANGED
@@ -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.
|
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,
|
142
|
-
puts '
|
143
|
-
puts '
|
144
|
-
puts '
|
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
|
-
@
|
27
|
-
@
|
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
|
33
|
-
attr_reader :program, :program_version, :
|
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
|
-
#
|
39
|
-
|
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
|
-
|
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
|
Binary file
|
data/public/css/grapher.css
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
/** Common styles for container element of all graphs. **/
|
2
2
|
.grapher {
|
3
|
-
margin:
|
3
|
+
margin: 0;
|
4
|
+
}
|
5
|
+
.grapher-header {
|
6
|
+
padding-right: 1px;
|
4
7
|
}
|
5
8
|
.caption {
|
6
9
|
display: inline-block;
|
7
|
-
|
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 #
|
90
|
+
border-bottom: 1px solid #c74f14;
|
68
91
|
}
|
69
92
|
.navbar-brand {
|
70
93
|
height: auto;
|
71
|
-
padding:
|
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:
|
104
|
+
padding: 10px 7.5px;
|
81
105
|
font-size: 14px;
|
82
|
-
color:
|
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
|
91
|
-
padding-
|
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:
|
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:
|
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:
|
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:
|
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:
|
350
|
-
}
|
351
|
-
.sidebar h4 {
|
352
|
-
font-size: 14px;
|
397
|
+
margin-top: 0px;
|
353
398
|
}
|
399
|
+
|
354
400
|
.sidebar li a {
|
355
|
-
padding:
|
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:
|
424
|
+
margin: 10px 0 6px 0;
|
425
|
+
}
|
426
|
+
.overview p {
|
427
|
+
margin: 0;
|
379
428
|
}
|
380
429
|
.resultn {
|
381
|
-
margin-
|
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
|
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
|
413
|
-
|
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
|
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
|
464
|
+
.hsp-lines {
|
431
465
|
margin-top: 5px;
|
432
|
-
font-size:
|
466
|
+
font-size: 11px;
|
433
467
|
letter-spacing: 1.2px;
|
434
468
|
}
|
435
|
-
.hsp
|
436
|
-
color:
|
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
|
-
|
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 #
|
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
|
+
}
|