Coverage for /Users/Newville/Codes/xraylarch/larch/wxlib/athena_importer.py: 21%
91 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-09 10:08 -0600
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-09 10:08 -0600
1#!/usr/bin/env python
2"""
3Athena Project Importer
4"""
5import os
6import numpy as np
7np.seterr(all='ignore')
9import wx
11import larch
12from larch import Group
13from larch.io import read_athena
14# from .colors import COLORS, set_color
16from wxutils import (SimpleText, Button, Choice, FileCheckList,
17 FileDropTarget, pack, Check, MenuItem, SetTip, Popup,
18 CEN, LEFT, FRAMESTYLE, Font, COLORS, set_color)
20from wxmplot import PlotPanel
22CEN |= wx.ALL
24class AthenaImporter(wx.Frame) :
25 """Import Athena File"""
26 def __init__(self, parent, controller=None, filename=None, read_ok_cb=None,
27 size=(725, 450)):
28 self.parent = parent
29 self.filename = filename
30 self.controller = controller
31 self.read_ok_cb = read_ok_cb
33 wx.Frame.__init__(self, parent, -1, size=size, style=FRAMESTYLE)
34 splitter = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE)
35 splitter.SetMinimumPaneSize(200)
37 leftpanel = wx.Panel(splitter)
38 ltop = wx.Panel(leftpanel)
40 sel_none = Button(ltop, 'Select None', size=(100, 30), action=self.onSelNone)
41 sel_all = Button(ltop, 'Select All', size=(100, 30), action=self.onSelAll)
42 sel_imp = Button(ltop, 'Import Selected Groups', size=(200, 30), action=self.onOK)
44 self.select_imported = sel_imp
45 self.grouplist = FileCheckList(leftpanel, select_action=self.onShowGroup)
46 set_color(self.grouplist, 'list_fg', bg='list_bg')
48 tsizer = wx.GridBagSizer(2, 2)
49 tsizer.Add(sel_all, (0, 0), (1, 1), LEFT, 0)
50 tsizer.Add(sel_none, (0, 1), (1, 1), LEFT, 0)
51 tsizer.Add(sel_imp, (1, 0), (1, 2), LEFT, 0)
53 pack(ltop, tsizer)
55 sizer = wx.BoxSizer(wx.VERTICAL)
56 sizer.Add(ltop, 0, LEFT|wx.GROW, 1)
57 sizer.Add(self.grouplist, 1, LEFT|wx.GROW|wx.ALL, 1)
58 pack(leftpanel, sizer)
60 # right hand side
61 rightpanel = wx.Panel(splitter)
63 self.SetTitle("Reading Athena Project '%s'" % self.filename)
64 self.title = SimpleText(rightpanel, self.filename, font=Font(13),
65 colour=COLORS['title'], style=LEFT)
67 self.plotpanel = PlotPanel(rightpanel, messenger=self.plot_messages)
68 plotconf = self.controller.get_config('plot')
69 self.plotpanel.conf.set_theme(plotconf['theme'])
70 self.plotpanel.conf.enable_grid(plotconf['show_grid'])
72 sizer = wx.BoxSizer(wx.VERTICAL)
73 sizer.Add(self.title, 0, LEFT, 2)
74 sizer.Add(self.plotpanel, 0, LEFT, 2)
75 pack(rightpanel, sizer)
77 splitter.SplitVertically(leftpanel, rightpanel, 1)
79 self.statusbar = self.CreateStatusBar(2, 0)
80 self.statusbar.SetStatusWidths([-3, -1])
81 statusbar_fields = [self.filename, ""]
82 for i in range(len(statusbar_fields)):
83 self.statusbar.SetStatusText(statusbar_fields[i], i)
85 self.a_project = read_athena(self.filename, do_bkg=False, do_fft=False)
86 self.allgroups = {}
87 for sname, grp in self.a_project._athena_groups.items():
88 if hasattr(grp, 'energy') and hasattr(grp, 'mu'):
89 label = getattr(grp, 'label', sname)
90 try:
91 self.allgroups[label] = sname
92 self.grouplist.Append(label)
93 except:
94 print(' ? ', sname, label, item)
95 self.grouplist.SetCheckedStrings(list(self.allgroups.keys()))
96 self.Show()
97 self.Raise()
99 def plot_messages(self, msg, panel=1):
100 self.SetStatusText(msg, panel)
102 def onOK(self, event=None):
103 """generate script to import groups"""
104 namelist = [self.allgroups[n] for n in self.grouplist.GetCheckedStrings()]
105 if len(namelist) == 0:
107 cancel = Popup(self, """No data groups selected.
108 Cancel import from this project?""", 'Cancel Import?',
109 style=wx.YES_NO)
110 if wx.ID_YES == cancel:
111 self.Destroy()
112 else:
113 return
115 if self.read_ok_cb is not None:
116 self.read_ok_cb(self.filename, namelist)
117 self.Destroy()
119 def onCancel(self, event=None):
120 self.Destroy()
122 def onSelAll(self, event=None):
123 self.grouplist.SetCheckedStrings(list(self.allgroups.keys()))
125 def onSelNone(self, event=None):
126 self.grouplist.SetCheckedStrings([])
128 def onShowGroup(self, event=None):
129 """column selections changed calc xdat and ydat"""
130 label = event.GetString()
131 gname = self.allgroups[label]
132 grp = getattr(self.a_project, gname)
133 if hasattr(grp, 'energy') and hasattr(grp, 'mu'):
134 self.plotpanel.plot(grp.energy, grp.mu,
135 xlabel='Energy', ylabel='mu',title=label)