docs: def build_tree_from_alignment(aln, moltype=DNA, best_tree=False, params={}):
      """Returns a tree from Alignment object aln.
  
      aln: an xxx.Alignment object, or data that can be used to build one.
  
      moltype: cogent.core.moltype.MolType object
  
      best_tree: best_tree suppport is currently not implemented
  
      params: dict of parameters to pass in to the RAxML app controller.
  
      The result will be an xxx.Alignment object, or None if tree fails.
      """
      if best_tree:
          raise NotImplementedError
  
      if '-m' not in params:
          if moltype == DNA or moltype == RNA:
              #params["-m"] = 'GTRMIX'
              # in version 7.2.3, GTRMIX is no longer supported but says GTRCAT
              # behaves like GTRMIX (http://www.phylo.org/tools/raxmlhpc2.html)
              params["-m"] = 'GTRGAMMA'
          elif moltype == PROTEIN:
              params["-m"] = 'PROTGAMMAmatrixName'
          else:
              raise ValueError, "Moltype must be either DNA, RNA, or PROTEIN"
  
      if not hasattr(aln, 'toPhylip'):
          aln = Alignment(aln)
      seqs, align_map = aln.toPhylip()
  
      # generate temp filename for output
      params["-w"] = "/tmp/"
      params["-n"] = get_tmp_filename().split("/")[-1]
      params["-k"] = True
      params["-p"] = randint(1,100000)
      params["-x"] = randint(1,100000)
  
      ih = '_input_as_multiline_string'
  
      raxml_app = Raxml(params=params,
                        InputHandler=ih,
                        WorkingDir=None,
                        SuppressStderr=True,
                        SuppressStdout=True)
  
      raxml_result = raxml_app(seqs)
  
      tree = DndParser(raxml_result['Bootstrap'], constructor=PhyloNode)
  
      for node in tree.tips():
          node.Name = align_map[node.Name]
  
      raxml_result.cleanUp()
  
      return tree