Muscle Fiber Workflow¶
Load the synthetic rectus_femoris dataset, inspect its fiber-direction vector field, and export line glyphs for visualization in ParaView/OpenSim.
In [ ]:
Copied!
import numpy as np
from pyfieldml import datasets
doc = datasets.load_rectus_femoris()
print("Region:", doc.region.name)
import numpy as np
from pyfieldml import datasets
doc = datasets.load_rectus_femoris()
print("Region:", doc.region.name)
Inspect the fiber field¶
In [ ]:
Copied!
fibers = doc.evaluators["fiber_direction"]
fv = fibers.as_ndarray()
print("fiber vectors shape:", fv.shape)
print("norm check:", np.allclose(np.linalg.norm(fv, axis=1), 1.0, atol=1e-6))
print("dominant axis (argmax of |component|):")
print(" axis count:", np.bincount(np.argmax(np.abs(fv), axis=1), minlength=3))
fibers = doc.evaluators["fiber_direction"]
fv = fibers.as_ndarray()
print("fiber vectors shape:", fv.shape)
print("norm check:", np.allclose(np.linalg.norm(fv, axis=1), 1.0, atol=1e-6))
print("dominant axis (argmax of |component|):")
print(" axis count:", np.bincount(np.argmax(np.abs(fv), axis=1), minlength=3))
Export fiber glyphs as VTK¶
export_fiber_lines writes a short line segment at each node along the fiber direction. Open the result in ParaView to see the fiber arrangement.
In [ ]:
Copied!
import tempfile
from pathlib import Path
from pyfieldml.interop.opensim import export_fiber_lines
out_dir = Path(tempfile.mkdtemp(prefix="rectus_"))
out = export_fiber_lines(
doc,
field="fiber_direction",
out_path=out_dir / "fibers.vtu",
length_scale=0.01,
)
print("wrote", out, f"({out.stat().st_size} bytes)")
import tempfile
from pathlib import Path
from pyfieldml.interop.opensim import export_fiber_lines
out_dir = Path(tempfile.mkdtemp(prefix="rectus_"))
out = export_fiber_lines(
doc,
field="fiber_direction",
out_path=out_dir / "fibers.vtu",
length_scale=0.01,
)
print("wrote", out, f"({out.stat().st_size} bytes)")
Licensing note¶
The bundled rectus_femoris dataset is a synthetic spindle shape authored for demonstration (CC0). Real Physiome-project muscle meshes require separate licensing; see the datasets.info('rectus_femoris') metadata.