Skip to content

Commit

Permalink
Merge pull request #39 from wright-group/topas_read
Browse files Browse the repository at this point in the history
Re-write Topas curve IO
  • Loading branch information
ksunden committed Feb 26, 2019
2 parents 59f5467 + ab9892f commit 6ef069e
Show file tree
Hide file tree
Showing 7 changed files with 217 additions and 164 deletions.
25 changes: 20 additions & 5 deletions attune/curve/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ def __init__(
subcurve=None,
source_setpoints=None,
fmt=None,
**kwargs,
):
"""Create a ``Curve`` object.
Expand Down Expand Up @@ -79,6 +80,8 @@ def __init__(
fmt = ["%.2f"] + ["%.5f"] * len(self.dependents)
self.fmt = fmt
self.interpolate()
for k, v in kwargs.items():
setattr(self, k, v)

def __add__(self, other):
# copy
Expand Down Expand Up @@ -107,7 +110,6 @@ def __add__(self, other):
if wt.units.is_valid_conversion(other[k].units, self[k].units):
other[k].convert(self[k].units)
else:
print(type(other[k].units), type(self[k].units))
raise ValueError(
f"Invalid unit conversion: {other[k].units} -> {self[k].units}"
)
Expand Down Expand Up @@ -135,7 +137,9 @@ def __setitem__(self, key, value):
if value.interpolator is not None:
value.positions = value(self.setpoints[:], self.setpoints.units)
elif len(value) != len(self.setpoints):
raise ValueError(f"Incorrect number of points in dependent: {len(value)} for number of setpoints: {len(self.setpoints)}")
raise ValueError(
f"Incorrect number of points in dependent: {len(value)} for number of setpoints: {len(self.setpoints)}"
)
value.interpolator = self.method(self.setpoints, value)
self.dependents[key] = value

Expand Down Expand Up @@ -321,21 +325,32 @@ def map_setpoints(self, setpoints, units="same"):
for k, v in self.dependents.items():
positions = v(new_setpoints)
new_dependent = Dependent(
positions, k, v.units, v.differential
positions, k, v.units, v.differential, v.index
) # new dependent objects
new_dependents.update({k: new_dependent})
# map source setpoints, subcurves
if self.subcurve:
new_source_setpoints = self.source_setpoints(new_setpoints)
self.source_setpoints = Dependent(
new_source_setpoints, self.source_setpoints.name, self.source_setpoints.units
new_source_setpoints, self.source_setpoints.name, self.source_setpoints.units, index=self.source_setpoints.index
)
# finish
self.setpoints = Setpoints(new_setpoints, self.setpoints.name, self.setpoints.units)
self.dependents = new_dependents
for obj in self.dependents.values():
setattr(self, obj.name, obj)
self.interpolate()

def sort(self):
order = self.setpoints[:].argsort()
self.setpoints[:] = self.setpoints[order]
try:
self.subcurve_setpoints[:] = self.subcurve_setpoints[order]
except (AttributeError, TypeError):
pass # no subcurve setpoints
for d in self.dependents.values():
d[:] = d[order]


def offset_by(self, dependent, amount):
"""Offset a dependent by some ammount.
Expand Down Expand Up @@ -487,7 +502,7 @@ def read(cls, filepath, subcurve=None):
setpoints = Setpoints(arr[0], setpoint_name, units[0])
if subcurve is not None:
kwargs["subcurve"] = subcurve
kwargs["source_setpoints"] = Dependent(setpoints, setpoint_name, units=units[0])
kwargs["source_setpoints"] = Dependent(setpoints[:], setpoint_name, units=units[0])
# finish
curve = cls(setpoints, dependents, **kwargs)
return curve
Expand Down
3 changes: 2 additions & 1 deletion attune/curve/_dependent.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class Setpoints(Variable):
class Dependent(Variable):
"""Container class for dependent arrays."""

def __init__(self, positions, name, units=None, differential=False):
def __init__(self, positions, name, units=None, differential=False, index=None):
"""Create a ``Dependent`` object.
Parameters
Expand All @@ -43,6 +43,7 @@ def __init__(self, positions, name, units=None, differential=False):
super(Dependent, self).__init__(positions, name, units=units)
self.interpolator = None
self.differential = differential
self.index = index

def __call__(self, val, units="same"):
return self.interpolator(val, units)
Loading

0 comments on commit 6ef069e

Please sign in to comment.