# Class structure

- Defined in File model.hpp

## Class Documentation

class structure

  A structure is the combination of polymers, ligand and sugar branches found in the mmCIF file. This will always contain one model, the first model is taken if not otherwise specified.

  Public Functions

  structure(file &p, std::size_t modelNr = 1, structure_open_options options = {})

    Read the structure from cif::file p.

  structure(datablock &db, std::size_t modelNr = 1, structure_open_options options = {})

    Load the structure from already parsed mmCIF data in db.

  structure(const structure&) = delete
  structure &operator=(const structure&) = delete
  ~structure() = default
  inline std::size_t get_model_nr() const

    Return the model number.

  inline const std::vector<atom> &atoms() const

    Return a list of all the atoms in this structure.

  EntityType get_entity_type_for_entity_id(const std::string entityID) const

    Return the entity type for the entity with id entity_id.

  EntityType get_entity_type_for_asym_id(const std::string asymID) const

    Return the entity type for the asym with id asym_id.

  inline const std::list<polymer> &polymers() const

    Return the list of polymers.

  inline std::list<polymer> &polymers()

    Return the list of polymers.

  polymer &get_polymer_by_asym_id(const std::string &asymID)

    Return the polymer having asym ID asymID.

  inline const polymer &get_polymer_by_asym_id(const std::string &asymID) const

    < Return the polymer having asym ID asymID

  inline const std::list<branch> &branches() const

    Return the list of all branches.

  inline std::list<branch> &branches()

    Return the list of all branches.

  branch &get_branch_by_asym_id(const std::string &asymID)

    Return the branch having asym ID asymID.

  const branch &get_branch_by_asym_id(const std::string &asymID) const

    Return the branch having asym ID asymID.

  inline const std::vector<residue> &non_polymers() const

    Return the list of non-polymers, actually the list of ligands.

  bool has_atom_id(const std::string &id) const

    Return true if an atom with ID id exists in this structure.

  atom get_atom_by_id(const std::string &id) const

    Return the atom with ID id.

  atom get_atom_by_label(const std::string &atomID, const std::string &asymID, const std::string &compID, int seqID, const std::string &altID = "")

    Return the atom identified by the label_ values specified.

  atom get_atom_by_position(point p) const

    Return the atom closest to point p.

  atom get_atom_by_position_and_type(point p, std::string_view type, std::string_view res_type) const

    Return the atom closest to point p with atom type type in a residue of type res_type.

  residue &create_residue(const std::vector<atom> &atoms)

    Create a non-poly residue based on atoms already present in this structure.

  inline residue &get_residue(const std::string &asymID)

    Get a non-poly residue for an asym with id asymID.

  inline const residue &get_residue(const std::string &asymID) const

    Get a non-poly residue for an asym with id asymID.

  residue &get_residue(const std::string &asymID, int seqID, const std::string &authSeqID)

    Get a residue for an asym with id asymID seq id seqID and authSeqID authSeqID.

  inline const residue &get_residue(const std::string &asymID, int seqID, const std::string &authSeqID) const

    Get a the single residue for an asym with id asymID seq id seqID and authSeqID authSeqID.

  residue &get_residue(const std::string &asymID, const std::string &compID, int seqID, const std::string &authSeqID)

    Get a residue for an asym with id asymID, compound id compID, seq id seqID and authSeqID authSeqID.

  inline const residue &get_residue(const std::string &asymID, const std::string &compID, int seqID, const std::string &authSeqID) const

    Get a residue for an asym with id asymID, compound id compID, seq id seqID and authSeqID authSeqID.

  inline residue &get_residue(const atom &atom)

    Get a the residue for atom atom.

  inline const residue &get_residue(const atom &atom) const

    Get a the residue for atom atom.

  inline void remove_atom(atom &a)

    Remove atom a.

  void swap_atoms(atom a1, atom a2)

    swap the labels for these atoms

  void move_atom(atom a, point p)

    move atom to a new location

  void change_residue(residue &res, const std::string &newcompound, const std::vector<std::tuple<std::string, std::string>> &remappedAtoms)

    Change residue res to a new compound ID optionally remapping atoms.

    A new chem_comp entry as well as an entity is created if needed and if the list of remappedAtoms is not empty it is used to remap.

    The array in remappedAtoms contains tuples of strings, both strings contain an atom_id. The first is the one in the current residue and the second is the atom_id that should be used instead. If the second string is empty, the atom is removed from the residue.

    Parameters:

      - res –

      - newcompound –

      - remappedAtoms –

  void remove_residue(const std::string &asym_id, int seq_id, const std::string &auth_seq_id)

    Remove a residue, can be monomer or nonpoly.

    Parameters:

      - asym_id – The asym ID

      - seq_id – The sequence ID

      - auth_seq_id – The auth sequence ID

  std::string create_non_poly_entity(const std::string &mon_id)

    Create a new non-polymer entity, returns new ID.

    Parameters:

      mon_id – The mon_id for the new nonpoly, must be an existing and known compound from CCD

    Returns:

      The ID of the created entity

  std::string create_non_poly(const std::string &entity_id, const std::vector<atom> &atoms)

    Create a new NonPolymer struct_asym with atoms constructed from atoms, returns asym_id. This method assumes you are copying data from one cif file to another.

    Parameters:

      - entity_id – The entity ID of the new nonpoly

      - atoms – The array of atom_site rows containing the data.

    Returns:

      The newly create asym ID

  std::string create_non_poly(const std::string &entity_id, std::vector<row_initializer> atoms)

    Create a new NonPolymer struct_asym with atoms constructed from info in atom_info, returns asym_id. This method creates new atom records filled with info from the info.

    Parameters:

      - entity_id – The entity ID of the new nonpoly

      - atoms – The array of sets of item data containing the data for the atoms.

    Returns:

      The newly create asym ID

  std::string create_non_poly(const std::string &compound_id, bool skip_hydrogen)

    Create a new NonPolymer struct_asym for a compound of type compound_id, returns asym_id. This method creates new atom records filled with info from the CCD compound info.

    Parameters:

      - compound_id – The compound ID of the new nonpoly

      - skip_hydrogen – Do not create hydrogen atoms when true

    Returns:

      The newly create asym ID

  void create_water(row_initializer atom)

    Create a new water with atom constructed from info in atom_info This method creates a new atom record filled with info from the info.

    Parameters:

      atom – The set of item data containing the data for the atoms.

  std::string create_link(atom a1, atom a2, const std::string &link_type, const std::string &role)

    Create a link, a struct_conn record for two atoms.

    Parameters:

      - a1 – Atom 1

      - a2 – Atom 2

      - link_type – The struct_conn_type ID for the link

      - role – The pdbx_role field value

    Returns:

      The ID of the struct_conn record created

  branch &create_branch()

    Create a new and empty (sugar) branch.

  void remove_branch(branch &branch)

    Remove branch.

  void remove_residue(residue &res)

    Remove residue res.

    Parameters:

      res – The residue to remove

  void translate(point t)

    Translate the coordinates of all atoms in the structure by t.

  void rotate(quaternion t)

    Rotate the coordinates of all atoms in the structure by q.

  void translate_and_rotate(point t, quaternion q)

    Translate and rotate the coordinates of all atoms in the structure by t and q.

  void translate_rotate_and_translate(point t1, quaternion q, point t2)

    Translate, rotate and translate again the coordinates of all atoms in the structure by t1 , q and t2.

  void cleanup_empty_categories()

    Remove all categories that have no rows left.

  inline category &get_category(std::string_view name) const

    Direct access to underlying data.

  inline datablock &get_datablock() const

    Direct access to underlying data.

  void validate_atoms() const

    Check if all atoms are part of either a polymer, a branch or one of the non-polymer residues.

  template<typename ...Args>
  inline atom &emplace_atom(Args&... args)

    emplace a newly created atom using args

  atom &emplace_atom(atom &&atom)

    emplace the moved atom atom

  void reorder_atoms()

    Reorder atom_site atoms based on ‘natural’ ordering.