From 0530b595f22190ab25a3bd359f9162e511e3ce38 Mon Sep 17 00:00:00 2001 From: Alexander Pace <alexander.pace@ligo.org> Date: Fri, 23 Feb 2024 19:09:58 +0000 Subject: [PATCH] add svom pipeline --- config/settings/base.py | 1 + .../migrations/0090_add_svom_pipeline.py | 39 ++++++++++++ gracedb/events/translator.py | 16 ++++- gracedb/events/view_logic.py | 3 +- .../guardian/0021_populate_svom_uploaders.py | 60 +++++++++++++++++++ 5 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 gracedb/events/migrations/0090_add_svom_pipeline.py create mode 100644 gracedb/migrations/guardian/0021_populate_svom_uploaders.py diff --git a/config/settings/base.py b/config/settings/base.py index 3dadabc86..c1aad642e 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -262,6 +262,7 @@ GRB_PIPELINES = [ 'INTEGRAL', 'AGILE', 'CHIME', + 'SVOM', ] # List of pipelines that have been depreciated: diff --git a/gracedb/events/migrations/0090_add_svom_pipeline.py b/gracedb/events/migrations/0090_add_svom_pipeline.py new file mode 100644 index 000000000..2c45e7982 --- /dev/null +++ b/gracedb/events/migrations/0090_add_svom_pipeline.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +from django.db import migrations +from events.models import Pipeline, Search + +# Creates initial search pipeline instances + +# List of search pipeline names +NEW_PIPELINES = [ + ('SVOM', Pipeline.PIPELINE_TYPE_EXTERNAL), +] + +def add_pipelines(apps, schema_editor): + Pipeline = apps.get_model('events', 'Pipeline') + Search = apps.get_model('events', 'Search') + + # Create pipelines + for pipeline_name in NEW_PIPELINES: + pipeline, created = Pipeline.objects.get_or_create(name=pipeline_name[0]) + pipeline.pipeline_type = pipeline_name[1] + pipeline.save() + +def remove_pipelines(apps, schema_editor): + Pipeline = apps.get_model('events', 'Pipeline') + Search = apps.get_model('events', 'Search') + + # Delete pipelines + for pipe in NEW_PIPELINES: + Pipeline.objects.filter(name=pipe[0]).delete() + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0089_alter_emobservation_group_and_more'), + ] + + operations = [ + migrations.RunPython(add_pipelines, remove_pipelines), + ] diff --git a/gracedb/events/translator.py b/gracedb/events/translator.py index 54218628d..f4009c0c5 100644 --- a/gracedb/events/translator.py +++ b/gracedb/events/translator.py @@ -346,7 +346,8 @@ def handle_uploaded_data(event, datafilename, comment=comment) log.save() - elif pipeline in ['Swift', 'Fermi', 'SNEWS', 'INTEGRAL','AGILE', 'CHIME']: + elif pipeline in ['Swift', 'Fermi', 'SNEWS', 'INTEGRAL', + 'AGILE', 'CHIME', 'SVOM']: # Get the event time from the VOEvent file error = None populateGrbEventFromVOEventFile(datafilename, event) @@ -725,8 +726,16 @@ def populateGrbEventFromVOEventFile(filename, event): # Fermi uses Trig_Dur or Data_Integ, while Swift uses Integ_Time # One or the other may be present, but not both VOEvent_params = vp.convenience.get_toplevel_params(v) + # Also grab parameters from embedded group if there, needed for SVOM + Svom_ident = vp.convenience.get_grouped_params(v).get('Svom_Identifiers') + Svom_detect = vp.convenience.get_grouped_params(v).get('Detection_Info') + if Svom_ident is not None: + VOEvent_params.update(Svom_ident) + if Svom_detect is not None: + VOEvent_params.update(Svom_detect) + trig_dur_params = ["Trig_Dur", "Trans_Duration", "Data_Integ", - "Integ_Time", "Trig_Timescale"] + "Integ_Time", "Trig_Timescale", "Timescale"] trigger_duration = None for param in trig_dur_params: if (param in VOEvent_params): @@ -742,7 +751,8 @@ def populateGrbEventFromVOEventFile(filename, event): # try to find a trigger_id value trigger_id = None - trigger_id_params = ['TrigID', 'Trans_Num', 'EventID'] + trigger_id_params = ['TrigID', 'Trans_Num', 'EventID', + 'Burst_Id'] for param in trigger_id_params: if (param in VOEvent_params): trigger_id = VOEvent_params.get(param).get('value') diff --git a/gracedb/events/view_logic.py b/gracedb/events/view_logic.py index 3322e9251..f1199469a 100644 --- a/gracedb/events/view_logic.py +++ b/gracedb/events/view_logic.py @@ -56,7 +56,8 @@ def _createEventFromForm(request, form): # Create Event if pipeline.name in ['gstlal', 'spiir', 'MBTAOnline', 'MBTA', 'pycbc', 'PyGRB']: event = CoincInspiralEvent() - elif pipeline.name in ['Fermi', 'Swift', 'SNEWS','INTEGRAL','AGILE', 'CHIME']: + elif pipeline.name in ['Fermi', 'Swift', 'SNEWS','INTEGRAL','AGILE', 'CHIME', + 'SVOM']: event = GrbEvent() elif pipeline.name in ['CWB', 'CWB2G']: event = MultiBurstEvent() diff --git a/gracedb/migrations/guardian/0021_populate_svom_uploaders.py b/gracedb/migrations/guardian/0021_populate_svom_uploaders.py new file mode 100644 index 000000000..4fdde1e47 --- /dev/null +++ b/gracedb/migrations/guardian/0021_populate_svom_uploaders.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# supports: https://git.ligo.org/computing/gracedb/server/-/issues/338 + +from django.db import migrations + +# Creates UserObjectPermission objects which allow specific users +# to add events for pipelines. Based on current production database +# content (27 October 2017) + +# List of pipeline names and lists of usernames who should +# be allowed to add events for them +PP_LIST = [ + { + 'pipeline': 'SVOM', + 'usernames': [ + 'brandon.piotrzkowski@ligo.org', + 'naresh.adhikari@ligo.org', + 'rachel.hamburg@ligo.org', + 'emfollow', + ] + }, +] + +def add_permissions(apps, schema_editor): + User = apps.get_model('auth', 'User') + Permission = apps.get_model('auth', 'Permission') + UserObjectPermission = apps.get_model('guardian', 'UserObjectPermission') + Pipeline = apps.get_model('events', 'Pipeline') + ContentType = apps.get_model('contenttypes', 'ContentType') + + perm = Permission.objects.get(codename='populate_pipeline') + ctype = ContentType.objects.get_for_model(Pipeline) + for pp_dict in PP_LIST: + pipeline, created = Pipeline.objects.get_or_create(name=pp_dict['pipeline']) + + # Loop over users + for username in pp_dict['usernames']: + + # Robot users should have been already created by ligoauth 0003, + # but we have to create human user accounts here + user, _ = User.objects.get_or_create(username=username) + + # Create UserObjectPermission + uop, uop_created = UserObjectPermission.objects.get_or_create( + user=user, permission=perm, content_type=ctype, + object_pk=pipeline.id) + +def remove_permissions(apps, schema_editor): + pass + +class Migration(migrations.Migration): + + dependencies = [ + ('guardian', '0020_populate_aframe_uploaders'), + ('events', '0090_add_svom_pipeline'), + ] + + operations = [ + migrations.RunPython(add_permissions, remove_permissions), + ] -- GitLab