treetime/treeanc.py
def aln(self,in_aln):
        """
        Reads in the alignment (from a dict, MultipleSeqAlignment, or file,
        as necessary), sets tree-related parameters, and attaches sequences
        to the tree nodes.

        Parameters
        ----------
        in_aln : MultipleSeqAlignment, str, dict/defaultdict
            The alignment to be read in

        """
        # load alignment from file if necessary
        from os.path import isfile
        from Bio.Align import MultipleSeqAlignment
        self._aln = None
        if in_aln is None:
            return
        elif isinstance(in_aln, MultipleSeqAlignment):
            self._aln = in_aln
        elif type(in_aln) in string_types and isfile(in_aln):
            for fmt in ['fasta', 'phylip-relaxed', 'nexus']:
                try:
                    self._aln=AlignIO.read(in_aln, fmt)
                    break
                except:
                    continue
        elif type(in_aln) in [defaultdict, dict]:  #if is read in from VCF file
            self._aln = in_aln
            self.is_vcf = True

        if self._aln is None:
            self.logger("TreeAnc: loading alignment failed... ",1, warn=True)
            return ttconf.ERROR

        #Convert to uppercase here, rather than in _attach_sequences_to_nodes
        #(which used to do it through seq2array in seq_utils.py)
        #so that it is controlled by param convert_upper. This way for
        #mugration (ancestral reconstruction of non-sequences), you can
        #use upper- and lower case characters for discrete states!
        if (not self.is_vcf) and self.convert_upper:
            self._aln = MultipleSeqAlignment([seq.upper() for seq in self._aln])

        if self.seq_len:
            if self.is_vcf and self.seq_len!=len(self.ref):
                self.logger("TreeAnc.aln: specified sequence length doesn't match reference length, ignoring sequence length.", 1, warn=True)
                self._seq_len = len(self.ref)
            else:
                self.logger("TreeAnc.aln: specified sequence length doesn't match alignment length. Treating difference as constant sites.", 2, warn=True)
                self.additional_constant_sites = max(0, self.seq_len - self.aln.get_alignment_length())
        else:
            if self.is_vcf:
                self.seq_len = len(self.ref)
            else:
                self.seq_len = self.aln.get_alignment_length()

        # check whether the alignment is consistent with a nucleotide alignment.
        likely_alphabet = self._guess_alphabet()
        from .seq_utils import alphabets
        # if likely alignment is not nucleotide but the gtr alignment is, WARN
        if likely_alphabet=='aa' and self.gtr.n_states==len(alphabets['nuc']) and np.all(self.gtr.alphabet==alphabets['nuc']):
            self.logger('WARNING: small fraction of ACGT-N in alignment. Really a nucleotide alignment? if not, rerun with --aa', 1, warn=True)
        # conversely, warn if alignment is consistent with nucleotide but gtr has a long alphabet
        if likely_alphabet=='nuc' and self.gtr.n_states>10:
            self.logger('WARNING: almost exclusively ACGT-N in alignment. Really a protein alignment?', 1, warn=True)

        if hasattr(self, '_tree') and (self.tree is not None):
            self._attach_sequences_to_nodes()
        else:
            self.logger("TreeAnc.aln: sequences not yet attached to tree", 3, warn=True)
def aln(self,in_aln):
        """
        Reads in the alignment (from a dict, MultipleSeqAlignment, or file,
        as necessary), sets tree-related parameters, and attaches sequences
        to the tree nodes.

        Parameters
        ----------
        in_aln : MultipleSeqAlignment, str, dict/defaultdict
            The alignment to be read in

        """
        # load alignment from file if necessary
        from os.path import isfile
        from Bio.Align import MultipleSeqAlignment
        self._aln = None
        if in_aln is None:
            return
        elif isinstance(in_aln, MultipleSeqAlignment):
            self._aln = in_aln
        elif type(in_aln) in string_types and isfile(in_aln):
            for fmt in ['fasta', 'phylip-relaxed', 'nexus']:
                try:
                    self._aln=AlignIO.read(in_aln, fmt)
                    break
                except:
                    continue
        elif type(in_aln) in [defaultdict, dict]:  #if is read in from VCF file
            self._aln = in_aln
            self.is_vcf = True

        if self._aln is None:
            self.logger("TreeAnc: loading alignment failed... ",1, warn=True)
            return ttconf.ERROR

        #Convert to uppercase here, rather than in _attach_sequences_to_nodes
        #(which used to do it through seq2array in seq_utils.py)
        #so that it is controlled by param convert_upper. This way for
        #mugration (ancestral reconstruction of non-sequences), you can
        #use upper- and lower case characters for discrete states!
        if (not self.is_vcf) and self.convert_upper:
            self._aln = MultipleSeqAlignment([seq.upper() for seq in self._aln])

        if self.seq_len:
            if self.is_vcf and self.seq_len!=len(self.ref):
                self.logger("TreeAnc.aln: specified sequence length doesn't match reference length, ignoring sequence length.", 1, warn=True)
                self._seq_len = len(self.ref)
            else:
                self.logger("TreeAnc.aln: specified sequence length doesn't match alignment length. Treating difference as constant sites.", 2, warn=True)
                self.additional_constant_sites = max(0, self.seq_len - self.aln.get_alignment_length())
        else:
            if self.is_vcf:
                self.seq_len = len(self.ref)
            else:
                self.seq_len = self.aln.get_alignment_length()

        # check whether the alignment is consistent with a nucleotide alignment.
        likely_alphabet = self._guess_alphabet()
        from .seq_utils import alphabets
        # if likely alignment is not nucleotide but the gtr alignment is, WARN
        if likely_alphabet=='aa' and self.gtr.n_states==len(alphabets['nuc']) and np.all(self.gtr.alphabet==alphabets['nuc']):
            self.logger('WARNING: small fraction of ACGT-N in alignment. Really a nucleotide alignment? if not, rerun with --aa', 1, warn=True)
        # conversely, warn if alignment is consistent with nucleotide but gtr has a long alphabet
        if likely_alphabet=='nuc' and self.gtr.n_states>10:
            self.logger('WARNING: almost exclusively ACGT-N in alignment. Really a protein alignment?', 1, warn=True)

        if hasattr(self, '_tree') and (self.tree is not None):
            self._attach_sequences_to_nodes()
        else:
            self.logger("TreeAnc.aln: sequences not yet attached to tree", 3, warn=True)
def aln ( self , in_aln ) : # load alignment from file if necessary from os . path import isfile from Bio . Align import MultipleSeqAlignment self . _aln = None if in_aln is None : return elif isinstance ( in_aln , MultipleSeqAlignment ) : self . _aln = in_aln elif type ( in_aln ) in string_types and isfile ( in_aln ) : for fmt in [ 'fasta' , 'phylip-relaxed' , 'nexus' ] : try : self . _aln = AlignIO . read ( in_aln , fmt ) break except : continue elif type ( in_aln ) in [ defaultdict , dict ] : #if is read in from VCF file self . _aln = in_aln self . is_vcf = True if self . _aln is None : self . logger ( "TreeAnc: loading alignment failed... " , 1 , warn = True ) return ttconf . ERROR #Convert to uppercase here, rather than in _attach_sequences_to_nodes #(which used to do it through seq2array in seq_utils.py) #so that it is controlled by param convert_upper. This way for #mugration (ancestral reconstruction of non-sequences), you can #use upper- and lower case characters for discrete states! if ( not self . is_vcf ) and self . convert_upper : self . _aln = MultipleSeqAlignment ( [ seq . upper ( ) for seq in self . _aln ] ) if self . seq_len : if self . is_vcf and self . seq_len != len ( self . ref ) : self . logger ( "TreeAnc.aln: specified sequence length doesn't match reference length, ignoring sequence length." , 1 , warn = True ) self . _seq_len = len ( self . ref ) else : self . logger ( "TreeAnc.aln: specified sequence length doesn't match alignment length. Treating difference as constant sites." , 2 , warn = True ) self . additional_constant_sites = max ( 0 , self . seq_len - self . aln . get_alignment_length ( ) ) else : if self . is_vcf : self . seq_len = len ( self . ref ) else : self . seq_len = self . aln . get_alignment_length ( ) # check whether the alignment is consistent with a nucleotide alignment. likely_alphabet = self . _guess_alphabet ( ) from . seq_utils import alphabets # if likely alignment is not nucleotide but the gtr alignment is, WARN if likely_alphabet == 'aa' and self . gtr . n_states == len ( alphabets [ 'nuc' ] ) and np . all ( self . gtr . alphabet == alphabets [ 'nuc' ] ) : self . logger ( 'WARNING: small fraction of ACGT-N in alignment. Really a nucleotide alignment? if not, rerun with --aa' , 1 , warn = True ) # conversely, warn if alignment is consistent with nucleotide but gtr has a long alphabet if likely_alphabet == 'nuc' and self . gtr . n_states > 10 : self . logger ( 'WARNING: almost exclusively ACGT-N in alignment. Really a protein alignment?' , 1 , warn = True ) if hasattr ( self , '_tree' ) and ( self . tree is not None ) : self . _attach_sequences_to_nodes ( ) else : self . logger ( "TreeAnc.aln: sequences not yet attached to tree" , 3 , warn = True )
Reads in the alignment (from a dict, MultipleSeqAlignment, or file,
        as necessary), sets tree-related parameters, and attaches sequences
        to the tree nodes.

        Parameters
        ----------
        in_aln : MultipleSeqAlignment, str, dict/defaultdict
            The alignment to be read in
Reads in the alignment ( from a dict MultipleSeqAlignment or file as necessary ) sets tree - related parameters and attaches sequences to the tree nodes .