Hi Whitney,
I deliberately skipped the details on calculating bp-reference frame when writing that part of
the manual for two reasons: (1) it is identical to the procedure used for the step "middle-frame"; (2) it gives serious users like you an opportunity to figure it out (normal users won't bother tech part anyway). In my experience, this is the best way to have a clear understanding of the mathematics under 3DNA -- which is actually quite simple.
For your verification, the bp frame origin is the direct average of the two bases forming the pair. The bp z-axis is actually the averaged and normalized vector of the two base z-axes.
This is not the case for bp x- and y-axes.AG1_o = [15.1632 -0.0362 -4.4678]
AG1_z = [-0.4004 0.4012 0.8238]
BC8_o = [14.9124 0.2803 -4.7498]
BC8_z = [-0.3422 0.5326 0.7741]
bp_o = mean([AG1_o; BC8_o])
% ====> 15.03780 0.12205 -4.60880
zave = mean([AG1_z; BC8_z])
% =====> -0.37130 0.46690 0.79895
bp_z = zave / norm(zave)
% =====> -0.37239 0.46826 0.80128
stagger = dot(AG1_o - BC8_o, bp_z)
% =====> -0.015638
I am using Matlab (octave) syntax for illustration. In 3DNA, the bp z-axis is calculated along with bp x- and y-axes after symmetrically rotating the two base frames along the buckle-propeller hinge axis. Please have a try and hopefully you would post back step-by-step how you proceed to clarify your own understanding and for the benefit of other 3DNA users.
HTH,
Xiang-Jun