source: sasview/src/sas/sasgui/perspectives/file_converter/converter_panel.py @ ff790b3

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since ff790b3 was ff790b3, checked in by lewis, 8 years ago

Check that imported data files only have 1 column

  • Property mode set to 100644
File size: 5.6 KB
Line 
1"""
2This module provides a GUI for the file converter
3"""
4
5import wx
6import sys
7import numpy as np
8from wx.lib.scrolledpanel import ScrolledPanel
9from sas.sasgui.guiframe.panel_base import PanelBase
10from sas.sasgui.perspectives.calculator import calculator_widgets as widget
11from sas.sasgui.guiframe.events import StatusEvent
12from sas.sasgui.guiframe.dataFitting import Data1D
13from sas.sascalc.dataloader.readers.cansas_reader import Reader as CansasReader
14
15# Panel size
16if sys.platform.count("win32") > 0:
17    PANEL_TOP = 0
18    _STATICBOX_WIDTH = 410
19    _BOX_WIDTH = 200
20    PANEL_SIZE = 460
21    FONT_VARIANT = 0
22else:
23    PANEL_TOP = 60
24    _STATICBOX_WIDTH = 430
25    _BOX_WIDTH = 200
26    PANEL_SIZE = 480
27    FONT_VARIANT = 1
28
29class ConverterPanel(ScrolledPanel, PanelBase):
30
31    def __init__(self, parent, base=None, *args, **kwargs):
32        ScrolledPanel.__init__(self, parent, *args, **kwargs)
33        PanelBase.__init__(self)
34        self.SetupScrolling()
35        self.SetWindowVariant(variant=FONT_VARIANT)
36
37        self.base = base
38        self.parent = parent
39
40        self.q_input = None
41        self.iq_input = None
42        self.output = None
43
44        self._do_layout()
45        self.SetAutoLayout(True)
46        self.Layout()
47
48    def convert_to_cansas(self, data, filename):
49        reader = CansasReader()
50        reader.write(filename, data)
51
52    def extract_data(self, filename):
53        data = np.loadtxt(filename, dtype=str)
54
55        if len(data.shape) != 1:
56            msg = "Error reading {}: Only one column of data is allowed"
57            raise Exception(msg.format(filename.split('\\')[-1]))
58
59        is_float = True
60        try:
61            float(data[0])
62        except:
63            is_float = False
64
65        if not is_float:
66            end_char = data[0][-1]
67            # If lines end with comma or semi-colon, trim the last character
68            if end_char == ',' or end_char == ';':
69                data = map(lambda s: s[0:-1], data)
70            else:
71                msg = ("Error reading {}: Lines must end with a digit, comma "
72                    "or semi-colon").format(filename.split('\\')[-1])
73                raise Exception(msg)
74
75        return np.array(data, dtype=np.float32)
76
77    def on_convert(self, event):
78        try:
79            qdata = self.extract_data(self.q_input.GetPath())
80            iqdata = self.extract_data(self.iq_input.GetPath())
81        except Exception as ex:
82            msg = str(ex)
83            wx.PostEvent(self.parent.manager.parent,
84                StatusEvent(status=msg, info='error'))
85            return
86
87        data = Data1D(x=qdata, y=iqdata)
88        self.convert_to_cansas(data, self.output.GetPath())
89        wx.PostEvent(self.parent.manager.parent,
90            StatusEvent(status="Conversion completed."))
91
92    def _do_layout(self):
93        vbox = wx.GridBagSizer(wx.VERTICAL)
94
95        instructions = ("Select the 1 column ASCII files containing the Q Axis"
96            "and Intensity data, chose where to save the converted file, then "
97            "click Convert to convert them to CanSAS XML format")
98        instruction_label = wx.StaticText(self, -1, instructions,
99            size=(_STATICBOX_WIDTH+40, -1))
100        instruction_label.Wrap(_STATICBOX_WIDTH+40)
101        vbox.Add(instruction_label, (0,0), (1,1), wx.TOP | wx.LEFT | wx.RIGHT, 5)
102
103        section = wx.StaticBox(self, -1)
104        section_sizer = wx.StaticBoxSizer(section, wx.VERTICAL)
105        section_sizer.SetMinSize((_STATICBOX_WIDTH, -1))
106
107        input_grid = wx.GridBagSizer(5, 5)
108
109        q_label = wx.StaticText(self, -1, "Q Axis: ")
110        input_grid.Add(q_label, (0,0), (1,1), wx.ALIGN_CENTER_VERTICAL, 5)
111
112        self.q_input = wx.FilePickerCtrl(self, -1,
113            size=(_STATICBOX_WIDTH-80, -1),
114            message="Chose the Q Axis data file.")
115        input_grid.Add(self.q_input, (0,1), (1,1), wx.ALL, 5)
116
117        iq_label = wx.StaticText(self, -1, "Intensity Data: ")
118        input_grid.Add(iq_label, (1,0), (1,1), wx.ALIGN_CENTER_VERTICAL, 5)
119
120        self.iq_input = wx.FilePickerCtrl(self, -1,
121            size=(_STATICBOX_WIDTH-80, -1),
122            message="Chose the Intensity data file.")
123        input_grid.Add(self.iq_input, (1,1), (1,1), wx.ALL, 5)
124
125        output_label = wx.StaticText(self, -1, "Output File: ")
126        input_grid.Add(output_label, (2,0), (1,1), wx.ALIGN_CENTER_VERTICAL, 5)
127
128        self.output = wx.FilePickerCtrl(self, -1,
129            size=(_STATICBOX_WIDTH-80, -1),
130            message="Chose the Intensity data file.",
131            style=wx.FLP_SAVE | wx.FLP_OVERWRITE_PROMPT | wx.FLP_USE_TEXTCTRL,
132            wildcard="*.xml")
133        input_grid.Add(self.output, (2,1), (1,1), wx.ALL, 5)
134
135        convert_btn = wx.Button(self, -1, "Convert")
136        input_grid.Add(convert_btn, (3,0), (1,1), wx.ALL, 5)
137        convert_btn.Bind(wx.EVT_BUTTON, self.on_convert)
138
139        section_sizer.Add(input_grid)
140
141        vbox.Add(section_sizer, (1,0), (1,1), wx.ALL, 5)
142
143        vbox.Fit(self)
144        self.SetSizer(vbox)
145
146class ConverterWindow(widget.CHILD_FRAME):
147
148    def __init__(self, parent=None, title='File Converter', base=None,
149        manager=None, size=(PANEL_SIZE * 1.05, PANEL_SIZE / 1.55),
150        *args, **kwargs):
151        kwargs['title'] = title
152        kwargs['size'] = size
153        widget.CHILD_FRAME.__init__(self, parent, *args, **kwargs)
154
155        self.manager = manager
156        self.panel = ConverterPanel(self, base=None)
157        self.Bind(wx.EVT_CLOSE, self.on_close)
158        self.SetPosition((wx.LEFT, PANEL_TOP))
159        self.Show(True)
160
161    def on_close(self, event):
162        if self.manager is not None:
163            self.manager.converter_frame = None
164        self.Destroy()
Note: See TracBrowser for help on using the repository browser.