<html>
<head>
<style>
body {
  font-family: Verdana, sans-serif;
  font-size: 0.8em;
  color:#484848;
}
h1, h2, h3 { font-family: "Trebuchet MS", Verdana, sans-serif; margin: 0px; }
h1 { font-size: 1.2em; }
h2, h3 { font-size: 1.1em; }
a, a:link, a:visited { color: #2A5685;}
a:hover, a:active { color: #c61a1a; }
a.wiki-anchor { display: none; }
fieldset.attachments {border-width: 1px 0 0 0;}
hr {
  width: 100%;
  height: 1px;
  background: #ccc;
  border: 0;
}
span.footer {
  font-size: 0.8em;
  font-style: italic;
}
</style>
</head>
<body>
Issue #2382 has been updated by Peter Cock.

<ul>
  <li><strong>Description</strong> updated (<a title="View differences" href="https://redmine.open-bio.org/journals/diff/15378?detail_id=1695">diff</a>)</li>
  <li><strong>Status</strong> changed from <i>New</i> to <i>Closed</i></li>
  <li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li>
</ul>

<p>I'm going to close this issue. We have FASTA and QUAL parsers in Biopython, but I can't think of any other FASTA-like examples which have been requested over the years which would justify a general framework for a wider loosely defined family of FASTA-like formats. However, file formats always seem to be changing in bioinformatics so who knows what things will be like in a few more years? Thanks everyone for your comments and suggestions here.</p>
<hr />
<h1><a href="https://redmine.open-bio.org/issues/2382#change-15378">Bug #2382: Generic Roche or GSFlex  "FASTA" parser</a></h1>

<ul><li>Author: Jared Flatow</li>
<li>Status: Closed</li>
<li>Priority: Normal</li>
<li>Assignee: Biopython Dev Mailing List</li>
<li>Category: Main Distribution</li>
<li>Target version: Not Applicable</li>
<li>URL: </li></ul>

<p>I would like to be able read in and iterate over records in generic fasta files of the format:</p>


<blockquote>

        <p>header</p>


</blockquote>

        <p>data</p>


<blockquote>

        <p>header</p>


</blockquote>

        <p>data<br />...</p>


        <p>This iterator should return Bio.Fasta.Record objects with the corresponding header and data fields.</p>


        <p>I suggest putting this inside the existing Bio.Fasta module and updating Bio.SeqIO.Fasta to use this iterator and transform the records returned into Bio.SeqRecord objects.</p>


        <p>This should make it easier to add metadata to SeqRecord objects parsed in from FASTA. Consider the following example for illustration. I have data from a genome sequencing machine that outputs pairs of files. One contains the sequence reads which look like this, the other contains estimates of the quality of each base call in the sequence.</p>


        <p>The sequence file might look something like this (only with hundreds of thousands more entries):</p>


<blockquote>

        <p>ERSGEES02IKV6B length=97 xy=3401_1361 region=2 run=R_runname</p>


</blockquote>

        <p>CAATATAATTTCTCTTAAAATTATTCCCATGGCCAGGTGTGGTGGCTCACACCTGTAGTC<br />CCGGCACTTTGGGAGGCCAAGGCACACAGGGGATAGG</p>


<blockquote>

        <p>ERSGEES02GGZDB length=142 xy=2536_2685 region=2 run= R_runname</p>


</blockquote>

        <p>GGTCTCCAGTGCCCTGTCTCCCCATATTTCTGACACACCTTCTCACAGCCTGGCCCATCT<br />TGCTGGGTCCCTCTTCTCCTCCCTTCCTGCTCCATTTGTCAACACTGCTGGGACATTAGA<br />ATTCAGATCTCCCGGGTCACCG</p>


<blockquote>

        <p>ERSGEES02JQUCP length=113 xy=3879_0663 region=2 run= R_runname</p>


</blockquote>

        <p>AAAGTGACTAAAGAATCAATTTACATTAATATTCTATGTGAACAGGCAAAATACTTACAA<br />AGAAGTAGAGAAAATATGAATTCAGTACAGAATTCAGATCTCCCGGGTCACCG</p>


        <p>The corresponding quality score file might look something like this:</p>


<blockquote>

        <p>ERSGEES02IKV6B length=97 xy=3401_1361 region=2 run= R_runname</p>


</blockquote>

        <p>27 28 21 27 27 27 28 22 28 25 3 27 27 27 28 21 33 31 20 6 28 21 26 26 18 28 25 2 26 25 29 23 31 24 27 29 22 27 27 27 29 23 27 31 25 27 27 27 27 27 27 32 26 27 27 27 27 26 27 33<br />30 12 32 26 27 27 27 33 30 12 33 30 12 26 31 25 33 27 32 28 33 28 27 27 27 27 27 26 33 32 20 7 27 27 27 32 26</p>


<blockquote>

        <p>ERSGEES02GGZDB length=142 xy=2536_2685 region=2 run= R_runname</p>


</blockquote>

        <p>28 9 26 24 27 27 20 26 18 25 27 32 29 10 26 26 27 18 25 32 30 17 1 25 27 22 32 30 12 27 27 22 26 25 27 23 25 28 21 32 27 27 27 25 26 27 26 25 27 20 26 26 19 28 25 3 25 27 22 27<br />19 24 24 24 32 29 11 24 34 31 17 23 23 30 23 27 25 30 23 27 33 31 17 27 20 28 21 27 25 26 26 30 24 27 33 31 13 26 27 27 31 25 27 25 23 26 16 26 27 30 27 7 27 27 27 32 27 26 26 32<br />27 30 26 27 27 27 27 27 27 27 30 27 6 34 31 17 27 21 27 32 28 18</p>


<blockquote>

        <p>ERSGEES02JQUCP length=113 xy=3879_0663 region=2 run= R_runname</p>


</blockquote>

        <p>29 26 5 25 27 24 27 27 27 30 27 7 26 27 19 25 26 31 26 34 32 16 20 27 26 32 27 32 28 27 25 26 18 27 25 27 26 26 24 27 31 25 27 27 31 26 26 34 32 23 11 26 22 27 32 26 27 26 32 30<br />11 26 31 24 27 27 25 23 27 27 33 30 19 4 17 26 25 26 31 27 30 26 27 26 22 26 18 24 27 26 32 26 32 28 27 27 25 27 25 24 25 31 28 10 34 31 15 27 21 27 28 21 27</p>


        <p>I would like to be able to do the following:</p>


        <ol>
        <li>create a function to parse the header line and return a dictionary<br />def parse_gsflex_header(gs_header):<br />        parts = gs_record.description.split(' ')<br />        assert len(parts) == 5<br />        xy = parts<sup><a href="#fn2">2</a></sup>.split('=')[1].split('_')<br />        return {'letters': gs_record.seq.tostring(),<br />                'name': parts<sup><a href="#fn0">0</a></sup>,<br />                'length': parts<sup><a href="#fn1">1</a></sup>.split('=')[1],<br />                'xpos': xy<sup><a href="#fn0">0</a></sup>,<br />                'ypos': xy<sup><a href="#fn1">1</a></sup>,<br />                'region': parts<sup><a href="#fn3">3</a></sup>.split('=')[1],<br />                'run': parts<sup><a href="#fn4">4</a></sup>.split('=')[1]}</li>
        </ol>


        <ol>
        <li>Bio.SeqIO.FastaIO wraps the Bio.Fasta parser, might look something like this<br />class Fasta(): # or however its organized<br />   def data_toseq(data):
      # do some parsing of the data<br />      return Seq(...)

        <p>def parse(file, header_todict):<br />     return (SeqRecord(seq=data_toseq(record.data), **header_todict(record.header)) for record in Bio.Fasta.parse(file))</p></li>
        </ol>


        <ol>
        <li>I create an initial SeqRecord dictionary using the Bio.SeqIO.FastaIO parser<br />seq_dict = SeqIO.to_dict(SeqIO.FastaIO.parse(seq_file,  parse_gsflex_header))</li>
        </ol>


        <ol>
        <li>Then I iterate over the sequences in the qual file and look them up in the seq_dict</li>
                <li>setting the quality scores as I find them them<br />for record in Bio.Fasta.parse(qual_file):<br />    seq_dict[my_header_todict(record.header)['id']].quality =  my_qualitycleanup(record.data)</li>
        </ol>


        <p>This would work well for parsing all kinds of FASTA-like files and provides a simple mechanism for dealing with them record by record.</p>

  <fieldset class="attachments"><legend>Files</legend>
    <a href="https://redmine.open-bio.org/attachments/download/1247/sift.py">sift.py</a>
    (7.9 KB)<br />
  </fieldset>


<hr />
<span class="footer"><p>You have received this notification because you have either subscribed to it, or are involved in it.<br />To change your notification preferences, please click here and login: <a class="external" href="http://redmine.open-bio.org">http://redmine.open-bio.org</a></p></span>
</body>
</html>