[Bioperl-l] alignIO::fasta bug

Chris Fields cjfields at illinois.edu
Mon Jan 26 03:51:33 UTC 2009


Not to mention the wiki's malleable and editable by anyone (so we can  
all work on ideas for the interface and tests, then start coding  
towards a decent solution).

Jason, any additional ideas?  I would like to hammer out the specifics  
on how to deal with various symbols, how we extract a subsequence via  
subseq(), etc.

-c

On Jan 25, 2009, at 9:10 PM, Mark A. Jensen wrote:

> Chris--
> Yes, I see what you mean. Trickier than I thought. Sounds like its  
> time to 'mature' LocatableSeq.
> Wiki's a great place for that-
> MAJ
> ----- Original Message ----- From: "Chris Fields" <cjfields at illinois.edu 
> >
> To: "Mark A. Jensen" <maj at fortinbras.us>
> Cc: "Jason Stajich" <jason at bioperl.org>; "BioPerl List" <bioperl-l at bioperl.org 
> >
> Sent: Saturday, January 24, 2009 12:25 AM
> Subject: Re: [Bioperl-l] alignIO::fasta bug
>
>
>>
>> On Jan 22, 2009, at 10:54 PM, Mark A. Jensen wrote:
>>
>>> couple of thoughts...
>>>
>>> ----- Original Message ----- From: "Chris Fields" <cjfields at illinois.edu
>>> >
>>> To: "Jason Stajich" <jason at bioperl.org>
>>> Cc: "BioPerl List" <bioperl-l at bioperl.org>
>>> Sent: Thursday, January 22, 2009 10:54 PM
>>> Subject: Re: [Bioperl-l] alignIO::fasta bug
>>>
>>>> On Jan 22, 2009, at 3:33 PM, Jason Stajich wrote:
>>>>
>>>>> FYI - it appears that if the last sequence in a FASTA MSA is  
>>>>> all   gaps (which happens in some whole genome synteny+multiple   
>>>>> alignment  chunking like Mercator) no alignment is returned.
>>>>>
>>>>> yuck. It basically comes down to this bit of code where $end   
>>>>> would  equal sequence length.
>>>>>
>>>>> #  If $end <= 0, we have either reached the end of
>>>>> #  file in <> or we have encountered some other error
>>>>> if ( $end <= 0 &&  ) {
>>>>> undef $aln;
>>>>> return $aln;
>>>>> }
>>> [haven't looked at the code, but] On the surface, this looks like  
>>> a  bit more
>>> responsibility than $end should be expected to handle, so I like   
>>> Jason's
>>> solution below better, which is only masquerading as a kludge.
>>>
>>>>>
>>>>> This start/end requirement of locatable seq is nice but kind of  
>>>>> a   pain where I am managing the map of sequences outside of   
>>>>> alignment  chunk.
>>>>
>>>> I faced this issue with Mauve parsing (Bio::SeqIO::xmfa).  I set  
>>>> it  up  so LocatableSeqs can now have all gaps, but the alphabet  
>>>> needs  to be  set (get a warning otherwise) and start and end  
>>>> need to be  initiated  to 0, which is how I believe Mauve defined  
>>>> these.   However, should 0-0  be a valid start/end for such a  
>>>> sequence?   Should we change that to  automatically allow start =  
>>>> end = X (any  position including 0) if a  sequence is all gaps or  
>>>> empty?
>>>
>>> I don't like any old start==end implying zero length, even under  
>>> the condition
>>> that the underlying sequence is empty, since in the "1-origin,   
>>> endpoints" model
>>> that pervades BP (as opposed to the "0-origin, length" model of,   
>>> say, substr),
>>> the pair ($start, $end) has the strong connotation of "the  
>>> residue  at $start"
>>> if $start==$end. (At least, it does now that we've fixed   
>>> LocatableSeq...)
>>
>> It could just as easily be undef (no start/end).  However, see  
>> below...
>>
>>> What if we consider 0 to be special, the 'sequence anchor', that   
>>> takes up no
>>> real space? I'm thinking of 'point' and 'mark' in emacs, that   
>>> actually point at
>>> the interstices between characters, and not the characters   
>>> themselves. Or \G
>>> for something perly. Then $start means not just the coordinate,  
>>> but  the
>>> 'space' before the residue at $start,  and $end means the 'space'   
>>> after the
>>> residue at $end. If $start==$end > 0, how many residues between   
>>> $start and $end?
>>> One. If $start == $end == 0, how many residues? None, because the   
>>> anchor
>>> is special, it doesn't take up residues.
>>>
>>> If a sequence is all gaps, what's its length? It has an  
>>> understood  anchor at 0,
>>> then the gap symbols are removed, so its length is the length of  
>>> the  anchor
>>> alone, which is zero, and $start = 0 is the 'space' before the   
>>> anchor, and
>>> $end = 0 is the 'space' after the anchor.
>>
>> Where this becomes sticky is taking alignment sections, a problem   
>> encountered when attempting to create interleaved output, for   
>> instance.  Let's say (for example) you have a long alignment that  
>> has  large gaps (think genome alignment ala MUMmer or Mauve).  If  
>> you take  a subsection of that alignment, you could very possibly  
>> end up with a  sequence that is all gaps.  Here is an example from  
>> Rfam (note  AE013109.1):
>>
>> AL596170.1/181975-181872  
>> AG................................................
>> BA000016.3/1419453-1419329  
>> UU..........................................AAUUAU
>> AE001437.1/2206791-2206643  
>> AGGAAUUAUUUUGAAGAACUUUAUAGACGUAGAA..........GAAAAA
>> BA000016.3/1419328-1419245  
>> GG................................................
>> AE013183.1/26-124 AG.............................................GAU
>> AE013109.1/12950-12813  
>> GAGA........................................AUAUAG
>> AE013109.1 / 13583  
>> -13495 ..................................................
>> AF044978.1/176-335 AAUC........................................AUGCAA
>> X84262.1/148-332 CAGCUCAAAAUCCAUAUAUAA.......................ACAAGA
>> CR954253.1/898444-898260  
>> UCUCUCAAAGUCUA..............................CUUAAA
>>
>> So let's say we take the slice above from the alignment and create  
>> a  new SimpleAlign.  We know the original coordinates for each   
>> LocatableSeq; should we override them and mark the start = end =  
>> 0?   Or would we want to have a sequence that is indicated as  
>> between the  end of the last known position and the beginning of  
>> the next  (500^501)?  This also doesn't take into account start/end  
>> gaps; maybe  for beginning gaps start = end = 0 and end gaps start  
>> = end = length.
>>
>> For no sequence at all (undef) start = end = undef as well.
>>
>>> Now this would mean say, $s->subseq(0, $n) eq $s->subseq(1, $n).  
>>> I  don't
>>> think this is too troubling, since 1) it's consistent with the   
>>> concept above, and
>>> 2) zeros would only show up when the empty sequences are  
>>> encountered.
>>
>> Okay.
>>
>>>> If we come up with some rough ideas of how to handle this we can   
>>>> add  some examples to the test suite and try getting  
>>>> LocatableSeq  to do the  right thing.  We can always mark them as  
>>>> TODO.
>>>>
>>>>> Why not just check to see that the number of seq characters is  
>>>>> 0  -  an all-gapped sequence as the last sequence of the file  
>>>>> should  still  be legal.
>>>>>
>>>>> Instead:
>>>>> if ( length($seqchar) == 0 ) {
>>>>> undef $aln;
>>>>> return $aln;
>>>>> }
>>>>>
>>>>> Although that would invalidate an empty alignment like this --  
>>>>> do  we  want to still permit these?
>>>>> >A
>>>>>
>>>>> >B
>>>>>
>>>>> >C
>>>>
>>>> These could be zero-length, empty seqs (start = end = undef).   
>>>> I   thought something was added to PrimarySeq recently for empty  
>>>> seqs.
>>>
>>> Maybe the above concept would encompass empty sequences (gapped
>>> or ungapped) without recourse to undef.
>>>
>>> cheers, Mark
>>
>> From this discussion I think it's worth coming up with some kind  
>> of  idea on what we expect LocatableSeq to do under various  
>> circumstances;  the wiki is a good place to start something up.  I  
>> don't think that  refactoring everything is necessary, but it might  
>> be worth putting out  some variations for consideration.
>>
>> For instance I have had the idea of making a new RangeI-based   
>> Bio::SeqI that would just delegate the RangeI methods to a  
>> 'source'  SeqFeature containing a Bio::LocationI.  The PrimarySeqI  
>> would be a  simplified LocatableSeq capable of dealing with subseq  
>> issues as  discussed previously, but simplified. In fact, it should  
>> probably  recognize any PrimarySeqI.
>>
>> Advantages: can add annotation and features specific for the  
>> sequence,  and (beyond simple decorated methods used to make access  
>> simple) it is  a Bio::Seq and could be persisted in a BioSQL.   
>> Disadvantages: lots of  objects and thus slower.
>>
>> chris
>>
>




More information about the Bioperl-l mailing list