Commit 62e36b41 authored by Christian's avatar Christian
Browse files

update files, plots screen

parent 11f6a6a0
Loading
Loading
Loading
Loading
−1.2 KiB (1 KiB)

File changed.

No diff preview for this file type.

+10 −0
Original line number Diff line number Diff line
#:kivy 1.10.0

<DetGrid@GridLayout>:
    current_color: (0,0,0,0)

    canvas.before:
        Color:
            rgba: self.current_color
        Rectangle:
            size:self.size
            pos:self.pos

<MainButton@Button>:
	on_press:self.nav()

+185 −60
Original line number Diff line number Diff line
import kivy
kivy.require('1.10.0')
kivy.require('1.11.0')

import threading
import time
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.gridlayout import GridLayout
from kivy.uix.image import Image
from kivy.uix.image import AsyncImage
from kivy.uix.slider import Slider
from kivy.clock import Clock
from kivy.uix.pagelayout import PageLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.spinner import Spinner
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.uix.slider import Slider
from kivy.clock import Clock
from kivy.graphics import Color, Rectangle
from kivy.properties import StringProperty
from kivy.properties import StringProperty, NumericProperty, ListProperty
from kivy.graphics.instructions import Callback
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition, SlideTransition
import RPi.GPIO as GPIO
from kivy.uix.scrollview import ScrollView
#import RPi.GPIO as GPIO
from kivy.lang.builder import Builder

from souptest import statusdetect
import requests
from bs4 import BeautifulSoup,SoupStrainer
from tables import * 
import datetime
import os

class Event(IsDescription):
    GraceID=StringCol(30)
    AlertType=StringCol(30)
    Instruments = StringCol(30)
    FAR = StringCol(30)
    skymap=StringCol(30)
    Group=StringCol(30)
    BNS=StringCol(30)
    NSBH=StringCol(30)
    BBH=StringCol(30)
    Terrestrial = StringCol(30)
    HasNS=StringCol(30)
    HasRemnant=StringCol(30)

#FIXME: DECLARE ALL GPIO PINS AND INITIAL INS/OUTS HERE


Builder.load_file('GWalarm.kv',rulesonly=True)


Builder.load_file('GWalarm.kv',rulesonly=True)

class MainButton(Button):
    def nav(self):
@@ -39,9 +58,11 @@ class MainButton(Button):
            app.root.current='status'
        elif self.id=='main':
            app.root.current='main'
        elif self.id=='plots':
            app.root.current='plots'
class MainScreen(Screen):
	def __init__(self,**kwargs):
		super(MainScreen,self).__init__(**kwargs)
		super().__init__(**kwargs)
		layout=GridLayout(cols=2,rows=2,padding=30,spacing=30,row_default_height=150)
		with layout.canvas.before:
			Color(.2,.2,.2,1)
@@ -54,66 +75,170 @@ class MainScreen(Screen):
		quitButton.bind(on_press=exit)

		self.add_widget(layout)
		ids=('history','status')
		texts=('Event History','Detector Status')
		ids=('history','status','plots')
		texts=('Event History','Detector Status','Test Plots')
		for i in range(0,len(ids)):
			hbut = MainButton(text=texts[i],id=ids[i])
			layout.add_widget(hbut)

		layout.add_widget(quitButton)

class HistoryScreen(Screen):
    def __init__(self,**kwargs):
		super(HistoryScreen,self).__init__(**kwargs)
        super().__init__(**kwargs)
        layout = GridLayout(rows=2)
        self.add_widget(layout)
        hisScroll = ScrollView(do_scroll_x=False,size_hint=(1,None))
        layout.add_widget(hisScroll)
        button2 =MainButton(text='Main Menu',id='main')
		self.add_widget(button2)
        hisScroll.add_widget(button2)
        
        t2 = threading.Thread(target=historyUpdate,args=(HistoryScreen,),daemon=True)
        t2.start()
    
    
