From 2c79ffd200f9daa9d61bf48ba2ae52e56e6918a9 Mon Sep 17 00:00:00 2001
From: Brian Moe <brian.moe@ligo.org>
Date: Thu, 26 Jan 2012 13:09:33 -0600
Subject: [PATCH] IFAR reports.

---
 gracedb/management/commands/make_ifar.py | 139 ++++++++++++++++++-----
 gracedb/reports.py                       |  17 ++-
 settings.py                              |  33 +++++-
 settings_dev.py                          |  33 +++++-
 templates/gracedb/histogram.html         |   6 +-
 5 files changed, 185 insertions(+), 43 deletions(-)

diff --git a/gracedb/management/commands/make_ifar.py b/gracedb/management/commands/make_ifar.py
index 5091f0000..ec9fe49e6 100644
--- a/gracedb/management/commands/make_ifar.py
+++ b/gracedb/management/commands/make_ifar.py
@@ -5,6 +5,8 @@ from django.conf import settings
 from gracedb.gracedb.models import Event
 from gracedb.gracedb.query import parseQuery
 
+import os
+
 import matplotlib
 matplotlib.use('Agg')
 import numpy
@@ -12,47 +14,122 @@ import scipy
 import pylab
 #pylab.rc('text', usetex = True)
 
-class Command(NoArgsCommand):
-    help = "I am the IFAR MAKER!"
+def ifar_none(title, message, filename):
+    fig = pylab.figure()
+    ax = fig.add_axes((.1, .1, .8, .8))
+    ax.set_title(title)
+    ax.axis([0,10,0,10])
+    ax.text(3,5,message)
+    #pylab.legend(loc="center")
+    pylab.savefig(filename)
 
-    def handle_noargs(self, **options):
+def ifar_chart(events, title, axis_label, filename):
 
-        query = parseQuery(settings.REPORT_CBC_IFAR_QUERY)
-        print "query", settings.REPORT_CBC_IFAR_QUERY
-        ts = []
-        fars = []
+    ts = []
+    fars = []
 
-        events = Event.objects.filter(query).distinct()
-        print "COUNT", events.count()
-        for e in events:
-            ts.append(e.gpstime)
-            fars.append(e.far)
+    for e in events:
+        ts.append(e.gpstime)
+        fars.append(e.far)
+
+    fars = scipy.array(sorted(fars))
+    Ns = scipy.arange(len(fars))
+
+    T = float(max(ts) - min(ts))
+
+    fig = pylab.figure()
+    ax = fig.add_axes((.1, .1, .8, .8))
+    ax.loglog(fars, Ns, label=axis_label)
+
+    Ns = scipy.arange(len(fars)*10) / 10.
+    ax.loglog(Ns/T, Ns, label="Expected Background")
+    ax.fill_between(Ns/T, Ns - Ns**.5, Ns + Ns**.5, color='k', alpha=0.1)
+    ax.fill_between(Ns/T, Ns - 2 * Ns**.5, Ns + 2 * Ns**.5, color='k', alpha=0.1)
+    ax.invert_xaxis()
+
+    ax.set_ylabel(r"#")
+    ax.set_xlabel(r"FAR (Hz)")
+    #ax.set_title(r"ER1 FARs from gstlal_ll_inspiral t in [%i, %i)" %(min(ts), max(ts)))
+    ax.set_title(title)
 
-        #ts,fars = numpy.loadtxt('fars.txt', unpack = True)
+    pylab.legend(loc='upper right')
+    pylab.ylim([1, Ns[-1] + 2 * Ns[-1]**.5])
+    pylab.xlim([fars[-1], fars[0]])
 
-        fars = scipy.array(sorted(fars))
-        Ns = scipy.arange(len(fars))
+    ax.text(1e-7, 3, r'$t \in [%i, %i)$'%(min(ts), max(ts)))
+    pylab.savefig(filename)
+    return
 
-        T = float(max(ts) - min(ts))
 
-        print "MAX/MIN/T", max(ts), min(ts), T
+    fars = scipy.array(sorted(fars))
+    Ns = scipy.arange(len(fars))
 
-        fig = pylab.figure()
-        ax = fig.add_axes((.1, .1, .8, .8))
-        ax.loglog(fars, Ns, label="GraceDB CBC LowMass ER1 events")
-        ax.loglog(Ns/T, Ns, label="Expected Background")
-        ax.invert_xaxis()
+    T = float(max(ts) - min(ts))
 
