Skip to content

Commit 932fc6c

Browse files
author
Alan Christie
committed
Merge branch 'staging' into m2ms-1271-b
2 parents f26e8ab + 8e83d18 commit 932fc6c

File tree

1 file changed

+82
-101
lines changed

1 file changed

+82
-101
lines changed

viewer/target_loader.py

+82-101
Original file line numberDiff line numberDiff line change
@@ -1039,11 +1039,11 @@ def process_canon_site_conf(
10391039
"canon_site": canon_site,
10401040
}
10411041

1042-
# members = extract(key="members")
1042+
members = extract(key="members")
10431043
ref_ligands = extract(key="reference_ligand_id")
10441044

10451045
index_fields = {
1046-
# "members": members,
1046+
"members": members,
10471047
"reference_ligands": ref_ligands,
10481048
}
10491049

@@ -1489,24 +1489,51 @@ def process_bundle(self):
14891489
canon_site_confs=canon_site_conf_objects,
14901490
)
14911491

1492-
tag_categories = (
1493-
"ConformerSites",
1494-
"CanonSites",
1495-
"XtalformSites",
1496-
"Quatassemblies",
1497-
"Xtalforms",
1498-
)
1499-
1500-
for cat in tag_categories:
1501-
self._tag_site_observations(site_observation_objects, cat)
1502-
15031492
# final remaining fk, attach reference site observation to canon_site_conf
15041493
for val in canon_site_conf_objects.values(): # pylint: disable=no-member
15051494
val.instance.ref_site_observation = site_observation_objects[
15061495
val.index_data["reference_ligands"]
15071496
].instance
15081497
val.instance.save()
15091498

