diff --git a/gracedb/management/commands/make_ifar.py b/gracedb/management/commands/make_ifar.py index 5091f00002535fa2acae9b7365cbf51e268fdcc0..ec9fe49e6b9ebd06223eccfde0e2f37fb6b04cc3 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 a2639a255fdeb32badfe742f1ad145edd7876bf8..778f51045c17ccf59ff58e7fded07e43da86fb08 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 ae694d88f21c665f19433ae927f6d145d281fc88..adcb4ce92df8c085ad1e26482a1c32b43e69c1c7 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 f63d0a3e1d3f6a7060bb92b8155ae533700b1525..c0bece276522b8fa465eaf7df76ee0aeb6303043 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 f2fabdb25f79024e03d16c3fddf5fb63afbbf8b1..ecdaf527f4864a01f5e9f51529cbac88764c93f4 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 %}