Summary
When reviewers read the validation section, they mainly check the five points below. The first three have to be settled before any computation starts.
The interpretation paper of the WFCMS Network Pharmacology Evaluation Method Guidance surveyed network pharmacology papers indexed in CNKI (up to June 2021): fewer than 30% validated their results experimentally, about one third of those with in vitro or in vivo experiments, and most studies only inferred their results from the literature. Reviewers have seen many manuscripts that rely on docking alone, and docking is no longer accepted as validation.
Compounds have chemical evidence
Show that each core compound is actually present in the herb or preparation used, with quantitative data: your own UHPLC-HRMS analysis, or quantitative literature on the same herb. Compounds taken only from a database ingredient list are the most likely to draw requests for more evidence.
Thresholds are fixed in advance and sourced
Fix OB, DL, target-prediction scores, GeneCards scores, STRING confidence and the core-target rule before seeing the results, and state database versions and access dates in the methods. Changing thresholds after seeing how many hits you get is the problem reviewers spot most easily.
Docking has a positive control and redocking
Dock to a defined site, validate the settings by redocking the co-crystallized ligand, and use a known inhibitor as a positive control. Compare compound scores with the positive control.
Molecular dynamics has independent replicas
Run at least 3 independent simulations per complex, report the mean and standard deviation, and simulate the positive control with the same protocol. An RMSD curve from a single trajectory does not show that binding is stable.
Core compound-target pairs have experiments
The computational results have to end in experiments: molecular-level binding or enzyme assays (SPR, MST, ITC, enzyme inhibition) to test direct interaction, and cell or animal experiments to test the pathway. The submission requirements of Frontiers in Pharmacology and Drug Design, Development and Therapy both treat experimental validation as a precondition for review.
Full workflow
Tool versions are current as of 2026-10-10. Steps 1, 9, 10 and 12 decide whether the validation section holds up; for steps 2 to 8, reviewers mainly check thresholds and versions.
| Step | Input | Tools | Output | Figure |
|---|---|---|---|---|
| 1 Collect and confirm compounds | Herb or formula name | HERB 2.0, BATMAN-TCM 2.0, TCMSP, literature; UHPLC-HRMS when available | Compound table: name, PubChem CID, InChIKey, source, content | Chromatogram for compound identification; compound source table |
| 2 ADME screening | Compound SMILES | OB/DL from TCMSP; SwissADME | Retained compounds and threshold rationale | Compound screening table |
| 3 Compound targets | Compound SMILES | SwissTargetPrediction, BATMAN-TCM 2.0 (known and predicted reported separately), PharmMapper | Compound-target pairs (UniProt IDs mapped to gene symbols) | Compound-target network |
| 4 Disease genes | MeSH preferred disease name; GEO datasets | OMIM, DisGeNET curated, GeneCards; GEO differential expression | Disease gene table | Venn diagram of disease gene sources |
| 5 Overlap | Two gene sets (harmonized to HGNC symbols) | R or Python | Overlap genes | Venn diagram of compound targets and disease genes |
| 6 PPI and core targets | Overlap genes | STRING 12.5, Cytoscape 3.10.5 + stringApp 2.2 | Network TSV, topology table | PPI network; bar chart of core-target degree |
| 7 Herb-compound-target-pathway network | Results of steps 1 to 8 | Cytoscape | Network file | Multi-layer network |
| 8 GO/KEGG enrichment | Overlap genes + background gene set | clusterProfiler | Enrichment table (with adjusted P values) | Dot plot or bar chart |
| 9 Molecular docking | PDB structures of core targets; 3D structures of core compounds and positive controls | AutoDock Vina 1.2.7, Meeko | Score table, docked poses, redocking RMSD | Score heat map (with positive control); 2D/3D interaction diagrams; redocking overlay |
| 10 Molecular dynamics | Docked complexes (including positive control) | GROMACS 2026; ligand parameters from AmberTools/ACPYPE or OpenFF | At least 3 trajectories per complex | Ligand RMSD, pocket RMSF, hydrogen-bond and contact occupancy (mean ± SD) |
| 11 Binding free energy | MD trajectories | gmx_MMPBSA 1.7.0 | ΔG components and per-residue decomposition | Energy component bar chart; per-residue contribution plot |
| 12 Experimental validation | Core compounds and core targets | SPR, MST, ITC, enzyme assays; cell and animal experiments | Experimental data | Binding curves; Western blots, etc. |
Databases
The table reflects actual access on 2026-10-10. In the methods, give three items for each database: version or URL, access date and screening criteria.
The WFCMS guidance interpretation paper examined 13 network pharmacology papers on ginseng in CNKI: even with the same database and the same thresholds, the number of included compounds differed, because thresholds were changed and compounds added from the literature were not explained. In TCMSP, 22 ginseng compounds have OB > 30% and DL > 0.18, and 17 of them have predicted targets. Keeping the raw export tables and providing them as supplementary files is the most direct way to let others reproduce your compound and target counts.
| Database | Status in Oct 2026 | Practical experience | Alternatives or supplements |
|---|---|---|---|
| TCMSP | tcmsp-e.com is now a portal: the legacy version is at old.tcmsp-e.com (footer version 2.3, latest update-log entry 2025-04-20); the new TCMSP 9.0.1 is at next.tcmsp-e.com, and its full analysis tools require a membership | The methods text generated by the new version uses OB ≥ 15% and DL ≥ 0.11 by default, unlike the 30%/0.18 common in papers based on the legacy version, so do not mix data from the two versions in one paper; the legacy target tables can only be copied page by page, experience posts mostly use scripts, and you should check target counts after export | HERB 2.0, BATMAN-TCM 2.0 |
| HERB 2.0 | herb.ac.cn/v2, published in NAR in November 2024 | Adds curation of 8,558 clinical trials and 8,032 meta-analyses; useful for finding clinical and experimental evidence for a herb or compound, which answers the question of whether a compound is supported by evidence | TCMSP, literature |
| BATMAN-TCM 2.0 | bionet.ncpsb.org.cn/batman-tcm, NAR 2024 | 17,068 known compound-target interactions and about 2.32 million predicted ones; bulk download from the Download page; report known and predicted targets separately | SwissTargetPrediction |
| SwissTargetPrediction | Accessible; last method update in 2019 | Supports human, rat and mouse only; input SMILES from PubChem, which is less error-prone than searching by name; the meaning of Probability is explained in the next section | Predicted part of BATMAN-TCM 2.0 |
| PharmMapper | lilab-ecust.cn/pharmmapper is accessible; last method update in 2017 | Reverse pharmacophore matching with a job queue; results are UniProt IDs, and when mapping them to gene symbols with UniProt ID mapping keep only reviewed human entries | SwissTargetPrediction |
| GeneCards | Accessible; Export on the search results page gives a CSV | Relevance score is a search relevance score and is not comparable between searches for different diseases; confirm the preferred disease name in MeSH first, search synonyms separately and merge | OMIM, DisGeNET curated, GEO differential genes |
| OMIM | Web search available | Bulk download of genemap2 requires an API key, and approval can take several working days, so export from the web search when you are short of time; coverage is mainly Mendelian, so few genes for complex diseases is normal | DisGeNET curated |
| DisGeNET | disgenet.org now redirects to disgenet.com | A free academic account shows curated data only, so results from older tutorials using all sources plus a score cutoff cannot be reproduced with a free account; state in the methods that you used curated data | OMIM, GeneCards |
| STRING | Current version 12.5 | Use version-12-5.string-db.org to pin the version so that results still match after a later upgrade; the combined score indicates how likely an interaction is to be true, not its strength | — |
| Cytoscape and apps | Cytoscape 3.10.5 (2026-09-29); stringApp 2.2.0; the latest cytoHubba release in the App Store dates from 2017, CytoNCA from 2014, MCODE 2.0.3 from 2023 | The stringApp 2.2.0 release notes say this version keeps it working after 2024-12-31, so upgrade stringApp first if import fails; basic topology such as degree is available from the built-in Analyze Network | Python networkx, R igraph |
Thresholds
Most thresholds have no agreed standard. The reliable approach is to choose a value with a source, fix it before seeing the results, and state the reason in the methods.
| Parameter | Common practice | Source | Problem | How to report |
|---|---|---|---|---|
| OB / DL | OB ≥ 30%, DL ≥ 0.18; lowered to OB ≥ 20% when too few compounds remain | DL 0.18 is the drug-like level defined by TCMSP; the TCMSP parameter page suggests OB ≥ 20% and DL ≥ 0.1; the licorice example in the original TCMSP paper used OB ≥ 40% and DL ≥ 0.18 | OB is a predicted oral bioavailability and does not apply to injections or topical preparations; adjusting thresholds to the number of compounds is post hoc selection | State the TCMSP version and threshold source; add pharmacokinetic or plasma-compound literature for the retained core compounds |
| SwissTargetPrediction Probability | Top 15 per compound; or Probability ≥ 0.1 or > 0 | Probability is the probability that a bioactive molecule has the protein as a target, not the probability that the compound is active; in external testing, 72% of molecules had at least one known target in the top 15, and the top-ranked target was correct for 28% | Most of the top 15 are false positives | Take the top 15 for all compounds and compare with known targets in BATMAN-TCM |
| GeneCards Relevance score | ≥ 1, ≥ median, ≥ 2 × median | None; the score comes from text relevance in the GeneCards search engine | A high score only means the gene entry mentions the disease more, not causation; scores are not comparable between searches | Use OMIM, DisGeNET curated or disease GEO differential genes as the main source, GeneCards only as a supplement, and report the search terms |
| STRING combined score | 0.4 or 0.9, with the Textmining channel removed | STRING calls ≥ 0.400 medium confidence | High-scoring edges may rest on text mining alone (see the test in the next section) | Report the STRING version, cutoff and evidence channels used |
| Core targets | Degree ≥ median; or degree, betweenness and closeness all ≥ median; top 10 by cytoHubba MCC | Common practice; the WFCMS guidance interpretation notes that topology screening criteria are inconsistent and lack a basis | Degree favors well-studied genes; in small networks many nodes tie at the median | Fix one method in advance and check core targets independently against disease omics data or the literature |
PPI network
The usual approach is to harmonize compound targets and disease genes to HGNC symbols, take the overlap, submit it to STRING, compute topology in Cytoscape, and take nodes with degree at or above the median as core targets.
Core targets obtained this way are highly uniform. Diao et al. (2026) surveyed 1,038 natural-product network pharmacology studies published from October 2023 to June 2024: AKT1 appeared among the core targets in 48.8% of studies, TNF in 39.1% and EGFR in 34.8%; AKT1 appeared in 54.9% of database-only studies and in 19.6% of studies that integrated omics or experimental data. Quercetin appeared in 71.9% and 42.3% of the two groups, respectively.
One reason is that STRING text-mining evidence favors well-studied genes. The script below first checks which protein each gene symbol maps to with get_string_ids, then fetches a network from a pinned STRING API version, flags edges supported only by text mining and lists core targets by median degree. Tested on this page (2026-10-10, STRING 12.5 API, Python 3 standard library): with 10 genes that recur in network pharmacology papers (AKT1, TNF, IL6, PTGS2, ESR1, STAT3, MAPK1, CASP3, BCL2, VEGFA) at required_score=700, the network had 33 edges, 5 of them supported only by text mining; the 0.88 score for AKT1–IL6 came entirely from text mining. The 9 connected nodes had a median degree of 8, and 5 nodes tied at or above the median.
The same test showed that in STRING 12.0 and 12.5 a query for VEGFA returns COL18A1 (9606.ENSP00000352798) without any error; queries by UniProt accession P15692 or Entrez ID 7422 return nothing, while STRING 11.5 still matches VEGFA correctly. If the gene list is submitted directly to the network endpoint, VEGFA enters the network as COL18A1 (at required_score=400, COL18A1 appears with 3 edges). VEGFA is a frequent core target in network pharmacology papers, so check the mapping before submission and report genes with inconsistent mapping separately in the methods.
Ways to reduce this uniformity: check whether core targets change in the disease using transcriptomic or proteomic data; report betweenness and other metrics alongside degree; and provide the full target list as a supplement so reviewers can judge.
# Usage: python3 string_hubs.py overlap_genes.txt 700
# overlap_genes.txt: one overlapping gene symbol per line; second argument is required_score (0-1000)
import sys, csv, io, statistics, urllib.parse, urllib.request
from collections import defaultdict
API = "https://version-12-5.string-db.org/api/tsv"
def post(method, **params):
params.update({"species": 9606, "caller_identity": "np_validation_tutorial"})
data = urllib.parse.urlencode(params).encode()
with urllib.request.urlopen(f"{API}/{method}", data=data) as r:
return list(csv.DictReader(io.StringIO(r.read().decode()), delimiter="\t"))
genes = [g.strip() for g in open(sys.argv[1]) if g.strip()]
score = int(sys.argv[2]) if len(sys.argv) > 2 else 400
# 1. Check symbol mapping first: STRING silently maps unmatched symbols to other proteins
mapped = post("get_string_ids", identifiers="\r".join(genes), echo_query=1, limit=1)
hit = {m["queryItem"]: m for m in mapped}
for g in genes:
if g not in hit:
print(f"WARNING not found in STRING: {g}")
elif hit[g]["preferredName"].upper() != g.upper():
print(f"WARNING {g} mapped to {hit[g]['preferredName']} ({hit[g]['stringId']})")
ids = [hit[g]["stringId"] for g in genes if g in hit and hit[g]["preferredName"].upper() == g.upper()]
# 2. Fetch the network using only consistently mapped STRING IDs
rows = post("network", identifiers="\r".join(ids), required_score=score)
edges = {}
for x in rows:
key = tuple(sorted((x["preferredName_A"], x["preferredName_B"])))
other = max(float(x[c]) for c in ("nscore", "fscore", "pscore", "ascore", "escore", "dscore"))
edges[key] = (float(x["score"]), float(x["tscore"]), other)
tm_only = [k for k, (s, t, o) in edges.items() if o == 0]
print(f"edges={len(edges)} textmining_only={len(tm_only)}")
for a, b in tm_only:
print(f" textmining only: {a}-{b} score={edges[(a, b)][0]}")
deg = defaultdict(int)
for a, b in edges:
deg[a] += 1
deg[b] += 1
med = statistics.median(deg.values())
print(f"nodes={len(deg)} median_degree={med}")
for g, d in sorted(deg.items(), key=lambda kv: -kv[1]):
print(f"{g}\t{d}\t{'>=median' if d >= med else ''}")
python3 string_hubs.py overlap_genes.txt 700Enrichment
The two common gaps in enrichment analysis are an unreported background gene set and missing multiple-testing correction.
Wijesooriya et al. (2022) reviewed 186 articles that used enrichment analysis: 95% of over-representation analyses did not use or did not describe an appropriate background gene set, and 43% did not correct for multiple testing. In network pharmacology studies, the AGE-RAGE and PI3K-Akt pathways appear in 54.9% and 54.7% of studies, respectively (Diao et al. 2026).
A workable approach is to use the union of all compound targets and disease genes as the background and to report the background size, correction method and KEGG access date in the methods. In clusterProfiler, the ont argument of enrichGO() defaults to "MF", so omitting it returns molecular function only; enrichKEGG() downloads current KEGG data online by default, so record the access date.
Tested on this page (2026-10-10, R 4.5.3, clusterProfiler 4.18.4, org.Hs.eg.db 3.22.0, macOS arm64): with the 10 genes above as the overlap set and their 191 STRING 12.5 interaction partners as the background, the script ran successfully. With this background, 170 GO BP terms and 20 KEGG pathways were significant; without universe (the default background of all annotated genes), the counts were 1,493 and 132; omitting ont returned 77 MF terms. Under both backgrounds, the top KEGG pathway was AGE-RAGE signaling pathway in diabetic complications. The example background is for demonstration only; in a real analysis use the union of all compound targets and disease genes.
# Dependencies: BiocManager::install(c("clusterProfiler", "org.Hs.eg.db"))
library(clusterProfiler)
library(org.Hs.eg.db)
hits <- readLines("overlap_genes.txt") # overlap genes (symbols)
bg <- readLines("background_genes.txt") # background: union of all compound targets and disease genes
hits_id <- bitr(hits, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db)$ENTREZID
bg_id <- bitr(bg, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db)$ENTREZID
ego <- enrichGO(gene = hits_id, universe = bg_id, OrgDb = org.Hs.eg.db,
keyType = "ENTREZID", ont = "BP", # ont defaults to "MF"
pAdjustMethod = "BH", pvalueCutoff = 0.05, qvalueCutoff = 0.2,
readable = TRUE)
ekegg <- enrichKEGG(gene = hits_id, universe = bg_id, organism = "hsa",
keyType = "kegg", pAdjustMethod = "BH",
pvalueCutoff = 0.05, qvalueCutoff = 0.2)
write.csv(as.data.frame(ego), "go_bp.csv", row.names = FALSE)
write.csv(as.data.frame(ekegg), "kegg.csv", row.names = FALSE)
writeLines(c(paste("hits", length(hits_id)),
paste("background", length(bg_id)),
paste("KEGG accessed", Sys.Date())), "enrichment_meta.txt")
Molecular docking
In a network pharmacology paper, docking provides structural plausibility for the core compounds and core targets. A docking score does not prove binding.
Che and Zhang (2025) reviewed 35 network pharmacology papers published in 2024: about 15 used −5.0 kcal/mol as an affinity cutoff and the others used values from −1.2 to −7.0, none with a traceable source; scores from different docking programs are not comparable; none of the 35 papers used a positive control; 4 explicitly used blind docking, and in another 13 different ligands docked to different regions of the protein, suggesting blind docking. In their test on 285 complexes from CASF-2016, Vina scores from site-specific docking correlated with experimental affinity at r = 0.604, against 0.387 for blind docking; for blind docking, the median RMSD was 3.37 Å at exhaustiveness 8 and 2.21 Å at 64, at about 8 times the run time.
Receptor and ligand preparation, box setup and complete commands are covered in /learn/autodock-vina-docking.
- 01
Choose the structure
Prefer human crystal structures with a co-crystallized ligand and a complete binding pocket, and report the PDB ID and resolution. If only a predicted structure is available, check the pLDDT of the pocket residues first (see /learn/alphafold-results).
- 02
Define the site
Define the docking box from the co-crystallized ligand position or from functional residues reported in the literature. If the site is unknown, run pocket prediction first and cross-check with a second docking program.
- 03
Redock
Remove the co-crystallized ligand and redock it with the same settings. A heavy-atom RMSD ≤ 2 Å between the top pose and the crystal pose shows that the settings reproduce the known binding mode (PoseBusters uses the same criterion).
- 04
Positive control
Dock a known inhibitor of the target, or the co-crystallized ligand, in the same box with the same settings. Compare compound scores with the positive control, and take only compounds that score close to or better than it into MD.
- 05
Report the settings
Report the box center and size, exhaustiveness, random seed and Vina version, with 2D/3D interaction diagrams and the redocking overlay.
| Vina score (kcal/mol) | Kd if read as ΔG (298.15 K) | Common wording in papers |
|---|---|---|
| −4.25 | about 770 μM | "has binding activity" |
| −5.0 | about 216 μM | "good binding" |
| −7.0 | about 7.4 μM | "strong binding" |
| −9.0 | about 0.25 μM | — |
Molecular dynamics
Molecular docking and molecular dynamics are two successive steps: docking searches ligand poses on a nearly rigid receptor and scores them, and molecular dynamics tests whether a pose persists over time in explicit solvent. If the docking site is wrong, MD cannot correct it.
There is no agreed simulation length. The MD reliability checklist published in Communications Biology in 2023 asks for evidence of convergence and at least 3 independent simulations per condition; it does not set a fixed number of nanoseconds. A common practical way to judge equilibration: least-squares fit each frame on the protein backbone to a reference structure, compute the RMSD, apply a running average to the curve, and treat the structure as equilibrated only from the point where the curve no longer rises or falls overall.
Known limitations of MM/PBSA (Genheden and Ryde 2015): the energies are usually too large; ranking is often unreliable when ligand affinities differ by less than 12 kJ/mol (about 2.9 kcal/mol); r² against experiment is about 0.3 across PDBbind and 0 to 0.8 for individual proteins; the entropy term has the largest statistical uncertainty and does not improve results in large tests, so it is often omitted; results are often best with a solute dielectric constant of 2 to 4; and the single-trajectory approach is usually more accurate than the three-trajectory approach. State in the paper whether entropy was computed and which dielectric constant was used.
The current gmx_MMPBSA version is 1.7.0. When copying older tutorials, note that extdiel in &gb has defaulted to 78.5 since 1.5.0 (80.0 before); with Interaction Entropy, report σIE, and treat results as unreliable when σIE exceeds about 3.6 kcal/mol. System setup, mdp parameters and commands are covered in /learn/gromacs-protein-ligand, and computing and plotting RMSD, RMSF, hydrogen bonds and SASA in /learn/md-trajectory-analysis.
| Metric | Question answered | Common mistake |
|---|---|---|
| Ligand RMSD (after fitting on the protein backbone) | Whether the ligand stays in its original binding pose | Fitting on the ligand itself, which hides overall ligand drift |
| Protein backbone RMSD | Whether the overall protein structure is stable | Using it in place of ligand RMSD as evidence of stable binding |
| Pocket-residue RMSF | Flexibility of the binding region | Showing only a whole-protein RMSF curve without marking pocket residues |
| Hydrogen-bond and contact occupancy | Which interactions persist | Plotting only the number of hydrogen bonds over time, without naming residues |
| Rg, SASA | Whether the protein unfolds or collapses | Treating flat Rg or SASA as evidence of stable ligand binding |
| MM/PBSA or MM/GBSA | Relative binding strength compared with the positive control | Treating the absolute value as a binding free energy and comparing it directly with experimental ΔG |
- Run at least 3 independent simulations per complex (different initial-velocity random seeds) and report the mean and standard deviation.
- Show evidence that the analyzed properties have equilibrated, and state how the equilibration and analysis segments are divided.
- Run at least one simulation from a different starting conformation (for example the second-ranked docking pose) to show that conclusions do not depend on the starting structure.
- Provide a system setup table: box dimensions, total atoms, number of water molecules, salt concentration, force field and water model, protonation states.
- Report software versions and provide the initial coordinates, input parameter files and final coordinates.
- Simulate the positive-control complex with the same protocol.
Reviewer comments
The questions below come from journal review requirements and methodological review papers. The responses can be completed before submission.
| Question | How to address it | Basis |
|---|---|---|
| Only computation, no experiments | Run molecular-level binding or enzyme assays on the top-ranked compound-target pairs, then test key pathways in cells or animals | Frontiers in Pharmacology Four Pillars; DDDT submission guidance |
| Is the compound present in the herb, and in sufficient amount? | Analyze the herb or preparation by UHPLC-HRMS, or cite quantitative literature on the same herb; prefer compounds detected in plasma | Four Pillars requirements on compound identification and content |
| Quercetin, kaempferol and similar compounds hit many targets | Give the compound's content in this herb and evidence of specificity, or discuss it as a secondary compound | Four Pillars; Diao et al. 2026 (quercetin in 71.9% of database-only studies) |
| Why were OB/DL and other thresholds set this way? | Cite the threshold source and state that thresholds were fixed before analysis; for non-oral preparations, explain why OB was not used | TCMSP parameter page; WFCMS guidance on rationality |
| Core targets are AKT1, TNF and IL6 again | Check core targets against disease omics data; report the full target list; report topology metrics other than degree | Diao et al. 2026 |
| Unclear enrichment background, no correction | Report the background gene set, correction method, software version and KEGG access date | Wijesooriya et al. 2022 |
| Blind docking, no positive control, unsupported cutoff | Site-specific docking, redocking RMSD ≤ 2 Å, positive control docked under the same settings, relative ranking instead of a fixed cutoff | Che and Zhang 2025 |
| MD has a single trajectory | At least 3 independent replicas per complex, reported as mean ± SD | Communications Biology 2023 reliability checklist |
| MM/PBSA values are too large or disagree with experiment | Compare only relative values against the positive control; state the entropy and dielectric settings | Genheden and Ryde 2015 |
| Database versions and access dates unclear, results not reproducible | Provide access dates, versions, raw export tables and all scripts | WFCMS guidance on data traceability |
| Formula or extract composition unclear | Report the composition ratio, extraction procedure, batch number and chemical characterization | Four Pillars requirements on composition |
Practice in China
The target table of the old TCMSP gives protein names (the target_name column), which must be converted to gene symbols before intersection and enrichment. The usual approach in Chinese experience posts is to download human reviewed UniProt entries and match protein names to gene names (Excel VLOOKUP or an R script). Below are test results for this step, the cases that need manual handling, and common problems when importing into Cytoscape.
# Usage: python3 tcmsp2symbol.py tcmsp_targets.txt > target_symbol.tsv
# tcmsp_targets.txt: one TCMSP target name per line (target_name column, deduplicated)
# Python 3 standard library only; downloads human reviewed UniProt entries (about 20,000 rows) at run time
import csv, io, re, sys, urllib.request
URL = ("https://rest.uniprot.org/uniprotkb/stream?query=organism_id:9606+AND+reviewed:true"
"&fields=accession,protein_name,gene_primary&format=tsv")
rec, alt = {}, {}
with urllib.request.urlopen(URL, timeout=600) as r:
for row in csv.DictReader(io.StringIO(r.read().decode()), delimiter="\t"):
gene = row["Gene Names (primary)"]
if not gene:
continue
pn = row["Protein names"].split(" [Cleaved")[0] # drop the cleaved-chain description
rec.setdefault(re.sub(r"\s*\(.*$", "", pn).strip().lower(), set()).add(gene) # recommended name
for name in re.findall(r"\(([^()]*)\)", pn): # alternative names in parentheses
alt.setdefault(name.strip().lower(), set()).add(gene)
names = [l.strip() for l in open(sys.argv[1], encoding="utf-8") if l.strip()]
n_rec = n_alt = 0
print("target_name\tsymbols\tmatch")
for n in dict.fromkeys(names):
key = n.lower()
if key in rec:
genes, how = rec[key], "recommended"; n_rec += 1
elif key in alt:
genes, how = alt[key], "alternative"; n_alt += 1 # alternative-name match: check each one by hand
else:
genes, how = set(), "none" # unmatched: look up in UniProt by hand
flag = "ambiguous" if len(genes) > 1 else how
print(f"{n}\t{'/'.join(sorted(genes))}\t{flag}")
print(f"targets={len(dict.fromkeys(names))} recommended={n_rec} alternative={n_alt} "
f"unmatched={len(dict.fromkeys(names)) - n_rec - n_alt}", file=sys.stderr)Exact matching alone loses about a third of the targets
Test on this page (2026-10-10, old TCMSP 2.3, UniProt REST API): for Scutellariae Radix (Huangqin), the 36 compounds with OB ≥ 30% and DL ≥ 0.18 give 507 compound-target pairs and 124 unique target names. 85 match a UniProt recommended name exactly; matching the alternative names in parentheses adds 15, for 100 in total; 24 match neither way. The R scripts in experience posts also run several extra rounds of matching after replacing hyphens with spaces and dropping parenthesized parts, for the same reason.
Check unmatched and alternative-name matches one by one
In the same test the unmatched names fell into four groups: UniProt changed the recommended name (VEGFA is now Vascular endothelial growth factor A, long form); the TCMSP name is a cleavage product (Thrombin belongs to Prothrombin, encoded by F2); the name covers a gene family (Calmodulin maps to CALM1, CALM2 and CALM3; Heat shock protein HSP 90 to HSP90AA1 and others); and entries of the form "mRNA of …". Among the alternative-name matches, Beta-lactamase was matched to human DPEP1; the Beta-lactamase in the TCMSP table is the bacterial β-lactamase and Cytochrome P450-cam is CYP101 from Pseudomonas putida, so both should be removed and not counted as human targets.
Cytoscape import errors and odd nodes
For the import error Could not initialize preview, experience posts save the Excel sheet as "CSV UTF-8" before importing and replace line breaks, commas, semicolons and other special characters inside cells; the "CSV (comma delimited)" format of Chinese Excel is saved in GBK encoding, so node names with Chinese characters become garbled on import. Write each gene the same way everywhere: HIF1A and Hif1a become two nodes. Isolated targets without edges in the PPI network usually point to an error in the earlier gene-name conversion, so check the mapping table first. The advice in some posts to raise the SwissTargetPrediction threshold when there are too many nodes for a tidy concentric layout amounts to changing a threshold after seeing the results; with many nodes, draw a subnetwork of the core targets instead.
Hand off to an agent
The computational steps are fixed, produce many files and run for a long time, so they suit a science agent. Judgment calls and experiments remain yours.
Example one-sentence instruction: "Study Scutellaria baicalensis for ulcerative colitis: collect compounds and targets from HERB 2.0 and BATMAN-TCM 2.0, screen with OB ≥ 30%, DL ≥ 0.18 and the SwissTargetPrediction top 15; take disease genes from OMIM, DisGeNET curated and GEO differential genes; build a STRING 12.5 network and flag edges supported only by text mining; run GO/KEGG enrichment with the union of all compound targets and disease genes as background; do site-specific docking, redocking and positive-control docking for the top 5 core targets; run 3 replicas of 100 ns for each of the 3 best-scoring complexes and the positive control, compute MM/GBSA and make the figures."
- 01
Retrieval and records
Queries each database, saves raw export tables and records versions and access dates.
- 02
Network and enrichment
Runs Python and R scripts for the overlap, PPI, core targets and enrichment, and writes tables and figures.
- 03
Docking
Downloads PDB structures, prepares receptors and ligands, runs redocking, compound docking and positive-control docking, and outputs the score table and interaction diagrams.
- 04
Molecular dynamics
Builds systems in an environment with GROMACS, AmberTools and ACPYPE preinstalled, rents a GPU as needed for the replicas, and completes trajectory analysis and gmx_MMPBSA calculations.
- 05
Adversarial review
Checks whether the task is actually complete, for example whether redocking RMSD is ≤ 2 Å, whether every complex has all its replicas, and whether figures show the mean and standard deviation.
- The workspace keeps: compound tables, target tables, network TSV files, enrichment results, docking logs and poses, MD input files and analysis results, and all scripts and figures.
- You still need to check: whether the core compounds are actually present in the herb and in what amount, whether the thresholds fit your study design, and whether the PDB structures and positive controls are appropriate.
- You design and run the experimental validation yourself.
References
- Frontiers in Pharmacology: The Four Pillars of Best Practice in Ethnopharmacology — Review expectations for network analysis, docking, compound identification and content, and promiscuous compounds
- Drug Design, Development and Therapy journal page — Expectations for manuscripts with network pharmacology and docking only, and molecular-level in vitro validation
- Niu M, et al. Interpretation of Network Pharmacology Evaluation Method Guidance. Chinese Traditional and Herbal Drugs, 2021, 52(14): 4119-4129 — Evaluation framework, share of CNKI papers with validation, inconsistent ginseng compound counts
- Che X, Zhang L. Blind docking methods have been inappropriately used in most network pharmacology analysis. Front Pharmacol, 2025 — −5.0 kcal/mol cutoff, missing positive controls, blind-docking accuracy tests
- Diao X, et al. Rethinking network analysis in ethnopharmacology. Front Pharmacol, 2026 — Uniformity of core targets, pathways and compounds across 1,038 studies
- Reliability and reproducibility checklist for molecular dynamics simulations. Commun Biol, 2023 — Replicas, convergence evidence, system setup table and file sharing
- Genheden S, Ryde U. The MM/PBSA and MM/GBSA methods to estimate ligand-binding affinities. Expert Opin Drug Discov, 2015 — MM/PBSA accuracy, entropy, dielectric constant and ranking reliability
- gmx_MMPBSA documentation: input file and Interaction Entropy — Current defaults and the σIE criterion
- Buttenschoen M, et al. PoseBusters. Chem Sci, 2024 — Pose RMSD ≤ 2 Å criterion
- Wijesooriya K, et al. Urgent need for consistent standards in functional enrichment analysis. PLoS Comput Biol, 2022 — Share of analyses with background and correction problems
- Daina A, et al. SwissTargetPrediction: updated data and new features. Nucleic Acids Res, 2019 — Meaning of Probability and top-15 hit rate
- TCMSP portal and parameter page — Legacy and new version status, suggested OB/DL values and new default thresholds
- BATMAN-TCM 2.0. Nucleic Acids Res, 2024 — Numbers of known and predicted compound-target interactions
- HERB 2.0. Nucleic Acids Res, 2025 — Curation of clinical trials and meta-analyses
- The STRING database in 2025. Nucleic Acids Res, 2025 — STRING 12.5; meaning of the combined score at string-db.org/cgi/info
- DisGeNET support: data visible with a free academic license — Free accounts include curated data only
- Sobereva: How to judge whether an MD simulation has equilibrated (in Chinese) — Experience post: RMSD fitting and running averages for judging equilibration
- CSDN: Network pharmacology quick workflow (in Chinese) — Experience post: common cutoffs for GeneCards, SwissTargetPrediction, PharmMapper and STRING
- Tencent Cloud Developer Community: Disease targets and overlap with herb targets (in Chinese) — Experience post: confirm the MeSH disease name first; R script for merging several databases
- Jianshu: Disease targets from GeneCards (in Chinese) — Experience post: GeneCards filtering at the median or 2 × median
- UniProt help: Programmatic access – Retrieving entries via queries — Downloading human reviewed entries via REST (organism_id:9606 AND reviewed:true)
- CSDN: converting TCMSP targets to symbols with UniProt (Chinese) — Experience post: R script that scrapes TCMSP targets and matches several protein-name variants against the UniProt reviewed table
- CSDN: herb-compound-target and PPI networks in Cytoscape 3.8.2 (Chinese) — Experience post: fixing Could not initialize preview, isolated nodes and gene-name correction
- CSDN: getting started with herb compound-target networks in Cytoscape (Chinese) — Experience post: save as CSV UTF-8, keep gene-name case consistent