diff --git a/gracedb/forms.py b/gracedb/forms.py index 739b76442efdde1109c94925095b23a50826d423..2e36fe0b5567c7f66a62b6a7c98028b709d97fe0 100644 --- a/gracedb/forms.py +++ b/gracedb/forms.py @@ -21,6 +21,8 @@ class EventSearchForm(forms.Form): graceidEnd = forms.CharField(required=False) group = forms.ChoiceField(choices=groupChoices, required=False) type = forms.ChoiceField(choices=typeChoices, required=False) + gpsStart = forms.IntegerField(min_value=0, required=False) + gpsSlop = forms.IntegerField(min_value=0, required=False) submitter = forms.ChoiceField(choices=submitterChoices, required=False) ligoApproved = forms.BooleanField(initial=False, required=False, label="LIGO Approved Only") diff --git a/gracedb/models.py b/gracedb/models.py index 0d9c280caa502c9ce428c61df1494a24bd3c4ed1..0e278e6ce74ca510887bb69ea57db78a23a0e12a 100644 --- a/gracedb/models.py +++ b/gracedb/models.py @@ -41,6 +41,16 @@ class Event(models.Model): created = models.DateTimeField(auto_now_add=True) group = models.ForeignKey(Group) analysisType = models.CharField(max_length=20, choices=ANALYSIS_TYPE_CHOICES) + # From ligolw coinc_event table -- none are required. yet. + instruments = models.CharField(max_length=20, default="") + nevents = models.PositiveIntegerField(null=True) + likelihood = models.FloatField(null=True) + + # NOT from coinc_event, but so, so common. + # Note that the semantics for this is different depending + # on search type, so in some sense, querying on this may + # be considered, umm, wrong? But it is a starting point. + gpstime = models.PositiveIntegerField(null=True) # XXX Deprecated. Only useful for old test data. # Remove this when it won't freak people out to lose diff --git a/gracedb/translator.py b/gracedb/translator.py new file mode 100644 index 0000000000000000000000000000000000000000..ec87bcbab658df6db67ed8cfe7c3c8ea319cc01a --- /dev/null +++ b/gracedb/translator.py @@ -0,0 +1,98 @@ + +import os + +from models import EventLog + +import glue +from glue.gracedb.utils import InspiralCoincIdBase, InspiralCoincDef +from glue.gracedb.utils import BurstCoincIdBase, BurstCoincDef + +from glue.gracedb.utils import insp_event_id_dict +from glue.gracedb.utils import coherent_event_id_dict + +from glue.gracedb.utils import populate_inspiral_tables, \ + populate_burst_tables, \ + populate_coinc_tables, \ + write_output_files + +def handle_uploaded_data(event, datafilename, + log_filename='event.log', + coinc_table_filename='coinc.xml'): + + if event.analysisType == 'MBTA': + xmldoc, log_data, detectors = \ + populate_inspiral_tables(datafilename, 0) + # XXX ligolw wants ints. + #populate_inspiral_tables(datafilename, #event.graceid()) + xmldoc = populate_coinc_tables(xmldoc, + # XXX ligolw wants ints. + #event.graceid(), + 0, + InspiralCoincIdBase, + insp_event_id_dict, + InspiralCoincDef, + detectors) + + output_dir = os.path.dirname(datafilename) + write_output_files(output_dir, xmldoc, log_data, + xml_fname=coinc_table_filename, + log_fname=log_filename) + + # Create EventLog entries about these files. + private_data_url = os.path.join(event.weburl(), 'private') + + log = EventLog(event=event, + filename=log_filename, + issuer=event.submitter, + comment="Log File Created" ) + log.save() + + log = EventLog(event=event, + filename=coinc_table_filename, + issuer=event.submitter, + comment="Coinc Table Created") + log.save() + + # Exctract relevant data from xmldoc. + coinc_table = glue.ligolw.table.getTablesByName( + xmldoc, + glue.ligolw.lsctables.CoincInspiralTable.tableName) + coinc_table = coinc_table[0] + event.gpstime = coinc_table[0].end_time + + coinc_table = glue.ligolw.table.getTablesByName( + xmldoc, + glue.ligolw.lsctables.CoincTable.tableName) + coinc_table = coinc_table[0] + event.instruments = coinc_table[0].instruments + event.nevents = coinc_table[0].nevents + event.likelihood = coinc_table[0].likelihood + event.save() + + elif event.analysisType == 'OM': # Omega + xmldoc, log_data, detectors = populate_burst_tables(datafilename, 0) + xmldoc = populate_coinc_tables( + xmldoc, 0, BurstCoincIdBase, \ + coherent_event_id_dict, BurstCoincDef, \ + detectors) + + output_dir = os.path.dirname(datafilename) + write_output_files(output_dir, xmldoc, log_data) + + # Exctract relevant data from xmldoc. + coinc_table = glue.ligolw.table.getTablesByName( + xmldoc, + glue.ligolw.lsctables.MultiBurstTable.tableName) + coinc_table = coinc_table[0] + event.gpstime = coinc_table[0].start_time + + coinc_table = glue.ligolw.table.getTablesByName( + xmldoc, + glue.ligolw.lsctables.CoincTable.tableName) + coinc_table = coinc_table[0] + event.instruments = coinc_table[0].instruments + event.nevents = coinc_table[0].nevents + event.likelihood = coinc_table[0].likelihood + event.save() + else: + pass diff --git a/gracedb/views.py b/gracedb/views.py index 34181af234cac44dc146f0b490db8bc42685bec3..78bb5aa331f498858a5911627a6941c6e08dcdd4 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -10,9 +10,7 @@ from django.views.generic.list_detail import object_detail, object_list from models import Event, Group, EventLog from forms import CreateEventForm, EventSearchForm from alert import issueAlert - -from glue.gracedb.utils import populate_inspiral_tables, populate_coinc_tables, write_output_files - +from translator import handle_uploaded_data import os @@ -204,6 +202,8 @@ def search(request): submitter = form.cleaned_data['submitter'] groupname = form.cleaned_data['group'] typename = form.cleaned_data['type'] + gpsStart = form.cleaned_data['gpsStart'] + slop = form.cleaned_data['gpsSlop'] if not groupname: # don't show test events unless explicitly requested @@ -229,6 +229,16 @@ def search(request): objects = objects.filter(id__lte=int(end[1:])) objects = objects.filter(uid="") + if gpsStart: + slop = slop or 0 + if not slop: + objects = objects.filter(gpstime=gpsStart) + else: + gpsStart = int(gpsStart) + slop = int(slop) / 2 + objects = objects.filter(gpstime__gte=gpsStart-slop) + objects = objects.filter(gpstime__lte=gpsStart+slop) + if submitter: objects = objects.filter(submitter=submitter) if groupname: @@ -302,34 +312,3 @@ Initial Entry for %s os.chmod(pname, 0644) os.chmod(rcsname, 0444) -def handle_uploaded_data(event, datafilename, - log_filename='event.log', - coinc_table_filename='coinc.xml'): - from glue.gracedb.utils import InspiralCoincId, InspiralCoincDef - from glue.gracedb.utils import insp_event_id_dict - - if event.analysisType == 'MBTA': - xmldoc, log_data = populate_inspiral_tables(datafilename) - populate_coinc_tables(xmldoc, InspiralCoincId, insp_event_id_dict, InspiralCoincDef) - - output_dir = os.path.dirname(datafilename) - write_output_files(output_dir, xmldoc, log_data, - xml_fname=coinc_table_filename, - log_fname=log_filename) - - # Create EventLog entries about these files. - private_data_url = os.path.join(event.weburl(), 'private') - log_comment = "Log File Created" - log = EventLog(event=event, - filename=log_filename, - issuer=event.submitter, - comment=log_comment) - log.save() - comment="Coinc Table Created" - #comment="Coinc Table: %s" % os.path.join(output_dir, coinc_table_filename) - log = EventLog(event=event, - filename=coinc_table_filename, - issuer=event.submitter, - comment=comment) - log.save() - diff --git a/templates/gracedb/event_list.html b/templates/gracedb/event_list.html index e4a10fad4d3d168073c534a3da8093d7bd349aba..f8792f12707f1f88101aab64c03a6a981a73173e 100644 --- a/templates/gracedb/event_list.html +++ b/templates/gracedb/event_list.html @@ -18,6 +18,7 @@ <th>Submitter</th> <th>Group</th> <th>Type</th> + <th>GPS Time</th> <th>Web</th> <th>Wiki</th> </tr> @@ -46,6 +47,7 @@ <td>{{ obj.submitter }} </td> <td>{{ obj.group }} </td> <td>{{ obj.get_analysisType_display }} </td> + <td>{% if obj.gpstime%}{{ obj.gpstime }}{% endif %}</td> <td><a href="{{ obj.weburl }}">Web: {{ obj.graceid }}</a></td> <td><a href="{{ obj.wikiurl }}">Wiki: {{ obj.graceid }}</a></td> </tr>