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;
};