_extractAtoms()

in packages/miew/src/io/parsers/CIFParser.js [242:331]


  _extractAtoms(complex, complexData) {
    const atomData = complexData.atom_site;
    if (!atomData) {
      throw new AtomDataError('CIF parsing error: atom_site is not specified!');
    }

    for (let f = 0, n = cRequiredAtomFields.length; f < n; ++f) {
      if (!atomData[cRequiredAtomFields[f]]) {
        throw new AtomDataError(`CIF parsing error: requires field ${cRequiredAtomFields[f]} not found!`);
      }
    }

    const { asymDict } = this;
    // required fields
    const resIdc = arrize(atomData.auth_seq_id);
    const x = arrize(atomData.Cartn_x);
    const y = arrize(atomData.Cartn_y);
    const z = arrize(atomData.Cartn_z);
    const names = arrize(atomData.label_atom_id);
    const count = names.length;
    // optional fields
    const group = arrize(atomData.group_PDB) || [];
    const chainIdc = arrize(atomData.auth_asym_id) || [];
    const chainLabelIdc = arrize(atomData.label_asym_id) || [];
    const serials = arrize(atomData.id) || [];
    const iCodes = arrize(atomData.pdbx_PDB_ins_code) || [];
    const resNames = arrize(atomData.label_comp_id) || [];
    const elements = arrize(atomData.type_symbol) || [];
    const tempFactors = arrize(atomData.B_iso_or_equiv) || [];
    const occupancies = arrize(atomData.occupancy) || [];
    const charges = arrize(atomData.pdbx_formal_charge) || [];
    const altLocs = arrize(atomData.label_alt_id) || [];
    const models = arrize(atomData.pdbx_PDB_model_num) || [];
    const molecules = arrize(atomData.label_entity_id) || [];

    let chain = null;
    let residue = null;
    for (let i = 0; i < count; ++i) {
      const model = models[i] || 1;
      if (model !== 1) {
        continue;
      }
      const chainID = String(chainIdc[i] || ' ');

      if (!chain || chain.getName() !== chainID) {
        chain = complex.getChain(chainID) || complex.addChain(chainID);
      }
      asymDict[String(chainLabelIdc[i] || ' ')] = chainID;
      const resSeq = resIdc[i];
      const iCode = String(iCodes[i] || ' ');
      const resName = String(resNames[i] || '');
      if (!residue || residue.getSequence() !== resSeq || residue.getICode() !== iCode) {
        residue = chain.addResidue(resName, resSeq, iCode);

        // store residue in appropriate molecule
        const moleculeIdx = molecules[i] - 1;
        let entity = this.molecules[moleculeIdx];
        if (!entity) { // create new molecule if it hasn't been created
          this.molecules[moleculeIdx] = { name: '', residues: [] };
          entity = this.molecules[moleculeIdx];
        }
        entity.residues.push(residue);
      }

      const name = names[i];
      const element = elements[i] || nameToElement(name);
      const type = Element.getByName(element);
      const role = Element.Role[name.trim()];
      const xyz = new THREE.Vector3(x[i], y[i], z[i]);
      const het = group[i] === 'HETATM' || false;
      const serial = serials[i] || i;
      const tempFactor = tempFactors[i] || 0.0;
      const occupancy = occupancies[i] || 0.0;
      const altLoc = String(altLocs[i] || '');
      const charge = charges[i] || 0;

      residue.addAtom(
        name,
        type,
        xyz,
        role,
        het,
        serial,
        altLoc,
        occupancy,
        tempFactor,
        charge,
      );
    }
  }