You are here

Enzyme Design FlexBB Protocol Bug: DNA/RNA handling

2 posts / 0 new
Last post
Enzyme Design FlexBB Protocol Bug: DNA/RNA handling

Hi Folks,

I've been playing with the enzyme design binary application using enzymes containing DNA or RNA in the pose. The FlexBB protocol can be activated by setting the flag '-enzdes:flexbb_protocol true'. If no loop file is provided via the flag '-enz_loops_file <file>' the default  protocol behavior is to iterate through the pose to identify flexible regions in the structure for loop design. I found that having either DNA /RNA  in the pose triggers the following error consistently after cst minimization. 

"protocols.enzdes.EnzdesFlexBBProtocol: Determining regions to be treated as flexible... 
core.chemical.ResidueType: [ ERROR ] atom name :  N   not available in residue ADE:LowerDNA:VirtualDNAPhosphate
core.chemical.ResidueType: [ ERROR ] 'HO5'' 0xfc544d8
core.chemical.ResidueType: [ ERROR ] 

ERROR: unknown atom_name: ' N  '  in residue ADE:LowerDNA:VirtualDNAPhosphate
ERROR:: Exit from: /scratch/benchmark/W.hojo-2/rosetta.Hojo-2/_commits_/main/source/src/core/chemical/ line: 4070"

This was a rather curious error, as the DNA chain should not be included in the flexible backbone design at all... I then did some investigation into the code behind the FlexBB design protocol (, specifically the function determine_flexible_regions(), the code called in the protocol preceding the error. This function iterates through the pose to identify flexible regions in the structure for loop design, and constucts a bool vector specifying flexible positions.

In line 619 of, the code conditionally assigns a residue position as flexible:

       if ( ( task->design_residue( i ) || is_catalytic_position( pose, i ) ) && pose.residue(i).is_polymer() ) flex_res[i] = true;

The boolean evaluator function .is_polymer() will evaluate DNA  or RNA (which are  polymer type) and inadvertently include these residues in subsequent protocol steps where the above error orginates. It seems that the developers did not anticipate this particular use case...  Regardless, it is far more general to evaluate the residue with the boolean evaluator .is_protein(). 

      if ( ( task->design_residue( i ) || is_catalytic_position( pose, i ) ) && pose.residue(i).is_protein() ) flex_res[i] = true;

In line 627,  a seperate conditional evaluation also contains this assumption:

    if ( flex_res[i] && !pose.residue(i).is_polymer() ) {

I again suggest the following change:

    if ( flex_res[i] && !pose.residue(i).is_protein() ) {


I made the above modifications to my local copy of and recompiled the Enzyme Design applications. I was pleased to find this resolved the bug. 

FYI I am currently running Rosetta version: 2019.22



Post Situation: 
Fri, 2019-06-14 14:16

Thanks for the bug report.

The Enzdes FlexBB protocol hasn't gotten much attention in recent years, and I'm not sure if it was ever written with consideration of DNA/RNA. (This is an all too common failing of Rosetta protocols - they're not necessarily written to be robust to use cases outside of the narrow region their originator imagined.)

Mon, 2019-06-24 13:46