code: def subalignment(alnfle, subtype, alntype="fasta"):
      
      aln = AlignIO.read(alnfle, alntype)
      alnlen = aln.get_alignment_length()
      nseq = len(aln)
      subaln = None
      subalnfile = alnfle.rsplit(".", 1)[0] + "_{0}.{1}".format(subtype, alntype)
  
      if subtype == "synonymous":
          for j in range( 0, alnlen, 3 ):
              aa = None
              for i in range(nseq):
                  codon = str(aln[i, j: j + 3].seq)
                  if codon not in CODON_TRANSLATION:
                      break
                  if aa and CODON_TRANSLATION[codon] != aa:
                      break
                  else:
                      aa = CODON_TRANSLATION[codon]
              else:
                  if subaln is None:
                      subaln = aln[:, j: j + 3]
                  else:
                      subaln += aln[:, j: j + 3]
  
      if subtype == "fourfold":
          for j in range( 0, alnlen, 3 ):
              for i in range(nseq):
                  codon = str(aln[i, j: j + 3].seq)
                  if codon not in FOURFOLD:
                      break
              else:
                  if subaln is None:
                      subaln = aln[:, j: j + 3]
                  else:
                      subaln += aln[:, j: j + 3]
  
      if subaln:
          AlignIO.write(subaln, subalnfile, alntype)
          return subalnfile
      else:
          print("No sites {0} selected.".format(subtype), file=sys.stderr)
          return None
docs: Subset synonymous or fourfold degenerate sites from an alignment
  
      input should be a codon alignment