<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Protein Descriptors | Yassir Boulaamane</title>
    <link>https://yboulaamane.github.io/tags/protein-descriptors/</link>
      <atom:link href="https://yboulaamane.github.io/tags/protein-descriptors/index.xml" rel="self" type="application/rss+xml" />
    <description>Protein Descriptors</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Mon, 20 Jul 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://yboulaamane.github.io/media/icon_hu_4d696a8ace2a642b.png</url>
      <title>Protein Descriptors</title>
      <link>https://yboulaamane.github.io/tags/protein-descriptors/</link>
    </image>
    
    <item>
      <title>Protein Descriptors for Machine Learning in Drug Discovery</title>
      <link>https://yboulaamane.github.io/blog/protein-descriptors/</link>
      <pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://yboulaamane.github.io/blog/protein-descriptors/</guid>
      <description>&lt;p&gt;When you&amp;rsquo;re modeling protein-ligand binding or reactivity, one of the first decisions is what to actually compute as a protein feature. The options range from a single vector derived from the amino acid sequence to a full ensemble of structural and interaction features extracted from molecular dynamics. Picking the wrong level of detail either throws away information the model needs, or buries it in noise the model can&amp;rsquo;t use.&lt;/p&gt;
&lt;p&gt;The descriptors below split into three fundamentally different categories depending on what inputs they require and how they respond to target movement:&lt;/p&gt;

