Masking entities in python
-
Hello Sim4Life community,
I have problems changing the mask setting using the python API. I want to export data where the background is masked away. If I do it interactively in Sim4Life and choose 'to Python' the masking part of the code (setting entities to True/False) seems to be missing. I think I have to use the 'SetMaterial' function in the Analysis.Core.FieldMaskingFilter. I just can't figure out what input type it wants for the materials.
Any help would be wonderful. This is my code:
import numpy
import s4l_v1.analysis as analysis
import s4l_v1.document as document
import s4l_v1.model as model
import s4l_v1.units as units
from s4l_v1 import ReleaseVersion
from s4l_v1 import Unittry:
# Define the version to use for default values
ReleaseVersion.set_active(ReleaseVersion.version6_2)size = numpy.linspace(1,34,34) for k in size: # Creating the analysis pipeline # Adding a new SimulationExtractor simulation = document.AllSimulations["Simulation " + str(k)] simulation_extractor = simulation.Results() # Adding a new EmSensorExtractor em_sensor_extractor = simulation_extractor["Overall Field"] em_sensor_extractor.FrequencySettings.ExtractedFrequency = u"All" em_sensor_extractor.SurfaceCurrent.SurfaceResolution = 0.001, units.Meters document.AllAlgorithms.Add(em_sensor_extractor) # Adding a new FieldMaskingFilter inputs = [em_sensor_extractor.Outputs["EM E(x,y,z,f0)"]] field_masking_filter = analysis.core.FieldMaskingFilter(inputs=inputs) field_masking_filter.UpdateAttributes() document.AllAlgorithms.Add(field_masking_filter) # Adding a new MatlabExporter inputs = [field_masking_filter.Outputs["EM E(x,y,z,f0)"]] matlab_exporter = analysis.exporters.MatlabExporter(inputs=inputs) matlab_exporter.FileName = u"[some path]"+str(k)+".mat" matlab_exporter.UpdateAttributes() matlab_exporter.Update() document.AllAlgorithms.Add(matlab_exporter)except Exception as exc:
import traceback
traceback.print_exc(exc)
# Reset active version to default
ReleaseVersion.reset()
raise(exc)Best,
Frodi -
Hello Sim4Life community,
I have problems changing the mask setting using the python API. I want to export data where the background is masked away. If I do it interactively in Sim4Life and choose 'to Python' the masking part of the code (setting entities to True/False) seems to be missing. I think I have to use the 'SetMaterial' function in the Analysis.Core.FieldMaskingFilter. I just can't figure out what input type it wants for the materials.
Any help would be wonderful. This is my code:
import numpy
import s4l_v1.analysis as analysis
import s4l_v1.document as document
import s4l_v1.model as model
import s4l_v1.units as units
from s4l_v1 import ReleaseVersion
from s4l_v1 import Unittry:
# Define the version to use for default values
ReleaseVersion.set_active(ReleaseVersion.version6_2)size = numpy.linspace(1,34,34) for k in size: # Creating the analysis pipeline # Adding a new SimulationExtractor simulation = document.AllSimulations["Simulation " + str(k)] simulation_extractor = simulation.Results() # Adding a new EmSensorExtractor em_sensor_extractor = simulation_extractor["Overall Field"] em_sensor_extractor.FrequencySettings.ExtractedFrequency = u"All" em_sensor_extractor.SurfaceCurrent.SurfaceResolution = 0.001, units.Meters document.AllAlgorithms.Add(em_sensor_extractor) # Adding a new FieldMaskingFilter inputs = [em_sensor_extractor.Outputs["EM E(x,y,z,f0)"]] field_masking_filter = analysis.core.FieldMaskingFilter(inputs=inputs) field_masking_filter.UpdateAttributes() document.AllAlgorithms.Add(field_masking_filter) # Adding a new MatlabExporter inputs = [field_masking_filter.Outputs["EM E(x,y,z,f0)"]] matlab_exporter = analysis.exporters.MatlabExporter(inputs=inputs) matlab_exporter.FileName = u"[some path]"+str(k)+".mat" matlab_exporter.UpdateAttributes() matlab_exporter.Update() document.AllAlgorithms.Add(matlab_exporter)except Exception as exc:
import traceback
traceback.print_exc(exc)
# Reset active version to default
ReleaseVersion.reset()
raise(exc)Best,
Frodi@frodi
I have a similar problem too.
You may see my workaround in the post entitled as: ‘Exporting Simulation Results for Specific Tissues’.If you have a limited number of tissues, you may use my workaround. However, if the number of tissues are changing, then we need a different solution.
-
Here is an example how you can change the mask programmatically, for materials that where already voxeled in the simulation:
inputs = [em_sensor_extractor.Outputs["EM E(x,y,z,f0)"]] field_masking_filter = analysis.core.FieldMaskingFilter(inputs=inputs) # - clear mask field_masking_filter.SetAllMaterials(False) # - add ventricles to mask materials = field_masking_filter.VoxeledMaterials()() for m in materials: if "Ventricle_lumen_left" in m.Name or "Ventricle_lumen_right" in m.Name: field_masking_filter.SetMaterial(m.ID, True) field_masking_filter.Update()And here is an example of how you can use entities from the modeler:
inputs = [em_sensor_extractor.Outputs["EM E(x,y,z,f0)"]] field_masking_filter = analysis.core.FieldMaskingFilter(inputs=inputs) # somehow select certain entities entities = s4l.model.EntityList() selection = [e for e in entities if "Cerebellum" in e.Name] masking_filter.SetEntities(selection) # expects List[Entity] masking_filter.Update(0) -
Here is an example how you can change the mask programmatically, for materials that where already voxeled in the simulation:
inputs = [em_sensor_extractor.Outputs["EM E(x,y,z,f0)"]] field_masking_filter = analysis.core.FieldMaskingFilter(inputs=inputs) # - clear mask field_masking_filter.SetAllMaterials(False) # - add ventricles to mask materials = field_masking_filter.VoxeledMaterials()() for m in materials: if "Ventricle_lumen_left" in m.Name or "Ventricle_lumen_right" in m.Name: field_masking_filter.SetMaterial(m.ID, True) field_masking_filter.Update()And here is an example of how you can use entities from the modeler:
inputs = [em_sensor_extractor.Outputs["EM E(x,y,z,f0)"]] field_masking_filter = analysis.core.FieldMaskingFilter(inputs=inputs) # somehow select certain entities entities = s4l.model.EntityList() selection = [e for e in entities if "Cerebellum" in e.Name] masking_filter.SetEntities(selection) # expects List[Entity] masking_filter.Update(0)thank you for posting the code here, however could you please specify what should be the J_port in
masking_filter.SetInputConnection(0, J_port)line of your code?
Further in console, I got warning that this feature is DEPRECATED and it is recommended to use Inputs[key].Connect() however when I try to use
masking_filter.Inputs[inputs].Connect()I receive error that there is no attribute Connect()
Spuky
-
@Spuky sorry, I guess the legacy code was confusing:
masking_filter = s4l.analysis.core.FieldMaskingFilter() masking_filter.SetInputConnection(0, J_port)I edited the original answer to use the current API. The J_port was the output port for the
J(x,y,z,f0)field. -
@Spuky sorry, I guess the legacy code was confusing:
masking_filter = s4l.analysis.core.FieldMaskingFilter() masking_filter.SetInputConnection(0, J_port)I edited the original answer to use the current API. The J_port was the output port for the
J(x,y,z,f0)field.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login