Skip to content

Commit e9b039d

Browse files
authored
Merge pull request #492 from xchem/m2ms-1075-trans-matrix
Add transformation matrices
2 parents cea8701 + 85baa62 commit e9b039d

6 files changed

+130
-8
lines changed

.pylintrc

+1
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ disable = C, F, R,
1212
fixme,
1313
import-error,
1414
imported-auth-user,
15+
new-db-field-with-default,

viewer/download_structures.py

+43-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
'single_sdf_file': (''),
4444
'metadata_info': (''),
4545
'smiles_info': (''),
46+
'trans_matrix_info': (''),
4647
'extra_files': ('extra_files'),
4748
'readme': (''),
4849
}
@@ -66,6 +67,7 @@
6667
'smiles_info': {},
6768
},
6869
'metadata_info': None,
70+
'trans_matrix_info': None,
6971
}
7072

7173

@@ -345,6 +347,35 @@ def _smiles_files_zip(zip_contents, ziparchive, download_path):
345347
os.remove(smiles_filename)
346348

347349

350+
def _trans_matrix_files_zip(ziparchive, target):
351+
"""Add transformation matrices to archive.
352+
353+
Note that this will always be the latest information - even for
354+
preserved searches.
355+
"""
356+
logger.info('+ Processing trans matrix files')
357+
358+
# grab the last set of files for this target
359+
experiment_upload = target.experimentupload_set.order_by('commit_datetime').last()
360+
361+
trans_matrix_files = (
362+
experiment_upload.neighbourhood_transforms,
363+
experiment_upload.conformer_site_transforms,
364+
experiment_upload.reference_structure_transforms,
365+
)
366+
for tmf in trans_matrix_files:
367+
if tmf:
368+
ziparchive.write(
369+
Path(settings.MEDIA_ROOT).joinpath(str(tmf)),
370+
os.path.join(
371+
_ZIP_FILEPATHS['trans_matrix_info'],
372+
Path(str(tmf)).name,
373+
),
374+
)
375+
else:
376+
logger.info('File %s does not exist', Path(str(tmf)).name)
377+
378+
348379
def _extra_files_zip(ziparchive, target):
349380
"""If an extra info folder exists at the target root level, then
350381
copy the contents to the output file as is.
@@ -507,6 +538,7 @@ def _create_structures_zip(target, zip_contents, file_url, original_search, host
507538
logger.warning('After _add_file_to_zip() errors=%s', errors)
508539

509540
_extra_files_zip(ziparchive, target)
541+
_trans_matrix_files_zip(ziparchive, target)
510542

511543
_document_file_zip(ziparchive, download_path, original_search, host)
512544

@@ -613,6 +645,10 @@ def _create_structures_dict(target, site_obvs, protein_params, other_params):
613645
if other_params['metadata_info'] is True:
614646
zip_contents['metadata_info'] = target.metadata.name
615647

648+
# Add the metadata file from the target
649+
if other_params['trans_matrix_info'] is True:
650+
zip_contents['trans_matrix_info'] = True
651+
616652
return zip_contents
617653

618654

@@ -635,7 +671,13 @@ def get_download_params(request):
635671
'diff_file',
636672
]
637673

638-
other_param_flags = ['sdf_info', 'single_sdf_file', 'metadata_info', 'smiles_info']
674+
other_param_flags = [
675+
'sdf_info',
676+
'single_sdf_file',
677+
'metadata_info',
678+
'smiles_info',
679+
'trans_matrix_info',
680+
]
639681

640682
# protein_params = {'pdb_info': request.data['pdb_info'],
641683
# 'bound_info': request.data['bound_info'],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Generated by Django 3.2.23 on 2024-01-19 15:01
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
('viewer', '0031_compound_compound_code'),
9+
]
10+
11+
operations = [
12+
migrations.AddField(
13+
model_name='experimentupload',
14+
name='conformer_site_transforms',
15+
field=models.FileField(
16+
default='trans.yaml',
17+
max_length=255,
18+
upload_to='experiment-upload/',
19+
),
20+
preserve_default=False,
21+
),
22+
migrations.AddField(
23+
model_name='experimentupload',
24+
name='neighbourhood_transforms',
25+
field=models.FileField(
26+
default='trans.yaml', max_length=255, upload_to='experiment-upload/'
27+
),
28+
preserve_default=False,
29+
),
30+
migrations.AddField(
31+
model_name='experimentupload',
32+
name='reference_structure_transforms',
33+
field=models.FileField(
34+
default='trans.yaml', max_length=255, upload_to='experiment-upload/'
35+
),
36+
preserve_default=False,
37+
),
38+
]

viewer/models.py

+9
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,15 @@ class ExperimentUpload(models.Model):
162162
help_text="Any message or task info associated with the upload."
163163
" Used for upload audit trail",
164164
)
165+
neighbourhood_transforms = models.FileField(
166+
upload_to="experiment-upload/", max_length=255
167+
)
168+
conformer_site_transforms = models.FileField(
169+
upload_to="experiment-upload/", max_length=255
170+
)
171+
reference_structure_transforms = models.FileField(
172+
upload_to="experiment-upload/", max_length=255
173+
)
165174

166175
def __str__(self) -> str:
167176
return f"{self.project}"

viewer/serializers.py

+1
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,7 @@ class DownloadStructuresSerializer(serializers.Serializer):
850850
smiles_info = serializers.BooleanField(default=False)
851851
static_link = serializers.BooleanField(default=False)
852852
file_url = serializers.CharField(max_length=200)
853+
trans_matrix_info = serializers.BooleanField(default=False)
853854

854855

855856
# Start of Serializers for Squonk Jobs

viewer/target_loader.py

+38-7
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@
5353
# everything else
5454
METADATA_FILE = "meta_aligner.yaml"
5555

56+
# transformation matrices
57+
TRANS_NEIGHBOURHOOD = "neighbourhood_transforms.yaml"
58+
TRANS_CONF_SITE = "conformer_site_transforms.yaml"
59+
TRANS_REF_STRUCT = "reference_structure_transforms.yaml"
60+
5661

5762
class UploadState(str, Enum):
5863
"""Target loader progress state.
@@ -1160,9 +1165,42 @@ def process_metadata(
11601165
assert self.target
11611166
self.target.project_id.add(self.project)
11621167

1168+
meta = self._load_yaml(Path(upload_root).joinpath(METADATA_FILE))
1169+
1170+
# collect top level info
1171+
self.version_number = meta["version_number"]
1172+
self.version_dir = meta["version_dir"]
1173+
self.previous_version_dirs = meta["previous_version_dirs"]
1174+
1175+
# check tranformation matrix files
1176+
( # pylint: disable=unbalanced-tuple-unpacking
1177+
trans_neighbourhood,
1178+
trans_conf_site,
1179+
trans_ref_struct,
1180+
) = self.validate_files(
1181+
obj_identifier="trans_matrices",
1182+
# since the paths are given if file as strings, I think I
1183+
# can get away with compiling them as strings here
1184+
file_struct={
1185+
TRANS_NEIGHBOURHOOD: f"{self.version_dir}/{TRANS_NEIGHBOURHOOD}",
1186+
TRANS_CONF_SITE: f"{self.version_dir}/{TRANS_CONF_SITE}",
1187+
TRANS_REF_STRUCT: f"{self.version_dir}/{TRANS_REF_STRUCT}",
1188+
},
1189+
required=(TRANS_NEIGHBOURHOOD, TRANS_CONF_SITE, TRANS_REF_STRUCT),
1190+
)
1191+
11631192
self.experiment_upload.project = self.project
11641193
self.experiment_upload.target = self.target
11651194
self.experiment_upload.committer = committer
1195+
self.experiment_upload.neighbourhood_transforms = str(
1196+
self._get_final_path(trans_neighbourhood)
1197+
)
1198+
self.experiment_upload.conformer_site_transforms = str(
1199+
self._get_final_path(trans_conf_site)
1200+
)
1201+
self.experiment_upload.reference_structure_transforms = str(
1202+
self._get_final_path(trans_ref_struct)
1203+
)
11661204
self.experiment_upload.save()
11671205

11681206
( # pylint: disable=unbalanced-tuple-unpacking
@@ -1173,13 +1211,6 @@ def process_metadata(
11731211
blocks=("assemblies", "xtalforms"),
11741212
)
11751213

1176-
meta = self._load_yaml(Path(upload_root).joinpath(METADATA_FILE))
1177-
1178-
# collect top level info
1179-
self.version_number = meta["version_number"]
1180-
self.version_dir = meta["version_dir"]
1181-
self.previous_version_dirs = meta["previous_version_dirs"]
1182-
11831214
( # pylint: disable=unbalanced-tuple-unpacking
11841215
crystals,
11851216
xtalforms,

0 commit comments

Comments
 (0)