def replacement(self, template, e):
     r = dna_type()
     base_to_string = str.__str__
     for t in template:
         tt = type(t)
         if tt is Base:
             r.append(base_to_string(t))
         elif tt is Reference:
             if t.n < len(e):
                 begin, end = e[t.n]
             else:
                 begin, end = 0, 0
             if t.level == 0:
                 r.extend(self.dna[begin:end])
             else:
                 p = protect(self.dna[begin:end], t.level)
                 self.cost += len(p)
                 r.extend(p)
         elif tt is Length:
             if t < len(e):
                 begin, end = e[t]
             else:
                 begin, end = 0, 0
             r.extend(asnat(end - begin))
     return r
    def __init__(self, dna):
        #assert all(c in 'ICFP' for c in dna)
        self.pattern_freqs = defaultdict(int)
        self.template_freqs = defaultdict(int)
        self.codon_len_freqs = defaultdict(int)
        self.freqs = [self.pattern_freqs, self.template_freqs, self.codon_len_freqs]
        self.explicit_rna_items = False

        self.dna = dna_type(dna)
        self.parser = DNA_parser(self.dna, self.freqs)
        self.item_starts = []
        self.rna = []
        self.cost = 0
        self.debug = False
        self.iteration = 0