-        #ax.set_ylabel(r"$\#$")
-        #ax.set_xlabel(r"\textrm{FAR (Hz)")
-        #ax.set_title(r"\textrm{ER1 FARs from {\sc gstlal\_ll\_inspiral}}")
+    fig = pylab.figure()
+    ax = fig.add_axes((.1, .1, .8, .8))
+    ax.loglog(fars, Ns, label=axis_label)
+    Ns = scipy.arange(len(fars)*10) / 10
+    ax.loglog(Ns/T, Ns, label="Expected Background")
+    ax.fill_between(Ns/T, Ns - Ns**.5, Ns + Ns**.5, color='k', alpha=0.1)
+    ax.fill_between(Ns/T, Ns - 2 * Ns**.5, Ns + 2 * Ns**.5, color='k', alpha=0.1)
+    ax.invert_xaxis()
 
-        ax.set_ylabel(r"#")
-        ax.set_xlabel(r"FAR (Hz)")
-        ax.set_title(r"ER1 FARs from gstlal_ll_inspiral")
+    #ax.set_ylabel(r"$\#$")
+    #ax.set_xlabel(r"\textrm{FAR (Hz)")
+    #ax.set_title(r"\textrm{ER1 FARs from {\sc gstlal\_ll\_inspiral}}")
 
-        ax.text(1e-7, 3, r'$t \in [%i, %i)$'%(min(ts), max(ts)))
+    ax.set_ylabel(r"#")
+    ax.set_xlabel(r"FAR (Hz)")
+    ax.set_title(title)
 
-        pylab.legend(loc='upper right')
+    ax.text(1e-7, 3, r'$t \in [%i, %i)$'%(min(ts), max(ts)))
+
+    pylab.legend(loc='upper right')
+    pylab.ylim([1, Ns[-1] + 2 * Ns[-1]**.5])
+    pylab.xlim([fars[-1], fars[0]])
+
+    pylab.savefig(filename)
+
+class Command(NoArgsCommand):
+    help = "I am the IFAR MAKER!"
+
+    def handle_noargs(self, **options):
+        for (q, label, title, fname) in settings.REPORTS_IFAR:
+            query = parseQuery(q)
+            events = Event.objects.filter(query).distinct()
+            filename = os.path.join(settings.REPORT_IFAR_IMAGE_DIR, fname)
+            if events.count() > 0:
+                ifar_chart(events, title, label, filename)
+            else:
+                ifar_none(title, "No Data", filename)
+        return
+
+        query = parseQuery("LowMass now yesterday .. now")
+        events = Event.objects.filter(query).distinct()
+        if events.count() > 0:
+            axis_label = "GraceDB CBC LowMass ER1 events"
+            title = r"ER1 FARs from gstlal_ll_inspiral - last day"
+            filename = os.path.join(settings.REPORT_IFAR_IMAGE_DIR, "ifar_day.png")
+            ifar_chart(events, title, axis_label, filename)
+        else:
+            print "No day"
+            try:
+                os.unlink(filename)
+            except:
+                pass
+
+        query = parseQuery("LowMass a week ago .. now")
+        events = Event.objects.filter(query).distinct()
+        if events.count() > 0:
+            axis_label = "GraceDB CBC LowMass ER1 events"
+            title = r"ER1 FARs from gstlal_ll_inspiral - last week"
+            filename = os.path.join(settings.REPORT_IFAR_IMAGE_DIR, "ifar_week.png")
+            ifar_chart(events, title, axis_label, filename)
+        else:
+            print "No week"
+            try:
+                os.unlink(filename)
+            except:
+                pass
 
-        pylab.savefig(settings.REPORT_IFAR_IMAGE)
diff --git a/gracedb/reports.py b/gracedb/reports.py
index a2639a255..778f51045 100644
--- a/gracedb/reports.py
+++ b/gracedb/reports.py
@@ -11,10 +11,19 @@ def histo(request):
         table = open(settings.LATENCY_REPORT_WEB_PAGE_FILE_PATH, "r").read()
     except IOError:
         table = "No Data Available"
