Skip to content

Commit

Permalink
feat(data): data revisions
Browse files Browse the repository at this point in the history
- organize data in revisions
- add data selector to gui
  • Loading branch information
nritsche committed Jul 17, 2020
1 parent ecf695d commit c842391
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 29 deletions.
75 changes: 56 additions & 19 deletions bondia/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,25 @@ def _finalise_config(self):
def index(self):
return self._index

def days(self, revision: str):
return list(self._index[revision].keys())

@property
def revisions(self):
return list(self._index.keys())

@property
def latest_revision(self):
"""
Get latest revision.
Note
----
This assumes the revisions being numbered like "rev_00", "rev_01", "rev_17", where their
order is the same as the revision strings sorted by python string comparison.
"""
return sorted(self.revisions)[-1]

def index_files(self, dirs):
"""
(Re)index delay spectrum files.
Expand All @@ -44,29 +63,47 @@ def index_files(self, dirs):
"""
if isinstance(dirs, os.PathLike):
dirs = [dirs]
files = []

new_lsd = {}
for d in dirs:
files += sorted(glob.glob(os.path.join(d, "delayspectrum_lsd_*.h5")))
logger.debug("Found files: {}".format(files))
rev_dirs = glob.glob(os.path.join(d, "rev_*"))
for rev_dir in rev_dirs:
if not os.path.isdir(rev_dir):
logger.debug(
f"Skipping {rev_dir} because it's not a (revision) directory."
)
continue
rev = os.path.split(rev_dir)[-1]
files = sorted(
glob.glob(os.path.join(rev_dir, "*/delayspectrum_lsd_*.h5"))
)
logger.debug(f"Found {rev} files: {files}")

lsd = np.array(
[int(os.path.splitext(os.path.basename(ff))[0][-4:]) for ff in files]
)
new_lsd = []
if rev not in self._index:
self._index[rev] = {}
new_lsd[rev] = []

for cc, filename in zip(lsd, files):
if cc not in self._index:
cc = Day.from_lsd(cc)
logger.info(f"Found new data for day {cc}.")
self._index[cc] = filename
new_lsd.append(cc)
lsd = np.array(
[
int(os.path.splitext(os.path.basename(ff))[0][-4:])
for ff in files
]
)

for cc, filename in zip(lsd, files):
if cc not in self._index:
cc = Day.from_lsd(cc)
self._index[rev][cc] = filename
new_lsd[rev].append(cc)
logger.info(f"Found new {rev} data for days {new_lsd[rev]}.")
return new_lsd

def load_file(self, day: Day):
def load_file(self, revision: str, day: Day):
"""Load the delay spectrum of one day from a file."""
if isinstance(self._index[day], containers.DelaySpectrum):
return self._index[day]
logger.info(f"Loading day {day}.")
self._index[day] = containers.DelaySpectrum.from_file(self._index[day])
return self._index[day]
if isinstance(self._index[revision][day], containers.DelaySpectrum):
return self._index[revision][day]
logger.info(f"Loading revision {revision} data for day {day}.")
self._index[revision][day] = containers.DelaySpectrum.from_file(
self._index[revision][day]
)
return self._index[revision][day]
28 changes: 22 additions & 6 deletions bondia/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,35 @@ def populate_template(self, template):
delay = DelaySpectrumPlot(self._data)
self._plot[delay.id] = delay

# TODO: keep available days outside plot
# Load revision, lsd selectors and set initial values
rev_selector = pn.widgets.Select(
options=list(self._data.revisions),
width=self._width_drawer_widgets,
name="Select Data Revision",
value=self._data.latest_revision,
)
delay.revision = rev_selector.value
day_selector = pn.widgets.Select(
options=list(self._data.index.keys()), width=self._width_drawer_widgets,
options=list(self._data.days(delay.revision)),
width=self._width_drawer_widgets,
name="Select Sidereal Day",
)

# Set initial value
delay.lsd = day_selector.value

# Link selected day to plots
def update_days(day_selector, event):
"""Update days depending on selected revision."""
old_selected_day = day_selector.value
day_selector.options = list(self._data.days(event.new))
new_selected_day = old_selected_day.closest_after(day_selector.options)
day_selector.value = new_selected_day

# Link selected day, revision to plots
rev_selector.link(delay, value="revision")
rev_selector.link(day_selector, callbacks={"value": update_days})
day_selector.link(delay, value="lsd")

# Fill the template with components
components = [("day_selector", day_selector)]
components = [("day_selector", day_selector), ("rev_selector", rev_selector)]

# Fill in the plot selection toggle buttons
for p in self._plot.values():
Expand Down
5 changes: 3 additions & 2 deletions bondia/plot/delayspectrum.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ class DelaySpectrumPlot(param.Parameterized, BondiaPlot):
)
colormap_range = param.Range(default=(0.1, 10000), constant=False)

# Hide lsd selector by setting precedence < 0
# Hide lsd, revision selectors by setting precedence < 0
lsd = param.Selector(precedence=-1)
revision = param.Selector(precedence=-1)

def __init__(self, data, **params):
self.data = data
Expand All @@ -66,7 +67,7 @@ def update_serverside_rendering(self):
"helper_lines",
)
def view(self):
spectrum = self.data.load_file(self.lsd)
spectrum = self.data.load_file(self.revision, self.lsd)
x, y = spectrum.index_map["baseline"].T

# Index map for delay (x-axis)
Expand Down
5 changes: 3 additions & 2 deletions bondia/templates/mwc.html
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@
<div class="appMenu">
<mwc-button disabled outlined="" label="Unvalidated Days (18)"></mwc-button>
<hr>
<div align="center"><p><h4>Select Day</h4></p>
{{ embed(roots.day_selector) }}</div>
<p><h4>Select Data</h4></p>
{{ embed(roots.rev_selector) }}
{{ embed(roots.day_selector) }}
<hr>
<div align="center"><p><h4>Select Plots</h4></p></div>
<div>{{ embed(roots.toggle_delay_spectrum) }}</div>
Expand Down
12 changes: 12 additions & 0 deletions bondia/util/day.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,15 @@ def date(self):

def __repr__(self):
return f"{self.lsd} [{self.date.isoformat()} (PT)]"

def closest_after(self, days):
for day in reversed(days):
if self._lsd >= day.lsd:
return day
return self.closest_before(days)

def closest_before(self, days):
for day in days:
if self._lsd <= day.lsd:
return day
return self.closest_after(days)

0 comments on commit c842391

Please sign in to comment.