From a847b6d0e944a6f04ac4aa172b990ab10e3965a7 Mon Sep 17 00:00:00 2001
From: Brian Moe <brian.moe@ligo.org>
Date: Mon, 25 Jun 2012 16:24:20 -0500
Subject: [PATCH] Added fields to VOEvent for GCN.

---
 gracedb/buildVOEvent.py | 52 ++++++++++++++++++++++++++++++++++++++---
 gracedb/views.py        | 46 ++++--------------------------------
 2 files changed, 53 insertions(+), 45 deletions(-)

diff --git a/gracedb/buildVOEvent.py b/gracedb/buildVOEvent.py
index e83a2145b..964f17884 100755
--- a/gracedb/buildVOEvent.py
+++ b/gracedb/buildVOEvent.py
@@ -15,16 +15,17 @@ import sys, os
 # XXX ER2.utils.  utils is in project directory.  ugh.
 from utils import gpsToUtc
 from django.conf import settings
+from django.core.urlresolvers import reverse
 
-def buildVOEvent(gevent):
+def buildVOEvent(gevent, request=None, description=None, role=None):
 
     objid = gevent.graceid()
 
     ############ VOEvent header ############################
     v = VOEvent.VOEvent(version="2.0")
     v.set_ivorn(settings.SKYALERT_IVORN_PATTERN % objid)
-    v.set_role(settings.SKYALERT_ROLE)
-    v.set_Description(settings.SKYALERT_DESCRIPTION)
+    v.set_role(role or settings.SKYALERT_ROLE)
+    v.set_Description(description or settings.SKYALERT_DESCRIPTION)
 
     ############ Who ############################
     w = Who()
@@ -37,6 +38,21 @@ def buildVOEvent(gevent):
     ############ What ############################
     w = What()
 
+    # UCD = Unified Content Descriptors
+    # http://monet.uni-sw.gwdg.de/twiki/bin/view/VOEvent/UnifiedContentDescriptors
+    # OR --   (from VOTable document, [21] below)
+    # http://www.ivoa.net/twiki/bin/view/IVOA/IvoaUCD
+    # http://cds.u-strasbg.fr/doc/UCD.htx
+    #
+    # which somehow gets you to: http://www.ivoa.net/Documents/REC/UCD/UCDlist-20070402.html
+    # where you might find some actual information.
+
+    # Unit / Section 4.3 of [21] which relies on [25]
+    # [21] http://www.ivoa.net/Documents/latest/VOT.html
+    # [25] http://vizier.u-strasbg.fr/doc/catstd-3.2.htx
+    #
+    # basically, a string that makes sense to humans about what units a value is. eg. "m/s"
+
     # params related to the event. None are in Groups.
     p = Param(name="gracedbid", ucd="meta.id", value="%s"% objid)
     p.set_Description(["Identifier assigned by gracedb"])
@@ -50,6 +66,36 @@ def buildVOEvent(gevent):
     p.set_Description(["Likelihood"])
     w.add_Param(p)
 
+    # For GCN.
+    #
+    # pipeline  dataType="string"   ucd=
+    # FAR       dataType="float"    ucd=arith.rate   unit="Hz"
+    # DQ level  dataType="?"        ucd=
+    # IFO list  dataType="string"   ucd=
+    # URL to skymap   Reference/URL
+
+    p = Param(name="analysistype", dataType="string", value=str(gevent.get_analysisType_display()))
+    p.set_Description(["LIGO analysis which produced this result"])
+    w.add_Param(p)
+
+    p = Param(name="far", dataType="float", ucd="arith.rate", unit="Hz", value=float(gevent.far))
+    p.set_Description(["False Alarm Rate"])
+    w.add_Param(p)
+
+    p = Param(name="ifolist", dataType="string", value=str(gevent.instruments))
+    p.set_Description(["Interferometers"])
+    w.add_Param(p)
+
+    p = Param(name="skymap")
+    p.set_Description(["Sky Map"])
+    skymap_url = reverse("download", args=[gevent.graceid(), "general/skymap.fits"])
+    if request:
+        # XXX should probably be an error if we can't give the full url.
+        skymap_url = request.build_absolute_uri(skymap_url)
+    p.set_Reference([Reference(uri=skymap_url)])
+    w.add_Param(p)
+
+
     v.set_What(w)
 
     ############ Wherewhen ############################
