@@ -1039,11 +1039,11 @@ def process_canon_site_conf(
1039
1039
"canon_site" : canon_site ,
1040
1040
}
1041
1041
1042
- # members = extract(key="members")
1042
+ members = extract (key = "members" )
1043
1043
ref_ligands = extract (key = "reference_ligand_id" )
1044
1044
1045
1045
index_fields = {
1046
- # "members": members,
1046
+ "members" : members ,
1047
1047
"reference_ligands" : ref_ligands ,
1048
1048
}
1049
1049
@@ -1489,24 +1489,51 @@ def process_bundle(self):
1489
1489
canon_site_confs = canon_site_conf_objects ,
1490
1490
)
1491
1491
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
-
1503
1492
# final remaining fk, attach reference site observation to canon_site_conf
1504
1493
for val in canon_site_conf_objects .values (): # pylint: disable=no-member
1505
1494
val .instance .ref_site_observation = site_observation_objects [
1506
1495
val .index_data ["reference_ligands" ]
1507
1496
].instance
1508
1497
val .instance .save ()
1509
1498
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
+
1510
1537
def _load_yaml (self , yaml_file : Path ) -> dict | None :
1511
1538
contents = None
1512
1539
try :
@@ -1555,95 +1582,49 @@ def _extract(
1555
1582
1556
1583
return result
1557
1584
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 ()
1627
1610
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 )
1647
1628
1648
1629
def _is_already_uploaded (self , target_created , project_created ):
1649
1630
if target_created or project_created :
0 commit comments