diff --git a/gracedb/alert.py b/gracedb/alert.py index 10dc7791fb6ced2a158913a27767deea394a7e17..4754d59944d03be1ccd8cfe435007bf2af22d590 100644 --- a/gracedb/alert.py +++ b/gracedb/alert.py @@ -82,8 +82,11 @@ def issueEmailAlert(event, location): triggers = atype.trigger_set.filter(labels=None) for trigger in triggers: for recip in trigger.contacts.all(): - bccaddresses.append(recip.email) - + if not trigger.farThresh: + bccaddresses.append(recip.email) + else: + if event.far and event.far < trigger.farThresh: + bccaddresses.append(recip.email) subject = "[gracedb] %s event. ID: %s" % (event.get_analysisType_display(), event.graceid()) message = """ New Event diff --git a/gracedb/models.py b/gracedb/models.py index 746a2365c08b88ebb387d4a6889a0404c7c00399..9b0842f9235b00bd277bf1603cd374343cfcc3f5 100644 --- a/gracedb/models.py +++ b/gracedb/models.py @@ -89,6 +89,8 @@ class Event(models.Model): return "T%04d" % self.id elif self.analysisType == "HWINJ": return "H%04d" % self.id + elif self.analysisType == "GRB": + return "E%04d" % self.id return "G%04d" % self.id def weburl(self): @@ -150,6 +152,8 @@ class Event(models.Model): return e if (id[0] == "H") and (e.analysisType == "HWINJ"): return e + if (id[0] == "E") and (e.analysisType == "GRB"): + return e if (id[0] == "G"): return e raise cls.DoesNotExist() diff --git a/gracedb/query.py b/gracedb/query.py index 65dfaed1182928d5fafe0e30425098d88154bee3..3da3accbf0743bd7d4c661b37e4c1b7a46b16c29 100644 --- a/gracedb/query.py +++ b/gracedb/query.py @@ -114,6 +114,12 @@ tidRange = tid + Suppress("..") + tid tidQ = Optional(Suppress(Keyword("tid:"))) + (tid^tidRange) tidQ = tidQ.setParseAction(maybeRange("tid", dbname="id")) +# External trigger event id +eid = Suppress("E")+Word("0123456789") +eidRange = eid + Suppress("..") + eid +eidQ = Optional(Suppress(Keyword("eid:"))) + (eid^eidRange) +eidQ = eidQ.setParseAction(maybeRange("eid", dbname="id")) + # Submitter submitter = QuotedString('"').setParseAction(lambda toks: Q(submitter__name=toks[0])) submitterQ = Optional(Suppress(Keyword("submitter:"))) + submitter @@ -214,7 +220,7 @@ ifoQ = ifoListQ | nifoQ ########################### -q = (ifoQ | hasfarQ | gidQ | hidQ | tidQ | labelQ | atypeQ | groupQ | gpsQ | createdQ | submitterQ | runQ | attributeQ).setName("query term") +q = (ifoQ | hasfarQ | gidQ | hidQ | tidQ | eidQ | labelQ | atypeQ | groupQ | gpsQ | createdQ | submitterQ | runQ | attributeQ).setName("query term") #andTheseTags = ["attr"] andTheseTags = ["nevents"] diff --git a/gracedb/translator.py b/gracedb/translator.py index 6bb0582851dcd9ea25d071d18c3eaf5b0614f958..b13f6a519df11caf3e8385291d021f1adf1e3159 100644 --- a/gracedb/translator.py +++ b/gracedb/translator.py @@ -18,6 +18,10 @@ from glue.gracedb.utils import populate_inspiral_tables, \ populate_coinc_tables, \ write_output_files +from VOEventLib.VOEvent import * +from VOEventLib.Vutil import * +from utils import isoToGps + def handle_uploaded_data(event, datafilename, log_filename='event.log', coinc_table_filename='coinc.xml'): @@ -291,6 +295,13 @@ def handle_uploaded_data(event, datafilename, f.close() except: pass + elif event.analysisType == 'GRB': + # Get the event time from the VOEvent file + try: + event.gpstime = getGpsFromVOEvent(datafilename) + except: + event.gpstime = 0 + event.save() else: # XXX should we do something here? pass @@ -453,3 +464,8 @@ class CwbData(Translator): def writeCoincFile(self, path): pass +def getGpsFromVOEvent(filename): + v = parse(filename) + wwd = getWhereWhen(v) + gpstime = isoToGps(wwd['time']) + return gpstime diff --git a/gracedb/urls.py b/gracedb/urls.py index 7c79a0ca409686ce4565528eca13ebc1d95a4a82..4113321928f46531b6de7e26b7eb99cd58348560 100644 --- a/gracedb/urls.py +++ b/gracedb/urls.py @@ -13,7 +13,7 @@ urlpatterns = patterns('gracedb.views', url (r'^voevent/(?P<graceid>[\w\d]+)', 'voevent', name="voevent"), url (r'^skyalert/(?P<graceid>[\w\d]+)', 'skyalert', name="skyalert"), url (r'^(?P<graceid>[\w\d]+)$', 'view', name="view2"), - url (r'^(?P<graceid>[\w\d]+)/files/(?P<filename>.+)$', download, name="file"), + url (r'^(?P<graceid>[\w\d]+)/files/(?P<filename>.*)$', download, name="file"), url (r'^(?P<graceid>[\w\d]+)/log/(?P<num>([\d]*|preview))$', 'logentry', name="logentry"), diff --git a/settings/branson.py b/settings/branson.py index dbe5521223275f9e62753a6995ad393c5f7aced7..dc87b5e3e4bf940dab496c180fc3129e21401c9e 100644 --- a/settings/branson.py +++ b/settings/branson.py @@ -8,7 +8,7 @@ DATABASES = { 'default' : { 'NAME' : 'branson', 'ENGINE' : 'django.db.backends.mysql', - 'USER' : 'gracedb', + 'USER' : 'branson', 'PASSWORD' : 'thinglet', } } @@ -50,5 +50,5 @@ TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. - "/homebransonbmoe/gracedb/templates", + "/home/branson/gracedbdev/templates", ) diff --git a/userprofile/forms.py b/userprofile/forms.py index 87c571c88bce56efdb5aa69dd992bd3646603ee2..66b8d18cd3ac806dd9d6638e847a56cdda36c846 100644 --- a/userprofile/forms.py +++ b/userprofile/forms.py @@ -6,6 +6,7 @@ from django.forms.models import modelformset_factory def triggerFormFactory(postdata=None, user=None): class TF(forms.ModelForm): + farThresh = forms.FloatField(label='FAR Threshold') class Meta: model = Trigger exclude = ['user', 'triggerType'] diff --git a/userprofile/models.py b/userprofile/models.py index dbabd67bfff5550932a19c270ef7ca62adc0e9b5..270be3dc10f15b264842ff04c854d1992457caba 100644 --- a/userprofile/models.py +++ b/userprofile/models.py @@ -46,6 +46,7 @@ class Trigger(models.Model): labels = models.ManyToManyField(Label, blank=True) atypes = models.ManyToManyField(AnalysisType, blank=True, verbose_name="Analysis Types") contacts = models.ManyToManyField(Contact, blank=True) + farThresh = models.FloatField(blank=True, null=True) def __unicode__(self): return ("%s: %s") % ( diff --git a/userprofile/views.py b/userprofile/views.py index d2d3ddea758702ff3a9c22a6d0fe8f6042f97b19..7256f500de73e00f27b07cee9a90277194b6768a 100644 --- a/userprofile/views.py +++ b/userprofile/views.py @@ -31,6 +31,7 @@ def create(request): labels = form.cleaned_data['labels'] atypes = form.cleaned_data['atypes'] contacts = form.cleaned_data['contacts'] + farThresh = form.cleaned_data['farThresh'] if contacts and (labels or atypes): t.save() # Need an id before relations can be set. @@ -38,6 +39,7 @@ def create(request): t.labels = labels t.atypes = atypes t.contacts = contacts + t.farThresh = farThresh except: t.delete() t.save() diff --git a/utils/__init__.py b/utils/__init__.py index 19adfb920bddcf494fbd2885b5c1383fc0074b2e..e4ac9a306852e17968d28cfb03e73d088a1559c9 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -11,6 +11,7 @@ import pytz import datetime import calendar +from time import mktime gpsEpoch = calendar.timegm((1980, 1, 6, 0, 0, 0, 0, 0, 0)) @@ -51,4 +52,17 @@ def gpsToUtc(gpsTime): t = gpsToPosixTime(gpsTime) return datetime.datetime.fromtimestamp(t, pytz.utc) - +def isoToGps(t): + # The input is a string in ISO time format: 2012-10-28T05:04:31.91 + # First strip out whitespace, then split off the factional + # second. We'll add that back later. + t=t.strip() + ISOTime = t.split('.')[0] + ISOTime = datetime.datetime.strptime(ISOTime,"%Y-%m-%dT%H:%M:%S") + sec_substr = t.split('.')[1] + if sec_substr: + fracSec = float('0.' + sec_substr) + else: + fracSec = 0 + posixTime = mktime(ISOTime.timetuple()) + fracSec + return int(round(posixToGpsTime(posixTime)))