-    if os.access(settings.REPORT_IFAR_IMAGE, os.R_OK):
-        ifar = settings.REPORT_IFAR_URL
-    else:
-        ifar = None
+
+    # IFAR tables.
+
+    files = [ f for (_,_,_,f) in settings.REPORTS_IFAR ]
+
+    ifar = []
+    for name in files:
+        fname = os.path.join(settings.REPORT_IFAR_IMAGE_DIR, name)
+        if os.access(fname, os.R_OK):
+            ifar.append(name)
+        else:
+            ifar.append('no ' + name)
+
     return render_to_response(
             'gracedb/histogram.html',
             {'table': table,
diff --git a/settings.py b/settings.py
index ae694d88f..adcb4ce92 100644
--- a/settings.py
+++ b/settings.py
@@ -75,9 +75,36 @@ LATENCY_REPORT_DEST_DIR = "/home/gracedb/data/latency"
 LATENCY_MAXIMUM_CHARTED = 1800
 LATENCY_REPORT_WEB_PAGE_FILE_PATH = LATENCY_REPORT_DEST_DIR + "/latency.inc"
 
-REPORT_CBC_IFAR_QUERY = "LowMass ER1 hasfar"
-REPORT_IFAR_IMAGE = LATENCY_REPORT_DEST_DIR + "/ifar.png"
-REPORT_IFAR_URL = "ifar.png"
+
+# CBC IFAR Reports
+
+from utils import posixToGpsTime
+from datetime import datetime, timedelta
+import time
+
+now = datetime.now()
+yesterday = now - timedelta(days=1)
+lastweek = now - timedelta(days=7)
+now = posixToGpsTime(time.mktime(now.timetuple()))
+yesterday = posixToGpsTime(time.mktime(yesterday.timetuple()))
+lastweek = posixToGpsTime(time.mktime(lastweek.timetuple()))
+
+REPORT_IFAR_IMAGE_DIR = LATENCY_REPORT_DEST_DIR
+REPORTS_IFAR = [
+    #(query, axis_label, title, fname)
+    ("LowMass %d..%d" % (yesterday, now),
+     "GraceDB CBC LowMass ER1 events",
+     "ER1 FARs from gstlal_ll_inspiral - last day",
+     "ifar_day.png"
+    ),
+    ("LowMass %d..%d" % (lastweek, now),
+     "GraceDB CBC LowMass ER1 events",
+     "ER1 FARs from gstlal_ll_inspiral - last week",
+     "ifar_week.png"
+    ),
+]
+
+
 
 # RSS Feed Defaults
 FEED_MAX_RESULTS = 50
diff --git a/settings_dev.py b/settings_dev.py
index f63d0a3e1..c0bece276 100644
--- a/settings_dev.py
+++ b/settings_dev.py
@@ -64,9 +64,36 @@ LATENCY_REPORT_DEST_DIR = "/home/bmoe/data/latency"
 LATENCY_MAXIMUM_CHARTED = 1800
 LATENCY_REPORT_WEB_PAGE_FILE_PATH = LATENCY_REPORT_DEST_DIR + "/latency.inc"
 
-REPORT_CBC_IFAR_QUERY = "LowMass ER1 hasfar"
-REPORT_IFAR_IMAGE = LATENCY_REPORT_DEST_DIR + "/ifar.png"
-REPORT_IFAR_URL = "ifar.png"
+
+
+# CBC IFAR Reports
+
+from utils import posixToGpsTime
+from datetime import datetime, timedelta
+import time
+
+now = datetime.now()
+yesterday = now - timedelta(days=1)
+lastweek = now - timedelta(days=7)
+now = posixToGpsTime(time.mktime(now.timetuple()))
+yesterday = posixToGpsTime(time.mktime(yesterday.timetuple()))
+lastweek = posixToGpsTime(time.mktime(lastweek.timetuple()))
+
+REPORT_IFAR_IMAGE_DIR = LATENCY_REPORT_DEST_DIR
+REPORTS_IFAR = [
+    #(query, axis_label, title, fname),
+    ("LowMass %d..%d" % (yesterday, now),
+     "GraceDB CBC LowMass ER1 events",
+     "ER1 FARs from gstlal_ll_inspiral - last day",
+     "ifar_day.png"
+    ),
+    ("LowMass %d..%d" % (lastweek, now),
+     "GraceDB CBC LowMass ER1 events",
+     "ER1 FARs from gstlal_ll_inspiral - last week",
+     "ifar_week.png"
+    ),
+]
+
 
 # RSS Feed Defaults
 FEED_MAX_RESULTS = 50
diff --git a/templates/gracedb/histogram.html b/templates/gracedb/histogram.html
index f2fabdb25..ecdaf527f 100644
--- a/templates/gracedb/histogram.html
+++ b/templates/gracedb/histogram.html
@@ -13,9 +13,11 @@
 
 <h3>CBC IFAR</h3>
 {% if ifar %}
-    <img src="{{ ifar }}">hai
+    {% for chart in ifar %}
+        <img src="{{ chart }}"><br/>
+    {% endfor %}
 {% else %}
-     No IFAR table.
+     No IFAR charts.
 {% endif %}
 
 {% endblock %}
-- 
GitLab