mspire 0.1.7 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/Rakefile +41 -14
  2. data/bin/bioworks2excel.rb +1 -1
  3. data/bin/bioworks_to_pepxml.rb +46 -59
  4. data/bin/fasta_shaker.rb +1 -1
  5. data/bin/filter.rb +6 -0
  6. data/bin/find_aa_freq.rb +23 -0
  7. data/bin/id_precision.rb +3 -2
  8. data/bin/mzxml_to_lmat.rb +2 -1
  9. data/bin/pepproph_filter.rb +1 -1
  10. data/bin/precision.rb +1 -1
  11. data/bin/protein_summary.rb +2 -451
  12. data/bin/raw_to_mzXML.rb +55 -0
  13. data/bin/srf_group.rb +26 -0
  14. data/changelog.txt +7 -0
  15. data/lib/align.rb +3 -3
  16. data/lib/fasta.rb +6 -1
  17. data/lib/gi.rb +9 -4
  18. data/lib/roc.rb +2 -0
  19. data/lib/sample_enzyme.rb +2 -1
  20. data/lib/spec/mzxml/parser.rb +2 -43
  21. data/lib/spec/mzxml.rb +65 -2
  22. data/lib/spec_id/aa_freqs.rb +10 -7
  23. data/lib/spec_id/bioworks.rb +67 -87
  24. data/lib/spec_id/filter.rb +794 -0
  25. data/lib/spec_id/precision.rb +29 -36
  26. data/lib/spec_id/proph.rb +5 -3
  27. data/lib/spec_id/protein_summary.rb +459 -0
  28. data/lib/spec_id/sequest.rb +323 -271
  29. data/lib/spec_id/srf.rb +189 -135
  30. data/lib/spec_id.rb +276 -227
  31. data/lib/spec_id_xml.rb +101 -0
  32. data/lib/toppred.rb +18 -0
  33. data/script/degenerate_peptides.rb +47 -0
  34. data/script/filter-peps.rb +5 -1
  35. data/test/tc_align.rb +1 -1
  36. data/test/tc_bioworks.rb +25 -22
  37. data/test/tc_bioworks_to_pepxml.rb +37 -4
  38. data/test/tc_fasta.rb +3 -1
  39. data/test/tc_fasta_shaker.rb +8 -6
  40. data/test/tc_filter.rb +203 -0
  41. data/test/tc_gi.rb +6 -9
  42. data/test/tc_id_precision.rb +31 -0
  43. data/test/tc_mzxml.rb +8 -6
  44. data/test/tc_peptide_parent_times.rb +2 -1
  45. data/test/tc_precision.rb +1 -1
  46. data/test/tc_proph.rb +5 -5
  47. data/test/tc_protein_summary.rb +36 -13
  48. data/test/tc_sequest.rb +78 -33
  49. data/test/tc_spec_id.rb +128 -6
  50. data/test/tc_srf.rb +84 -38
  51. metadata +67 -62
  52. data/bin/fasta_cat.rb +0 -39
  53. data/bin/fasta_cat_mod.rb +0 -59
  54. data/bin/fasta_mod.rb +0 -57
  55. data/bin/filter_spec_id.rb +0 -365
  56. data/bin/raw2mzXML.rb +0 -21
  57. data/script/gen_database_searching.rb +0 -258
data/lib/spec_id/srf.rb CHANGED
@@ -73,11 +73,57 @@ class DTALog
73
73
  end
74
74
  end
75
75
 
76
+ class SRFGroup
77
+ include SpecID
78
+
79
+ ## the srf objects themselves
80
+ attr_accessor :srfs, :filenames
81
+ ## also inherits :peps and :prots accessor
82
+
83
+ # takes an array of filenames
84
+ # or a single .srg filename
85
+ # see from_srg to load a single .srg file
86
+ def initialize(filenames=nil)
87
+ @filenames = filenames
88
+ @peps = []
89
+ @prots = []
90
+ @global_ref_hash = {}
91
+ @srfs = []
92
+ if filenames
93
+ if filenames.is_a?(String) && filenames =~ /\.srg$/
94
+ srg_filename = filenames.dup
95
+ @filename = srg_filename
96
+ filenames = IO.readlines(filenames).grep(/\w/).map {|v| v.chomp }
97
+ filenames.each do |file|
98
+ if !File.exist? file
99
+ puts "File: #{file} in #{srg_filename} does not exist!"
100
+ puts "Please modify #{srg_filename} to point to existing files."
101
+ abort
102
+ end
103
+ end
104
+ end
105
+ filenames.each do |file|
106
+ @srfs << SRF.new(file, @peps, @global_ref_hash)
107
+ end
108
+ end
109
+ end
110
+
111
+ # returns the filename used
112
+ def to_srg(srg_filename='bioworks.srg')
113
+ File.open(srg_filename, 'w') do |v|
114
+ @filenames.each do |srf_file|
115
+ v.puts File.expand_path(srf_file)
116
+ end
117
+ end
118
+ srg_filename
119
+ end
120
+ end
121
+
76
122
  class SRF
