============
Pipeline
============
.. role:: raw-html(raw)
:format: html
:raw-html:`
Pipeline
`
**Overview**
A *pipeline* is a series of steps of CARS 3D reconstruction framework.
It generates a new product (example: DSM) from another product (example: sensors) .
It is composed of:
* an pipeline factory that register all pipelines (including plugins)
* an abstract pipeline template
* Some subclass pipelines (surface_modeling, tie_points, merging, formatting, etc)
A pipeline use a global orchestrator to manage all its applications and datasets.
A series of applications are chained to process the data from input to output.
**Example**
Let's take an example of `tie_points` pipeline to describe the main steps:
First, we can notice that `tie_points` derives from `PipelineTemplate` and is registered with the decorator:
.. sourcecode:: python
@Pipeline.register(
"tie_points",
)
class TiePointsPipeline(PipelineTemplate):
Then, pipeline name is defined in a subclass register, by is `short_name`, of `tie_points` pipeline.
In the `init` function, the pipeline is instantiated, with all the checks applied on the configuration file:
.. sourcecode:: python
def __init__(self, conf, config_dir=None):
# Used conf
self.used_conf = {}
# Transform relative path to absolute path
if config_dir is not None:
config_dir = os.path.abspath(config_dir)
# Check global conf
self.check_global_schema(conf)
...
In the `run` function, the pipeline is executed, with all its applications processed in a row:
An orchestrator is instantiated at the beginning of the pipeline, and given to each application.
.. sourcecode:: python
def run(self, log_dir=None, disp_range_grid=None):
"""
Run pipeline
"""
...
with orchestrator.Orchestrator(
orchestrator_conf=self.used_conf[ORCHESTRATOR],
out_dir=self.out_dir,
log_dir=log_dir,
out_yaml_path=os.path.join(
self.out_dir,
out_cst.INFO_FILENAME,
),
) as cars_orchestrator:
# Run applications