diff --git a/gracedb/views.py b/gracedb/views.py
index 3e840dd80..f88803892 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -48,7 +48,8 @@ def skyalert_authorized(request):
 
 def voevent(request, graceid):
     event = Event.getByGraceid(graceid)
-    return HttpResponse(buildVOEvent(event), content_type="application/xml")
+    voevent = buildVOEvent(event, request)
+    return HttpResponse(voevent, content_type="application/xml")
 
 
 def skyalert(request, graceid):
@@ -68,6 +69,7 @@ def skyalert(request, graceid):
     except Exception, e:
         message = "SkyAlert Submission Error"
         skyalert_response = ""
+        # XXX umm.  don't we want to know if this email fails silently?
         mail_admins("SkyAlert Submission Error",
                     "Event: %s\nExcption: %s\n" % (graceid, e),
                     fail_silently=True)
@@ -79,6 +81,7 @@ def skyalert(request, graceid):
             message = "Submitted to Skyalert: %s" % match.group()
         else:
             message = "SkyAlert submission problem.  Cannot parse SkyAlert response."
+            # XXX umm.  don't we want to know if this email fails silently?
             mail_admins("SkyAlert response parsing problem",
                         "Event: %s\nSkyAlert Response: %s\n" % (graceid, skyalert_response),
                         fail_silently=True)
@@ -99,47 +102,6 @@ def skyalert(request, graceid):
 
     return HttpResponseRedirect(reverse(view, args=[graceid]))
 
-
-def badskyalert(request, graceid):
-    event = Event.getByGraceid(graceid)
-
-    if not event.gpstime:
-        request.session['flash_msg'] = "No GPS time.  Event not suitable for submission to SkyAlert"
-        return HttpResponse("Ugh no gpstime")
-        return HttpResponseRedirect(reverse(view, args=[graceid]))
-
-    logentry = EventLog(event=event, issuer=request.ligouser, comment="TRYING TO SUMIT TO SKYALERT")
-    logentry.save()
-
-    skyalert_response = submitToSkyalert(event, validate_only="False")
-
-    if skyalert_response.find("Success") >= 0:
-        urlpat = re.compile('https://[^ ]*')
-        match = urlpat.search(skyalert_response)
-        if match:
-            try:
-                skyalert_url = match.group()
-            except:
-                skyalert_url = "fail match"
-            comment = "Submitted to SkyALert: %s" % skyalert_url
-            logentry = EventLog(event=event, issuer=request.ligouser, comment=comment)
-            logentry.save()
-            request.session['flash_msg'] = comment
-            return HttpResponse("OK " + skyalert_response + skyalert_url + logentry.comment)
-        else:
-            request.session['flash_msg'] = "Problem parsing skyalert response"
-            return HttpResponse('problem ' + skyalert_response)
-    elif skyalert_response.find('already found') >= 0:
-        request.session['flash_msg'] = "Event already submitted to SkyAlert " + skyalert_response
-        return HttpResponse('already done ' + skyalert_response)
-    else:
-        return HttpResponse('problem2 ' + skyalert_response)
-        request.session['flash_msg'] = "Unknown problem submitting to SkyAlert -- %s" % skyalert_response
-
-    #return HttpResponseRedirect(reverse(view, args=[graceid]))
-    return HttpResponse('how did we get here? ' + skyalert_response)
-    return view(request, graceid)
-
 def create(request):
     d = _create(request)
     if isinstance(d, HttpResponse):
-- 
GitLab