All pastes #85781 Raw Edit

Stuff

public text v1 · immutable
·published 2006-07-12 04:35 UTC
rendered paste body
#!/usr/bin/env python
#################################################
'''
    check_rmsd.py   -   test whether a ligand has replicated a pose 50% of the time
'''
#################################################
 
import sys
import os
import shutil
#################################################

def get_rmsds(fname, thresh=2.0):
    '''fish out the rmsds from a log file - return the last line where
    distance < threshold (2.0)'''
    f = open(fname)
    start = False
    ret = []
    dist = 0.0
    best = ''
    for l in f:
        flds = l.split()
        if len(flds) < 2:
            continue
        if flds[0] == 'Distance' and flds[2] == 'Clusters':
            start = True
        elif flds[0] == 'Finished':
            start = False
        elif start:
            # find the line with largest distance less then 2.0
            d = float(flds[0])
            if d < thresh:
                best = l
            else:
                f.close()
                return best
    return best # if no line is worse than threshold
 
def process_best(best):
    '''return true if largest cluster is more than 50% of n_docks'''
    flds = best.split('|')[1:-1]
    clusters = [f.split() for f in flds]
    lens = map(len, clusters)
    def flat(x, y):
        x.extend(y)
        return x
    try:
        n = max([int(i) for i in reduce(flat, clusters, [])])
    except ValueError:
        pass
    try:
        return max(lens) >= n/2.0
    except ValueError:
        pass
 
def process_rmsds(l, subdir, thresh=2.0, need=.5):
    '''Check for a threshold and return True or False if desired proportion is hit'''
    oldcwd = os.getcwd()
    try:
        tf = process_best(l)
    except ValueError:
        tf = False
    # The following 4 lines will remove the subdirectory if the test is False
       
 
    if not tf:
        shutil.rmtree(subdir)
        os.chdir(os.pardir)
        os.chdir('Output')
        int_line = 0
        list_files = [i for i in open('bestranking.lst', 'r+')]
        for file in list_files:
            file[1:len(subdir)]
            if file.find(subdir) >= 0:
                del(list_files[int_line])

            int_line += 1


        #Write the new file
        replacement = open('bestranking.lst', 'w')
        replacement.write(''.join(list_files))
        replacement.close()
           
    os.chdir(oldcwd)
    return tf
    
#################################################
 
def main(parent_dir):
    print parent_dir
    os.chdir(parent_dir)
    sub_dirs = os.listdir(parent_dir)
    
    for fname in sub_dirs:
        log_file = parent_dir + '/' + fname + '/' + 'gold_' + fname + '.log' 
        print process_rmsds(get_rmsds(log_file), fname), log_file
 
def  usage():
    print 'Usage: %s results_parent_directory' % sys.argv[0]
    print '''prints True or False value and the name of the log file which
produced it.  The value is whether more than 50% of solutions had an rmsd of
less than 2.0.  If the test fails, the directory containing the log file is deleted'''
 
if __name__ == "__main__":
    if len(sys.argv) < 2 or '-h' in sys.argv:
        usage()
    else:
        main(sys.argv[1])