~ubuntu-branches/ubuntu/raring/bioperl/raring

« back to all changes in this revision

Viewing changes to doc/howto/html/SimpleWebAnalysis.html

  • Committer: Bazaar Package Importer
  • Author(s): Charles Plessy
  • Date: 2008-03-18 14:44:57 UTC
  • mfrom: (4 hardy)
  • mto: This revision was merged to the branch mainline in revision 6.
  • Revision ID: james.westby@ubuntu.com-20080318144457-1jjoztrvqwf0gruk
* debian/control:
  - Removed MIA Matt Hope (dopey) from the Uploaders field.
    Thank you for your work, Matt. I hope you are doing well.
  - Downgraded some recommended package to the 'Suggests' priority,
    according to the following discussion on Upstream's mail list.
    http://bioperl.org/pipermail/bioperl-l/2008-March/027379.html
    (Closes: #448890)
* debian/copyright converted to machine-readable format.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
 
<HTML
3
 
><HEAD
4
 
><TITLE
5
 
>Web-based SimpleAnalysis HOWTO</TITLE
6
 
><META
7
 
NAME="GENERATOR"
8
 
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"></HEAD
9
 
><BODY
10
 
CLASS="ARTICLE"
11
 
BGCOLOR="#FFFFFF"
12
 
TEXT="#000000"
13
 
LINK="#0000FF"
14
 
VLINK="#840084"
15
 
ALINK="#0000FF"
16
 
><DIV
17
 
CLASS="ARTICLE"
18
 
><DIV
19
 
CLASS="TITLEPAGE"
20
 
><H1
21
 
CLASS="TITLE"
22
 
><A
23
 
NAME="AEN2"
24
 
>Web-based SimpleAnalysis HOWTO</A
25
 
></H1
26
 
><H3
27
 
CLASS="AUTHOR"
28
 
><A
29
 
NAME="AEN4"
30
 
>Richard Adams</A
31
 
></H3
32
 
><DIV
33
 
CLASS="AFFILIATION"
34
 
><SPAN
35
 
CLASS="ORGNAME"
36
 
>Dept. Medical Genetics, University of Edinburgh<BR></SPAN
37
 
><DIV
38
 
CLASS="ADDRESS"
39
 
><P
40
 
CLASS="ADDRESS"
41
 
><CODE
42
 
CLASS="EMAIL"
43
 
>&#60;<A
44
 
HREF="mailto:radams_at_staffmail.ed.ac.uk"
45
 
>radams_at_staffmail.ed.ac.uk</A
46
 
>&#62;</CODE
47
 
></P
48
 
></DIV
49
 
></DIV
50
 
><P
51
 
CLASS="PUBDATE"
52
 
>2003-11-14<BR></P
53
 
><DIV
54
 
CLASS="REVHISTORY"
55
 
><TABLE
56
 
WIDTH="100%"
57
 
BORDER="0"
58
 
><TR
59
 
><TH
60
 
ALIGN="LEFT"
61
 
VALIGN="TOP"
62
 
COLSPAN="3"
63
 
><B
64
 
>Revision History</B
65
 
></TH
66
 
></TR
67
 
><TR
68
 
><TD
69
 
ALIGN="LEFT"
70
 
>Revision 0.1</TD
71
 
><TD
72
 
ALIGN="LEFT"
73
 
>2003-11-14</TD
74
 
><TD
75
 
ALIGN="LEFT"
76
 
>Revised by: RA</TD
77
 
></TR
78
 
><TR
79
 
><TD
80
 
ALIGN="LEFT"
81
 
COLSPAN="3"
82
 
>First version</TD
83
 
></TR
84
 
></TABLE
85
 
></DIV
86
 
><DIV
87
 
><DIV
88
 
CLASS="ABSTRACT"
89
 
><P
90
 
></P
91
 
><A
92
 
NAME="AEN22"
93
 
></A
94
 
><P
95
 
>         This HOWTO tries to teach you to run a web based sequence
96
 
          analysis program using basic SimpleAnalysis rules.
97
 
        </P
98
 
><P
99
 
></P
100
 
></DIV
101
 
></DIV
102
 
><HR></DIV
103
 
><DIV
104
 
CLASS="TOC"
105
 
><DL
106
 
><DT
107
 
><B
108
 
>Table of Contents</B
109
 
></DT
110
 
><DT
111
 
>1. <A
112
 
HREF="#INTRODUCTION"
113
 
>Introduction</A
114
 
></DT
115
 
><DT
116
 
>2. <A
117
 
HREF="#SIMPLE"
118
 
>Simple Examples</A
119
 
></DT
120
 
><DT
121
 
>3. <A
122
 
HREF="#RETRIEVING_RESULTS"
123
 
>Retrieving results</A
124
 
></DT
125
 
><DT
126
 
>4. <A
127
 
HREF="#METASEQUENCES"
128
 
>Metasequences</A
129
 
></DT
130
 
><DT
131
 
>5. <A
132
 
HREF="#PARAMETERS"
133
 
>How to  run the same analysis with varying parameters</A
134
 
></DT
135
 
><DT
136
 
>6. <A
137
 
HREF="#CAVEATS"
138
 
>Caveats</A
139
 
></DT
140
 
><DT
141
 
>7. <A
142
 
HREF="#DEVELOPING"
143
 
>Interested in developing your own Analysis module?</A
144
 
></DT
145
 
><DT
146
 
>8. <A
147
 
HREF="#ACKNOWLEDGMENTS"
148
 
>Acknowledgments</A
149
 
></DT
150
 
></DL
151
 
></DIV
152
 
><DIV
153
 
CLASS="SECTION"
154
 
><H2
155
 
CLASS="SECTION"
156
 
><A
157
 
NAME="INTRODUCTION"
158
 
>1. Introduction</A
159
 
></H2
160
 
><P
161
 
>        There are several situations where it would be useful to run a web
162
 
        based sequence analysis program via a Perl script rather than using
163
 
        the web interface manually or downloading the program. Firstly, the
164
 
        source code or binaries may be unavailable or unavailable on your
165
 
        platform. Secondly, the analysis may depend on a regularly updated or
166
 
        large database that you don't wish to store or keep updated
167
 
        yourself. Thirdly, novel analyses are frequently available via a web
168
 
        server before being available for download.
169
 
      </P
170
 
><P
171
 
>        The aim of the Bio::Tools::Analysis modules is to allow automatic
172
 
        submission of sequences to prediction servers to facilitate sequence
173
 
        annotation for low to medium numbers of sequences (perhaps tens to
174
 
        hundreds). The modules both submit the sequences and parse the results
175
 
        into a number of useful formats, usually including Bio::SeqFeature
176
 
        objects, Bio::Seq::MetaI sequence objects and a basic Perl data
177
 
        structure, as well as the raw output text.
178
 
      </P
179
 
><P
180
 
>        At present the following prediction servers are supported, mainly
181
 
        reflecting my own research interests. Under current development
182
 
        are modules  wrapping remote analyses using HMMER, Pfam, the ELM 
183
 
        peptide motif database and SIFT for prediction of untolerated 
184
 
        non-synonymous SNPs. 
185
 
       <DIV
186
 
CLASS="TABLE"
187
 
><A
188
 
NAME="AEN29"
189
 
></A
190
 
><P
191
 
><B
192
 
>Table 1. Supported analyses</B
193
 
></P
194
 
><TABLE
195
 
BORDER="1"
196
 
CLASS="CALSTABLE"
197
 
><COL><COL><COL><THEAD
198
 
><TR
199
 
><TH
200
 
>Analysis</TH
201
 
><TH
202
 
>Purpose</TH
203
 
><TH
204
 
>Reference</TH
205
 
></TR
206
 
></THEAD
207
 
><TBODY
208
 
><TR
209
 
><TD
210
 
>Domcut</TD
211
 
><TD
212
 
>Protein domain boundaries</TD
213
 
><TD
214
 
>Bioinformatics 19, 673-674 (2003)</TD
215
 
></TR
216
 
><TR
217
 
><TD
218
 
>NetPhos</TD
219
 
><TD
220
 
>Protein phosphorylation sites</TD
221
 
><TD
222
 
>J Mol Biol 294, 1351-1362 (1999)</TD
223
 
></TR
224
 
><TR
225
 
><TD
226
 
>GOR4</TD
227
 
><TD
228
 
>Protein Secondary structure</TD
229
 
><TD
230
 
>Meths. Enzymology 266, 540-553 (1996)</TD
231
 
></TR
232
 
><TR
233
 
><TD
234
 
>HNN</TD
235
 
><TD
236
 
>Protein Secondary structure</TD
237
 
><TD
238
 
>Bioinformatics 15,413-421 (1999)</TD
239
 
></TR
240
 
><TR
241
 
><TD
242
 
>Sopma</TD
243
 
><TD
244
 
>Protein Secondary structure</TD
245
 
><TD
246
 
>Comput Appl Biosci 11, 681-684 (1995)</TD
247
 
></TR
248
 
><TR
249
 
><TD
250
 
>Mitoprot</TD
251
 
><TD
252
 
>Mitochondrial cleavage site prediction</TD
253
 
><TD
254
 
>Eur J Biochem 241, 779-786 (1996)</TD
255
 
></TR
256
 
><TR
257
 
><TD
258
 
>ESEfinder</TD
259
 
><TD
260
 
>Exonic splice site enhancers</TD
261
 
><TD
262
 
>NAR 31, 3568-3571 (2003)</TD
263
 
></TR
264
 
></TBODY
265
 
></TABLE
266
 
></DIV
267
 
>
268
 
      </P
269
 
></DIV
270
 
><DIV
271
 
CLASS="SECTION"
272
 
><HR><H2
273
 
CLASS="SECTION"
274
 
><A
275
 
NAME="SIMPLE"
276
 
>2. Simple Examples</A
277
 
></H2
278
 
><P
279
 
>        The script below runs multiple analyses on a single sequence
280
 
        and parses the results into standard BioPerl sequence feature
281
 
        objects (Bio::SeqFeature::Generic objects to be precise). 
282
 
       <PRE
283
 
CLASS="PROGRAMLISTING"
284
 
>     # load up the modules
285
 
     
286
 
     use Bio::Tools::Analysis::Protein::HNN;
287
 
     use Bio::Tools::Analysis::Protein::Domcut;
288
 
     use Bio::Tools::Analysis::Protein::MitoProt;
289
 
     use Bio::Tools::Analysis::Protein::NetPhos;
290
 
     
291
 
     
292
 
     our @ISA = qw(Bio::Tools::Analysis::SimpleAnalysisBase);
293
 
     
294
 
     my $seq;# a Bio::Seq object
295
 
     for my $method ( qw(Domcut MitoProt NetPhos HNN)) {
296
 
     
297
 
        #analyses need a Bio::PrimarySeq, not a Bio::Seq;
298
 
        my $tool = Bio::Tools::Analysis::Protein::$method-&#62;new(
299
 
             -seq =&#62; $seq-&#62;primary_seq);
300
 
        $tool-&#62;run();
301
 
        my @fts = $tool-&#62;result('Bio::SeqFeatureI');
302
 
        $seq-&#62;add_SeqFeature(@fts); 
303
 
     }        
304
 
       </PRE
305
 
>
306
 
      </P
307
 
><P
308
 
>        The above script runs several analyses using default parameters. All
309
 
        analyses have such defaults and  in general only a sequence of the 
310
 
        appropriate type is needed for the analysis to be submitted. A sequence
311
 
        can be added either in the constructor, as shown above, or by the seq()
312
 
        method. 
313
 
       <PRE
314
 
CLASS="PROGRAMLISTING"
315
 
>     my $primary_seq = new Bio::PrimarySeq(-seq=&#62;$seq_as_string);
316
 
     my $tool =  new Bio::Tools::Analysis::Protein::NetPhos(); 
317
 
     $tool-&#62;seq($primary_seq);
318
 
       </PRE
319
 
>
320
 
        Note that the only valid sequence format is a Bio::PrimarySeq object.
321
 
                 This is in order to support multiple methods of retrieving the 
322
 
        results. If you initially have  a Bio::Seq object or Bio::RichSeq
323
 
        object (e.g., from a GenBank file) you can call its primary_seq() 
324
 
        method to obtain a Bio::PrimarySeq object.
325
 
      </P
326
 
></DIV
327
 
><DIV
328
 
CLASS="SECTION"
329
 
><HR><H2
330
 
CLASS="SECTION"
331
 
><A
332
 
NAME="RETRIEVING_RESULTS"
333
 
>3. Retrieving results</A
334
 
></H2
335
 
><P
336
 
>               If the run() method executes successfully, the raw output (stripped of
337
 
        HTML) is now stored in the Analysis object. 
338
 
        All modules should return the raw report by a call to result() 
339
 
        with no parameters. e.g., 
340
 
     <PRE
341
 
CLASS="PROGRAMLISTING"
342
 
>     my $raw_report = $tool-&#62;result();
343
 
     </PRE
344
 
>
345
 
        A second way is to retrieve a ready-parsed data structure:
346
 
    <PRE
347
 
CLASS="PROGRAMLISTING"
348
 
>     my $parsed_report = $tool-&#62;result('parsed'); 
349
 
    </PRE
350
 
>
351
 
        The data structure returned is described in the $RESULT_SPEC-&#62;{'raw'}
352
 
        hash reference and should always be a native Perl data structure.
353
 
   </P
354
 
><P
355
 
>        A third way is to retrieve an array of sequence features:
356
 
    <PRE
357
 
CLASS="PROGRAMLISTING"
358
 
>     my @fts = $tool-&#62;result('Bio::SeqFeatureI'); 
359
 
     $seq-&#62;add_SeqFeature(@fts); # add features to sequence.
360
 
    </PRE
361
 
>
362
 
 
363
 
        These are Bio::SequenceFeature::Generic features. Sometimes a
364
 
        module might use some code to judge the significance of a
365
 
        result prior to listing it as a feature, for example in the
366
 
        secondary structure prediction modules.  The rules governing this
367
 
        are described in  individual modules. For example, I have put in a rule 
368
 
        that only runs of a minimum of 4 consecutive residues predicted to be
369
 
        beta sheet or alpha helix can be annotated as features - it makes no sense 
370
 
        for a single isolated residue to be annotated as being in a helix. 
371
 
                However you might want to filter the raw results yourself, in which 
372
 
        case retrieving the results as Bio::Seq::Meta::Array type objects 
373
 
        might be better. 
374
 
 
375
 
   </P
376
 
></DIV
377
 
><DIV
378
 
CLASS="SECTION"
379
 
><HR><H2
380
 
CLASS="SECTION"
381
 
><A
382
 
NAME="METASEQUENCES"
383
 
>4. Metasequences</A
384
 
></H2
385
 
><P
386
 
>&#13;        Many analyses produce a list of scores, one for each residue
387
 
        in a sequence. For example, the protein secondary structure
388
 
        prediction program Sopma returns a list of probabilities for
389
 
        each residue being in helix, sheet, turn or coil. These
390
 
        modules make this data available in the form of meta
391
 
        sequences. These are sequence objects derived from
392
 
        Bio::PrimarySeq that have arrays of sequence associated data
393
 
        contained in the object. The meta sequence names should be
394
 
        listed in the individual module documentation.  To retrieve
395
 
        results like this supply the string 'meta' as a parameter
396
 
        to the result() method.
397
 
                Meta sequence objects can access all the PrimarySeq object 
398
 
        methods for accessing and manipulating the protein/DNA sequence
399
 
        and also have specific methods for accessing the result data. 
400
 
 
401
 
      <PRE
402
 
CLASS="PROGRAMLISTING"
403
 
>     $meta_seq = $analysis-&#62;result('meta');
404
 
      </PRE
405
 
>
406
 
 
407
 
        This returns a sequence object with the raw analysis data
408
 
        accessible through methods e.g.,
409
 
 
410
 
     <PRE
411
 
CLASS="PROGRAMLISTING"
412
 
>     my @scores1_20 = $meta_seq-&#62;named_sub_meta('Sopma_turn', 1,20);
413
 
     </PRE
414
 
>
415
 
 
416
 
        returns an array of scores for the first 20 amino acids
417
 
 
418
 
     <PRE
419
 
CLASS="PROGRAMLISTING"
420
 
>     my @allscores = $meta_seq-&#62;named_meta('Sopma_turn');
421
 
     </PRE
422
 
>
423
 
 
424
 
        returns an array of scores for the whole sequence. The names of 
425
 
        individual meta sequence names are listed in the module 
426
 
        documentation.
427
 
     </P
428
 
><P
429
 
>&#13;       Although a full description of how metasequence objects work isn't
430
 
       really the purpose of this HOWTO there is excellent documentation in
431
 
       Bio::Seq::MetaI and Bio::Seq::Meta::Array modules. 
432
 
     </P
433
 
></DIV
434
 
><DIV
435
 
CLASS="SECTION"
436
 
><HR><H2
437
 
CLASS="SECTION"
438
 
><A
439
 
NAME="PARAMETERS"
440
 
>5. How to  run the same analysis with varying parameters</A
441
 
></H2
442
 
><P
443
 
>&#13;      You might want to run some analyses with varying parameters in
444
 
      order to determine the effect on the prediction.  
445
 
      At present only the Sopma module takes alternative parameters i.e.
446
 
      arguments other than just the sequence. Any parameter that is settable
447
 
      on the web form should have a method of the same name to get/set its
448
 
      values, or alternatively it can be set in the constructor.
449
 
 
450
 
      <PRE
451
 
CLASS="PROGRAMLISTING"
452
 
>     my $sopma = Bio::Tools::Analysis::Protein::Sopma-&#62;new();
453
 
     $sopma-&#62;seq(seqobj-&#62;primary_seq);
454
 
     $sopma-&#62;window_width(21);
455
 
     </PRE
456
 
>
457
 
 
458
 
     So, let's suppose we want to investigate how varying the window_width 
459
 
     parameter affects the secondary structure prediction for a sequence. 
460
 
     We can do this inthe following manner:
461
 
   
462
 
                
463
 
    <PRE
464
 
CLASS="PROGRAMLISTING"
465
 
>     my $seq = Bio::Seq-&#62;new(-seq =&#62; 'ASFATFDATFATFSTFATSFATFSTAF');
466
 
     my $tool = Bio::Tools::Analysis::Protein::Sopma-&#62;new
467
 
       (-seq=&#62;$seq-&#62;primary_seq);
468
 
     
469
 
     for my $w_size(qw(11 13 15 17 19 21 23)) {
470
 
     
471
 
         $tool-&#62;window_width($w_size);  #set new parameter
472
 
         $tool-&#62;run(); #default parameters
473
 
     
474
 
         #2nd param is appended to metasequence name
475
 
         $tool-&#62;result('meta', $w_size);
476
 
             
477
 
         ## add to sequence features
478
 
         $seq-&#62;add_SeqFeature(
479
 
         $tool-&#62;result('Bio::SeqFeatureI'));
480
 
         $tool-&#62;clear(); #removes raw data from the previous analysis
481
 
     }
482
 
     # meta seq now has 28 arrays of metadats - 7 analyses and
483
 
     # 4 prediction categories,
484
 
     
485
 
     ## now get meta_sequence
486
 
     my $meta_seq = $tool-&#62;seq();
487
 
    </PRE
488
 
>
489
 
        Only 3 new points are raised by this program. Firstly, each time
490
 
        the analysis is run it needs to be parsed immediately. The raw
491
 
        report data is removed from  one analysis to another to reduce
492
 
        memory usage. Secondly, in order to distinguish the meta data 
493
 
        each analysis needs to be given a specific identifier which is 
494
 
        appended to the default name. So in this case the meta data names 
495
 
        would be Sopma_meta|11, Sopma_meta|13, etc. 
496
 
        Thirdly, the  clear() method should be called between 
497
 
        analyses of the same sequence to ensure the internal data fields
498
 
        that hold the raw report are removed. So if you want to keep the raw 
499
 
        reports you need to store them after each analysis is returned.
500
 
   </P
501
 
><P
502
 
>&#13;      So, how are features obtained from multiple runs distinguished? 
503
 
            This information is contained in tags with the same name as the
504
 
        parameters, when the settings aren't the default ones. In other words,
505
 
        the features retain knowledge of the analysis method's parameters. 
506
 
    
507
 
        <PRE
508
 
CLASS="PROGRAMLISTING"
509
 
>                         
510
 
     ## carrying on from previous listing.... ##
511
 
     ##
512
 
     ## get all secondary structure features
513
 
     my @sec_fts = grep{$_-&#62;primary_tag eq '2ary'} 
514
 
                       $seq-&#62;all_SeqFeatures;
515
 
     my @ww11 = grep{($_-&#62;each_tag_value('method'))[0]  eq 'Sopma' &#38;&#38;
516
 
                     ($_-&#62;each_tag_value('window_width'))[0] == 11}
517
 
                     @sec_fts;
518
 
     
519
 
     ## now onto comparison..... ##
520
 
     </PRE
521
 
522
 
 
523
 
 
524
 
     </P
525
 
></DIV
526
 
><DIV
527
 
CLASS="SECTION"
528
 
><HR><H2
529
 
CLASS="SECTION"
530
 
><A
531
 
NAME="CAVEATS"
532
 
>6. Caveats</A
533
 
></H2
534
 
><P
535
 
>&#13;        The problem with these analyses is their speed of execution, which
536
 
        obviously depends on your network speed, the complexity of the
537
 
        analysis and the speed of the host. Moreover, it is usually polite to
538
 
        leave a second or two between requests to avoid blocking the server,
539
 
        which means that to annotate a single protein sequence with all of the
540
 
        X methods available may take over a minute. Certainly these modules
541
 
        are unsuitable for genome scale analysis and are designed for use with
542
 
        smaller numbers of sequences. However, the code in the result()
543
 
        methods should still be usable for parsing analyses run locally when
544
 
        the local output and webpage output are the same format.
545
 
 
546
 
      </P
547
 
></DIV
548
 
><DIV
549
 
CLASS="SECTION"
550
 
><HR><H2
551
 
CLASS="SECTION"
552
 
><A
553
 
NAME="DEVELOPING"
554
 
>7. Interested in developing your own Analysis module?</A
555
 
></H2
556
 
><P
557
 
>        Most of the hard work is done by Bio::WebAgent and
558
 
        Bio::SimpleAnalysisBase. Any module must inherit from this latter
559
 
        module as it contains methods common to all analyses.
560
 
      </P
561
 
><P
562
 
>        For a minimal prediction server which takes just sequence as a
563
 
        parameter (e.g., Domcut), only 3 methods need to be explicitly
564
 
        written.
565
 
      </P
566
 
><P
567
 
>        1. _run() which mimics the web form, submits the sequence
568
 
        and extracts the raw text data of the result from the HTML.
569
 
      </P
570
 
><P
571
 
>        2. result() which parses the raw data into whatever useful format you
572
 
        wish. Usually these include SeqFeature objects, standard Perl data
573
 
        structures and meta sequences if there is a result for each residue in
574
 
        the sequence.
575
 
      </P
576
 
><P
577
 
>        3. _init() which imports the analysis specifications into the
578
 
        Analysis object
579
 
      </P
580
 
><P
581
 
>        As well as these methods, various file scoped lexical hashes need to
582
 
        be defined which hold constant data about the analysis, and the
583
 
        analysis result. These are useful for reference and are incorporated
584
 
        into the analysis objects.
585
 
      </P
586
 
><P
587
 
>        
588
 
        For more complicated prediction programs with analysis specific
589
 
        parameters (e.g., Sopma), get/set methods need to be written. Also, if
590
 
        any of these parameters need special error checking then a
591
 
        check_parameters() needs to be written as well. The nature of these
592
 
        parameters should be listed in a hash referenced by the $INPUT_SPEC
593
 
        variable.
594
 
 
595
 
      </P
596
 
><P
597
 
>        Alternatively, mail me with your suggestion and I'll try to put one
598
 
        together.  It is my intent to keep the modules up to date with new 
599
 
        analysis programs as they become available which are not included in
600
 
        the usual protein annotations and will be glad to hear of new 
601
 
        suggestions.
602
 
      </P
603
 
></DIV
604
 
><DIV
605
 
CLASS="SECTION"
606
 
><HR><H2
607
 
CLASS="SECTION"
608
 
><A
609
 
NAME="ACKNOWLEDGMENTS"
610
 
>8. Acknowledgments</A
611
 
></H2
612
 
><P
613
 
>         These modules depend on several recently developed modules and wouldn't
614
 
         work at all without them. 
615
 
         Bio::Seq::Meta:: modules:
616
 
                        Chad Matsalla, Aaron Mackey and Heikki Lehvaslaiho
617
 
         Bio::WebAgent:
618
 
             Heikki Lehvaslaiho
619
 
         Bio::SimpleAnalysisI:
620
 
             Martin Senger  
621
 
       </P
622
 
></DIV
623
 
></DIV
624
 
></BODY
625
 
></HTML
626
 
>
 
 
b'\\ No newline at end of file'