77
123
 
78
124
  # a string 3.3 or 3.2
79
125
  attr_accessor :version
80
-
126
+
81
127
  attr_accessor :header
82
128
  attr_accessor :dta_files
83
129
  attr_accessor :out_files
@@ -85,6 +131,7 @@ class SRF
85
131
  # a parallel array to dta_files and out_files where each entry is:
86
132
  # [first_scan, last_scan, charge]
87
133
  attr_accessor :index
134
+ attr_accessor :base_name
88
135
 
89
136
  def dta_start_byte
90
137
  case @version
@@ -93,26 +140,44 @@ class SRF
93
140
  end
94
141
  end
95
142
 
96
- def initialize(filename=nil)
143
+ # peps and
144
+ def initialize(filename=nil, peps=[], global_ref_hash={})
97
145
  @dta_files = []
98
146
  @out_files = []
99
147
  if filename
100
- from_file(filename)
148
+ from_file(filename, peps, global_ref_hash)
101
149
  end
102
150
  end
103
151
 
104
152
  # returns self
105
- def from_file(filename)
153
+ def from_file(filename, peps, global_ref_hash)
106
154
 
107
155
  File.open(filename, "rb") do |fh|
108
156
  @header = SRF::Header.new.from_handle(fh)
109
157
  @version = @header.version
110
- @dta_files = read_dta_files(fh,@header.num_dta_files)
111
- @out_files = read_out_files(fh,@header.num_dta_files)
112
- @params = SpecID::Sequest::Params.new.parse_handle(fh)
158
+ @dta_files, measured_mhs = read_dta_files(fh,@header.num_dta_files)
159
+ @out_files = read_out_files(fh,@header.num_dta_files, global_ref_hash, measured_mhs)
160
+ @params = Sequest::Params.new.parse_handle(fh)
113
161
  fh.read(12) ## gap between last params entry and index
114
162
  @index = read_scan_index(fh,@header.num_dta_files)
115
163
  end
164
+
165
+ ### UPDATE SOME THINGS ON SINGLE PASS:
166
+ @base_name = @header.raw_filename.scan(/[\\\/]([^\\\/]+)\.RAW$/).first.first
167
+ # give each hit a base_name, first_scan, last_scan
168
+ @index.each_with_index do |ind,i|
169
+ mass_measured = @dta_files[i][0]
170
+ #puts @out_files[i].join(", ")
171
+ pep_hits = @out_files[i][3]
172
+ peps.push( *pep_hits )
173
+ pep_hits.each do |pep_hit|
174
+ pep_hit[13,3] = @base_name, *ind
175
+ # add the deltamass
176
+ pep_hit[10] = pep_hit[0] - mass_measured # real - measured (deltamass)
177
+ pep_hit[11] = 1.0e6 * pep_hit[10].abs / mass_measured ## ppm
178
+ pep_hit[17] = self ## link with the srf object
179
+ end
180
+ end
116
181
  self
117
182
  end
118
183
 
@@ -143,26 +208,26 @@ class SRF
143
208
 
144
209
  # returns an array of dta_files
145
210
  def read_dta_files(fh, num_files)
211
+ measured_mhs = Array.new(num_files) ## A parallel array to capture the actual mh
146
212
  dta_files = Array.new(num_files)
147
213
  start = dta_start_byte
148
214
  unless fh.pos == start
149
215
  fh.pos = start
150
216
  end
151
217
  header.num_dta_files.times do |i|
152
- dta_files[i] = SRF::DTA.new.from_handle(fh)
218
+ dta_file = SRF::DTA.new.from_handle(fh)
219
+ measured_mhs[i] = dta_file[0]
220
+ dta_files[i] = dta_file
153
221
  end
154
- dta_files
222
+ [dta_files, measured_mhs]
155
223
  end
156
224
 
