code: def get_atom_pos(
      self, amino_types, atom_names, atom_amino_id, atom_pos
  ):
      # atoms to compute side chain torsion angles: N, CA, CB, _G/_G1, _D/_D1, _E/_E1, _Z, NH1
      mask_n = np.char.equal(atom_names, b"N")
      mask_ca = np.char.equal(atom_names, b"CA")
      mask_c = np.char.equal(atom_names, b"C")
      mask_cb = np.char.equal(atom_names, b"CB")
      mask_g = (
          np.char.equal(atom_names, b"CG")
          | np.char.equal(atom_names, b"SG")
          | np.char.equal(atom_names, b"OG")
          | np.char.equal(atom_names, b"CG1")
          | np.char.equal(atom_names, b"OG1")
      )
      mask_d = (
          np.char.equal(atom_names, b"CD")
          | np.char.equal(atom_names, b"SD")
          | np.char.equal(atom_names, b"CD1")
          | np.char.equal(atom_names, b"OD1")
          | np.char.equal(atom_names, b"ND1")
      )
      mask_e = (
          np.char.equal(atom_names, b"CE")
          | np.char.equal(atom_names, b"NE")
          | np.char.equal(atom_names, b"OE1")
      )
      mask_z = np.char.equal(atom_names, b"CZ") | np.char.equal(
          atom_names, b"NZ"
      )
      mask_h = np.char.equal(atom_names, b"NH1")
  
      pos_n = np.full((len(amino_types), 3), np.nan)
      pos_n[atom_amino_id[mask_n]] = atom_pos[mask_n]
      pos_n = torch.FloatTensor(pos_n)
  
      pos_ca = np.full((len(amino_types), 3), np.nan)
      pos_ca[atom_amino_id[mask_ca]] = atom_pos[mask_ca]
      pos_ca = torch.FloatTensor(pos_ca)
  
      pos_c = np.full((len(amino_types), 3), np.nan)
      pos_c[atom_amino_id[mask_c]] = atom_pos[mask_c]
      pos_c = torch.FloatTensor(pos_c)
  
      # if data only contain pos_ca, we set the position of C and N as the position of CA
      pos_n[torch.isnan(pos_n)] = pos_ca[torch.isnan(pos_n)]
      pos_c[torch.isnan(pos_c)] = pos_ca[torch.isnan(pos_c)]
  
      pos_cb = np.full((len(amino_types), 3), np.nan)
      pos_cb[atom_amino_id[mask_cb]] = atom_pos[mask_cb]
      pos_cb = torch.FloatTensor(pos_cb)
  
      pos_g = np.full((len(amino_types), 3), np.nan)
      pos_g[atom_amino_id[mask_g]] = atom_pos[mask_g]
      pos_g = torch.FloatTensor(pos_g)
  
      pos_d = np.full((len(amino_types), 3), np.nan)
      pos_d[atom_amino_id[mask_d]] = atom_pos[mask_d]
      pos_d = torch.FloatTensor(pos_d)
  
      pos_e = np.full((len(amino_types), 3), np.nan)
      pos_e[atom_amino_id[mask_e]] = atom_pos[mask_e]
      pos_e = torch.FloatTensor(pos_e)
  
      pos_z = np.full((len(amino_types), 3), np.nan)
      pos_z[atom_amino_id[mask_z]] = atom_pos[mask_z]
      pos_z = torch.FloatTensor(pos_z)
  
      pos_h = np.full((len(amino_types), 3), np.nan)
      pos_h[atom_amino_id[mask_h]] = atom_pos[mask_h]
      pos_h = torch.FloatTensor(pos_h)
  
      return (
          pos_n,
          pos_ca,
          pos_c,
          pos_cb,
          pos_g,
          pos_d,
          pos_e,
          pos_z,
          pos_h,
      )
  
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 6 for calling the ECdataset obj's underlying member method code with example usage: obj.get_atom_pos(amino_types, atom_names, atom_amino_id, atom_pos) and returns: pos_n,  pos_ca,  pos_c,  pos_cb,  pos_g,  pos_d,  pos_e,  pos_z,  pos_h