mspire 0.2.2 → 0.2.4
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.
- data/Rakefile +1 -1
- data/bin/bioworks_to_pepxml_gui.rb +225 -0
- data/changelog.txt +5 -0
- data/lib/gi.rb +6 -1
- data/lib/spec_id/protein_summary.rb +26 -3
- data/test/tc_gi.rb +2 -2
- data/test/tc_spec_id.rb +10 -1
- metadata +4 -4
- data/bin/bioworks2sequestXML_gui.rb +0 -67
data/Rakefile
CHANGED
@@ -140,7 +140,7 @@ tm = Time.now
|
|
140
140
|
spec = Gem::Specification.new do |s|
|
141
141
|
s.platform = Gem::Platform::RUBY
|
142
142
|
s.name = NAME
|
143
|
-
s.version = "0.2.
|
143
|
+
s.version = "0.2.4"
|
144
144
|
s.summary = "Mass Spectrometry Proteomics Objects, Scripts, and Executables"
|
145
145
|
s.date = "#{tm.year}-#{tm.month}-#{tm.day}"
|
146
146
|
s.email = "jprince@icmb.utexas.edu"
|
@@ -0,0 +1,225 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
tmp = $VERBOSE ; $VERBOSE = nil
|
4
|
+
require 'fox16'
|
5
|
+
$VERBOSE = tmp
|
6
|
+
|
7
|
+
include Fox
|
8
|
+
|
9
|
+
|
10
|
+
class Opt
|
11
|
+
attr_accessor :flag, :value
|
12
|
+
def initialize(flag, value=nil)
|
13
|
+
@flag = flag
|
14
|
+
@value = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.[](flag, value=nil)
|
18
|
+
self.new(flag, value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
st = @flag
|
23
|
+
if @value
|
24
|
+
st << " " << @value
|
25
|
+
end
|
26
|
+
st
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
NCOLS = 40
|
33
|
+
|
34
|
+
srf_dir = nil
|
35
|
+
output_dir = '.'
|
36
|
+
msdata_dir = '.'
|
37
|
+
$progname = 'bioworks_to_pepxml.rb'
|
38
|
+
$sequest_folder = '/project/marcotte/marcotte/ms/john/sequest'
|
39
|
+
$data_folder = '/project/marcotte/marcotte/ms/john/data'
|
40
|
+
$isb_folder = '/var/www/tpp'
|
41
|
+
|
42
|
+
# This is a directory selector consisting of: Label | FieldText | BrowseButton
|
43
|
+
# if you pass in patterns, then you can select multiple files!
|
44
|
+
class DirSelector
|
45
|
+
attr_writer :directory
|
46
|
+
|
47
|
+
def directory
|
48
|
+
@directory_data.to_s
|
49
|
+
end
|
50
|
+
|
51
|
+
# You should pass in the frame that you want filled up!
|
52
|
+
def initialize(parent, label='select directory', init_dir='.', text_field_width=30)
|
53
|
+
@directory_data = FXDataTarget.new(init_dir)
|
54
|
+
|
55
|
+
FXLabel.new(parent, label , nil, LAYOUT_CENTER_Y|LAYOUT_RIGHT|JUSTIFY_RIGHT)
|
56
|
+
srf_field = FXTextField.new(parent, text_field_width, @directory_data) do |tf|
|
57
|
+
tf.text = @directory_data.to_s
|
58
|
+
end
|
59
|
+
srf_field.connect(SEL_COMMAND) do |sender, sel, message|
|
60
|
+
@directory_data.value = message
|
61
|
+
end
|
62
|
+
but = FXButton.new(parent, "Browse")
|
63
|
+
but.connect(SEL_COMMAND) do |sender, sel, message|
|
64
|
+
@directory_data.value = FXFileDialog.getOpenDirectory(parent, "Open directory_data", @directory_data.to_s)
|
65
|
+
srf_field.text = @directory_data.value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# This is a directory selector consisting of: Label | FieldText | BrowseButton
|
71
|
+
# if you pass in patterns, then you can select multiple files!
|
72
|
+
class MultipleFilesSelector
|
73
|
+
# an array of filenames
|
74
|
+
attr_writer :files
|
75
|
+
|
76
|
+
# You should pass in the frame that you want filled up!
|
77
|
+
def initialize(parent, label='select multiple files', init_dir='.', text_field_width=30, patterns=["All Files (*)"])
|
78
|
+
@directory_data = FXDataTarget.new(init_dir)
|
79
|
+
|
80
|
+
FXLabel.new(parent, label , nil, LAYOUT_CENTER_Y|LAYOUT_RIGHT|JUSTIFY_RIGHT)
|
81
|
+
srf_field = FXTextField.new(parent, text_field_width, @directory_data) do |tf|
|
82
|
+
tf.text = @directory_data.to_s
|
83
|
+
end
|
84
|
+
srf_field.connect(SEL_COMMAND) do |sender, sel, message|
|
85
|
+
@directory_data.value = message
|
86
|
+
end
|
87
|
+
but = FXButton.new(parent, "Browse")
|
88
|
+
if patterns.is_a?(Array)
|
89
|
+
pattern_string = patterns.join("\n")
|
90
|
+
else
|
91
|
+
pattern_string = patterns
|
92
|
+
end
|
93
|
+
but.connect(SEL_COMMAND) do |sender, sel, message|
|
94
|
+
reply = FXFileDialog.getOpenFilenames(parent, "Open directory_data", @directory_data.to_s, pattern_string)
|
95
|
+
p reply
|
96
|
+
abort
|
97
|
+
srf_field.text = @directory_data.value
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
class MainWindow < FXMainWindow
|
104
|
+
|
105
|
+
def action(*args)
|
106
|
+
p args
|
107
|
+
|
108
|
+
cmd = []
|
109
|
+
cmd << $progname
|
110
|
+
#cmd << args
|
111
|
+
#cmd << Opt['-o', output_dir]
|
112
|
+
|
113
|
+
puts cmd.join(" ")
|
114
|
+
end
|
115
|
+
|
116
|
+
def initialize(anApp)
|
117
|
+
labels = ["&SRF files (select multiple)", "&Output Directory (ISB)", "&Directory with RAW files"]
|
118
|
+
super(anApp, "bioworks_to_pepxml", nil, nil, DECOR_ALL)
|
119
|
+
|
120
|
+
gb = FXGroupBox.new(self, "Specify input/output", FRAME_RIDGE)
|
121
|
+
mat = FXMatrix.new(gb, 3, MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP)
|
122
|
+
|
123
|
+
srf_files_selector = MultipleFilesSelector.new(mat, labels[0], $sequest_folder, NCOLS, ["SRF files (*.srf)"])
|
124
|
+
|
125
|
+
isb_files_selector = DirSelector.new(mat, labels[1], $isb_folder, NCOLS)
|
126
|
+
|
127
|
+
hf = FXHorizontalFrame.new(self)
|
128
|
+
create_mzxml = FXCheckButton.new(hf, 'create mzXML files')
|
129
|
+
copy_mzxml = FXCheckButton.new(hf, 'copy mzXML files to ISB dir') {|v| v.checkState = TRUE }
|
130
|
+
copy_mzxml.hide
|
131
|
+
|
132
|
+
@mat2 = FXMatrix.new(self, 3, MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP)
|
133
|
+
srf_dir_selector = DirSelector.new(@mat2, labels[2], $data_folder, NCOLS)
|
134
|
+
|
135
|
+
submit = FXButton.new(self, "Submit")
|
136
|
+
submit.connect(SEL_COMMAND) do |sender, sel, message|
|
137
|
+
action(srf_dir_selector.files)
|
138
|
+
end
|
139
|
+
|
140
|
+
create_mzxml.connect(SEL_COMMAND) do |button,b,checked|
|
141
|
+
if checked
|
142
|
+
copy_mzxml.show
|
143
|
+
@mat2.show
|
144
|
+
self.resize(self.width, @large_height)
|
145
|
+
else
|
146
|
+
copy_mzxml.hide
|
147
|
+
@mat2.hide
|
148
|
+
self.resize(self.width, @small_height)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
def create
|
155
|
+
super
|
156
|
+
show(PLACEMENT_SCREEN)
|
157
|
+
@large_height = self.height
|
158
|
+
|
159
|
+
# setup hidden state
|
160
|
+
@mat2.hide
|
161
|
+
@small_height = @large_height - @mat2.height
|
162
|
+
self.resize(self.width, @small_height)
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
application = FXApp.new("Hello", "FXRuby") do |theApp|
|
169
|
+
MainWindow.new(theApp)
|
170
|
+
theApp.create
|
171
|
+
theApp.run
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
application.run()
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
=begin
|
181
|
+
|
182
|
+
|
183
|
+
---------------------------------
|
184
|
+
class MyMainWindow < FXMainWindow
|
185
|
+
|
186
|
+
attr :advancedFrame
|
187
|
+
|
188
|
+
def initialize(app)
|
189
|
+
super(app, "MyMainWindow")
|
190
|
+
|
191
|
+
contents = FXVerticalFrame.new(self,
|
192
|
+
LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
193
|
+
|
194
|
+
advancedButton = FXButton.new(contents, "Advanced >>",
|
195
|
+
nil, self, 0, FRAME_RAISED|FRAME_THICK)
|
196
|
+
|
197
|
+
advancedButton.connect(SEL_COMMAND) do
|
198
|
+
if @advancedFrame.shown?
|
199
|
+
self.height -= @advancedFrame.height
|
200
|
+
@advancedFrame.hide
|
201
|
+
advancedButton.text = "Advanced >>"
|
202
|
+
else
|
203
|
+
self.height += @advancedFrame.height
|
204
|
+
@advancedFrame.show
|
205
|
+
advancedButton.text = "<< Basic"
|
206
|
+
end
|
207
|
+
|
208
|
+
self.recalc
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
#---------------------------
|
213
|
+
app = FXApp.new
|
214
|
+
|
215
|
+
mainWindow = MyMainWindow.new(app)
|
216
|
+
|
217
|
+
app.create
|
218
|
+
mainWindow.advancedFrame.hide
|
219
|
+
mainWindow.height -= mainWindow.advancedFrame.height
|
220
|
+
|
221
|
+
mainWindow.show(PLACEMENT_SCREEN)
|
222
|
+
|
223
|
+
app.run
|
224
|
+
|
225
|
+
=end
|
data/changelog.txt
CHANGED
@@ -49,3 +49,8 @@ minor bugfix
|
|
49
49
|
made compatible with Bioworks fasta file reverser and updated tutorial.
|
50
50
|
Killed classify_by_prefix routine in favor of classify_by_false_flag which has
|
51
51
|
a prefix option
|
52
|
+
|
53
|
+
## version 0.2.3
|
54
|
+
|
55
|
+
in protein_summary.rb added handling for proteins with no annotation. (either
|
56
|
+
dispaly NA or use gi2annnot to grab them from NCBI)
|
data/lib/gi.rb
CHANGED
@@ -51,7 +51,12 @@ class GI
|
|
51
51
|
#puts url
|
52
52
|
begin
|
53
53
|
open(url) do |handle|
|
54
|
-
|
54
|
+
if handle.is_a? StringIO
|
55
|
+
io_input = handle
|
56
|
+
else
|
57
|
+
io_input = handle.read
|
58
|
+
end
|
59
|
+
annots.push( *(parse_etool_output(io_input)) )
|
55
60
|
end
|
56
61
|
rescue SocketError
|
57
62
|
return nil
|
@@ -6,6 +6,7 @@ require 'optparse'
|
|
6
6
|
require 'ostruct'
|
7
7
|
require 'spec_id'
|
8
8
|
require 'spec_id/precision'
|
9
|
+
require 'gi'
|
9
10
|
|
10
11
|
#############################################################
|
11
12
|
# GLOBALS:
|
@@ -210,13 +211,26 @@ class ProteinSummary
|
|
210
211
|
# returns a string of the table rows
|
211
212
|
# false_positive_rate (give as a %) is the cutoff mark
|
212
213
|
# returns the number of proteins at the desired_fppr (if given)
|
213
|
-
def table_rows(uniq_prots, prefix, false_positive_rate_percent, num_cols, desired_fppr, actual_percent_fp, peptide_count_filename=nil)
|
214
|
+
def table_rows(uniq_prots, prefix, false_positive_rate_percent, num_cols, desired_fppr, actual_percent_fp, annotations=nil, peptide_count_filename=nil)
|
214
215
|
prot_cnt = 0
|
216
|
+
an_cnt = 0
|
217
|
+
|
215
218
|
uniq_prots.map do |prot|
|
216
219
|
tr do
|
217
220
|
prot_cnt += 1
|
218
221
|
gi = accession(prot._protein_name)
|
219
|
-
|
222
|
+
|
223
|
+
if annotations
|
224
|
+
protein_description = annotations[an_cnt]
|
225
|
+
an_cnt += 1
|
226
|
+
else
|
227
|
+
if prot.annotation.size > 0
|
228
|
+
protein_description = prot.annotation.first._protein_description
|
229
|
+
else
|
230
|
+
protein_description = 'NA'
|
231
|
+
end
|
232
|
+
end
|
233
|
+
tds([prot_cnt, prot._probability, ref_html(gi, prot._protein_name), protein_description, prot._percent_coverage, peptide_cell(prot_cnt, prot._unique_stripped_peptides.split('+')), prot._total_number_peptides, prot._pct_spectrum_ids])
|
220
234
|
end
|
221
235
|
end.join
|
222
236
|
end
|
@@ -310,8 +324,15 @@ class ProteinSummary
|
|
310
324
|
|
311
325
|
output_peptide_counts_file(filtered_sorted_prots, opt.peptide_count) if opt.peptide_count
|
312
326
|
|
327
|
+
# get an array of annotations (or nil if no option)
|
328
|
+
annotations =
|
329
|
+
if opt.get_annotation
|
330
|
+
gis = filtered_sorted_prots.map {|prot| accession(prot._protein_name) }
|
331
|
+
GI.gi2annot(gis)
|
332
|
+
end
|
333
|
+
|
313
334
|
table_string = table do
|
314
|
-
tr{theaders} + table_rows(filtered_sorted_prots, opt.f, actual_percent_fp, num_cols, opt.c.to_f, actual_percent_fp, opt.peptide_count)
|
335
|
+
tr{theaders} + table_rows(filtered_sorted_prots, opt.f, actual_percent_fp, num_cols, opt.c.to_f, actual_percent_fp, annotations, opt.peptide_count)
|
315
336
|
end
|
316
337
|
er_info = opt.precision ? error_info(file) : ""
|
317
338
|
html_pieces = [outfn, header, fppr_output_as_html, er_info, file_info(file), protproph_script_info, num_prots_html, table_string, trailer]
|
@@ -410,6 +431,8 @@ class ProteinSummary
|
|
410
431
|
op.separator "Specific to ProteinProphet (with no concatenated DB):"
|
411
432
|
op.on("-c", "--cutoff percent", "false positive predictive rate (FPPR)% for given cutoff") {|v| opt.c = v }
|
412
433
|
op.on("--cut_at percent", "only reports proteins within FPPR %") {|v| opt.cut_at = v }
|
434
|
+
op.on("--get_annotation", "retrieves annotation by gi code") {|v| opt.get_annotation = v}
|
435
|
+
op.separator " (use if your proteins have gi's but no annotation) "
|
413
436
|
end
|
414
437
|
|
415
438
|
opts.parse!(argv)
|
data/test/tc_gi.rb
CHANGED
@@ -7,9 +7,9 @@ class Gi2AnnotTest < Test::Unit::TestCase
|
|
7
7
|
ROOT_DIR = File.join(File.dirname(__FILE__), '..')
|
8
8
|
|
9
9
|
def test_single_query
|
10
|
-
annot = GI.gi2annot([
|
10
|
+
annot = GI.gi2annot([836805])
|
11
11
|
if annot
|
12
|
-
assert_equal('
|
12
|
+
assert_equal('proteosome component PRE4 [Saccharomyces cerevisiae]', annot.first)
|
13
13
|
else
|
14
14
|
assert_nil( puts("SKIPPING gi test (no internet connection available)") )
|
15
15
|
end
|
data/test/tc_spec_id.rb
CHANGED
@@ -126,7 +126,6 @@ class TestOccamsRazor < Test::Unit::TestCase
|
|
126
126
|
prots[1].peps = [peps[2]] ## should be missing
|
127
127
|
|
128
128
|
test_prots = prots[0,2]
|
129
|
-
require 'pp'
|
130
129
|
answ = SpecID.occams_razor(test_prots)
|
131
130
|
answ.each do |an|
|
132
131
|
assert( an[0].is_a?(SpecID::Prot), "prots are there")
|
@@ -135,6 +134,16 @@ class TestOccamsRazor < Test::Unit::TestCase
|
|
135
134
|
assert_equal( prots[0], first[0])
|
136
135
|
assert_equal_array_content( prots[0].peps, first[1])
|
137
136
|
|
137
|
+
require 'pp'
|
138
|
+
#pp answ
|
139
|
+
|
140
|
+
|
141
|
+
prots[0].peps = peps[0,4]
|
142
|
+
prots[1].peps = [peps[2]] ## should be missing
|
143
|
+
prots[2].peps = [] ## should be missing
|
144
|
+
|
145
|
+
answ = SpecID.occams_razor(test_prots, true)
|
146
|
+
#pp answ
|
138
147
|
|
139
148
|
|
140
149
|
#prots[2].peps = [peps[2]]
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: mspire
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2007-05-
|
6
|
+
version: 0.2.4
|
7
|
+
date: 2007-05-17 00:00:00 -05:00
|
8
8
|
summary: Mass Spectrometry Proteomics Objects, Scripts, and Executables
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -63,9 +63,9 @@ files:
|
|
63
63
|
- LICENSE
|
64
64
|
- changelog.txt
|
65
65
|
- release_notes.txt
|
66
|
+
- bin/bioworks_to_pepxml_gui.rb
|
66
67
|
- bin/gi2annot.rb
|
67
68
|
- bin/protein_summary.rb
|
68
|
-
- bin/bioworks2sequestXML_gui.rb
|
69
69
|
- bin/bioworks2excel.rb
|
70
70
|
- bin/pepproph_filter.rb
|
71
71
|
- bin/fasta_shaker.rb
|
@@ -129,9 +129,9 @@ extra_rdoc_files:
|
|
129
129
|
- INSTALL
|
130
130
|
- LICENSE
|
131
131
|
executables:
|
132
|
+
- bioworks_to_pepxml_gui.rb
|
132
133
|
- gi2annot.rb
|
133
134
|
- protein_summary.rb
|
134
|
-
- bioworks2sequestXML_gui.rb
|
135
135
|
- bioworks2excel.rb
|
136
136
|
- pepproph_filter.rb
|
137
137
|
- fasta_shaker.rb
|
@@ -1,67 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'fox14'
|
4
|
-
|
5
|
-
include Fox
|
6
|
-
|
7
|
-
class DirListWindow < FXMainWindow
|
8
|
-
|
9
|
-
def initialize(app)
|
10
|
-
# Invoke the base class initialize first
|
11
|
-
super(app, "Directory List", nil, nil, DECOR_ALL, 0, 0, 800, 600)
|
12
|
-
|
13
|
-
# Make menu bar
|
14
|
-
menubar = FXMenuBar.new(self, LAYOUT_FILL_X)
|
15
|
-
filemenu = FXMenuPane.new(self)
|
16
|
-
FXMenuCommand.new(filemenu, "&Quit\tCtl-Q", nil, getApp(), FXApp::ID_QUIT)
|
17
|
-
FXMenuTitle.new(menubar, "&File", nil, filemenu)
|
18
|
-
helpmenu = FXMenuPane.new(self)
|
19
|
-
FXMenuCommand.new(helpmenu, "&About FOX...").connect(SEL_COMMAND) {
|
20
|
-
FXMessageBox.information(self, MBOX_OK, "About FOX",
|
21
|
-
"FOX is a really, really cool C++ library...\n" +
|
22
|
-
"and FXRuby is an even cooler GUI for Ruby!")
|
23
|
-
}
|
24
|
-
matrix = FXMatrix.new(menubar, 2, MATRIX_BY_COLUMNS|LAYOUT_FILL_X)
|
25
|
-
FXLabel.new(matrix, "sequest.params:", nil,
|
26
|
-
JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_CENTER_Y)
|
27
|
-
|
28
|
-
FXMenuTitle.new(menubar, "&Help", nil, helpmenu, LAYOUT_RIGHT)
|
29
|
-
|
30
|
-
# Text field at bottom
|
31
|
-
text = FXTextField.new(self, 10, nil, 0,
|
32
|
-
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
|
33
|
-
|
34
|
-
# Make contents
|
35
|
-
dirlist = FXDirList.new(self, nil, 0, (HSCROLLING_OFF|
|
36
|
-
TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|FRAME_SUNKEN|FRAME_THICK|
|
37
|
-
LAYOUT_FILL_X|LAYOUT_FILL_Y), 0, 0, 0, 0)
|
38
|
-
|
39
|
-
# Now make the directory list widget (dirlist) the message target
|
40
|
-
# for the text field. If you type a new directory name in the text
|
41
|
-
# field the directory list should navigate to that directory.
|
42
|
-
text.target = dirlist
|
43
|
-
text.selector = FXWindow::ID_SETVALUE
|
44
|
-
end
|
45
|
-
|
46
|
-
# Create and show the main window
|
47
|
-
def create
|
48
|
-
super
|
49
|
-
show(PLACEMENT_SCREEN)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def run
|
54
|
-
# Make application
|
55
|
-
application = FXApp.new("DirList", "FoxTest")
|
56
|
-
|
57
|
-
# Make window
|
58
|
-
DirListWindow.new(application)
|
59
|
-
|
60
|
-
# Create app
|
61
|
-
application.create
|
62
|
-
|
63
|
-
# Run
|
64
|
-
application.run
|
65
|
-
end
|
66
|
-
|
67
|
-
run
|