&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 850 380&#34; width=&#34;100%&#34; height=&#34;100%&#34;&gt;
  &lt;defs&gt;
    &lt;!-- Gradients --&gt;
    &lt;linearGradient id=&#34;seqGrad&#34; x1=&#34;0%&#34; y1=&#34;0%&#34; x2=&#34;100%&#34; y2=&#34;100%&#34;&gt;
      &lt;stop offset=&#34;0%&#34; stop-color=&#34;#3B82F6&#34; /&gt;
      &lt;stop offset=&#34;100%&#34; stop-color=&#34;#1D4ED8&#34; /&gt;
    &lt;/linearGradient&gt;
    &lt;linearGradient id=&#34;strGrad&#34; x1=&#34;0%&#34; y1=&#34;0%&#34; x2=&#34;100%&#34; y2=&#34;100%&#34;&gt;
      &lt;stop offset=&#34;0%&#34; stop-color=&#34;#10B981&#34; /&gt;
      &lt;stop offset=&#34;100%&#34; stop-color=&#34;#047857&#34; /&gt;
    &lt;/linearGradient&gt;
    &lt;linearGradient id=&#34;cpxGrad&#34; x1=&#34;0%&#34; y1=&#34;0%&#34; x2=&#34;100%&#34; y2=&#34;100%&#34;&gt;
      &lt;stop offset=&#34;0%&#34; stop-color=&#34;#8B5CF6&#34; /&gt;
      &lt;stop offset=&#34;100%&#34; stop-color=&#34;#6D28D9&#34; /&gt;
    &lt;/linearGradient&gt;
    &lt;filter id=&#34;shadow&#34; x=&#34;-5%&#34; y=&#34;-5%&#34; width=&#34;110%&#34; height=&#34;110%&#34;&gt;
      &lt;feDropShadow dx=&#34;1&#34; dy=&#34;3&#34; stdDeviation=&#34;3&#34; flood-opacity=&#34;0.1&#34; /&gt;
    &lt;/filter&gt;
  &lt;/defs&gt;

  &lt;style&gt;
    .header-text { font-family: &#39;Inter&#39;, system-ui, sans-serif; font-weight: 800; font-size: 20px; fill: #111827; }
    .col-title { font-family: &#39;Inter&#39;, system-ui, sans-serif; font-weight: 700; font-size: 14px; fill: #FFFFFF; }
    .col-subtitle { font-family: &#39;Inter&#39;, system-ui, sans-serif; font-weight: 500; font-size: 11px; fill: #E0E7FF; }
    .item-title { font-family: &#39;Inter&#39;, system-ui, sans-serif; font-weight: 700; font-size: 12px; fill: #1F2937; }
    .item-desc { font-family: &#39;Inter&#39;, system-ui, sans-serif; font-size: 11px; fill: #4B5563; }
    .card-bg { fill: #FFFFFF; stroke: #E5E7EB; stroke-width: 1px; }
  &lt;/style&gt;

  &lt;!-- Background --&gt;
  &lt;rect width=&#34;850&#34; height=&#34;380&#34; fill=&#34;#F9FAFB&#34; rx=&#34;12&#34; /&gt;

  &lt;text x=&#34;30&#34; y=&#34;35&#34; class=&#34;header-text&#34;&gt;Protein Descriptor Landscape for Machine Learning Modeling&lt;/text&gt;

  &lt;!-- COLUMN 1: Sequence-based --&gt;
  &lt;g transform=&#34;translate(30, 60)&#34; filter=&#34;url(#shadow)&#34;&gt;
    &lt;!-- Header Card --&gt;
    &lt;rect width=&#34;240&#34; height=&#34;290&#34; rx=&#34;8&#34; class=&#34;card-bg&#34; /&gt;
    &lt;path d=&#34;M 0 8 Q 0 0, 8 0 L 232 0 Q 240 0, 240 8 L 240 50 L 0 50 Z&#34; fill=&#34;url(#seqGrad)&#34; /&gt;
    &lt;text x=&#34;15&#34; y=&#34;25&#34; class=&#34;col-title&#34;&gt;1. Sequence-Based&lt;/text&gt;
    &lt;text x=&#34;15&#34; y=&#34;40&#34; class=&#34;col-subtitle&#34;&gt;Invariant (computed once per protein)&lt;/text&gt;
    
    &lt;!-- Items --&gt;
    &lt;g transform=&#34;translate(15, 60)&#34;&gt;
      &lt;!-- Item A --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;11&#34; r=&#34;3&#34; fill=&#34;#3B82F6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;15&#34; class=&#34;item-title&#34;&gt;Classical Sequence Metrics&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;32&#34; class=&#34;item-desc&#34;&gt;AA Composition, PAAC, CTD descriptors&lt;/text&gt;

      &lt;!-- Item B --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;66&#34; r=&#34;3&#34; fill=&#34;#3B82F6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;70&#34; class=&#34;item-title&#34;&gt;Evolutionary Profiles&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;87&#34; class=&#34;item-desc&#34;&gt;PSSM profiles from sequence alignments&lt;/text&gt;
      
      &lt;!-- Item C --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;121&#34; r=&#34;3&#34; fill=&#34;#3B82F6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;125&#34; class=&#34;item-title&#34;&gt;Protein Language Models&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;142&#34; class=&#34;item-desc&#34;&gt;ESM, ProtBERT, UniRep embeddings&lt;/text&gt;

      &lt;!-- Item D --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;176&#34; r=&#34;3&#34; fill=&#34;#3B82F6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;180&#34; class=&#34;item-title&#34;&gt;Mutation Indicators&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;197&#34; class=&#34;item-desc&#34;&gt;Binary flags mapping catalytic mutations&lt;/text&gt;
    &lt;/g&gt;
  &lt;/g&gt;

  &lt;!-- COLUMN 2: Structure-based --&gt;
  &lt;g transform=&#34;translate(305, 60)&#34; filter=&#34;url(#shadow)&#34;&gt;
    &lt;!-- Header Card --&gt;
    &lt;rect width=&#34;240&#34; height=&#34;290&#34; rx=&#34;8&#34; class=&#34;card-bg&#34; /&gt;
    &lt;path d=&#34;M 0 8 Q 0 0, 8 0 L 232 0 Q 240 0, 240 8 L 240 50 L 0 50 Z&#34; fill=&#34;url(#strGrad)&#34; /&gt;
    &lt;text x=&#34;15&#34; y=&#34;25&#34; class=&#34;col-title&#34;&gt;2. Structure-Based&lt;/text&gt;
    &lt;text x=&#34;15&#34; y=&#34;40&#34; class=&#34;col-subtitle&#34;&gt;State-Dependent (needs 3D structure)&lt;/text&gt;
    
    &lt;!-- Items --&gt;
    &lt;g transform=&#34;translate(15, 60)&#34;&gt;
      &lt;!-- Item A --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;11&#34; r=&#34;3&#34; fill=&#34;#10B981&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;15&#34; class=&#34;item-title&#34;&gt;Pocket Geometry&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;32&#34; class=&#34;item-desc&#34;&gt;Pocket volume, CAVER bottleneck radius&lt;/text&gt;

      &lt;!-- Item B --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;66&#34; r=&#34;3&#34; fill=&#34;#10B981&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;70&#34; class=&#34;item-title&#34;&gt;Internal Distances&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;87&#34; class=&#34;item-desc&#34;&gt;Fe-to-residue and Cα-Cα distances&lt;/text&gt;
      
      &lt;!-- Item C --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;121&#34; r=&#34;3&#34; fill=&#34;#10B981&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;125&#34; class=&#34;item-title&#34;&gt;Secondary Structure&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;142&#34; class=&#34;item-desc&#34;&gt;Backbone φ/ψ, loop folding (DSSP)&lt;/text&gt;

      &lt;!-- Item D --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;176&#34; r=&#34;3&#34; fill=&#34;#10B981&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;180&#34; class=&#34;item-title&#34;&gt;Fluctuations (RMSF)&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;197&#34; class=&#34;item-desc&#34;&gt;Residue-level movement in MD snapshots&lt;/text&gt;
    &lt;/g&gt;
  &lt;/g&gt;

  &lt;!-- COLUMN 3: Complex-based --&gt;
  &lt;g transform=&#34;translate(580, 60)&#34; filter=&#34;url(#shadow)&#34;&gt;
    &lt;!-- Header Card --&gt;
    &lt;rect width=&#34;240&#34; height=&#34;290&#34; rx=&#34;8&#34; class=&#34;card-bg&#34; /&gt;
    &lt;path d=&#34;M 0 8 Q 0 0, 8 0 L 232 0 Q 240 0, 240 8 L 240 50 L 0 50 Z&#34; fill=&#34;url(#cpxGrad)&#34; /&gt;
    &lt;text x=&#34;15&#34; y=&#34;25&#34; class=&#34;col-title&#34;&gt;3. Complex-Based&lt;/text&gt;
    &lt;text x=&#34;15&#34; y=&#34;40&#34; class=&#34;col-subtitle&#34;&gt;Interaction-Dependent (needs complex)&lt;/text&gt;
    
    &lt;!-- Items --&gt;
    &lt;g transform=&#34;translate(15, 60)&#34;&gt;
      &lt;!-- Item A --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;11&#34; r=&#34;3&#34; fill=&#34;#8B5CF6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;15&#34; class=&#34;item-title&#34;&gt;Reactant Geometry&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;32&#34; class=&#34;item-desc&#34;&gt;Fe-C distance, reactant angles, SASA&lt;/text&gt;

      &lt;!-- Item B --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;66&#34; r=&#34;3&#34; fill=&#34;#8B5CF6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;70&#34; class=&#34;item-title&#34;&gt;Interaction Fingerprints&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;87&#34; class=&#34;item-desc&#34;&gt;PLIP, BINANA contacts (H-bonds, π-stack)&lt;/text&gt;
      
      &lt;!-- Item C --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;121&#34; r=&#34;3&#34; fill=&#34;#8B5CF6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;125&#34; class=&#34;item-title&#34;&gt;PLEC Fingerprints&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;142&#34; class=&#34;item-desc&#34;&gt;Protein-ligand extended connectivity&lt;/text&gt;

      &lt;!-- Item D --&gt;
      &lt;circle cx=&#34;5&#34; cy=&#34;176&#34; r=&#34;3&#34; fill=&#34;#8B5CF6&#34; /&gt;
      &lt;text x=&#34;15&#34; y=&#34;180&#34; class=&#34;item-title&#34;&gt;Refinement Metrics&lt;/text&gt;
      &lt;text x=&#34;15&#34; y=&#34;197&#34; class=&#34;item-desc&#34;&gt;MMPBSA binding energies &amp;amp; QM/MM&lt;/text&gt;
    &lt;/g&gt;
  &lt;/g&gt;
&lt;/svg&gt;


&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Invariant (sequence-only):&lt;/strong&gt; Computed once per protein, identical across every conformation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State-dependent (structure/MD):&lt;/strong&gt; Change from one snapshot to the next, and only exist once you have a structure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex-dependent (interaction):&lt;/strong&gt; Require a bound ligand complex, changing with conformation and ligand pose.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The practical recipe that falls out of this split: use sequence descriptors as your base feature layer, then add per-snapshot structural and interaction features on top, aggregated across the MD ensemble (mean, std, percentiles, occupancies) rather than taken from a single frame.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-sequence-based-descriptors-invariant-across-md-snapshots&#34;&gt;1. Sequence-based descriptors (invariant across MD snapshots)&lt;/h2&gt;
&lt;p&gt;These only need the amino acid sequence, so they&amp;rsquo;re cheap and don&amp;rsquo;t change no matter which conformation you&amp;rsquo;re looking at.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AAindex / Z-scales:&lt;/strong&gt; Physicochemical traits per residue (hydrophobicity, polarity, volume), compressed into a small set of scales.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BioVec / ProtVec:&lt;/strong&gt; Embeddings that capture local sequence context and motifs, similar in spirit to word2vec.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PSSM:&lt;/strong&gt; Evolutionary conservation pulled from multiple target sequence alignments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AA Composition (AAComp), CTD (CTDC/CTDT/CTDD), PAAC:&lt;/strong&gt; Classical composition and order-aware descriptors, covered in detail below.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deep protein language models (PLMs):&lt;/strong&gt; UniRep, ESM, ProtBERT/ProtT5, and AlphaFold2 embeddings. These are dense numerical vectors encoding biochemical and structural information straight from the raw sequence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Protein LM embeddings in particular are useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-species and cross-target generalization.&lt;/li&gt;
&lt;li&gt;Substrate/inhibitor specificity classification.&lt;/li&gt;
&lt;li&gt;Transfer learning for low-data enzymes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mutation indicators&lt;/strong&gt;, a related but separate idea, are binary vectors flagging known catalytic or binding-site mutations. They&amp;rsquo;re also invariant per variant, so they belong in this same base layer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-structure-based-descriptors-change-with-conformation&#34;&gt;2. Structure-based descriptors (change with conformation)&lt;/h2&gt;
&lt;p&gt;These need at least one 3D structure, and they shift from snapshot to snapshot in an MD trajectory.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Secondary structure content, especially in loops around the active site.&lt;/li&gt;
&lt;li&gt;Backbone $\phi$/$\psi$ angle distributions.&lt;/li&gt;
&lt;li&gt;Distances describing access channels and gates.&lt;/li&gt;
&lt;li&gt;Pocket geometry: volume and bottleneck radius.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-complex-based-descriptors-need-a-protein-ligand-structure&#34;&gt;3. Complex-based descriptors (need a protein-ligand structure)&lt;/h2&gt;
&lt;p&gt;These require a bound complex, not just a protein structure on its own.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interaction fingerprints (IFPs):&lt;/strong&gt; H-bonds, $\pi$-stacking, cation-$\pi$, hydrophobics, and salt bridges (e.g., PLIP, BINANA, ODDT).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PLEC fingerprints&lt;/strong&gt; &lt;em&gt;(protein-ligand extended connectivity)&lt;/em&gt;: Encode local atom environments for protein-ligand contacts within a cutoff. Useful for virtual screening, affinity prediction, and QSAR on docked or MD complexes, but not applicable to sequence-only modeling.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;A related idea worth flagging:&lt;/strong&gt; &lt;strong&gt;Prot2Drug&lt;/strong&gt;, a transformer decoder that generates ligands directly from protein sequence embeddings. It is validation that sequence-only drug-target interaction (DTI) pipelines can generalize to unseen proteins.&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;propy3-a-practical-toolkit-for-sequence-descriptors&#34;&gt;Propy3: a practical toolkit for sequence descriptors&lt;/h2&gt;
&lt;p&gt;Propy3 computes the classical sequence descriptor families referenced above. Here&amp;rsquo;s what each one actually encodes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Amino Acid Composition (AAComp) - 20 descriptors:&lt;/strong&gt; Fraction of each amino acid in the sequence. Global composition, no order information.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CTD descriptors (Composition-Transition-Distribution) - 147 descriptors:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;CTDC (Composition) - 21:&lt;/em&gt; Physicochemical class composition (hydrophobicity, volume, polarity, etc.).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CTDT (Transition) - 21:&lt;/em&gt; Transition frequencies between classes, adding simple order information.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CTDD (Distribution) - 105:&lt;/em&gt; Positions of class occurrences along the sequence (1/25/50/75/100%).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pseudo amino acid composition (PAAC) - 30 descriptors:&lt;/strong&gt; Adds correlation factors on top of composition to capture local sequence-order effects.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;which-of-these-to-actually-keep-for-binding-modeling&#34;&gt;Which of these to actually keep for binding modeling&lt;/h3&gt;
&lt;p&gt;Not all five families pull equal weight. Here&amp;rsquo;s the practical call:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Descriptor Type&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Keep?&lt;/th&gt;
          &lt;th&gt;Why it&amp;rsquo;s relevant&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;CTDC&lt;/strong&gt; (Composition)&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ Yes&lt;/td&gt;
          &lt;td&gt;Hydrophobicity/charge/polarity classes relate to access and binding.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;CTDT&lt;/strong&gt; (Transition)&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ Yes&lt;/td&gt;
          &lt;td&gt;Local alternation between classes can reflect gates/channels.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;CTDD&lt;/strong&gt; (Distribution)&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;⚙️ Optional&lt;/td&gt;
          &lt;td&gt;Helpful if domain organization/length effects matter.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;PAAC&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ Strongly yes&lt;/td&gt;
          &lt;td&gt;Adds sequence-order correlations; often strong in ML baselines.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;AAComp&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;⚙️ Optional&lt;/td&gt;
          &lt;td&gt;Cheap baseline; limited site-level specificity.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PAAC and the CTD composition/transition families are the strongest sequence-only baseline. CTDD and raw AAComp are optional additions, worth including if you have the budget but not essential.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;layering-in-the-state-dependent-features-md--ensemble-descriptors&#34;&gt;Layering in the state-dependent features: MD / ensemble descriptors&lt;/h2&gt;
&lt;p&gt;Sequence descriptors (AAComp/CTD/PAAC) won&amp;rsquo;t move across MD snapshots, by construction. Everything that actually responds to conformation has to be computed per snapshot and then aggregated over the ensemble. For binding-relevant modeling, that means:&lt;/p&gt;
&lt;h3 id=&#34;active-site-geometry&#34;&gt;Active-site geometry&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Distance from ligand reaction site to catalytic center (e.g. metal atom or active site residue).&lt;/li&gt;
&lt;li&gt;Local pocket residues planarity; substrate centroid to active site center distance.&lt;/li&gt;
&lt;li&gt;Pocket volume / bottleneck radius (computed with tools like CAVER).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;access-and-flexibility&#34;&gt;Access and flexibility&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Loop opening distances around the pocket.&lt;/li&gt;
&lt;li&gt;RMSF per residue (loops around active site).&lt;/li&gt;
&lt;li&gt;Secondary structure fractions (DSSP) in those regions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;interactions-complex-aware&#34;&gt;Interactions (complex-aware)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IFPs:&lt;/strong&gt; H-bonds, $\pi$-stacking, cation-$\pi$, hydrophobics, and salt bridges (using PLIP/BINANA/ODDT).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PLEC fingerprints&lt;/strong&gt; computed per snapshot.&lt;/li&gt;
&lt;li&gt;Contact counts with key residues; water-mediated contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;surfaceelectrostatics&#34;&gt;Surface/electrostatics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SASA (protein, pocket, substrate, reactive atom).&lt;/li&gt;
&lt;li&gt;Pocket hydrophobicity; APBS potential at substrate.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;dynamics-summaries&#34;&gt;Dynamics summaries&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;% of frames meeting a catalytic cutoff (e.g., reaction site distance $&lt; 4.5\text{ \AA}$).&lt;/li&gt;
&lt;li&gt;Dwell times in &amp;quot;open/closed&amp;quot; channel states.&lt;/li&gt;
&lt;li&gt;MSM state probabilities (optional).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;a-practical-feature-blueprint-one-row-per-simulationcomplex&#34;&gt;A practical feature blueprint (one row per simulation/complex)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Data inputs:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Structure/MD: &lt;code&gt;top.pdb&lt;/code&gt;, &lt;code&gt;traj.xtc&lt;/code&gt; (or a single PDB).&lt;/li&gt;
&lt;li&gt;Selections: Active center atom (e.g., catalytic metal, or pocket centroid CA), ligand &lt;code&gt;LIG&lt;/code&gt;, pocket residues (within 6-8 Å of the pocket).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature blocks:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;3D shape (pocket-level):&lt;/em&gt; 3D Zernike moments on the pocket surface, aggregated over MD (mean $\pm$ std).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Geometry (explicit metrics):&lt;/em&gt; Distance from active center to reacting atom, ligand centroid to pocket reference plane, pocket volume/bottleneck, SASA, aggregated as mean/std/min/max plus % of frames meeting cutoffs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interactions:&lt;/em&gt; PLEC (cutoff ~4.5-5.0 Å) plus PLIP/BINANA contact types, aggregated by occupancy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output:&lt;/strong&gt; A single feature table (CSV/parquet) combining continuous descriptors with fingerprint occupancies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practical cutoffs and tips:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Analyze every 10-50 ps (thin the trajectory).&lt;/li&gt;
&lt;li&gt;Normalize continuous features ($z$-score).&lt;/li&gt;
&lt;li&gt;Reduce high-dimensional shape features with PCA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;code-computing-basic-geometry-features-with-mdanalysis&#34;&gt;Code: computing basic geometry features with MDAnalysis&lt;/h2&gt;
&lt;p&gt;Here is a minimal python starting point for computing reference distance and ligand-to-pocket-plane distance, thinned to every 10th frame:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;MDAnalysis&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;mda&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;numpy&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mda&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Universe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;top.pdb&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;traj.xtc&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Select reference atom in the active site (e.g., pocket center CA)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ref_atom&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;select_atoms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;protein and resid 102 and name CA&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;lig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;select_atoms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;resname LIG&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Select specific reacting ligand atom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;react_atom&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;select_atoms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name C1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Select pocket residues defining a local plane&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;plane_atoms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;select_atoms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;protein and name CA and (resid 90 or resid 95 or resid 100)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ts&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trajectory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[::&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# thin trajectory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 1. Reference distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;d_ref&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;linalg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;norm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ref_atom&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;position&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;react_atom&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;position&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 2. Ligand-to-pocket-plane distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;X&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;plane_atoms&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;positions&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;plane_atoms&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;positions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;linalg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;svd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;full_matrices&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# normal vector of the plane&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;plane_atoms&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;positions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;lc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;center_of_mass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;d_plane&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;abs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;frame&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;frame&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;d_ref&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;d_ref&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;d_plane&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;d_plane&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataFrame&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to_csv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;md_geom.csv&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;shape-descriptors-zernike-moments-vs-reomokage-feature-points&#34;&gt;Shape descriptors: Zernike moments vs ReOmokage feature points&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Method&lt;/th&gt;
          &lt;th&gt;Representation&lt;/th&gt;
          &lt;th&gt;Captures&lt;/th&gt;
          &lt;th&gt;Good for&lt;/th&gt;
          &lt;th&gt;Limitation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Zernike&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Mathematical expansion of 3D shape into orthogonal moments&lt;/td&gt;
          &lt;td&gt;Global + local surface geometry&lt;/td&gt;
          &lt;td&gt;ML descriptors, clustering, fast comparisons&lt;/td&gt;
          &lt;td&gt;Ignores absolute spatial alignment&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;ReOmokage&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Real 3D coordinates of key shape landmarks&lt;/td&gt;
          &lt;td&gt;Shape and spatial arrangement&lt;/td&gt;
          &lt;td&gt;Structural alignment, conformation similarity&lt;/td&gt;
          &lt;td&gt;Not ML-friendly (variable length, alignment-dependent)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The choice comes down to what you&amp;rsquo;re doing downstream: &lt;strong&gt;Zernike moments&lt;/strong&gt; feed cleanly into an ML pipeline, while &lt;strong&gt;ReOmokage-style landmarks&lt;/strong&gt; are better suited to structural alignment tasks where the actual spatial arrangement matters.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;key-takeaways&#34;&gt;Key Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Treat sequence descriptors&lt;/strong&gt; (PAAC, CTDC, CTDT as the core; CTDD, AAComp as optional) as the invariant base layer of any protein feature set.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layer structure- and interaction-based features&lt;/strong&gt; on top only when you have a structure or a bound complex, and compute them per MD snapshot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never take structural or interaction features from a single frame.&lt;/strong&gt; Aggregate over the ensemble (mean/std/percentiles/occupancies), since a single snapshot is a poor proxy for a dynamic active site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PLEC and IFP-style interaction fingerprints&lt;/strong&gt; are the highest-value additions when you have MD trajectories of a bound complex, since they capture exactly the contacts that a docking pose or a single crystal structure would miss.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
