import pyfastx
fa=pyfastx.Fasta('thermus_brockianus.fna')
shine_dalg=str(input())
kmers=set(shine_dalg[i:j] for i in range(len(shine_dalg)) for j in range(i+1, len(shine_dalg)+1))

def kmer_freqs(sequence, kmers):
    counts={i:0 for i in kmers}
    len_seq=len(sequence)
    d_sequence=sequence*2
    for start in range(len(sequence)):
        for kmer in kmers:
            counts[kmer]+=(d_sequence[start:start+len(kmer)]==kmer)
    freqs={k:v/len_seq for k,v in counts.items()}
    return freqs

def burge_expected(kmer, dict_freqs):
    k=len(kmer)
    expected_freq=1
    for i in range(1, k):
        inner_prod=1
        power=(-1)**(k-i+1)
        for start in range(k - i + 1):
            subword = kmer[start:start + i]
            inner_prod*=dict_freqs[subword]
        inner_prod=inner_prod**power
        expected_freq*=inner_prod
    return expected_freq

freqs_direct={}
freqs_rc={}
expected_direct={}
expected_rc={}
enrichment_direct={}
enrichment_rc={}
mononuc_rich_direct={}
mononuc_rich_rc={}
hits=0
for chromosome in fa.keys():
    direct_seq=fa[chromosome]
    rc_seq=direct_seq.antisense
    freqs_direct[chromosome]=kmer_freqs(direct_seq.seq, kmers)
    freqs_rc[chromosome] = kmer_freqs(rc_seq, kmers)

    mononuc_rich_direct[chromosome]=1
    mononuc_rich_rc[chromosome] = 1
    for letter in shine_dalg:
        mononuc_rich_direct[chromosome]*=freqs_direct[chromosome][letter]
        mononuc_rich_rc[chromosome] *= freqs_rc[chromosome][letter]
    mononuc_rich_direct[chromosome] = freqs_direct[chromosome][shine_dalg]/mononuc_rich_direct[chromosome]
    mononuc_rich_rc[chromosome]= freqs_rc[chromosome][shine_dalg]/mononuc_rich_rc[chromosome]

    expected_direct[chromosome] = {}
    expected_rc[chromosome] = {}
    expected_direct[chromosome][shine_dalg] = burge_expected(shine_dalg, freqs_direct[chromosome])
    expected_rc[chromosome][shine_dalg] = burge_expected(shine_dalg, freqs_rc[chromosome])

    enrichment_direct = {chrom: {shine_dalg: freqs_direct[chrom][shine_dalg] / expected_direct[chrom][shine_dalg]} for chrom in expected_direct}
    enrichment_rc = {chrom: {shine_dalg: freqs_rc[chrom][shine_dalg] / expected_rc[chrom][shine_dalg]} for chrom in expected_rc}

    print(freqs_direct[chromosome][shine_dalg]*len(direct_seq))
    print(freqs_rc[chromosome][shine_dalg] * len(direct_seq))
    hits=hits+freqs_direct[chromosome][shine_dalg]*len(direct_seq)+freqs_rc[chromosome][shine_dalg] * len(direct_seq)
print(mononuc_rich_direct)
print(mononuc_rich_rc)
print(hits)
print(enrichment_direct)
print(enrichment_rc)
