Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions simulariumio/cytosim/cytosim_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,6 @@ def _parse_objects(
used_unique_IDs: List[int],
overall_line: int,
total_lines: int,
scale_factor: float = None,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just curious: what's deciding the scale_factor should be a float or not

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So scale_factor is an optional input parameter that the user may or may not provide when setting up their CytosimData object. Then, in TrajectoryConverter.scale_agent_data(), which I didn't change in this PR, if scale_factor is None, we generate a scale factor to get the data to look decent in the viewer (so like not be so tiny you can't see anything or so huge that it's out of frame).

) -> Tuple[Dict[str, Any], List[int], int]:
"""
Parse a Cytosim output file containing objects
Expand Down Expand Up @@ -274,12 +273,9 @@ def _parse_objects(
)
result.n_agents[time_index] += 1
self.check_report_progress(overall_line / total_lines)
result, scale_factor = TrajectoryConverter.scale_agent_data(
result, scale_factor
)
result = TrajectoryConverter.center_fiber_positions(result)
result.n_timesteps = time_index + 1
return (result, used_unique_IDs, overall_line, scale_factor)
return (result, used_unique_IDs, overall_line)

def _read(self, input_data: CytosimData) -> TrajectoryData:
"""
Expand Down Expand Up @@ -310,18 +306,23 @@ def _read(self, input_data: CytosimData) -> TrajectoryData:
uids = []
for object_type in input_data.object_info:
try:
(agent_data, uids, overall_line, scale_factor) = self._parse_objects(
(agent_data, uids, overall_line) = self._parse_objects(
object_type,
cytosim_data[object_type],
input_data.object_info[object_type],
agent_data,
uids,
overall_line,
total_lines,
input_data.meta_data.scale_factor,
)
except Exception as e:
raise InputDataError(f"Error reading input cytosim data: {e}")

# scale agent data
agent_data, scale_factor = TrajectoryConverter.scale_agent_data(
agent_data, input_data.meta_data.scale_factor
)

# get display data (geometry and color)
for object_type in input_data.object_info:
for tid in input_data.object_info[object_type].display_data:
Expand Down
127 changes: 126 additions & 1 deletion simulariumio/tests/converters/test_cytosim_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ def test_box_size_provided(box_size, expected_box_size):

# value of automatically generated scale factor, so that position
# data fits within VIEWER_DIMENSION_RANGE
range = 0.400052 - -0.001
range = 0.00808633 - -0.39575567
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

curious why these changed? they used to be much cleaner looking numbers...is this a result of the bugfix?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure how I came up with the other numbers previously, but the new ones are the actual min / max numbers that define the range. I just noticed this as I was testing, since I was also in the weeds on testing the autoscaling

auto_scale_factor = VIEWER_DIMENSION_RANGE.MIN / range
name_0 = "fiber"
radius_0 = 0.001
Expand Down Expand Up @@ -292,8 +292,12 @@ def test_agent_ids():
assert JsonWriter._check_agent_ids_are_unique_per_frame(results_display_data)


scale_factor_aster = 10
# test data extraction from aster_pull3D example
aster_pull3D_objects = CytosimData(
meta_data=MetaData(
scale_factor=scale_factor_aster
),
object_info={
"fibers": CytosimObjectInfo(
cytosim_file=InputFileData(
Expand Down Expand Up @@ -346,6 +350,127 @@ def test_parse_dimensions():
assert dimension_data.max_subpoints == 18


converter_aster = CytosimConverter(aster_pull3D_objects)
results_aster = JsonWriter.format_trajectory_data(converter_aster._data)


@pytest.mark.parametrize(
"asterData, expected_asterData",
[
(
results_aster["spatialData"]["bundleData"][0]["data"][0:49],
[
VIZ_TYPE.FIBER, # agent 1
1.0, # id
0.0, # type
0.24166 * scale_factor_aster,
0.50934 * scale_factor_aster,
0.22896 * scale_factor_aster,
0.0,
0.0,
0.0,
1.0 * scale_factor_aster,
15.0,
0.12764 * scale_factor_aster,
-0.14133999999999997 * scale_factor_aster,
-0.061160000000000006 * scale_factor_aster,
0.06384 * scale_factor_aster,
-0.07064000000000001 * scale_factor_aster,
-0.03056000000000001 * scale_factor_aster,
4.000000000000669e-05 * scale_factor_aster,
-4.000000000000114e-05 * scale_factor_aster,
4.0000000000005316e-05 * scale_factor_aster,
-0.06385999999999999 * scale_factor_aster,
0.07065999999999997 * scale_factor_aster,
0.030540000000000005 * scale_factor_aster,
-0.12766000000000002 * scale_factor_aster,
0.14135999999999999 * scale_factor_aster,
0.061140000000000014 * scale_factor_aster,
VIZ_TYPE.FIBER, # agent 2
2.0,
0.0,
0.3733 * scale_factor_aster,
0.2226 * scale_factor_aster,
0.2044 * scale_factor_aster,
0.0,
0.0,
0.0,
1.0 * scale_factor_aster,
12.0,
-0.00399999999999999 * scale_factor_aster,
0.1454 * scale_factor_aster,
-0.036599999999999994 * scale_factor_aster,
-0.0013000000000000095 * scale_factor_aster,
0.048499999999999995 * scale_factor_aster,
-0.012199999999999989 * scale_factor_aster,
0.0012999999999999817 * scale_factor_aster,
-0.04850000000000001 * scale_factor_aster,
0.012199999999999989 * scale_factor_aster,
0.004000000000000017 * scale_factor_aster,
-0.1454 * scale_factor_aster,
0.036599999999999994 * scale_factor_aster,
],
),
(
results_aster["spatialData"]["bundleData"][1]["data"][0:49],
[
VIZ_TYPE.FIBER,
1.0,
0.0,
0.26803333333333335 * scale_factor_aster,
0.48285 * scale_factor_aster,
0.010500000000000002 * scale_factor_aster,
0.0,
0.0,
0.0,
1.0 * scale_factor_aster,
18.0,
0.17746666666666666 * scale_factor_aster,
-0.14315 * scale_factor_aster,
0.0781 * scale_factor_aster,
0.09826666666666667 * scale_factor_aster,
-0.10015000000000002 * scale_factor_aster,
0.034600000000000006 * scale_factor_aster,
0.02156666666666669 * scale_factor_aster,
-0.05004999999999998 * scale_factor_aster,
-0.005500000000000001 * scale_factor_aster,
-0.04973333333333333 * scale_factor_aster,
0.013249999999999984 * scale_factor_aster,
-0.035699999999999996 * scale_factor_aster,
-0.10803333333333334 * scale_factor_aster,
0.09375 * scale_factor_aster,
-0.046299999999999994 * scale_factor_aster,
-0.13953333333333334 * scale_factor_aster,
0.18635000000000002 * scale_factor_aster,
-0.0252 * scale_factor_aster,
VIZ_TYPE.FIBER,
2.0,
0.0,
0.4225666666666667 * scale_factor_aster,
0.23976666666666668 * scale_factor_aster,
0.07003333333333334 * scale_factor_aster,
0.0,
0.0,
0.0,
1.0 * scale_factor_aster,
9.0,
0.019733333333333342 * scale_factor_aster,
0.09583333333333334 * scale_factor_aster,
0.02036666666666666 * scale_factor_aster,
-0.0023666666666666636 * scale_factor_aster,
0.0006333333333333236 * scale_factor_aster,
-0.0008333333333333328 * scale_factor_aster,
-0.01736666666666668 * scale_factor_aster,
-0.09646666666666666 * scale_factor_aster,
-0.01953333333333333 * scale_factor_aster,
],
),
],
)
def test_aster_data(asterData, expected_asterData):
assert np.isclose(expected_asterData, asterData).all()


def test_input_file_error():
# throws an error when the file is the right type, but is malformed
malformed_data = CytosimData(
Expand Down
Loading