Concepts¶
As demonstrated in the Tutorials section, you would mainly define the
synthetization directives in a recipe file called the SynthRecipe. In this section,
we will give an overview of the building blocks of the said recipe file. Subsequently,
we will also describe the plugin mechanism. Plugins are the chosen approach to enable
using self-defined .blend-files in the synthetization process.
Domain Knowledge¶
To use the synthpic2 toolbox, you would have to provide a recipe containing the
specific components and commands for the toolbox to produce synthesized particle images.
This recipe is named as SynthRecipe and should be defined in the form of a
.yaml-file that resides inside a config-directory that can be reached from the
project directory. The recommended directory for the recipes is the ./recipes folder
inside the project directory as stated in the Tutorials section.
As depicted in the Block Definition Diagram (BDD) above, a SynthRecipe is composed
of four building blocks, namely one InitialRunState, one Blueprints, one
ProcessConditions, and last but not least one SynthChain. This definition of a
SynthRecipe can be translated directly into the structure of the recipe.yaml
file.
1initial_runtime_state:
2 <building blocks of InitialRunState>
3
4blueprints:
5 <building blocks of Blueprints>
6
7process_conditions:
8 <building blocks of ProcessConditions>
9
10synth_chain:
11 <building blocks of SynthChain>
The InitialRunState contains the initial conditions as the program starts. In the
following example, the variable time and seed are defined. The variable time
gives the possibility of running dynamic simulation in the future. seed is a number
used to initialize a pseudorandom number generator. With it, we are able to manage the
random states of the particles.
1initial_runtime_state:
2 time: 0.0
3 seed: 42
As of the rest of the building blocks, the Blueprints defines the characteristic of
the particles and the measurement technique as a single element. The
ProcessConditions assigns the attributes of the interactions between the particles
and the measurement technique. The SynthRecipe contains the steps required to set up
the particles to final image rendering. These building blocks will be described in more
details in the following subsections.
Blueprints¶
A synthesized particle image requires three physical entities at its most granular
level: a particle or a swarm of particles, a camera that captures the particle image,
and a medium where the particles and the camera are located. Each of these entities
possesses specific characteristics that directly influence the image, such as the form
of the particle, the surface texture of the particle, the refractive index of the
medium, et cetera. These attributes are defined in the Blueprints.
The following BDD shows the structure of the Blueprints.
The Blueprints consists of at least one MeasurementTechniqueBlueprint and
zero or more ParticleBlueprint. Because one measurement technique is always
required to capture an image, the multiplicity of each blueprint makes sense. The
absence of particles simply means that the resulting image is devoid of particles.
Each of these blueprints is defined from Prototypes. We distinguish three prototypes
in our toolbox: MeasurementTechniquePrototype, MaterialPrototype, and
GeometryPrototype. The CompositingPrototype is a planned feature that might be
implemented in the future.
We provide several Prototypes inside the folder ./prototype_library. Each of the
prototype resides in the corresponding subfolder (./prototype_library/geometries,
./prototype_library/materials, ./prototype_library/measurement_techniques) and
defined as a pair of a .blend-file and a .yaml-file. The .blend-file
is the native file format from Blender and contains the 3D-information of each prototype.
Below is an example of Blueprints taken from secondary_electron_microscopy.yaml
recipe. In this example, one measurement technique blueprint with the name SEM and
one particle blueprint Bead are defined. The SEM blueprint is defined from the
secondary_electron_microscope
(./prototype_library/measurement_techniques/secondary_electron_microscope.blend) as
the measurement technique itself and sem_patchy_silicone
(./prototype_library/materials/sem_patchy_silicone.blend) as the material of the
continuous phase.
1blueprints:
2 measurement_techniques:
3 SEM:
4 measurement_technique_prototype_name: secondary_electron_microscope
5 background_material_prototype_name: sem_patchy_silicone
6 particles:
7 Bead:
8 geometry_prototype_name: sphere
9 material_prototype_name: sem_polystyrene
10 parent: MeasurementVolume
11 number: 600
Similarly, the Bead particle blueprint is defined from the sphere geometry
prototype and sem_polystyrene as its material. Additionally, the attributes
parent and number have to be set for each particle blueprint.
Process Conditions¶
Under the ProcessConditions, we would define the FeatureCriterion, Set, and
FeatureVariability. A FeatureCriterion is a custom criterion to filter out the
elements inside the image. In the example below, the criterion IsBead filter out
blueprints with the name Bead. A Set represents a pool of elements with one or
more criteria. For example, the Beads set is a pool of particles that fulfills the
criteria IsParticle and IsBead. The FeatureVariability defines the
variability that can be applied to the specified set in the SynthChain afterwards.
1process_conditions:
2 feature_criteria:
3 IsBead:
4 _target_: $builtins.ContainsString
5 feature_name: blueprint_name
6 search_string: Bead
7 default_return_value: False
8 sets:
9 Beads:
10 criterion: $IsParticle and $IsBead
11 feature_variabilities:
12 ParticleDimension:
13 feature_name: dimensions
14 variability:
15 _target_: $builtins.UniformDistribution3dHomogeneous
16 location: 5
17 scale: 2
18 ParticleSubdivisions:
19 feature_name: subdivisions
20 variability:
21 _target_: $builtins.Constant
22 value: 1
23 ...
Note that there are built-ins process conditions that can be called in the recipe
directly, such as the feature criterion IsParticle or the set AllParticles.
There are also built-ins feature variabilities used in the example above
(builtins.UniformDistribution3dHomogeneous or builtins.Constant). Please refer
to sec-references for the built-in components.
We also provide the possibility to write your own feature variabilities as python classes as a plugin (see Plugin Mechanism below).
Synth Chain¶
After the Blueprints and the ProcessConditions for the synthesizing process are
defined, the SynthChain would define the instructions for the toolbox to go from an
empty blender scene to a rendered image of particles. These instructions are generally
classified into FeatureGenerationStep and RenderingStep.
The FeatureGenerationStep is in general an instruction that is applied on the
pre-defined Set. For example, the step InvokeBlueprints below adds the particles
in the set AllParticleBlueprints into the blender scene. The
TriggerFeatureUpdate applies the feature variability ParticleDimension to the
set AllParticles.
1synth_chain:
2 feature_generation_steps:
3 - _target_: $builtins.InvokeBlueprints
4 affected_set_name: AllParticleBlueprints
5 - _target_: $builtins.TriggerFeatureUpdate
6 feature_variability_name: ParticleDimension
7 affected_set_name: AllParticles
The second group of the SynthChain, the RenderingStep, contains the instructions
to render the current blender scene into an image. The step RenderParticlesTogether
in the example below would render all particles in the scene. You can also choose the
rendering mode and whether the features of the particles are to be written out (see
sec-references for further rendering modes). To render one particle per image,
you can use the step RenderParticlesIndividually instead.
1synth_chain:
2 rendering_steps:
3 - _target_: $builtins.RenderParticlesTogether
4 rendering_mode: real
5 do_save_features: True
Plugin Mechanism¶
The plugin mechanism is targeted towards advanced users and assumes a certain familiarity with Python, as well as synthPIC2.
Plugins can be used to extend synthPIC2 to provide custom
process_conditions.feature_criteriaprocess_conditions.variabilitiessynth_chain.feature_generation_stepsorsynth_chain.rendering_steps.
Plugins are stored in Python files below the plugin folder. They are structured in packages that can hold multiple plugins each. The official package is an example package that comes with a few examples and can be used as template for your own plugins. The structure of each package has to mirror the structure of the synthpic2.recipe module:
plugins/
mypackagename/
process_conditions/
feature_criteria.py
variabilities.py
synth_chain/
feature_generation_steps.py
rendering_steps.py
Inside each of the py-files, you can implement as many custom classes (i.e. plugins) as you like. It is advisable to base said classes on the base class of the corresponding synthpic2.recipe modules:
synthpic2.recipe.process_conditions.feature_criteria.FeatureCriterionsynthpic2.recipe.process_conditions.variabilities.Variabilitysynthpic2.recipe.process_conditions.feature_generation_steps.FeatureGenerationStepandsynthpic2.recipe.process_conditions.rendering_steps.RenderingStep
or any subclass of these. It is also necessary to decorate your class with:
@attr.s(auto_attribs=True)
Once you implemented a plugin MyPlugin, you can reference it in your recipes using the $plugins. directive, similar to $builtins. (see e.g. Chocolate Beans on Table):
process_conditions:
feature_criteria:
FancyFeature:
feature_name: feature
variability:
_target_: $plugins.mypackagename.MyPlugin