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---67# Molecular Property Profiling Workflow89## Usage1011### 1. MCP Server Definition1213Use the same `DrugSDAClient` class as defined in previous skills.1415### 2. Comprehensive Molecular Property Analysis1617This 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.1819**Workflow Steps:**20211. **Basic Properties** - Molecular formula, weight, atom counts, bond counts222. **Hydrophobicity** - LogP, molar refractivity, lipophilicity descriptors233. **Hydrogen Bonding** - H-bond donors/acceptors, TPSA244. **Structural Complexity** - Ring counts, aromatic rings, rotatable bonds255. **Topological Descriptors** - Chi indices, Kappa shape indices266. **Drug Chemistry** - QED score, Lipinski violations277. **Charge Properties** - Gasteiger charges, formal charge288. **Complexity Metrics** - Molecular complexity, asphericity2930**Implementation:**3132```python33from collections import defaultdict3435def 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())4344client = DrugSDAClient("https://scp.intern-ai.org.cn/api/v1/mcp/2/DrugSDA-Tool")45if not await client.connect():46 print("connection failed")47 return4849## Input: List of SMILES strings50smiles_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]5556## Step 1: Calculate basic molecular properties57result = await client.session.call_tool(58 "calculate_mol_basic_info",59 arguments={"smiles_list": smiles_list}60)61basic_metrics = client.parse_result(result)['metrics']6263## Step 2: Calculate hydrophobicity descriptors64result = await client.session.call_tool(65 "calculate_mol_hydrophobicity",66 arguments={"smiles_list": smiles_list}67)68hydrophobicity_metrics = client.parse_result(result)['metrics']6970## Step 3: Calculate hydrogen bonding properties71result = await client.session.call_tool(72 "calculate_mol_hbond",73 arguments={"smiles_list": smiles_list}74)75hbond_metrics = client.parse_result(result)['metrics']7677## Step 4: Calculate structural complexity78result = await client.session.call_tool(79 "calculate_mol_structure_complexity",80 arguments={"smiles_list": smiles_list}81)82structure_metrics = client.parse_result(result)['metrics']8384## Step 5: Calculate topological descriptors85result = await client.session.call_tool(86 "calculate_mol_topology",87 arguments={"smiles_list": smiles_list}88)89topology_metrics = client.parse_result(result)['metrics']9091## Step 6: Calculate drug chemistry properties92result = await client.session.call_tool(93 "calculate_mol_drug_chemistry",94 arguments={"smiles_list": smiles_list}95)96chemistry_metrics = client.parse_result(result)['metrics']9798## Step 7: Calculate charge properties99result = await client.session.call_tool(100 "calculate_mol_charge",101 arguments={"smiles_list": smiles_list}102)103charge_metrics = client.parse_result(result)['metrics']104105## Step 8: Calculate complexity metrics106result = await client.session.call_tool(107 "calculate_mol_complexity",108 arguments={"smiles_list": smiles_list}109)110complexity_metrics = client.parse_result(result)['metrics']111112## Merge all descriptors by SMILES113complete_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_metrics122)123124## Display results125for 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']}")135136await client.disconnect()137```138139### Descriptor Categories140141#### 1. Basic Properties142- `molecular_formula`: Molecular formula143- `molecular_weight`: Molecular weight (Da)144- `num_heavy_atoms`: Count of non-hydrogen atoms145- `num_atoms`, `num_bonds`: Total atom and bond counts146- `formal_charge`: Overall formal charge147148#### 2. Hydrophobicity149- `logp`: Partition coefficient (lipophilicity)150- `molar_refractivity`: Molar refractivity151- `fraction_csp3`: Fraction of sp3 carbons (saturation)152153#### 3. Hydrogen Bonding154- `num_h_donors`: H-bond donor count155- `num_h_acceptors`: H-bond acceptor count156- `tpsa`: Topological polar surface area (Ų)157158#### 4. Structural Complexity159- `num_rings`, `num_aromatic_rings`: Ring counts160- `num_rotatable_bonds`: Flexible bonds161- `num_heteroatoms`: Non-C/H atoms162163#### 5. Topological Descriptors164- `chi0v`-`chi4v`: Chi connectivity indices165- `kappa1`-`kappa3`: Kappa shape indices166- `hall_kier_alpha`: Hall-Kier alpha value167168#### 6. Drug Chemistry169- `qed`: Quantitative Estimate of Drug-likeness (0-1)170- `lipinski_rule_of_5_violations`: Lipinski violations (0-4)171172#### 7. Charge Properties173- `min/max/avg_gasteiger_charge`: Gasteiger partial charges174- `gasteiger_charge_range`: Charge distribution range175176#### 8. Complexity Metrics177- `molecular_complexity`: Bertz complexity index178- `aromatic_proportion`: Fraction of aromatic atoms179- `asphericity`: 3D shape asphericity180181### Input/Output182183**Input:**184- `smiles_list`: List of SMILES strings185186**Output:**187- List of dictionaries, each containing 50+ molecular descriptors for one molecule188189### Applications190191- **QSAR Modeling**: Use descriptors as features for predictive models192- **Drug Discovery**: Screen compounds by drug-likeness and physicochemical properties193- **Chemical Space Analysis**: Visualize and cluster molecules by properties194- **Lead Optimization**: Track property changes during optimization195- **Virtual Screening**: Filter libraries by desired property ranges196197### Property Filters for Drug-likeness198199Typical ranges for oral drug candidates:200- Molecular Weight: 150-500 Da201- LogP: 0-5202- H-Bond Donors: ≤ 5203- H-Bond Acceptors: ≤ 10204- TPSA: 20-140 Ų205- Rotatable Bonds: ≤ 10206- QED Score: > 0.5