Assignment 7 - web applications
As before, email the "assignment7" directory as an archive.
In this assignment you will some simple web services. I have two variants; the second is for those who are getting bored with sequence data and want to try some small molecule chemistry work using OpenEye. If you are in the latter group you will need to download the latest version of the OEChem toolkit and have me install the license on your machine.
Part 1 - Multiply
Make a CherryPy server program named "mult_server.py". In the index method return an HTML form which takes two numbers, "a" and "b" and sends them to the service "/mult". This will display the product of those two numbers.
Hint: Use the "add" method from the cherrypy_echo.py as the basis for your "mult" method.
Hint: You will need to implement an "index" method. You can either embed the HTML in the Python code or get the HTML from a file, like this:
def index(self): return open("index.html").read()This gets the HTML from the file "index.html", which you can create with your normal editor and view directly in a file.
Part 2 - Base count
Make a CherryPy server program named "count_server.py". The index
method will return an HTML form which asks for a sequence in a
<textarea>. It will send the results to "/basecount". This
will count the number of each letter in the sequence and display the
results in a table. The table rows should be in ASCII (alphabetical)
order. For example, the results table may look like
Character | Count |
---|---|
A | 120 |
C | 8 |
G | 62 |
T | 1053 |
Ignore newlines and other whitespace characters. You should allow "." and "-" and other non-alphabetical characters, including < and &. To make the numbers line up correctly, the count column should be right-aligned instead of the default of left-aligned and the character column should be centered.
Part 2 (alternate) - Atom count
Make a CherryPy server program named "count_server.py". The index
method will return an HTML form which asks for a SMILES string. It
will send the results to "/atomcount". This will count the number of
each atomic element in the sequence and display the results in a
table. The table rows should be in ASCII (alphabetical) order. For
example, the results table may look like
Symbol | Count |
---|---|
C | 12 |
H | 22 |
S | 1 |
You should include the implicit hydrogen count for the "H" row. To make the numbers line up correctly, the count column should be right-aligned instead of the default of left-aligned.
Part 3 - Embedding images
Go to the RCSB/PDB site and bring up the record for "2PLV". Follow the hyperlink on the left labeled "View Structure". At the bottom of the page, under "Custom Size Images" is a form with fields for size, format and a checkbox labeled "Cylinders". Keep the format as "jpeg". and select a size of 250, without checking the cylinders box. Press "Create image".
- What is the URL for the final image?
- What is the URL for the final "with cylinders" image?
- What's the difference between the two URLs
Make a file called "structures.html". This will contain information about three structures – 1REV, 1XTC and 2DHB. For each structure list the structure ID, its title, and its deposition date. Also include an <img> element with the src= the RCSB URL for the "with cylinders" image of the given structure.
When making this file, strive for a readable sense of style. A good style should make it easier for someone to read a document and understand what's going on. A table with a border around all the cells is too noisy, though easy to do. Meaningless colors and animations are similarly distracting.
Part 4 - an image link server
Make a CherryPy server program named "img_linker.py". The index method will return an HTML form which asks for a PDB id. The PDB id is only 4 characters long so read the specification (or other resource) so the text input field only allows 4 characters as input.
Send the form request to the new service named "img_link". This will display the text "Image for $PDBID" (where $PDBID is the 4-letter PDB code) and an in-line image using RCSB as the image source, based on what you learned in part 3. The $PDBID should be hyperlinked to the RCSB entry for that page.
After the image have a form which asks for another SMILES string and sends a request back to the img_link service.
For example, if I enter "3CLN" then the result should look something like:
Image for 3CLN |
Part 4 (alternate) - an image link server
Go to OpenEye's viewmol page. Enter the SMILES string "c1ccccc1O" and "view" it.
- What is the URL for the depiction image?
- What do the 4 variables do?
>>> import base64 >>> base64.decodestring("YzFjY2MoY2MxKU8g") 'c1ccc(cc1)O ' >>> base64.encodestring("c1ccccc1O") 'YzFjY2NjYzFP\n' >>>More precisely the base64 encoded string has the newlines removed and the "+" characters escaped for use in an HTML element attribute value. The short version is, use the following to encode the SMILES string for use as an href.
def encode_smiles(smiles): t = base64.encodestring(smiles) t = t.replace("\n", "") # don't need the newlines t = t.replace("+", "%2B") # escape the + for use in an HTML tab value return t
Make a CherryPy server program named "img_linker.py". The index method will return an HTML form which asks for a SMILES string. The string may be long so read the specification (or other resource) to make sure that the text input element is at least 50 characters wide.
Send the form request to the new service "img_link". This will display the text "Depiction of $SMILES" (where $SMILES is the input SMILES string – remember to escape it!) and an in-line image using OpenEye's depiction service. Choose appropriate values for the other viewing options.
After the image have a form which asks for another SMILES string and sends a request back to the img_link service.
For example, if I enter "c1ccccc1O" then the result should look something like:
Depiction of c1ccccc1O Enter a new SMILES: (Note: SMILES input element will be 50 characters wide.) |
Copyright © 2001-2020 Andrew Dalke Scientific AB