##################################
#                                #
# Last modified 12/03/2013       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
from sets import Set

def getReverseComplement(preliminarysequence):
    
    DNA = {'A':'T','T':'A','G':'C','C':'G','N':'N','a':'t','t':'a','g':'c','c':'g','n':'n'}
    sequence=''
    for i in range(len(preliminarysequence)):
        sequence=sequence+DNA[preliminarysequence[len(preliminarysequence)-i-1]]
    return sequence

def run():

    if len(sys.argv) < 3:
        print 'usage: python %s input' % sys.argv[0]
        print '\tUse - for stdin and stdout'
        sys.exit(1)

    input = sys.argv[1]

    doStdOut = False
    if sys.argv[2] != '-':
        outfile = open(sys.argv[2],'w')
    else:
        doStdOut = True

    if input == '-':
        input_stream = sys.stdin
    else:
        input_stream = open(input)
    i=0
    pos=1
    for line in input_stream:
        i+=1
        if i % 20000000 == 0:
            if doStdOut:
                pass
            else:
                print str(i/4000000) + 'M reads outputted from end1'
        if pos==1 and line.startswith('@'):
            if doStdOut:
                print line.strip()
            else:
                outfile.write(line)
            pos=2
            continue
        if pos==2:
            sequence = line.strip()
            if doStdOut:
                print getReverseComplement(sequence)
            else:
                outfile.write(getReverseComplement(sequence) + '\n')
            pos=3
            continue
        if pos==3:
            if doStdOut:
                print line.strip()
            else:
                outfile.write(line)
            pos=4
            continue
        if pos==4:
            quality = line.strip()
            if doStdOut:
                print quality[::-1]
            else:
                outfile.write(quality[::-1] +'\n')
            pos=1
            continue

    if doStdOut:
        pass
    else:
        outfile.close()

run()

