##################################
#                                #
# Last modified 2023/01/04       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
import numpy
from sets import Set

def run():

    if len(sys.argv) < 1:
        print 'usage: python %s outfile' % sys.argv[0]
        print '\tNote: standard input from PEFastqToTabDelimited.py is assumed'
        sys.exit(1)

    NaNDict = {}

    RC = 0
    maxRL = 0

    lineslist = sys.stdin
    for line in lineslist:
        RC += 1
        if RC % 1000000 == 0:
            print str(RC/1000000) + 'M read pairs processed'
        fields = line.strip().split('\t')
        BC = fields[0].split(':::')[1].split(' ')[0]
        read1 = fields[1].upper()
        read2 = fields[3].upper()
        NaNs = BC.count('nan')
        if NaNDict.has_key(NaNs):
            pass
        else:
            NaNDict[NaNs] = {}
            NaNDict[NaNs]['counts'] = 0
            NaNDict[NaNs]['read1'] = {}
            NaNDict[NaNs]['read2'] = {}
        NaNDict[NaNs]['counts'] += 1
        for i in range(len(read1)):
            if i > maxRL:
                maxRL = i
            if NaNDict[NaNs]['read1'].has_key(i):
                pass
            else:
                NaNDict[NaNs]['read1'][i] = {}
                NaNDict[NaNs]['read1'][i]['A'] = 0
                NaNDict[NaNs]['read1'][i]['C'] = 0
                NaNDict[NaNs]['read1'][i]['G'] = 0
                NaNDict[NaNs]['read1'][i]['T'] = 0
                NaNDict[NaNs]['read1'][i]['N'] = 0
            B = read1[i]
            NaNDict[NaNs]['read1'][i][B] += 1
        for i in range(len(read2)):
            if i > maxRL:
                maxRL = i
            if NaNDict[NaNs]['read2'].has_key(i):
                pass
            else:
                NaNDict[NaNs]['read2'][i] = {}
                NaNDict[NaNs]['read2'][i]['A'] = 0
                NaNDict[NaNs]['read2'][i]['C'] = 0
                NaNDict[NaNs]['read2'][i]['G'] = 0
                NaNDict[NaNs]['read2'][i]['T'] = 0
                NaNDict[NaNs]['read2'][i]['N'] = 0
            B = read2[i]
            NaNDict[NaNs]['read2'][i][B] += 1

    outfilename = sys.argv[1]

    outfile = open(outfilename, 'w')

    outline = '#NaNs\tTotal_Count\tFraction\tRead1/2\tBase'
    for i in range(maxRL):
        outline = outline + '\t' + str(i)
    outfile.write(outline + '\n')

    NaNCounts = NaNDict.keys()
    NaNCounts.sort()

    for NaNs in NaNCounts:
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR1\tA'
        for i in range(maxRL):
            if NaNDict[NaNs]['read1'].has_key(i):
                total = NaNDict[NaNs]['read1'][i]['A']  + NaNDict[NaNs]['read1'][i]['C']  + NaNDict[NaNs]['read1'][i]['G'] + NaNDict[NaNs]['read1'][i]['T']  + NaNDict[NaNs]['read1'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read1'][i]['A']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR1\tC'
        for i in range(maxRL):
            if NaNDict[NaNs]['read1'].has_key(i):
                total = NaNDict[NaNs]['read1'][i]['A']  + NaNDict[NaNs]['read1'][i]['C']  + NaNDict[NaNs]['read1'][i]['G'] + NaNDict[NaNs]['read1'][i]['T']  + NaNDict[NaNs]['read1'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read1'][i]['C']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR1\tG'
        for i in range(maxRL):
            if NaNDict[NaNs]['read1'].has_key(i):
                total = NaNDict[NaNs]['read1'][i]['A']  + NaNDict[NaNs]['read1'][i]['C']  + NaNDict[NaNs]['read1'][i]['G'] + NaNDict[NaNs]['read1'][i]['T']  + NaNDict[NaNs]['read1'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read1'][i]['G']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR1\tT'
        for i in range(maxRL):
            if NaNDict[NaNs]['read1'].has_key(i):
                total = NaNDict[NaNs]['read1'][i]['A']  + NaNDict[NaNs]['read1'][i]['C']  + NaNDict[NaNs]['read1'][i]['G'] + NaNDict[NaNs]['read1'][i]['T']  + NaNDict[NaNs]['read1'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read1'][i]['T']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR1\tN'
        for i in range(maxRL):
            if NaNDict[NaNs]['read1'].has_key(i):
                total = NaNDict[NaNs]['read1'][i]['A']  + NaNDict[NaNs]['read1'][i]['C']  + NaNDict[NaNs]['read1'][i]['G'] + NaNDict[NaNs]['read1'][i]['T']  + NaNDict[NaNs]['read1'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read1'][i]['N']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR2\tA'
        for i in range(maxRL):
            if NaNDict[NaNs]['read2'].has_key(i):
                total = NaNDict[NaNs]['read2'][i]['A']  + NaNDict[NaNs]['read2'][i]['C']  + NaNDict[NaNs]['read2'][i]['G'] + NaNDict[NaNs]['read2'][i]['T']  + NaNDict[NaNs]['read2'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read2'][i]['A']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR2\tC'
        for i in range(maxRL):
            if NaNDict[NaNs]['read2'].has_key(i):
                total = NaNDict[NaNs]['read2'][i]['A']  + NaNDict[NaNs]['read2'][i]['C']  + NaNDict[NaNs]['read2'][i]['G'] + NaNDict[NaNs]['read2'][i]['T']  + NaNDict[NaNs]['read2'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read2'][i]['C']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR2\tG'
        for i in range(maxRL):
            if NaNDict[NaNs]['read2'].has_key(i):
                total = NaNDict[NaNs]['read2'][i]['A']  + NaNDict[NaNs]['read2'][i]['C']  + NaNDict[NaNs]['read2'][i]['G'] + NaNDict[NaNs]['read2'][i]['T']  + NaNDict[NaNs]['read2'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read2'][i]['G']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR2\tT'
        for i in range(maxRL):
            if NaNDict[NaNs]['read2'].has_key(i):
                total = NaNDict[NaNs]['read2'][i]['A']  + NaNDict[NaNs]['read2'][i]['C']  + NaNDict[NaNs]['read2'][i]['G'] + NaNDict[NaNs]['read2'][i]['T']  + NaNDict[NaNs]['read2'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read2'][i]['T']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')
        outline = str(NaNs) + '\t' + str(NaNDict[NaNs]['counts']) + '\t' + str(NaNDict[NaNs]['counts']/(RC + 0.0)) + '\tR2\tN'
        for i in range(maxRL):
            if NaNDict[NaNs]['read2'].has_key(i):
                total = NaNDict[NaNs]['read2'][i]['A']  + NaNDict[NaNs]['read2'][i]['C']  + NaNDict[NaNs]['read2'][i]['G'] + NaNDict[NaNs]['read2'][i]['T']  + NaNDict[NaNs]['read2'][i]['N'] + 0.0
                outline = outline + '\t' + str(NaNDict[NaNs]['read2'][i]['N']/total)
            else:
                outline = outline + '\t'
        outfile.write(outline + '\n')

    outfile.close()

run()