Skip to content
Snippets Groups Projects
Commit a1663303 authored by Branson Stephens's avatar Branson Stephens
Browse files

merging models.py

parents 297b1a2d f10e7cd2
No related branches found
No related tags found
No related merge requests found
from django.db import models
from django.core.urlresolvers import reverse
from model_utils.managers import InheritanceManager
import datetime
import thread
import string
......@@ -49,6 +51,9 @@ class Label(models.Model):
return self.name
class Event(models.Model):
objects = InheritanceManager() # Queries can return subclasses, if available.
ANALYSIS_TYPE_CHOICES = (
("LM", "LowMass"),
("HM", "HighMass"),
......@@ -149,7 +154,10 @@ class Event(models.Model):
@classmethod
def getByGraceid(cls, id):
e = cls.objects.get(id=int(id[1:]))
try:
e = cls.objects.filter(id=int(id[1:])).select_subclasses()[0]
except IndexError:
raise cls.DoesNotExist("Event matching query does not exist")
if (id[0] == "T") and (e.group.name == "Test"):
return e
if (id[0] == "H") and (e.analysisType == "HWINJ"):
......@@ -158,7 +166,7 @@ class Event(models.Model):
return e
if (id[0] == "G"):
return e
raise cls.DoesNotExist()
raise cls.DoesNotExist("Event matching query does not exist")
def __unicode__(self):
return self.graceid()
......@@ -198,6 +206,40 @@ class Approval(models.Model):
approvedEvent = models.ForeignKey(Event, null=False)
approvingCollaboration = models.CharField(max_length=1, choices=COLLABORATION_CHOICES)
## Analysis Specific Attributes.
class CoincInspiralEvent(Event):
ifos = models.CharField(max_length=20, default="")
end_time = models.PositiveIntegerField(null=True)
end_time_ns = models.PositiveIntegerField(null=True)
mass = models.FloatField(null=True)
mchirp = models.FloatField(null=True)
minimum_duration = models.FloatField(null=True)
snr = models.FloatField(null=True)
false_alarm_rate = models.FloatField(null=True)
combined_far = models.FloatField(null=True)
class MultiBurstEvent(Event):
ifos = models.CharField(max_length=20, default="")
start_time = models.PositiveIntegerField(null=True)
start_time_ns = models.PositiveIntegerField(null=True)
duration = models.FloatField(null=True)
peak_time = models.PositiveIntegerField(null=True)
peak_time_ns = models.PositiveIntegerField(null=True)
central_freq = models.FloatField(null=True)
bandwidth = models.FloatField(null=True)
amplitude = models.FloatField(null=True)
snr = models.FloatField(null=True)
confidence = models.FloatField(null=True)
false_alarm_rate = models.FloatField(null=True)
ligo_axis_ra = models.FloatField(null=True)
ligo_axis_dec = models.FloatField(null=True)
ligo_angle = models.FloatField(null=True)
ligo_angle_sig = models.FloatField(null=True)
## Slots (user-defined event attributes)
class Slot(models.Model):
"""Slot Model"""
# Does the slot need to have a submitter column?
......
......@@ -105,6 +105,16 @@ def handle_uploaded_data(event, datafilename,
event.nevents = coinc_table[0].nevents
event.likelihood = coinc_table[0].likelihood
event.ifos = ifos
event.end_time = end_time[0]
event.end_time_ns = end_time[1]
event.mass = mass
event.mchirp = mchirp
event.minimum_duration = getattr(origdata[0][0], "minimum_duration", None)
event.snr = snr
event.false_alarm_rate = getattr(origdata[0][0], "false_alarm_rate", None)
event.combined_far = far
# XXX xml_filename unused
#xml_filename = os.path.join(output_dir, coinc_table_filename)
......@@ -211,6 +221,21 @@ def handle_uploaded_data(event, datafilename,
event.nevents = coinc_table[0].nevents
event.likelihood = coinc_table[0].likelihood
# extended attributes
coinc_inspiral_table = glue.ligolw.table.getTablesByName(
xmldoc,
glue.ligolw.lsctables.CoincInspiralTable.tableName)
coinc_inspiral_table = coinc_inspiral_table[0]
event.ifos = coinc_inspiral_table[0].ifos
event.end_time = coinc_inspiral_table[0].end_time
event.end_time_ns = coinc_inspiral_table[0].end_time_ns
event.mass = coinc_inspiral_table[0].mass
event.mchirp = coinc_inspiral_table[0].mchirp
#event.minimum_duration = coinc_inspiral_table[0].minimum_duration
event.snr = coinc_inspiral_table[0].snr
event.false_alarm_rate = coinc_inspiral_table[0].false_alarm_rate
event.combined_far = coinc_inspiral_table[0].combined_far
# XXX xml_filename unused
#xml_filename = os.path.join(output_dir, coinc_table_filename)
......@@ -287,18 +312,6 @@ def handle_uploaded_data(event, datafilename,
comment="Log File Created" )
log.save()
elif event.analysisType == 'HWINJ':
try:
f = open(datafilename, "r")
for line in f.readlines():
if line.startswith("gpstime:"):
times = line.split()
event.gpstime = int(float(times[1]))
event.save()
break
f.close()
except:
pass
elif event.analysisType == 'GRB':
# Get the event time from the VOEvent file
try:
......@@ -351,8 +364,6 @@ class Translator(object):
event.instruments = data.get('instruments')
event.far = data.get('far')
event.save()
def logData(self):
data = self.getData()
logdata = []
......@@ -400,6 +411,21 @@ class CwbData(Translator):
self.castData(data)
return self.data
def populateEvent(self, event):
Translator.populateEvent(self, event)
# MultiBurst table attributes
data = self.getData()
event.ifo = data.get('ifo')
event.start_time = data.get('start_time')
event.start_time_ns = data.get('start_time_ns')
event.duration = data.get('duration')
event.central_freq = data.get('central_freq')
event.bandwidth = data.get('bandwidth')
event.snr = data.get('snr')
event.ligo_axis_ra = data.get('ligo_axis_ra')
event.ligo_axis_dec = data.get('ligo_axis_dec')
def readData(self, datafile):
needToClose = False
if isinstance(datafile, str) or isinstance(datafile, unicode):
......@@ -459,6 +485,26 @@ class CwbData(Translator):
ifos.sort()
data['instruments'] = ','.join(ifos)
# MultiBurst table attributes
start = rawdata.get('start',[None])[0]
if start is not None:
integer, frac = start.split('.')
data['start_time'] = int(integer)
data['start_time_ns'] = int(frac+(9-len(frac))*'0')
else:
data['start_time'] = None
data['start_time_ns'] = None
data['ifo'] = ','.join(ifos)
data['duration'] = rawdata.get('duration',[None])[0]
data['central_freq'] = rawdata.get('frequency',[None])[0]
data['bandwidth'] = rawdata.get('bandwidth',[None])[0]
#data['snr'] = rawdata.get('snr',[None])[0]
# rho is what log file says is "effective snr"
data['snr'] = data['rawdata'].get('rho',[None])[0]
data['ligo_axis_ra'] = data['rawdata'].get('phi',[None,None,None])[2]
data['ligo_axis_dec'] = data['rawdata'].get('theta',[None,None,None])[2]
if needToClose:
datafile.close()
......
......@@ -11,6 +11,8 @@ from django.utils.safestring import mark_safe
from django.views.generic.list_detail import object_detail, object_list
from models import Event, Group, EventLog, Labelling, Label, User
from models import CoincInspiralEvent
from models import MultiBurstEvent
from forms import CreateEventForm, EventSearchForm, SimpleSearchForm
from alert import issueAlert, issueAlertForLabel, issueAlertForUpdate
from translator import handle_uploaded_data
......@@ -201,12 +203,17 @@ def _createEventFromForm(request, form):
warnings = []
try:
group = Group.objects.filter(name=form.cleaned_data['group'])
type = form.cleaned_data['type']
atype = form.cleaned_data['type']
# Create Event
event = Event()
if atype in ['LM', 'HM', 'MBTA']:
event = CoincInspiralEvent()
elif atype == "CWB":
event = MultiBurstEvent()
else:
event = Event()
event.submitter = request.ligouser
event.group = group[0]
event.analysisType = type
event.analysisType = atype
# ARGH. We don't get a graceid until we save,
# but we don't know in advance if we can actually
# create all the things we need for success!
......@@ -531,7 +538,8 @@ def view(request, graceid):
for event in a.neighbors()]
context['skyalert_authorized'] = skyalert_authorized(request)
return render_to_response(
'gracedb/event_detail.html',
[ 'gracedb/event_detail_{0}.html'.format(a.analysisType),
'gracedb/event_detail.html'],
context,
context_instance=RequestContext(request))
......
......@@ -106,7 +106,7 @@ class VersionedFile(file):
os.close(fd)
break
except OSError, e:
if e.error != errno.EEXIST:
if e.errno != errno.EEXIST:
raise
version += 1
failedAttempts += 1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment