Mercurial > repos > bgruening > chemfp
view nxn_clustering.py @ 42:0a1c281e9224 draft default tip
"planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/chemicaltoolbox/chemfp commit 7fb96a3844b4771084f18de2346ed6d5e241d839"
author | bgruening |
---|---|
date | Sat, 25 Sep 2021 19:05:59 +0000 |
parents | 28c487eb8399 |
children |
line wrap: on
line source
# !/usr/bin/env python """ Modified version of code examples from the chemfp project. http://code.google.com/p/chem-fingerprints/ Thanks to Andrew Dalke of Andrew Dalke Scientific! """ import argparse import chemfp import matplotlib matplotlib.use("Agg") # noqa from matplotlib import rcParams # noqa rcParams.update({"figure.autolayout": True}) # noqa import numpy # noqa import pylab # noqa import scipy.cluster.hierarchy as hcluster # noqa def distance_matrix(arena, tanimoto_threshold=0.0): n = len(arena) # Start off a similarity matrix with 1.0s along the diagonal try: similarities = numpy.identity(n, "d") except Exception: raise Exception("Input dataset is to large!") chemfp.set_num_threads(args.processors) # Compute the full similarity matrix. # The implementation computes the upper-triangle then copies # the upper-triangle into lower-triangle. It does not include # terms for the diagonal. results = chemfp.search.threshold_tanimoto_search_symmetric( arena, threshold=tanimoto_threshold ) # Copy the results into the NumPy array. for row_index, row in enumerate(results.iter_indices_and_scores()): for target_index, target_score in row: similarities[row_index, target_index] = target_score # Return the distance matrix using the similarity matrix return 1.0 - similarities if __name__ == "__main__": parser = argparse.ArgumentParser( description="""NxN clustering for fps files. For more details please see the chemfp documentation: https://chemfp.readthedocs.org """ ) parser.add_argument( "-i", "--input", dest="input_path", required=True, help="Path to the input file.", ) parser.add_argument( "-c", "--cluster", dest="cluster_image", help="Path to the output cluster image.", ) parser.add_argument( "-s", "--smatrix", dest="similarity_matrix", help="Path to the similarity matrix output file.", ) parser.add_argument( "-t", "--threshold", dest="tanimoto_threshold", type=float, default=0.0, help="Tanimoto threshold [0.0]", ) parser.add_argument("--oformat", default="png", help="Output format (png, svg)") parser.add_argument("-p", "--processors", type=int, default=4) args = parser.parse_args() targets = chemfp.open(args.input_path, format="fps") arena = chemfp.load_fingerprints(targets) distances = distance_matrix(arena, args.tanimoto_threshold) if args.similarity_matrix: numpy.savetxt(args.similarity_matrix, distances) if args.cluster_image: linkage = hcluster.linkage(distances, method="single", metric="euclidean") hcluster.dendrogram(linkage, labels=arena.ids, leaf_rotation=90.0) pylab.savefig(args.cluster_image, format=args.oformat)