157
225
  # filehandle (fh) must be at the start of the outfiles. 'read_dta_files'
158
226
  # will put the fh there.
159
- def read_out_files(fh,number_files)
227
+ def read_out_files(fh,number_files, global_ref_hash, measured_mhs)
160
228
  out_files = Array.new(number_files)
161
229
  header.num_dta_files.times do |i|
162
- #if i == header.num_dta_files - 2
163
- # abort
164
- #end
165
- out_files[i] = SRF::OUT.new.from_handle(fh)
230
+ out_files[i] = SRF::OUT.new.from_handle(fh, global_ref_hash)
166
231
  end
167
232
  out_files
168
233
  end
@@ -261,45 +326,17 @@ class SRF::DTAGen
261
326
  end
262
327
  end
263
328
 
264
- class SRF::DTA < Array
329
+ SRF::DTA = ArrayClass.new(%w(mh dta_tic num_peaks charge ms_level unknown total_num_possible_charge_states peaks))
330
+
331
+ class SRF::DTA
332
+ Unpack = "EeIvvvv"
265
333
 
266
334
  # is this universal?
267
335
  First_record_start_byte = 3644
268
336
 
269
- ## mucky details. This should be encapsulated into a class to inherit from, etc.
270
- ind_keys = {} ; ind_keys_w_eq = {}; @@ind = {}
271
- ind_keys = {:mh => 0, :dta_tic => 1, :num_peaks => 2, :charge => 3, :ms_level => 4, :unknown => 5, :total_num_possible_charge_states => 6, :peaks => 7}
272
- @@arr_size = ind_keys.size
273
-
274
- def mh ; self[0] end ; def mh=(oth) ; self[0] = oth end
275
- def dta_tic ; self[1] end ; def dta_tic=(oth) ; self[1] = oth end
276
- def num_peaks ; self[2] end ; def num_peaks=(oth) ; self[2] = oth end
277
- def charge ; self[3] end ; def charge=(oth) ; self[3] = oth end
278
- def ms_level ; self[4] end ; def ms_level=(oth) ; self[4] = oth end
279
- def unknown ; self[5] end ; def unknown=(oth) ; self[5] = oth end
280
- def total_num_possible_charge_states ; self[6] end ; def total_num_possible_charge_states=(oth) ; self[6] = oth end
281
-
337
+ # note on peaks (self[7])
282
338
  # this is a byte array of floats, you can get the peaks out with
283
339
  # unpack("e*")
284
- def peaks ; self[7] end
285
- # this is a byte array of floats, you can get the peaks out with
286
- def peaks=(oth) ; self[7] = oth end
287
-
288
- @@arr_size = ind_keys.size
289
- ind_keys.each {|k,v| ind_keys_w_eq["#{k}=".to_sym] = v }
290
- ind_keys.merge!(ind_keys_w_eq)
291
- ind_keys.each {|k,v| @@ind[k] = v ; @@ind["#{k}"] = v}
292
-
293
- def initialize(args=nil)
294
- super(@@arr_size.size)
295
- if args
296
- if args.is_a? Hash
297
- args.each do |k,v|
298
- self[@@ind[k]] = v
299
- end
300
- end
301
- end
302
- end
303
340
 
304
341
  def inspect
305
342
  peaks_st = 'nil'
@@ -310,7 +347,7 @@ class SRF::DTA < Array
310
347
  def from_handle(fh)
311
348
  st = fh.read(24)
312
349
  # get the bulk of the data in single unpack
313
- self[0,7] = st.unpack("EeIvvvv")
350
+ self[0,7] = st.unpack(Unpack)
314
351
 
315
352
  # Scan numbers possibly hidden in this next sequence of bytes (I think)
316
353
  st2 = fh.read(24)
@@ -323,112 +360,99 @@ class SRF::DTA < Array
323
360
 
324
361
  end
325
362
 
363
+ SRF::OUT = ArrayClass.new( %w(num_hits computer date_time hits) )
364
+ # 0=num_hits 1=charge 2=computer 3=date_time 4=hits
326
365
 
