Protein structure analysis
One PDB entry yields different residue counts, interface lists and hydrogen-bond totals depending on how waters, HETATM records, alternate locations and symmetry copies were treated. Those choices, and every distance or angle cutoff, are part of the result and are reported with it.
Files and identity
- Prefer PDBx/mmCIF over the legacy PDB format: PDB files break above 99,999 atoms and
62 chains, truncate chain IDs to one character and have no entity concept. Download
https://files.rcsb.org/download/<id>.cifor use BiopythonPDBList().retrieve_pdb_file("1abc", pdir=".", file_format="mmCif"). Record the entry id, the model used (NMR ensembles have many; state the index) and the download date. - Chains and entities: mmCIF has
label_asym_id(internal chain),auth_asym_id(the author chain that papers and viewers use) andlabel_entity_id; a homodimer is one entity with two chains. Residue numbering isauth_seq_id(author numbering with gaps, insertion codes and negatives) orlabel_seq_id(1..n over the entity sequence). UniProt numbering is a third scheme, mapped by SIFTS. Say which one every residue number in the report follows. - HETATM policy: ligands, ions, modified residues inside the polymer (MSE, SEP, TPO) and
waters (HOH, DOD) are all HETATM. Decide and state whether waters are removed, ions
kept, and modified residues counted as protein. Biopython encodes this in
residue.id[0](" "standard,"W"water,"H_XXX"hetero) andBio.PDB.Polypeptide.is_aa(res, standard=True); gemmi offersst.remove_waters(),st.remove_ligands_and_waters(),st.remove_hydrogens()andResidue.het_flag. Callst.setup_entities()after reading PDB files with gemmi. - Alternate locations: pick one conformer consistently. Biopython's
PDBParserwraps them inDisorderedAtomobjects that default to the highest occupancy (atom.is_disordered()); gemmist.remove_alternative_conformations()keeps the first; MDAnalysis selects withaltloc A. Counting all altlocs doubles some contacts. - Insertion codes: a Biopython residue id is
(hetflag, resseq, icode), so 52 and 52A are distinct residues; parsing the number alone merges them. Antibody numbering schemes rely on them. - Assemblies: the asymmetric unit may hold half a dimer or two copies of a monomer. The
biological assembly applies the operators in
_pdbx_struct_assembly(REMARK 350). gemmi:gemmi.make_assembly(st.assemblies[0], st[0], gemmi.HowToNameCopiedChain.AddNumber)orst.transform_to_assembly("1", how); PyMOLset assembly, 1beforefetch; ChimeraXsym #1 assembly 1; RCSB serves<id>-assembly1.cif. Interfaces across symmetry mates exist only in the assembly. Report which assembly, or that the asymmetric unit was used. - Hydrogens: crystal structures rarely include them. Angle-based hydrogen-bond criteria
need added hydrogens (PDBFixer or OpenMM
Modeller.addHydrogens, PyMOLh_add, ChimeraXaddh); heavy-atom-only criteria are the alternative. State which.
Criteria
- Hydrogen bonds: heavy-atom donor-acceptor distance <= 3.5 angstroms is the common loose
criterion, 3.2 or 3.0 strict; with hydrogens, D-H...A angle >= 120 degrees loose or
= 150 strict. MDAnalysis
HydrogenBondAnalysisdefaults tod_a_cutoff=3.0andd_h_a_angle_cutoff=150; ChimeraXhbondsapplies Mills and Dean geometric criteria with defaultdistSlop 0.4andangleSlop 20tolerances; PyMOLdistance ..., mode=2uses a 3.5 angstrom default cutoff with its own polar-contact heuristics. Counts from different tools are not comparable; always name tool, version and numbers. - Interface residues by distance: any heavy atom within 4.0 angstroms of the partner
chain (5.0 is the generous variant). Biopython
NeighborSearch(atoms).search_all(4.0, level="R"); gemmiNeighborSearch(st[0], st.cell, 5).populate()withContactSearch(4.0)andignore = ContactSearch.Ignore.SameChain, which also finds contacts to symmetry images; MDAnalysisselect_atoms("chainID A and around 4.0 chainID B"). - Interface residues by solvent accessibility: a residue is interfacial when its SASA
drops on complexation (thresholds in use include > 0, > 1 square angstrom, and >= 5%).
Buried surface area BSA = SASA(A) + SASA(B) - SASA(AB); PDBePISA reports interface area
as BSA / 2, so say which convention a number follows. SASA with Shrake-Rupley and a
1.4 angstrom probe: Biopython
ShrakeRupley(probe_radius=1.4, n_points=100)fromBio.PDB.SASA, whose.compute(struct, level="R")fillsresidue.sasa; freesasa defaults to Lee-Richards; ChimeraXmeasure buriedarea #1/A withAtoms2 #1/Bandmeasure sasa; PyMOLset dot_solvent, 1thenget_area. Radii sets and point densities move SASA by a few percent. Remove waters and ligands first unless they are the question. - Secondary structure: DSSP through
Bio.PDB.DSSP(model, path, dssp="mkdssp")(DSSP 4 prefers mmCIF input); collapsing eight states to three (H, G, I to helix; E, B to strand; the rest to coil) is a convention to state. - Superposition and RMSD: report which atoms (CA only or all heavy), which residues
(aligned core or all), and whether the RMSD is after the fit. PyMOL
alignrejects outliers over five cycles and reports RMSD on the kept subset, so also giverms_curover all matched atoms;Bio.PDB.SuperimposerandMDAnalysis.analysis.rms.RMSDfit on exactly the atoms you pass.
Report
- Entry, assembly or asymmetric unit, model index, chains (author ids), numbering scheme.
- Altloc policy, HETATM and water policy, hydrogens added or not and by which tool.
- Every cutoff (distance, angle, SASA threshold, probe radius) with the tool and version.
- Counts at each filtering step, so a reader can see where residues went.
Sources
- wwPDB PDBx/mmCIF dictionary: https://mmcif.wwpdb.org/
- wwPDB legacy PDB format v3.3: https://www.wwpdb.org/documentation/file-format-content/format33/v3.3.html
- Biopython Bio.PDB tutorial: https://biopython.org/docs/latest/Tutorial/chapter_pdb.html
- gemmi documentation (molecular models, neighbor and contact search): https://gemmi.readthedocs.io/
- MDAnalysis hydrogen bond analysis: https://docs.mdanalysis.org/stable/documentation_pages/analysis/hydrogenbonds.html
- ChimeraX commands
hbonds,measure,sym: https://www.cgl.ucsf.edu/chimerax/docs/user/commands/ - PyMOL wiki (
align,distance,get_area,assembly): https://pymolwiki.org/ - PDBePISA interface conventions: https://www.ebi.ac.uk/pdbe/pisa/