MolecularNetwork is a Python package that facilitates the creation of molecular networks based on molecular similarities. It leverages RDKit for molecular operations, and NetworkX for graph operations.
-
Molecular Descriptors: Calculate molecular fingerprints using descriptor types (e.g., Morgan fingerprints, MACCS keys, AtomPairs).
-
Similarity Metrics: Choose from a variety of similarity metrics (e.g., Tanimoto, Cosine, Dice) to quantify molecular similarities.
-
Modularity: The code is organized into modular components, promoting easy extension and customization.
To install the MolecularNetwork package, you can use pip. Ensure you have Python and pip installed on your system.
pip install molecularnetworkHere's a simple example of how to use the MolecularNetwork package:
from molecularnetwork import MolecularNetwork
# Define SMILES strings and classes
smiles_list = ["CCO", "CCN", "CCC", "CCF"]
# By default `0` is the categorical_label unless specified like following
classes = ["alcohol", "amine", "alkane", "fluoride"]
# Create MolecularNetwork instance
network = MolecularNetwork(descriptor="morgan2", sim_metric="tanimoto", sim_threshold=0.25)
# Generate the molecular network graph
graph = network.create_graph(smiles_list, classes) # network.get_graph() also returns graph
# Graph `Node` Attributes
graph.nodes[0]['fp'] # Returns ECFP4 fingerprint for node 0 ["CCO"].
graph.nodes[0]['smiles'] # Returns SMILES for node 0 ["CCO"].
graph.nodes[0]['categorical_label'] # Returns `alcohol`
# Graph `Edge` Attributes
graph[0][1]['similarity'] # Returns the edge weight attribute which is the similarity between node 0 and 1
# Returns 0.3333333333333333
# Save the graph to a file
network.save_graph("test_molecular_network.joblib")
# Read graph from a file
graph = network.read_graph("test_molecular_network.joblib")def draw_graph_with_attributes(G, node_attribute='categorical_label', edge_attribute='similarity'):
"""
Draws a molecular network graph with node colors based on categorical labels and edge widths based on similarity.
Args:
G: NetworkX graph representing the molecular network.
node_attribute: Name of the node attribute containing categorical labels (default: 'categorical_label').
edge_attribute: Name of the edge attribute containing similarity (default: 'similarity').
"""
# Extract unique categorical labels
unique_labels = set(nx.get_node_attributes(G, node_attribute).values())
num_labels = len(unique_labels)
# Define a colormap
colormap = plt.cm.get_cmap('nipy_spectral', num_labels)
# Create a dictionary mapping labels to colors and a list of label names for legend
color_map = {label: colormap(i) for i, label in enumerate(unique_labels)}
label_names = list(color_map.keys())
# Extract node colors based on categorical labels
node_colors = [color_map[G.nodes[n][node_attribute]] for n in G.nodes]
# Extract edge widths based on similarity
edge_widths = [G[u][v][edge_attribute] for u, v in G.edges]
# Draw the graph
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(G, k=0.2) # you can choose different layout algorithms
# Draw nodes
nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=20, label=False)
# Draw edges with widths corresponding to their weights
for (u, v), width in zip(G.edges, edge_widths):
nx.draw_networkx_edges(G, pos, edgelist=[(u, v)], width=width, edge_color='red', label=False)
# Create legend entries with colored circles and labels
legend_handles = [matplotlib.patches.Circle((0, 0), radius=0.4, color=color_map[label]) for label in label_names]
plt.legend(legend_handles, label_names, loc='upper right', title='Class') # Legend in upper right with title
plt.title('Molecular Network')
plt.show()>>> draw_graph_with_attributes(graph)If you find any issues or have suggestions for improvements, feel free to open an issue or submit a pull request. I welcome contributions from the community.
This project is licensed under the MIT License - see the LICENSE file for details.

