Skip to content

Commit 5b0ce06

Browse files
authored
Merge pull request #1156 from ToFuProject/Issue1152_showInversionsSynthDiag
Better `show()` and `show_details()` for `inversions` and `synth sig`
2 parents ba662f7 + 5ab9055 commit 5b0ce06

File tree

8 files changed

+342
-27
lines changed

8 files changed

+342
-27
lines changed

tofu/data/_class08_Diagnostic.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from ._class07_Camera import Camera as Previous
1414
from . import _class8_check as _check
1515
from . import _class08_show as _show
16+
from . import _class08_show_synth_sig as _show_synth_sig
1617
from . import _class8_compute as _compute
1718
from . import _class08_get_data as _get_data
1819
from . import _class08_concatenate_data as _concatenate
@@ -52,7 +53,9 @@
5253

5354

5455
class Diagnostic(Previous):
55-
_which_diagnostic = "diagnostic"
56+
57+
_which_diagnostic = 'diagnostic'
58+
_which_synth_sig = 'synth sig'
5659

5760
def add_diagnostic(
5861
self,
@@ -191,12 +194,16 @@ def remove_diagnostic(self, key=None, key_cam=None):
191194
def _get_show_obj(self, which=None):
192195
if which == self._which_diagnostic:
193196
return _show._show
197+
elif which == self._which_synth_sig:
198+
return _show_synth_sig._show
194199
else:
195200
return super()._get_show_obj(which)
196201

197202
def _get_show_details(self, which=None):
198203
if which == self._which_diagnostic:
199204
return _show._show_details
205+
elif which == self._which_synth_sig:
206+
return _show_synth_sig._show_details
200207
else:
201208
return super()._get_show_details(which)
202209

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
Created on Wed Jul 24 09:36:24 2024
4+
5+
@author: dvezinet
6+
"""
7+
8+
9+
#############################################
10+
#############################################
11+
# DEFAULTS
12+
#############################################
13+
14+
15+
_LORDER = [
16+
'camera', 'data', 'diag',
17+
'geom_matrix', 'integrand',
18+
'method', 'res',
19+
]
20+
21+
22+
#############################################
23+
#############################################
24+
# Show
25+
#############################################
26+
27+
28+
def _show(coll=None, which=None, lcol=None, lar=None, show=None):
29+
30+
# ---------------------------
31+
# column names
32+
# ---------------------------
33+
34+
wsynth = coll._which_synth_sig
35+
lcol.append([which] + _LORDER)
36+
37+
# ---------------------------
38+
# list of keys
39+
# ---------------------------
40+
41+
lkey = [
42+
k1 for k1 in coll._dobj.get(which, {}).keys()
43+
if show is None or k1 in show
44+
]
45+
46+
# ---------------------------
47+
# loop on keys
48+
# ---------------------------
49+
50+
lar0 = []
51+
for k0 in lkey:
52+
53+
# initialize with key
54+
arr = [k0]
55+
56+
# dsynth
57+
dsynth = coll.dobj[wsynth][k0]
58+
59+
# loop
60+
for k1 in _LORDER:
61+
62+
# cameras, data
63+
if k1 in ['camera', 'data']:
64+
if dsynth.get(k1) is None:
65+
nn = ''
66+
elif len(dsynth[k1]) <= 3:
67+
nn = str(dsynth[k1])
68+
else:
69+
nn = f'[{dsynth[k1][0]}, ..., {dsynth[k1][-1]}]'
70+
71+
# los
72+
else:
73+
nn = str(dsynth[k1])
74+
75+
arr.append(nn)
76+
77+
lar0.append(arr)
78+
79+
lar.append(lar0)
80+
81+
return lcol, lar
82+
83+
84+
#############################################
85+
#############################################
86+
# Show single diag
87+
#############################################
88+
89+
90+
def _show_details(coll=None, key=None, lcol=None, lar=None, show=None):
91+
92+
# ---------------------------
93+
# get basics
94+
# ---------------------------
95+
96+
wcam = coll._which_cam
97+
wsynth = coll._which_synth_sig
98+
dsynth = coll.dobj[wsynth][key]
99+
100+
# ---------------------------
101+
# column names
102+
# ---------------------------
103+
104+
lcol.append([wcam, 'shape', 'sig', 'shape'] + _LORDER[2:])
105+
106+
# ---------------------------
107+
# data
108+
# ---------------------------
109+
110+
lar0 = []
111+
for ii, kcam in enumerate(dsynth[wcam]):
112+
113+
# camera
114+
arr = [kcam, str(coll.dobj[wcam][kcam]['dgeom']['shape'])]
115+
116+
# data
117+
kdata = dsynth['data'][ii]
118+
arr += [kdata, str(coll.ddata[kdata]['data'].shape)]
119+
120+
for k1 in _LORDER[2:]:
121+
nn = str(dsynth[k1])
122+
arr.append(nn)
123+
124+
# aggregate
125+
lar0.append(arr)
126+
127+
lar.append(lar0)
128+
129+
return lcol, lar

tofu/data/_class10_Inversion.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
# tofu
55
from ._class09_GeometryMatrix import GeometryMatrix as Previous
6+
from . import _class10_show as _show
67
from . import _class10_compute as _compute
78
from . import _class10_plot as _plot
89

@@ -20,7 +21,7 @@ class Inversion(Previous):
2021
"""
2122
The ``Inversion`` class is commonly imported and aliased as the
2223
``tf.data.Collection`` class. The class constructor takes no arguments;
23-
instead, objects, stored in ``coll.dobj``, are added using the following methods:
24+
instead, objects, stored in ``coll.dobj``, are added using methods:
2425
2526
- ``coll.add_aperture('key', **geom)``
2627
- ``coll.add_camera_1d('key', dgeom=dgeom)``
@@ -31,22 +32,15 @@ class Inversion(Previous):
3132
coll.dref -> dict (TODO)
3233
coll.ddata -> dict (TODO)
3334
34-
Once all the apertures and all the cameras have been added to the Collection
35+
Once all the apertures and all cameras have been added to the Collection
3536
instance, one then adds a new object called a diagnostic:
3637
3738
``coll.add_diagnostic('key', doptics=doptics, config=config, compute=True)``
3839
3940
The diagnostic should automatically compute LOS and etendue.
4041
"""
4142

42-
_show_in_summary = "all"
43-
44-
_dshow = dict(Previous._dshow)
45-
_dshow.update(
46-
{
47-
"inversion": [],
48-
}
49-
)
43+
_which_inversion = 'inversions'
5044

5145
# -----------------
5246
# inversions
@@ -126,6 +120,22 @@ def add_inversion(
126120
debug=debug,
127121
)
128122

123+
# -------------------
124+
# show
125+
# -------------------
126+
127+
def _get_show_obj(self, which=None):
128+
if which == self._which_inversion:
129+
return _show._show
130+
else:
131+
return super()._get_show_obj(which)
132+
133+
def _get_show_details(self, which=None):
134+
if which == self._which_inversion:
135+
return _show._show_details
136+
else:
137+
return super()._get_show_details(which)
138+
129139
# -----------------
130140
# synthetic data
131141
# -----------------

tofu/data/_class10_checks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,9 @@ def _compute_check(
120120
)
121121

122122
# key_inv
123+
winv = coll._which_inversion
123124
key = ds._generic_check._obj_key(
124-
d0=coll.dobj.get('inversions', {}),
125+
d0=coll.dobj.get(winv, {}),
125126
short='inv',
126127
key=key,
127128
)

tofu/data/_class10_compute.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,9 @@ def _store(
584584
kretro = f'{keyinv}_retro'
585585

586586
# add inversion
587+
winv = coll._which_inversion
587588
dobj = {
588-
'inversions': {
589+
winv: {
589590
keyinv: {
590591
'retrofit': kretro,
591592
'data_in': key_data,
@@ -606,12 +607,19 @@ def _store(
606607

607608
# adjust for time
608609
if notime is True:
609-
dobj['inversions'][keyinv].update({
610+
dobj[winv][keyinv].update({
610611
'chi2n': chi2n,
611612
'mu': mu,
612613
'reg': regularity,
613614
'niter': niter,
614615
})
616+
else:
617+
dobj[winv][keyinv].update({
618+
'chi2n': f"{keyinv}_chi2n",
619+
'mu': f"{keyinv}_mu",
620+
'reg': f"{keyinv}_regularity",
621+
'niter': f"{keyinv}_niter",
622+
})
615623

616624
# update instance
617625
coll.update(dobj=dobj, dref=dref, ddata=ddata)

tofu/data/_class10_plot.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,8 @@ def _plot_inversion_check(
4444
):
4545

4646
# key
47-
if 'inversions' not in coll.dobj.keys():
48-
msg = 'No inversions available!'
49-
raise Exception(msg)
50-
51-
lk = list(coll.dobj['inversions'].keys())
47+
winv = coll._which_inversion
48+
lk = list(coll.dobj[winv].keys())
5249
keyinv = ds._generic_check._check_var(
5350
key, 'key',
5451
default=None,
@@ -59,9 +56,9 @@ def _plot_inversion_check(
5956
wm = coll._which_mesh
6057
wbs = coll._which_bsplines
6158
wgmat = coll._which_gmat
62-
keymat = coll.dobj['inversions'][keyinv]['matrix']
63-
key_data = coll.dobj['inversions'][keyinv]['data_in']
64-
key_retro = coll.dobj['inversions'][keyinv]['retrofit']
59+
keymat = coll.dobj[winv][keyinv]['matrix']
60+
key_data = coll.dobj[winv][keyinv]['data_in']
61+
key_retro = coll.dobj[winv][keyinv]['retrofit']
6562
keybs = coll.dobj[wgmat][keymat]['bsplines']
6663
key_diag = coll.dobj[wgmat][keymat]['diagnostic']
6764
is2d = coll.dobj['diagnostic'][key_diag]['is2d']
@@ -346,10 +343,10 @@ def _plot_inversion_prepare(
346343
reg = coll.ddata[f'{keyinv}_reg']['data']
347344
niter = coll.ddata[f'{keyinv}_niter']['data']
348345
else:
349-
chi2n = None # coll.dobj['inversions'][keyinv]['chi2n']
350-
mu = None # coll.dobj['inversions'][keyinv]['mu']
351-
reg = None # coll.dobj['inversions'][keyinv]['reg']
352-
niter = None # coll.dobj['inversions'][keyinv]['niter']
346+
chi2n = None # coll.dobj[winv][keyinv]['chi2n']
347+
mu = None # coll.dobj[winv][keyinv]['mu']
348+
reg = None # coll.dobj[winv][keyinv]['reg']
349+
niter = None # coll.dobj[winv][keyinv]['niter']
353350

354351
return (
355352
dlos_n, dref_los,

0 commit comments

Comments
 (0)