class DetGrid(GridLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
            
class DetLabel(Label):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        with self.canvas.before:
            Color([0,0,0,0])
        

class NestedBox(BoxLayout):
	pass

class DetLabel(Label):
	detname = StringProperty()
	detstat = NumericProperty()
	dettime = StringProperty()
def historyUpdate(obj):
    try:
        os.chdir("./event_data")
    except:
        os.mkdir("./event_data")
        os.chdir("./event_data")
        
    #initial check to ensure file exists with necessary groupings
    h5file = open_file("Event Database",mode="a",title="eventinfo")
    try:
        h5file.create_group("/","events")
    except NodeError:
        pass
    h5file.close()
    
    while True:
        h5file = open_file("Event Database",mode="a",title="eventinfo")
#       
        
        
        h5file.close()
        
        time.sleep(60)
        
        

def statusupdate(obj):
    while True:
        (detnames,stats,dettimes) = statusdetect()
        
        names = ['GEO 600', 'LIGO Hanford', 'LIGO Livingston']
        order = [dettimes,detnames,names]
        j=0
        for child in obj.children:
            if stats[j] != 2:
                child.current_color=[1-stats[j],0,stats[j],1]
            else:
                child.current_color=[0,1,0,1]
            with child.canvas:
                    Color(rgba=child.current_color)
            i=0
            for label in child.children:
                label.text=order[i][j]
                i+=1
            j+=1
    
        time.sleep(30)
        
class StatusScreen(Screen):
    def __init__(self,**kwargs):
		super(StatusScreen,self).__init__(**kwargs)
		layout = GridLayout(cols=1,rows=2,spacing=30,padding=30,default_row_height=150)
        super().__init__(**kwargs)
        layout = GridLayout(cols=1,rows=2,spacing=30,padding=30, row_default_height=150)
        with layout.canvas.before:
            Color(.2,.2,.2,1)
            self.rect=Rectangle(size=(800,600),pos=layout.pos)
#Clock.schedule_interval(statusdetect,60)

        self.add_widget(layout)

        detLay = NestedBox()

		det1layout = GridLayout(cols=3,spacing=10,padding=10)
		det2layout=GridLayout(cols=3,spacing=10,padding=10)
		det3layout=GridLayout(cols=3,spacing=10,padding=10)
        for i in range(0,3):
            lay = DetGrid(cols=3,spacing=10,padding=10)
            for j in range(0,3):
                box = DetLabel(text='test'+str(j))
                lay.add_widget(box)
            with lay.canvas.before:
                lay.col = Color(1,0,1,0)
                lay.rect=Rectangle(pos=lay.pos)
            detLay.add_widget(lay)
            
        layout.add_widget(detLay)        
		detLay.add_widget(det1layout)
		detLay.add_widget(det2layout)
		detLay.add_widget(det3layout)

		statids = ['test1','test2','test3']

		(detectornames,statuses,detectortimes) = statusdetect(
        t = threading.Thread(target=statusupdate,args=(detLay,),daemon=True)
        t.start()

        button3 = MainButton(text='Main Menu',id='main')
        layout.add_widget(button3)

class PlotsScreen(Screen):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        layout=GridLayout(rows=2)
        self.add_widget(layout)
        
        date = datetime.datetime.today()
        sort_date = [str(date.year),str(date.month).zfill(2),str(date.day).zfill(2)]
        datestring = sort_date[0]+sort_date[1]+sort_date[2]
        url = "https://www.gw-openscience.org/detector_status/day/"+datestring+"/"
        
        resp=requests.get(url)
        r = resp.text
        soup=BeautifulSoup(r,"lxml")
        
        sources=[]
        descripts=[]
        
        for link in soup.find_all("a"):
            linkstr = str(link.get("href"))
            if 'png' in linkstr:
                sources.append(linkstr)
                descripts.append(str(link.get("title")))
        
        wimg=AsyncImage(source=sources[0])
        button4 = MainButton(text='Main Menu',id='main')
        layout.add_widget(button4)
        layout.add_widget(wimg)

sm = ScreenManager()
sm.add_widget(MainScreen(name='main'))
sm.add_widget(HistoryScreen(name='history'))
sm.add_widget(StatusScreen(name='status'))
sm.add_widget(PlotsScreen(name='plots'))

class MyApp(App):
	def build(self):
		return sm

#Spyder test functionality
def reset():
    import kivy.core.window as window
    from kivy.base import EventLoop
    if not EventLoop.event_listeners:
        from kivy.cache import Cache
        window.Window = window.core_select_lib('window', window.window_impl, True)
        Cache.print_usage()
        for cat in Cache._categories:
            Cache._objects[cat] = {}

if __name__ == '__main__':
    reset()
    MyApp().run()
+108 −0
Original line number Diff line number Diff line
<?xml version="1.0" ?>
<voe:VOEvent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:voe="http://www.ivoa.net/xml/VOEvent/v2.0"
xsi:schemaLocation="http://www.ivoa.net/xml/VOEvent/v2.0 http://www.ivoa.net/xml/VOEvent/VOEvent-v2.0.xsd"
 version="2.0" role="test" ivorn="ivo://gwnet/LVC#MS181101ab-1-Preliminary">
    <Who>
        <Date>2018-11-01T22:34:49</Date>
        <Author>
            <contactName>LIGO Scientific Collaboration and Virgo Collaboration</contactName>
        </Author>
    </Who>
    <What>
        <Param name="internal" dataType="int" value="0">
            <Description>Indicates whether this event should be distributed to LSC/Virgo members only</Description>
        </Param>
        <Param name="Packet_Type" dataType="int" value="150">
            <Description>The Notice Type number is assigned/used within GCN, eg type=150 is an LVC_PRELIMINARY notice</Description>
        </Param>
        <Param name="Pkt_Ser_Num" dataType="string" value="1">
            <Description>A number that increments by 1 each time a new revision is issued for this event</Description>
        </Param>
        <Param name="GraceID" dataType="string" value="MS181101ab" ucd="meta.id">
            <Description>Identifier in GraceDB</Description>
        </Param>
        <Param name="AlertType" dataType="string" value="Preliminary" ucd="meta.version">
            <Description>VOEvent alert type</Description>
        </Param>
        <Param name="HardwareInj" dataType="int" value="0" ucd="meta.number">
            <Description>Indicates that this event is a hardware injection if 1, no if 0</Description>
        </Param>
        <Param name="OpenAlert" dataType="int" value="1" ucd="meta.number">
            <Description>Indicates that this event is an open alert if 1, no if 0</Description>
        </Param>
        <Param name="EventPage" dataType="string" value="https://example.org/superevents/MS181101ab/view/" ucd="meta.ref.url">
            <Description>Web page for evolving status of this GW candidate</Description>
        </Param>
        <Param name="Instruments" dataType="string" value="H1,L1,V1" ucd="meta.code">
            <Description>List of instruments used in analysis to identify this event</Description>
        </Param>
        <Param name="FAR" dataType="float" value="9.11069936486e-14" ucd="arith.rate;stat.falsealarm" unit="Hz">
            <Description>False alarm rate for GW candidates with this strength or greater</Description>
        </Param>
        <Param name="Group" dataType="string" value="CBC" ucd="meta.code">
            <Description>Data analysis working group</Description>
        </Param>
        <Param name="Pipeline" dataType="string" value="gstlal" ucd="meta.code">
            <Description>Low-latency data analysis pipeline</Description>
        </Param>
        <Param name="Search" dataType="string" value="MDC" ucd="meta.code">
            <Description>Specific low-latency search</Description>
        </Param>
        <Group type="GW_SKYMAP" name="bayestar">
            <Param name="skymap_fits" dataType="string" value="https://emfollow.docs.ligo.org/userguide/_static/bayestar.fits.gz" ucd="meta.ref.url">
                <Description>Sky Map FITS</Description>
            </Param>
        </Group>
        <Group type="Classification">
            <Description>Source classification: binary neutron star (BNS), neutron star-black hole (NSBH), binary black hole (BBH), MassGap, or terrestrial (noise)</Description>
            <Param name="BNS" dataType="float" value="0.95" ucd="stat.probability">
                <Description>Probability that the source is a binary neutron star merger (both objects lighter than 3 solar masses)</Description>
            </Param>
            <Param name="NSBH" dataType="float" value="0.01" ucd="stat.probability">
                <Description>Probability that the source is a neutron star-black hole merger (primary heavier than 5 solar masses, secondary lighter than 3 solar masses)</Description>
            </Param>
            <Param name="BBH" dataType="float" value="0.03" ucd="stat.probability">
                <Description>Probability that the source is a binary black hole merger (both objects heavier than 5 solar masses)</Description>
            </Param>
            <Param name="MassGap" dataType="float" value="0.0" ucd="stat.probability">
                <Description>Probability that the source has at least one object between 3 and 5 solar masses</Description>
            </Param>
            <Param name="Terrestrial" dataType="float" value="0.01" ucd="stat.probability">
                <Description>Probability that the source is terrestrial (i.e., a background noise fluctuation or a glitch)</Description>
            </Param>
        </Group>
        <Group type="Properties">
            <Description>Qualitative properties of the source, conditioned on the assumption that the signal is an astrophysical compact binary merger</Description>
            <Param name="HasNS" dataType="float" value="0.95" ucd="stat.probability">
                <Description>Probability that at least one object in the binary has a mass that is less than 3 solar masses</Description>
            </Param>
            <Param name="HasRemnant" dataType="float" value="0.91" ucd="stat.probability">
                <Description>Probability that a nonzero mass was ejected outside the central remnant object</Description>
            </Param>
        </Group>
    </What>
    <WhereWhen>
        <ObsDataLocation>
            <ObservatoryLocation id="LIGO Virgo"/>
            <ObservationLocation>
                <AstroCoordSystem id="UTC-FK5-GEO"/>
                <AstroCoords coord_system_id="UTC-FK5-GEO">
                    <Time>
                        <TimeInstant>
                            <ISOTime>2018-11-01T22:22:46.654437</ISOTime>
                        </TimeInstant>
                    </Time>
                </AstroCoords>
            </ObservationLocation>
        </ObsDataLocation>
    </WhereWhen>
    <How>
        <Description>Candidate gravitational wave event identified by low-latency analysis</Description>
        <Description>H1: LIGO Hanford 4 km gravitational wave detector</Description>
        <Description>L1: LIGO Livingston 4 km gravitational wave detector</Description>
        <Description>V1: Virgo 3 km gravitational wave detector</Description>
    </How>
    <Description>Report of a candidate gravitational wave event</Description>
</voe:VOEvent>
+1.09 KiB

File added.

No diff preview for this file type.

Loading