code: def bb_embs(self, X):
      # X should be a num_residues x 3 x 3, order N, C-alpha, and C atoms of each residue
      # N coords: X[:,0,:]
      # CA coords: X[:,1,:]
      # C coords: X[:,2,:]
      # return num_residues x 6
      # From https://github.com/jingraham/neurips19-graph-protein-design
  
      X = torch.reshape(X, [3 * X.shape[0], 3])
      dX = X[1:] - X[:-1]
      U = self._normalize(dX, dim=-1)
      u0 = U[:-2]
      u1 = U[1:-1]
      u2 = U[2:]
  
      angle = self.compute_dihedrals(u0, u1, u2)
  
      # add phi[0], psi[-1], omega[-1] with value 0
      angle = F.pad(angle, [1, 2])
      angle = torch.reshape(angle, [-1, 3])
      angle_features = torch.cat(
          [torch.cos(angle), torch.sin(angle)], 1
      )
      return angle_features
  
imports: import os.path
  import h5py
  import numpy
  import warnings
  from tqdm import tqdm
  import torch
  import torch.nn.functional
  from torch_geometric.data import Data
  from torch_geometric.data import InMemoryDataset
label_desc: Use image node_id 8 for calling the ECdataset obj's underlying member method code with example usage: obj.bb_embs(X) and returns: angle_features