view SAINT_preprocessing_v6_mq_pep.py @ 24:3894870fb1e0 draft

Uploaded
author bornea
date Tue, 24 Nov 2015 12:08:23 -0500
parents 729aac64ce43
children
line wrap: on
line source

#######################################################################################
# Python-code: SAINT pre-processing from maxquant "Samples Report" output
# Author: Brent Kuenzi
#######################################################################################
# This program reads in a raw maxquant "Samples Report" output and a user generated
# bait file and autoformats it into prey and interaction files for SAINTexpress 
# analysis
#######################################################################################
import sys
import urllib2
import os
#######################################################################################
## REQUIRED INPUT ##

# 1) infile: maxquant "Samples Report" output
# 2) baitfile: SAINT formatted bait file generated in Galaxy
# 3) prey: Y or N for generating a prey file (requires internet connection)
#######################################################################################
mq_file = sys.argv[1]
ins_path = sys.argv[8]
names_path = str(ins_path) + r"uniprot_names.txt"
cmd = r"Rscript "+ str(ins_path) +"pre_process_protein_name_set.R " + str(mq_file) + " " + str(names_path)
os.system(cmd)

infile = "./tukeys_output.txt" #maxquant "Samples Report" output
prey = sys.argv[2] # Y or N
fasta_db = sys.argv[3]
if fasta_db == "None":
    fasta_db = str(ins_path)  + "SwissProt_HUMAN_2014_08.fasta"
make_bait= sys.argv[6]

def bait_create(baits, infile):
    #Takes the Bait specified by the user and makes them into a Bait file and includes a check to make sure they are using valid baits.
    baits = make_bait.split()
    i = 0
    bait_file_tmp = open("bait.txt", "wr")
    order = [] 
    bait_cache = []
    while i < len(baits):
        if baits[i+2] == "true":
            T_C = "C"
        else:
            T_C = "T"
        line1 = baits[i] + "\t" + baits[i+1] + "\t" + T_C + "\n"
        q = open(infile,"r")
        for line2 in q:
           line2 = line2.replace("\"", "")
           line2 = line2.replace(r"Intensity.", "") #R coerces "-" into "." this changes them back and remove Intensity from the Bait names.
           line2 = line2.replace(r".", r"-")
           temp = line2.split()
           if "mapped_protein" in str(temp):
                #If the bait is in the original file then write to cache it if not exit.
                if baits[i] in temp:
                    number_bait = temp.index(str(baits[i]))
                    number_bait = number_bait - 9
                    bait_cache.append((number_bait, str(line1)))
                else:
                    print "Error: bad bait " + str(baits[i])
                    sys.exit()
           else: 
                pass                    
        i = i + 3
    #Writes cache to file.
    bait_cache.sort()
    for line in bait_cache:
        bait_file_tmp.write(line[1])            
        
    bait_file_tmp.close()  


baitfile = "bait.txt"

class ReturnValue1(object):
    def __init__(self, sequence, gene):
     self.seqlength = sequence
     self.genename = gene
class ReturnValue2(object):
    def __init__(self, getdata, getproteins, getheader):
        self.data = getdata
        self.proteins = getproteins
        self.header = getheader

def main(maxquant_input, make_bait):  
    bait_create(make_bait, infile)
    baitfile = "bait.txt"
    #bait_check(baitfile, maxquant_input)
    make_inter(maxquant_input)
    if prey == 'true':
        make_prey(maxquant_input)
        no_error_inter(maxquant_input)
        os.rename('prey.txt', sys.argv[5])
    elif prey == 'false':
        if os.path.isfile('error proteins.txt') == True:
            no_error_inter(maxquant_input)
        pass
    elif prey != 'true' or 'false':
        sys.exit("Invalid Prey Argument: Y or N")
    os.rename('inter.txt', sys.argv[4])
    os.rename("bait.txt", sys.argv[7])


def get_info(uniprot_accession_in): # get aa lengths and gene name
    error = open('error proteins.txt', 'a+')
#    while True:
#        i = 0
#	try:  
#            data = urllib2.urlopen("http://www.uniprot.org/uniprot/" + uniprot_accession_in + ".fasta")
#            break
#        except urllib2.HTTPError, err:
#            i = i + 1
#            if i == 50:
#                sys.exit("More than 50 errors. Check your file or try again later.")
#            if err.code == 404:
#                error.write(uniprot_accession_in + '\t' + "Invalid URL. Check protein" + '\n')
#                seqlength = 'NA'
#                genename = 'NA'
#                return ReturnValue1(seqlength, genename)
#            elif err.code == 302:
#                sys.exit("Request timed out. Check connection and try again.")
#            else:
#                sys.exit("Uniprot had some other error")
#
#
#    if lines == []:
#        error.write(uniprot_accession_in + '\t' + "Blank Fasta" + '\n')
#        error.close
# if lines == []:
#        error.write(uniprot_accession_in + '\t' + "Blank Fasta" + '\n')
#        error.close
#        seqlength = 'NA'
#        genename = 'NA'
#        return ReturnValue1(seqlength, genename)
#    if lines != []:
#        seqlength = 0
#        header = lines[0]
#        for line in lines[1:]:
#            line = line.replace("\n","") # strip \n or else it gets counted in the length
#            seqlength += len(line) 
#        if 'GN=' in header:
#            lst = header.split('GN=')
#            lst2 = lst[1].split(' ')
#            genename = lst2[0]
#            error.close
#            return ReturnValue1(seqlength, genename)
#        if 'GN=' not in header:
#            genename = 'NA'
#            error.close
#            return ReturnValue1(seqlength, genename)

    data = open(fasta_db,'r')
    lines = data.readlines()
    db_len = len(lines)
    seqlength = 0
    count = 0
    for i in lines:           
        if ">sp" in i:
            if uniprot_accession_in == i.split("|")[1]:
                match = count+1
                if 'GN=' in i:
                    lst = i.split('GN=')
                    lst2 = lst[1].split(' ')
                    genename = lst2[0]
                if 'GN=' not in i:
                    genename = 'NA'
                while ">sp" not in lines[match]:
                    if match <= db_len:
                        seqlength = seqlength + len(lines[match].strip())
                        match = match + 1
                    else:
                        break
                return ReturnValue1(seqlength, genename)
        count = count + 1
        

    if seqlength == 0:
        error.write(uniprot_accession_in + '\t' + "Uniprot not in Fasta" + '\n')
        error.close
        seqlength = 'NA'
        genename = 'NA'
        return ReturnValue1(seqlength, genename)


def readtab(infile):
    with open(infile,'r') as x: # read in tab-delim text
        output = []
        for line in x:
            line = line.strip()
            temp = line.split('\t')
            output.append(temp)
    return output
def read_maxquant(maxquant_input): # Get data, proteins and header from maxquant output
    dupes = readtab(maxquant_input)
    header_start = 0 
    header = dupes[header_start]
    for i in header:
        i = i.replace(r"\"", "")
        i = i.replace(r"Intensity.", r"")
        i = i.replace(r".", r"-")
    data = dupes[header_start+1:len(dupes)] #cut off blank line and END OF FILE
    proteins = []
    for protein in data:
        proteins.append(protein[0])
    return ReturnValue2(data, proteins, header)
def make_inter(maxquant_input):
    bait = readtab(baitfile)
    data = read_maxquant(maxquant_input).data
    header = read_maxquant(maxquant_input).header
    proteins = read_maxquant(maxquant_input).proteins
    bait_index = []
    for i in bait:
        bait_index.append(header.index("mapped_protein") + 1) # Find just the baits defined in bait file
    with open('inter.txt', 'w') as y:
            a = 0; l=0
            for bb in bait:
                for lst in data:
                    y.write(header[bait_index[l]] + '\t' + bb[1] + '\t' + proteins[a] + '\t' + lst[bait_index[l]] + '\n')
                    a+=1
                    if a == len(proteins):
                        a = 0; l+=1
def make_prey(maxquant_input):
    proteins = read_maxquant(maxquant_input).proteins
    output_file = open("prey.txt",'w')
    for a in proteins:
        a = a.replace("\n","") # remove \n for input into function
        a = a.replace("\r","") # ditto for \r
        seq = get_info(a).seqlength
        GN = get_info(a).genename
        if seq != 'NA':
            output_file.write(a+"\t"+str(seq)+ "\t" + str(GN) + "\n")
    output_file.close()
def no_error_inter(maxquant_input): # remake inter file without protein errors from Uniprot
    err = readtab("error proteins.txt")
    bait = readtab(baitfile)
    data = read_maxquant(maxquant_input).data
    header = read_maxquant(maxquant_input).header
    header = [i.replace(r"\"", "") for i in header]
    header = [i.replace(r"Intensity.", r"") for i in header]
    header = [i.replace(r".", r"-") for i in header]
    print header
    bait_index = []
    for i in bait:
        bait_index.append(header.index(i[0]))
    proteins = read_maxquant(maxquant_input).proteins
    errors = []
    for e in err:
        errors.append(e[0])
    with open('inter.txt', 'w') as y:
        l = 0; a = 0
        for bb in bait:
            for lst in data:
                if proteins[a] not in errors:
                    y.write(header[bait_index[l]] + '\t' + bb[1] + '\t' + proteins[a] + '\t' + lst[bait_index[l]] + '\n')
                a+=1
                if a == len(proteins):
                    l += 1; a = 0
def bait_check(bait, maxquant_input): # check that bait names share header titles
    bait_in = readtab(bait)
    header = read_maxquant(maxquant_input).header
    for i in bait_in:
        if i[0] not in header:
            sys.exit("Bait must share header titles with maxquant output")

if __name__ == '__main__':
    main(infile, make_bait)