1499+
# tag site observations
1500+
for val in canon_site_conf_objects.values(): # pylint: disable=no-member
1501+
tag = "conf_site: " + ",".join(val.instance.residues[:3])
1502+
so_list = [
1503+
site_observation_objects[k].instance for k in val.index_data["members"]
1504+
]
1505+
self._tag_observations(tag, "ConformerSites", so_list)
1506+
1507+
for val in canon_site_objects.values(): # pylint: disable=no-member
1508+
tag = "canon_site: " + ",".join(val.instance.residues[:3])
1509+
so_list = SiteObservation.objects.filter(
1510+
canon_site_conf__canon_site=val.instance
1511+
)
1512+
self._tag_observations(tag, "ConformerSites", so_list)
1513+
1514+
for val in xtalform_sites_objects.values(): # pylint: disable=no-member
1515+
tag = "xtalform_site: " + ",".join(val.instance.residues[:3])
1516+
so_list = [
1517+
site_observation_objects[k].instance for k in val.index_data["residues"]
1518+
]
1519+
self._tag_observations(tag, "ConformerSites", so_list)
1520+
1521+
for val in quat_assembly_objects.values(): # pylint: disable=no-member
1522+
tag = "quatassembly: " + val.instance.name
1523+
so_list = SiteObservation.objects.filter(
1524+
xtalform_site__xtalform__in=XtalformQuatAssembly.objects.filter(
1525+
quat_assembly=val.instance
1526+
).values("xtalform")
1527+
)
1528+
self._tag_observations(tag, "ConformerSites", so_list)
1529+
1530+
for val in xtalform_objects.values(): # pylint: disable=no-member
1531+
tag = "xtalform: " + val.instance.name
1532+
so_list = SiteObservation.objects.filter(
1533+
xtalform_site__xtalform=val.instance
1534+
)
1535+
self._tag_observations(tag, "ConformerSites", so_list)
1536+
15101537
def _load_yaml(self, yaml_file: Path) -> dict | None:
15111538
contents = None
15121539
try:
@@ -1555,95 +1582,49 @@ def _extract(
15551582

15561583
return result
15571584

1558-
def _tag_site_observations(self, site_observation_objects, category):
1559-
# this is an attempt to replicate tag creation from previous
1560-
# loader. as there are plenty of differences, I cannot just
1561-
# use the same functions..
1562-
1563-
logger.debug("Getting category %s", category)
1564-
groups: Dict[str, Any] = {}
1565-
for _, obj in site_observation_objects.items():
1566-
if category == "ConformerSites":
1567-
tags = [
1568-
"conf_site: " + ",".join(obj.instance.canon_site_conf.residues[:3]),
1569-
]
1570-
elif category == "CanonSites":
1571-
tags = [
1572-
"canon_site: "
1573-
+ ",".join(obj.instance.xtalform_site.canon_site.residues[:3]),
1574-
]
1575-
elif category == "XtalformSites":
1576-
tags = [
1577-
"xtalform_site: "
1578-
+ ",".join(obj.instance.xtalform_site.residues[:3]),
1579-
]
1580-
# tricky one. connected via m2m
1581-
elif category == "Quatassemblies":
1582-
tags = [
1583-
"quatassembly: " + qa.name
1584-
for qa in obj.instance.xtalform_site.xtalform.quat_assembly.all()
1585-
]
1586-
1587-
elif category == "Xtalforms":
1588-
tags = [
1589-
"xtalform: " + obj.instance.xtalform_site.xtalform.name,
1590-
]
1591-
else:
1592-
tags = [
1593-
"Unspecified",
1594-
]
1595-
1596-
for tag in tags:
1597-
if tag in groups:
1598-
groups[tag].append(obj.instance)
1599-
else:
1600-
groups[tag] = [obj.instance]
1601-
# I suspect I need to group them by site..
1602-
for tag, so_list in groups.items():
1603-
try:
1604-
# memo to self: description is set to tag, but there's
1605-
# no fk to tag, instead, tag has a fk to
1606-
# group. There's no uniqueness requirement on
1607-
# description so there's no certainty that this will
1608-
# be unique (or remain searchable at all because user
1609-
# is allowed to change the tag name). this feels like
1610-
# poor design but I don't understand the principles of
1611-
# this system to know if that's indeed the case or if
1612-
# it is in fact a truly elegant solution
1613-
so_group = SiteObservationGroup.objects.get(
1614-
target=self.target, description=tag
1615-
)
1616-
except SiteObservationGroup.DoesNotExist:
1617-
assert self.target
1618-
so_group = SiteObservationGroup(target=self.target)
1619-
so_group.save()
1620-
except MultipleObjectsReturned:
1621-
SiteObservationGroup.objects.filter(
1622-
target=self.target, description=tag
1623-
).delete()
1624-
assert self.target
1625-
so_group = SiteObservationGroup(target=self.target)
1626-
so_group.save()
1585+
def _tag_observations(self, tag, category, so_list):
1586+
try:
1587+
# memo to self: description is set to tag, but there's
1588+
# no fk to tag, instead, tag has a fk to
1589+
# group. There's no uniqueness requirement on
1590+
# description so there's no certainty that this will
1591+
# be unique (or remain searchable at all because user
1592+
# is allowed to change the tag name). this feels like
1593+
# poor design but I don't understand the principles of
1594+
# this system to know if that's indeed the case or if
1595+
# it is in fact a truly elegant solution
1596+
so_group = SiteObservationGroup.objects.get(
1597+
target=self.target, description=tag
1598+
)
1599+
except SiteObservationGroup.DoesNotExist:
1600+
assert self.target
1601+
so_group = SiteObservationGroup(target=self.target)
1602+
so_group.save()
1603+
except MultipleObjectsReturned:
1604+
SiteObservationGroup.objects.filter(
1605+
target=self.target, description=tag
1606+
).delete()
1607+
assert self.target
1608+
so_group = SiteObservationGroup(target=self.target)
1609+
so_group.save()
16271610

1628-
try:
1629-
so_tag = SiteObservationTag.objects.get(tag=tag, target=self.target)
1630-
# Tag already exists
1631-
# Apart from the new mol_group and molecules, we shouldn't be
1632-
# changing anything.
1633-
so_tag.mol_group = so_group
1634-
except SiteObservationTag.DoesNotExist:
1635-
so_tag = SiteObservationTag()
1636-
so_tag.tag = tag
1637-
so_tag.category = TagCategory.objects.get(category=category)
1638-
so_tag.target = self.target
1639-
so_tag.mol_group = so_group
1640-
1641-
so_tag.save()
1642-
1643-
for site_obvs in so_list:
1644-
logger.debug("site_obvs_id=%s", site_obvs.id)
1645-
so_group.site_observation.add(site_obvs)
1646-
so_tag.site_observations.add(site_obvs)
1611+
try:
1612+
so_tag = SiteObservationTag.objects.get(tag=tag, target=self.target)
1613+
# Tag already exists
1614+
# Apart from the new mol_group and molecules, we shouldn't be
1615+
# changing anything.
1616+
so_tag.mol_group = so_group
1617+
except SiteObservationTag.DoesNotExist:
1618+
so_tag = SiteObservationTag()
1619+
so_tag.tag = tag
1620+
so_tag.category = TagCategory.objects.get(category=category)
1621+
so_tag.target = self.target
1622+
so_tag.mol_group = so_group
1623+
1624+
so_tag.save()
1625+
1626+
so_group.site_observation.add(*so_list)
1627+
so_tag.site_observations.add(*so_list)
16471628

16481629
def _is_already_uploaded(self, target_created, project_created):
16491630
if target_created or project_created:

0 commit comments

Comments
 (0)