src/hg/encode/encodeCharts/encodeStatus.py 1.1

1.1 2010/06/02 00:18:38 bsuh
Initial check-in of ENCODE Report Charts cgis
Index: src/hg/encode/encodeCharts/encodeStatus.py
===================================================================
RCS file: src/hg/encode/encodeCharts/encodeStatus.py
diff -N src/hg/encode/encodeCharts/encodeStatus.py
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/hg/encode/encodeCharts/encodeStatus.py	2 Jun 2010 00:18:38 -0000	1.1
@@ -0,0 +1,169 @@
+#!/hive/groups/recon/local/bin/python
+# Requires Python 2.6, current default python on hgwdev is 2.4
+
+"""CGI script that outputs the ENCODE status based upon a specified
+field.
+"""
+
+import cgi, cgitb
+import datetime
+import json
+import sys
+
+# Import local modules found in "/hive/groups/encode/dcc/charts"
+sys.path.append("/hive/groups/encode/dcc/charts")
+import encodeReportLib
+import gviz_api
+
+__author__  = "Bernard Suh"
+__email__   = "bsuh@soe.ucsc.edu"
+__version__ = "1.0.0"
+
+cgitb.enable()
+
+# Parse report file and return result in the proper format
+#   for the Google Visualization API
+def processReportFile (reportFile, statusLabel, keyIndex, norelease, species):
+  hash = {}
+
+  f = open(reportFile, "r")
+  for line in f:
+    line = line.rstrip()
+    if line.startswith('Project'):
+      continue
+
+    splitArray = line.split('\t')
+    keyLabel = splitArray[keyIndex]
+    status = splitArray[8]
+    assembly = splitArray[9]
+
+    if status == 'revoked' or status == 'replaced':
+      continue
+    if norelease == 1 and status == 'released':
+      continue
+    if keyIndex == 5 and keyLabel == "post ENCODE Jan 2010 Freeze":
+      keyLabel="post Jan-2010"
+    if species == 'all':
+      pass
+    else:
+      if species == 'human' and assembly.startswith('hg'):
+        pass
+      elif species == 'mouse' and assembly.startswith('mm'):
+        pass
+      elif species == assembly:
+        pass
+      else:
+        continue
+
+    if not keyLabel in hash:
+      hash[keyLabel] = {}
+      for i in statusLabel:
+        hash[keyLabel][i] = 0
+    hash[keyLabel][status] += 1
+  f.close()
+
+  if keyIndex == 5:
+    sortKey = encodeReportLib.orderFreezeDateLabels(hash.keys())
+  else:
+    sortKey = sorted(hash)
+  # Populate dataArray with the contents of the matrix
+  dataArray = []
+  for labKey in sortKey:
+    array = []
+    array.append(labKey)
+    for statusKey in statusLabel:
+      array.append(hash[labKey][statusKey])
+    dataArray.append(array)
+
+  return dataArray
+
+def main():
+  form = cgi.FieldStorage()
+  # CGI Variables
+  #   key = project, lab, data, freeze, or species
+  #     Display data based on the key variable
+  #   norelease = 0 or 1
+  #     0 = Output all data
+  #     1 = Output only unreleased data
+  #   species = human, mouse, all
+  #     human = Output only human data
+  #     mouse = Output only mouse data
+  #     all   = Output all data
+
+  keyField = form.getvalue('key')
+  if keyField == None:
+    keyField = 'project'
+  norelease = form.getvalue('norelease')
+  if norelease == None:
+    norelease = 0
+  norelease = int(norelease)
+  species = form.getvalue('species')
+  if species == None:
+    species = 'all'
+
+  switch = {'project':0, 'lab':1, 'data':2, 'freeze':5, 'status':8}
+  titleTag = {'project':"Project", 'lab':"Lab", 'data':"Data_Type", 
+              'freeze':"Freeze", 'status':"Status"}
+  if keyField not in switch:
+    keyField = 'project'
+  keyIndex = switch[keyField]
+
+  # Headers for the columns in the data matrix
+  description = [(titleTag[keyField], "string")]
+  fullLabel = ['released', 'reviewing', 'approved', 'displayed', 'loaded']
+  statusLabel = []
+  for label in fullLabel:
+    if label == 'released' and norelease == 1:
+      continue
+    tmpDesc = [(label, 'number')]
+    description += tmpDesc
+    statusLabel.append(label)
+
+  reportFile, currentDate = encodeReportLib.getRecentReport()
+  matrix = processReportFile(reportFile, statusLabel, keyIndex, norelease, 
+                             species)
+
+  # Create the data table
+  data_table = gviz_api.DataTable(description)
+  data_table.LoadData(matrix)
+
+  # Convert to JavaScript code
+  jscode = data_table.ToJSCode("jscode_data")
+
+  # Set variables for HTML output
+  template_vars = {}
+  template_vars['jscode'] = jscode
+  template_vars['dateStamp'] = encodeReportLib.dateIntToDateStr(currentDate)
+  template_vars['title'] = "ENCODE (%s) Status by %s" % (species, 
+                                                         titleTag[keyField])
+  template_vars['packageName'] = 'columnchart'
+  template_vars['visClass'] = 'ColumnChart'
+  template_vars['style'] = ""
+  template_vars['species'] = species
+  template_vars['keyField'] = keyField
+  template_vars['norelease']= norelease
+
+  # Set the chart specific configuration options
+  chart_config = {}
+  chart_config['isStacked'] = 'true'
+  chart_config['legendFontSize'] = 16
+  chart_config['width'] = 854
+  chart_config['height'] = 480
+  chart_config['titleX'] = titleTag[keyField]
+  chart_config['titleY'] = "# of Submissions"
+  chart_config['tooltipFontSize'] = 16
+  chart_config['enableTooltip'] = 'true'
+  colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple']
+  colors = colors[0:len(statusLabel)]
+  colors.reverse()
+  chart_config['colors'] = colors
+
+  template_vars['chart_config'] = json.dumps(chart_config)
+
+  encodeReportLib.renderHtml(template_vars, 1)
+
+  return
+
+if __name__ == '__main__':
+  main()
+  sys.exit(0)