327
- class SRF::OUT < Array
328
- ## mucky details. This should be encapsulated into a class to inherit from, etc.
329
- ind_keys = {} ; ind_keys_w_eq = {}; @@ind = {}
330
- ind_keys = {:num_hits => 0, :charge => 1, :computer => 2, :date_time => 3, :first_scan => 4, :last_scan => 5, :filename_noext => 6, :hits => 7}
331
- @@arr_size = ind_keys.size
332
-
333
- def num_hits ; self[0] end ; def num_hits=(oth) ; self[0] = oth end
334
- def charge ; self[1] end ; def charge=(oth) ; self[1] = oth end
335
- def computer ; self[2] end ; def computer=(oth) ; self[2] = oth end
336
- def date_time ; self[3] end ; def date_time=(oth) ; self[3] = oth end
337
- def first_scan ; self[4] end ; def first_scan=(oth) ; self[4] = oth end
338
- def last_scan ; self[5] end ; def last_scan=(oth) ; self[5] = oth end
339
- def filename_noext ; self[6] end ; def filename_noext=(oth) ; self[6] = oth end
340
- def hits ; self[7] end ; def hits=(oth) ; self[7] = oth end
341
-
342
- @@arr_size = ind_keys.size
343
- ind_keys.each {|k,v| ind_keys_w_eq["#{k}=".to_sym] = v }
344
- ind_keys.merge!(ind_keys_w_eq)
345
- ind_keys.each {|k,v| @@ind[k] = v ; @@ind["#{k}"] = v}
346
-
347
- def initialize(args=nil)
348
- super(@@arr_size.size)
349
- if args
350
- if args.is_a? Hash
351
- args.each do |k,v|
352
- self[@@ind[k]] = v
353
- end
354
- end
355
- end
356
- end
366
+ class SRF::OUT
367
+ Unpack = '@36vx2Z*@60Z*'
357
368
 
358
369
  def inspect
359
370
  if first_scan
360
371
  ins = "@first_scan=#{first_scan}, @last_scan=#{last_scan}, @filename_noext=#{filename_noext}, "
361
372
  end
362
- "<SRF::OUT @num_hits=#{num_hits}, @charge=#{charge}, @computer=#{computer}, @date_time=#{date_time}, #{ins}@hits=#{hits.inspect}>"
373
+ "<SRF::OUT @num_hits=#{num_hits}, @computer=#{computer}, @date_time=#{date_time}, #{ins}@hits=#{hits.inspect}>"
363
374
  end
364
375
 
365
- def from_handle(fh)
376
+ def from_handle(fh, global_ref_hash)
366
377
  ## EMPTY out file is 96 bytes
367
378
  ## each hit is 320 bytes
368
379
  ## num_hits and charge:
369
380
  st = fh.read(96)
370
- self[0,4] = st.unpack("@36vvZ*@60Z*")
381
+ self[0,3] = st.unpack(Unpack)
371
382
  num_hits = self[0]
372
383
 
373
384
  ar = Array.new(num_hits)
374
- num_hits.times do |i|
375
- ar[i] = SRF::OUT::Hit.new.from_handle(fh)
385
+ if ar.size > 0
386
+ num_hits.times do |i|
387
+ ar[i] = SRF::OUT::Pep.new.from_handle(fh, global_ref_hash)
388
+ end
389
+ ## The xcorrs are already ordered by best to worst hit
390
+ ## ADJUST the deltacn's to be meaningful for the top hit:
391
+ ## (the same as bioworks and prophet)
392
+ (1...ar.size).each {|i| ar[i-1].deltacn = ar[i].deltacn }
393
+ ar.last.deltacn = 1.1
376
394
  end
377
- self[7] = ar
395
+ self[3] = ar
378
396
 
379
397
  self
380
398
  end
381
399
 
382
400
  end
383
401
 
384
- class SRF::OUT::Hit < Array
402
+ # deltacn is modified to be that of the next best hit (by xcorr).
403
+ # if there is no next best hit, then it will be 1.1 (like bioworks)
404
+ # mh is the theoretical mass + h
405
+ # prots are created as SRF prot objects with a reference and linked to their
406
+ # peptides (from global hash by reference)
407
+ # ppm = 10^6 * ∆m_accuracy / mass_measured [ where ∆m_accuracy = mass_real – mass_measured ]
408
+ # This is calculated for the M+H mass!
409
+ # srf = the srf object this scan came from
410
+ SRF::OUT::Pep = ArrayClass.new(%w( mh deltacn sp xcorr id rsp ions_matched ions_total sequence prots deltamass ppm aaseq base_name first_scan last_scan charge srf) )
411
+
412
+ # 0=mh 1=deltacn 2=sp 3=xcorr 4=id 5=rsp 6=ions_matched 7=ions_total 8=sequence 9=prots 10=deltamass 11=ppm 12=aaseq 13=base_name 14=first_scan 15=last_scan 16=charge 17=srf
413
+
414
+ class SRF::OUT::Pep
415
+ include SpecID::Pep
416
+
417
+ Unpack = '@64Ex8ex12eeIx18vvvx8Z*@240Z*'
418
+ Unpack_four_null_bytes = 'a*'
419
+ Unpack_Zstar = 'Z*'
420
+
385
421
  FourNullBytes_as_string = "\0\0\0\0"
