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.
- 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
|
+
}
|