xchem / fragalysis-backend Goto Github PK
View Code? Open in Web Editor NEWDjango backend loader and Restful API for fragalysis server
License: Apache License 2.0
Django backend loader and Restful API for fragalysis server
License: Apache License 2.0
The https://fragalysis.diamond.ac.uk/api/graph/ endpoint is not working because of an error coming from Neo4j.
The information reported is minimal:
java.io.IOException: I/O error
Unclear when this started happening.
Port the scientific code from the refactored Wonka repo into the fragalysis-backend (or fragalysis) codebase.
This will enable:
clustering of ligands by pharmacophores: conservation of pharmacophore-based interactions
clustering of waters: analysis of conserved water interactions, key waters for binding, water displacement
clustering of residues: local analysis of flexibility or conformational changes induced by binding
Move code over
Add tables to Django models to accommodate cluster information
Construct endpoints via. views
Needs updating to reflect recent changes to the db
endpoint: /api/compound-molecules
returns:
"results": [
{
"id": 251,
"sdf_info": "PAU-WEI-b9b69149-9\n RDKit 3D\n\n 38 41 0 0 1 0 0 0 0 0999 V2000\n 6.3480 -7.5080 33.2000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 6.2830 -6.6860 31.9240 C 0 0 0 0 0 0 0 0 0 0 0 0\n 6.7580 -5.5850 31.8940 O 0 0 0 0 0 0 0 0 0 0 0 0\n 5.6810 -7.2030 30.8060 N 0 0 0 0 0 0 0 0 0 0 0 0\n 5.6180 -6.4080 29.5710 C 0 0 0 0 0 0 0 0 0 0 0 0\n 7.0260 -6.0320 29.1390 C 0 0 0 0 0 0 0 0 0 0 0 0\n 6.9620 -4.8630 28.1680 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.9460 -3.9550 28.0940 C 0 0 0 0 0 0 0 0 0 0 0 0\n 6.2570 -3.0700 27.1030 N 0 0 0 0 0 0 0 0 0 0 0 0\n 7.4620 -3.4230 26.5640 C 0 0 0 0 0 0 0 0 0 0 0 0\n 8.1810 -2.8260 25.5360 C 0 0 0 0 0 0 0 0 0 0 0 0\n 7.6440 -1.5880 24.8360 C 0 0 0 0 0 0 0 0 0 0 0 0\n 8.4850 -0.3830 25.2240 C 0 0 0 0 0 0 0 0 0 0 0 0\n 9.8240 -0.4480 24.5090 C 0 0 0 0 0 0 0 0 0 0 0 0\n 10.4070 0.9520 24.3960 C 0 0 0 0 0 0 0 0 0 0 0 0\n 11.7760 1.1090 24.2010 C 0 0 0 0 0 0 0 0 0 0 0 0\n 12.3140 2.3870 24.0950 C 0 0 0 0 0 0 0 0 0 0 0 0\n 11.4750 3.4930 24.1850 C 0 0 0 0 0 0 0 0 0 0 0 0\n 12.0580 4.8920 24.0700 C 0 0 0 0 0 0 0 0 0 0 0 0\n 13.3000 4.8170 23.6010 F 0 0 0 0 0 0 0 0 0 0 0 0\n 11.3130 5.6150 23.2380 F 0 0 0 0 0 0 0 0 0 0 0 0\n 12.0700 5.4680 25.2680 F 0 0 0 0 0 0 0 0 0 0 0 0\n 10.1070 3.3370 24.3810 C 0 0 0 0 0 0 0 0 0 0 0 0\n 9.5690 2.0580 24.4880 C 0 0 0 0 0 0 0 0 0 0 0 0\n 7.7070 -1.7820 23.3810 N 0 0 0 0 0 0 0 0 0 0 0 0\n 6.9560 -3.0120 23.0780 C 0 0 0 0 0 0 0 0 0 0 0 0\n 6.9100 -3.2950 21.5840 C 0 0 0 0 0 0 0 0 0 0 0 0\n 6.5860 -2.0830 20.8140 N 0 0 0 0 0 0 0 0 0 0 0 0\n 5.8520 -2.2200 19.6310 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.5020 -3.3080 19.2650 O 0 0 0 0 0 0 0 0 0 0 0 0\n 5.4980 -0.9920 18.8090 C 0 0 0 0 0 0 0 0 0 0 0 0\n 6.9460 0.0220 18.6030 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n 6.9910 -0.7360 21.2480 C 0 0 0 0 0 0 0 0 0 0 0 0\n 7.0390 -0.6240 22.7640 C 0 0 0 0 0 0 0 0 0 0 0 0\n 9.4040 -3.3490 25.1300 C 0 0 0 0 0 0 0 0 0 0 0 0\n 9.9020 -4.4830 25.7650 C 0 0 0 0 0 0 0 0 0 0 0 0\n 9.1670 -5.0650 26.7920 C 0 0 0 0 0 0 0 0 0 0 0 0\n 7.9430 -4.5440 27.2020 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1 2 1 0\n 2 3 2 0\n 2 4 1 0\n 4 5 1 0\n 5 6 1 0\n 6 7 1 0\n 7 8 2 0\n 7 38 1 0\n 8 9 1 0\n 9 10 1 0\n 10 11 1 0\n 10 38 2 0\n 11 12 1 0\n 11 35 2 0\n 12 13 1 0\n 12 25 1 0\n 13 14 1 0\n 14 15 1 0\n 15 16 2 0\n 15 24 1 0\n 16 17 1 0\n 17 18 2 0\n 18 19 1 0\n 18 23 1 0\n 19 20 1 0\n 19 21 1 0\n 19 22 1 0\n 23 24 2 0\n 25 26 1 0\n 25 34 1 0\n 26 27 1 0\n 27 28 1 0\n 28 29 1 0\n 28 33 1 0\n 29 30 2 0\n 29 31 1 0\n 31 32 1 0\n 33 34 1 0\n 35 36 1 0\n 36 37 2 0\n 37 38 1 0\nM CHG 1 25 1\nM END\n",
"name": "PAU-WEI-b9b69149-9",
"smiles": "CC(=O)NCCc1c[nH]c2c(C(CCc3ccc(C(F)(F)F)cc3)[NH+]3CCN(C(=O)CCl)CC3)cccc12",
"original_smiles": "CC(=O)NCCc1c[nH]c2c(C(CCc3ccc(C(F)(F)F)cc3)N3CCN(C(=O)CCl)CC3)cccc12",
"pdb_info": "http://fragalysis-tibor.apps.xchem.diamond.ac.uk/media/pdbs/Mpro-x0830_0_apo.pdb",
"compound_set": 8,
"inspiration_frags": []
},
...
point to the correct table.
Check with @tibor-postek-m2ms which smiles (original smiles or smiles) are being passed to the mol_img view to generate image.
get inspiration frags from molecules table (from design set)
Port loader code so that uploads can be achieved by PUT request
Currently when you launch a development backend stack, attemping to login to the Django admin panel results in currently it automatically defaulting to a production login with CAS (e.g. if you navigate to 127.0.0.0:8080/admin and https://fragalysis-duncan-default.xchem-dev.diamond.ac.uk/admin/)
Ideally the Django admin panel should be available to a default admin user on development systems and a known (secret) admin user on production.
We currently don't test the api endpoints in the build, which has caused problems. DRF offers a testing framework for this purpose:
https://www.django-rest-framework.org/api-guide/testing/
which we should use to add tests.
This issue should be split out into the different tests that are needed
For tracking hypotheses, state or button clicks should be given 'scientific' context in the form of a list of interface interactions.
e.g.
Turned on Benzotriazole site
Turned on x0107 ligand
Turned on x0107 interactions
Turned on x0107 vectors
Enumerated graph network for CC(=O)Nc1cncc1[Xe] - 3 molecules found
Displayed ligand-based conformation estimate for molecule 3
Added molecule 3 to shopping cart
These actions could be linked to ELN/external db to store reasoning behind decisions
This is a follow on from issue #226 and relates to new security rules built into the latest version of Chrome.
In the Fragalysis Backend, all formatted URLS that have http in them should be changed to relative URLs.
These will likely affect models that that Filefields in them (it's default the serialization behaviour for these) - for example, the ones ending in /media/target/xxxx.zip and /media/target/metadata.csv.
Note that this change should be coordinated with the frontend as some URLs from the backend are modified in transit. We don't want to break these.
Add loader code for electron density - tables/fields already exist
DRF passes back http links for file downloads. These should be https links, or chrome won't allow download. Might be some nginx/django settings that need adjusting
Error: Mixed Content: The site at ‘<URL>’ was loaded over a secure connection, but the file at ‘<URL>’ was redirected through an insecure connection. This file should be served over HTTPS. This download has been blocked. See <URL> for more details.
Given a set of molecule ids, compile an sdf file of all relevant info and send to user on GET request
Given a list of molecule ids and fields to include, compile a csv file and send to user on GET request
When uploading an sdf with a comp method that has already been used - the celery chained task ends up in a constant "PENDING" state
State is saved in a json object for rendering in the front-end. The format of the object is quite complex, so we should assess wether there is a better way to do this.
options:
Calculate a map/surface constructed either from WONKA clusters or from all known protein conformations to demonstrate global areas of protein flexibility. (based on backbone flexibility - with 'local' flexibility demonstrated by Wonka clusters)
e.g.:
Later:
include flexibility from MD
Algorithm - how to calculate flexibility (average movement after alignment/RMSD on alignment of alpha-C backbone)
Port algorithm into back-end/fragalysis code
Add tables to django models
Construct endpoints from views
Requirements.txt has mysql-connector==2.1.7, mysql-connector-python==8.0.21, pymysql – As the DB is now postgres, these should all be removed at a suitable opportunity.
The backend image is used as a FROM
in downstream container images like the fragalysis-loader (https://github.com/xchem/fragalysis-loader) and fragalysis-stack (https://github.com/xchem/fragalysis-stack) but, at the moment we only publish a "latest" image.
Currently, if you introduce a new migration or behaviour change (for example) - and you re-build an older stack or loader (say 1.0.7) - then the stack or loader you build may contain unexpected migrations or behaviour changes.
Recommended pattern:
When a stable backend is available...
1.0.0
)xchem/fragalysis-backend:1.0.0
)Dockerfile
and replace the ARG BE_IMAGE_TAG="latest"
with ARG BE_IMAGE_TAG="1.0.0"
Upload task currently re-renders page. Need to pass json to .html template
Return json for table when data is not validated in views
Return json links when data is uploaded
Return json string if upload fails
Add a view to trigger a workflow.
Info needed:
With that info, we should be able to send the data to a specific workflow (wherever that is) to be executed
Workflow code should be written and maintained in a separate repository (e.g. a collection of nextflow, galaxy, squonk etc. workflows) that contains all of the code needed to execute the workflow in/on the correct container/serrvice - the endpoint should return:
The ID should then be able to be used at an additional endpoint to examine the status
When the workflow is complete, a final endpoint will be used to import/download the data
related to #195 - work out what interactions a molecule/protein can make, and specifically toggle between satisfied and unsatisfied interaction points/pharmacophores
Mapping of complementarity onto surface for protein & ligand individually - colour regions of protein/ligand by complementarity based on whatever metric - e.g. electrostatic complementarity (similarly to cresset)
e.g. protein or ligand SAS vs. ESP:
Django history currently used on Molecules model, but nowhere else. We should track the provenance of our data, even if the feature is not currently used on front-end
The current CompoundSetView looks at the old db schema. This needs updating to reflect recent db changes.
endpoint: /api/compound-sets/
returns:
{
"count": 4,
"next": null,
"previous": null,
"results": [
{
"id": 8,
"name": "continiYsZu7FD",
"submitted_sdf": "http://fragalysis-tibor.apps.xchem.diamond.ac.uk/media/code/media/compound_sets/compound-set_contini_YsZu7FD.sdf",
"spec_version": 1.2,
"method_url": "https://discuss.postera.ai/t/results-from-nwat-mmgbsa-workflow-on-covalent-warheads/1225",
"target": 55,
"submitter": 11
},
...
name
submitted_sdf - no changes needed
spec_verison - no changes needed
method_url - no changes needed
target - no changes needed
submitter - no changes needed
Upload fails if compound names are larger than 50 characters, but this is not detected in validate option
Sentry's cool but its initialisation in the backend is not optional. Consequently if you run a migration on your desktop and it fails then you get an alarm in your chosen Sentry recipient (slack in this case).
Suggest: -
FRAGALYSIS_BACKEND_SENTRY_DNS
) rather than have it hard-codedAn added advantage:
Different stack deployments can use different DSN keys - so you know the alert belongs to deployment/customer X, Y or Z.
Add a view to retrieve workflow status - this should be standardised across however many workflow execution systems we use to: Queueing, running, success, fail
Info needed:
Workflow code should be written and maintained in a separate repository (e.g. a collection of nextflow, galaxy, squonk etc. workflows) that contains all of the code needed to execute the workflow in/on the correct container/serrvice - the endpoint should return:
When the workflow is complete, a final endpoint will be used to import/download the data
Ignore this.
Every ComputedMolecule now has an associated Compound. In the Compound object, there are a number of computed descriptors (as there are for the Molecules on the LHS). These need to be added to the NumericalScoresView so that these properties can be added/sorted/filtered on the front-end
Validate task currently re-renders page. Need to pass json to .html template
Return json for table when data is not validated in views
Return json string when data is validated
Codebase is currently still running on py2.7, which has been deprecated for some time. We need to upgrade.
change docker build to use a py3 image
run py2to3
upgrade packages
change packages to use latest compatible py3 versions
Use-case:
Technical:
To do:
Documentation for
a) the fragment network is used to calculate new molecules in the loader
b) if/how the fragment network is queried to look for new molecules (not found in the loader stage in the back-end)
c) how the cypher queries are wrapped in the back-end
d) how to add new queries as endpoints (some minimal info about the schema needed to allow building of queries)
Noticed the following four warnings repeated during initial stack database migrations. They might be harmless but they do clutter the initial output: -
xchem_db.DataProcessing.crystal_name: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
xchem_db.Dimple.crystal_name: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
xchem_db.Lab.crystal_name: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
xchem_db.ProasisLeads.reference_pdb: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
xchem_db.Refinement.crystal_name: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
Add the compound-id from the vendor to the information currently returned from the Neo4j database (currently is smiles) so this can be displayed on the React Front end in fragalysis.
Initial Analysis:
This looks like the area concerned - maybe confirm with Boris:
VectorsView
Check use of fragalysis function: decorate.py -> get_3d_vects_for_mol.
This is used in the VectorsSerializer for VectorsView -> api call api/vectors.
On first look, the comp-id is included in the information, so it might be how the frontend uses the info, but check.
Tests are needed for the new computed set upload feature
I have uploaded to nsp13 target a few compounds. All inspirational fragments belong to chain B, but Fragalysis is selecting two of them from chain A and one from chain B.
I am pasting the sdf file.
################################
ver_1.2
RDKit 2D
1 0 0 0 0 0 0 0 0 0999 V2000
0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
M END
<submitter_name> (1)
Ruben Sanchez Garcia
<submitter_email> (1)
[email protected]
<submitter_institution> (1)
University of Oxford
<generation_date> (1)
2021-02-11
(1)
Fragmenstein
<ref_url> (1)
https://github.com/matteoferla/Fragmenstein
(1)
The name of the compound
(1)
The SMILES of the compound
<ref_pdb> (1)
A pdb inlcuded in fragalysis or uploaded. E.g. x0830_0
<ref_mols> (1)
The inspirational fragments usded to propose the compound
<fragmensteinOld_score> (1)
Score
<LE_score> (1)
Score
<comRMSD_score> (1)
Score
<fragmensteinNew_score> (1)
Score
$$$$
x0020_0B_0-x0020_0B_1-x0020_0B_3-x0020_0B_4-x0029_
RDKit 3D
17 18 0 0 0 0 0 0 0 0999 V2000
-27.3110 40.2800 -57.4680 C 0 0 0 0 0 0 0 0 0 0 0 0
-27.7820 41.5570 -57.5990 C 0 0 0 0 0 0 0 0 0 0 0 0
-27.3330 42.4350 -58.7040 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.3510 39.8000 -58.5920 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.5560 40.1980 -56.1850 N 0 0 0 0 0 0 0 0 0 0 0 0
-28.4250 39.3630 -57.0970 N 0 0 0 0 0 0 0 0 0 0 0 0
-26.5110 40.5040 -59.9400 C 0 0 1 0 0 0 0 0 0 0 0 0
-26.8300 38.9820 -55.5650 C 0 0 0 0 0 0 0 0 0 0 0 0
-28.0170 38.4690 -56.1440 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.3370 41.9790 -59.7430 C 0 0 0 0 0 0 0 0 0 0 0 0
-25.5790 39.9900 -60.9260 O 0 0 0 0 0 0 0 0 0 0 0 0
-24.7210 39.0260 -60.5150 C 0 0 0 0 0 0 0 0 0 0 0 0
-24.5570 38.8100 -59.2520 N 0 0 0 0 0 0 0 0 0 0 0 0
-24.1160 38.4060 -61.5660 N 0 0 0 0 0 0 0 0 0 0 0 0
-23.6700 37.8220 -58.8990 N 0 0 0 0 0 0 0 0 0 0 0 0
-24.1570 37.0090 -58.0360 C 0 0 0 0 0 0 0 0 0 0 0 0
-23.4860 35.9480 -57.5380 O 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 2 0
1 4 1 0
1 5 1 0
1 6 1 0
4 7 1 0
5 8 1 0
6 9 1 0
8 9 2 0
3 10 1 0
7 10 1 0
7 11 1 6
11 12 1 0
12 13 2 3
12 14 1 0
13 15 1 0
15 16 2 3
16 17 1 0
M END
(2)
NC(=NN=CO)OC1CC=CC2(C1)NC=CN2
(2)
(2)
full
<∆∆G> (2)
-5.134296315835306
<∆G_bound> (2)
-4.412044765972153
<∆G_unbound> (2)
0.7222515498631529
(2)
0.9106801328390915
<N_constrained_atoms> (2)
16
<N_unconstrained_atoms> (2)
1
(2)
47.41563105583191
(2)
[]
(2)
[]
<fragmensteinOld_score> (2)
-1.516179
<LE_score> (2)
-0.302017
<comRMSD_score> (2)
0.91068
<fragmensteinNew_score> (2)
0.225068
<ref_mols> (2)
x0020_0B,x0029_0B,x0257_0B
<ref_pdb> (2)
x0020
(2)
NC(=NN=CO)O[C@@h]1CC=CC2(C1)NC=CN2
$$$$
x0020_0B_0-x0020_0B_3-x0020_0B_4-x0029_0B_3-x0257_
RDKit 3D
15 16 0 0 0 0 0 0 0 0999 V2000
-27.4400 40.4070 -57.4060 N 0 0 0 0 0 0 0 0 0 0 0 0
-27.9190 41.6780 -57.7450 C 0 0 0 0 0 0 0 0 0 0 0 0
-27.5770 42.3430 -58.8590 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.5430 39.7210 -58.3910 C 0 0 1 0 0 0 0 0 0 0 0 0
-28.0850 39.5520 -56.5060 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.1390 40.5440 -59.6200 C 0 0 0 0 0 0 0 0 0 0 0 0
-27.5260 38.3980 -56.0760 C 0 0 0 0 0 0 0 0 0 0 0 0
-25.7010 38.6680 -57.6630 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.6690 41.7730 -59.8100 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.2170 38.0520 -56.5680 C 0 0 0 0 0 0 0 0 0 0 0 0
-25.2500 39.9890 -60.5880 O 0 0 0 0 0 0 0 0 0 0 0 0
-25.5350 37.0960 -55.8920 F 0 0 0 0 0 0 0 0 0 0 0 0
-24.2270 39.1350 -60.2650 C 0 0 0 0 0 0 0 0 0 0 0 0
-23.6330 39.0260 -59.2070 O 0 0 0 0 0 0 0 0 0 0 0 0
-23.9080 38.3630 -61.3300 N 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 2 0
1 4 1 0
1 5 1 0
4 6 1 0
5 7 2 0
4 8 1 1
3 9 1 0
6 9 2 0
7 10 1 0
8 10 2 0
6 11 1 0
10 12 1 0
11 13 1 0
13 14 2 0
13 15 1 0
M END
(3)
NC(=O)OC1=CC=CN2C=CC(F)=CC12
(3)
(3)
full
<∆∆G> (3)
-3.2125426166164672
<∆G_bound> (3)
-2.8300333773251842
<∆G_unbound> (3)
0.3825092392912831
(3)
0.7860765441948585
<N_constrained_atoms> (3)
14
<N_unconstrained_atoms> (3)
1
(3)
40.579734325408936
(3)
[]
(3)
[]
<fragmensteinOld_score> (3)
-1.056432
<LE_score> (3)
-0.21417
<comRMSD_score> (3)
0.786077
<fragmensteinNew_score> (3)
0.458834
<ref_mols> (3)
x0020_0B,x0029_0B,x0257_0B
<ref_pdb> (3)
x0020
(3)
NC(=O)OC1=CC=CN2C=CC(F)=C[C@H]12
$$$$
x0020_0B_0-x0020_0B_1-x0020_0B_2-x0020_0B_3-x0029_
RDKit 3D
17 18 0 0 0 0 0 0 0 0999 V2000
-27.2700 40.4190 -57.1050 C 0 0 2 0 0 0 0 0 0 0 0 0
-26.5910 40.0480 -56.0010 C 0 0 0 0 0 0 0 0 0 0 0 0
-27.0620 38.8240 -55.4190 C 0 0 0 0 0 0 0 0 0 0 0 0
-28.2500 39.3150 -57.2190 N 0 0 0 0 0 0 0 0 0 0 0 0
-25.9390 40.6350 -58.3040 S 0 0 2 0 0 0 0 0 0 0 0 0
-28.0180 41.7820 -57.1890 C 0 0 0 0 0 0 0 0 0 0 0 0
-28.1080 38.3320 -56.1100 O 0 0 0 0 0 0 0 0 0 0 0 0
-27.5710 42.5230 -58.4370 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.5280 42.0340 -59.0640 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.1670 39.4870 -59.5480 C 0 0 0 0 0 0 0 0 0 0 0 0
-25.2460 39.5500 -60.6150 N 0 0 0 0 0 0 0 0 0 0 0 0
-24.2790 38.6120 -60.6320 C 0 0 0 0 0 0 0 0 0 0 0 0
-23.6950 38.1170 -59.5800 N 0 0 0 0 0 0 0 0 0 0 0 0
-23.9470 38.2160 -61.8680 N 0 0 0 0 0 0 0 0 0 0 0 0
-24.1470 38.6520 -58.3780 N 0 0 0 0 0 0 0 0 0 0 0 0
-24.1940 37.7880 -57.4310 C 0 0 0 0 0 0 0 0 0 0 0 0
-23.8220 36.5210 -57.6540 O 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 1
2 3 2 0
1 4 1 0
1 5 1 0
1 6 1 0
3 7 1 0
4 7 1 0
6 8 1 0
5 9 1 0
8 9 2 0
5 10 1 6
10 11 1 0
11 12 1 0
12 13 2 3
12 14 1 0
13 15 1 0
15 16 2 3
16 17 1 0
M END
(4)
NC(=NN=CO)NC[SH]1C=CCC12C=CON2
(4)
(4)
full
<∆∆G> (4)
-1.4751787574132826
<∆G_bound> (4)
0.3709133769006228
<∆G_unbound> (4)
1.8460921343139054
(4)
0.998671641541427
<N_constrained_atoms> (4)
16
<N_unconstrained_atoms> (4)
1
(4)
40.927430391311646
(4)
[]
(4)
[]
<fragmensteinOld_score> (4)
-0.696364
<LE_score> (4)
-0.086775
<comRMSD_score> (4)
0.998672
<fragmensteinNew_score> (4)
0.616293
<ref_mols> (4)
x0020_0B,x0029_0B,x0257_0B
<ref_pdb> (4)
x0020
(4)
NC(=NN=CO)NC[S@H]1C=CC[C@]12C=CON2
$$$$
x0020_0B_0-x0020_0B_1-x0020_0B_4-x0029_0B_0-x0029_
RDKit 3D
11 12 0 0 0 0 0 0 0 0999 V2000
-27.3860 40.3310 -57.5180 N 0 0 0 0 0 0 0 0 0 0 0 0
-27.9220 41.5010 -58.0580 C 0 0 0 0 0 0 0 0 0 0 0 0
-27.3310 42.2230 -59.0390 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.4010 39.6210 -58.4010 C 0 0 1 0 0 0 0 0 0 0 0 0
-28.1020 39.5340 -56.6130 C 0 0 0 0 0 0 0 0 0 0 0 0
-25.5930 40.5630 -59.2850 C 0 0 0 0 0 0 0 0 0 0 0 0
-27.6280 38.3730 -56.1240 C 0 0 0 0 0 0 0 0 0 0 0 0
-25.7070 38.5150 -57.6090 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.0600 41.7930 -59.5830 C 0 0 0 0 0 0 0 0 0 0 0 0
-26.3190 37.9390 -56.5450 C 0 0 0 0 0 0 0 0 0 0 0 0
-25.7270 36.9440 -55.8500 F 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 2 0
1 4 1 0
1 5 1 0
4 6 1 1
5 7 2 0
4 8 1 0
3 9 1 0
6 9 2 0
7 10 1 0
8 10 2 0
10 11 1 0
M END
(5)
FC1=CC2C=CC=CN2C=C1
(5)
(5)
full
<∆∆G> (5)
-3.2838353846670283
<∆G_bound> (5)
-3.263028341871855
<∆G_unbound> (5)
0.020807042795173373
(5)
0.8433382363870275
<N_constrained_atoms> (5)
11
<N_unconstrained_atoms> (5)
0
(5)
31.971383333206177
(5)
[]
(5)
[]
<fragmensteinOld_score> (5)
-0.913429
<LE_score> (5)
-0.29853
<comRMSD_score> (5)
0.843338
<fragmensteinNew_score> (5)
0.681693
<ref_mols> (5)
x0020_0B,x0029_0B,x0257_0B
<ref_pdb> (5)
x0020
(5)
FC1=C[C@@h]2C=CC=CN2C=C1
So that it can be imported back into fragalysis - may need to include some code to translate data into the relevant format.
Initially, imported data will be displayed in the RHS as a new computed set
There should be an option to associate an idea from fragalysis with an ELN page/db entry. We will use Scarab for this
Export the data linked to a particular breadcrumb trail - allow user to download or transfer the data from the current context to an external application - e.g. a squint workflow, Jupyter notebook or ELN page
Store specific interactions (e.g. PLIP/oddt) - check Wonka/oommppaa for clustering of interactions
Identifying specific interactions occurring in existing ligands that satisfy pharmacophores/pharmacophore clusters (+ representation)
Use react-router to ensure that certain options can be achieved through URL:
A single ligand is the bare minimum
There should be an option to start a conversation from an idea, or to link an idea in a conversation. We will use Discourse
Snapshot JSON field is actually Text -> Now that we are using a Postgres database, it would make sense to migrate the data to a proper JSONfield allowing use of the Postgres JSON SQL functions, Django JSONField serializers and JSON functionality for improved flexibility for queries/validation.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.