src/hg/encode/encodeCharts/encodeDistUnrelease.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/encodeDistUnrelease.py
===================================================================
RCS file: src/hg/encode/encodeCharts/encodeDistUnrelease.py
diff -N src/hg/encode/encodeCharts/encodeDistUnrelease.py
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/hg/encode/encodeCharts/encodeDistUnrelease.py	2 Jun 2010 00:18:38 -0000	1.1
@@ -0,0 +1,170 @@
+#!/hive/groups/recon/local/bin/python
+# Requires Python 2.6, current default python on hgwdev is 2.4
+
+"""CGI script that outputs the amout of time to date for
+ENCODE submissions based on a specified keyfield.
+"""
+
+import cgi, cgitb
+import datetime
+import json
+import sys
+import operator
+
+# 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, keyIndex):
+  hash = {}
+  labelHash = {}
+
+  f = open(reportFile, "r")
+  for line in f:
+    line = line.rstrip()
+    if line.startswith('Project'):
+      continue
+
+    splitArray = line.split('\t')
+    keyLabel = splitArray[keyIndex]
+    startDate = splitArray[6]
+    endDate = splitArray[7]
+    status = splitArray[8]
+
+    if (status == 'revoked' or status == 'replaced'):
+      continue
+
+    if (keyIndex == 5 and keyLabel == "post ENCODE Jan 2010 Freeze"):
+      keyLabel = "post Jan-2010"
+
+    # Convert dates into ints
+    submitDate = encodeReportLib.convertDate(startDate)
+
+    if status != 'released':
+      if not isinstance(submitDate, int):
+        print >> sys.stderr, "Error: Invalid date: %s" % line
+      else:
+        if not keyLabel in labelHash:
+          labelHash[keyLabel] = 0
+        labelHash[keyLabel] += 1
+
+        deltaTime = datetime.date.today() - encodeReportLib.dateIntToObj(submitDate)
+        days = deltaTime.days
+        if (days == 0):
+          days = 1
+        weeks = days / 7
+        if (days % 7 != 0):
+          # Adjust by one except when number of days is exactly divisible by 7
+          weeks += 1
+        if not weeks in hash:
+          hash[weeks] = {}
+        if not keyLabel in hash[weeks]:
+          hash[weeks][keyLabel] = 0
+        hash[weeks][keyLabel] += 1
+  f.close()
+
+  if keyIndex == 5:
+    labels = encodeReportLib.orderFreezeDateLabels(labelHash.keys())
+  elif keyIndex == 8:
+    labels = ['loaded', 'displayed', 'approved', 'reviewing']
+  else:
+    tmpLabels = sorted(labelHash.iteritems(), key=operator.itemgetter(1), 
+                       reverse=True)
+    labels = []
+    for i in tmpLabels:
+      labels.append(i[0])
+
+  maxWeek = max(hash)
+  for i in xrange(1, maxWeek+1):
+    if not i in hash:
+       hash[i] = {}
+    for label in labels:
+      if not label in hash[i]:
+        hash[i][label] = 0
+
+  # Populate dataArray with the contents of the matrix
+  dataArray = []
+  for key in sorted(hash):
+    array = []
+    array.append(key)
+    for label in labels:
+      array.append(hash[key][label])
+    dataArray.append(array)
+
+  return dataArray, labels
+
+def main():
+  form = cgi.FieldStorage()
+  # CGI variables:
+  #   key = project, lab, data, freeze, status
+
+  keyField = form.getvalue('key')
+  if not keyField:
+    keyField = 'project'
+
+  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]
+
+  reportFile, currentDate = encodeReportLib.getRecentReport()
+  matrix, labels = processReportFile(reportFile, keyIndex)
+
+  # Headers for the columns in the data matrix
+  description = [("Time", "string")]
+  for label in labels:
+    tmpDesc = [(label, 'number')]
+    description += tmpDesc
+
+  # 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'] = datetime.date.today().strftime("%b %d, %Y")
+  template_vars['title'] = "ENCODE Amount of Time since Submission by %s" % titleTag[keyField]
+  template_vars['packageName'] = 'columnchart'
+  template_vars['visClass'] = 'ColumnChart'
+  template_vars['style'] = ""
+
+  # Set the chart specific configuration options
+  chart_config = {}
+  chart_config['isStacked'] = 'true'
+  chart_config['legendFontSize'] = 16
+  chart_config['width'] = 1200
+  chart_config['height'] = 480
+  chart_config['legend'] = 'bottom'
+  chart_config['titleX'] = '# of Weeks'
+  chart_config['titleY'] = '# of Submissions'
+  chart_config['tooltipFontSize'] = 16
+
+  if (keyField == 'freeze' or keyField == 'status'):
+    colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
+    colors = colors[0:len(labels)]
+    chart_config['colors'] = colors
+
+  template_vars['chart_config'] = json.dumps(chart_config)
+
+  encodeReportLib.renderHtml(template_vars, 0)
+
+  return
+
+if __name__ == '__main__':
+  main()
+  sys.exit(0)