From 1b070d1f7f6f3519373b7ca70c4a1cf13a27189b Mon Sep 17 00:00:00 2001 From: Navan Chauhan Date: Tue, 22 Sep 2020 14:09:28 +0530 Subject: re-added display result page --- app/dock-manual.py | 154 ++++++++++++++++++++++++++++++++++++++ app/dock_docker.py | 154 -------------------------------------- app/templates/display_result.html | 7 ++ 3 files changed, 161 insertions(+), 154 deletions(-) create mode 100644 app/dock-manual.py delete mode 100644 app/dock_docker.py create mode 100644 app/templates/display_result.html diff --git a/app/dock-manual.py b/app/dock-manual.py new file mode 100644 index 0000000..e2da478 --- /dev/null +++ b/app/dock-manual.py @@ -0,0 +1,154 @@ +import mysql.connector as con + +import configparser +iniConfig = configparser.ConfigParser() +iniConfig.read('config.ini') + +try: + iniConfig['DATABASE'] +except KeyError: + iniConfig.read("../config.ini") + +mycon = con.connect(host=iniConfig['DATABASE']['HOST'],user=iniConfig['DATABASE']['USER'],password=iniConfig['DATABASE']['PASSWORD'],port=iniConfig['DATABASE']['PORT'],database=iniConfig['DATABASE']['NAME']) +mycursor = mycon.cursor() + +sql_select_Query = "select * from curieweb where done=0 LIMIT 1" +mycursor.execute(sql_select_Query) + +records = mycursor.fetchall() +if records == []: + print("Empty Set 😳") + print("No active task, exitting gracefully") + exit(0) + +def email(zipArchive): + import smtplib + from email.mime.multipart import MIMEMultipart + from email.mime.text import MIMEText + from email.mime.base import MIMEBase + from email import encoders + + fromaddr = iniConfig['SMTP']['EMAIL'] + toaddr = toEmail + + msg = MIMEMultipart() + msg['From'] = fromaddr + msg['To'] = toaddr + msg['Subject'] = "Curie Web Results for Job ID " + str(jobID) + body = "Attached Zip contains the docked files, PLIP report and PyMOL Visualisations. If the ZIP file does not contain these files, please report this issue by replying to this email. Job was submitted on {} with the description {}".format(date, description) + + msg.attach(MIMEText(body, 'plain')) + filename = "Curie_Web_Results_Job_ID_" + str(jobID) + ".zip" + p = MIMEBase('application', 'octet-stream') + with open((str(zipArchive) + ".zip"), "rb") as attachment: + p.set_payload((attachment).read()) + encoders.encode_base64(p) + p.add_header('Content-Disposition', "attachment; filename= %s" % filename) + msg.attach(p) + + s = smtplib.SMTP(iniConfig['SMTP']['SERVER'], iniConfig['SMTP']['PORT']) + s.starttls() + s.login(fromaddr, iniConfig['SMTP']['PASSWORD']) + text = msg.as_string() + + s.sendmail(fromaddr, toaddr, text) + s.quit() + +def get3DModel(protein,ligand): + try: + import pymol2 + except ImportError: + print("🤭 PyMOL 2 has not been installed correctly") + return None + session = pymol2.PyMOL() + session.start() + cmd = session.cmd + cmd.load(protein,"target") + cmd.load(ligand,"ligand") + cmd.save("model.dae") + session.stop() + +def CopyContentOfFolder(sauce,destination): + src_files = os.listdir(sauce) + for file_name in src_files: + full_file_name = os.path.join(sauce, file_name) + if os.path.isfile(full_file_name): + copy(full_file_name, destination) + +def RemoveAllFilesMatching(directory,pattern): + print(directory+"/*"+pattern) + FileList = glob.glob(directory+"/*"+pattern) + for FilePath in FileList: + try: + print(FilePath) + os.remove(FilePath) + except: + print("Error in removing misc file") + +receptor_name = "protein.pdbqt" +ligand_name = "ligand.pdbqt" +description = "Curie Web Task" + +#print(records[0]) +r = records[0] +jobID = r[0] +toEmail = r[1] +targetB = r[2] +if r[3] is not None: + receptor_name = str(r[3]) +if r[6] is not None: + ligand_name = str(r[6]) +ligandB = r[4] +configB = r[7] +date = r[8] +if r[9] is not None: + description = r[9] + +import os,glob +cd = os.getcwd() +f = os.path.join(cd,"static/uploads") +reportDirectory = os.path.join(f,"reports") +scripts = os.path.join(cd,"scripts") +modelDirectory = os.path.join(f,"3DModels") +#t = os.path.join(f,"receptor",target) +#r = os.path.join(f,"ligands",ligand) +#c = os.path.join(f,"configs",config) +print(f) +import tempfile +from shutil import make_archive, copyfile,copy + +with tempfile.TemporaryDirectory() as directory: + print('The created temporary directory is %s' % directory) + os.chdir(directory) + with open(receptor_name,"wb") as file: + file.write(targetB) + with open(ligand_name,"wb") as file: + file.write(ligandB) + with open("config.txt","wb") as file: + file.write(configB) + # Legacy Docker Curie-Cli Run + #os.system("docker run --rm -v ${PWD}:/results -w /results -u $(id -u ${USER}):$(id -g ${USER}) navanchauhan/curie-cli -r %s -l %s -c config.txt -dpi" % (receptor_name,ligand_name)) + CopyContentOfFolder(scripts,directory) + os.system("./main.sh -r %s -l %s -c config.txt -dpi" % (receptor_name,ligand_name)) + RemoveAllFilesMatching(directory,".py") + RemoveAllFilesMatching(directory,".sh") + z = "Curie_Web_Result_"+str(jobID) + zi = os.path.join(f,z) + make_archive(zi, 'zip', directory) + copyfile("report.pdf",os.path.join(reportDirectory,(str(jobID)+".pdf"))) + get3DModel(receptor_name,ligand_name.replace(".pdbqt","_out.pdbqt")) + os.system("collada2gltf -i model.dae -o model.gltf") + copyfile("model.gltf",os.path.join(modelDirectory,(str(jobID)+".gltf"))) + arch = os.popen("uname -m").read() + print("Generating 3D Model") + if "x86" in arch: + os.system("docker run -it --rm -v $(pwd):/usr/app leon/usd-from-gltf:latest model.gltf model.usdz") + elif "aarch64" in arch: + os.system("docker run -it --rm -v $(pwd):/usr/app navanchauhan/usd-from-gltf:latest model.gltf model.usdz") + try: + copyfile("model.usdz",os.path.join(modelDirectory,(str(jobID)+".usdz"))) + except: + print("Could not generate USDZ file") + email(zi) + mycursor.execute('UPDATE curieweb set done=1 where id="%s"' % (jobID)) + mycon.commit() diff --git a/app/dock_docker.py b/app/dock_docker.py deleted file mode 100644 index e2da478..0000000 --- a/app/dock_docker.py +++ /dev/null @@ -1,154 +0,0 @@ -import mysql.connector as con - -import configparser -iniConfig = configparser.ConfigParser() -iniConfig.read('config.ini') - -try: - iniConfig['DATABASE'] -except KeyError: - iniConfig.read("../config.ini") - -mycon = con.connect(host=iniConfig['DATABASE']['HOST'],user=iniConfig['DATABASE']['USER'],password=iniConfig['DATABASE']['PASSWORD'],port=iniConfig['DATABASE']['PORT'],database=iniConfig['DATABASE']['NAME']) -mycursor = mycon.cursor() - -sql_select_Query = "select * from curieweb where done=0 LIMIT 1" -mycursor.execute(sql_select_Query) - -records = mycursor.fetchall() -if records == []: - print("Empty Set 😳") - print("No active task, exitting gracefully") - exit(0) - -def email(zipArchive): - import smtplib - from email.mime.multipart import MIMEMultipart - from email.mime.text import MIMEText - from email.mime.base import MIMEBase - from email import encoders - - fromaddr = iniConfig['SMTP']['EMAIL'] - toaddr = toEmail - - msg = MIMEMultipart() - msg['From'] = fromaddr - msg['To'] = toaddr - msg['Subject'] = "Curie Web Results for Job ID " + str(jobID) - body = "Attached Zip contains the docked files, PLIP report and PyMOL Visualisations. If the ZIP file does not contain these files, please report this issue by replying to this email. Job was submitted on {} with the description {}".format(date, description) - - msg.attach(MIMEText(body, 'plain')) - filename = "Curie_Web_Results_Job_ID_" + str(jobID) + ".zip" - p = MIMEBase('application', 'octet-stream') - with open((str(zipArchive) + ".zip"), "rb") as attachment: - p.set_payload((attachment).read()) - encoders.encode_base64(p) - p.add_header('Content-Disposition', "attachment; filename= %s" % filename) - msg.attach(p) - - s = smtplib.SMTP(iniConfig['SMTP']['SERVER'], iniConfig['SMTP']['PORT']) - s.starttls() - s.login(fromaddr, iniConfig['SMTP']['PASSWORD']) - text = msg.as_string() - - s.sendmail(fromaddr, toaddr, text) - s.quit() - -def get3DModel(protein,ligand): - try: - import pymol2 - except ImportError: - print("🤭 PyMOL 2 has not been installed correctly") - return None - session = pymol2.PyMOL() - session.start() - cmd = session.cmd - cmd.load(protein,"target") - cmd.load(ligand,"ligand") - cmd.save("model.dae") - session.stop() - -def CopyContentOfFolder(sauce,destination): - src_files = os.listdir(sauce) - for file_name in src_files: - full_file_name = os.path.join(sauce, file_name) - if os.path.isfile(full_file_name): - copy(full_file_name, destination) - -def RemoveAllFilesMatching(directory,pattern): - print(directory+"/*"+pattern) - FileList = glob.glob(directory+"/*"+pattern) - for FilePath in FileList: - try: - print(FilePath) - os.remove(FilePath) - except: - print("Error in removing misc file") - -receptor_name = "protein.pdbqt" -ligand_name = "ligand.pdbqt" -description = "Curie Web Task" - -#print(records[0]) -r = records[0] -jobID = r[0] -toEmail = r[1] -targetB = r[2] -if r[3] is not None: - receptor_name = str(r[3]) -if r[6] is not None: - ligand_name = str(r[6]) -ligandB = r[4] -configB = r[7] -date = r[8] -if r[9] is not None: - description = r[9] - -import os,glob -cd = os.getcwd() -f = os.path.join(cd,"static/uploads") -reportDirectory = os.path.join(f,"reports") -scripts = os.path.join(cd,"scripts") -modelDirectory = os.path.join(f,"3DModels") -#t = os.path.join(f,"receptor",target) -#r = os.path.join(f,"ligands",ligand) -#c = os.path.join(f,"configs",config) -print(f) -import tempfile -from shutil import make_archive, copyfile,copy - -with tempfile.TemporaryDirectory() as directory: - print('The created temporary directory is %s' % directory) - os.chdir(directory) - with open(receptor_name,"wb") as file: - file.write(targetB) - with open(ligand_name,"wb") as file: - file.write(ligandB) - with open("config.txt","wb") as file: - file.write(configB) - # Legacy Docker Curie-Cli Run - #os.system("docker run --rm -v ${PWD}:/results -w /results -u $(id -u ${USER}):$(id -g ${USER}) navanchauhan/curie-cli -r %s -l %s -c config.txt -dpi" % (receptor_name,ligand_name)) - CopyContentOfFolder(scripts,directory) - os.system("./main.sh -r %s -l %s -c config.txt -dpi" % (receptor_name,ligand_name)) - RemoveAllFilesMatching(directory,".py") - RemoveAllFilesMatching(directory,".sh") - z = "Curie_Web_Result_"+str(jobID) - zi = os.path.join(f,z) - make_archive(zi, 'zip', directory) - copyfile("report.pdf",os.path.join(reportDirectory,(str(jobID)+".pdf"))) - get3DModel(receptor_name,ligand_name.replace(".pdbqt","_out.pdbqt")) - os.system("collada2gltf -i model.dae -o model.gltf") - copyfile("model.gltf",os.path.join(modelDirectory,(str(jobID)+".gltf"))) - arch = os.popen("uname -m").read() - print("Generating 3D Model") - if "x86" in arch: - os.system("docker run -it --rm -v $(pwd):/usr/app leon/usd-from-gltf:latest model.gltf model.usdz") - elif "aarch64" in arch: - os.system("docker run -it --rm -v $(pwd):/usr/app navanchauhan/usd-from-gltf:latest model.gltf model.usdz") - try: - copyfile("model.usdz",os.path.join(modelDirectory,(str(jobID)+".usdz"))) - except: - print("Could not generate USDZ file") - email(zi) - mycursor.execute('UPDATE curieweb set done=1 where id="%s"' % (jobID)) - mycon.commit() diff --git a/app/templates/display_result.html b/app/templates/display_result.html new file mode 100644 index 0000000..3c6873e --- /dev/null +++ b/app/templates/display_result.html @@ -0,0 +1,7 @@ +{% extends 'base.html' %} + +{% block main %} +

Job ID: {{ job }}

+

Succesfuly Submitted

+ Description: {{description}} +{% endblock %} -- cgit v1.2.3