Skip to content

Commit

Permalink
Support adding R side chains to molecule
Browse files Browse the repository at this point in the history
  • Loading branch information
jacktday committed Sep 2, 2024
1 parent 3cac70a commit d3d911a
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 3 deletions.
28 changes: 25 additions & 3 deletions rdeditor/molEditWidget.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,8 @@ def atom_click(self, atom):
self.increase_charge(atom)
elif self.action == "Decrease Charge":
self.decrease_charge(atom)
elif self.action == "Number Atom":
self.number_atom(atom)
elif self.action == "RStoggle":
self.toogleRS(atom)
else:
Expand Down Expand Up @@ -368,9 +370,15 @@ def add_to_atom(self, atom):
if self.chemEntityType == "bond":
self.add_bond_to_atom(atom)

def getNewAtom(self):
newatom = Chem.rdchem.Atom(self.chemEntity)
if newatom.GetAtomicNum() == 0:
newatom.SetProp("dummyLabel", "R")
return newatom

def add_atom_to_atom(self, atom):
rwmol = Chem.rdchem.RWMol(self.mol)
newatom = Chem.rdchem.Atom(self.chemEntity)
newatom = self.getNewAtom()
newidx = rwmol.AddAtom(newatom)
newbond = rwmol.AddBond(atom.GetIdx(), newidx, Chem.rdchem.BondType.SINGLE)
self.mol = rwmol
Expand Down Expand Up @@ -411,7 +419,7 @@ def add_canvas_atom(self, point):
if rwmol.GetNumAtoms() == 0:
point.x = 0.0
point.y = 0.0
newatom = Chem.rdchem.Atom(self.chemEntity)
newatom = self.getNewAtom()
newidx = rwmol.AddAtom(newatom)
# This should only trigger if we have an empty canvas
if not rwmol.GetNumConformers():
Expand Down Expand Up @@ -469,7 +477,7 @@ def replace_on_atom(self, atom):

def replace_atom(self, atom):
rwmol = Chem.rdchem.RWMol(self.mol)
newatom = Chem.rdchem.Atom(self.chemEntity)
newatom = self.getNewAtom()
rwmol.ReplaceAtom(atom.GetIdx(), newatom)
self.mol = rwmol

Expand Down Expand Up @@ -622,6 +630,20 @@ def decrease_charge(self, atom):
atom.SetFormalCharge(atom.GetFormalCharge() - 1)
self.molChanged.emit()

def number_atom(self, atom: Chem.Atom):
atomMapNumber = atom.GetIntProp("molAtomMapNumber") if atom.HasProp("molAtomMapNumber") else 0
(atomMapNumber, ok) = QtWidgets.QInputDialog.getInt(self, "Number Atom", "Atom number", value=atomMapNumber)

if not ok:
return

self.backupMol()
if atomMapNumber == 0:
atom.ClearProp("molAtomMapNumber")
else:
atom.SetProp("molAtomMapNumber", str(atomMapNumber))
self.molChanged.emit()

# self.select_bond(bond)
def select_bond(self, bond):
self.logger.debug("Select_bond not implemented") # TODO
Expand Down
9 changes: 9 additions & 0 deletions rdeditor/molViewWidget.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,15 @@ def mol(self, mol):
if self._mol is not None:
self._prevmol = copy.deepcopy(self._mol) # Chem.Mol(self._mol.ToBinary()) # Copy

# Fix pseudo atoms
atom: Chem.Atom
for atom in mol.GetAtoms():
if atom.GetAtomicNum() == 0:
if not atom.HasProp("dummyLabel") or atom.GetProp("dummyLabel") == "*":
atom.SetProp("dummyLabel", "R")
else:
print(atom.GetPropsAsDict())

# # TODO make this failsafe
# if self._updatepropertycache:
# try:
Expand Down
1 change: 1 addition & 0 deletions rdeditor/ptable.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@
}

symboltoint = {
"R": 0,
"Ac": 89,
"Ag": 47,
"Al": 13,
Expand Down
9 changes: 9 additions & 0 deletions rdeditor/ptable_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,15 @@ def initUI(self, actionGroup):
grid.addWidget(button, 9, key - 54)
else:
grid.addWidget(button, 10, key - 86)
self.atomActions["R"] = QtGui.QAction(
"R",
self,
statusTip="Set atomtype to R",
triggered=self.atomtypePush,
objectName="R",
checkable=True,
)
actionGroup.addAction(self.atomActions["R"])
# Ensure spacing between main table and actinides/lathanides
grid.addWidget(QtWidgets.QLabel(""), 8, 1)

Expand Down
14 changes: 14 additions & 0 deletions rdeditor/rdEditor.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ def CreateMenus(self):
self.toolMenu.addAction(self.ezAction)
self.toolMenu.addAction(self.increaseChargeAction)
self.toolMenu.addAction(self.decreaseChargeAction)
self.toolMenu.addAction(self.numberAtom)

self.toolMenu.addSeparator()
self.toolMenu.addAction(self.cleanCoordinatesAction)
Expand Down Expand Up @@ -262,6 +263,7 @@ def CreateToolBars(self):
self.mainToolBar.addAction(self.ezAction)
self.mainToolBar.addAction(self.increaseChargeAction)
self.mainToolBar.addAction(self.decreaseChargeAction)
self.mainToolBar.addAction(self.numberAtom)
self.mainToolBar.addSeparator()
self.mainToolBar.addAction(self.cleanCoordinatesAction)
self.mainToolBar.addAction(self.cleanupMolAction)
Expand All @@ -282,6 +284,8 @@ def CreateToolBars(self):
self.sideToolBar.addAction(self.templateActions["benzene"])
self.sideToolBar.addAction(self.templateActions["cyclohexane"])
self.sideToolBar.addSeparator()
self.sideToolBar.addAction(self.ptable.atomActions["R"])
self.sideToolBar.addSeparator()
for action in self.atomActions:
self.sideToolBar.addAction(action)
self.sideToolBar.addAction(self.openPtableAction)
Expand Down Expand Up @@ -706,6 +710,16 @@ def CreateActions(self):
checkable=True,
)
self.actionActionGroup.addAction(self.decreaseChargeAction)

self.numberAtom = QAction(
"A#",
self,
statusTip="Number Atom",
triggered=self.setAction,
objectName="Number Atom",
checkable=True,
)
self.actionActionGroup.addAction(self.numberAtom)
self.addAction.setChecked(True)

# BondTypeActions
Expand Down

0 comments on commit d3d911a

Please sign in to comment.