def redirector(name, weboptions): """ Prints a page which redirects the user to querystatus.cgi and writes starting time to file """ redirectWait = 3 utilities.startLogFile(name, 'pdb2pqr_start_time', str(time.time())) jobid = int(name) analiticsDict = weboptions.getOptions() events = {} events['submission'] = analiticsDict['pdb']+'|'+str(os.environ["REMOTE_ADDR"]) del analiticsDict['pdb'] events['titration'] = str(analiticsDict.get('ph')) if 'ph' in analiticsDict: del analiticsDict['ph'] events['apbsInput'] = str(analiticsDict.get('apbs')) del analiticsDict['apbs'] #Clean up selected extensions output if 'selectedExtensions' in analiticsDict: analiticsDict['selectedExtensions'] = ' '.join(analiticsDict['selectedExtensions']) options = ','.join(str(k)+':'+str(v) for k,v in analiticsDict.items()) events['options']=options eventsScriptString = '' for event in events: eventsScriptString += utilities.getEventTrackingString(category='submissionData', action=event, label=events[event]) redirectURL = "{website}querystatus.cgi?jobid={jobid}&calctype=pdb2pqr".format(website=WEBSITE, jobid=jobid) string = """ <html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <meta http-equiv="Refresh" content="{wait}; url={redirectURL}"> <link rel="stylesheet" href="{website}pdb2pqr.css"type="text/css"> </head> <body> <center> You are being automatically redirected to a new location.<br /> If your browser does not redirect you in {wait} seconds, or you do not wish to wait, <a href="{redirectURL}">click here</a></center>. </body> </html>""".format(trackingscript=utilities.getTrackingScriptString(jobid=jobid), trackingevents=eventsScriptString, redirectURL=redirectURL, wait=redirectWait, website=WEBSITE) return string
def main(apbsOptions): cgiFile = "jmol.cgi" cgiName = "thisform" defaultVisType = "jmol" checkJmolType = True cssFile = 'pdb2pqr.css' jobid = form['jobid'].value string = """ <html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="pdb2pqr.css" type="text/css"> <script type="text/JavaScript" src="jmol/Jmol.js"></script> <script type="text/JavaScript">APPLET_PATH="jmol/";GZIP=""</script> <script type="text/JavaScript" src="jmol/apbsjmol.js"></script> </head> <body onload="init()"> <script type="text/javascript">createVisualization({jobid}, -5.0, 5.0)</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString(category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) print string
def main(apbsOptions): cgiFile = "jmol.cgi" cgiName = "thisform" defaultVisType = "jmol" checkJmolType = True cssFile = 'pdb2pqr.css' jobid = form['jobid'].value string = """ <html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="pdb2pqr.css" type="text/css"> <script type="text/JavaScript" src="jmol/Jmol.js"></script> <script type="text/JavaScript">APPLET_PATH="jmol/";GZIP=""</script> <script type="text/JavaScript" src="jmol/apbsjmol.js"></script> </head> <body onload="init()"> <script type="text/javascript">createVisualization({jobid}, -5.0, 5.0)</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString( category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) print string
def redirector(name, weboptions): """ Prints a page which redirects the user to querystatus.cgi and writes starting time to file """ redirectWait = 3 utilities.startLogFile(name, 'pdb2pqr_start_time', str(time.time())) jobid = int(name) analiticsDict = weboptions.getOptions() events = {} events['submission'] = analiticsDict['pdb']+'|'+str(os.environ["REMOTE_ADDR"]) del analiticsDict['pdb'] events['titration'] = str(analiticsDict.get('ph')) if 'ph' in analiticsDict: del analiticsDict['ph'] events['apbsInput'] = str(analiticsDict.get('apbs')) del analiticsDict['apbs'] #Clean up selected extensions output if 'selectedExtensions' in analiticsDict: analiticsDict['selectedExtensions'] = ' '.join(analiticsDict['selectedExtensions']) options = ','.join(str(k)+':'+str(v) for k,v in analiticsDict.items()) events['options']=options eventsScriptString = '' for event in events: eventsScriptString += utilities.getEventTrackingString(category='submissionData', action=event, label=events[event]) redirectURL = "{website}querystatus.cgi?jobid={jobid}&calctype=pdb2pqr".format(website=WEBSITE, jobid=jobid) string = """ <html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <meta http-equiv="Refresh" content="{wait}; url={redirectURL}"> <link rel="stylesheet" href="{website}pdb2pqr.css"type="text/css"> </head> <body> <center> You are being automatically redirected to a new location.<br /> If your browser does not redirect you in {wait} seconds, or you do not wish to wait, <a href="{redirectURL}">click here</a></center>. </body> </html>""".format(trackingscript=utilities.getTrackingScriptString(jobid=jobid), trackingevents=eventsScriptString, redirectURL=redirectURL, wait=redirectWait, website=WEBSITE) return string
def main(apbsOptions): cgiFile = "jmol.cgi" cgiName = "thisform" defaultVisType = "jmol" checkJmolType = True cssFile = 'pdb2pqr.css' jobid = form['jobid'].value string = """ <!DOCTYPE html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="3dmol/css/pdb2pqr_3dmol.css" type="text/css"> <link rel="stylesheet" href="3dmol/css/foundation.css"> <link rel="stylesheet" type="text/css" href="3dmol/css/pure-min.css" media="screen" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://3dmol.csb.pitt.edu/build/3Dmol.js"></script> <script type="text/JavaScript" src="3dmol/js/visualize_html.js"></script> <script type="text/JavaScript" src="3dmol/js/3dmol.js"></script> </head> <body> <script type="text/javascript">build_page({jobid})</script> <script type="text/javascript">getpqr({jobid})</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString( category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) print string
def main(apbsOptions): cgiFile = "jmol.cgi" cgiName = "thisform" defaultVisType = "jmol" checkJmolType = True cssFile = 'pdb2pqr.css' jobid = form['jobid'].value string = """ <!DOCTYPE html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="3dmol/css/pdb2pqr_3dmol.css" type="text/css"> <link rel="stylesheet" href="3dmol/css/foundation.css"> <link rel="stylesheet" type="text/css" href="3dmol/css/pure-min.css" media="screen" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://3dmol.csb.pitt.edu/build/3Dmol.js"></script> <script type="text/JavaScript" src="3dmol/js/visualize_html.js"></script> <script type="text/JavaScript" src="3dmol/js/3dmol.js"></script> </head> <body> <script type="text/javascript">build_page({jobid})</script> <script type="text/javascript">getpqr({jobid})</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString(category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) print string
def mainCGI(): """ Main method for determining the query page output """ logopts = {} print "Content-type: text/html\n\n" calctype = form["calctype"].value # prints version error, if it exists if form["jobid"].value == 'False': print printheader("%s Job Status Page" % calctype.upper()) progress = "version_mismatch" runtime = 0 elif form["jobid"].value == 'notenoughmem': print printheader("%s Job Status Page" % calctype.upper()) progress = "not_enough_memory" runtime = 0 else: progress = None #Check for error html errorpath = '%s%s%s.html' % (INSTALLDIR, TMPDIR, form["jobid"].value) if os.path.isfile(errorpath): string = "" string += "<html>\n" string += "\t<head>\n" string += "\t\t<meta http-equiv=\"Refresh\" content=\"0; url=%s%s%s.html\">\n" % ( WEBSITE, TMPDIR, form["jobid"].value) string += "\t</head>\n" string += "</html>\n" print string return # prepares for Opal query, if necessary if have_opal: if calctype == "pdb2pqr": opal_url = PDB2PQR_OPAL_URL elif calctype == "apbs": opal_url = APBS_OPAL_URL appLocator = AppServiceLocator() appServicePort = appLocator.getAppServicePort(opal_url) else: appServicePort = None # if PDB2PQR, determines if link to APBS calculation should be shown if calctype == "pdb2pqr": #if(form["apbsinput"].value=="True"): # change to use a file # apbs_input = True #else: # apbs_input = False apbsInputFile = open('%s%s%s/apbs_input' % (INSTALLDIR, TMPDIR, form["jobid"].value)) apbs_input = apbsInputFile.read() apbsInputFile.close() if apbs_input == "True": apbs_input = True else: apbs_input = False typemapInputFile = open('%s%s%s/typemap' % (INSTALLDIR, TMPDIR, form["jobid"].value)) typemap = typemapInputFile.read() typemapInputFile.close() if typemap == "True": typemap = True else: typemap = False if have_opal and progress == None: if form["calctype"].value == "pdb2pqr": pdb2pqrJobIDFile = open('%s%s%s/pdb2pqr_opal_job_id' % (INSTALLDIR, TMPDIR, form["jobid"].value)) jobid = pdb2pqrJobIDFile.read() pdb2pqrJobIDFile.close() elif form["calctype"].value == "apbs": apbsJobIDFile = open('%s%s%s/apbs_opal_job_id' % (INSTALLDIR, TMPDIR, form["jobid"].value)) jobid = apbsJobIDFile.read() apbsJobIDFile.close() else: jobid = form["jobid"].value if progress == None: cp = checkprogress(jobid, appServicePort, calctype) # finds out status of job progress = cp[0] #initialize with bogus value just in case starttime = time.time() if progress == "running" or progress == "complete": timefile = open( '%s%s%s/%s_start_time' % (INSTALLDIR, TMPDIR, form["jobid"].value, form["calctype"].value)) starttime = float(timefile.read()) timefile.close() if progress == "running" or (have_opal and progress not in ( "version_mismatch", "not_enough_memory", "error", "complete")): runtime = time.time() - starttime elif progress == "complete": endTimeFileString = '%s%s%s/%s_end_time' % ( INSTALLDIR, TMPDIR, form["jobid"].value, form["calctype"].value) if have_opal and not os.path.isfile(endTimeFileString): runtime = time.time() - starttime with open(endTimeFileString, 'w') as endTimeFile: endTimeFile.write(str(time.time())) else: with open(endTimeFileString, 'r') as endTimeFile: runtime = float(endTimeFile.read()) - starttime else: runtime = -1 if progress == "running": #if have_opal: # resultsurl = cp[1]._baseURL #else: if calctype == "pdb2pqr": resultsurl = '%squerystatus.cgi?jobid=%s&apbsinput=%s&calctype=pdb2pqr' % ( WEBSITE, form["jobid"].value, apbs_input) else: resultsurl = '%squerystatus.cgi?jobid=%s&calctype=apbs' % ( WEBSITE, form["jobid"].value) if progress == "complete": print printheader("%s Job Status Page" % calctype.upper(), jobid=form["jobid"].value) elif progress == "error": print printheader("%s Job Status Page - Error" % calctype.upper(), 0, jobid=form["jobid"].value) elif progress == "running": # job is not complete, refresh in 30 seconds print printheader("%s Job Status Page" % calctype.upper(), refresh, jobid=form["jobid"].value) print "<BODY>\n<P>" print "<h3>Status" print "</h3>" print "Message: %s<br />" % progress print "Run time: %s seconds<br />" % int(runtime) print "Current time: %s<br />" % time.asctime() print "</P>\n<HR>\n<P>" if progress == "complete": if calctype == "pdb2pqr": nexturl = 'apbs_cgi.cgi?jobid=%s' % form["jobid"].value else: nexturl = 'visualize.cgi?jobid=%s' % form["jobid"].value if have_opal: resp = appServicePort.getOutputs(getOutputsRequest(jobid)) filelist = resp._outputFile print "Here are the results:<ul>" print "<li>Input files<ul>" if calctype == "pdb2pqr": # this code should be cleaned up once local PDB2PQR runs output the PDB file with the .pdb extension if have_opal: for i in range(0, len(filelist)): if len(filelist[i]._name) == 4: print "<li><a href=%s>%s</a></li>" % ( filelist[i]._url, filelist[i]._name) else: print "<li><a href=%s%s%s/%s.pdb>%s.pdb</a></li>" % ( WEBSITE, TMPDIR, jobid, jobid, jobid) elif calctype == "apbs": if have_opal: for i in range(0, len(filelist)): if filelist[i]._name == "apbsinput.in" or filelist[ i]._name[-4:] == ".pqr": print "<li><a href=%s>%s</a></li>" % ( filelist[i]._url, filelist[i]._name) else: print "<li><a href=%s%s%s/apbsinput.in>apbsinput.in</a></li>" % ( WEBSITE, TMPDIR, jobid) print "<li><a href=%s%s%s/%s.pqr>%s.pqr</a></li>" % ( WEBSITE, TMPDIR, jobid, jobid, jobid) print "</ul></li>" print "<li>Output files<ul>" queryString = [str(os.environ["REMOTE_ADDR"])] # Getting PDB2PQR run log info if os.path.isfile('%s%s%s/pdb2pqr_log' % (INSTALLDIR, TMPDIR, jobid)): pdb2pqrLogFile = open( '%s%s%s/pdb2pqr_log' % (INSTALLDIR, TMPDIR, jobid), 'r') logstr = pdb2pqrLogFile.read().split('\n') templogopts = eval(logstr[0]) pdb2pqrLogFile.close() queryString.insert(0, templogopts.get('pdb', '')) if calctype == "pdb2pqr": if have_opal: for i in range(0, len(filelist)): if filelist[i]._name.endswith( (".propka", "-typemap.html", ".pqr", ".in")): # if filelist[i]._name[-4:]==".pqr": # # Getting pqr file length for PDB2PQR Opal run # f=urllib.urlopen(filelist[i]._url) # #pqrOpalFileLength = len(f.readlines()) # f.close() print "<li><a href=%s>%s</a></li>" % ( filelist[i]._url, filelist[i]._name) #Get the first line of the summary file. if filelist[i]._name.endswith(".summary"): f = urllib.urlopen(filelist[i]._url) summaryLine = f.readline().strip() #logopts["pdb"]=logopts.get("pdb", "") + "|" + summaryLine queryString.append(summaryLine) f.close() # logRun(logopts, runtime, pqrOpalFileLength, logff, REMOTE_ADDR) else: #Get the first line of the summary file. summaryFile = '%s%s%s/%s%s' % (INSTALLDIR, TMPDIR, jobid, jobid, ".summary") if os.path.isfile(summaryFile): with open(summaryFile) as f: summaryLine = f.readline().strip() #logopts["pdb"]=logopts.get("pdb", "") + "|" + summaryLine queryString.append(summaryLine) outputfilelist = glob.glob('%s%s%s/*.propka' % (INSTALLDIR, TMPDIR, jobid)) for i in range(0, len(outputfilelist)): outputfilelist[i] = os.path.basename(outputfilelist[i]) for extension in ["-typemap.html", ".pqr", ".in"]: if extension != ".in" or apbs_input != False: if extension == "-typemap.html" and typemap == False: continue outputfilelist.append('%s%s' % (jobid, extension)) for outputfile in outputfilelist: print "<li><a href=%s%s%s/%s>%s</a></li>" % ( WEBSITE, TMPDIR, jobid, outputfile, outputfile) logopts['queryPDB2PQR'] = '|'.join(queryString) #for extension in ["-typemap.html", ".pqr", ".in"]: # print "<li><a href=%s%s%s/%s%s>%s%s</a></li>" % (WEBSITE, TMPDIR, jobid, jobid, extension, jobid, extension) elif calctype == "apbs": if have_opal: for i in range(0, len(filelist)): if filelist[i]._name[-3:] == ".dx": # compressing APBS OpenDX output files currentpath = os.getcwd() zipjobid = filelist[i]._name.split("-")[0] urllib.urlretrieve( filelist[i]._url, '%s%s%s/%s' % (INSTALLDIR, TMPDIR, zipjobid, filelist[i]._name)) os.chdir('%s%s%s' % (INSTALLDIR, TMPDIR, zipjobid)) # making both the dx file and the compressed file (.gz) available in the directory syscommand = 'cp %s dxbkupfile' % (filelist[i]._name) os.system(syscommand) syscommand = 'gzip -9 ' + filelist[i]._name os.system(syscommand) syscommand = 'mv dxbkupfile %s' % (filelist[i]._name) os.system(syscommand) os.chdir(currentpath) outputfilezip = filelist[i]._name + '.gz' print "<li><a href=%s%s%s/%s>%s</a></li>" % ( WEBSITE, TMPDIR, zipjobid, outputfilezip, outputfilezip) else: outputfilelist = glob.glob('%s%s%s/%s-*.dx' % (INSTALLDIR, TMPDIR, jobid, jobid)) for outputfile in outputfilelist: # compressing APBS OpenDX output files currentpath = os.getcwd() workingpath = os.path.dirname(outputfile) os.chdir(workingpath) # making both the dx file and the compressed file (.gz) available in the directory syscommand = 'cp %s dxbkupfile' % ( os.path.basename(outputfile)) os.system(syscommand) syscommand = 'gzip -9 ' + os.path.basename(outputfile) os.system(syscommand) syscommand = 'mv dxbkupfile %s' % ( os.path.basename(outputfile)) os.system(syscommand) os.chdir(currentpath) outputfilezip = outputfile + ".gz" print "<li><a href=%s%s%s/%s>%s</a></li>" % ( WEBSITE, TMPDIR, jobid, os.path.basename(outputfilezip), os.path.basename(outputfilezip)) logopts['queryAPBS'] = '|'.join(queryString) print "</ul></li>" print "<li>Runtime and debugging information<ul>" if have_opal: stdouturl = resp._stdOut stderrurl = resp._stdErr else: stdouturl = "%s%s%s/%s_stdout.txt" % (WEBSITE, TMPDIR, jobid, calctype) stderrurl = "%s%s%s/%s_stderr.txt" % (WEBSITE, TMPDIR, jobid, calctype) print "<li><a href=%s>Program output (stdout)</a></li>" % stdouturl print "<li><a href=%s>Program errors and warnings (stderr)</a></li>" % stderrurl print "</ul></li></ul>" #if have_opal: # resp = appServicePort.getOutputs(getOutputsRequest(jobid)) # for opalfile in resp._outputFile: # if opalfile._name[-8:]!="-input.p": # print "<li><a href=%s>%s</a></li>" % (opalfile._url, opalfile._name) # print "<li><a href=%s>Standard output</a></li>" % (resp._stdOut) # print "<li><a href=%s>Standard error</a></li>" % (resp._stdErr) #else: # for line in cp[1:]: # line = os.path.basename(line) # if line[-8:]!="-input.p": # if line[-11:]=="_stdout.txt": # printname = "Standard output" # elif line[-11:]=="_stderr.txt": # printname = "Standard error" # else: # printname = line # print "<li><a href=%s>%s</a></li>" % (WEBSITE+TMPDIR+jobid+"/"+line,printname) if calctype == "pdb2pqr" and apbs_input and HAVE_APBS != "": print "</ul></p><hr><p><b><a href=%s>Click here</a> to run APBS with your results.</b></p>" % nexturl elif calctype == "apbs": print "</ul></p><hr><p><b><a href=%s>Click here</a> to visualize your results.</b></p>" % nexturl elif progress == "error": print "There was an error with your query request. This page will not refresh." elif progress == "running": print "Page will refresh in %d seconds<br />" % refresh print "<HR>" print "<small>Your results will appear at <a href=%s>this page</a>. If you want, you can bookmark it and come back later (note: results are only stored for approximately 12-24 hours).</small>" % resultsurl elif progress == "version_mismatch": print "The versions of APBS on the local server and on the Opal server do not match, so the calculation could not be completed" print "</P>" print "<script type=\"text/javascript\">" for key in logopts: print getEventTrackingString('queryData', key, logopts[key]), #print "_gaq.push(['_trackPageview', '/main_cgi/has_%s_%s.html']);" % (key, logopts[key]) print "</script>" print "</BODY>" print "</HTML>"
def main(apbsOptions): cgiFile = "jmol.cgi" cgiName = "thisform" defaultVisType = "jmol" checkJmolType = True cssFile = 'pdb2pqr.css' try: jobid = form['jobid'].value tool = form['tool'].value #run 3dmol or jmol except KeyError: print redirectString return string_3dmol = """ <!DOCTYPE html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="3dmol/css/pdb2pqr_3dmol.css" type="text/css"> <link rel="stylesheet" href="3dmol/css/foundation.css"> <link rel="stylesheet" type="text/css" href="3dmol/css/pure-min.css" media="screen" /> <link rel="stylesheet" href="3dmol/css/toggles.css" type="text/css"> <link rel="stylesheet" href="3dmol/css/ui_css.css" type="text/css"> <script type="text/JavaScript" src="3dmol/js/pitt_3Dmol.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://3dmol.csb.pitt.edu/build/3Dmol.js"></script> <script type="text/JavaScript" src="3dmol/js/visualize_html.js"></script> <script type="text/JavaScript" src="3dmol/js/3dmol.js"></script> </head> <body> <script type="text/javascript">build_page({jobid})</script> <script type="text/javascript">getpqr({jobid})</script> <script type="text/javascript">getcube({jobid})</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString( category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) string_jmol = """ <!DOCTYPE html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="pdb2pqr.css" type="text/css"> <script type="text/JavaScript" src="jmol/Jmol.js"></script> <script type="text/JavaScript">APPLET_PATH="jmol/";GZIP=""</script> <script type="text/JavaScript" src="jmol/apbsjmol.js"></script> </head> <body onload="init()"> <script type="text/javascript">createVisualization({jobid}, -5.0, 5.0)</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString( category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) if (tool == 'tool_3dmol'): print string_3dmol if (tool == 'tool_jmol'): print string_jmol
def mainCGI(): """ Main method for determining the query page output """ logopts = {} print "Content-type: text/html\n\n" calctype = form["calctype"].value # prints version error, if it exists if form["jobid"].value == 'False': print printheader("%s Job Status Page" % calctype.upper()) progress = "version_mismatch" runtime = 0 elif form["jobid"].value == 'notenoughmem': print printheader("%s Job Status Page" % calctype.upper()) progress = "not_enough_memory" runtime = 0 else: progress = None #Check for error html errorpath = '%s%s%s.html' % (INSTALLDIR, TMPDIR, form["jobid"].value) if os.path.isfile(errorpath): string = "" string+= "<html>\n" string+= "\t<head>\n" string+= "\t\t<meta http-equiv=\"Refresh\" content=\"0; url=%s%s%s.html\">\n" % (WEBSITE, TMPDIR, form["jobid"].value) string+= "\t</head>\n" string+= "</html>\n" print string return # prepares for Opal query, if necessary if have_opal: if calctype=="pdb2pqr": opal_url = PDB2PQR_OPAL_URL elif calctype=="apbs": opal_url = APBS_OPAL_URL appLocator = AppServiceLocator() appServicePort = appLocator.getAppServicePort(opal_url) else: appServicePort = None # if PDB2PQR, determines if link to APBS calculation should be shown if calctype=="pdb2pqr": #if(form["apbsinput"].value=="True"): # change to use a file # apbs_input = True #else: # apbs_input = False apbsInputFile = open('%s%s%s/apbs_input' % (INSTALLDIR, TMPDIR, form["jobid"].value)) apbs_input = apbsInputFile.read() apbsInputFile.close() if apbs_input=="True": apbs_input = True else: apbs_input = False typemapInputFile = open('%s%s%s/typemap' % (INSTALLDIR, TMPDIR, form["jobid"].value)) typemap = typemapInputFile.read() typemapInputFile.close() if typemap=="True": typemap = True else: typemap = False if have_opal and progress == None: if form["calctype"].value=="pdb2pqr": pdb2pqrJobIDFile = open('%s%s%s/pdb2pqr_opal_job_id' % (INSTALLDIR, TMPDIR, form["jobid"].value)) jobid = pdb2pqrJobIDFile.read() pdb2pqrJobIDFile.close() elif form["calctype"].value=="apbs": apbsJobIDFile = open('%s%s%s/apbs_opal_job_id' % (INSTALLDIR, TMPDIR, form["jobid"].value)) jobid = apbsJobIDFile.read() apbsJobIDFile.close() else: jobid = form["jobid"].value if progress == None: cp = checkprogress(jobid,appServicePort,calctype) # finds out status of job progress = cp[0] #initialize with bogus value just in case starttime = time.time() if progress == "running" or progress == "complete": timefile = open('%s%s%s/%s_start_time' % (INSTALLDIR, TMPDIR, form["jobid"].value, form["calctype"].value)) starttime = float(timefile.read()) timefile.close() if progress == "running" or (have_opal and progress not in ("version_mismatch", "not_enough_memory", "error", "complete")): runtime = time.time()-starttime runtime = int(runtime) elif progress == "complete": endTimeFileString = '%s%s%s/%s_end_time' % (INSTALLDIR, TMPDIR, form["jobid"].value, form["calctype"].value) if have_opal and not os.path.isfile(endTimeFileString): runtime = time.time()-starttime with open(endTimeFileString, 'w') as endTimeFile: endTimeFile.write(str(time.time())) else: with open(endTimeFileString, 'r') as endTimeFile: runtime = float(endTimeFile.read())-starttime else: runtime = -1 if progress == "running": #if have_opal: # resultsurl = cp[1]._baseURL #else: if calctype=="pdb2pqr": resultsurl = '%squerystatus.cgi?jobid=%s&apbsinput=%s&calctype=pdb2pqr' % (WEBSITE, form["jobid"].value, apbs_input) else: resultsurl = '%squerystatus.cgi?jobid=%s&calctype=apbs' % (WEBSITE, form["jobid"].value) if progress == "complete": print printheader("%s Job Status Page" % calctype.upper(), jobid=form["jobid"].value) elif progress == "error": print printheader("%s Job Status Page - Error" % calctype.upper(),0, jobid=form["jobid"].value) elif progress == "running": # job is not complete, refresh in 30 seconds print printheader("%s Job Status Page" % calctype.upper(), refresh, jobid=form["jobid"].value) print "<BODY>\n<P>" print "<p></p>" print '<div id="content">' print "<h3>Status:" color = "FA3434" image = WEBSITE+"images/red_x.png" if progress == "complete": color = "2CDE56" image = WEBSITE+"images/green_check.png" elif progress == "running": color = "ffcc00" image = WEBSITE+"images/yellow_exclamation.png" print "<strong style=\"color:#%s;\">%s</strong>" % (color, progress) print "<img src=\"%s\"><br />" % image print "</h3>" print "Run time: " + str(timedelta(seconds=round(runtime))) + '<br />' print "Current time: %s<br />" % time.asctime() print "</P>\n<HR>\n<P>" if progress == "complete": if calctype=="pdb2pqr": nexturl = 'apbs_cgi.cgi?jobid=%s' % form["jobid"].value else: url_3dmol = 'visualize.cgi?jobid=%s&tool=%s' % (form["jobid"].value,'tool_3dmol') url_jmol = 'visualize.cgi?jobid=%s&tool=%s' % (form["jobid"].value,'tool_jmol') if have_opal: resp = appServicePort.getOutputs(getOutputsRequest(jobid)) filelist = resp._outputFile print "Here are the results:<ul>" print "<li>Input files<ul>" if calctype=="pdb2pqr": # this code should be cleaned up once local PDB2PQR runs output the PDB file with the .pdb extension if have_opal: for i in range(0,len(filelist)): file_name = filelist[i]._name if ((len(file_name) == 4 and '.' not in file_name) or (file_name.lower().endswith(".pdb") and "pdb2pka_output" not in file_name)): print "<li><a href=%s>%s</a></li>" % (filelist[i]._url, filelist[i]._name) if file_name.lower().endswith((".mol", ".mol2", ".names", ".dat")) and "pdb2pka_output" not in file_name: print "<li><a href=%s>%s</a></li>" % (filelist[i]._url, filelist[i]._name) else: print "<li><a href=%s%s%s/%s.pdb>%s.pdb</a></li>" % (WEBSITE, TMPDIR, jobid, jobid, jobid) elif calctype=="apbs": if have_opal: for i in range(0,len(filelist)): if filelist[i]._name == "apbsinput.in" or filelist[i]._name[-4:] == ".pqr": print "<li><a href=%s>%s</a></li>" % (filelist[i]._url, filelist[i]._name) else: print "<li><a href=%s%s%s/apbsinput.in>apbsinput.in</a></li>" % (WEBSITE, TMPDIR, jobid) print "<li><a href=%s%s%s/%s.pqr>%s.pqr</a></li>" % (WEBSITE, TMPDIR, jobid, jobid, jobid) print "</ul></li>" print "<li>Output files<ul>" queryString = [str(os.environ["REMOTE_ADDR"])] # Getting PDB2PQR run log info if os.path.isfile('%s%s%s/pdb2pqr_log' % (INSTALLDIR, TMPDIR, jobid)): pdb2pqrLogFile=open('%s%s%s/pdb2pqr_log' % (INSTALLDIR, TMPDIR, jobid), 'r') logstr=pdb2pqrLogFile.read().split('\n') templogopts = eval(logstr[0]) pdb2pqrLogFile.close() queryString.insert(0, templogopts.get('pdb','')) if calctype=="pdb2pqr": if have_opal: for i in range(0,len(filelist)): if filelist[i]._name.endswith((".propka", "-typemap.html")): print "<li><a href=%s>%s</a></li>" % (filelist[i]._url, filelist[i]._name) if filelist[i]._name.endswith(".in") and "pdb2pka_output" not in filelist[i]._name: print "<li><a href=%s>%s</a></li>" % (filelist[i]._url, filelist[i]._name) if filelist[i]._name.endswith(".pqr") and not filelist[i]._name.endswith("background_input.pqr"): print "<li><a href=%s>%s</a></li>" % (filelist[i]._url, filelist[i]._name) #Get the first line of the summary file. if filelist[i]._name.endswith(".summary"): f=urllib.urlopen(filelist[i]._url) summaryLine = f.readline().strip() #logopts["pdb"]=logopts.get("pdb", "") + "|" + summaryLine queryString.append(summaryLine) f.close() # logRun(logopts, runtime, pqrOpalFileLength, logff, REMOTE_ADDR) else: #Get the first line of the summary file. summaryFile = '%s%s%s/%s%s' % (INSTALLDIR, TMPDIR, jobid, jobid, ".summary") if os.path.isfile(summaryFile): with open(summaryFile) as f: summaryLine = f.readline().strip() #logopts["pdb"]=logopts.get("pdb", "") + "|" + summaryLine queryString.append(summaryLine) outputfilelist = glob.glob('%s%s%s/*.propka' % (INSTALLDIR, TMPDIR, jobid)) for i in range(0,len(outputfilelist)): outputfilelist[i] = os.path.basename(outputfilelist[i]) for extension in ["-typemap.html", ".pqr", ".in"]: if extension != ".in" or apbs_input != False: if extension == "-typemap.html" and typemap == False: continue outputfilelist.append('%s%s' % (jobid, extension)) for outputfile in outputfilelist: print "<li><a href=%s%s%s/%s>%s</a></li>" % (WEBSITE, TMPDIR, jobid, outputfile, outputfile) logopts['queryPDB2PQR'] = '|'.join(queryString) #for extension in ["-typemap.html", ".pqr", ".in"]: # print "<li><a href=%s%s%s/%s%s>%s%s</a></li>" % (WEBSITE, TMPDIR, jobid, jobid, extension, jobid, extension) elif calctype=="apbs": if have_opal: for i in range(0,len(filelist)): if filelist[i]._name[-3:]==".dx": # compressing APBS OpenDX output files currentpath = os.getcwd() zipjobid = filelist[i]._name.split("-")[0] dxfilename = '%s%s%s/%s' % (INSTALLDIR, TMPDIR, zipjobid, filelist[i]._name) urllib.urlretrieve(filelist[i]._url, dxfilename) os.chdir('%s%s%s' % (INSTALLDIR, TMPDIR, zipjobid)) # making both the dx file and the compressed file (.gz) available in the directory syscommand = 'cp %s dxbkupfile' % (filelist[i]._name) os.system(syscommand) syscommand = 'gzip -9 ' + filelist[i]._name os.system(syscommand) syscommand = 'mv dxbkupfile %s' % (filelist[i]._name) os.system(syscommand) outputfilezip = filelist[i]._name + '.gz' pqrfilename = '%s%s%s/%s.pqr' % (INSTALLDIR, TMPDIR, zipjobid, zipjobid) cubefilename = '%s%s%s/%s.cube' % (INSTALLDIR, TMPDIR, zipjobid, zipjobid) # making both the cube file and the compressed file (.gz) available in the directory createcube(dxfilename, pqrfilename, cubefilename) cubefilebasename = os.path.basename(cubefilename) syscommand = 'cp %s cubebkupfile' % cubefilebasename os.system(syscommand) syscommand = 'gzip -9 ' + cubefilebasename os.system(syscommand) syscommand = 'mv cubebkupfile %s' % cubefilebasename os.system(syscommand) os.chdir(currentpath) outputcubefilezip = cubefilebasename+".gz" print "<li><a href=%s%s%s/%s>%s</a></li>" % (WEBSITE, TMPDIR, zipjobid, outputfilezip, outputfilezip) print "<li><a href=%s%s%s/%s>%s</a></li>" % (WEBSITE, TMPDIR, zipjobid, outputcubefilezip, outputcubefilezip) else: outputfilelist = glob.glob('%s%s%s/%s-*.dx' % (INSTALLDIR, TMPDIR, jobid, jobid)) for dxfile in outputfilelist: # compressing APBS OpenDX output files currentpath = os.getcwd() workingpath = os.path.dirname(dxfile) os.chdir(workingpath) # making both the dx file and the compressed file (.gz) available in the directory syscommand = 'cp %s dxbkupfile' % (os.path.basename(dxfile)) os.system(syscommand) syscommand = 'gzip -9 ' + os.path.basename(dxfile) os.system(syscommand) syscommand = 'mv dxbkupfile %s' % (os.path.basename(dxfile)) os.system(syscommand) os.chdir(currentpath) outputfilezip = dxfile+".gz" cubefilename = '%s%s%s/%s.cube' % (INSTALLDIR, TMPDIR, jobid, jobid) pqrfilename = '%s%s%s/%s.pqr' % (INSTALLDIR, TMPDIR, jobid, jobid) createcube(dxfile, pqrfilename, cubefilename) print "<li><a href=%s%s%s/%s>%s</a></li>" % (WEBSITE, TMPDIR, jobid, os.path.basename(outputfilezip), os.path.basename(outputfilezip)) outputcubefilelist = glob.glob('%s%s%s/%s.cube' % (INSTALLDIR, TMPDIR, jobid, jobid)) for cubefile in outputcubefilelist: # compressing cube output file currentpath = os.getcwd() os.chdir(workingpath) # making both the cube file and the compressed file (.gz) available in the directory syscommand = 'cp %s cubebkupfile' % (os.path.basename(cubefile)) os.system(syscommand) syscommand = 'gzip -9 ' + os.path.basename(cubefile) os.system(syscommand) syscommand = 'mv cubebkupfile %s' % (os.path.basename(cubefile)) os.system(syscommand) os.chdir(currentpath) outputcubefilezip = cubefile+".gz" print "<li><a href=%s%s%s/%s>%s</a></li>" % (WEBSITE, TMPDIR, jobid, os.path.basename(outputcubefilezip), os.path.basename(outputcubefilezip)) logopts['queryAPBS'] = '|'.join(queryString) if calctype=="pdb2pqr": if have_opal: outputfilelist = [] for i in range(0,len(filelist)): if filelist[i]._name.endswith((".DAT", ".txt")): outputfilelist.append((filelist[i]._url, os.path.basename(filelist[i]._name))) #print "<li><a href=%s>%s</a></li>" % (filelist[i]._url, filelist[i]._name) if outputfilelist: print "</ul></li>" print "<li>PDB2PKA files<ul>" for outputfile in outputfilelist: print "<li><a href=%s>%s</a></li>" % (outputfile[0], outputfile[1]) else: outputfilelist = glob.glob('%s%s%s/pdb2pka_output/*.DAT' % (INSTALLDIR, TMPDIR, jobid)) outputfilelist.extend(glob.glob('%s%s%s/pdb2pka_output/*.txt' % (INSTALLDIR, TMPDIR, jobid))) outputfilelist = [os.path.basename(outputfile) for outputfile in outputfilelist] if outputfilelist: print "</ul></li>" print "<li>PDB2PKA files<ul>" for outputfile in outputfilelist: print "<li><a href=%s%s%s/pdb2pka_output/%s>%s</a></li>" % (WEBSITE, TMPDIR, jobid, outputfile, outputfile) print "</ul></li>" print "<li>Runtime and debugging information<ul>" if have_opal: stdouturl = resp._stdOut stderrurl = resp._stdErr else: stdouturl = "%s%s%s/%s_stdout.txt" % (WEBSITE, TMPDIR, jobid, calctype) stderrurl = "%s%s%s/%s_stderr.txt" % (WEBSITE, TMPDIR, jobid, calctype) print "<li><a href=%s>Program output (stdout)</a></li>" % stdouturl print "<li><a href=%s>Program errors and warnings (stderr)</a></li>" % stderrurl print "</ul></li></ul>" #if have_opal: # resp = appServicePort.getOutputs(getOutputsRequest(jobid)) # for opalfile in resp._outputFile: # if opalfile._name[-8:]!="-input.p": # print "<li><a href=%s>%s</a></li>" % (opalfile._url, opalfile._name) # print "<li><a href=%s>Standard output</a></li>" % (resp._stdOut) # print "<li><a href=%s>Standard error</a></li>" % (resp._stdErr) #else: # for line in cp[1:]: # line = os.path.basename(line) # if line[-8:]!="-input.p": # if line[-11:]=="_stdout.txt": # printname = "Standard output" # elif line[-11:]=="_stderr.txt": # printname = "Standard error" # else: # printname = line # print "<li><a href=%s>%s</a></li>" % (WEBSITE+TMPDIR+jobid+"/"+line,printname) if calctype=="pdb2pqr" and apbs_input and HAVE_APBS: print "</ul></p><hr><p><b><a href=%s>Click here</a> to run APBS with your results.</b></p>" % nexturl elif calctype=="apbs": #print "</ul></p><hr><p><b><a href=%s>Click here</a> to visualize your results in Jmol.</b></p>" % nexturl print "</ul></p><hr><p><b>Visualize your results online:" print "<ul> <li><a href=%s>3Dmol</a></li><li><a href=%s>Jmol</a></li></ul>" % (url_3dmol, url_jmol) elif progress == "error": print "There was an error with your query request. This page will not refresh." print "</ul></li>" print "<li>Runtime and debugging information<ul>" if have_opal: resp = appServicePort.getOutputs(getOutputsRequest(jobid)) stdouturl = resp._stdOut stderrurl = resp._stdErr else: stdouturl = "%s%s%s/%s_stdout.txt" % (WEBSITE, TMPDIR, jobid, calctype) stderrurl = "%s%s%s/%s_stderr.txt" % (WEBSITE, TMPDIR, jobid, calctype) print "<li><a href=%s>Program output (stdout)</a></li>" % stdouturl print "<li><a href=%s>Program errors and warnings (stderr)</a></li>" % stderrurl print "</ul></li></ul>" if have_opal: print " <br />If your job has been running for a prolonged period of time and failed with no reason listed in the standard out or standard error, then the job probably timed out and was terminated by the system.<br />" print '<br />If you are having trouble running PDB2PQR on the webserver, please download the <a href="http://www.poissonboltzmann.org/docs/downloads/">command line version of PDB2PQR</a> and run the job from there.' elif progress == "running": print "Page will refresh in %d seconds<br />" % refresh print "<HR>" if not have_opal: print "</ul></li>" print "<li>Runtime and debugging information<ul>" stdouturl = "%s%s%s/%s_stdout.txt" % (WEBSITE, TMPDIR, jobid, calctype) stderrurl = "%s%s%s/%s_stderr.txt" % (WEBSITE, TMPDIR, jobid, calctype) print "<li><a href=%s>Program output (stdout)</a></li>" % stdouturl print "<li><a href=%s>Program errors and warnings (stderr)</a></li>" % stderrurl print "</ul></li></ul>" print "<small>Your results will appear at <a href=%s>this page</a>. If you want, you can bookmark it and come back later (note: results are only stored for approximately 12-24 hours).</small>" % resultsurl elif progress == "version_mismatch": print "The versions of APBS on the local server and on the Opal server do not match, so the calculation could not be completed" print "</P>" print "<script type=\"text/javascript\">" for key in logopts: print getEventTrackingString('queryData', key, logopts[key]), #print "_gaq.push(['_trackPageview', '/main_cgi/has_%s_%s.html']);" % (key, logopts[key]) print "</script>" print "</div> <!--end content div-->" print "</BODY>" print "</HTML>"
def main(apbsOptions): cgiFile = "jmol.cgi" cgiName = "thisform" defaultVisType = "jmol" checkJmolType = True cssFile = 'pdb2pqr.css' try: jobid = form['jobid'].value tool = form['tool'].value #run 3dmol or jmol except KeyError: print redirectString return string_3dmol = """ <!DOCTYPE html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="3dmol/css/pdb2pqr_3dmol.css" type="text/css"> <link rel="stylesheet" href="3dmol/css/foundation.css"> <link rel="stylesheet" type="text/css" href="3dmol/css/pure-min.css" media="screen" /> <link rel="stylesheet" href="3dmol/css/toggles.css" type="text/css"> <link rel="stylesheet" href="3dmol/css/ui_css.css" type="text/css"> <script type="text/JavaScript" src="3dmol/js/pitt_3Dmol.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://3dmol.csb.pitt.edu/build/3Dmol.js"></script> <script type="text/JavaScript" src="3dmol/js/visualize_html.js"></script> <script type="text/JavaScript" src="3dmol/js/3dmol.js"></script> </head> <body> <script type="text/javascript">build_page({jobid})</script> <script type="text/javascript">getpqr({jobid})</script> <script type="text/javascript">getcube({jobid})</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString(category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) string_jmol = """ <!DOCTYPE html> <head> {trackingscript} <script type="text/javascript"> {trackingevents} </script> <title>Visualization</title> <link rel="stylesheet" href="pdb2pqr.css" type="text/css"> <script type="text/JavaScript" src="jmol/Jmol.js"></script> <script type="text/JavaScript">APPLET_PATH="jmol/";GZIP=""</script> <script type="text/JavaScript" src="jmol/apbsjmol.js"></script> </head> <body onload="init()"> <script type="text/javascript">createVisualization({jobid}, -5.0, 5.0)</script> </body> </html>""".format(jobid=jobid, trackingevents=getEventTrackingString(category='apbs', action='visualize', label=str(os.environ["REMOTE_ADDR"])), trackingscript=getTrackingScriptString(jobid=jobid)) if(tool == 'tool_3dmol'): print string_3dmol if(tool == 'tool_jmol'): print string_jmol
def redirector(name, weboptions, jobtype=None, client_ip=None, analytics_id=None, ga_client_id=None): """ Prints a page which redirects the user to querystatus.cgi and writes starting time to file """ redirectWait = 3 utilities.startLogFile(name, 'pdb2pqr_start_time', str(time.time())) jobtype_query = '' if jobtype is not None: jobtype_query = '&jobtype=%s' % jobtype jobid = name if weboptions is None: ui_url = os.getenv("UI_URL", "http://localhost:3000") redirectURL = "{website}jobstatus?jobid={jobid}{jobtype}".format(website=ui_url, jobid=jobid, jobtype=jobtype_query) else: analiticsDict = weboptions.getOptions() events = {} if client_ip is not None: events['submission'] = analiticsDict['pdb']+'|'+str(client_ip) else: events['submission'] = analiticsDict['pdb']+'|'+str(None) # events['submission'] = analiticsDict['pdb']+'|'+str(os.environ["REMOTE_ADDR"]) del analiticsDict['pdb'] events['titration'] = str(analiticsDict.get('ph')) if 'ph' in analiticsDict: del analiticsDict['ph'] events['apbsInput'] = str(analiticsDict.get('apbs')) del analiticsDict['apbs'] #Clean up selected extensions output if 'selectedExtensions' in analiticsDict: analiticsDict['selectedExtensions'] = ' '.join(analiticsDict['selectedExtensions']) options = ','.join(str(k)+':'+str(v) for k,v in analiticsDict.iteritems()) events['options']=options eventsScriptString = '' for event in events: eventsScriptString += utilities.getEventTrackingString(category='submissionData', action=event, label=events[event]) logging.debug('analytics_id: %s', analytics_id) ga_event_request_body = '' if analytics_id is not None: ga_event_request_body = '' ga_event_headers = { 'User-Agent': request.headers['User-Agent'] } on_first = True for event in events: # Make Google Analytics request body ga_event_request_body += 'v=1&tid=%s&cid=%s&t=event&ec=submissionData&ea=%s&el=%s\n' % (analytics_id, ga_client_id, event, events[event]) try: logging.info('GA request body:\n%s' % ga_event_request_body) logging.info('Sending usage data through Google Analytics endpoint') r = requests.post('https://www.google-analytics.com/batch', data=ga_event_request_body, headers=ga_event_headers) if not r.ok: r.raise_for_status() except Exception as err: raise redirectURL = "{website}jobstatus?jobid={jobid}{jobtype}".format(website=WEBSITE, jobid=jobid, jobtype=jobtype_query) # string = """ # <html> # <head> # {trackingscript} # <script type="text/javascript"> # {trackingevents} # </script> # <meta http-equiv="Refresh" content="{wait}; url={redirectURL}"> # <link rel="stylesheet" href="{website}pdb2pqr.css"type="text/css"> # </head> # <body> # <center> # You are being automatically redirected to a new location.<br /> # If your browser does not redirect you in {wait} seconds, or you do # not wish to wait, <a href="{redirectURL}">click here</a></center>. # </body> # </html>""".format(trackingscript=utilities.getTrackingScriptString(jobid=jobid), # trackingevents=eventsScriptString, redirectURL=redirectURL, wait=redirectWait, website=WEBSITE) # return string return redirectURL