386
422
  #NewRecordStart = "\0\0" + 0x3a.chr + 0x1a.chr + "\0\0"
387
423
  NewRecordStart = 0x01.chr + 0x00.chr
388
424
  Sequest_record_start = "[SEQUEST]"
389
425
 
390
- ## mucky details. This should be encapsulated into a class to inherit from, etc.
391
- ind_keys = {} ; ind_keys_w_eq = {}; @@ind = {}
392
- ind_keys = {:mh => 0, :deltacn => 1, :sp => 2, :xcorr => 3, :id => 4, :rsp => 5, :ions_matched => 6, :ions_total => 7, :peptide => 8, :reference => 9 }
393
- @@arr_size = ind_keys.size
394
-
395
- def mh ; self[0] end ; def mh=(oth) ; self[0] = oth end
396
- def deltacn ; self[1] end ; def deltacn=(oth) ; self[1] = oth end
397
- def sp ; self[2] end ; def sp=(oth) ; self[2] = oth end
398
- def xcorr ; self[3] end ; def xcorr=(oth) ; self[3] = oth end
399
- def id ; self[4] end ; def id=(oth) ; self[4] = oth end
400
- def rsp ; self[5] end ; def rsp=(oth) ; self[5] = oth end
401
- def ions_matched ; self[6] end ; def ions_matched=(oth) ; self[6] = oth end
402
- def ions_total ; self[7] end ; def ions_total=(oth) ; self[7] = oth end
403
- def peptide ; self[8] end ; def peptide=(oth) ; self[8] = oth end
404
- def reference ; self[9] end ; def reference=(oth) ; self[9] = oth end
405
- # The number of total proteins sharing this peptide
406
- def num_tot_proteins ; self[10] end ; def num_tot_proteins=(oth) ; self[10] = oth end
407
-
408
- def initialize(args=nil)
409
- super(@@arr_size.size)
410
- if args
411
- if args.is_a? Hash
412
- args.each do |k,v|
413
- self[@@ind[k]] = v
414
- end
415
- end
416
- end
417
- end
426
+ tmp = $VERBOSE ; $VERBOSE = nil
427
+ def prots() self[9] end
428
+ $VERBOSE = tmp
418
429
 
419
430
  def inspect
420
- "<SRF::OUT::Hit @mh=#{mh}, @deltacn=#{deltacn}, @sp=#{sp}, @xcorr=#{xcorr}, @id=#{id}, @rsp=#{rsp}, @ions_matched=#{ions_matched}, @ions_total=#{ions_total}, @peptide=#{peptide}, @reference=#{reference}, @num_tot_proteins=#{num_tot_proteins}>"
431
+ st = %w(aaseq sequence mh deltacn sp xcorr id rsp ions_matched ions_total prots deltamass ppm base_name first_scan last_scan charge).map do |v|
432
+ if v.is_a? Array
433
+ "##{v}=#{send(v.to_sym).size}"
434
+ else
435
+ "@#{v}=#{send(v.to_sym)}"
436
+ end
437
+ end
438
+ st.unshift("<#{self.class}")
439
+ if srf
440
+ st.push("@srf(base_name)=#{srf.base_name}")
441
+ end
442
+ st.push('>')
443
+ st.join(' ')
444
+ #"<SRF::OUT::Pep @mh=#{mh}, @deltacn=#{deltacn}, @sp=#{sp}, @xcorr=#{xcorr}, @id=#{id}, @rsp=#{rsp}, @ions_matched=#{ions_matched}, @ions_total=#{ions_total}, @sequence=#{sequence}, @prots(count)=#{prots.size}, @deltamass=#{deltamass}, @ppm=#{ppm} @aaseq=#{aaseq}, @base_name=#{base_name}, @first_scan=#{first_scan}, @last_scan=#{last_scan}, @charge=#{charge}, @srf(base_name)=#{srf.base_name}>"
421
445
  end
422
446
 
423
447
  ## There must be a better way to do this.
424
448
  ## We are checking that there are no additional protein references only
