Molecular Property Profiling Workflow
Usage
1. MCP Server Definition
Use the same DrugSDAClient class as defined in previous skills.
2. Comprehensive Molecular Property Analysis
This workflow computes a comprehensive set of molecular descriptors across 8 different categories, providing a complete molecular profile for QSAR modeling, drug discovery, and molecular analysis.
Workflow Steps:
- Basic Properties - Molecular formula, weight, atom counts, bond counts
- Hydrophobicity - LogP, molar refractivity, lipophilicity descriptors
- Hydrogen Bonding - H-bond donors/acceptors, TPSA
- Structural Complexity - Ring counts, aromatic rings, rotatable bonds
- Topological Descriptors - Chi indices, Kappa shape indices
- Drug Chemistry - QED score, Lipinski violations
- Charge Properties - Gasteiger charges, formal charge
- Complexity Metrics - Molecular complexity, asphericity
Implementation:
from collections import defaultdict
def merge_lists_by_smiles(*lists):
"""Merge multiple descriptor lists by SMILES key"""
merged = defaultdict(dict)
for lst in lists:
for d in lst:
smiles = d['smiles']
merged[smiles].update(d)
return list(merged.values())
client = DrugSDAClient("https://scp.intern-ai.org.cn/api/v1/mcp/2/DrugSDA-Tool")
if not await client.connect():
print("connection failed")
return
## Input: List of SMILES strings
smiles_list = [
'Nc1nnc(S(=O)(=O)NCCc2ccc(O)cc2)s1',
'COc1ccc2c(=O)cc(C(=O)N3CCN(c4ccc(F)cc4)CC3)oc2c1',
'CCCC1CCC(CC(=O)Cl)(C2CCCCC2)CC1'
]
## Step 1: Calculate basic molecular properties
result = await client.session.call_tool(
"calculate_mol_basic_info",
arguments={"smiles_list": smiles_list}
)
basic_metrics = client.parse_result(result)['metrics']
## Step 2: Calculate hydrophobicity descriptors
result = await client.session.call_tool(
"calculate_mol_hydrophobicity",
arguments={"smiles_list": smiles_list}
)
hydrophobicity_metrics = client.parse_result(result)['metrics']
## Step 3: Calculate hydrogen bonding properties
result = await client.session.call_tool(
"calculate_mol_hbond",
arguments={"smiles_list": smiles_list}
)
hbond_metrics = client.parse_result(result)['metrics']
## Step 4: Calculate structural complexity
result = await client.session.call_tool(
"calculate_mol_structure_complexity",
arguments={"smiles_list": smiles_list}
)
structure_metrics = client.parse_result(result)['metrics']
## Step 5: Calculate topological descriptors
result = await client.session.call_tool(
"calculate_mol_topology",
arguments={"smiles_list": smiles_list}
)
topology_metrics = client.parse_result(result)['metrics']
## Step 6: Calculate drug chemistry properties
result = await client.session.call_tool(
"calculate_mol_drug_chemistry",
arguments={"smiles_list": smiles_list}
)
chemistry_metrics = client.parse_result(result)['metrics']
## Step 7: Calculate charge properties
result = await client.session.call_tool(
"calculate_mol_charge",
arguments={"smiles_list": smiles_list}
)
charge_metrics = client.parse_result(result)['metrics']
## Step 8: Calculate complexity metrics
result = await client.session.call_tool(
"calculate_mol_complexity",
arguments={"smiles_list": smiles_list}
)
complexity_metrics = client.parse_result(result)['metrics']
## Merge all descriptors by SMILES
complete_profiles = merge_lists_by_smiles(
basic_metrics,
hydrophobicity_metrics,
hbond_metrics,
structure_metrics,
topology_metrics,
chemistry_metrics,
charge_metrics,
complexity_metrics
)
## Display results
for profile in complete_profiles:
print(f"\nSMILES: {profile['smiles']}")
print(f"Molecular Formula: {profile['molecular_formula']}")
print(f"Molecular Weight: {profile['molecular_weight']:.2f}")
print(f"LogP: {profile['logp']:.2f}")
print(f"QED Score: {profile['qed']:.4f}")
print(f"H-Bond Donors: {profile['num_h_donors']}")
print(f"H-Bond Acceptors: {profile['num_h_acceptors']}")
print(f"TPSA: {profile['tpsa']:.2f}")
print(f"Lipinski Violations: {profile['lipinski_rule_of_5_violations']}")
await client.disconnect()
Descriptor Categories
1. Basic Properties
molecular_formula: Molecular formula
molecular_weight: Molecular weight (Da)
num_heavy_atoms: Count of non-hydrogen atoms
num_atoms, num_bonds: Total atom and bond counts
formal_charge: Overall formal charge
2. Hydrophobicity
logp: Partition coefficient (lipophilicity)
molar_refractivity: Molar refractivity
fraction_csp3: Fraction of sp3 carbons (saturation)
3. Hydrogen Bonding
num_h_donors: H-bond donor count
num_h_acceptors: H-bond acceptor count
tpsa: Topological polar surface area (Ų)
4. Structural Complexity
num_rings, num_aromatic_rings: Ring counts
num_rotatable_bonds: Flexible bonds
num_heteroatoms: Non-C/H atoms
5. Topological Descriptors
chi0v-chi4v: Chi connectivity indices
kappa1-kappa3: Kappa shape indices
hall_kier_alpha: Hall-Kier alpha value
6. Drug Chemistry
qed: Quantitative Estimate of Drug-likeness (0-1)
lipinski_rule_of_5_violations: Lipinski violations (0-4)
7. Charge Properties
min/max/avg_gasteiger_charge: Gasteiger partial charges
gasteiger_charge_range: Charge distribution range
8. Complexity Metrics
molecular_complexity: Bertz complexity index
aromatic_proportion: Fraction of aromatic atoms
asphericity: 3D shape asphericity
Input/Output
Input:
smiles_list: List of SMILES strings
Output:
- List of dictionaries, each containing 50+ molecular descriptors for one molecule
Applications
- QSAR Modeling: Use descriptors as features for predictive models
- Drug Discovery: Screen compounds by drug-likeness and physicochemical properties
- Chemical Space Analysis: Visualize and cluster molecules by properties
- Lead Optimization: Track property changes during optimization
- Virtual Screening: Filter libraries by desired property ranges
Property Filters for Drug-likeness
Typical ranges for oral drug candidates:
- Molecular Weight: 150-500 Da
- LogP: 0-5
- H-Bond Donors: ≤ 5
- H-Bond Acceptors: ≤ 10
- TPSA: 20-140 Ų
- Rotatable Bonds: ≤ 10
- QED Score: > 0.5
1---2name: molecular-property-profiling3description: Comprehensive molecular property analysis covering basic info, hydrophobicity, H-bonding, structural complexity, topology, drug-likeness, charge distribution, and complexity metrics.4license: MIT license5---6
7# Molecular Property Profiling Workflow
8
9## Usage
10
11### 1. MCP Server Definition
12
13Use the same `DrugSDAClient` class as defined in previous skills.
14
15### 2. Comprehensive Molecular Property Analysis
16
17This workflow computes a comprehensive set of molecular descriptors across 8 different categories, providing a complete molecular profile for QSAR modeling, drug discovery, and molecular analysis.
18
19**Workflow Steps:**
20
211. **Basic Properties** - Molecular formula, weight, atom counts, bond counts
222. **Hydrophobicity** - LogP, molar refractivity, lipophilicity descriptors
233. **Hydrogen Bonding** - H-bond donors/acceptors, TPSA
244. **Structural Complexity** - Ring counts, aromatic rings, rotatable bonds
255. **Topological Descriptors** - Chi indices, Kappa shape indices
266. **Drug Chemistry** - QED score, Lipinski violations
277. **Charge Properties** - Gasteiger charges, formal charge
288. **Complexity Metrics** - Molecular complexity, asphericity
29
30**Implementation:**
31
32```python
33from collections import defaultdict
34
35def merge_lists_by_smiles(*lists):
36 """Merge multiple descriptor lists by SMILES key"""
37 merged = defaultdict(dict)
38 for lst in lists:
39 for d in lst:
40 smiles = d['smiles']
41 merged[smiles].update(d)
42 return list(merged.values())
43
44client = DrugSDAClient("https://scp.intern-ai.org.cn/api/v1/mcp/2/DrugSDA-Tool")
45if not await client.connect():
46 print("connection failed")
47 return
48
49## Input: List of SMILES strings
50smiles_list = [
51 'Nc1nnc(S(=O)(=O)NCCc2ccc(O)cc2)s1',
52 'COc1ccc2c(=O)cc(C(=O)N3CCN(c4ccc(F)cc4)CC3)oc2c1',
53 'CCCC1CCC(CC(=O)Cl)(C2CCCCC2)CC1'
54]
55
56## Step 1: Calculate basic molecular properties
57result = await client.session.call_tool(
58 "calculate_mol_basic_info",
59 arguments={"smiles_list": smiles_list}
60)
61basic_metrics = client.parse_result(result)['metrics']
62
63## Step 2: Calculate hydrophobicity descriptors
64result = await client.session.call_tool(
65 "calculate_mol_hydrophobicity",
66 arguments={"smiles_list": smiles_list}
67)
68hydrophobicity_metrics = client.parse_result(result)['metrics']
69
70## Step 3: Calculate hydrogen bonding properties
71result = await client.session.call_tool(
72 "calculate_mol_hbond",
73 arguments={"smiles_list": smiles_list}
74)
75hbond_metrics = client.parse_result(result)['metrics']
76
77## Step 4: Calculate structural complexity
78result = await client.session.call_tool(
79 "calculate_mol_structure_complexity",
80 arguments={"smiles_list": smiles_list}
81)
82structure_metrics = client.parse_result(result)['metrics']
83
84## Step 5: Calculate topological descriptors
85result = await client.session.call_tool(
86 "calculate_mol_topology",
87 arguments={"smiles_list": smiles_list}
88)
89topology_metrics = client.parse_result(result)['metrics']
90
91## Step 6: Calculate drug chemistry properties
92result = await client.session.call_tool(
93 "calculate_mol_drug_chemistry",
94 arguments={"smiles_list": smiles_list}
95)
96chemistry_metrics = client.parse_result(result)['metrics']
97
98## Step 7: Calculate charge properties
99result = await client.session.call_tool(
100 "calculate_mol_charge",
101 arguments={"smiles_list": smiles_list}
102)
103charge_metrics = client.parse_result(result)['metrics']
104
105## Step 8: Calculate complexity metrics
106result = await client.session.call_tool(
107 "calculate_mol_complexity",
108 arguments={"smiles_list": smiles_list}
109)
110complexity_metrics = client.parse_result(result)['metrics']
111
112## Merge all descriptors by SMILES
113complete_profiles = merge_lists_by_smiles(
114 basic_metrics,
115 hydrophobicity_metrics,
116 hbond_metrics,
117 structure_metrics,
118 topology_metrics,
119 chemistry_metrics,
120 charge_metrics,
121 complexity_metrics
122)
123
124## Display results
125for profile in complete_profiles:
126 print(f"\nSMILES: {profile['smiles']}")
127 print(f"Molecular Formula: {profile['molecular_formula']}")
128 print(f"Molecular Weight: {profile['molecular_weight']:.2f}")
129 print(f"LogP: {profile['logp']:.2f}")
130 print(f"QED Score: {profile['qed']:.4f}")
131 print(f"H-Bond Donors: {profile['num_h_donors']}")
132 print(f"H-Bond Acceptors: {profile['num_h_acceptors']}")
133 print(f"TPSA: {profile['tpsa']:.2f}")
134 print(f"Lipinski Violations: {profile['lipinski_rule_of_5_violations']}")
135
136await client.disconnect()
137```
138
139### Descriptor Categories
140
141#### 1. Basic Properties
142- `molecular_formula`: Molecular formula
143- `molecular_weight`: Molecular weight (Da)
144- `num_heavy_atoms`: Count of non-hydrogen atoms
145- `num_atoms`, `num_bonds`: Total atom and bond counts
146- `formal_charge`: Overall formal charge
147
148#### 2. Hydrophobicity
149- `logp`: Partition coefficient (lipophilicity)
150- `molar_refractivity`: Molar refractivity
151- `fraction_csp3`: Fraction of sp3 carbons (saturation)
152
153#### 3. Hydrogen Bonding
154- `num_h_donors`: H-bond donor count
155- `num_h_acceptors`: H-bond acceptor count
156- `tpsa`: Topological polar surface area (Ų)
157
158#### 4. Structural Complexity
159- `num_rings`, `num_aromatic_rings`: Ring counts
160- `num_rotatable_bonds`: Flexible bonds
161- `num_heteroatoms`: Non-C/H atoms
162
163#### 5. Topological Descriptors
164- `chi0v`-`chi4v`: Chi connectivity indices
165- `kappa1`-`kappa3`: Kappa shape indices
166- `hall_kier_alpha`: Hall-Kier alpha value
167
168#### 6. Drug Chemistry
169- `qed`: Quantitative Estimate of Drug-likeness (0-1)
170- `lipinski_rule_of_5_violations`: Lipinski violations (0-4)
171
172#### 7. Charge Properties
173- `min/max/avg_gasteiger_charge`: Gasteiger partial charges
174- `gasteiger_charge_range`: Charge distribution range
175
176#### 8. Complexity Metrics
177- `molecular_complexity`: Bertz complexity index
178- `aromatic_proportion`: Fraction of aromatic atoms
179- `asphericity`: 3D shape asphericity
180
181### Input/Output
182
183**Input:**
184- `smiles_list`: List of SMILES strings
185
186**Output:**
187- List of dictionaries, each containing 50+ molecular descriptors for one molecule
188
189### Applications
190
191- **QSAR Modeling**: Use descriptors as features for predictive models
192- **Drug Discovery**: Screen compounds by drug-likeness and physicochemical properties
193- **Chemical Space Analysis**: Visualize and cluster molecules by properties
194- **Lead Optimization**: Track property changes during optimization
195- **Virtual Screening**: Filter libraries by desired property ranges
196
197### Property Filters for Drug-likeness
198
199Typical ranges for oral drug candidates:
200- Molecular Weight: 150-500 Da
201- LogP: 0-5
202- H-Bond Donors: ≤ 5
203- H-Bond Acceptors: ≤ 10
204- TPSA: 20-140 Ų
205- Rotatable Bonds: ≤ 10
206- QED Score: > 0.5