-
Notifications
You must be signed in to change notification settings - Fork 0
/
pv_slicer.py
126 lines (82 loc) · 3.32 KB
/
pv_slicer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import numpy as np
from glue.qt import get_qapp
from glue.external.qt.QtGui import QMainWindow, QWidget, QStackedWidget, QFileDialog
from glue.core.application_base import Application
from PyQt4.uic import loadUi
from glue.qt.widgets.image_widget import ImageWidget as GlueImageWidget
from glue.plugins.pv_slicer import PVSliceWidget, PVSlicerTool as GluePVSlicerTool
from glue.qt.qtutil import data_wizard
from astropy.io import fits
class PVSlicer(Application, QMainWindow):
"""
A proof-of-concept position-velocity slicer using glue
"""
def __init__(self, data_collection=None, session=None):
QMainWindow.__init__(self)
Application.__init__(self,
data_collection=data_collection,
session=session)
self.app = get_qapp()
self.ui = loadUi('slicer5.ui', None)
self.setCentralWidget(self.ui)
self.resize(1200, 800)
box1 = QStackedWidget()
box2 = QStackedWidget()
class PVSlicerTool(GluePVSlicerTool):
def _extract_pv_slice(self, mode):
super(PVSlicerTool, self)._extract_pv_slice(mode)
box2.setCurrentIndex(1)
class ImageWidget(GlueImageWidget):
def _setup_tools(self):
self._tools = [PVSlicerTool(self)]
self.box1 = box1
self.box2 = box2
self.image = ImageWidget(session=self._session)
self.slice = PVSliceWidget(image_widget=self.image)
for tool in self.image._tools:
if isinstance(tool, PVSlicerTool):
tool._slice_widget = self.slice
self.dummy1 = QWidget()
self.dummy2 = QWidget()
self.box1.addWidget(self.dummy1)
self.box1.addWidget(self.image)
self.box2.addWidget(self.dummy2)
self.box2.addWidget(self.slice)
self.ui.data_layout.addWidget(self.box1, stretch=1)
self.ui.data_layout.addWidget(self.box2, stretch=1)
self.ui.load_button.clicked.connect(self._load_data)
self.ui.save_button.clicked.connect(self._save_data)
def _save_data(self):
fname, fltr = QFileDialog.getSaveFileName(caption="Select an output filename",
filter='FITS mask (*.fits);; Fits mask (*.fits)')
fname = str(fname)
if not fname:
return
# TODO: need glue to save WCS
pv_slice = self.slice._im_array
fits.writeto(fname, pv_slice, clobber=True)
def _load_data(self):
for data in list(self.data_collection):
self.data_collection.remove(data)
data = data_wizard()
if not data:
return
self.add_datasets(self.data_collection, data)
self.image.add_data(self.data_collection[0])
self.box1.setCurrentIndex(1)
self.ui.top_bar.insertWidget(1,self.image.ui.slice._slices[0]._ui_slider)
def start(self):
"""
Show the GUI and start the application.
"""
self.show()
self.raise_() # bring window to front
return self.app.exec_()
exec_ = start
# TODO: the following are needed to run, but don't do anything useful. Make
# it so that they are not required.
def _load_settings(self):
pass
if __name__ == "__main__":
ga = PVSlicer()
ga.start()