-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInClusterSimilarity.py
More file actions
63 lines (53 loc) · 2.34 KB
/
Copy pathInClusterSimilarity.py
File metadata and controls
63 lines (53 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import pandas as pd
from rdkit import DataStructs
from rdkit.Chem import AllChem
import numpy as np
# Load the data from CSV
input_csv = 'filtered_compounds_spectral_clustering_with_scaffolds.csv' # Replace with your actual file path
data = pd.read_csv(input_csv)
# Define the prefix for ECFP4 columns
ecfp_prefix = 'ECFP4_'
# Extract ECFP4 columns
ecfp_cols = [col for col in data.columns if col.startswith(ecfp_prefix)]
if not ecfp_cols:
raise ValueError("No ECFP4 columns found with the specified prefix.")
# Convert ECFP4 bits to RDKit Morgan Fingerprint format
def create_morgan_fingerprints(df, cols):
fingerprints = []
for _, row in df.iterrows():
bits = row[cols].values
# Create a list of bits for the fingerprint
bit_vector = [i for i, bit in enumerate(bits) if bit]
# Create an RDKit molecule
mol = AllChem.MolFromSmiles(row['Smiles'])
if mol is None:
raise ValueError(f"Invalid SMILES string: {row['Smiles']}")
# Generate Morgan fingerprint
morgan_fingerprint = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=len(bits))
fingerprints.append(morgan_fingerprint)
return fingerprints
# Prepare results container
similarity_results = []
# Process each cluster
for cluster_id in data['Spectral_Cluster'].unique():
cluster_data = data[data['Spectral_Cluster'] == cluster_id]
fingerprints = create_morgan_fingerprints(cluster_data, ecfp_cols)
# Calculate pairwise similarities within the cluster
num_compounds = len(fingerprints)
for i in range(num_compounds):
for j in range(i + 1, num_compounds): # Avoid redundant calculations
similarity = DataStructs.FingerprintSimilarity(fingerprints[i], fingerprints[j])
similarity_results.append({
'Spectral_Cluster': cluster_id,
'Compound1_ChEMBLID': cluster_data.iloc[i]['ChEMBLID'],
'Compound2_ChEMBLID': cluster_data.iloc[j]['ChEMBLID'],
'Similarity': similarity
})
# Convert results to DataFrame
similarity_df = pd.DataFrame(similarity_results)
# Save to CSV
similarity_csv = 'Spectralcluster_compound_similarity.csv'
similarity_df.to_csv(similarity_csv, index=False)
print(f"Similarity results saved to {similarity_csv}")
# Optional: Print a sample of the results
print(similarity_df.head())