chemprep.cli
1import argparse 2import pandas as pd 3from .fingerprints import generate_fingerprint, get_available_fingerprints 4from .similarity import calculate_similarity, get_available_similarity_metrics 5from .descriptors import get_all_descriptors 6 7def main(): 8 parser = argparse.ArgumentParser(description="A command-line tool for molecular fingerprinting, similarity calculations, and descriptor generation.") 9 subparsers = parser.add_subparsers(dest="command") 10 11 # Fingerprint command 12 parser_fp = subparsers.add_parser("fingerprint", help="Generate molecular fingerprints.") 13 parser_fp.add_argument("smiles", nargs="?", help="SMILES string of the molecule.") 14 parser_fp.add_argument("-i", "--input", help="Path to a file with SMILES (one per line, or a CSV with a 'SMILES' column).") 15 parser_fp.add_argument("-t", "--type", default="Morgan", choices=get_available_fingerprints(), help="The type of fingerprint to generate.") 16 parser_fp.add_argument("-o", "--output", help="Path to the output file (CSV).") 17 18 # Similarity command 19 parser_sim = subparsers.add_parser("similarity", help="Calculate molecular similarity.") 20 parser_sim.add_argument("smiles1", help="SMILES string of the first molecule.") 21 parser_sim.add_argument("smiles2", help="SMILES string of the second molecule.") 22 parser_sim.add_argument("-t", "--type", default="Morgan", choices=get_available_fingerprints(), help="The type of fingerprint to use.") 23 parser_sim.add_argument("-m", "--metric", default="Tanimoto", choices=get_available_similarity_metrics(), help="The similarity metric to use.") 24 25 # Descriptor command 26 parser_desc = subparsers.add_parser("descriptors", help="Generate molecular descriptors.") 27 parser_desc.add_argument("smiles", nargs="?", help="SMILES string of the molecule.") 28 parser_desc.add_argument("-i", "--input", help="Path to a file with SMILES (one per line, or a CSV with a 'SMILES' column).") 29 parser_desc.add_argument("-o", "--output", help="Path to the output file (CSV).") 30 31 args = parser.parse_args() 32 33 if args.command == "fingerprint": 34 if args.smiles: 35 smiles_list = [args.smiles] 36 elif args.input: 37 if args.input.endswith(".csv"): 38 df = pd.read_csv(args.input) 39 smiles_list = df["SMILES"].tolist() 40 else: 41 with open(args.input) as f: 42 smiles_list = [line.strip() for line in f] 43 else: 44 parser_fp.error("Either a SMILES string or an input file must be provided.") 45 46 fingerprints = [generate_fingerprint(s, args.type) for s in smiles_list] 47 df_out = pd.DataFrame({"SMILES": smiles_list, "Fingerprint": fingerprints}) 48 49 if args.output: 50 df_out.to_csv(args.output, index=False) 51 else: 52 print(df_out) 53 54 elif args.command == "similarity": 55 similarity = calculate_similarity(args.smiles1, args.smiles2, args.type, args.metric) 56 print(f"The {args.metric} similarity between {args.smiles1} and {args.smiles2} is: {similarity}") 57 58 elif args.command == "descriptors": 59 if args.smiles: 60 smiles_list = [args.smiles] 61 elif args.input: 62 if args.input.endswith(".csv"): 63 df = pd.read_csv(args.input) 64 smiles_list = df["SMILES"].tolist() 65 else: 66 with open(args.input) as f: 67 smiles_list = [line.strip() for line in f] 68 else: 69 parser_desc.error("Either a SMILES string or an input file must be provided.") 70 71 all_descriptors = [get_all_descriptors(s) for s in smiles_list] 72 df_out = pd.DataFrame(all_descriptors) 73 df_out.insert(0, "SMILES", smiles_list) 74 75 76 if args.output: 77 df_out.to_csv(args.output, index=False) 78 else: 79 print(df_out) 80 81if __name__ == "__main__": 82 main()
def
main():
8def main(): 9 parser = argparse.ArgumentParser(description="A command-line tool for molecular fingerprinting, similarity calculations, and descriptor generation.") 10 subparsers = parser.add_subparsers(dest="command") 11 12 # Fingerprint command 13 parser_fp = subparsers.add_parser("fingerprint", help="Generate molecular fingerprints.") 14 parser_fp.add_argument("smiles", nargs="?", help="SMILES string of the molecule.") 15 parser_fp.add_argument("-i", "--input", help="Path to a file with SMILES (one per line, or a CSV with a 'SMILES' column).") 16 parser_fp.add_argument("-t", "--type", default="Morgan", choices=get_available_fingerprints(), help="The type of fingerprint to generate.") 17 parser_fp.add_argument("-o", "--output", help="Path to the output file (CSV).") 18 19 # Similarity command 20 parser_sim = subparsers.add_parser("similarity", help="Calculate molecular similarity.") 21 parser_sim.add_argument("smiles1", help="SMILES string of the first molecule.") 22 parser_sim.add_argument("smiles2", help="SMILES string of the second molecule.") 23 parser_sim.add_argument("-t", "--type", default="Morgan", choices=get_available_fingerprints(), help="The type of fingerprint to use.") 24 parser_sim.add_argument("-m", "--metric", default="Tanimoto", choices=get_available_similarity_metrics(), help="The similarity metric to use.") 25 26 # Descriptor command 27 parser_desc = subparsers.add_parser("descriptors", help="Generate molecular descriptors.") 28 parser_desc.add_argument("smiles", nargs="?", help="SMILES string of the molecule.") 29 parser_desc.add_argument("-i", "--input", help="Path to a file with SMILES (one per line, or a CSV with a 'SMILES' column).") 30 parser_desc.add_argument("-o", "--output", help="Path to the output file (CSV).") 31 32 args = parser.parse_args() 33 34 if args.command == "fingerprint": 35 if args.smiles: 36 smiles_list = [args.smiles] 37 elif args.input: 38 if args.input.endswith(".csv"): 39 df = pd.read_csv(args.input) 40 smiles_list = df["SMILES"].tolist() 41 else: 42 with open(args.input) as f: 43 smiles_list = [line.strip() for line in f] 44 else: 45 parser_fp.error("Either a SMILES string or an input file must be provided.") 46 47 fingerprints = [generate_fingerprint(s, args.type) for s in smiles_list] 48 df_out = pd.DataFrame({"SMILES": smiles_list, "Fingerprint": fingerprints}) 49 50 if args.output: 51 df_out.to_csv(args.output, index=False) 52 else: 53 print(df_out) 54 55 elif args.command == "similarity": 56 similarity = calculate_similarity(args.smiles1, args.smiles2, args.type, args.metric) 57 print(f"The {args.metric} similarity between {args.smiles1} and {args.smiles2} is: {similarity}") 58 59 elif args.command == "descriptors": 60 if args.smiles: 61 smiles_list = [args.smiles] 62 elif args.input: 63 if args.input.endswith(".csv"): 64 df = pd.read_csv(args.input) 65 smiles_list = df["SMILES"].tolist() 66 else: 67 with open(args.input) as f: 68 smiles_list = [line.strip() for line in f] 69 else: 70 parser_desc.error("Either a SMILES string or an input file must be provided.") 71 72 all_descriptors = [get_all_descriptors(s) for s in smiles_list] 73 df_out = pd.DataFrame(all_descriptors) 74 df_out.insert(0, "SMILES", smiles_list) 75 76 77 if args.output: 78 df_out.to_csv(args.output, index=False) 79 else: 80 print(df_out)