425
449
  ## so that we are in register for the next reading
426
- def read_extra_references(fh)
450
+ def read_extra_references(fh, global_ref_hash)
427
451
  $SRF_OUT_HIT_FH_POS = fh.pos
428
452
  st = fh.read(4)
429
453
  #puts "HHH: " + st.unpack("H*").first
430
454
  ## if we see 0000 0000 we are done
431
- if st.unpack("a*").first == FourNullBytes_as_string
455
+ if st.unpack(Unpack_four_null_bytes).first == FourNullBytes_as_string
432
456
  fh.pos = $SRF_OUT_HIT_FH_POS
433
457
  return nil
434
458
  end
@@ -436,20 +460,11 @@ class SRF::OUT::Hit < Array
436
460
 
437
461
  ## NOTE: in context of 4 bytes read above!
438
462
  st = fh.read(36)
439
- #p self
440
- #puts "HHHH: " + st.unpack("H*").first
441
- #puts st[34,2].unpack("H*").first
442
463
  if st[34,2] == NewRecordStart
443
464
  fh.pos = $SRF_OUT_HIT_FH_POS
444
465
  return nil
445
466
  end
446
467
 
447
- ##if st.unpack("@22H*").first == NewRecordStart_as_hex
448
- #if st[22,6] == NewRecordStart
449
- # fh.pos = $SRF_OUT_HIT_FH_POS
450
- # return nil
451
- #end
452
-
453
468
  # is this the end of the outfiles?
454
469
  ## BACK to beginning of this section
455
470
  fh.pos = $SRF_OUT_HIT_FH_POS
@@ -459,28 +474,67 @@ class SRF::OUT::Hit < Array
459
474
  end
460
475
 
461
476
  ## we have extra references
462
- self[10] += 1
463
- fh.read(79)
464
-
465
- #p self
477
+ ## original read was fh.read(79)
478
+ fh.seek(-1, IO::SEEK_CUR)
479
+ self[9].push( new_protein(fh.read(80).unpack(Unpack_Zstar).first, self, global_ref_hash ) )
480
+
481
+ #p self.prots
482
+ #puts self.prots.size
466
483
  #$glob ||= 0
467
484
  #$glob += 1
468
- #if $glob == 100
485
+ #if $glob == 20
469
486
  # abort
470
487
  #end
471
488
 
472
- read_extra_references(fh)
489
+ read_extra_references(fh,global_ref_hash)
473
490
  end
474
491
 
492
+ def new_protein(reference, peptide, global_ref_hash)
493
+ if global_ref_hash.key? reference
494
+ global_ref_hash[reference].peps << peptide
495
+ else
496
+ global_ref_hash[reference] = SRF::OUT::Prot.new(reference, [peptide])
497
+ end
498
+ global_ref_hash[reference]
499
+ end
475
500
 
476
- def from_handle(fh)
501
+ def from_handle(fh, global_ref_hash)
477
502
  ## get the first part of the info
478
503
  st = fh.read(320) ## read all the hit data
479
- self[0,10] = st.unpack('@64Ex8ex12eeIx18vvvx8Z*@240Z*')
480
- self[10] = 1
481
- read_extra_references(fh)
504
+ self[0,10] = st.unpack(Unpack)
505
+ # we are slicing the reference to 38 chars to be the same length as
506
+ # duplicate references
507
+ self[9] = [new_protein(self[9][0,38], self, global_ref_hash)]
508
+ self[12] = SpecID::Pep.sequence_to_aaseq(self[8])
509
+ read_extra_references(fh, global_ref_hash)
510
+
482
511
  self
483
512
  end
484
513
 
485
514
  end
486
515
 
516
+ SRF::OUT::Prot = ArrayClass.new( %w(reference peps) )
517
+
518
+ class SRF::OUT::Prot
519
+ include SpecID::Prot
520
+
521
+ tmp = $VERBOSE ; $VERBOSE = nil
522
+ def initialize(reference=nil, peps=[])
523
+ super(@@arr_size)
524
+ #@reference = reference
525
+ #@peps = peps
526
+ self[0,2] = reference, peps
527
+ end
528
+ $VERBOSE = tmp
529
+
530
+ # "<SRF::OUT::Prot reference=\"#{@reference}\">"
531
+
532
+ def inspect
533
+ "<SRF::OUT::Prot @reference=#{reference}, @peps(#)=#{peps.size}>"
534
+ end
535
+ end
536
+
537
+
538
+
539
+
540
+