Source code for mdance.cli.prime_sim

import argparse
import json
import os
import time

from mdance.prime.sim_calc import FrameSimilarity


[docs]def main(): """Main function to run the command line interface for calculating frame similarities. Returns ------- txt file with dictionary of similarities. References ---------- Chen, L., Mondal, A., Perez, A. & Miranda-Quintana, R.A. `"Protein Retrieval via Integrative Molecular Ensembles (PRIME) through Extended Similarity Indices."`_. *Journal of Chemical Theory and Computation* **2024** 20 (14), 6303-6315 Examples -------- $ prime_sim -m union -n 6 -i SM -t 0.1 -d normed_clusters -s ../nani/outputs/summary_6.csv .. _"Protein Retrieval via Integrative Molecular Ensembles (PRIME) through Extended Similarity Indices.": https://pubs.acs.org/doi/abs/10.1021/acs.jctc.4c00362 """ # Parse command-line arguments parser = argparse.ArgumentParser() parser_dict = { 'method': {'flags': ['-m', '--method'], 'kwargs': {'help': 'Method to use for similarity calculation. (pairwise, union, medoid, outlier)', 'required': True}}, 'n_clusters': {'flags': ['-n', '--n_clusters'], 'kwargs': {'type': int, 'help': 'Number of clusters for analysis', 'required': True}}, 'index': {'flags': ['-i', '--index'], 'kwargs': {'help': 'Similarity Index to use (e.g. RR or SM)', 'required': True}}, 'trim_frac': {'flags': ['-t', '--trim_frac'], 'kwargs': {'type': float, 'help': 'Fraction of outliers to trim. (e.g. 0.1, default: None)', 'default': None}}, 'weighted_by_frames': {'flags': ['-w', '--weighted_by_frames'], 'kwargs': {'help': 'Weighing clusters by frames it contains. (default: True)', 'default': True}}, 'cluster_folder': {'flags': ['-d', '--cluster_folder'], 'kwargs': {'help': 'Location of the cluster files directory', 'default': "new_clusters/"}}, 'summary_file': {'flags': ['-s', '--summary_file'], 'kwargs': {'help': 'Location of CPPTRAJ cluster summary file', 'default': "summary"}} } for key, value in parser_dict.items(): parser.add_argument(*value['flags'], **value['kwargs']) args = parser.parse_args() # Calculate similarities start = time.perf_counter() lib = FrameSimilarity(cluster_folder=args.cluster_folder, summary_file=args.summary_file, n_clusters=args.n_clusters, trim_frac=args.trim_frac, n_ary=args.index, weighted_by_frames=args.weighted_by_frames) method_func = getattr(lib, f'calculate_{args.method}') new_sims = method_func() if args.weighted_by_frames: w = "w" else: w = "nw" dir_name = 'outputs' if not os.path.exists(dir_name): os.makedirs(dir_name) if args.trim_frac: with open(f'{dir_name}/{w}_{args.method}_{args.index}_t{int(float(args.trim_frac) * 100)}.txt', 'w') as file: file.write(json.dumps(new_sims, indent=4)) end = time.perf_counter() print(f"{w}_{args.method}_{args.index}_t{int(float(args.trim_frac) * 100)}: \ Finished in {round(end-start,2)} second") else: with open(f'{dir_name}/{w}_{args.method}_{args.index}.txt', 'w') as file: file.write(json.dumps(new_sims, indent=4)) end = time.perf_counter() print(f"{w}_{args.method}_{args.index}: Finished in {round(end-start,2)} second")
if __name__ == '__main__': main()