Smiles.prototype.updateSideBonds = function()

in packages/ketcher-core/src/domain/serializers/smi/smiles.js [639:755]


Smiles.prototype.updateSideBonds = function (mol, bondIdx) {
  // eslint-disable-line max-statements
  const bond = mol.bonds.get(bondIdx);
  const subst = this.cis_trans.getSubstituents(bondIdx);
  const parity = this.cis_trans.getParity(bondIdx);

  const sidebonds = [-1, -1, -1, -1];

  sidebonds[0] = mol.findBondId(subst[0], bond.begin);
  if (subst[1] !== -1) sidebonds[1] = mol.findBondId(subst[1], bond.begin);

  sidebonds[2] = mol.findBondId(subst[2], bond.end);
  if (subst[3] !== -1) sidebonds[3] = mol.findBondId(subst[3], bond.end);

  let n1 = 0;
  let n2 = 0;
  let n3 = 0;
  let n4 = 0;

  if (this.dbonds[sidebonds[0]].saved !== 0) {
    if (
      (this.dbonds[sidebonds[0]].saved === 1 &&
        mol.bonds.get(sidebonds[0]).begin === bond.begin) ||
      (this.dbonds[sidebonds[0]].saved === 2 &&
        mol.bonds.get(sidebonds[0]).end === bond.begin)
    ) {
      n1++;
    } else n2++;
  }
  if (sidebonds[1] !== -1 && this.dbonds[sidebonds[1]].saved !== 0) {
    if (
      (this.dbonds[sidebonds[1]].saved === 2 &&
        mol.bonds.get(sidebonds[1]).begin === bond.begin) ||
      (this.dbonds[sidebonds[1]].saved === 1 &&
        mol.bonds.get(sidebonds[1]).end === bond.begin)
    ) {
      n1++;
    } else n2++;
  }
  if (this.dbonds[sidebonds[2]].saved !== 0) {
    if (
      (this.dbonds[sidebonds[2]].saved === 1 &&
        mol.bonds.get(sidebonds[2]).begin === bond.end) ||
      (this.dbonds[sidebonds[2]].saved === 2 &&
        mol.bonds.get(sidebonds[2]).end === bond.end)
    ) {
      n3++;
    } else n4++;
  }
  if (sidebonds[3] !== -1 && this.dbonds[sidebonds[3]].saved !== 0) {
    if (
      (this.dbonds[sidebonds[3]].saved === 2 &&
        mol.bonds.get(sidebonds[3]).begin === bond.end) ||
      (this.dbonds[sidebonds[3]].saved === 1 &&
        mol.bonds.get(sidebonds[3]).end === bond.end)
    ) {
      n3++;
    } else n4++;
  }

  if (parity === CisTrans.PARITY.CIS) {
    n1 += n3;
    n2 += n4;
  } else {
    n1 += n4;
    n2 += n3;
  }

  if (n1 > 0 && n2 > 0) throw new Error('incompatible cis-trans configuration');

  if (n1 === 0 && n2 === 0) return false;

  if (n1 > 0) {
    this.dbonds[sidebonds[0]].saved =
      mol.bonds.get(sidebonds[0]).begin === bond.begin ? 1 : 2;
    if (sidebonds[1] !== -1) {
      this.dbonds[sidebonds[1]].saved =
        mol.bonds.get(sidebonds[1]).begin === bond.begin ? 2 : 1;
    }

    this.dbonds[sidebonds[2]].saved =
      (mol.bonds.get(sidebonds[2]).begin === bond.end) ===
      (parity === CisTrans.PARITY.CIS)
        ? 1
        : 2;
    if (sidebonds[3] !== -1) {
      this.dbonds[sidebonds[3]].saved =
        (mol.bonds.get(sidebonds[3]).begin === bond.end) ===
        (parity === CisTrans.PARITY.CIS)
          ? 2
          : 1;
    }
  }
  if (n2 > 0) {
    this.dbonds[sidebonds[0]].saved =
      mol.bonds.get(sidebonds[0]).begin === bond.begin ? 2 : 1;
    if (sidebonds[1] !== -1) {
      this.dbonds[sidebonds[1]].saved =
        mol.bonds.get(sidebonds[1]).begin === bond.begin ? 1 : 2;
    }

    this.dbonds[sidebonds[2]].saved =
      (mol.bonds.get(sidebonds[2]).begin === bond.end) ===
      (parity === CisTrans.PARITY.CIS)
        ? 2
        : 1;
    if (sidebonds[3] !== -1) {
      this.dbonds[sidebonds[3]].saved =
        (mol.bonds.get(sidebonds[3]).begin === bond.end) ===
        (parity === CisTrans.PARITY.CIS)
          ? 1
          : 2;
    }
  }

  return true;
};