diff --git a/setup.cfg b/setup.cfg index f89908b..7a4a190 100644 --- a/setup.cfg +++ b/setup.cfg @@ -28,7 +28,6 @@ package_dir = setup_requires = pyscaffold>=3.1a0,<3.2a0 # Add here dependencies of your project (semicolon/line-separated), e.g. install_requires = - owslib openeo-pg-parser regex requests diff --git a/src/eodc_openeo_bindings/job_writer/basic_writer.py b/src/eodc_openeo_bindings/job_writer/basic_writer.py index fb1f560..9a6847e 100644 --- a/src/eodc_openeo_bindings/job_writer/basic_writer.py +++ b/src/eodc_openeo_bindings/job_writer/basic_writer.py @@ -1,5 +1,5 @@ import os -from typing import Union, Tuple +from typing import List, Union, Tuple from eodc_openeo_bindings.job_writer.job_domain import BasicJobDomain from eodc_openeo_bindings.job_writer.job_writer import JobWriter @@ -9,13 +9,16 @@ class BasicJobWriter(JobWriter): def write_job(self, process_graph_json: Union[str, dict], job_data: str, - process_defs: Union[dict, list, str], output_filepath: str = None): + process_defs: Union[dict, list, str], in_filepaths: List[str], + output_filepath: str = None): return super().write_job(process_graph_json=process_graph_json, job_data=job_data, - process_defs=process_defs, output_filepath=output_filepath) + process_defs=process_defs, in_filepaths=in_filepaths, + output_filepath=output_filepath) def get_domain(self, process_graph_json: Union[str, dict], job_data: str, - process_defs: Union[dict, list, str], output_filepath: str = None): - return BasicJobDomain(process_graph_json, job_data, process_defs, output_filepath) + process_defs: Union[dict, list, str], in_filepaths: List[str], + output_filepath: str = None): + return BasicJobDomain(process_graph_json, job_data, process_defs, in_filepaths, output_filepath) def get_imports(self, domain) -> str: return '''\ @@ -47,9 +50,13 @@ def get_nodes(self, domain: BasicJobDomain) -> Tuple[dict, list]: for node in nodes: node_id = node[0] params = node[1] - filepaths = node[2] - node_dependencies = node[3] - node_operator = node[4] + node_dependencies = node[2] + node_operator = node[3] + + if not node_dependencies: + filepaths = domain.in_filepaths + else: + filepaths = None if filepaths: filepaths0 = 'filepaths = ' @@ -78,7 +85,7 @@ def get_nodes(self, domain: BasicJobDomain) -> Tuple[dict, list]: for node in nodes: node_id = node[0] - node_dependencies = node[3] + node_dependencies = node[2] current_index = translated_nodes_keys.index(node_id) dep_indices = [] diff --git a/src/eodc_openeo_bindings/job_writer/dag_writer.py b/src/eodc_openeo_bindings/job_writer/dag_writer.py index dc0706c..cc3bbf8 100644 --- a/src/eodc_openeo_bindings/job_writer/dag_writer.py +++ b/src/eodc_openeo_bindings/job_writer/dag_writer.py @@ -23,9 +23,11 @@ def __init__(self, job_id_extensions: Optional[Dict[str, str]] = None): def get_domain(self, job_id: str, user_name: str, + dags_folder: str, process_graph_json: Union[str, dict], job_data: str, process_defs: Union[dict, list, str], + in_filepaths: List[str], user_email: str = None, job_description: str = None, parallelize_tasks: bool = False, @@ -36,9 +38,11 @@ def get_domain(self, return AirflowDagDomain(job_id=job_id, job_id_extension=self.job_id_extensions, user_name=user_name, + dags_folder=dags_folder, process_graph_json=process_graph_json, job_data=job_data, process_defs=process_defs, + in_filepaths=in_filepaths, user_email=user_email, job_description=job_description, parallelize_tasks=parallelize_tasks, @@ -47,31 +51,32 @@ def get_domain(self, add_parallel_sensor=add_parallel_sensor, ) - def write_job(self, job_id: str, user_name: str, process_graph_json: Union[str, dict], job_data: str, - process_defs: Union[dict, list, str], + def write_job(self, job_id: str, user_name: str, dags_folder: str, process_graph_json: Union[str, dict], job_data: str, + process_defs: Union[dict, list, str], in_filepaths: List[str], user_email: str = None, job_description: str = None, parallelize_tasks: bool = False, vrt_only: bool = False, add_delete_sensor: bool = False, add_parallel_sensor: bool = False): - return super().write_job(job_id=job_id, user_name=user_name, process_graph_json=process_graph_json, - job_data=job_data, process_defs=process_defs, user_email=user_email, job_description=job_description, + return super().write_job(job_id=job_id, user_name=user_name, dags_folder=dags_folder, process_graph_json=process_graph_json, + job_data=job_data, process_defs=process_defs, in_filepaths=in_filepaths, user_email=user_email, job_description=job_description, parallelize_tasks=parallelize_tasks, vrt_only=vrt_only, add_delete_sensor=add_delete_sensor, add_parallel_sensor=add_parallel_sensor) - def move_dag(self, filepath: str): + def move_dag(self, filepath: str, dags_folder: str): # Move file to DAGs folder (must copy/delete because of different volume mounts) - copyfile(filepath, os.environ.get('AIRFLOW_DAGS') + "/" + filepath) + #copyfile(filepath, os.environ.get('AIRFLOW_DAGS') + "/" + filepath) + copyfile(filepath, dags_folder + "/" + filepath) os.remove(filepath) - def write_and_move_job(self, job_id: str, user_name: str, process_graph_json: Union[str, dict], job_data: str, - process_defs: Union[dict, list, str], + def write_and_move_job(self, job_id: str, user_name: str, dags_folder: str, process_graph_json: Union[str, dict], job_data: str, + process_defs: Union[dict, list, str], in_filepaths: List[str], user_email: str = None, job_description: str = None, parallelize_tasks: bool = False, vrt_only: bool = False, add_delete_sensor: bool = False, add_parallel_sensor: bool = False): - _, domain = self.write_job(job_id, user_name, process_graph_json, job_data, process_defs, user_email, job_description, + _, domain = self.write_job(job_id, user_name, dags_folder, process_graph_json, job_data, process_defs, in_filepaths, user_email, job_description, parallelize_tasks, vrt_only, add_delete_sensor, add_parallel_sensor) - self.move_dag(domain.filepath) + self.move_dag(domain.filepath, domain.dags_folder) def rewrite_and_move_job(self, domain: AirflowDagDomain): _, domain = self.rewrite_job(domain) - self.move_dag(domain.filepath) + self.move_dag(domain.filepath, domain.dags_folder) def get_imports(self, domain: AirflowDagDomain) -> str: imports = '''\ @@ -139,11 +144,15 @@ def get_dependencies_txt(self, node_id, dependencies): def _get_node_info(self, node, domain): node_id = node[0] params = node[1] - filepaths = node[2] - node_dependencies = node[3] + node_dependencies = node[2] if node_dependencies: node_dependencies = self.utils.get_existing_node(domain.job_data, node_dependencies) + # Assumption: dependency means that this is *not* a 'load_collection' node, hence do not write input filepaths into its mapping + filepaths = None + else: + # Assumption: no dependency means that this is a 'load_collection' node + filepaths = domain.in_filepaths return node_id, params, filepaths, node_dependencies diff --git a/src/eodc_openeo_bindings/job_writer/job_domain.py b/src/eodc_openeo_bindings/job_writer/job_domain.py index e2f22b9..4deffe1 100644 --- a/src/eodc_openeo_bindings/job_writer/job_domain.py +++ b/src/eodc_openeo_bindings/job_writer/job_domain.py @@ -1,4 +1,4 @@ -from typing import Union +from typing import List, Union from eodc_openeo_bindings.job_writer.utils import JobIdExtension @@ -15,10 +15,12 @@ def get_filepath(self) -> str: class BasicJobDomain(JobDomain): def __init__(self, process_graph_json: Union[str, dict], job_data: str, - process_defs: Union[dict, list, str], output_filepath: str = None): + process_defs: Union[dict, list, str], in_filepaths: List[str], + output_filepath: str = None): self.process_graph_json = process_graph_json self.job_data = job_data self.process_defs= process_defs + self.in_filepaths = in_filepaths self.output_filepath = output_filepath super(BasicJobDomain, self).__init__() @@ -31,10 +33,12 @@ class AirflowDagDomain(JobDomain): def __init__(self, job_id: str, job_id_extension: JobIdExtension, + dags_folder: str, user_name: str, process_graph_json: Union[str, dict], job_data: str, process_defs: Union[dict, list, str], + in_filepaths: List[str], user_email: str = None, job_description: str = None, parallelize_tasks: bool = False, @@ -61,9 +65,11 @@ def __init__(self, """ self.process_graph_json = process_graph_json self.job_data = job_data - self.process_defs= process_defs + self.process_defs = process_defs + self.in_filepaths = in_filepaths self.job_id = job_id self.job_id_extension = job_id_extension + self.dags_folder = dags_folder self.user_name = user_name self.user_email = user_email self.job_description = job_description if job_description else 'No description provided' diff --git a/src/eodc_openeo_bindings/map_cubes_processes.py b/src/eodc_openeo_bindings/map_cubes_processes.py index f7d42c7..2faf768 100644 --- a/src/eodc_openeo_bindings/map_cubes_processes.py +++ b/src/eodc_openeo_bindings/map_cubes_processes.py @@ -12,17 +12,6 @@ def map_load_collection(process): Retrieves a file list and maps bbox and band filters to eoDataReaders. """ - # Get list of filepaths fro csw server - filepaths = csw_query(collection=process['arguments']["id"], - spatial_extent=( - process['arguments']['spatial_extent']['south'], - process['arguments']['spatial_extent']['west'], - process['arguments']['spatial_extent']['north'], - process['arguments']['spatial_extent']['east'] - ), - temporal_extent=process['arguments']["temporal_extent"] - ) - dict_item_list = [] # Map band filter @@ -36,7 +25,7 @@ def map_load_collection(process): dict_item = map_filter_bbox(process)[0] dict_item_list.append(dict_item) - return dict_item_list, filepaths + return dict_item_list def map_filter_bands(process): @@ -211,48 +200,6 @@ def map_add_dimension(process): return dict_item_list -def csw_query(collection, spatial_extent, temporal_extent): - """ - Retrieves a file list from the EODC CSW server according to the specified parameters. - - """ - - if collection == 'SIG0': - csw = CatalogueServiceWeb(environ.get('OEO_CSW_SERVER_DC'), timeout=300) - else: - csw = CatalogueServiceWeb(environ.get('OEO_CSW_SERVER'), timeout=300) - constraints = [] - - # Collection filter - if collection == 'SIG0': - constraints.append(PropertyIsEqualTo('eodc:variable_name', collection)) - else: - constraints.append(PropertyIsLike('apiso:ParentIdentifier', collection)) - # Spatial filter - constraints.append(BBox(spatial_extent)) - # Temporal filter - constraints.append(PropertyIsGreaterThan('apiso:TempExtent_begin', temporal_extent[0])) - constraints.append(PropertyIsLessThan('apiso:TempExtent_end', temporal_extent[1])) - - # Run the query - constraints = [constraints] - csw.getrecords2(constraints=constraints, maxrecords=100) - - # Put found records in a variable (dictionary) - records0 = csw.records - - # Put statistics about results in a variable - #results = csw.results - - # Sort records - records = [] - for record in records0: - records.append(records0[record].references[0]['url']) - records = sorted(records) - - return records - - def check_dim_name(dimension_name): """ Map common dimension names for spectral and time to fieladnames used in eodatareaders. diff --git a/src/eodc_openeo_bindings/map_processes.py b/src/eodc_openeo_bindings/map_processes.py index a572060..b41d960 100644 --- a/src/eodc_openeo_bindings/map_processes.py +++ b/src/eodc_openeo_bindings/map_processes.py @@ -37,20 +37,14 @@ def map_process(process, node_id, is_result, root_folder, process_params = eval("map_" + process['process_id'] + "(process)") - if isinstance(process_params, tuple): - # This should happen only for "load_collection" - filepaths = process_params[1] - process_params = process_params[0] - - if process['arguments']["id"][:2] in ('s1', 's3', 's5'): - # Workaround to use S1 and S3 Level-1 data, or S5p Level-2 data, which are not georeferenced - # TODO for the moment this is a workaround (29.06.2020) - job_params = set_output_folder(root_folder, node_id + '_0') - # Add a 'quick_geocode' step before cropping/clipping - process_params.insert(-1, {'name': 'quick_geocode', 'scale_sampling': '1;int'}) - process_params.insert(-1, set_output_folder(root_folder, node_id)[0]) - else: - filepaths = None + if process['process_id'] == 'load_collection' and process['arguments']["id"][:2] in ('s1', 's3', 's5'): + # Workaround to use S1 and S3 Level-1 data, or S5p Level-2 data, which are not georeferenced + # TODO for the moment this is a workaround (29.06.2020) + job_params = set_output_folder(root_folder, node_id + '_0') + # Add a 'quick_geocode' step before cropping/clipping + process_params.insert(-1, {'name': 'quick_geocode', 'scale_sampling': '1;int'}) + process_params.insert(-1, set_output_folder(root_folder, node_id)[0]) + for param in process_params: job_params.append(param) @@ -73,4 +67,4 @@ def map_process(process, node_id, is_result, root_folder, pickled_filepath = job_params[0]['out_dirpath'] + node_id + '.dc' job_params.append({'name': 'to_pickle', 'filepath': f'{pickled_filepath};str'}) - return job_params, filepaths + return job_params diff --git a/src/eodc_openeo_bindings/openeo_to_eodatareaders.py b/src/eodc_openeo_bindings/openeo_to_eodatareaders.py index 8abc35d..081729b 100644 --- a/src/eodc_openeo_bindings/openeo_to_eodatareaders.py +++ b/src/eodc_openeo_bindings/openeo_to_eodatareaders.py @@ -74,10 +74,9 @@ def openeo_to_eodatareaders(process_graph_json_in: Union[dict, str], job_data: s if cur_node.content['process_id'] == 'run_udf': operator = "UdfExec" params = map_udf(cur_node.content, job_data, cur_node.id) - filepaths = None else: operator = "EODataProcessor" - params, filepaths = map_process( + params = map_process( cur_node.content, cur_node.id, cur_node.is_result, @@ -97,7 +96,7 @@ def openeo_to_eodatareaders(process_graph_json_in: Union[dict, str], job_data: s node_dependencies = list(cur_node.dependencies.ids) # Add to nodes list - nodes.append((cur_node.id, params, filepaths, node_dependencies, operator)) + nodes.append((cur_node.id, params, node_dependencies, operator)) return nodes, graph diff --git a/tests/conftest.py b/tests/conftest.py index 9a9fa0f..2742d9f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -83,18 +83,20 @@ def backend_processes(): @pytest.fixture() -def setup_airflow_dag_folder(request): +def airflow_dag_folder(request): test_folder = get_test_folder() - os.environ['AIRFLOW_DAGS'] = os.path.join(test_folder, 'airflow_dag') - if os.path.isdir(os.environ['AIRFLOW_DAGS']): - shutil.rmtree(os.environ['AIRFLOW_DAGS']) - os.makedirs(os.environ['AIRFLOW_DAGS']) + dags_folder = os.path.join(test_folder, 'airflow_dag') + if os.path.isdir(dags_folder): + shutil.rmtree(dags_folder) + os.makedirs(dags_folder) def fin(): - shutil.rmtree(os.environ['AIRFLOW_DAGS']) + shutil.rmtree(dags_folder) request.addfinalizer(fin) + return dags_folder + @pytest.fixture() def setup_ref_job_folder(): @@ -107,8 +109,8 @@ def airflow_job_folder(): @pytest.fixture() -def csw_server_default(mocker): - csw_server_response = [ +def S2_filepaths(): + return [ '/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', @@ -117,12 +119,11 @@ def csw_server_default(mocker): '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip', ] - mocker.patch('eodc_openeo_bindings.map_cubes_processes.csw_query', return_value=csw_server_response) @pytest.fixture() -def acube_csw_server_default(mocker): - csw_server_response = [ +def ACube_filepaths(): + return [ 'sig0/SIG0-----_SGRTA01_S1A_IWGRDH1VHD_20170301_050935--_EU010M_E052N015T1.tif', 'sig0/SIG0-----_SGRTA01_S1A_IWGRDH1VHD_20170301_051000--_EU010M_E052N015T1.tif', 'sig0/SIG0-----_SGRTA01_S1A_IWGRDH1VVD_20170301_050935--_EU010M_E052N015T1.tif', @@ -140,4 +141,4 @@ def acube_csw_server_default(mocker): 'sig0/SIG0-----_SGRTA01_S1B_IWGRDH1VVD_20170302_050028--_EU010M_E052N016T1.tif', 'sig0/SIG0-----_SGRTA01_S1B_IWGRDH1VVD_20170302_050053--_EU010M_E052N016T1.tif', ] - mocker.patch('eodc_openeo_bindings.map_cubes_processes.csw_query', return_value=csw_server_response) + diff --git a/tests/ref_jobs/basic_job_UC1_spectral_ref.py b/tests/ref_jobs/basic_job_UC1_spectral_ref.py index 4af45a4..419ac8f 100644 --- a/tests/ref_jobs/basic_job_UC1_spectral_ref.py +++ b/tests/ref_jobs/basic_job_UC1_spectral_ref.py @@ -8,7 +8,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/load_collection_0/'}, {'name': 'filter_bands', 'bands': ['VV', 'VH']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/basic_job/load_collection_0/load_collection_0.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/load_collection_0/'}, {'name': 'filter_bands', 'bands': ['VV', 'VH']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './basic_job/load_collection_0/load_collection_0.dc;str'}] # evaluate node load_collection_0 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -17,10 +17,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/load_collection_0/load_collection_0.dc'] +dc_filepaths = ['./basic_job/load_collection_0/load_collection_0.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mean_2/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/mean_2/mean_2.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mean_2/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/mean_2/mean_2.dc;str'}] # evaluate node mean_2 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -29,10 +29,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mean_2/mean_2.dc'] +dc_filepaths = ['./basic_job/mean_2/mean_2.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/t_mean_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/t_mean_1/t_mean_1.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/t_mean_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/t_mean_1/t_mean_1.dc;str'}] # evaluate node t_mean_1 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -41,10 +41,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/t_mean_1/t_mean_1.dc'] +dc_filepaths = ['./basic_job/t_mean_1/t_mean_1.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/VH_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'label': 'VH;str'}}, {'name': 'to_pickle', 'filepath': '/basic_job/VH_5/VH_5.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/VH_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'label': 'VH;str'}}, {'name': 'to_pickle', 'filepath': './basic_job/VH_5/VH_5.dc;str'}] # evaluate node VH_5 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -53,10 +53,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/t_mean_1/t_mean_1.dc'] +dc_filepaths = ['./basic_job/t_mean_1/t_mean_1.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/VV_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'label': 'VV;str'}}, {'name': 'to_pickle', 'filepath': '/basic_job/VV_4/VV_4.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/VV_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'label': 'VV;str'}}, {'name': 'to_pickle', 'filepath': './basic_job/VV_4/VV_4.dc;str'}] # evaluate node VV_4 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -65,10 +65,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/VH_5/VH_5.dc', '/basic_job/VV_4/VV_4.dc'] +dc_filepaths = ['./basic_job/VH_5/VH_5.dc', './basic_job/VV_4/VV_4.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/sub_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/sub_6/sub_6.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/sub_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/sub_6/sub_6.dc;str'}] # evaluate node sub_6 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -77,10 +77,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/sub_6/sub_6.dc'] +dc_filepaths = ['./basic_job/sub_6/sub_6.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/cr_3/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/cr_3/cr_3.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/cr_3/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/cr_3/cr_3.dc;str'}] # evaluate node cr_3 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -89,10 +89,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/cr_3/cr_3.dc'] +dc_filepaths = ['./basic_job/cr_3/cr_3.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/add_dim_cr_7/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'B;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': '/basic_job/add_dim_cr_7/add_dim_cr_7.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/add_dim_cr_7/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'B;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': './basic_job/add_dim_cr_7/add_dim_cr_7.dc;str'}] # evaluate node add_dim_cr_7 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -101,10 +101,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/t_mean_1/t_mean_1.dc'] +dc_filepaths = ['./basic_job/t_mean_1/t_mean_1.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/VH_10/'}, {'name': 'filter_bands', 'bands': ['VH']}, {'name': 'to_pickle', 'filepath': '/basic_job/VH_10/VH_10.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/VH_10/'}, {'name': 'filter_bands', 'bands': ['VH']}, {'name': 'to_pickle', 'filepath': './basic_job/VH_10/VH_10.dc;str'}] # evaluate node VH_10 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -113,10 +113,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/VH_10/VH_10.dc'] +dc_filepaths = ['./basic_job/VH_10/VH_10.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/rename_label_VH_11/'}, {'name': 'rename_labels', 'dim_name': 'band;str', 'new_labels': "['G'];list", 'old_labels': '[];list'}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/rename_label_VH_11/rename_label_VH_11.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/rename_label_VH_11/'}, {'name': 'rename_labels', 'dim_name': 'band;str', 'new_labels': "['G'];list", 'old_labels': '[];list'}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/rename_label_VH_11/rename_label_VH_11.dc;str'}] # evaluate node rename_label_VH_11 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -125,10 +125,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/t_mean_1/t_mean_1.dc'] +dc_filepaths = ['./basic_job/t_mean_1/t_mean_1.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/VV_8/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'to_pickle', 'filepath': '/basic_job/VV_8/VV_8.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/VV_8/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'to_pickle', 'filepath': './basic_job/VV_8/VV_8.dc;str'}] # evaluate node VV_8 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -137,10 +137,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/VV_8/VV_8.dc'] +dc_filepaths = ['./basic_job/VV_8/VV_8.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/rename_label_VV_9/'}, {'name': 'rename_labels', 'dim_name': 'band;str', 'new_labels': "['R'];list", 'old_labels': '[];list'}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/rename_label_VV_9/rename_label_VV_9.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/rename_label_VV_9/'}, {'name': 'rename_labels', 'dim_name': 'band;str', 'new_labels': "['R'];list", 'old_labels': '[];list'}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/rename_label_VV_9/rename_label_VV_9.dc;str'}] # evaluate node rename_label_VV_9 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -149,10 +149,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/rename_label_VV_9/rename_label_VV_9.dc', '/basic_job/rename_label_VH_11/rename_label_VH_11.dc'] +dc_filepaths = ['./basic_job/rename_label_VV_9/rename_label_VV_9.dc', './basic_job/rename_label_VH_11/rename_label_VH_11.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/RG_12/'}, {'name': 'to_pickle', 'filepath': '/basic_job/RG_12/RG_12.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/RG_12/'}, {'name': 'to_pickle', 'filepath': './basic_job/RG_12/RG_12.dc;str'}] # evaluate node RG_12 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -161,10 +161,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/RG_12/RG_12.dc', '/basic_job/add_dim_cr_7/add_dim_cr_7.dc'] +dc_filepaths = ['./basic_job/RG_12/RG_12.dc', './basic_job/add_dim_cr_7/add_dim_cr_7.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/RGB_13/'}, {'name': 'to_pickle', 'filepath': '/basic_job/RGB_13/RGB_13.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/RGB_13/'}, {'name': 'to_pickle', 'filepath': './basic_job/RGB_13/RGB_13.dc;str'}] # evaluate node RGB_13 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -173,10 +173,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/RGB_13/RGB_13.dc'] +dc_filepaths = ['./basic_job/RGB_13/RGB_13.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/result/'}, {'name': 'create_composite', 'bands': ['R', 'G', 'B'], 'format_type': 'GTiff'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/basic_job/result/save_result_14.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/result/'}, {'name': 'create_composite', 'bands': ['R', 'G', 'B'], 'format_type': 'GTiff'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './basic_job/result/save_result_14.dc;str'}] # evaluate node save_result_14 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) diff --git a/tests/ref_jobs/basic_job_UC1_temporal_ref.py b/tests/ref_jobs/basic_job_UC1_temporal_ref.py index 8991b33..539afb4 100644 --- a/tests/ref_jobs/basic_job_UC1_temporal_ref.py +++ b/tests/ref_jobs/basic_job_UC1_temporal_ref.py @@ -8,7 +8,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/march_0/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/basic_job/march_0/march_0.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/march_0/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './basic_job/march_0/march_0.dc;str'}] # evaluate node march_0 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -17,10 +17,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/march_0/march_0.dc'] +dc_filepaths = ['./basic_job/march_0/march_0.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mean_4/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/mean_4/mean_4.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mean_4/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/mean_4/mean_4.dc;str'}] # evaluate node mean_4 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -29,10 +29,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mean_4/mean_4.dc'] +dc_filepaths = ['./basic_job/mean_4/mean_4.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mean_march_3/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/mean_march_3/mean_march_3.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mean_march_3/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/mean_march_3/mean_march_3.dc;str'}] # evaluate node mean_march_3 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -41,10 +41,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mean_march_3/mean_march_3.dc'] +dc_filepaths = ['./basic_job/mean_march_3/mean_march_3.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/add_dim_R_9/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'R;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': '/basic_job/add_dim_R_9/add_dim_R_9.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/add_dim_R_9/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'R;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': './basic_job/add_dim_R_9/add_dim_R_9.dc;str'}] # evaluate node add_dim_R_9 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -56,7 +56,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/may_2/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/basic_job/may_2/may_2.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/may_2/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './basic_job/may_2/may_2.dc;str'}] # evaluate node may_2 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -65,10 +65,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/may_2/may_2.dc'] +dc_filepaths = ['./basic_job/may_2/may_2.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mean_8/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/mean_8/mean_8.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mean_8/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/mean_8/mean_8.dc;str'}] # evaluate node mean_8 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -77,10 +77,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mean_8/mean_8.dc'] +dc_filepaths = ['./basic_job/mean_8/mean_8.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mean_may_7/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/mean_may_7/mean_may_7.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mean_may_7/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/mean_may_7/mean_may_7.dc;str'}] # evaluate node mean_may_7 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -89,10 +89,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mean_may_7/mean_may_7.dc'] +dc_filepaths = ['./basic_job/mean_may_7/mean_may_7.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/add_dim_B_11/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'B;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': '/basic_job/add_dim_B_11/add_dim_B_11.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/add_dim_B_11/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'B;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': './basic_job/add_dim_B_11/add_dim_B_11.dc;str'}] # evaluate node add_dim_B_11 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -104,7 +104,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/april_1/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/basic_job/april_1/april_1.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/april_1/'}, {'name': 'filter_bands', 'bands': ['VV']}, {'name': 'crop', 'extent': (16.06, 48.06, 16.65, 48.35), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './basic_job/april_1/april_1.dc;str'}] # evaluate node april_1 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -113,10 +113,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/april_1/april_1.dc'] +dc_filepaths = ['./basic_job/april_1/april_1.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mean_6/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/mean_6/mean_6.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mean_6/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'mean'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/mean_6/mean_6.dc;str'}] # evaluate node mean_6 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -125,10 +125,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mean_6/mean_6.dc'] +dc_filepaths = ['./basic_job/mean_6/mean_6.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mean_april_5/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/mean_april_5/mean_april_5.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mean_april_5/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/mean_april_5/mean_april_5.dc;str'}] # evaluate node mean_april_5 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -137,10 +137,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mean_april_5/mean_april_5.dc'] +dc_filepaths = ['./basic_job/mean_april_5/mean_april_5.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/add_dim_G_10/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'G;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': '/basic_job/add_dim_G_10/add_dim_G_10.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/add_dim_G_10/'}, {'name': 'add_dimension', 'dim_name': 'band;str', 'label': 'G;str', 'dim_type': 'bands;str'}, {'name': 'to_pickle', 'filepath': './basic_job/add_dim_G_10/add_dim_G_10.dc;str'}] # evaluate node add_dim_G_10 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -149,10 +149,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/add_dim_R_9/add_dim_R_9.dc', '/basic_job/add_dim_G_10/add_dim_G_10.dc'] +dc_filepaths = ['./basic_job/add_dim_R_9/add_dim_R_9.dc', './basic_job/add_dim_G_10/add_dim_G_10.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/RG_12/'}, {'name': 'to_pickle', 'filepath': '/basic_job/RG_12/RG_12.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/RG_12/'}, {'name': 'to_pickle', 'filepath': './basic_job/RG_12/RG_12.dc;str'}] # evaluate node RG_12 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -161,10 +161,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/RG_12/RG_12.dc', '/basic_job/add_dim_B_11/add_dim_B_11.dc'] +dc_filepaths = ['./basic_job/RG_12/RG_12.dc', './basic_job/add_dim_B_11/add_dim_B_11.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/RGB_13/'}, {'name': 'to_pickle', 'filepath': '/basic_job/RGB_13/RGB_13.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/RGB_13/'}, {'name': 'to_pickle', 'filepath': './basic_job/RGB_13/RGB_13.dc;str'}] # evaluate node RGB_13 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -173,10 +173,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/RGB_13/RGB_13.dc'] +dc_filepaths = ['./basic_job/RGB_13/RGB_13.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/result/'}, {'name': 'create_composite', 'bands': ['R', 'G', 'B'], 'format_type': 'GTiff'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/basic_job/result/save_result_14.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/result/'}, {'name': 'create_composite', 'bands': ['R', 'G', 'B'], 'format_type': 'GTiff'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './basic_job/result/save_result_14.dc;str'}] # evaluate node save_result_14 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) diff --git a/tests/ref_jobs/basic_job_apply_ref.py b/tests/ref_jobs/basic_job_apply_ref.py index 3719618..d3ffe99 100644 --- a/tests/ref_jobs/basic_job_apply_ref.py +++ b/tests/ref_jobs/basic_job_apply_ref.py @@ -8,7 +8,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/dc_0/'}, {'name': 'filter_bands', 'bands': [8, 4, 2]}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/basic_job/dc_0/dc_0.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/dc_0/'}, {'name': 'filter_bands', 'bands': [8, 4, 2]}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './basic_job/dc_0/dc_0.dc;str'}] # evaluate node dc_0 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -17,10 +17,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/dc_0/dc_0.dc'] +dc_filepaths = ['./basic_job/dc_0/dc_0.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mult_2/'}, {'name': 'apply', 'f_input': {'f_name': 'multiply', 'y': '-1;float'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/mult_2/mult_2.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mult_2/'}, {'name': 'apply', 'f_input': {'f_name': 'multiply', 'y': '-1;float'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/mult_2/mult_2.dc;str'}] # evaluate node mult_2 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -29,10 +29,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mult_2/mult_2.dc'] +dc_filepaths = ['./basic_job/mult_2/mult_2.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/apply_multiply_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/apply_multiply_1/apply_multiply_1.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/apply_multiply_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/apply_multiply_1/apply_multiply_1.dc;str'}] # evaluate node apply_multiply_1 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -41,10 +41,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/apply_multiply_1/apply_multiply_1.dc'] +dc_filepaths = ['./basic_job/apply_multiply_1/apply_multiply_1.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/basic_job/result/save_3.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './basic_job/result/save_3.dc;str'}] # evaluate node save_3 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) diff --git a/tests/ref_jobs/basic_job_ref.py b/tests/ref_jobs/basic_job_ref.py index e117ea7..7781bf4 100644 --- a/tests/ref_jobs/basic_job_ref.py +++ b/tests/ref_jobs/basic_job_ref.py @@ -8,7 +8,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/basic_job/dc_0/dc_0.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './basic_job/dc_0/dc_0.dc;str'}] # evaluate node dc_0 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -17,10 +17,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/dc_0/dc_0.dc'] +dc_filepaths = ['./basic_job/dc_0/dc_0.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': '/basic_job/blue_4/blue_4.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': './basic_job/blue_4/blue_4.dc;str'}] # evaluate node blue_4 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -29,10 +29,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/blue_4/blue_4.dc'] +dc_filepaths = ['./basic_job/blue_4/blue_4.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/basic_job/p2_7/p2_7.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './basic_job/p2_7/p2_7.dc;str'}] # evaluate node p2_7 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -41,10 +41,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/dc_0/dc_0.dc'] +dc_filepaths = ['./basic_job/dc_0/dc_0.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': '/basic_job/red_3/red_3.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': './basic_job/red_3/red_3.dc;str'}] # evaluate node red_3 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -53,10 +53,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/red_3/red_3.dc'] +dc_filepaths = ['./basic_job/red_3/red_3.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/basic_job/p1_6/p1_6.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './basic_job/p1_6/p1_6.dc;str'}] # evaluate node p1_6 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -65,10 +65,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/dc_0/dc_0.dc'] +dc_filepaths = ['./basic_job/dc_0/dc_0.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': '/basic_job/nir_2/nir_2.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': './basic_job/nir_2/nir_2.dc;str'}] # evaluate node nir_2 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -77,10 +77,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/nir_2/nir_2.dc', '/basic_job/p1_6/p1_6.dc', '/basic_job/p2_7/p2_7.dc'] +dc_filepaths = ['./basic_job/nir_2/nir_2.dc', './basic_job/p1_6/p1_6.dc', './basic_job/p2_7/p2_7.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/basic_job/sum_8/sum_8.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './basic_job/sum_8/sum_8.dc;str'}] # evaluate node sum_8 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -89,10 +89,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/nir_2/nir_2.dc', '/basic_job/red_3/red_3.dc'] +dc_filepaths = ['./basic_job/nir_2/nir_2.dc', './basic_job/red_3/red_3.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/basic_job/sub_5/sub_5.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './basic_job/sub_5/sub_5.dc;str'}] # evaluate node sub_5 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -101,10 +101,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/sub_5/sub_5.dc', '/basic_job/sum_8/sum_8.dc'] +dc_filepaths = ['./basic_job/sub_5/sub_5.dc', './basic_job/sum_8/sum_8.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/basic_job/div_9/div_9.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './basic_job/div_9/div_9.dc;str'}] # evaluate node div_9 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -113,10 +113,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/div_9/div_9.dc'] +dc_filepaths = ['./basic_job/div_9/div_9.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/p3_10/p3_10.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/p3_10/p3_10.dc;str'}] # evaluate node p3_10 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -125,10 +125,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/p3_10/p3_10.dc'] +dc_filepaths = ['./basic_job/p3_10/p3_10.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/evi_1/evi_1.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/evi_1/evi_1.dc;str'}] # evaluate node evi_1 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -137,10 +137,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/evi_1/evi_1.dc'] +dc_filepaths = ['./basic_job/evi_1/evi_1.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/basic_job/min_12/min_12.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './basic_job/min_12/min_12.dc;str'}] # evaluate node min_12 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -149,10 +149,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/min_12/min_12.dc'] +dc_filepaths = ['./basic_job/min_12/min_12.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/basic_job/mintime_11/mintime_11.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './basic_job/mintime_11/mintime_11.dc;str'}] # evaluate node mintime_11 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -161,10 +161,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/basic_job/mintime_11/mintime_11.dc'] +dc_filepaths = ['./basic_job/mintime_11/mintime_11.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/basic_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/basic_job/result/save_13.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './basic_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './basic_job/result/save_13.dc;str'}] # evaluate node save_13 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) diff --git a/tests/ref_jobs/basic_job_udf_python_ref.py b/tests/ref_jobs/basic_job_udf_python_ref.py index 7cff776..c3e4c21 100644 --- a/tests/ref_jobs/basic_job_udf_python_ref.py +++ b/tests/ref_jobs/basic_job_udf_python_ref.py @@ -8,7 +8,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/output_udf_python/dc_0/'}, {'name': 'filter_bands', 'bands': [8]}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/output_udf_python/dc_0/dc_0.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './output_udf_python/dc_0/'}, {'name': 'filter_bands', 'bands': [8]}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './output_udf_python/dc_0/dc_0.dc;str'}] # evaluate node dc_0 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -17,10 +17,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/output_udf_python/dc_0/dc_0.dc'] +dc_filepaths = ['./output_udf_python/dc_0/dc_0.dc'] # node input parameters -params = {'udf': 'data2 = data.hypercube_list[0].get_array(); data2=data2*(-1); data.hypercube_list[0].set_array(data2)', 'runtime': 'Python', 'output_folder': '/output_udf_python/udf_2'} +params = {'udf': 'data2 = data.hypercube_list[0].get_array(); data2=data2*(-1); data.hypercube_list[0].set_array(data2)', 'runtime': 'Python', 'output_folder': './output_udf_python/udf_2'} # evaluate node udf_2 = UdfExec(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -29,10 +29,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/output_udf_python/udf_2/udf_2.dc'] +dc_filepaths = ['./output_udf_python/udf_2/udf_2.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/output_udf_python/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/output_udf_python/result/udfnode_1.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './output_udf_python/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './output_udf_python/result/udfnode_1.dc;str'}] # evaluate node udfnode_1 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) diff --git a/tests/ref_jobs/basic_job_udf_r_ref.py b/tests/ref_jobs/basic_job_udf_r_ref.py index 151e0a2..78c642a 100644 --- a/tests/ref_jobs/basic_job_udf_r_ref.py +++ b/tests/ref_jobs/basic_job_udf_r_ref.py @@ -8,7 +8,7 @@ dc_filepaths = None # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/output_udf_r/dc_0/'}, {'name': 'filter_bands', 'bands': [8]}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/output_udf_r/dc_0/dc_0.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './output_udf_r/dc_0/'}, {'name': 'filter_bands', 'bands': [8]}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './output_udf_r/dc_0/dc_0.dc;str'}] # evaluate node dc_0 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -17,10 +17,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/output_udf_r/dc_0/dc_0.dc'] +dc_filepaths = ['./output_udf_r/dc_0/dc_0.dc'] # node input parameters -params = {'udf': 'data2 = data*(-1); data2', 'runtime': 'R', 'output_folder': '/output_udf_r/udf_2'} +params = {'udf': 'data2 = data*(-1); data2', 'runtime': 'R', 'output_folder': './output_udf_r/udf_2'} # evaluate node udf_2 = UdfExec(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) @@ -29,10 +29,10 @@ # node input files filepaths = None # node input pickled dc files -dc_filepaths = ['/output_udf_r/udf_2/udf_2.dc'] +dc_filepaths = ['./output_udf_r/udf_2/udf_2.dc'] # node input parameters -params = [{'name': 'set_output_folder', 'out_dirpath': '/output_udf_r/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/output_udf_r/result/udfnode_1.dc;str'}] +params = [{'name': 'set_output_folder', 'out_dirpath': './output_udf_r/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './output_udf_r/result/udfnode_1.dc;str'}] # evaluate node udfnode_1 = EODataProcessor(filepaths=filepaths, dc_filepaths=dc_filepaths, user_params=params) diff --git a/tests/ref_jobs/dag_jb-12345_delete_sensor_prep_ref.py b/tests/ref_jobs/dag_jb-12345_delete_sensor_prep_ref.py index b5cb1dd..66c4c83 100644 --- a/tests/ref_jobs/dag_jb-12345_delete_sensor_prep_ref.py +++ b/tests/ref_jobs/dag_jb-12345_delete_sensor_prep_ref.py @@ -22,98 +22,98 @@ dc_0 = PythonOperator(task_id='dc_0', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/openeo_job/dc_0/dc_0.dc;str'}]}, + op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './openeo_job/dc_0/dc_0.dc;str'}]}, queue='process' ) nir_2 = PythonOperator(task_id='nir_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/nir_2/nir_2.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/nir_2/nir_2.dc;str'}]}, queue='process' ) red_3 = PythonOperator(task_id='red_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/red_3/red_3.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/red_3/red_3.dc;str'}]}, queue='process' ) blue_4 = PythonOperator(task_id='blue_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/blue_4/blue_4.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/blue_4/blue_4.dc;str'}]}, queue='process' ) sub_5 = PythonOperator(task_id='sub_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) p1_6 = PythonOperator(task_id='p1_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p2_7 = PythonOperator(task_id='p2_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) sum_8 = PythonOperator(task_id='sum_8', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/p1_6/p1_6.dc', '/openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/p1_6/p1_6.dc', './openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) div_9 = PythonOperator(task_id='div_9', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/sub_5/sub_5.dc', '/openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/sub_5/sub_5.dc', './openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) p3_10 = PythonOperator(task_id='p3_10', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) evi_1 = PythonOperator(task_id='evi_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) min_12 = PythonOperator(task_id='min_12', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/min_12/min_12.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/min_12/min_12.dc;str'}]}, queue='process' ) mintime_11 = PythonOperator(task_id='mintime_11', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/mintime_11/mintime_11.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/mintime_11/mintime_11.dc;str'}]}, queue='process' ) save_13 = PythonOperator(task_id='save_13', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/openeo_job/result/save_13.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './openeo_job/result/save_13.dc;str'}]}, queue='process' ) @@ -146,7 +146,7 @@ cancel_sensor = CancelOp(task_id='cancel_sensor', dag=dag, - stop_file='/openeo_job/STOP', + stop_file='./openeo_job/STOP', queue='sensor', ) diff --git a/tests/ref_jobs/dag_jb-12345_prep_ref.py b/tests/ref_jobs/dag_jb-12345_prep_ref.py index dc0adb7..173736e 100644 --- a/tests/ref_jobs/dag_jb-12345_prep_ref.py +++ b/tests/ref_jobs/dag_jb-12345_prep_ref.py @@ -22,98 +22,98 @@ dc_0 = PythonOperator(task_id='dc_0', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/openeo_job/dc_0/dc_0.dc;str'}]}, + op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './openeo_job/dc_0/dc_0.dc;str'}]}, queue='process' ) nir_2 = PythonOperator(task_id='nir_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/nir_2/nir_2.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/nir_2/nir_2.dc;str'}]}, queue='process' ) red_3 = PythonOperator(task_id='red_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/red_3/red_3.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/red_3/red_3.dc;str'}]}, queue='process' ) blue_4 = PythonOperator(task_id='blue_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/blue_4/blue_4.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/blue_4/blue_4.dc;str'}]}, queue='process' ) sub_5 = PythonOperator(task_id='sub_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) p1_6 = PythonOperator(task_id='p1_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p2_7 = PythonOperator(task_id='p2_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) sum_8 = PythonOperator(task_id='sum_8', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/p1_6/p1_6.dc', '/openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/p1_6/p1_6.dc', './openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) div_9 = PythonOperator(task_id='div_9', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/sub_5/sub_5.dc', '/openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/sub_5/sub_5.dc', './openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) p3_10 = PythonOperator(task_id='p3_10', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) evi_1 = PythonOperator(task_id='evi_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) min_12 = PythonOperator(task_id='min_12', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/min_12/min_12.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/min_12/min_12.dc;str'}]}, queue='process' ) mintime_11 = PythonOperator(task_id='mintime_11', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/mintime_11/mintime_11.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/mintime_11/mintime_11.dc;str'}]}, queue='process' ) save_13 = PythonOperator(task_id='save_13', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/openeo_job/result/save_13.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './openeo_job/result/save_13.dc;str'}]}, queue='process' ) diff --git a/tests/ref_jobs/dag_jb-12346_prep_ref.py b/tests/ref_jobs/dag_jb-12346_prep_ref.py index afc1c66..acd6138 100644 --- a/tests/ref_jobs/dag_jb-12346_prep_ref.py +++ b/tests/ref_jobs/dag_jb-12346_prep_ref.py @@ -22,98 +22,98 @@ dc_0 = PythonOperator(task_id='dc_0', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/openeo_job/dc_0/dc_0.dc;str'}]}, + op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './openeo_job/dc_0/dc_0.dc;str'}]}, queue='process' ) nir_2 = PythonOperator(task_id='nir_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/nir_2/nir_2.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/nir_2/nir_2.dc;str'}]}, queue='process' ) red_3 = PythonOperator(task_id='red_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/red_3/red_3.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/red_3/red_3.dc;str'}]}, queue='process' ) blue_4 = PythonOperator(task_id='blue_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/blue_4/blue_4.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/blue_4/blue_4.dc;str'}]}, queue='process' ) sub_5 = PythonOperator(task_id='sub_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) p1_6 = PythonOperator(task_id='p1_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p2_7 = PythonOperator(task_id='p2_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) sum_8 = PythonOperator(task_id='sum_8', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/p1_6/p1_6.dc', '/openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/p1_6/p1_6.dc', './openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) div_9 = PythonOperator(task_id='div_9', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/sub_5/sub_5.dc', '/openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/sub_5/sub_5.dc', './openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) p3_10 = PythonOperator(task_id='p3_10', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) evi_1 = PythonOperator(task_id='evi_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) min_12 = PythonOperator(task_id='min_12', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/min_12/min_12.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'to_pickle', 'filepath': './openeo_job/min_12/min_12.dc;str'}]}, queue='process' ) mintime_11 = PythonOperator(task_id='mintime_11', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/mintime_11/mintime_11.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/mintime_11/mintime_11.dc;str'}]}, queue='process' ) save_13 = PythonOperator(task_id='save_13', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/openeo_job/result/save_13.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './openeo_job/result/save_13.dc;str'}]}, queue='process' ) diff --git a/tests/ref_jobs/dag_jb-12347_parallel_ref.py b/tests/ref_jobs/dag_jb-12347_parallel_ref.py index bff04d0..544571f 100644 --- a/tests/ref_jobs/dag_jb-12347_parallel_ref.py +++ b/tests/ref_jobs/dag_jb-12347_parallel_ref.py @@ -22,392 +22,392 @@ dc_0 = PythonOperator(task_id='dc_0', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/openeo_job/dc_0/dc_0.dc;str'}]}, + op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './openeo_job/dc_0/dc_0.dc;str'}]}, queue='process' ) nir_2 = PythonOperator(task_id='nir_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/nir_2/nir_2.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/nir_2/nir_2.dc;str'}]}, queue='process' ) red_3 = PythonOperator(task_id='red_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/red_3/red_3.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/red_3/red_3.dc;str'}]}, queue='process' ) blue_4 = PythonOperator(task_id='blue_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/blue_4/blue_4.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/blue_4/blue_4.dc;str'}]}, queue='process' ) sub_5_1 = PythonOperator(task_id='sub_5_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_035270a9d0cf_20180616T102019_20180616T102019_7_arrayelement.vrt', '/openeo_job/red_3/00000_1c53babb87c6_20180613T101019_20180613T101019_6_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_035270a9d0cf_20180616T102019_20180616T102019_7_arrayelement.vrt', './openeo_job/red_3/00000_1c53babb87c6_20180613T101019_20180613T101019_6_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) sub_5_2 = PythonOperator(task_id='sub_5_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_03643af8aa8e_20180613T101019_20180613T101019_6_arrayelement.vrt', '/openeo_job/red_3/00000_363b6b0ec1cb_20180616T102019_20180616T102019_7_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_03643af8aa8e_20180613T101019_20180613T101019_6_arrayelement.vrt', './openeo_job/red_3/00000_363b6b0ec1cb_20180616T102019_20180616T102019_7_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) sub_5_3 = PythonOperator(task_id='sub_5_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_496cc5cd9779_20180611T102021_20180611T102021_2_arrayelement.vrt', '/openeo_job/red_3/00000_3d1e1d50a2ee_20180608T101021_20180608T101021_1_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_496cc5cd9779_20180611T102021_20180611T102021_2_arrayelement.vrt', './openeo_job/red_3/00000_3d1e1d50a2ee_20180608T101021_20180608T101021_1_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) sub_5_4 = PythonOperator(task_id='sub_5_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_523c56a4de6a_20180621T102021_20180621T102021_4_arrayelement.vrt', '/openeo_job/red_3/00000_3dc5fbebbd63_20180611T102021_20180611T102021_2_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_523c56a4de6a_20180621T102021_20180621T102021_4_arrayelement.vrt', './openeo_job/red_3/00000_3dc5fbebbd63_20180611T102021_20180611T102021_2_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) sub_5_5 = PythonOperator(task_id='sub_5_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_7c73c9895e00_20180608T101021_20180608T101021_1_arrayelement.vrt', '/openeo_job/red_3/00000_98bd75c9088e_20180618T101021_20180618T101021_3_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_7c73c9895e00_20180608T101021_20180608T101021_1_arrayelement.vrt', './openeo_job/red_3/00000_98bd75c9088e_20180618T101021_20180618T101021_3_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) sub_5_6 = PythonOperator(task_id='sub_5_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_a6738d234104_20180618T101021_20180618T101021_3_arrayelement.vrt', '/openeo_job/red_3/00000_ec78f4613c4e_20180606T102019_20180606T102019_5_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_a6738d234104_20180618T101021_20180618T101021_3_arrayelement.vrt', './openeo_job/red_3/00000_ec78f4613c4e_20180606T102019_20180606T102019_5_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) sub_5_7 = PythonOperator(task_id='sub_5_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_b7ad0a7312af_20180606T102019_20180606T102019_5_arrayelement.vrt', '/openeo_job/red_3/00000_f5dc7de8aa79_20180621T102021_20180621T102021_4_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_b7ad0a7312af_20180606T102019_20180606T102019_5_arrayelement.vrt', './openeo_job/red_3/00000_f5dc7de8aa79_20180621T102021_20180621T102021_4_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) p1_6_1 = PythonOperator(task_id='p1_6_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/red_3/00000_1c53babb87c6_20180613T101019_20180613T101019_6_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/red_3/00000_1c53babb87c6_20180613T101019_20180613T101019_6_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p1_6_2 = PythonOperator(task_id='p1_6_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/red_3/00000_363b6b0ec1cb_20180616T102019_20180616T102019_7_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/red_3/00000_363b6b0ec1cb_20180616T102019_20180616T102019_7_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p1_6_3 = PythonOperator(task_id='p1_6_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/red_3/00000_3d1e1d50a2ee_20180608T101021_20180608T101021_1_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/red_3/00000_3d1e1d50a2ee_20180608T101021_20180608T101021_1_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p1_6_4 = PythonOperator(task_id='p1_6_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/red_3/00000_3dc5fbebbd63_20180611T102021_20180611T102021_2_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/red_3/00000_3dc5fbebbd63_20180611T102021_20180611T102021_2_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p1_6_5 = PythonOperator(task_id='p1_6_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/red_3/00000_98bd75c9088e_20180618T101021_20180618T101021_3_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/red_3/00000_98bd75c9088e_20180618T101021_20180618T101021_3_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p1_6_6 = PythonOperator(task_id='p1_6_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/red_3/00000_ec78f4613c4e_20180606T102019_20180606T102019_5_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/red_3/00000_ec78f4613c4e_20180606T102019_20180606T102019_5_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p1_6_7 = PythonOperator(task_id='p1_6_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/red_3/00000_f5dc7de8aa79_20180621T102021_20180621T102021_4_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/red_3/00000_f5dc7de8aa79_20180621T102021_20180621T102021_4_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p2_7_1 = PythonOperator(task_id='p2_7_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/blue_4/00000_16cbceddaa14_20180621T102021_20180621T102021_4_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/blue_4/00000_16cbceddaa14_20180621T102021_20180621T102021_4_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) p2_7_2 = PythonOperator(task_id='p2_7_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/blue_4/00000_181e7a50b679_20180613T101019_20180613T101019_6_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/blue_4/00000_181e7a50b679_20180613T101019_20180613T101019_6_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) p2_7_3 = PythonOperator(task_id='p2_7_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/blue_4/00000_21a0f7cba20c_20180606T102019_20180606T102019_5_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/blue_4/00000_21a0f7cba20c_20180606T102019_20180606T102019_5_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) p2_7_4 = PythonOperator(task_id='p2_7_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/blue_4/00000_255758d0dcb8_20180611T102021_20180611T102021_2_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/blue_4/00000_255758d0dcb8_20180611T102021_20180611T102021_2_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) p2_7_5 = PythonOperator(task_id='p2_7_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/blue_4/00000_2794d11ca08c_20180616T102019_20180616T102019_7_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/blue_4/00000_2794d11ca08c_20180616T102019_20180616T102019_7_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) p2_7_6 = PythonOperator(task_id='p2_7_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/blue_4/00000_2b3e5f9f89f7_20180608T101021_20180608T101021_1_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/blue_4/00000_2b3e5f9f89f7_20180608T101021_20180608T101021_1_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) p2_7_7 = PythonOperator(task_id='p2_7_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/blue_4/00000_79307f8c18cb_20180618T101021_20180618T101021_3_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/blue_4/00000_79307f8c18cb_20180618T101021_20180618T101021_3_arrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) sum_8_1 = PythonOperator(task_id='sum_8_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_035270a9d0cf_20180616T102019_20180616T102019_7_arrayelement.vrt', '/openeo_job/p1_6/00000_22b6f6d58b64_20180621T102021_20180621T102021_4_productarrayelement.vrt', '/openeo_job/p2_7/00000_1bd3c0f6c1e6_20180621T102021_20180621T102021_4_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_035270a9d0cf_20180616T102019_20180616T102019_7_arrayelement.vrt', './openeo_job/p1_6/00000_22b6f6d58b64_20180621T102021_20180621T102021_4_productarrayelement.vrt', './openeo_job/p2_7/00000_1bd3c0f6c1e6_20180621T102021_20180621T102021_4_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) sum_8_2 = PythonOperator(task_id='sum_8_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_03643af8aa8e_20180613T101019_20180613T101019_6_arrayelement.vrt', '/openeo_job/p1_6/00000_3e95e97fc24c_20180608T101021_20180608T101021_1_productarrayelement.vrt', '/openeo_job/p2_7/00000_532c57316eed_20180613T101019_20180613T101019_6_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_03643af8aa8e_20180613T101019_20180613T101019_6_arrayelement.vrt', './openeo_job/p1_6/00000_3e95e97fc24c_20180608T101021_20180608T101021_1_productarrayelement.vrt', './openeo_job/p2_7/00000_532c57316eed_20180613T101019_20180613T101019_6_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) sum_8_3 = PythonOperator(task_id='sum_8_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_496cc5cd9779_20180611T102021_20180611T102021_2_arrayelement.vrt', '/openeo_job/p1_6/00000_4ca0c207b34a_20180618T101021_20180618T101021_3_productarrayelement.vrt', '/openeo_job/p2_7/00000_999048ffaa6c_20180606T102019_20180606T102019_5_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_496cc5cd9779_20180611T102021_20180611T102021_2_arrayelement.vrt', './openeo_job/p1_6/00000_4ca0c207b34a_20180618T101021_20180618T101021_3_productarrayelement.vrt', './openeo_job/p2_7/00000_999048ffaa6c_20180606T102019_20180606T102019_5_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) sum_8_4 = PythonOperator(task_id='sum_8_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_523c56a4de6a_20180621T102021_20180621T102021_4_arrayelement.vrt', '/openeo_job/p1_6/00000_5ba2dfbc691a_20180606T102019_20180606T102019_5_productarrayelement.vrt', '/openeo_job/p2_7/00000_d0f6dfc15e93_20180608T101021_20180608T101021_1_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_523c56a4de6a_20180621T102021_20180621T102021_4_arrayelement.vrt', './openeo_job/p1_6/00000_5ba2dfbc691a_20180606T102019_20180606T102019_5_productarrayelement.vrt', './openeo_job/p2_7/00000_d0f6dfc15e93_20180608T101021_20180608T101021_1_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) sum_8_5 = PythonOperator(task_id='sum_8_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_7c73c9895e00_20180608T101021_20180608T101021_1_arrayelement.vrt', '/openeo_job/p1_6/00000_5fc1ab649cad_20180611T102021_20180611T102021_2_productarrayelement.vrt', '/openeo_job/p2_7/00000_ea413c394fb3_20180611T102021_20180611T102021_2_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_7c73c9895e00_20180608T101021_20180608T101021_1_arrayelement.vrt', './openeo_job/p1_6/00000_5fc1ab649cad_20180611T102021_20180611T102021_2_productarrayelement.vrt', './openeo_job/p2_7/00000_ea413c394fb3_20180611T102021_20180611T102021_2_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) sum_8_6 = PythonOperator(task_id='sum_8_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_a6738d234104_20180618T101021_20180618T101021_3_arrayelement.vrt', '/openeo_job/p1_6/00000_70debb07b030_20180613T101019_20180613T101019_6_productarrayelement.vrt', '/openeo_job/p2_7/00000_ea6cb4ea4ed1_20180616T102019_20180616T102019_7_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_a6738d234104_20180618T101021_20180618T101021_3_arrayelement.vrt', './openeo_job/p1_6/00000_70debb07b030_20180613T101019_20180613T101019_6_productarrayelement.vrt', './openeo_job/p2_7/00000_ea6cb4ea4ed1_20180616T102019_20180616T102019_7_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) sum_8_7 = PythonOperator(task_id='sum_8_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/nir_2/00000_b7ad0a7312af_20180606T102019_20180606T102019_5_arrayelement.vrt', '/openeo_job/p1_6/00000_a2f0363875a9_20180616T102019_20180616T102019_7_productarrayelement.vrt', '/openeo_job/p2_7/00000_f3a91a002a71_20180618T101021_20180618T101021_3_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/nir_2/00000_b7ad0a7312af_20180606T102019_20180606T102019_5_arrayelement.vrt', './openeo_job/p1_6/00000_a2f0363875a9_20180616T102019_20180616T102019_7_productarrayelement.vrt', './openeo_job/p2_7/00000_f3a91a002a71_20180618T101021_20180618T101021_3_productarrayelement.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) div_9_1 = PythonOperator(task_id='div_9_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/sub_5/00000_04ae61a7e121_20180606T102019_20180606T102019_5_subtractarrayelement.vrt', '/openeo_job/sum_8/00000_15c6cc47f3f1_20180611T102021_20180611T102021_2_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/sub_5/00000_04ae61a7e121_20180606T102019_20180606T102019_5_subtractarrayelement.vrt', './openeo_job/sum_8/00000_15c6cc47f3f1_20180611T102021_20180611T102021_2_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) div_9_2 = PythonOperator(task_id='div_9_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/sub_5/00000_2a4d9504ab87_20180618T101021_20180618T101021_3_subtractarrayelement.vrt', '/openeo_job/sum_8/00000_2c5b9546a0ea_20180608T101021_20180608T101021_1_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/sub_5/00000_2a4d9504ab87_20180618T101021_20180618T101021_3_subtractarrayelement.vrt', './openeo_job/sum_8/00000_2c5b9546a0ea_20180608T101021_20180608T101021_1_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) div_9_3 = PythonOperator(task_id='div_9_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/sub_5/00000_59ad59b97ba9_20180608T101021_20180608T101021_1_subtractarrayelement.vrt', '/openeo_job/sum_8/00000_2cf69366884d_20180606T102019_20180606T102019_5_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/sub_5/00000_59ad59b97ba9_20180608T101021_20180608T101021_1_subtractarrayelement.vrt', './openeo_job/sum_8/00000_2cf69366884d_20180606T102019_20180606T102019_5_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) div_9_4 = PythonOperator(task_id='div_9_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/sub_5/00000_7aa8667bd393_20180621T102021_20180621T102021_4_subtractarrayelement.vrt', '/openeo_job/sum_8/00000_5ed842fc9884_20180621T102021_20180621T102021_4_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/sub_5/00000_7aa8667bd393_20180621T102021_20180621T102021_4_subtractarrayelement.vrt', './openeo_job/sum_8/00000_5ed842fc9884_20180621T102021_20180621T102021_4_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) div_9_5 = PythonOperator(task_id='div_9_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/sub_5/00000_84a103b35221_20180613T101019_20180613T101019_6_subtractarrayelement.vrt', '/openeo_job/sum_8/00000_82dc6e872937_20180616T102019_20180616T102019_7_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/sub_5/00000_84a103b35221_20180613T101019_20180613T101019_6_subtractarrayelement.vrt', './openeo_job/sum_8/00000_82dc6e872937_20180616T102019_20180616T102019_7_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) div_9_6 = PythonOperator(task_id='div_9_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/sub_5/00000_88aec033b4cf_20180611T102021_20180611T102021_2_subtractarrayelement.vrt', '/openeo_job/sum_8/00000_a517711a5dab_20180618T101021_20180618T101021_3_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/sub_5/00000_88aec033b4cf_20180611T102021_20180611T102021_2_subtractarrayelement.vrt', './openeo_job/sum_8/00000_a517711a5dab_20180618T101021_20180618T101021_3_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) div_9_7 = PythonOperator(task_id='div_9_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/sub_5/00000_98ba4098d264_20180616T102019_20180616T102019_7_subtractarrayelement.vrt', '/openeo_job/sum_8/00000_c589879978fc_20180613T101019_20180613T101019_6_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/sub_5/00000_98ba4098d264_20180616T102019_20180616T102019_7_subtractarrayelement.vrt', './openeo_job/sum_8/00000_c589879978fc_20180613T101019_20180613T101019_6_sum.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) p3_10_1 = PythonOperator(task_id='p3_10_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/div_9/00000_3b19947b13bb_20180606T102019_20180606T102019_5_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/div_9/00000_3b19947b13bb_20180606T102019_20180606T102019_5_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) p3_10_2 = PythonOperator(task_id='p3_10_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/div_9/00000_3e23f7e4f34d_20180621T102021_20180621T102021_4_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/div_9/00000_3e23f7e4f34d_20180621T102021_20180621T102021_4_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) p3_10_3 = PythonOperator(task_id='p3_10_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/div_9/00000_524242e4a799_20180611T102021_20180611T102021_2_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/div_9/00000_524242e4a799_20180611T102021_20180611T102021_2_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) p3_10_4 = PythonOperator(task_id='p3_10_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/div_9/00000_5266d800c65a_20180618T101021_20180618T101021_3_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/div_9/00000_5266d800c65a_20180618T101021_20180618T101021_3_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) p3_10_5 = PythonOperator(task_id='p3_10_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/div_9/00000_59951e825c67_20180608T101021_20180608T101021_1_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/div_9/00000_59951e825c67_20180608T101021_20180608T101021_1_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) p3_10_6 = PythonOperator(task_id='p3_10_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/div_9/00000_ca61bc817d47_20180616T102019_20180616T102019_7_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/div_9/00000_ca61bc817d47_20180616T102019_20180616T102019_7_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) p3_10_7 = PythonOperator(task_id='p3_10_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/div_9/00000_d3ad28b41ec6_20180613T101019_20180613T101019_6_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/div_9/00000_d3ad28b41ec6_20180613T101019_20180613T101019_6_divide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) evi_1_1 = PythonOperator(task_id='evi_1_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/p3_10/00000_1469e3f374b4_20180621T102021_20180621T102021_4_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/p3_10/00000_1469e3f374b4_20180621T102021_20180621T102021_4_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) evi_1_2 = PythonOperator(task_id='evi_1_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/p3_10/00000_1934131d53d3_20180606T102019_20180606T102019_5_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/p3_10/00000_1934131d53d3_20180606T102019_20180606T102019_5_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) evi_1_3 = PythonOperator(task_id='evi_1_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/p3_10/00000_35e1ae6d20ab_20180611T102021_20180611T102021_2_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/p3_10/00000_35e1ae6d20ab_20180611T102021_20180611T102021_2_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) evi_1_4 = PythonOperator(task_id='evi_1_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/p3_10/00000_463ff9e0d738_20180608T101021_20180608T101021_1_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/p3_10/00000_463ff9e0d738_20180608T101021_20180608T101021_1_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) evi_1_5 = PythonOperator(task_id='evi_1_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/p3_10/00000_8095a5b816ba_20180618T101021_20180618T101021_3_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/p3_10/00000_8095a5b816ba_20180618T101021_20180618T101021_3_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) evi_1_6 = PythonOperator(task_id='evi_1_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/p3_10/00000_969296f4318d_20180613T101019_20180613T101019_6_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/p3_10/00000_969296f4318d_20180613T101019_20180613T101019_6_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) evi_1_7 = PythonOperator(task_id='evi_1_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/p3_10/00000_ec70dd22a2ba_20180616T102019_20180616T102019_7_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/p3_10/00000_ec70dd22a2ba_20180616T102019_20180616T102019_7_productdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) min_12 = PythonOperator(task_id='min_12', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': '/openeo_job/min_12/min_12.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'save_raster', 'in_place': 'True;bool', 'format_type': 'Gtiff'}, {'name': 'to_pickle', 'filepath': './openeo_job/min_12/min_12.dc;str'}]}, queue='process' ) mintime_11_1 = PythonOperator(task_id='mintime_11_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/min_12/00000_3ee1bc79269e_20180606T102019_20180621T102021_1_minproductdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/mintime_11/mintime_11.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/min_12/00000_3ee1bc79269e_20180606T102019_20180621T102021_1_minproductdivide.tif'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/mintime_11/mintime_11.dc;str'}]}, queue='process' ) save_13_1 = PythonOperator(task_id='save_13_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/openeo_job/mintime_11/00000_e95b1830aa89_20180606T102019_---------------_1_minproductdivide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/openeo_job/result/save_13.dc;str'}]}, + op_kwargs={'filepaths': ['./openeo_job/mintime_11/00000_e95b1830aa89_20180606T102019_---------------_1_minproductdivide.vrt'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/result/'}, {'name': 'save_raster'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './openeo_job/result/save_13.dc;str'}]}, queue='process' ) @@ -524,7 +524,7 @@ cancel_sensor = CancelOp(task_id='cancel_sensor', dag=dag, - stop_file='/openeo_job/STOP', + stop_file='./openeo_job/STOP', queue='sensor', ) diff --git a/tests/ref_jobs/dag_jb-12347_prep_ref.py b/tests/ref_jobs/dag_jb-12347_prep_ref.py index a42b241..0a6e404 100644 --- a/tests/ref_jobs/dag_jb-12347_prep_ref.py +++ b/tests/ref_jobs/dag_jb-12347_prep_ref.py @@ -24,98 +24,98 @@ dc_0 = PythonOperator(task_id='dc_0', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': '/openeo_job/dc_0/dc_0.dc;str'}]}, + op_kwargs={'filepaths': ['/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', '/s2a_prd_msil1c/2018/06/18/S2A_MSIL1C_20180618T101021_N0206_R022_T32TPS_20180618T135619.zip', '/s2a_prd_msil1c/2018/06/21/S2A_MSIL1C_20180621T102021_N0206_R065_T32TPS_20180621T140615.zip', '/s2b_prd_msil1c/2018/06/06/S2B_MSIL1C_20180606T102019_N0206_R065_T32TPS_20180606T172808.zip', '/s2b_prd_msil1c/2018/06/13/S2B_MSIL1C_20180613T101019_N0206_R022_T32TPS_20180613T122213.zip', '/s2b_prd_msil1c/2018/06/16/S2B_MSIL1C_20180616T102019_N0206_R065_T32TPS_20180616T154713.zip'], 'dc_filepaths': None, 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/dc_0/'}, {'name': 'filter_bands', 'bands': ['B08', 'B04', 'B02']}, {'name': 'crop', 'extent': (11.279182434082033, 46.464349400461145, 11.406898498535158, 46.522729291844286), 'crs': 'EPSG:4326'}, {'name': 'to_pickle', 'filepath': './openeo_job/dc_0/dc_0.dc;str'}]}, queue='process' ) nir_2 = PythonOperator(task_id='nir_2', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/nir_2/nir_2.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/nir_2/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '0;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/nir_2/nir_2.dc;str'}]}, queue='process' ) red_3 = PythonOperator(task_id='red_3', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/red_3/red_3.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/red_3/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '1;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/red_3/red_3.dc;str'}]}, queue='process' ) blue_4 = PythonOperator(task_id='blue_4', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/blue_4/blue_4.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/dc_0/dc_0.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/blue_4/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'array_element', 'index': '2;int'}}, {'name': 'to_pickle', 'filepath': './openeo_job/blue_4/blue_4.dc;str'}]}, queue='process' ) sub_5 = PythonOperator(task_id='sub_5', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sub_5/sub_5.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sub_5/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'subtract', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sub_5/sub_5.dc;str'}]}, queue='process' ) p1_6 = PythonOperator(task_id='p1_6', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p1_6/p1_6.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/red_3/red_3.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p1_6/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[6];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p1_6/p1_6.dc;str'}]}, queue='process' ) p2_7 = PythonOperator(task_id='p2_7', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p2_7/p2_7.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/blue_4/blue_4.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p2_7/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[-7.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p2_7/p2_7.dc;str'}]}, queue='process' ) sum_8 = PythonOperator(task_id='sum_8', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/nir_2/nir_2.dc', '/openeo_job/p1_6/p1_6.dc', '/openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/sum_8/sum_8.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/nir_2/nir_2.dc', './openeo_job/p1_6/p1_6.dc', './openeo_job/p2_7/p2_7.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/sum_8/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'sum', 'extra_values': '[10000];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/sum_8/sum_8.dc;str'}]}, queue='process' ) div_9 = PythonOperator(task_id='div_9', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/sub_5/sub_5.dc', '/openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/div_9/div_9.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/sub_5/sub_5.dc', './openeo_job/sum_8/sum_8.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/div_9/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'divide', 'y': 'set;str'}}, {'name': 'to_pickle', 'filepath': './openeo_job/div_9/div_9.dc;str'}]}, queue='process' ) p3_10 = PythonOperator(task_id='p3_10', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/p3_10/p3_10.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/div_9/div_9.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/p3_10/'}, {'name': 'reduce', 'dimension': 'band', 'f_input': {'f_name': 'product', 'extra_values': '[2.5];list'}}, {'name': 'to_pickle', 'filepath': './openeo_job/p3_10/p3_10.dc;str'}]}, queue='process' ) evi_1 = PythonOperator(task_id='evi_1', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/evi_1/evi_1.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/p3_10/p3_10.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/evi_1/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/evi_1/evi_1.dc;str'}]}, queue='process' ) min_12 = PythonOperator(task_id='min_12', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'to_pickle', 'filepath': '/openeo_job/min_12/min_12.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/evi_1/evi_1.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/min_12/'}, {'name': 'reduce', 'dimension': 'time', 'f_input': {'f_name': 'min'}}, {'name': 'to_pickle', 'filepath': './openeo_job/min_12/min_12.dc;str'}]}, queue='process' ) mintime_11 = PythonOperator(task_id='mintime_11', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': '/openeo_job/mintime_11/mintime_11.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/min_12/min_12.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/mintime_11/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'to_pickle', 'filepath': './openeo_job/mintime_11/mintime_11.dc;str'}]}, queue='process' ) save_13 = PythonOperator(task_id='save_13', dag=dag, python_callable=EODataProcessor, - op_kwargs={'filepaths': None, 'dc_filepaths': ['/openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': '/openeo_job/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': '/openeo_job/result/save_13.dc;str'}]}, + op_kwargs={'filepaths': None, 'dc_filepaths': ['./openeo_job/mintime_11/mintime_11.dc'], 'user_params': [{'name': 'set_output_folder', 'out_dirpath': './openeo_job/result/'}, {'name': 'save_raster', 'format_type': 'VRT'}, {'name': 'get_cube_metadata'}, {'name': 'to_pickle', 'filepath': './openeo_job/result/save_13.dc;str'}]}, queue='process' ) @@ -148,7 +148,7 @@ cancel_sensor = CancelOp(task_id='cancel_sensor', dag=dag, - stop_file='/openeo_job/STOP', + stop_file='./openeo_job/STOP', queue='sensor', ) @@ -177,7 +177,7 @@ def parallelise_dag(job_id, user_name, process_graph_json, job_data, process_def parallelise_dag = PythonOperator(task_id='parallelise_dag', dag=dag, python_callable=parallelise_dag, - op_kwargs = {'job_id': 'jb-12347', 'user_name': 'jdoe_67890', 'process_graph_json': {'process_graph': {'dc': {'process_id': 'load_collection', 'description': 'Loading the data; The order of the specified bands is important for the following reduce operation.', 'arguments': {'id': 's2%_prd_msil1c', 'spatial_extent': {'west': 11.279182434082033, 'east': 11.406898498535158, 'north': 46.522729291844286, 'south': 46.464349400461145}, 'temporal_extent': ['2018-06-04', '2018-06-23'], 'bands': ['B08', 'B04', 'B02']}}, 'evi': {'process_id': 'reduce_dimension', 'description': 'Compute the EVI. Formula: 2.5 * (NIR - RED) / (1 + NIR + 6*RED + -7.5*BLUE)', 'arguments': {'data': {'from_node': 'dc'}, 'dimension': 'spectral', 'reducer': {'process_graph': {'nir': {'process_id': 'array_element', 'arguments': {'data': {'from_parameter': 'data'}, 'index': 0}}, 'red': {'process_id': 'array_element', 'arguments': {'data': {'from_parameter': 'data'}, 'index': 1}}, 'blue': {'process_id': 'array_element', 'arguments': {'data': {'from_parameter': 'data'}, 'index': 2}}, 'sub': {'process_id': 'subtract', 'arguments': {'x': {'from_node': 'nir'}, 'y': {'from_node': 'red'}}}, 'p1': {'process_id': 'product', 'arguments': {'data': [6, {'from_node': 'red'}]}}, 'p2': {'process_id': 'product', 'arguments': {'data': [-7.5, {'from_node': 'blue'}]}}, 'sum': {'process_id': 'sum', 'arguments': {'data': [10000, {'from_node': 'nir'}, {'from_node': 'p1'}, {'from_node': 'p2'}]}}, 'div': {'process_id': 'divide', 'arguments': {'x': {'from_node': 'sub'}, 'y': {'from_node': 'sum'}}}, 'p3': {'process_id': 'product', 'arguments': {'data': [2.5, {'from_node': 'div'}]}, 'result': True}}}}}, 'mintime': {'process_id': 'reduce_dimension', 'description': 'Compute a minimum time composite by reducing the temporal dimension', 'arguments': {'data': {'from_node': 'evi'}, 'dimension': 'temporal', 'reducer': {'process_graph': {'min': {'process_id': 'min', 'arguments': {'data': {'from_parameter': 'data'}}, 'result': True}}}}}, 'save': {'process_id': 'save_result', 'arguments': {'data': {'from_node': 'mintime'}, 'format': 'Gtiff'}, 'result': True}}}, 'job_data': '/openeo_job', 'process_defs': [{'categories': ['math'], 'deprecated': False, 'description': 'Computes the absolute value of a real number `x`, which is the "unsigned" portion of x and often denoted as *|x|*.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 3.5}, {'arguments': {'x': -0.4}, 'returns': 0.4}, {'arguments': {'x': -3.5}, 'returns': 3.5}], 'exceptions': {}, 'experimental': False, 'id': 'absolute', 'links': [{'href': 'http://mathworld.wolfram.com/AbsoluteValue.html', 'rel': 'about', 'title': 'Absolute value explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'if': {'arguments': {'accept': {'from_node': 'multiply'}, 'reject': {'from_parameter': 'x'}, 'value': {'from_node': 'lt'}}, 'process_id': 'if', 'result': True}, 'lt': {'arguments': {'x': {'from_parameter': 'x'}, 'y': 0}, 'process_id': 'lt'}, 'multiply': {'arguments': {'x': {'from_parameter': 'x'}, 'y': -1}, 'process_id': 'multiply'}}, 'returns': {'description': 'The computed absolute value.', 'schema': {'minItems': 0, 'minimum': 0, 'type': ['number', 'null']}}, 'summary': 'Absolute value'}, {'categories': ['cubes'], 'deprecated': False, 'description': 'Adds a new named dimension to the data cube.\n\nAfterwards, the dimension can be referenced with the specified `name`. If a dimension with the specified name exists, the process fails with a `DimensionExists` error. The dimension label of the dimension is set to the specified `label`.', 'exceptions': {'DimensionExists': {'http': 400, 'message': 'A dimension with the specified name already exists.'}}, 'experimental': False, 'id': 'add_dimension', 'parameters': [{'deprecated': False, 'description': 'A data cube to add the dimension to.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'Name for the dimension.', 'experimental': False, 'name': 'name', 'optional': False, 'schema': {'minItems': 0, 'type': 'string'}}, {'deprecated': False, 'description': 'A dimension label.', 'experimental': False, 'name': 'label', 'optional': False, 'schema': [{'minItems': 0, 'type': 'number'}, {'minItems': 0, 'type': 'string'}]}, {'default': 'other', 'deprecated': False, 'description': 'The type of dimension, defaults to `other`.', 'experimental': False, 'name': 'type', 'optional': True, 'schema': {'enum': ['spatial', 'temporal', 'bands', 'other'], 'minItems': 0, 'type': 'string'}}], 'process_graph': {}, 'returns': {'description': 'The data cube with a newly added dimension. The new dimension has exactly one dimension label. All other dimensions remain unchanged.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Add a new dimension'}, {'categories': ['cubes'], 'deprecated': False, 'description': 'Applies a *unary* process to each pixel value in the data cube (i.e. a local operation). A unary process takes a single value and returns a single value, for example ``abs()`` or ``linear_scale_range()``. In contrast, the process ``apply_dimension()`` applies a process to all pixel values along a particular dimension.', 'exceptions': {}, 'experimental': False, 'id': 'apply', 'parameters': [{'deprecated': False, 'description': 'A data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'A unary process to be applied on each value, may consist of multiple sub-processes.', 'experimental': False, 'name': 'process', 'optional': False, 'schema': {'minItems': 0, 'parameters': [{'deprecated': False, 'description': 'The value to process.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'description': 'Any data type.', 'minItems': 0}}, {'deprecated': False, 'description': 'Additional data passed by the user.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'subtype': 'process-graph', 'type': 'object'}}, {'deprecated': False, 'description': 'Additional data to be passed to the process.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'process_graph': {}, 'returns': {'description': 'A data cube with the newly computed values and the same dimensions. The dimension properties (name, type, labels, reference system and resolution) remain unchanged.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Apply a process to each pixel'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc cosine of `x`. The arc cosine is the inverse function of the cosine so that *arccos(cos(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arccos', 'links': [{'href': 'http://mathworld.wolfram.com/InverseCosine.html', 'rel': 'about', 'title': 'Inverse cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse cosine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the inverse hyperbolic cosine of `x`. It is the inverse function of the hyperbolic cosine so that *arcosh(cosh(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arcosh', 'links': [{'href': 'http://mathworld.wolfram.com/InverseHyperbolicCosine.html', 'rel': 'about', 'title': 'Inverse hyperbolic cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse hyperbolic cosine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc sine of `x`. The arc sine is the inverse function of the sine so that *arcsin(sin(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arcsin', 'links': [{'href': 'http://mathworld.wolfram.com/InverseSine.html', 'rel': 'about', 'title': 'Inverse sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse sine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc tangent of `x`. The arc tangent is the inverse function of the tangent so that *arctan(tan(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arctan', 'links': [{'href': 'http://mathworld.wolfram.com/InverseTangent.html', 'rel': 'about', 'title': 'Inverse tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse tangent'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc tangent of two numbers `x` and `y`. It is similar to calculating the arc tangent of *y / x*, except that the signs of both arguments are used to determine the quadrant of the result.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`.', 'examples': [{'arguments': {'x': 0, 'y': 0}, 'returns': 0}, {'arguments': {'x': 1.5, 'y': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'arctan2', 'links': [{'href': 'https://en.wikipedia.org/wiki/Atan2', 'rel': 'about', 'title': 'Two-argument inverse tangent explained by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'A number to be used as dividend.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'A number to be used as divisor.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse tangent of two numbers'}, {'categories': ['arrays', 'reducer'], 'deprecated': False, 'description': 'Returns the element with the specified index or label from the array.\n\nEither the parameter `index` or `label` must be specified, otherwise the `ArrayElementParameterMissing` exception is thrown. If both parameters are set the `ArrayElementParameterConflict` exception is thrown.', 'examples': [{'arguments': {'data': [9, 8, 7, 6, 5], 'index': 2}, 'returns': 7}, {'arguments': {'data': ['A', 'B', 'C'], 'index': 0}, 'returns': 'A'}, {'arguments': {'data': [], 'index': 0, 'return_nodata': True}, 'returns': None}], 'exceptions': {'ArrayElementNotAvailable': {'http': 400, 'message': 'The array has no element with the specified index or label.'}, 'ArrayElementParameterConflict': {'http': 400, 'message': "The process 'array_element' only allows that either the 'index' or the 'labels' parameter is set."}, 'ArrayElementParameterMissing': {'http': 400, 'message': "The process 'array_element' requires either the 'index' or 'labels' parameter to be set."}}, 'experimental': False, 'id': 'array_element', 'parameters': [{'deprecated': False, 'description': 'An array.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'description': 'Any data type is allowed.'}, 'minItems': 0, 'type': 'array'}}, {'deprecated': False, 'description': 'The zero-based index of the element to retrieve.', 'experimental': False, 'name': 'index', 'optional': True, 'schema': {'minItems': 0, 'type': 'integer'}}, {'deprecated': False, 'description': 'The label of the element to retrieve.', 'experimental': False, 'name': 'label', 'optional': True, 'schema': [{'minItems': 0, 'type': 'number'}, {'minItems': 0, 'type': 'string'}]}, {'default': True, 'deprecated': False, 'description': 'By default this process throws an `ArrayElementNotAvailable` exception if the index or label is invalid. If you want to return `null` instead, set this flag to `true`.', 'experimental': False, 'name': 'return_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The value of the requested element.', 'schema': {'description': 'Any data type is allowed.', 'minItems': 0}}, 'summary': 'Get an element from an array'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the inverse hyperbolic sine of `x`. It is the inverse function of the hyperbolic sine so that *arsinh(sinh(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arsinh', 'links': [{'href': 'http://mathworld.wolfram.com/InverseHyperbolicSine.html', 'rel': 'about', 'title': 'Inverse hyperbolic sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse hyperbolic sine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the inverse hyperbolic tangent of `x`. It is the inverse function of the hyperbolic tangent so that *artanh(tanh(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'artanh', 'links': [{'href': 'http://mathworld.wolfram.com/InverseHyperbolicTangent.html', 'rel': 'about', 'title': 'Inverse hyperbolic tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse hyperbolic tangent'}, {'categories': ['math > rounding'], 'deprecated': False, 'description': 'The least integer greater than or equal to the number `x`.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 4}, {'arguments': {'x': -0.4}, 'returns': 0}, {'arguments': {'x': -3.5}, 'returns': -3}], 'exceptions': {}, 'experimental': False, 'id': 'ceil', 'links': [{'href': 'http://mathworld.wolfram.com/CeilingFunction.html', 'rel': 'about', 'title': 'Ceiling explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number to round up.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The number rounded up.', 'schema': {'minItems': 0, 'type': ['integer', 'null']}}, 'summary': 'Round fractions up'}, {'categories': ['math'], 'deprecated': False, 'description': 'Clips a number between specified minimum and maximum values. A value larger than the maximal value will have the maximal value, a value lower than minimal value will have the minimal value.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'max': 1, 'min': -1, 'x': -5}, 'returns': -1}, {'arguments': {'max': 10, 'min': 1, 'x': 10.001}, 'returns': 10}, {'arguments': {'max': 0.02, 'min': 0, 'x': 1e-06}, 'returns': 1e-06}, {'arguments': {'max': 1, 'min': 0, 'x': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'clip', 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'Minimum value. If the value is lower than this value, the process will return the value of this parameter.', 'experimental': False, 'name': 'min', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}, {'deprecated': False, 'description': 'Maximum value. If the value is greater than this value, the process will return the value of this parameter.', 'experimental': False, 'name': 'max', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}], 'process_graph': {'max': {'arguments': {'data': [{'from_parameter': 'min'}, {'from_node': 'min'}]}, 'process_id': 'max', 'result': True}, 'min': {'arguments': {'data': [{'from_parameter': 'max'}, {'from_parameter': 'x'}]}, 'process_id': 'min'}}, 'returns': {'description': 'The value clipped to the specified range.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Clip a value between a minimum and a maximum'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the cosine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 1}], 'exceptions': {}, 'experimental': False, 'id': 'cos', 'links': [{'href': 'http://mathworld.wolfram.com/Cosine.html', 'rel': 'about', 'title': 'Cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed cosine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Cosine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the hyperbolic cosine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 1}], 'exceptions': {}, 'experimental': False, 'id': 'cosh', 'links': [{'href': 'http://mathworld.wolfram.com/HyperbolicCosine.html', 'rel': 'about', 'title': 'Hyperbolic cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed hyperbolic cosine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Hyperbolic cosine'}, {'categories': ['math'], 'deprecated': False, 'description': 'Divides argument `x` by the argument `y` (*x / y*) and returns the computed result.\n\nNo-data values are taken into account so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it. Therefore, a division by zero results in ±infinity if the processing environment supports it. Otherwise a `DivisionByZero` error must the thrown.', 'examples': [{'arguments': {'x': 5, 'y': 2.5}, 'returns': 2}, {'arguments': {'x': -2, 'y': 4}, 'returns': -0.5}, {'arguments': {'x': 1, 'y': None}, 'returns': None}], 'exceptions': {'DivisionByZero': {'http': 400, 'message': 'Division by zero is not supported.'}}, 'experimental': False, 'id': 'divide', 'links': [{'href': 'http://mathworld.wolfram.com/Division.html', 'rel': 'about', 'title': 'Division explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'The dividend.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The divisor.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed result.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Division of two numbers'}, {'categories': ['math > constants', 'math > exponential & logarithmic'], 'deprecated': False, 'description': 'The real number *e* is a mathematical constant that is the base of the natural logarithm such that *ln(e) = 1*. The numerical value is approximately *2.71828*.', 'exceptions': {}, 'experimental': False, 'id': 'e', 'links': [{'href': 'http://mathworld.wolfram.com/e.html', 'rel': 'about', 'title': 'Mathematical constant e explained by Wolfram MathWorld'}], 'parameters': [], 'process_graph': {}, 'returns': {'description': "The numerical value of Euler's number.", 'schema': {'minItems': 0, 'type': 'number'}}, 'summary': "Euler's number (e)"}, {'categories': ['math > exponential & logarithmic'], 'deprecated': False, 'description': 'Exponential function to the base *e* raised to the power of `p`.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'p': 0}, 'returns': 1}, {'arguments': {'p': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'exp', 'links': [{'href': 'http://mathworld.wolfram.com/ExponentialFunction.html', 'rel': 'about', 'title': 'Exponential function explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'The numerical exponent.', 'experimental': False, 'name': 'p', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'e': {'arguments': {}, 'process_id': 'e'}, 'power': {'arguments': {'base': {'from_node': 'e'}, 'p': {'from_parameter': 'p'}}, 'process_id': 'power', 'result': True}}, 'returns': {'description': 'The computed value for *e* raised to the power of `p`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Exponentiation to the base e'}, {'categories': ['cubes', 'filter'], 'deprecated': False, 'description': "Filters the bands in the data cube so that bands that don't match any of the criteria are dropped from the data cube. The data cube is expected to have only one dimension of type `bands`. Fails with a `DimensionMissing` error if no such dimension exists.\n\nThe following criteria can be used to select bands:\n\n* `bands`: band name or common band name (e.g. `B01`, `B8A`, `red` or `nir`)\n* `wavelengths`: ranges of wavelengths in micrometres (μm) (e.g. 0.5 - 0.6)\n\nAll these information are exposed in the band metadata of the collection. To keep algorithms interoperable it is recommended to prefer the common bands names or the wavelengths over collection and/or back-end specific band names.\n\nIf multiple criteria are specified, any of them must match and not all of them, i.e. they are combined with an OR-operation. If no criteria is specified, the `BandFilterParameterMissing` exception must be thrown.\n\n**Important:** The order of the specified array defines the order of the bands in the data cube, which can be important for subsequent processes. If multiple bands are matched by a single criterion (e.g. a range of wavelengths), they stay in the original order.", 'exceptions': {'BandFilterParameterMissing': {'http': 400, 'message': "The process 'filter_bands' requires any of the parameters 'bands', 'common_names' or 'wavelengths' to be set."}, 'DimensionMissing': {'http': 400, 'message': 'A band dimension is missing.'}}, 'experimental': False, 'id': 'filter_bands', 'links': [{'href': 'https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#common-band-names', 'rel': 'about', 'title': 'List of common band names as specified by the STAC specification'}], 'parameters': [{'deprecated': False, 'description': 'A data cube with bands.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'default': '[]', 'deprecated': False, 'description': 'A list of band names. Either the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands). If unique band name and common name conflict, the unique band name has higher priority.\n\nThe order of the specified array defines the order of the bands in the data cube. If multiple bands match a common name, all matched bands are included in the original order.', 'experimental': False, 'name': 'bands', 'optional': True, 'schema': {'items': {'subtype': 'band-name', 'type': 'string'}, 'minItems': 0, 'type': 'array'}}, {'default': '[]', 'deprecated': False, 'description': 'A list of sub-lists with each sub-list consisting of two elements. The first element is the minimum wavelength and the second element is the maximum wavelength. Wavelengths are specified in micrometres (μm).\n\nThe order of the specified array defines the order of the bands in the data cube. If multiple bands match the wavelengths, all matched bands are included in the original order.', 'experimental': False, 'name': 'wavelengths', 'optional': True, 'schema': {'items': {'examples': [[[0.45, 0.5], [0.6, 0.7]]], 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'type': 'array'}, 'minItems': 0, 'type': 'array'}}], 'process_graph': {}, 'returns': {'description': 'A data cube limited to a subset of its original bands. The dimensions and dimension properties (name, type, labels, reference system and resolution) remain unchanged, except that the dimension of type `bands` has less (or the same) dimension labels.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Filter the bands by name'}, {'categories': ['cubes', 'filter'], 'deprecated': False, 'description': 'Limits the data cube to the specified bounding box.\n\nThe filter retains a pixel in the data cube if the point at the pixel center intersects with the bounding box (as defined in the Simple Features standard by the OGC).', 'exceptions': {}, 'experimental': False, 'id': 'filter_bbox', 'links': [{'href': 'https://proj.org/usage/projections.html', 'rel': 'about', 'title': 'PROJ parameters for cartographic projections'}, {'href': 'http://www.epsg-registry.org', 'rel': 'about', 'title': 'Official EPSG code registry'}, {'href': 'http://www.epsg.io', 'rel': 'about', 'title': 'Unofficial EPSG code database'}, {'href': 'http://www.opengeospatial.org/standards/sfa', 'rel': 'about', 'title': 'Simple Features standard by the OGC'}], 'parameters': [{'deprecated': False, 'description': 'A data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'A bounding box, which may include a vertical axis (see `base` and `height`).', 'experimental': False, 'name': 'extent', 'optional': False, 'schema': {'minItems': 0, 'properties': {'base': {'default': None, 'description': 'Base (optional, lower left corner, coordinate axis 3).', 'type': ['number', 'null']}, 'crs': {'anyOf': [{'examples': [3857], 'minimum': 1000, 'subtype': 'epsg-code', 'title': 'EPSG Code', 'type': 'integer'}, {'subtype': 'wkt2-definition', 'title': 'WKT2', 'type': 'string'}, {'deprecated': True, 'subtype': 'proj-definition', 'title': 'PROJ definition', 'type': 'string'}], 'default': 4326, 'description': 'Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/), [WKT2 (ISO 19162) string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html) or [PROJ definition (deprecated)](https://proj.org/usage/quickstart.html). Defaults to `4326` (EPSG code 4326) unless the client explicitly requests a different coordinate reference system.'}, 'east': {'description': 'East (upper right corner, coordinate axis 1).', 'type': 'number'}, 'height': {'default': None, 'description': 'Height (optional, upper right corner, coordinate axis 3).', 'type': ['number', 'null']}, 'north': {'description': 'North (upper right corner, coordinate axis 2).', 'type': 'number'}, 'south': {'description': 'South (lower left corner, coordinate axis 2).', 'type': 'number'}, 'west': {'description': 'West (lower left corner, coordinate axis 1).', 'type': 'number'}}, 'required': ['west', 'south', 'east', 'north'], 'subtype': 'bounding-box', 'type': 'object'}}], 'process_graph': {}, 'returns': {'description': 'A data cube restricted to the bounding box. The dimensions and dimension properties (name, type, labels, reference system and resolution) remain unchanged, except that the spatial dimensions have less (or the same) dimension labels.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Spatial filter using a bounding box'}, {'categories': ['math > rounding'], 'deprecated': False, 'description': 'The greatest integer less than or equal to the number `x`.\n\nThis process is *not* an alias for the ``int()`` process as defined by some mathematicians, see the examples for negative numbers in both processes for differences.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 3}, {'arguments': {'x': -0.4}, 'returns': -1}, {'arguments': {'x': -3.5}, 'returns': -4}], 'exceptions': {}, 'experimental': False, 'id': 'floor', 'links': [{'href': 'http://mathworld.wolfram.com/FloorFunction.html', 'rel': 'about', 'title': 'Floor explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number to round down.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The number rounded down.', 'schema': {'minItems': 0, 'type': ['integer', 'null']}}, 'summary': 'Round fractions down'}, {'categories': ['math', 'math > rounding'], 'deprecated': False, 'description': 'The integer part of the real number `x`.\n\nThis process is *not* an alias for the ``floor()`` process as defined by some mathematicians, see the examples for negative numbers in both processes for differences.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 3}, {'arguments': {'x': -0.4}, 'returns': 0}, {'arguments': {'x': -3.5}, 'returns': -3}], 'exceptions': {}, 'experimental': False, 'id': 'int', 'links': [{'href': 'http://mathworld.wolfram.com/IntegerPart.html', 'rel': 'about', 'title': 'Integer Part explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'Integer part of the number.', 'schema': {'minItems': 0, 'type': ['integer', 'null']}}, 'summary': 'Integer part of a number'}, {'categories': ['math'], 'deprecated': False, 'description': 'Performs a linear transformation between the input and output range.\n\nThe given number in `x` is clipped to the bounds specified in `inputMin` and `inputMax` so that the underlying formula *((x - inputMin) / (inputMax - inputMin)) * (outputMax - outputMin) + outputMin* never returns any value lower than `outputMin` or greater than `outputMax`.\n\nPotential use case include\n\n* scaling values to the 8-bit range (0 - 255) often used for numeric representation of values in one of the channels of the [RGB colour model](https://en.wikipedia.org/wiki/RGB_color_model#Numeric_representations) or\n* calculating percentages (0 - 100).\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'inputMax': 1, 'inputMin': -1, 'outputMax': 255, 'outputMin': 0, 'x': 0.3}, 'returns': 165.75}, {'arguments': {'inputMax': 255, 'inputMin': 0, 'x': 25.5}, 'returns': 0.1}, {'arguments': {'inputMax': 100, 'inputMin': 0, 'x': None}, 'returns': None}, {'arguments': {'inputMax': 1, 'inputMin': 0, 'outputMax': 255, 'outputMin': 0, 'x': 1.12}, 'description': 'Shows that the input data is clipped.', 'returns': 255}], 'exceptions': {}, 'experimental': False, 'id': 'linear_scale_range', 'parameters': [{'deprecated': False, 'description': 'A number to transform. The number gets clipped to the bounds specified in `inputMin` and `inputMax`.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'Minimum value the input can obtain.', 'experimental': False, 'name': 'inputMin', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}, {'deprecated': False, 'description': 'Maximum value the input can obtain.', 'experimental': False, 'name': 'inputMax', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}, {'default': 0, 'deprecated': False, 'description': 'Minimum value of the desired output range.', 'experimental': False, 'name': 'outputMin', 'optional': True, 'schema': {'minItems': 0, 'type': 'number'}}, {'default': 1, 'deprecated': False, 'description': 'Maximum value of the desired output range.', 'experimental': False, 'name': 'outputMax', 'optional': True, 'schema': {'minItems': 0, 'type': 'number'}}], 'process_graph': {'add': {'arguments': {'x': {'from_node': 'multiply'}, 'y': {'from_parameter': 'outputMin'}}, 'process_id': 'add', 'result': True}, 'divide': {'arguments': {'x': {'from_node': 'subtract1'}, 'y': {'from_node': 'subtract2'}}, 'process_id': 'divide'}, 'multiply': {'arguments': {'x': {'from_node': 'divide'}, 'y': {'from_node': 'subtract3'}}, 'process_id': 'multiply'}, 'subtract1': {'arguments': {'x': {'from_parameter': 'x'}, 'y': {'from_parameter': 'inputMin'}}, 'process_id': 'subtract'}, 'subtract2': {'arguments': {'x': {'from_parameter': 'inputMax'}, 'y': {'from_parameter': 'inputMin'}}, 'process_id': 'subtract'}, 'subtract3': {'arguments': {'x': {'from_parameter': 'outputMax'}, 'y': {'from_parameter': 'outputMin'}}, 'process_id': 'subtract'}}, 'returns': {'description': 'The transformed number.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Linear transformation between two ranges'}, {'categories': ['math > exponential & logarithmic'], 'deprecated': False, 'description': 'The natural logarithm is the logarithm to the base *e* of the number `x`, which equals to using the *log* process with the base set to *e*. The natural logarithm is the inverse function of taking *e* to the power x.\n\nThe no-data value `null` is passed through.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it. Therefore, `ln(0)` results in ±infinity if the processing environment supports it or otherwise an error is thrown.', 'examples': [{'arguments': {'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'ln', 'links': [{'href': 'http://mathworld.wolfram.com/NaturalLogarithm.html', 'rel': 'about', 'title': 'Natural logarithm explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'A number to compute the natural logarithm for.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'e': {'arguments': {}, 'process_id': 'e'}, 'log': {'arguments': {'base': {'from_node': 'e'}, 'x': {'from_parameter': 'x'}}, 'process_id': 'log', 'result': True}}, 'returns': {'description': 'The computed natural logarithm.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Natural logarithm'}, {'categories': ['cubes', 'import'], 'deprecated': False, 'description': 'Loads a collection from the current back-end by its id and returns it as processable data cube. The data that is added to the data cube can be restricted with the additional `spatial_extent`, `temporal_extent`, `bands` and `properties`.\n\n**Remarks:**\n\n* The bands (and all dimensions that specify nominal dimension labels) are expected to be ordered as specified in the metadata if the `bands` parameter is set to `null`.\n* If no additional parameter is specified this would imply that the whole data set is expected to be loaded. Due to the large size of many data sets this is not recommended and may be optimized by back-ends to only load the data that is actually required after evaluating subsequent processes such as filters. This means that the pixel values should be processed only after the data has been limited to the required extents and as a consequence also to a manageable size.', 'examples': [{'arguments': {'id': 'Sentinel-2', 'properties': {'eo:cloud_cover': {'process_graph': {'cc': {'arguments': {'max': 50, 'min': 0, 'x': {'from_parameter': 'value'}}, 'process_id': 'between', 'result': True}}}, 'platform': {'process_graph': {'pf': {'arguments': {'case_sensitive': False, 'x': {'from_parameter': 'value'}, 'y': 'Sentinel-2B'}, 'process_id': 'eq', 'result': True}}}}, 'spatial_extent': {'east': 16.6, 'north': 48.6, 'south': 47.2, 'west': 16.1}, 'temporal_extent': ['2018-01-01', '2019-01-01']}, 'description': 'Loading `Sentinel-2B` data from a `Sentinel-2` collection for 2018, but only with cloud cover between 0 and 50%.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'load_collection', 'links': [{'href': 'https://proj.org/usage/projections.html', 'rel': 'about', 'title': 'PROJ parameters for cartographic projections'}, {'href': 'http://www.epsg-registry.org', 'rel': 'about', 'title': 'Official EPSG code registry'}, {'href': 'http://www.epsg.io', 'rel': 'about', 'title': 'Unofficial EPSG code database'}, {'href': 'http://www.opengeospatial.org/standards/sfa', 'rel': 'about', 'title': 'Simple Features standard by the OGC'}, {'href': 'https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#common-band-names', 'rel': 'about', 'title': 'List of common band names as specified by the STAC specification'}], 'parameters': [{'deprecated': False, 'description': 'The collection id.', 'experimental': False, 'name': 'id', 'optional': False, 'schema': {'minItems': 0, 'pattern': '^[\\w\\-\\.~/]+$', 'subtype': 'collection-id', 'type': 'string'}}, {'deprecated': False, 'description': 'Limits the data to load from the collection to the specified bounding box or polygons.\n\nThe process puts a pixel into the data cube if the point at the pixel center intersects with the bounding box or any of the polygons (as defined in the Simple Features standard by the OGC).\n\nThe GeoJSON can be one of the following GeoJSON types:\n\n* A `Polygon` geometry,\n* a `GeometryCollection` containing Polygons,\n* a `Feature` with a `Polygon` geometry or\n* a `FeatureCollection` containing `Feature`s with a `Polygon` geometry.\n\nSet this parameter to `null` to set no limit for the spatial extent. Be careful with this when loading large datasets!', 'experimental': False, 'name': 'spatial_extent', 'optional': False, 'schema': [{'minItems': 0, 'properties': {'base': {'default': None, 'description': 'Base (optional, lower left corner, coordinate axis 3).', 'type': ['number', 'null']}, 'crs': {'anyOf': [{'examples': [3857], 'minimum': 1000, 'subtype': 'epsg-code', 'title': 'EPSG Code', 'type': 'integer'}, {'subtype': 'wkt2-definition', 'title': 'WKT2', 'type': 'string'}, {'deprecated': True, 'subtype': 'proj-definition', 'title': 'PROJ definition', 'type': 'string'}], 'default': 4326, 'description': 'Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/), [WKT2 (ISO 19162) string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html) or [PROJ definition (deprecated)](https://proj.org/usage/quickstart.html). Defaults to `4326` (EPSG code 4326) unless the client explicitly requests a different coordinate reference system.'}, 'east': {'description': 'East (upper right corner, coordinate axis 1).', 'type': 'number'}, 'height': {'default': None, 'description': 'Height (optional, upper right corner, coordinate axis 3).', 'type': ['number', 'null']}, 'north': {'description': 'North (upper right corner, coordinate axis 2).', 'type': 'number'}, 'south': {'description': 'South (lower left corner, coordinate axis 2).', 'type': 'number'}, 'west': {'description': 'West (lower left corner, coordinate axis 1).', 'type': 'number'}}, 'required': ['west', 'south', 'east', 'north'], 'subtype': 'bounding-box', 'title': 'Bounding Box', 'type': 'object'}, {'minItems': 0, 'subtype': 'geojson', 'title': 'GeoJSON', 'type': 'object'}, {'description': "Don't filter spatially. All data is included in the data cube.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}, {'deprecated': False, 'description': 'Limits the data by metadata properties to include only data in the data cube which all given conditions return `true` for (AND operation).\n\nSpecify key-value-pairs with the key being the name of the metadata property, which can be retrieved with the openEO Data Discovery for Collections. The value must a condition (user-defined process) to be evaluated against the collection metadata, see the example.', 'experimental': False, 'name': 'properties', 'optional': True, 'schema': [{'additionalProperties': {'parameters': [{'description': 'The property value to be checked against.', 'name': 'value', 'schema': {'description': 'Any data type.'}}], 'subtype': 'process-graph', 'type': 'object'}, 'description': 'A list of filters to check against. Specify key-value-pairs with the key being the name of the metadata property name and the value being a process evaluated against the metadata values.', 'minItems': 0, 'subtype': 'metadata-filter', 'title': 'Filters', 'type': 'object'}, {'description': "Don't filter by metadata properties.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}, {'deprecated': False, 'description': 'Limits the data to load from the collection to the specified left-closed temporal interval. Applies to all temporal dimensions. The interval has to be specified as an array with exactly two elements:\n\n1. The first element is the start of the temporal interval. The specified instance in time is **included** in the interval.\n2. The second element is the end of the temporal interval. The specified instance in time is **excluded** from the interval.\n\nThe specified temporal strings follow [RFC 3339](https://tools.ietf.org/html/rfc3339). Also supports open intervals by setting one of the boundaries to `null`, but never both.\n\nSet this parameter to `null` to set no limit for the spatial extent. Be careful with this when loading large datasets!', 'experimental': False, 'name': 'temporal_extent', 'optional': False, 'schema': [{'examples': [['2015-01-01T00:00:00Z', '2016-01-01T00:00:00Z'], ['2015-01-01', '2016-01-01']], 'items': {'anyOf': [{'format': 'date-time', 'subtype': 'date-time', 'type': 'string'}, {'format': 'date', 'subtype': 'date', 'type': 'string'}, {'maxLength': 4, 'minLength': 4, 'pattern': '^\\d{4}$', 'subtype': 'year', 'type': 'string'}, {'type': 'null'}]}, 'maxItems': 2, 'minItems': 2, 'subtype': 'temporal-interval', 'type': 'array'}, {'description': "Don't filter temporally. All data is included in the data cube.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}, {'deprecated': False, 'description': "Only adds the specified bands into the data cube so that bands that don't match the list of band names are not available. Applies to all dimensions of type `bands`.\n\nEither the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands) can be specified. If unique band name and common name conflict, the unique band name has higher priority.\n\nThe order of the specified array defines the order of the bands in the data cube. f multiple bands match a common name, all matched bands are included in the original order.", 'experimental': False, 'name': 'bands', 'optional': True, 'schema': [{'items': {'subtype': 'band-name', 'type': 'string'}, 'minItems': 0, 'type': 'array'}, {'description': "Don't filter bands. All bands are included in the data cube.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}], 'process_graph': {}, 'returns': {'description': "A data cube for further processing. The dimensions and dimension properties (name, type, labels, reference system and resolution) correspond to the collection's metadata, but the dimension labels are restricted as specified in the parameters.", 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Load a collection'}, {'categories': ['math > exponential & logarithmic'], 'deprecated': False, 'description': 'Logarithm to the base `base` of the number `x` is defined to be the inverse function of taking b to the power of x.\n\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it. Therefore, `log(0, 2)` results in ±infinity if the processing environment supports it or otherwise an error is thrown.', 'examples': [{'arguments': {'base': 10, 'x': 10}, 'returns': 1}, {'arguments': {'base': 2, 'x': 2}, 'returns': 1}, {'arguments': {'base': 2, 'x': 4}, 'returns': 2}, {'arguments': {'base': 16, 'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'log', 'links': [{'href': 'http://mathworld.wolfram.com/Logarithm.html', 'rel': 'about', 'title': 'Logarithm explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'A number to compute the logarithm for.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The numerical base.', 'experimental': False, 'name': 'base', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed logarithm.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Logarithm to a base'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the largest value of an array of numbers, which is is equal to the first element of a sorted (i.e., ordered) version the array.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [1, 0, 3, 2]}, 'returns': 3}, {'arguments': {'data': [5, 2.5, None, -0.7]}, 'returns': 5}, {'arguments': {'data': [1, 0, 3, None, 2], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'max', 'links': [{'href': 'http://mathworld.wolfram.com/Maximum.html', 'rel': 'about', 'title': 'Maximum explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The maximum value.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Maximum value'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'The arithmetic mean of an array of numbers is the quantity commonly called the average. It is defined as the sum of all elements divided by the number of elements.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [1, 0, 3, 2]}, 'returns': 1.5}, {'arguments': {'data': [9, 2.5, None, -2.5]}, 'returns': 3}, {'arguments': {'data': [1, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}, {'arguments': {'data': [None, None]}, 'description': 'The input array has only `null` elements: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'mean', 'links': [{'href': 'http://mathworld.wolfram.com/ArithmeticMean.html', 'rel': 'about', 'title': 'Arithmetic mean explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'count': {'arguments': {'condition': {'from_node': 'count_condition'}, 'data': {'from_parameter': 'data'}}, 'process_id': 'count'}, 'count_condition': {'arguments': {'accept': None, 'reject': True, 'value': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'if'}, 'divide': {'arguments': {'x': {'from_node': 'sum'}, 'y': {'from_node': 'count'}}, 'process_id': 'divide'}, 'if': {'arguments': {'accept': {'from_node': 'divide'}, 'value': {'from_node': 'neq'}}, 'process_id': 'if', 'result': True}, 'neq': {'arguments': {'x': {'from_node': 'count'}, 'y': 0}, 'process_id': 'neq'}, 'sum': {'arguments': {'data': {'from_parameter': 'data'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'sum'}}, 'returns': {'description': 'The computed arithmetic mean.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Arithmetic mean (average)'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'The statistical median of an array of numbers is the value separating the higher half from the lower half of the data.\n\nAn array without non-`null` elements resolves always with `null`.\n\n**Remarks:**\n\n* For a symmetric arrays, the result is equal to the ``mean()``.\n* The median can also be calculated by computing the ``quantiles()`` with a probability of *0.5*.', 'examples': [{'arguments': {'data': [1, 3, 3, 6, 7, 8, 9]}, 'returns': 6}, {'arguments': {'data': [1, 2, 3, 4, 5, 6, 8, 9]}, 'returns': 4.5}, {'arguments': {'data': [-1, -0.5, None, 1]}, 'returns': -0.5}, {'arguments': {'data': [-1, 0, None, 1], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}, {'arguments': {'data': [None, None]}, 'description': 'The input array has only `null` elements: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'median', 'links': [{'href': 'http://mathworld.wolfram.com/StatisticalMedian.html', 'rel': 'about', 'title': 'Statistical Median explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'array_element': {'arguments': {'data': {'from_node': 'quantiles'}, 'index': 0, 'return_nodata': True}, 'process_id': 'array_element', 'result': True}, 'quantiles': {'arguments': {'data': {'from_parameter': 'data'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}, 'probabilities': [0.5]}, 'process_id': 'quantiles'}}, 'returns': {'description': 'The computed statistical median.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Statistical median'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the smallest value of an array of numbers, which is is equal to the last element of a sorted (i.e., ordered) version the array.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [1, 0, 3, 2]}, 'returns': 0}, {'arguments': {'data': [5, 2.5, None, -0.7]}, 'returns': -0.7}, {'arguments': {'data': [1, 0, 3, None, 2], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'min', 'links': [{'href': 'http://mathworld.wolfram.com/Minimum.html', 'rel': 'about', 'title': 'Minimum explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The minimum value.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Minimum value'}, {'categories': ['math'], 'deprecated': False, 'description': 'Remainder after division of `x` by `y` for both integers and floating-point numbers.\n\nThe result of a modulo operation has the sign of the divisor. The handling regarding the sign of the result [differs between programming languages](https://en.wikipedia.org/wiki/Modulo_operation#In_programming_languages) and needs careful consideration to avoid unexpected results.\n\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`. A modulo by zero results in ±infinity if the processing environment supports it. Otherwise a `DivisionByZero` error must the thrown.', 'examples': [{'arguments': {'x': 27, 'y': 5}, 'returns': 2}, {'arguments': {'x': -27, 'y': 5}, 'returns': 3}, {'arguments': {'x': 3.14, 'y': -2}, 'returns': -0.86}, {'arguments': {'x': -27, 'y': -5}, 'returns': -2}, {'arguments': {'x': 27, 'y': None}, 'returns': None}, {'arguments': {'x': None, 'y': 5}, 'returns': None}], 'exceptions': {'DivisionByZero': {'http': 400, 'message': 'Division by zero is not supported.'}}, 'experimental': False, 'id': 'mod', 'links': [{'href': 'https://en.wikipedia.org/wiki/Modulo_operation', 'rel': 'about', 'title': 'Modulo explained by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'A number to be used as dividend.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'A number to be used as divisor.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The remainder after division.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Modulo'}, {'categories': ['cubes'], 'deprecated': False, 'description': 'The data cubes have to be compatible. A merge operation without overlap should be reversible with (a set of) filter operations for each of the two cubes. The process performs the join on overlapping dimensions, with the same name and type.\n\nAn overlapping dimension has the same name, type, reference system and resolution in both dimensions, but can have different labels. One of the dimensions can have different labels, for all other dimensions the labels must be equal. If data overlaps, the parameter `overlap_resolver` must be specified to resolve the overlap.\n\n**Examples for merging two data cubes:**\n\n1. Data cubes with the dimensions `x`, `y`, `t` and `bands` have the same dimension labels in `x`,`y` and `t`, but the labels for the dimension `bands` are `B1` and `B2` for the first cube and `B3` and `B4`. An overlap resolver is *not needed*. The merged data cube has the dimensions `x`, `y`, `t` and `bands` and the dimension `bands` has four dimension labels: `B1`, `B2`, `B3`, `B4`.\n2. Data cubes with the dimensions `x`, `y`, `t` and `bands` have the same dimension labels in `x`,`y` and `t`, but the labels for the dimension `bands` are `B1` and `B2` for the first data cube and `B2` and `B3` for the second. An overlap resolver is *required* to resolve overlap in band `B2`. The merged data cube has the dimensions `x`, `y`, `t` and `bands` and the dimension `bands` has three dimension labels: `B1`, `B2`, `B3`.\n3. Data cubes with the dimensions `x`, `y` and `t` have the same dimension labels in `x`,`y` and `t`. There are two options:\n 1. Keep the overlapping values separately in the merged data cube: An overlap resolver is *not needed*, but for each data cube you need to add a new dimension using ``add_dimension()``. The new dimensions must be equal, except that the labels for the new dimensions must differ by name. The merged data cube has the same dimensions and labels as the original data cubes, plus the dimension added with ``add_dimension()``, which has the two dimension labels after the merge.\n 2. Combine the overlapping values into a single value: An overlap resolver is *required* to resolve the overlap for all pixels. The merged data cube has the same dimensions and labels as the original data cubes, but all pixel values have been processed by the overlap resolver.\n4. Merging a data cube with dimensions `x`, `y`, `t` with another cube with dimensions `x`, `y` will join on the `x`, `y` dimension, so the lower dimension cube is merged with each time step in the higher dimensional cube. This can for instance be used to apply a digital elevation model to a spatiotemporal data cube.', 'exceptions': {'OverlapResolverMissing': {'http': 400, 'message': 'Overlapping data cubes, but no overlap resolver has been specified.'}}, 'experimental': False, 'id': 'merge_cubes', 'links': [{'href': 'https://en.wikipedia.org/wiki/Reduction_Operator', 'rel': 'about', 'title': 'Background information on reduction operators (binary reducers) by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'The first data cube.', 'experimental': False, 'name': 'cube1', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'The second data cube.', 'experimental': False, 'name': 'cube2', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'A reduction operator that resolves the conflict if the data overlaps. The reducer must return a value of the same data type as the input values are. The reduction operator may be a single process such as ``multiply()`` or consist of multiple sub-processes. `null` (the default) can be specified if no overlap resolver is required.', 'experimental': False, 'name': 'overlap_resolver', 'optional': True, 'schema': {'minItems': 0, 'parameters': [{'deprecated': False, 'description': 'The first value.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'description': 'Any data type.', 'minItems': 0}}, {'deprecated': False, 'description': 'The second value.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'description': 'Any data type.', 'minItems': 0}}, {'deprecated': False, 'description': 'Additional data passed by the user.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'subtype': 'process-graph', 'type': 'object'}}, {'deprecated': False, 'description': 'Additional data to be passed to the overlap resolver.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'process_graph': {}, 'returns': {'description': 'The merged data cube. See the process description for details regarding the dimensions and dimension properties (name, type, labels, reference system and resolution).', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Merging two data cubes'}, {'categories': ['math'], 'deprecated': False, 'description': 'Multiplies the two numbers `x` and `y` (*x * y*) and returns the computed product.\n\nNo-data values are taken into account so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'x': 5, 'y': 2.5}, 'returns': 12.5}, {'arguments': {'x': -2, 'y': -4}, 'returns': 8}, {'arguments': {'x': 1, 'y': None}, 'returns': None}], 'exceptions': {'MultiplicandMissing': {'http': 400, 'message': 'Multiplication requires at least two numbers.'}}, 'experimental': False, 'id': 'multiply', 'links': [{'href': 'http://mathworld.wolfram.com/Product.html', 'rel': 'about', 'title': 'Product explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'The multiplier.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The multiplicand.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'product': {'arguments': {'data': [{'from_parameter': 'x'}, {'from_parameter': 'y'}], 'ignore_nodata': False}, 'process_id': 'product', 'result': True}}, 'returns': {'description': 'The computed product of the two numbers.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Multiplication of two numbers'}, {'categories': ['math > indices', 'vegetation indices'], 'deprecated': False, 'description': "Computes the Normalized Difference Vegetation Index (NDVI). The NDVI is computed as *(nir - red) / (nir + red)*.\n\nThe `data` parameter expects a raster data cube with a dimension of type `bands` or a `DimensionAmbiguous` error is thrown otherwise. By default, the dimension must have at least two bands with the common names `red` and `nir` assigned or the user need to specify the parameters `nir` and `red`. Otherwise either the error `NirBandAmbiguous` or `RedBandAmbiguous` is thrown. The common names for each band are specified in the collection's band metadata and are *not* equal to the band names.\n\nBy default, the dimension of type `bands` is dropped by this process. To keep the dimension specify a new band name in the parameter `target_band`. This adds a new dimension label with the specified name to the dimension, which can be used to access the computed values. If a band with the specified name exists, a `BandExists` is thrown.\n\nThis process is very similar to the process ``normalized_difference()``, but determines the bands automatically based on the common names (`red`/`nir`) specified in the metadata.", 'exceptions': {'BandExists': {'http': 400, 'message': 'A band with the specified target name exists.'}, 'DimensionAmbiguous': {'http': 400, 'message': 'dimension of type `bands` is not available or is ambiguous..'}, 'NirBandAmbiguous': {'http': 400, 'message': "The NIR band can't be resolved, please specify a band name."}, 'RedBandAmbiguous': {'http': 400, 'message': "The red band can't be resolved, please specify a band name."}}, 'experimental': False, 'id': 'ndvi', 'links': [{'href': 'https://en.wikipedia.org/wiki/Normalized_difference_vegetation_index', 'rel': 'about', 'title': 'NDVI explained by Wikipedia'}, {'href': 'https://earthobservatory.nasa.gov/features/MeasuringVegetation/measuring_vegetation_2.php', 'rel': 'about', 'title': 'NDVI explained by NASA'}, {'href': 'https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#common-band-names', 'rel': 'about', 'title': 'List of common band names as specified by the STAC specification'}], 'parameters': [{'deprecated': False, 'description': 'A raster data cube with two bands that have the common names `red` and `nir` assigned.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'default': 'nir', 'deprecated': False, 'description': 'The name of the NIR band. Defaults to the band that has the common name `nir` assigned.\n\nEither the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands) can be specified. If unique band name and common name conflict, the unique band name has higher priority.', 'experimental': False, 'name': 'nir', 'optional': True, 'schema': {'minItems': 0, 'subtype': 'band-name', 'type': 'string'}}, {'default': 'red', 'deprecated': False, 'description': 'The name of the red band. Defaults to the band that has the common name `red` assigned.\n\nEither the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands) can be specified. If unique band name and common name conflict, the unique band name has higher priority.', 'experimental': False, 'name': 'red', 'optional': True, 'schema': {'minItems': 0, 'subtype': 'band-name', 'type': 'string'}}, {'deprecated': False, 'description': 'By default, the dimension of type `bands` is dropped. To keep the dimension specify a new band name in this parameter so that a new dimension label with the specified name will be added for the computed values.', 'experimental': False, 'name': 'target_band', 'optional': True, 'schema': [{'minItems': 0, 'pattern': '^\\w+$', 'type': 'string'}, {'minItems': 0, 'type': 'null'}]}], 'process_graph': {}, 'returns': {'description': 'A raster data cube containing the computed NDVI values. The structure of the data cube differs depending on the value passed to `target_band`:\n\n* `target_band` is `null`: The data cube does not contain the dimension of type `bands` any more, the number of dimensions decreases by one. The dimension properties (name, type, labels, reference system and resolution) for all other dimensions remain unchanged.\n* `target_band` is a string: The data cube keeps the same dimensions. The dimension properties remain unchanged, but the number of dimension labels for the dimension of type `bands` increases by one. The additional label is named as specified in `target_band`.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Normalized Difference Vegetation Index'}, {'categories': ['math > constants', 'math > trigonometric'], 'deprecated': False, 'description': 'The real number Pi (π) is a mathematical constant that is the ratio of the circumference of a circle to its diameter. The numerical value is approximately *3.14159*.', 'exceptions': {}, 'experimental': False, 'id': 'pi', 'links': [{'href': 'http://mathworld.wolfram.com/Pi.html', 'rel': 'about', 'title': 'Mathematical constant Pi explained by Wolfram MathWorld'}], 'parameters': [], 'process_graph': {}, 'returns': {'description': 'The numerical value of Pi.', 'schema': {'minItems': 0, 'type': 'number'}}, 'summary': 'Pi (π)'}, {'categories': ['math', 'math > exponential & logarithmic'], 'deprecated': False, 'description': 'Computes the exponentiation for the base `base` raised to the power of `p`.\n\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`.', 'examples': [{'arguments': {'base': 0, 'p': 2}, 'returns': 0}, {'arguments': {'base': 2.5, 'p': 0}, 'returns': 1}, {'arguments': {'base': 3, 'p': 3}, 'returns': 27}, {'arguments': {'base': 5, 'p': -1}, 'returns': 0.2}, {'arguments': {'base': 1, 'p': 0.5}, 'returns': 1}, {'arguments': {'base': 1, 'p': None}, 'returns': None}, {'arguments': {'base': None, 'p': 2}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'power', 'links': [{'href': 'http://mathworld.wolfram.com/Power.html', 'rel': 'about', 'title': 'Power explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'The numerical base.', 'experimental': False, 'name': 'base', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The numerical exponent.', 'experimental': False, 'name': 'p', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed value for `base` raised to the power of `p`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Exponentiation'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Multiplies all elements in a sequential array of numbers and returns the computed product.\n\nBy default no-data values are ignored. Setting `ignore_nodata` to `false` considers no-data values so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'data': [5, 0]}, 'returns': 0}, {'arguments': {'data': [-2, 4, 2.5]}, 'returns': -20}, {'arguments': {'data': [1, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': [-1]}, 'returns': -1}, {'arguments': {'data': [None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'product', 'links': [{'href': 'http://mathworld.wolfram.com/Product.html', 'rel': 'about', 'title': 'Product explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The computed product of the sequence of numbers.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Compute the product by multiplying numbers'}, {'categories': ['math'], 'deprecated': False, 'description': 'Calculates quantiles, which are cut points dividing the range of a probability distribution into either\n\n* intervals corresponding to the given `probabilities` or\n* (nearly) equal-sized intervals (q-quantiles based on the parameter `q`).\n\nEither the parameter `probabilites` or `q` must be specified, otherwise the `QuantilesParameterMissing` exception is thrown. If both parameters are set the `QuantilesParameterConflict` exception is thrown.', 'examples': [{'arguments': {'data': [2, 4, 4, 4, 5, 5, 7, 9], 'probabilities': [0.005, 0.01, 0.02, 0.05, 0.1, 0.5]}, 'returns': '[2.07, 2.14, 2.28, 2.7, 3.4, 4.5]'}, {'arguments': {'data': [2, 4, 4, 4, 5, 5, 7, 9], 'q': 4}, 'returns': '[4, 4.5, 5.5]'}, {'arguments': {'data': [-1, -0.5, None, 1], 'q': 2}, 'returns': '[-0.5]'}, {'arguments': {'data': [-1, -0.5, None, 1], 'ignore_nodata': False, 'q': 4}, 'returns': '[None, None, None]'}, {'arguments': {'data': [], 'probabilities': [0.1, 0.5]}, 'returns': '[None, None]', 'title': 'Empty array example'}], 'exceptions': {'QuantilesParameterConflict': {'http': 400, 'message': "The process 'quantiles' only allows that either the 'probabilities' or the 'q' parameter is set."}, 'QuantilesParameterMissing': {'http': 400, 'message': "The process 'quantiles' requires either the 'probabilities' or 'q' parameter to be set."}}, 'experimental': False, 'id': 'quantiles', 'links': [{'href': 'https://en.wikipedia.org/wiki/Quantile', 'rel': 'about', 'title': 'Quantiles explained by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'deprecated': False, 'description': 'A list of probabilities to calculate quantiles for. The probabilities must be between 0 and 1.', 'experimental': False, 'name': 'probabilities', 'optional': True, 'schema': {'items': {'maximum': 1, 'minimum': 0, 'type': 'number'}, 'minItems': 0, 'type': 'array'}}, {'deprecated': False, 'description': 'A number of intervals to calculate quantiles for. Calculates q-quantiles with (nearly) equal-sized intervals.', 'experimental': False, 'name': 'q', 'optional': True, 'schema': {'minItems': 0, 'minimum': 2, 'type': 'integer'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that an array with `null` values is returned if any element is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': "An array with the computed quantiles. The list has either\n\n* as many elements as the given list of `probabilities` had or\n* *`q`-1* elements.\n\nIf the input array is empty the resulting array is filled with as many `null` values as required according to the list above. For an example, see the 'Empty array example'.", 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, 'summary': 'Quantiles'}, {'categories': ['cubes', 'reducer'], 'deprecated': False, 'description': 'Applies a unary reducer to a data cube dimension by collapsing all the pixel values along the specified dimension into an output value computed by the reducer. This process passes a list of values to the reducer. In contrast, ``reduce_dimension_binary()`` passes two values, which may be better suited especially for UDFs in case the number of values gets too large to be processed at once.\n\nThe dimension is dropped. To avoid this, use ``apply_dimension()`` instead.', 'exceptions': {'DimensionNotAvailable': {'http': 400, 'message': 'A dimension with the specified name does not exist.'}}, 'experimental': False, 'id': 'reduce_dimension', 'parameters': [{'deprecated': False, 'description': 'A data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': "A reducer to apply on the specified dimension. A reducer is a single process such as ``mean()`` or a set of processes, which computes a single value for a list of values, see the category 'reducer' for such processes.", 'experimental': False, 'name': 'reducer', 'optional': False, 'schema': {'minItems': 0, 'parameters': [{'deprecated': False, 'description': 'A labeled array with elements of any type.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'description': 'Any data type.'}, 'minItems': 0, 'subtype': 'labeled-array', 'type': 'array'}}, {'deprecated': False, 'description': 'Additional data passed by the user.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'subtype': 'process-graph', 'type': 'object'}}, {'deprecated': False, 'description': 'The name of the dimension over which to reduce. Fails with a `DimensionNotAvailable` error if the specified dimension does not exist.', 'experimental': False, 'name': 'dimension', 'optional': False, 'schema': {'minItems': 0, 'type': 'string'}}, {'deprecated': False, 'description': 'Additional data to be passed to the reducer.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'process_graph': {}, 'returns': {'description': 'A data cube with the newly computed values. It is missing the given dimension, the number of dimensions decreases by one. The dimension properties (name, type, labels, reference system and resolution) for all other dimensions remain unchanged.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Reduce dimensions'}, {'categories': ['cubes'], 'deprecated': False, 'description': "Renames the labels of the specified dimension in the data cube from `source` to `target`.\n\nIf the array for the source labels is empty (the default), the dimension labels are expected to be enumerated with zero-based numbering (0,1,2,3,...) so that the dimension labels directly map to the indices of the array specified for the parameter `target`. If the dimension labels are not enumerated and the `target` parameter is not specified, a `LabelsNotEnumerated` is thrown. The number of source and target labels must be equal, otherwise the error `LabelMismatch` is thrown.\n\nThis process doesn't change the order of the labels and their corresponding data.", 'examples': [{'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'source': ['B1', 'B2', 'B3'], 'target': ['red', 'green', 'blue']}, 'description': 'Renaming the bands from `B1` to `red`, from `B2` to `green` and from `B3` to `blue`.', 'returns': None, 'title': 'Rename named labels'}], 'exceptions': {'LabelExists': {'http': 400, 'message': 'A label with the specified name exists.'}, 'LabelMismatch': {'http': 400, 'message': "The number of labels in the parameters `source` and `target` don't match."}, 'LabelNotAvailable': {'http': 400, 'message': 'A label with the specified name does not exist.'}, 'LabelsNotEnumerated': {'http': 400, 'message': 'The dimension labels are not enumerated.'}}, 'experimental': False, 'id': 'rename_labels', 'links': [{'href': 'https://processes.openeo.org/1.0.0/examples/rename-enumerated-labels.json', 'rel': 'example', 'title': 'Rename enumerated labels', 'type': 'application/json'}], 'parameters': [{'deprecated': False, 'description': 'The data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'The name of the dimension to rename the labels for.', 'experimental': False, 'name': 'dimension', 'optional': False, 'schema': {'minItems': 0, 'type': 'string'}}, {'deprecated': False, 'description': 'The new names for the labels. The dimension labels in the data cube are expected to be enumerated, if the parameter `target` is not specified. If a target dimension label already exists in the data cube, a `LabelExists` error is thrown.', 'experimental': False, 'name': 'target', 'optional': False, 'schema': {'items': {'anyOf': [{'type': 'number'}, {'type': 'string'}]}, 'minItems': 0, 'type': 'array'}}, {'default': '[]', 'deprecated': False, 'description': "The names of the labels as they are currently in the data cube. The array defines an unsorted and potentially incomplete list of labels that should be renamed to the names available in the corresponding array elements in the parameter `target`. If one of the source dimension labels doesn't exist, a `LabelNotAvailable` error is thrown. By default, the array is empty so that the dimension labels in the data cube are expected to be enumerated.", 'experimental': False, 'name': 'source', 'optional': True, 'schema': {'items': {'anyOf': [{'type': 'number'}, {'type': 'string'}]}, 'minItems': 0, 'type': 'array'}}], 'process_graph': {}, 'returns': {'description': 'The data cube with the same dimensions. The dimension properties (name, type, labels, reference system and resolution) remain unchanged, except that for the given dimension the labels change. The old labels can not be referred to any longer. The number of labels remains the same.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Rename dimension labels'}, {'categories': ['math > rounding'], 'deprecated': False, 'description': 'Rounds a real number `x` to specified precision `p`.\n\nIf the fractional part of `x` is halfway between two integers, one of which is even and the other odd, then the even number is returned.\nThis behaviour follows [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229). This kind of rounding is also called "round to nearest (even)" or "banker\'s rounding". It minimizes rounding errors that result from consistently rounding a midpoint value in a single direction.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'p': 1, 'x': 3.56}, 'returns': 3.6}, {'arguments': {'p': 2, 'x': -0.4444444}, 'returns': -0.44}, {'arguments': {'x': -2.5}, 'returns': -2}, {'arguments': {'x': -3.5}, 'returns': -4}, {'arguments': {'p': -2, 'x': 1234.5}, 'returns': 1200}], 'exceptions': {}, 'experimental': False, 'id': 'round', 'links': [{'href': 'http://mathworld.wolfram.com/AbsoluteValue.html', 'rel': 'about', 'title': 'Absolute value explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'A number to round.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'default': 0, 'deprecated': False, 'description': 'A positive number specifies the number of digits after the decimal point to round to. A negative number means rounding to a power of ten, so for example *-2* rounds to the nearest hundred. Defaults to *0*.', 'experimental': False, 'name': 'p', 'optional': True, 'schema': {'minItems': 0, 'type': 'integer'}}], 'process_graph': {}, 'returns': {'description': 'The rounded number.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Round to a specified precision'}, {'categories': ['cubes', 'import', 'udf'], 'deprecated': False, 'description': "Runs an UDF in one of the supported runtime environments.\n\nThe process can either:\n\n1. load and run a locally stored UDF from a file in the workspace of the authenticated user. The path to the UDF file must be relative to the root directory of the user's workspace.\n2. fetch and run a remotely stored and published UDF by absolute URI, for example from [openEO Hub](https://hub.openeo.org)).\n3. run the source code specified inline as string.\n\nThe loaded UDF can be executed in several processes such as ``aggregate_spatial()``, ``apply()``, ``apply_dimension()`` and ``reduce_dimension()``. In this case an array is passed instead of a raster data cube. The user must ensure that the data is properly passed as an array so that the UDF can make sense of it.", 'exceptions': {'InvalidVersion': {'http': 400, 'message': 'The specified UDF runtime version is not supported.'}}, 'experimental': False, 'id': 'run_udf', 'parameters': [{'deprecated': False, 'description': 'The data to be passed to the UDF as array or raster data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': [{'minItems': 0, 'subtype': 'raster-cube', 'title': 'Raster data cube', 'type': 'object'}, {'items': {'description': 'Any data type.'}, 'minItems': 1, 'title': 'Array', 'type': 'array'}, {'description': 'A single value of any data type.', 'minItems': 0, 'title': 'Single Value'}]}, {'deprecated': False, 'description': 'Either source code, an absolute URL or a path to an UDF script.', 'experimental': False, 'name': 'udf', 'optional': False, 'schema': [{'description': 'URI to an UDF', 'format': 'uri', 'minItems': 0, 'subtype': 'uri', 'type': 'string'}, {'description': 'Path to an UDF uploaded to the server.', 'minItems': 0, 'subtype': 'file-path', 'type': 'string'}, {'description': 'Source code as string', 'minItems': 0, 'subtype': 'udf-code', 'type': 'string'}]}, {'deprecated': False, 'description': 'An UDF runtime identifier available at the back-end.', 'experimental': False, 'name': 'runtime', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'udf-runtime', 'type': 'string'}}, {'deprecated': False, 'description': 'An UDF runtime version. If set to `null`, the default runtime version specified for each runtime is used.', 'experimental': False, 'name': 'version', 'optional': True, 'schema': [{'minItems': 0, 'subtype': 'udf-runtime-version', 'type': 'string'}, {'minItems': 0, 'title': 'Default runtime version', 'type': 'null'}]}, {'default': '{}', 'deprecated': False, 'description': 'Additional data such as configuration options that should be passed to the UDF.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'minItems': 0, 'type': 'object'}}], 'process_graph': {}, 'returns': {'description': 'The data processed by the UDF.\n\n* Returns a raster data cube, if a raster data cube is passed for `data`. Details on the dimensions and dimension properties (name, type, labels, reference system and resolution) depend on the UDF.\n* If an array is passed for `data`, the returned value can be of any data type, but is exactly what the UDF returns.', 'schema': [{'minItems': 0, 'subtype': 'raster-cube', 'title': 'Raster data cube', 'type': 'object'}, {'description': 'Any data type.', 'minItems': 0, 'title': 'Any'}]}, 'summary': 'Run an UDF'}, {'categories': ['cubes', 'export'], 'deprecated': False, 'description': 'Saves processed data to the local user workspace / data store of the authenticated user. This process aims to be compatible to GDAL/OGR formats and options. STAC-compatible metadata should be stored with the processed data.\n\nCalling this process may be rejected by back-ends in the context of secondary web services.', 'exceptions': {'FormatUnsuitable': {'http': 400, 'message': "Data can't be transformed into the requested output format."}}, 'experimental': False, 'id': 'save_result', 'links': [{'href': 'https://www.gdal.org/formats_list.html', 'rel': 'about', 'title': 'GDAL Raster Formats'}, {'href': 'https://www.gdal.org/ogr_formats.html', 'rel': 'about', 'title': 'OGR Vector Formats'}], 'parameters': [{'deprecated': False, 'description': 'The data to save.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': [{'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}, {'minItems': 0, 'subtype': 'vector-cube', 'type': 'object'}]}, {'deprecated': False, 'description': 'The file format to save to. It must be one of the values that the server reports as supported output file formats, which usually correspond to the short GDAL/OGR codes. If the format is not suitable for storing the underlying data structure, a `FormatUnsuitable` exception will be thrown. This parameter is *case insensitive*.', 'experimental': False, 'name': 'format', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'output-format', 'type': 'string'}}, {'default': '{}', 'deprecated': False, 'description': 'The file format parameters to be used to create the file(s). Must correspond to the parameters that the server reports as supported parameters for the chosen `format`. The parameter names and valid values usually correspond to the GDAL/OGR format options.', 'experimental': False, 'name': 'options', 'optional': True, 'schema': {'minItems': 0, 'subtype': 'output-format-options', 'type': 'object'}}], 'process_graph': {}, 'returns': {'description': '`false` if saving failed, `true` otherwise.', 'schema': {'minItems': 0, 'type': 'boolean'}}, 'summary': 'Save processed data to storage'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the sample standard deviation, which quantifies the amount of variation of an array of numbers. It is defined to be the square root of the corresponding variance (see ``variance()``).\n\nA low standard deviation indicates that the values tend to be close to the expected value, while a high standard deviation indicates that the values are spread out over a wider range.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [-1, 1, 3, None]}, 'returns': 2}, {'arguments': {'data': [-1, 1, 3, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sd', 'links': [{'href': 'http://mathworld.wolfram.com/StandardDeviation.html', 'rel': 'about', 'title': 'Standard deviation explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'power': {'arguments': {'base': {'from_node': 'variance'}, 'p': 0.5}, 'process_id': 'power', 'result': True}, 'variance': {'arguments': {'data': {'from_parameter': 'data'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'variance'}}, 'returns': {'description': 'The computed sample standard deviation.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Standard deviation'}, {'categories': ['math'], 'deprecated': False, 'description': 'The signum (also known as *sign*) of `x` is defined as:\n\n* *1* if *x > 0*\n* *0* if *x = 0*\n* *-1* if *x < 0*\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': -2}, 'returns': -1}, {'arguments': {'x': 3.5}, 'returns': 1}, {'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sgn', 'links': [{'href': 'http://mathworld.wolfram.com/Sign.html', 'rel': 'about', 'title': 'Sign explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'gt0': {'arguments': {'x': {'from_parameter': 'x'}, 'y': 0}, 'process_id': 'gt'}, 'if_gt0': {'arguments': {'accept': 1, 'reject': {'from_parameter': 'x'}, 'value': {'from_node': 'gt0'}}, 'process_id': 'if'}, 'if_lt0': {'arguments': {'accept': -1, 'reject': {'from_node': 'if_gt0'}, 'value': {'from_node': 'lt0'}}, 'process_id': 'if', 'result': True}, 'lt0': {'arguments': {'x': {'from_parameter': 'x'}, 'y': 0}, 'process_id': 'lt'}}, 'returns': {'description': 'The computed signum value of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Signum'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the sine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'sin', 'links': [{'href': 'http://mathworld.wolfram.com/Sine.html', 'rel': 'about', 'title': 'Sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed sine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Sine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the hyperbolic sine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'sinh', 'links': [{'href': 'http://mathworld.wolfram.com/HyperbolicSine.html', 'rel': 'about', 'title': 'Hyperbolic sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed hyperbolic sine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Hyperbolic sine'}, {'categories': ['math', 'math > exponential & logarithmic'], 'deprecated': False, 'description': 'Computes the square root of a real number `x`, which is equal to calculating `x` to the power of *0.5*.\n\nA square root of x is a number a such that *a^2^ = x*. Therefore, the square root is the inverse function of a to the power of 2, but only for *a >= 0*.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 1}, 'returns': 1}, {'arguments': {'x': 9}, 'returns': 3}, {'arguments': {'x': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sqrt', 'links': [{'href': 'http://mathworld.wolfram.com/SquareRoot.html', 'rel': 'about', 'title': 'Square root explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'power': {'arguments': {'base': {'from_parameter': 'x'}, 'p': 0.5}, 'process_id': 'power', 'result': True}}, 'returns': {'description': 'The computed square root.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Square root'}, {'categories': ['math'], 'deprecated': False, 'description': 'Subtracts argument `y` from the argument `x` (*x - y*) and returns the computed result.\n\nNo-data values are taken into account so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'x': 5, 'y': 2.5}, 'returns': 2.5}, {'arguments': {'x': -2, 'y': 4}, 'returns': -6}, {'arguments': {'x': 1, 'y': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'subtract', 'links': [{'href': 'http://mathworld.wolfram.com/Subtraction.html', 'rel': 'about', 'title': 'Subtraction explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'The minuend.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The subtrahend.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed result.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Subtraction of two numbers'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Sums up all elements in a sequential array of numbers and returns the computed sum.\n\nBy default no-data values are ignored. Setting `ignore_nodata` to `false` considers no-data values so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'data': [5, 1]}, 'returns': 6}, {'arguments': {'data': [-2, 4, 2.5]}, 'returns': 4.5}, {'arguments': {'data': [1, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': [100]}, 'returns': 100}, {'arguments': {'data': [None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sum', 'links': [{'href': 'http://mathworld.wolfram.com/Sum.html', 'rel': 'about', 'title': 'Sum explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The computed sum of the sequence of numbers.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Compute the sum by adding up numbers'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the tangent of `x`. The tangent is defined to be the sine of x divided by the cosine of x.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'tan', 'links': [{'href': 'http://mathworld.wolfram.com/Tangent.html', 'rel': 'about', 'title': 'Tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed tangent of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Tangent'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the hyperbolic tangent of `x`. The tangent is defined to be the hyperbolic sine of x divided by the hyperbolic cosine of x.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'tanh', 'links': [{'href': 'http://mathworld.wolfram.com/HyperbolicTangent.html', 'rel': 'about', 'title': 'Hyperbolic tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed hyperbolic tangent of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Hyperbolic tangent'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the sample variance of an array of numbers by calculating the square of the standard deviation (see ``sd()``). It is defined to be the expectation of the squared deviation of a random variable from its expected value. Basically, it measures how far the numbers in the array are spread out from their average value.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [-1, 1, 3]}, 'returns': 4}, {'arguments': {'data': [2, 3, 3, None, 4, 4, 5]}, 'returns': 1.1}, {'arguments': {'data': [-1, 1, None, 3], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'variance', 'links': [{'href': 'http://mathworld.wolfram.com/Variance.html', 'rel': 'about', 'title': 'Variance explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'apply': {'arguments': {'context': {'from_node': 'mean'}, 'data': {'from_parameter': 'data'}, 'process': {'process-graph': {'power': {'arguments': {'base': {'from_node': 'subtract'}, 'p': 2}, 'process_id': 'power', 'result': True}, 'subtract': {'arguments': {'x': {'from_parameter': 'x'}, 'y': {'from_parameter': 'context'}}, 'process_id': 'subtract'}}}}, 'process_id': 'apply'}, 'mean': {'arguments': {'data': {'from_parameter': 'data'}}, 'process_id': 'mean'}, 'mean2': {'arguments': {'data': {'from_node': 'apply'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'mean', 'result': True}}, 'returns': {'description': 'The computed sample variance.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Variance'}]}, + op_kwargs = {'job_id': 'jb-12347', 'user_name': 'jdoe_67890', 'process_graph_json': {'process_graph': {'dc': {'process_id': 'load_collection', 'description': 'Loading the data; The order of the specified bands is important for the following reduce operation.', 'arguments': {'id': 's2%_prd_msil1c', 'spatial_extent': {'west': 11.279182434082033, 'east': 11.406898498535158, 'north': 46.522729291844286, 'south': 46.464349400461145}, 'temporal_extent': ['2018-06-04', '2018-06-23'], 'bands': ['B08', 'B04', 'B02']}}, 'evi': {'process_id': 'reduce_dimension', 'description': 'Compute the EVI. Formula: 2.5 * (NIR - RED) / (1 + NIR + 6*RED + -7.5*BLUE)', 'arguments': {'data': {'from_node': 'dc'}, 'dimension': 'spectral', 'reducer': {'process_graph': {'nir': {'process_id': 'array_element', 'arguments': {'data': {'from_parameter': 'data'}, 'index': 0}}, 'red': {'process_id': 'array_element', 'arguments': {'data': {'from_parameter': 'data'}, 'index': 1}}, 'blue': {'process_id': 'array_element', 'arguments': {'data': {'from_parameter': 'data'}, 'index': 2}}, 'sub': {'process_id': 'subtract', 'arguments': {'x': {'from_node': 'nir'}, 'y': {'from_node': 'red'}}}, 'p1': {'process_id': 'product', 'arguments': {'data': [6, {'from_node': 'red'}]}}, 'p2': {'process_id': 'product', 'arguments': {'data': [-7.5, {'from_node': 'blue'}]}}, 'sum': {'process_id': 'sum', 'arguments': {'data': [10000, {'from_node': 'nir'}, {'from_node': 'p1'}, {'from_node': 'p2'}]}}, 'div': {'process_id': 'divide', 'arguments': {'x': {'from_node': 'sub'}, 'y': {'from_node': 'sum'}}}, 'p3': {'process_id': 'product', 'arguments': {'data': [2.5, {'from_node': 'div'}]}, 'result': True}}}}}, 'mintime': {'process_id': 'reduce_dimension', 'description': 'Compute a minimum time composite by reducing the temporal dimension', 'arguments': {'data': {'from_node': 'evi'}, 'dimension': 'temporal', 'reducer': {'process_graph': {'min': {'process_id': 'min', 'arguments': {'data': {'from_parameter': 'data'}}, 'result': True}}}}}, 'save': {'process_id': 'save_result', 'arguments': {'data': {'from_node': 'mintime'}, 'format': 'Gtiff'}, 'result': True}}}, 'job_data': './openeo_job', 'process_defs': [{'categories': ['math'], 'deprecated': False, 'description': 'Computes the absolute value of a real number `x`, which is the "unsigned" portion of x and often denoted as *|x|*.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 3.5}, {'arguments': {'x': -0.4}, 'returns': 0.4}, {'arguments': {'x': -3.5}, 'returns': 3.5}], 'exceptions': {}, 'experimental': False, 'id': 'absolute', 'links': [{'href': 'http://mathworld.wolfram.com/AbsoluteValue.html', 'rel': 'about', 'title': 'Absolute value explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'if': {'arguments': {'accept': {'from_node': 'multiply'}, 'reject': {'from_parameter': 'x'}, 'value': {'from_node': 'lt'}}, 'process_id': 'if', 'result': True}, 'lt': {'arguments': {'x': {'from_parameter': 'x'}, 'y': 0}, 'process_id': 'lt'}, 'multiply': {'arguments': {'x': {'from_parameter': 'x'}, 'y': -1}, 'process_id': 'multiply'}}, 'returns': {'description': 'The computed absolute value.', 'schema': {'minItems': 0, 'minimum': 0, 'type': ['number', 'null']}}, 'summary': 'Absolute value'}, {'categories': ['cubes'], 'deprecated': False, 'description': 'Adds a new named dimension to the data cube.\n\nAfterwards, the dimension can be referenced with the specified `name`. If a dimension with the specified name exists, the process fails with a `DimensionExists` error. The dimension label of the dimension is set to the specified `label`.', 'exceptions': {'DimensionExists': {'http': 400, 'message': 'A dimension with the specified name already exists.'}}, 'experimental': False, 'id': 'add_dimension', 'parameters': [{'deprecated': False, 'description': 'A data cube to add the dimension to.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'Name for the dimension.', 'experimental': False, 'name': 'name', 'optional': False, 'schema': {'minItems': 0, 'type': 'string'}}, {'deprecated': False, 'description': 'A dimension label.', 'experimental': False, 'name': 'label', 'optional': False, 'schema': [{'minItems': 0, 'type': 'number'}, {'minItems': 0, 'type': 'string'}]}, {'default': 'other', 'deprecated': False, 'description': 'The type of dimension, defaults to `other`.', 'experimental': False, 'name': 'type', 'optional': True, 'schema': {'enum': ['spatial', 'temporal', 'bands', 'other'], 'minItems': 0, 'type': 'string'}}], 'process_graph': {}, 'returns': {'description': 'The data cube with a newly added dimension. The new dimension has exactly one dimension label. All other dimensions remain unchanged.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Add a new dimension'}, {'categories': ['cubes'], 'deprecated': False, 'description': 'Applies a *unary* process to each pixel value in the data cube (i.e. a local operation). A unary process takes a single value and returns a single value, for example ``abs()`` or ``linear_scale_range()``. In contrast, the process ``apply_dimension()`` applies a process to all pixel values along a particular dimension.', 'exceptions': {}, 'experimental': False, 'id': 'apply', 'parameters': [{'deprecated': False, 'description': 'A data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'A unary process to be applied on each value, may consist of multiple sub-processes.', 'experimental': False, 'name': 'process', 'optional': False, 'schema': {'minItems': 0, 'parameters': [{'deprecated': False, 'description': 'The value to process.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'description': 'Any data type.', 'minItems': 0}}, {'deprecated': False, 'description': 'Additional data passed by the user.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'subtype': 'process-graph', 'type': 'object'}}, {'deprecated': False, 'description': 'Additional data to be passed to the process.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'process_graph': {}, 'returns': {'description': 'A data cube with the newly computed values and the same dimensions. The dimension properties (name, type, labels, reference system and resolution) remain unchanged.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Apply a process to each pixel'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc cosine of `x`. The arc cosine is the inverse function of the cosine so that *arccos(cos(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arccos', 'links': [{'href': 'http://mathworld.wolfram.com/InverseCosine.html', 'rel': 'about', 'title': 'Inverse cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse cosine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the inverse hyperbolic cosine of `x`. It is the inverse function of the hyperbolic cosine so that *arcosh(cosh(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arcosh', 'links': [{'href': 'http://mathworld.wolfram.com/InverseHyperbolicCosine.html', 'rel': 'about', 'title': 'Inverse hyperbolic cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse hyperbolic cosine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc sine of `x`. The arc sine is the inverse function of the sine so that *arcsin(sin(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arcsin', 'links': [{'href': 'http://mathworld.wolfram.com/InverseSine.html', 'rel': 'about', 'title': 'Inverse sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse sine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc tangent of `x`. The arc tangent is the inverse function of the tangent so that *arctan(tan(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arctan', 'links': [{'href': 'http://mathworld.wolfram.com/InverseTangent.html', 'rel': 'about', 'title': 'Inverse tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse tangent'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the arc tangent of two numbers `x` and `y`. It is similar to calculating the arc tangent of *y / x*, except that the signs of both arguments are used to determine the quadrant of the result.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`.', 'examples': [{'arguments': {'x': 0, 'y': 0}, 'returns': 0}, {'arguments': {'x': 1.5, 'y': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'arctan2', 'links': [{'href': 'https://en.wikipedia.org/wiki/Atan2', 'rel': 'about', 'title': 'Two-argument inverse tangent explained by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'A number to be used as dividend.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'A number to be used as divisor.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse tangent of two numbers'}, {'categories': ['arrays', 'reducer'], 'deprecated': False, 'description': 'Returns the element with the specified index or label from the array.\n\nEither the parameter `index` or `label` must be specified, otherwise the `ArrayElementParameterMissing` exception is thrown. If both parameters are set the `ArrayElementParameterConflict` exception is thrown.', 'examples': [{'arguments': {'data': [9, 8, 7, 6, 5], 'index': 2}, 'returns': 7}, {'arguments': {'data': ['A', 'B', 'C'], 'index': 0}, 'returns': 'A'}, {'arguments': {'data': [], 'index': 0, 'return_nodata': True}, 'returns': None}], 'exceptions': {'ArrayElementNotAvailable': {'http': 400, 'message': 'The array has no element with the specified index or label.'}, 'ArrayElementParameterConflict': {'http': 400, 'message': "The process 'array_element' only allows that either the 'index' or the 'labels' parameter is set."}, 'ArrayElementParameterMissing': {'http': 400, 'message': "The process 'array_element' requires either the 'index' or 'labels' parameter to be set."}}, 'experimental': False, 'id': 'array_element', 'parameters': [{'deprecated': False, 'description': 'An array.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'description': 'Any data type is allowed.'}, 'minItems': 0, 'type': 'array'}}, {'deprecated': False, 'description': 'The zero-based index of the element to retrieve.', 'experimental': False, 'name': 'index', 'optional': True, 'schema': {'minItems': 0, 'type': 'integer'}}, {'deprecated': False, 'description': 'The label of the element to retrieve.', 'experimental': False, 'name': 'label', 'optional': True, 'schema': [{'minItems': 0, 'type': 'number'}, {'minItems': 0, 'type': 'string'}]}, {'default': True, 'deprecated': False, 'description': 'By default this process throws an `ArrayElementNotAvailable` exception if the index or label is invalid. If you want to return `null` instead, set this flag to `true`.', 'experimental': False, 'name': 'return_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The value of the requested element.', 'schema': {'description': 'Any data type is allowed.', 'minItems': 0}}, 'summary': 'Get an element from an array'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the inverse hyperbolic sine of `x`. It is the inverse function of the hyperbolic sine so that *arsinh(sinh(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'arsinh', 'links': [{'href': 'http://mathworld.wolfram.com/InverseHyperbolicSine.html', 'rel': 'about', 'title': 'Inverse hyperbolic sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse hyperbolic sine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the inverse hyperbolic tangent of `x`. It is the inverse function of the hyperbolic tangent so that *artanh(tanh(x)) = x*.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'artanh', 'links': [{'href': 'http://mathworld.wolfram.com/InverseHyperbolicTangent.html', 'rel': 'about', 'title': 'Inverse hyperbolic tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed angle in radians.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Inverse hyperbolic tangent'}, {'categories': ['math > rounding'], 'deprecated': False, 'description': 'The least integer greater than or equal to the number `x`.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 4}, {'arguments': {'x': -0.4}, 'returns': 0}, {'arguments': {'x': -3.5}, 'returns': -3}], 'exceptions': {}, 'experimental': False, 'id': 'ceil', 'links': [{'href': 'http://mathworld.wolfram.com/CeilingFunction.html', 'rel': 'about', 'title': 'Ceiling explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number to round up.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The number rounded up.', 'schema': {'minItems': 0, 'type': ['integer', 'null']}}, 'summary': 'Round fractions up'}, {'categories': ['math'], 'deprecated': False, 'description': 'Clips a number between specified minimum and maximum values. A value larger than the maximal value will have the maximal value, a value lower than minimal value will have the minimal value.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'max': 1, 'min': -1, 'x': -5}, 'returns': -1}, {'arguments': {'max': 10, 'min': 1, 'x': 10.001}, 'returns': 10}, {'arguments': {'max': 0.02, 'min': 0, 'x': 1e-06}, 'returns': 1e-06}, {'arguments': {'max': 1, 'min': 0, 'x': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'clip', 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'Minimum value. If the value is lower than this value, the process will return the value of this parameter.', 'experimental': False, 'name': 'min', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}, {'deprecated': False, 'description': 'Maximum value. If the value is greater than this value, the process will return the value of this parameter.', 'experimental': False, 'name': 'max', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}], 'process_graph': {'max': {'arguments': {'data': [{'from_parameter': 'min'}, {'from_node': 'min'}]}, 'process_id': 'max', 'result': True}, 'min': {'arguments': {'data': [{'from_parameter': 'max'}, {'from_parameter': 'x'}]}, 'process_id': 'min'}}, 'returns': {'description': 'The value clipped to the specified range.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Clip a value between a minimum and a maximum'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the cosine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 1}], 'exceptions': {}, 'experimental': False, 'id': 'cos', 'links': [{'href': 'http://mathworld.wolfram.com/Cosine.html', 'rel': 'about', 'title': 'Cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed cosine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Cosine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the hyperbolic cosine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 1}], 'exceptions': {}, 'experimental': False, 'id': 'cosh', 'links': [{'href': 'http://mathworld.wolfram.com/HyperbolicCosine.html', 'rel': 'about', 'title': 'Hyperbolic cosine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed hyperbolic cosine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Hyperbolic cosine'}, {'categories': ['math'], 'deprecated': False, 'description': 'Divides argument `x` by the argument `y` (*x / y*) and returns the computed result.\n\nNo-data values are taken into account so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it. Therefore, a division by zero results in ±infinity if the processing environment supports it. Otherwise a `DivisionByZero` error must the thrown.', 'examples': [{'arguments': {'x': 5, 'y': 2.5}, 'returns': 2}, {'arguments': {'x': -2, 'y': 4}, 'returns': -0.5}, {'arguments': {'x': 1, 'y': None}, 'returns': None}], 'exceptions': {'DivisionByZero': {'http': 400, 'message': 'Division by zero is not supported.'}}, 'experimental': False, 'id': 'divide', 'links': [{'href': 'http://mathworld.wolfram.com/Division.html', 'rel': 'about', 'title': 'Division explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'The dividend.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The divisor.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed result.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Division of two numbers'}, {'categories': ['math > constants', 'math > exponential & logarithmic'], 'deprecated': False, 'description': 'The real number *e* is a mathematical constant that is the base of the natural logarithm such that *ln(e) = 1*. The numerical value is approximately *2.71828*.', 'exceptions': {}, 'experimental': False, 'id': 'e', 'links': [{'href': 'http://mathworld.wolfram.com/e.html', 'rel': 'about', 'title': 'Mathematical constant e explained by Wolfram MathWorld'}], 'parameters': [], 'process_graph': {}, 'returns': {'description': "The numerical value of Euler's number.", 'schema': {'minItems': 0, 'type': 'number'}}, 'summary': "Euler's number (e)"}, {'categories': ['math > exponential & logarithmic'], 'deprecated': False, 'description': 'Exponential function to the base *e* raised to the power of `p`.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'p': 0}, 'returns': 1}, {'arguments': {'p': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'exp', 'links': [{'href': 'http://mathworld.wolfram.com/ExponentialFunction.html', 'rel': 'about', 'title': 'Exponential function explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'The numerical exponent.', 'experimental': False, 'name': 'p', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'e': {'arguments': {}, 'process_id': 'e'}, 'power': {'arguments': {'base': {'from_node': 'e'}, 'p': {'from_parameter': 'p'}}, 'process_id': 'power', 'result': True}}, 'returns': {'description': 'The computed value for *e* raised to the power of `p`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Exponentiation to the base e'}, {'categories': ['cubes', 'filter'], 'deprecated': False, 'description': "Filters the bands in the data cube so that bands that don't match any of the criteria are dropped from the data cube. The data cube is expected to have only one dimension of type `bands`. Fails with a `DimensionMissing` error if no such dimension exists.\n\nThe following criteria can be used to select bands:\n\n* `bands`: band name or common band name (e.g. `B01`, `B8A`, `red` or `nir`)\n* `wavelengths`: ranges of wavelengths in micrometres (μm) (e.g. 0.5 - 0.6)\n\nAll these information are exposed in the band metadata of the collection. To keep algorithms interoperable it is recommended to prefer the common bands names or the wavelengths over collection and/or back-end specific band names.\n\nIf multiple criteria are specified, any of them must match and not all of them, i.e. they are combined with an OR-operation. If no criteria is specified, the `BandFilterParameterMissing` exception must be thrown.\n\n**Important:** The order of the specified array defines the order of the bands in the data cube, which can be important for subsequent processes. If multiple bands are matched by a single criterion (e.g. a range of wavelengths), they stay in the original order.", 'exceptions': {'BandFilterParameterMissing': {'http': 400, 'message': "The process 'filter_bands' requires any of the parameters 'bands', 'common_names' or 'wavelengths' to be set."}, 'DimensionMissing': {'http': 400, 'message': 'A band dimension is missing.'}}, 'experimental': False, 'id': 'filter_bands', 'links': [{'href': 'https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#common-band-names', 'rel': 'about', 'title': 'List of common band names as specified by the STAC specification'}], 'parameters': [{'deprecated': False, 'description': 'A data cube with bands.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'default': '[]', 'deprecated': False, 'description': 'A list of band names. Either the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands). If unique band name and common name conflict, the unique band name has higher priority.\n\nThe order of the specified array defines the order of the bands in the data cube. If multiple bands match a common name, all matched bands are included in the original order.', 'experimental': False, 'name': 'bands', 'optional': True, 'schema': {'items': {'subtype': 'band-name', 'type': 'string'}, 'minItems': 0, 'type': 'array'}}, {'default': '[]', 'deprecated': False, 'description': 'A list of sub-lists with each sub-list consisting of two elements. The first element is the minimum wavelength and the second element is the maximum wavelength. Wavelengths are specified in micrometres (μm).\n\nThe order of the specified array defines the order of the bands in the data cube. If multiple bands match the wavelengths, all matched bands are included in the original order.', 'experimental': False, 'name': 'wavelengths', 'optional': True, 'schema': {'items': {'examples': [[[0.45, 0.5], [0.6, 0.7]]], 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'type': 'array'}, 'minItems': 0, 'type': 'array'}}], 'process_graph': {}, 'returns': {'description': 'A data cube limited to a subset of its original bands. The dimensions and dimension properties (name, type, labels, reference system and resolution) remain unchanged, except that the dimension of type `bands` has less (or the same) dimension labels.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Filter the bands by name'}, {'categories': ['cubes', 'filter'], 'deprecated': False, 'description': 'Limits the data cube to the specified bounding box.\n\nThe filter retains a pixel in the data cube if the point at the pixel center intersects with the bounding box (as defined in the Simple Features standard by the OGC).', 'exceptions': {}, 'experimental': False, 'id': 'filter_bbox', 'links': [{'href': 'https://proj.org/usage/projections.html', 'rel': 'about', 'title': 'PROJ parameters for cartographic projections'}, {'href': 'http://www.epsg-registry.org', 'rel': 'about', 'title': 'Official EPSG code registry'}, {'href': 'http://www.epsg.io', 'rel': 'about', 'title': 'Unofficial EPSG code database'}, {'href': 'http://www.opengeospatial.org/standards/sfa', 'rel': 'about', 'title': 'Simple Features standard by the OGC'}], 'parameters': [{'deprecated': False, 'description': 'A data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'A bounding box, which may include a vertical axis (see `base` and `height`).', 'experimental': False, 'name': 'extent', 'optional': False, 'schema': {'minItems': 0, 'properties': {'base': {'default': None, 'description': 'Base (optional, lower left corner, coordinate axis 3).', 'type': ['number', 'null']}, 'crs': {'anyOf': [{'examples': [3857], 'minimum': 1000, 'subtype': 'epsg-code', 'title': 'EPSG Code', 'type': 'integer'}, {'subtype': 'wkt2-definition', 'title': 'WKT2', 'type': 'string'}, {'deprecated': True, 'subtype': 'proj-definition', 'title': 'PROJ definition', 'type': 'string'}], 'default': 4326, 'description': 'Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/), [WKT2 (ISO 19162) string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html) or [PROJ definition (deprecated)](https://proj.org/usage/quickstart.html). Defaults to `4326` (EPSG code 4326) unless the client explicitly requests a different coordinate reference system.'}, 'east': {'description': 'East (upper right corner, coordinate axis 1).', 'type': 'number'}, 'height': {'default': None, 'description': 'Height (optional, upper right corner, coordinate axis 3).', 'type': ['number', 'null']}, 'north': {'description': 'North (upper right corner, coordinate axis 2).', 'type': 'number'}, 'south': {'description': 'South (lower left corner, coordinate axis 2).', 'type': 'number'}, 'west': {'description': 'West (lower left corner, coordinate axis 1).', 'type': 'number'}}, 'required': ['west', 'south', 'east', 'north'], 'subtype': 'bounding-box', 'type': 'object'}}], 'process_graph': {}, 'returns': {'description': 'A data cube restricted to the bounding box. The dimensions and dimension properties (name, type, labels, reference system and resolution) remain unchanged, except that the spatial dimensions have less (or the same) dimension labels.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Spatial filter using a bounding box'}, {'categories': ['math > rounding'], 'deprecated': False, 'description': 'The greatest integer less than or equal to the number `x`.\n\nThis process is *not* an alias for the ``int()`` process as defined by some mathematicians, see the examples for negative numbers in both processes for differences.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 3}, {'arguments': {'x': -0.4}, 'returns': -1}, {'arguments': {'x': -3.5}, 'returns': -4}], 'exceptions': {}, 'experimental': False, 'id': 'floor', 'links': [{'href': 'http://mathworld.wolfram.com/FloorFunction.html', 'rel': 'about', 'title': 'Floor explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number to round down.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The number rounded down.', 'schema': {'minItems': 0, 'type': ['integer', 'null']}}, 'summary': 'Round fractions down'}, {'categories': ['math', 'math > rounding'], 'deprecated': False, 'description': 'The integer part of the real number `x`.\n\nThis process is *not* an alias for the ``floor()`` process as defined by some mathematicians, see the examples for negative numbers in both processes for differences.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 3.5}, 'returns': 3}, {'arguments': {'x': -0.4}, 'returns': 0}, {'arguments': {'x': -3.5}, 'returns': -3}], 'exceptions': {}, 'experimental': False, 'id': 'int', 'links': [{'href': 'http://mathworld.wolfram.com/IntegerPart.html', 'rel': 'about', 'title': 'Integer Part explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'Integer part of the number.', 'schema': {'minItems': 0, 'type': ['integer', 'null']}}, 'summary': 'Integer part of a number'}, {'categories': ['math'], 'deprecated': False, 'description': 'Performs a linear transformation between the input and output range.\n\nThe given number in `x` is clipped to the bounds specified in `inputMin` and `inputMax` so that the underlying formula *((x - inputMin) / (inputMax - inputMin)) * (outputMax - outputMin) + outputMin* never returns any value lower than `outputMin` or greater than `outputMax`.\n\nPotential use case include\n\n* scaling values to the 8-bit range (0 - 255) often used for numeric representation of values in one of the channels of the [RGB colour model](https://en.wikipedia.org/wiki/RGB_color_model#Numeric_representations) or\n* calculating percentages (0 - 100).\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'inputMax': 1, 'inputMin': -1, 'outputMax': 255, 'outputMin': 0, 'x': 0.3}, 'returns': 165.75}, {'arguments': {'inputMax': 255, 'inputMin': 0, 'x': 25.5}, 'returns': 0.1}, {'arguments': {'inputMax': 100, 'inputMin': 0, 'x': None}, 'returns': None}, {'arguments': {'inputMax': 1, 'inputMin': 0, 'outputMax': 255, 'outputMin': 0, 'x': 1.12}, 'description': 'Shows that the input data is clipped.', 'returns': 255}], 'exceptions': {}, 'experimental': False, 'id': 'linear_scale_range', 'parameters': [{'deprecated': False, 'description': 'A number to transform. The number gets clipped to the bounds specified in `inputMin` and `inputMax`.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'Minimum value the input can obtain.', 'experimental': False, 'name': 'inputMin', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}, {'deprecated': False, 'description': 'Maximum value the input can obtain.', 'experimental': False, 'name': 'inputMax', 'optional': False, 'schema': {'minItems': 0, 'type': 'number'}}, {'default': 0, 'deprecated': False, 'description': 'Minimum value of the desired output range.', 'experimental': False, 'name': 'outputMin', 'optional': True, 'schema': {'minItems': 0, 'type': 'number'}}, {'default': 1, 'deprecated': False, 'description': 'Maximum value of the desired output range.', 'experimental': False, 'name': 'outputMax', 'optional': True, 'schema': {'minItems': 0, 'type': 'number'}}], 'process_graph': {'add': {'arguments': {'x': {'from_node': 'multiply'}, 'y': {'from_parameter': 'outputMin'}}, 'process_id': 'add', 'result': True}, 'divide': {'arguments': {'x': {'from_node': 'subtract1'}, 'y': {'from_node': 'subtract2'}}, 'process_id': 'divide'}, 'multiply': {'arguments': {'x': {'from_node': 'divide'}, 'y': {'from_node': 'subtract3'}}, 'process_id': 'multiply'}, 'subtract1': {'arguments': {'x': {'from_parameter': 'x'}, 'y': {'from_parameter': 'inputMin'}}, 'process_id': 'subtract'}, 'subtract2': {'arguments': {'x': {'from_parameter': 'inputMax'}, 'y': {'from_parameter': 'inputMin'}}, 'process_id': 'subtract'}, 'subtract3': {'arguments': {'x': {'from_parameter': 'outputMax'}, 'y': {'from_parameter': 'outputMin'}}, 'process_id': 'subtract'}}, 'returns': {'description': 'The transformed number.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Linear transformation between two ranges'}, {'categories': ['math > exponential & logarithmic'], 'deprecated': False, 'description': 'The natural logarithm is the logarithm to the base *e* of the number `x`, which equals to using the *log* process with the base set to *e*. The natural logarithm is the inverse function of taking *e* to the power x.\n\nThe no-data value `null` is passed through.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it. Therefore, `ln(0)` results in ±infinity if the processing environment supports it or otherwise an error is thrown.', 'examples': [{'arguments': {'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'ln', 'links': [{'href': 'http://mathworld.wolfram.com/NaturalLogarithm.html', 'rel': 'about', 'title': 'Natural logarithm explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'A number to compute the natural logarithm for.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'e': {'arguments': {}, 'process_id': 'e'}, 'log': {'arguments': {'base': {'from_node': 'e'}, 'x': {'from_parameter': 'x'}}, 'process_id': 'log', 'result': True}}, 'returns': {'description': 'The computed natural logarithm.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Natural logarithm'}, {'categories': ['cubes', 'import'], 'deprecated': False, 'description': 'Loads a collection from the current back-end by its id and returns it as processable data cube. The data that is added to the data cube can be restricted with the additional `spatial_extent`, `temporal_extent`, `bands` and `properties`.\n\n**Remarks:**\n\n* The bands (and all dimensions that specify nominal dimension labels) are expected to be ordered as specified in the metadata if the `bands` parameter is set to `null`.\n* If no additional parameter is specified this would imply that the whole data set is expected to be loaded. Due to the large size of many data sets this is not recommended and may be optimized by back-ends to only load the data that is actually required after evaluating subsequent processes such as filters. This means that the pixel values should be processed only after the data has been limited to the required extents and as a consequence also to a manageable size.', 'examples': [{'arguments': {'id': 'Sentinel-2', 'properties': {'eo:cloud_cover': {'process_graph': {'cc': {'arguments': {'max': 50, 'min': 0, 'x': {'from_parameter': 'value'}}, 'process_id': 'between', 'result': True}}}, 'platform': {'process_graph': {'pf': {'arguments': {'case_sensitive': False, 'x': {'from_parameter': 'value'}, 'y': 'Sentinel-2B'}, 'process_id': 'eq', 'result': True}}}}, 'spatial_extent': {'east': 16.6, 'north': 48.6, 'south': 47.2, 'west': 16.1}, 'temporal_extent': ['2018-01-01', '2019-01-01']}, 'description': 'Loading `Sentinel-2B` data from a `Sentinel-2` collection for 2018, but only with cloud cover between 0 and 50%.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'load_collection', 'links': [{'href': 'https://proj.org/usage/projections.html', 'rel': 'about', 'title': 'PROJ parameters for cartographic projections'}, {'href': 'http://www.epsg-registry.org', 'rel': 'about', 'title': 'Official EPSG code registry'}, {'href': 'http://www.epsg.io', 'rel': 'about', 'title': 'Unofficial EPSG code database'}, {'href': 'http://www.opengeospatial.org/standards/sfa', 'rel': 'about', 'title': 'Simple Features standard by the OGC'}, {'href': 'https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#common-band-names', 'rel': 'about', 'title': 'List of common band names as specified by the STAC specification'}], 'parameters': [{'deprecated': False, 'description': 'The collection id.', 'experimental': False, 'name': 'id', 'optional': False, 'schema': {'minItems': 0, 'pattern': '^[\\w\\-\\.~/]+$', 'subtype': 'collection-id', 'type': 'string'}}, {'deprecated': False, 'description': 'Limits the data to load from the collection to the specified bounding box or polygons.\n\nThe process puts a pixel into the data cube if the point at the pixel center intersects with the bounding box or any of the polygons (as defined in the Simple Features standard by the OGC).\n\nThe GeoJSON can be one of the following GeoJSON types:\n\n* A `Polygon` geometry,\n* a `GeometryCollection` containing Polygons,\n* a `Feature` with a `Polygon` geometry or\n* a `FeatureCollection` containing `Feature`s with a `Polygon` geometry.\n\nSet this parameter to `null` to set no limit for the spatial extent. Be careful with this when loading large datasets!', 'experimental': False, 'name': 'spatial_extent', 'optional': False, 'schema': [{'minItems': 0, 'properties': {'base': {'default': None, 'description': 'Base (optional, lower left corner, coordinate axis 3).', 'type': ['number', 'null']}, 'crs': {'anyOf': [{'examples': [3857], 'minimum': 1000, 'subtype': 'epsg-code', 'title': 'EPSG Code', 'type': 'integer'}, {'subtype': 'wkt2-definition', 'title': 'WKT2', 'type': 'string'}, {'deprecated': True, 'subtype': 'proj-definition', 'title': 'PROJ definition', 'type': 'string'}], 'default': 4326, 'description': 'Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/), [WKT2 (ISO 19162) string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html) or [PROJ definition (deprecated)](https://proj.org/usage/quickstart.html). Defaults to `4326` (EPSG code 4326) unless the client explicitly requests a different coordinate reference system.'}, 'east': {'description': 'East (upper right corner, coordinate axis 1).', 'type': 'number'}, 'height': {'default': None, 'description': 'Height (optional, upper right corner, coordinate axis 3).', 'type': ['number', 'null']}, 'north': {'description': 'North (upper right corner, coordinate axis 2).', 'type': 'number'}, 'south': {'description': 'South (lower left corner, coordinate axis 2).', 'type': 'number'}, 'west': {'description': 'West (lower left corner, coordinate axis 1).', 'type': 'number'}}, 'required': ['west', 'south', 'east', 'north'], 'subtype': 'bounding-box', 'title': 'Bounding Box', 'type': 'object'}, {'minItems': 0, 'subtype': 'geojson', 'title': 'GeoJSON', 'type': 'object'}, {'description': "Don't filter spatially. All data is included in the data cube.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}, {'deprecated': False, 'description': 'Limits the data by metadata properties to include only data in the data cube which all given conditions return `true` for (AND operation).\n\nSpecify key-value-pairs with the key being the name of the metadata property, which can be retrieved with the openEO Data Discovery for Collections. The value must a condition (user-defined process) to be evaluated against the collection metadata, see the example.', 'experimental': False, 'name': 'properties', 'optional': True, 'schema': [{'additionalProperties': {'parameters': [{'description': 'The property value to be checked against.', 'name': 'value', 'schema': {'description': 'Any data type.'}}], 'subtype': 'process-graph', 'type': 'object'}, 'description': 'A list of filters to check against. Specify key-value-pairs with the key being the name of the metadata property name and the value being a process evaluated against the metadata values.', 'minItems': 0, 'subtype': 'metadata-filter', 'title': 'Filters', 'type': 'object'}, {'description': "Don't filter by metadata properties.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}, {'deprecated': False, 'description': 'Limits the data to load from the collection to the specified left-closed temporal interval. Applies to all temporal dimensions. The interval has to be specified as an array with exactly two elements:\n\n1. The first element is the start of the temporal interval. The specified instance in time is **included** in the interval.\n2. The second element is the end of the temporal interval. The specified instance in time is **excluded** from the interval.\n\nThe specified temporal strings follow [RFC 3339](https://tools.ietf.org/html/rfc3339). Also supports open intervals by setting one of the boundaries to `null`, but never both.\n\nSet this parameter to `null` to set no limit for the spatial extent. Be careful with this when loading large datasets!', 'experimental': False, 'name': 'temporal_extent', 'optional': False, 'schema': [{'examples': [['2015-01-01T00:00:00Z', '2016-01-01T00:00:00Z'], ['2015-01-01', '2016-01-01']], 'items': {'anyOf': [{'format': 'date-time', 'subtype': 'date-time', 'type': 'string'}, {'format': 'date', 'subtype': 'date', 'type': 'string'}, {'maxLength': 4, 'minLength': 4, 'pattern': '^\\d{4}$', 'subtype': 'year', 'type': 'string'}, {'type': 'null'}]}, 'maxItems': 2, 'minItems': 2, 'subtype': 'temporal-interval', 'type': 'array'}, {'description': "Don't filter temporally. All data is included in the data cube.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}, {'deprecated': False, 'description': "Only adds the specified bands into the data cube so that bands that don't match the list of band names are not available. Applies to all dimensions of type `bands`.\n\nEither the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands) can be specified. If unique band name and common name conflict, the unique band name has higher priority.\n\nThe order of the specified array defines the order of the bands in the data cube. f multiple bands match a common name, all matched bands are included in the original order.", 'experimental': False, 'name': 'bands', 'optional': True, 'schema': [{'items': {'subtype': 'band-name', 'type': 'string'}, 'minItems': 0, 'type': 'array'}, {'description': "Don't filter bands. All bands are included in the data cube.", 'minItems': 0, 'title': 'No filter', 'type': 'null'}]}], 'process_graph': {}, 'returns': {'description': "A data cube for further processing. The dimensions and dimension properties (name, type, labels, reference system and resolution) correspond to the collection's metadata, but the dimension labels are restricted as specified in the parameters.", 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Load a collection'}, {'categories': ['math > exponential & logarithmic'], 'deprecated': False, 'description': 'Logarithm to the base `base` of the number `x` is defined to be the inverse function of taking b to the power of x.\n\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it. Therefore, `log(0, 2)` results in ±infinity if the processing environment supports it or otherwise an error is thrown.', 'examples': [{'arguments': {'base': 10, 'x': 10}, 'returns': 1}, {'arguments': {'base': 2, 'x': 2}, 'returns': 1}, {'arguments': {'base': 2, 'x': 4}, 'returns': 2}, {'arguments': {'base': 16, 'x': 1}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'log', 'links': [{'href': 'http://mathworld.wolfram.com/Logarithm.html', 'rel': 'about', 'title': 'Logarithm explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'A number to compute the logarithm for.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The numerical base.', 'experimental': False, 'name': 'base', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed logarithm.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Logarithm to a base'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the largest value of an array of numbers, which is is equal to the first element of a sorted (i.e., ordered) version the array.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [1, 0, 3, 2]}, 'returns': 3}, {'arguments': {'data': [5, 2.5, None, -0.7]}, 'returns': 5}, {'arguments': {'data': [1, 0, 3, None, 2], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'max', 'links': [{'href': 'http://mathworld.wolfram.com/Maximum.html', 'rel': 'about', 'title': 'Maximum explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The maximum value.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Maximum value'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'The arithmetic mean of an array of numbers is the quantity commonly called the average. It is defined as the sum of all elements divided by the number of elements.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [1, 0, 3, 2]}, 'returns': 1.5}, {'arguments': {'data': [9, 2.5, None, -2.5]}, 'returns': 3}, {'arguments': {'data': [1, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}, {'arguments': {'data': [None, None]}, 'description': 'The input array has only `null` elements: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'mean', 'links': [{'href': 'http://mathworld.wolfram.com/ArithmeticMean.html', 'rel': 'about', 'title': 'Arithmetic mean explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'count': {'arguments': {'condition': {'from_node': 'count_condition'}, 'data': {'from_parameter': 'data'}}, 'process_id': 'count'}, 'count_condition': {'arguments': {'accept': None, 'reject': True, 'value': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'if'}, 'divide': {'arguments': {'x': {'from_node': 'sum'}, 'y': {'from_node': 'count'}}, 'process_id': 'divide'}, 'if': {'arguments': {'accept': {'from_node': 'divide'}, 'value': {'from_node': 'neq'}}, 'process_id': 'if', 'result': True}, 'neq': {'arguments': {'x': {'from_node': 'count'}, 'y': 0}, 'process_id': 'neq'}, 'sum': {'arguments': {'data': {'from_parameter': 'data'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'sum'}}, 'returns': {'description': 'The computed arithmetic mean.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Arithmetic mean (average)'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'The statistical median of an array of numbers is the value separating the higher half from the lower half of the data.\n\nAn array without non-`null` elements resolves always with `null`.\n\n**Remarks:**\n\n* For a symmetric arrays, the result is equal to the ``mean()``.\n* The median can also be calculated by computing the ``quantiles()`` with a probability of *0.5*.', 'examples': [{'arguments': {'data': [1, 3, 3, 6, 7, 8, 9]}, 'returns': 6}, {'arguments': {'data': [1, 2, 3, 4, 5, 6, 8, 9]}, 'returns': 4.5}, {'arguments': {'data': [-1, -0.5, None, 1]}, 'returns': -0.5}, {'arguments': {'data': [-1, 0, None, 1], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}, {'arguments': {'data': [None, None]}, 'description': 'The input array has only `null` elements: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'median', 'links': [{'href': 'http://mathworld.wolfram.com/StatisticalMedian.html', 'rel': 'about', 'title': 'Statistical Median explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'array_element': {'arguments': {'data': {'from_node': 'quantiles'}, 'index': 0, 'return_nodata': True}, 'process_id': 'array_element', 'result': True}, 'quantiles': {'arguments': {'data': {'from_parameter': 'data'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}, 'probabilities': [0.5]}, 'process_id': 'quantiles'}}, 'returns': {'description': 'The computed statistical median.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Statistical median'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the smallest value of an array of numbers, which is is equal to the last element of a sorted (i.e., ordered) version the array.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [1, 0, 3, 2]}, 'returns': 0}, {'arguments': {'data': [5, 2.5, None, -0.7]}, 'returns': -0.7}, {'arguments': {'data': [1, 0, 3, None, 2], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'min', 'links': [{'href': 'http://mathworld.wolfram.com/Minimum.html', 'rel': 'about', 'title': 'Minimum explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The minimum value.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Minimum value'}, {'categories': ['math'], 'deprecated': False, 'description': 'Remainder after division of `x` by `y` for both integers and floating-point numbers.\n\nThe result of a modulo operation has the sign of the divisor. The handling regarding the sign of the result [differs between programming languages](https://en.wikipedia.org/wiki/Modulo_operation#In_programming_languages) and needs careful consideration to avoid unexpected results.\n\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`. A modulo by zero results in ±infinity if the processing environment supports it. Otherwise a `DivisionByZero` error must the thrown.', 'examples': [{'arguments': {'x': 27, 'y': 5}, 'returns': 2}, {'arguments': {'x': -27, 'y': 5}, 'returns': 3}, {'arguments': {'x': 3.14, 'y': -2}, 'returns': -0.86}, {'arguments': {'x': -27, 'y': -5}, 'returns': -2}, {'arguments': {'x': 27, 'y': None}, 'returns': None}, {'arguments': {'x': None, 'y': 5}, 'returns': None}], 'exceptions': {'DivisionByZero': {'http': 400, 'message': 'Division by zero is not supported.'}}, 'experimental': False, 'id': 'mod', 'links': [{'href': 'https://en.wikipedia.org/wiki/Modulo_operation', 'rel': 'about', 'title': 'Modulo explained by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'A number to be used as dividend.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'A number to be used as divisor.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The remainder after division.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Modulo'}, {'categories': ['cubes'], 'deprecated': False, 'description': 'The data cubes have to be compatible. A merge operation without overlap should be reversible with (a set of) filter operations for each of the two cubes. The process performs the join on overlapping dimensions, with the same name and type.\n\nAn overlapping dimension has the same name, type, reference system and resolution in both dimensions, but can have different labels. One of the dimensions can have different labels, for all other dimensions the labels must be equal. If data overlaps, the parameter `overlap_resolver` must be specified to resolve the overlap.\n\n**Examples for merging two data cubes:**\n\n1. Data cubes with the dimensions `x`, `y`, `t` and `bands` have the same dimension labels in `x`,`y` and `t`, but the labels for the dimension `bands` are `B1` and `B2` for the first cube and `B3` and `B4`. An overlap resolver is *not needed*. The merged data cube has the dimensions `x`, `y`, `t` and `bands` and the dimension `bands` has four dimension labels: `B1`, `B2`, `B3`, `B4`.\n2. Data cubes with the dimensions `x`, `y`, `t` and `bands` have the same dimension labels in `x`,`y` and `t`, but the labels for the dimension `bands` are `B1` and `B2` for the first data cube and `B2` and `B3` for the second. An overlap resolver is *required* to resolve overlap in band `B2`. The merged data cube has the dimensions `x`, `y`, `t` and `bands` and the dimension `bands` has three dimension labels: `B1`, `B2`, `B3`.\n3. Data cubes with the dimensions `x`, `y` and `t` have the same dimension labels in `x`,`y` and `t`. There are two options:\n 1. Keep the overlapping values separately in the merged data cube: An overlap resolver is *not needed*, but for each data cube you need to add a new dimension using ``add_dimension()``. The new dimensions must be equal, except that the labels for the new dimensions must differ by name. The merged data cube has the same dimensions and labels as the original data cubes, plus the dimension added with ``add_dimension()``, which has the two dimension labels after the merge.\n 2. Combine the overlapping values into a single value: An overlap resolver is *required* to resolve the overlap for all pixels. The merged data cube has the same dimensions and labels as the original data cubes, but all pixel values have been processed by the overlap resolver.\n4. Merging a data cube with dimensions `x`, `y`, `t` with another cube with dimensions `x`, `y` will join on the `x`, `y` dimension, so the lower dimension cube is merged with each time step in the higher dimensional cube. This can for instance be used to apply a digital elevation model to a spatiotemporal data cube.', 'exceptions': {'OverlapResolverMissing': {'http': 400, 'message': 'Overlapping data cubes, but no overlap resolver has been specified.'}}, 'experimental': False, 'id': 'merge_cubes', 'links': [{'href': 'https://en.wikipedia.org/wiki/Reduction_Operator', 'rel': 'about', 'title': 'Background information on reduction operators (binary reducers) by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'The first data cube.', 'experimental': False, 'name': 'cube1', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'The second data cube.', 'experimental': False, 'name': 'cube2', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'A reduction operator that resolves the conflict if the data overlaps. The reducer must return a value of the same data type as the input values are. The reduction operator may be a single process such as ``multiply()`` or consist of multiple sub-processes. `null` (the default) can be specified if no overlap resolver is required.', 'experimental': False, 'name': 'overlap_resolver', 'optional': True, 'schema': {'minItems': 0, 'parameters': [{'deprecated': False, 'description': 'The first value.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'description': 'Any data type.', 'minItems': 0}}, {'deprecated': False, 'description': 'The second value.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'description': 'Any data type.', 'minItems': 0}}, {'deprecated': False, 'description': 'Additional data passed by the user.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'subtype': 'process-graph', 'type': 'object'}}, {'deprecated': False, 'description': 'Additional data to be passed to the overlap resolver.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'process_graph': {}, 'returns': {'description': 'The merged data cube. See the process description for details regarding the dimensions and dimension properties (name, type, labels, reference system and resolution).', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Merging two data cubes'}, {'categories': ['math'], 'deprecated': False, 'description': 'Multiplies the two numbers `x` and `y` (*x * y*) and returns the computed product.\n\nNo-data values are taken into account so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'x': 5, 'y': 2.5}, 'returns': 12.5}, {'arguments': {'x': -2, 'y': -4}, 'returns': 8}, {'arguments': {'x': 1, 'y': None}, 'returns': None}], 'exceptions': {'MultiplicandMissing': {'http': 400, 'message': 'Multiplication requires at least two numbers.'}}, 'experimental': False, 'id': 'multiply', 'links': [{'href': 'http://mathworld.wolfram.com/Product.html', 'rel': 'about', 'title': 'Product explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'The multiplier.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The multiplicand.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'product': {'arguments': {'data': [{'from_parameter': 'x'}, {'from_parameter': 'y'}], 'ignore_nodata': False}, 'process_id': 'product', 'result': True}}, 'returns': {'description': 'The computed product of the two numbers.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Multiplication of two numbers'}, {'categories': ['math > indices', 'vegetation indices'], 'deprecated': False, 'description': "Computes the Normalized Difference Vegetation Index (NDVI). The NDVI is computed as *(nir - red) / (nir + red)*.\n\nThe `data` parameter expects a raster data cube with a dimension of type `bands` or a `DimensionAmbiguous` error is thrown otherwise. By default, the dimension must have at least two bands with the common names `red` and `nir` assigned or the user need to specify the parameters `nir` and `red`. Otherwise either the error `NirBandAmbiguous` or `RedBandAmbiguous` is thrown. The common names for each band are specified in the collection's band metadata and are *not* equal to the band names.\n\nBy default, the dimension of type `bands` is dropped by this process. To keep the dimension specify a new band name in the parameter `target_band`. This adds a new dimension label with the specified name to the dimension, which can be used to access the computed values. If a band with the specified name exists, a `BandExists` is thrown.\n\nThis process is very similar to the process ``normalized_difference()``, but determines the bands automatically based on the common names (`red`/`nir`) specified in the metadata.", 'exceptions': {'BandExists': {'http': 400, 'message': 'A band with the specified target name exists.'}, 'DimensionAmbiguous': {'http': 400, 'message': 'dimension of type `bands` is not available or is ambiguous..'}, 'NirBandAmbiguous': {'http': 400, 'message': "The NIR band can't be resolved, please specify a band name."}, 'RedBandAmbiguous': {'http': 400, 'message': "The red band can't be resolved, please specify a band name."}}, 'experimental': False, 'id': 'ndvi', 'links': [{'href': 'https://en.wikipedia.org/wiki/Normalized_difference_vegetation_index', 'rel': 'about', 'title': 'NDVI explained by Wikipedia'}, {'href': 'https://earthobservatory.nasa.gov/features/MeasuringVegetation/measuring_vegetation_2.php', 'rel': 'about', 'title': 'NDVI explained by NASA'}, {'href': 'https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#common-band-names', 'rel': 'about', 'title': 'List of common band names as specified by the STAC specification'}], 'parameters': [{'deprecated': False, 'description': 'A raster data cube with two bands that have the common names `red` and `nir` assigned.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'default': 'nir', 'deprecated': False, 'description': 'The name of the NIR band. Defaults to the band that has the common name `nir` assigned.\n\nEither the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands) can be specified. If unique band name and common name conflict, the unique band name has higher priority.', 'experimental': False, 'name': 'nir', 'optional': True, 'schema': {'minItems': 0, 'subtype': 'band-name', 'type': 'string'}}, {'default': 'red', 'deprecated': False, 'description': 'The name of the red band. Defaults to the band that has the common name `red` assigned.\n\nEither the unique band name (metadata field `name` in bands) or one of the common band names (metadata field `common_name` in bands) can be specified. If unique band name and common name conflict, the unique band name has higher priority.', 'experimental': False, 'name': 'red', 'optional': True, 'schema': {'minItems': 0, 'subtype': 'band-name', 'type': 'string'}}, {'deprecated': False, 'description': 'By default, the dimension of type `bands` is dropped. To keep the dimension specify a new band name in this parameter so that a new dimension label with the specified name will be added for the computed values.', 'experimental': False, 'name': 'target_band', 'optional': True, 'schema': [{'minItems': 0, 'pattern': '^\\w+$', 'type': 'string'}, {'minItems': 0, 'type': 'null'}]}], 'process_graph': {}, 'returns': {'description': 'A raster data cube containing the computed NDVI values. The structure of the data cube differs depending on the value passed to `target_band`:\n\n* `target_band` is `null`: The data cube does not contain the dimension of type `bands` any more, the number of dimensions decreases by one. The dimension properties (name, type, labels, reference system and resolution) for all other dimensions remain unchanged.\n* `target_band` is a string: The data cube keeps the same dimensions. The dimension properties remain unchanged, but the number of dimension labels for the dimension of type `bands` increases by one. The additional label is named as specified in `target_band`.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Normalized Difference Vegetation Index'}, {'categories': ['math > constants', 'math > trigonometric'], 'deprecated': False, 'description': 'The real number Pi (π) is a mathematical constant that is the ratio of the circumference of a circle to its diameter. The numerical value is approximately *3.14159*.', 'exceptions': {}, 'experimental': False, 'id': 'pi', 'links': [{'href': 'http://mathworld.wolfram.com/Pi.html', 'rel': 'about', 'title': 'Mathematical constant Pi explained by Wolfram MathWorld'}], 'parameters': [], 'process_graph': {}, 'returns': {'description': 'The numerical value of Pi.', 'schema': {'minItems': 0, 'type': 'number'}}, 'summary': 'Pi (π)'}, {'categories': ['math', 'math > exponential & logarithmic'], 'deprecated': False, 'description': 'Computes the exponentiation for the base `base` raised to the power of `p`.\n\nThe no-data value `null` is passed through and therefore gets propagated if any of the arguments is `null`.', 'examples': [{'arguments': {'base': 0, 'p': 2}, 'returns': 0}, {'arguments': {'base': 2.5, 'p': 0}, 'returns': 1}, {'arguments': {'base': 3, 'p': 3}, 'returns': 27}, {'arguments': {'base': 5, 'p': -1}, 'returns': 0.2}, {'arguments': {'base': 1, 'p': 0.5}, 'returns': 1}, {'arguments': {'base': 1, 'p': None}, 'returns': None}, {'arguments': {'base': None, 'p': 2}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'power', 'links': [{'href': 'http://mathworld.wolfram.com/Power.html', 'rel': 'about', 'title': 'Power explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'The numerical base.', 'experimental': False, 'name': 'base', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The numerical exponent.', 'experimental': False, 'name': 'p', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed value for `base` raised to the power of `p`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Exponentiation'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Multiplies all elements in a sequential array of numbers and returns the computed product.\n\nBy default no-data values are ignored. Setting `ignore_nodata` to `false` considers no-data values so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'data': [5, 0]}, 'returns': 0}, {'arguments': {'data': [-2, 4, 2.5]}, 'returns': -20}, {'arguments': {'data': [1, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': [-1]}, 'returns': -1}, {'arguments': {'data': [None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'product', 'links': [{'href': 'http://mathworld.wolfram.com/Product.html', 'rel': 'about', 'title': 'Product explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The computed product of the sequence of numbers.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Compute the product by multiplying numbers'}, {'categories': ['math'], 'deprecated': False, 'description': 'Calculates quantiles, which are cut points dividing the range of a probability distribution into either\n\n* intervals corresponding to the given `probabilities` or\n* (nearly) equal-sized intervals (q-quantiles based on the parameter `q`).\n\nEither the parameter `probabilites` or `q` must be specified, otherwise the `QuantilesParameterMissing` exception is thrown. If both parameters are set the `QuantilesParameterConflict` exception is thrown.', 'examples': [{'arguments': {'data': [2, 4, 4, 4, 5, 5, 7, 9], 'probabilities': [0.005, 0.01, 0.02, 0.05, 0.1, 0.5]}, 'returns': '[2.07, 2.14, 2.28, 2.7, 3.4, 4.5]'}, {'arguments': {'data': [2, 4, 4, 4, 5, 5, 7, 9], 'q': 4}, 'returns': '[4, 4.5, 5.5]'}, {'arguments': {'data': [-1, -0.5, None, 1], 'q': 2}, 'returns': '[-0.5]'}, {'arguments': {'data': [-1, -0.5, None, 1], 'ignore_nodata': False, 'q': 4}, 'returns': '[None, None, None]'}, {'arguments': {'data': [], 'probabilities': [0.1, 0.5]}, 'returns': '[None, None]', 'title': 'Empty array example'}], 'exceptions': {'QuantilesParameterConflict': {'http': 400, 'message': "The process 'quantiles' only allows that either the 'probabilities' or the 'q' parameter is set."}, 'QuantilesParameterMissing': {'http': 400, 'message': "The process 'quantiles' requires either the 'probabilities' or 'q' parameter to be set."}}, 'experimental': False, 'id': 'quantiles', 'links': [{'href': 'https://en.wikipedia.org/wiki/Quantile', 'rel': 'about', 'title': 'Quantiles explained by Wikipedia'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'deprecated': False, 'description': 'A list of probabilities to calculate quantiles for. The probabilities must be between 0 and 1.', 'experimental': False, 'name': 'probabilities', 'optional': True, 'schema': {'items': {'maximum': 1, 'minimum': 0, 'type': 'number'}, 'minItems': 0, 'type': 'array'}}, {'deprecated': False, 'description': 'A number of intervals to calculate quantiles for. Calculates q-quantiles with (nearly) equal-sized intervals.', 'experimental': False, 'name': 'q', 'optional': True, 'schema': {'minItems': 0, 'minimum': 2, 'type': 'integer'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that an array with `null` values is returned if any element is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': "An array with the computed quantiles. The list has either\n\n* as many elements as the given list of `probabilities` had or\n* *`q`-1* elements.\n\nIf the input array is empty the resulting array is filled with as many `null` values as required according to the list above. For an example, see the 'Empty array example'.", 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, 'summary': 'Quantiles'}, {'categories': ['cubes', 'reducer'], 'deprecated': False, 'description': 'Applies a unary reducer to a data cube dimension by collapsing all the pixel values along the specified dimension into an output value computed by the reducer. This process passes a list of values to the reducer. In contrast, ``reduce_dimension_binary()`` passes two values, which may be better suited especially for UDFs in case the number of values gets too large to be processed at once.\n\nThe dimension is dropped. To avoid this, use ``apply_dimension()`` instead.', 'exceptions': {'DimensionNotAvailable': {'http': 400, 'message': 'A dimension with the specified name does not exist.'}}, 'experimental': False, 'id': 'reduce_dimension', 'parameters': [{'deprecated': False, 'description': 'A data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': "A reducer to apply on the specified dimension. A reducer is a single process such as ``mean()`` or a set of processes, which computes a single value for a list of values, see the category 'reducer' for such processes.", 'experimental': False, 'name': 'reducer', 'optional': False, 'schema': {'minItems': 0, 'parameters': [{'deprecated': False, 'description': 'A labeled array with elements of any type.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'description': 'Any data type.'}, 'minItems': 0, 'subtype': 'labeled-array', 'type': 'array'}}, {'deprecated': False, 'description': 'Additional data passed by the user.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'subtype': 'process-graph', 'type': 'object'}}, {'deprecated': False, 'description': 'The name of the dimension over which to reduce. Fails with a `DimensionNotAvailable` error if the specified dimension does not exist.', 'experimental': False, 'name': 'dimension', 'optional': False, 'schema': {'minItems': 0, 'type': 'string'}}, {'deprecated': False, 'description': 'Additional data to be passed to the reducer.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'description': 'Any data type.', 'minItems': 0}}], 'process_graph': {}, 'returns': {'description': 'A data cube with the newly computed values. It is missing the given dimension, the number of dimensions decreases by one. The dimension properties (name, type, labels, reference system and resolution) for all other dimensions remain unchanged.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Reduce dimensions'}, {'categories': ['cubes'], 'deprecated': False, 'description': "Renames the labels of the specified dimension in the data cube from `source` to `target`.\n\nIf the array for the source labels is empty (the default), the dimension labels are expected to be enumerated with zero-based numbering (0,1,2,3,...) so that the dimension labels directly map to the indices of the array specified for the parameter `target`. If the dimension labels are not enumerated and the `target` parameter is not specified, a `LabelsNotEnumerated` is thrown. The number of source and target labels must be equal, otherwise the error `LabelMismatch` is thrown.\n\nThis process doesn't change the order of the labels and their corresponding data.", 'examples': [{'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'source': ['B1', 'B2', 'B3'], 'target': ['red', 'green', 'blue']}, 'description': 'Renaming the bands from `B1` to `red`, from `B2` to `green` and from `B3` to `blue`.', 'returns': None, 'title': 'Rename named labels'}], 'exceptions': {'LabelExists': {'http': 400, 'message': 'A label with the specified name exists.'}, 'LabelMismatch': {'http': 400, 'message': "The number of labels in the parameters `source` and `target` don't match."}, 'LabelNotAvailable': {'http': 400, 'message': 'A label with the specified name does not exist.'}, 'LabelsNotEnumerated': {'http': 400, 'message': 'The dimension labels are not enumerated.'}}, 'experimental': False, 'id': 'rename_labels', 'links': [{'href': 'https://processes.openeo.org/1.0.0/examples/rename-enumerated-labels.json', 'rel': 'example', 'title': 'Rename enumerated labels', 'type': 'application/json'}], 'parameters': [{'deprecated': False, 'description': 'The data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, {'deprecated': False, 'description': 'The name of the dimension to rename the labels for.', 'experimental': False, 'name': 'dimension', 'optional': False, 'schema': {'minItems': 0, 'type': 'string'}}, {'deprecated': False, 'description': 'The new names for the labels. The dimension labels in the data cube are expected to be enumerated, if the parameter `target` is not specified. If a target dimension label already exists in the data cube, a `LabelExists` error is thrown.', 'experimental': False, 'name': 'target', 'optional': False, 'schema': {'items': {'anyOf': [{'type': 'number'}, {'type': 'string'}]}, 'minItems': 0, 'type': 'array'}}, {'default': '[]', 'deprecated': False, 'description': "The names of the labels as they are currently in the data cube. The array defines an unsorted and potentially incomplete list of labels that should be renamed to the names available in the corresponding array elements in the parameter `target`. If one of the source dimension labels doesn't exist, a `LabelNotAvailable` error is thrown. By default, the array is empty so that the dimension labels in the data cube are expected to be enumerated.", 'experimental': False, 'name': 'source', 'optional': True, 'schema': {'items': {'anyOf': [{'type': 'number'}, {'type': 'string'}]}, 'minItems': 0, 'type': 'array'}}], 'process_graph': {}, 'returns': {'description': 'The data cube with the same dimensions. The dimension properties (name, type, labels, reference system and resolution) remain unchanged, except that for the given dimension the labels change. The old labels can not be referred to any longer. The number of labels remains the same.', 'schema': {'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}}, 'summary': 'Rename dimension labels'}, {'categories': ['math > rounding'], 'deprecated': False, 'description': 'Rounds a real number `x` to specified precision `p`.\n\nIf the fractional part of `x` is halfway between two integers, one of which is even and the other odd, then the even number is returned.\nThis behaviour follows [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229). This kind of rounding is also called "round to nearest (even)" or "banker\'s rounding". It minimizes rounding errors that result from consistently rounding a midpoint value in a single direction.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'p': 1, 'x': 3.56}, 'returns': 3.6}, {'arguments': {'p': 2, 'x': -0.4444444}, 'returns': -0.44}, {'arguments': {'x': -2.5}, 'returns': -2}, {'arguments': {'x': -3.5}, 'returns': -4}, {'arguments': {'p': -2, 'x': 1234.5}, 'returns': 1200}], 'exceptions': {}, 'experimental': False, 'id': 'round', 'links': [{'href': 'http://mathworld.wolfram.com/AbsoluteValue.html', 'rel': 'about', 'title': 'Absolute value explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'A number to round.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'default': 0, 'deprecated': False, 'description': 'A positive number specifies the number of digits after the decimal point to round to. A negative number means rounding to a power of ten, so for example *-2* rounds to the nearest hundred. Defaults to *0*.', 'experimental': False, 'name': 'p', 'optional': True, 'schema': {'minItems': 0, 'type': 'integer'}}], 'process_graph': {}, 'returns': {'description': 'The rounded number.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Round to a specified precision'}, {'categories': ['cubes', 'import', 'udf'], 'deprecated': False, 'description': "Runs an UDF in one of the supported runtime environments.\n\nThe process can either:\n\n1. load and run a locally stored UDF from a file in the workspace of the authenticated user. The path to the UDF file must be relative to the root directory of the user's workspace.\n2. fetch and run a remotely stored and published UDF by absolute URI, for example from [openEO Hub](https://hub.openeo.org)).\n3. run the source code specified inline as string.\n\nThe loaded UDF can be executed in several processes such as ``aggregate_spatial()``, ``apply()``, ``apply_dimension()`` and ``reduce_dimension()``. In this case an array is passed instead of a raster data cube. The user must ensure that the data is properly passed as an array so that the UDF can make sense of it.", 'exceptions': {'InvalidVersion': {'http': 400, 'message': 'The specified UDF runtime version is not supported.'}}, 'experimental': False, 'id': 'run_udf', 'parameters': [{'deprecated': False, 'description': 'The data to be passed to the UDF as array or raster data cube.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': [{'minItems': 0, 'subtype': 'raster-cube', 'title': 'Raster data cube', 'type': 'object'}, {'items': {'description': 'Any data type.'}, 'minItems': 1, 'title': 'Array', 'type': 'array'}, {'description': 'A single value of any data type.', 'minItems': 0, 'title': 'Single Value'}]}, {'deprecated': False, 'description': 'Either source code, an absolute URL or a path to an UDF script.', 'experimental': False, 'name': 'udf', 'optional': False, 'schema': [{'description': 'URI to an UDF', 'format': 'uri', 'minItems': 0, 'subtype': 'uri', 'type': 'string'}, {'description': 'Path to an UDF uploaded to the server.', 'minItems': 0, 'subtype': 'file-path', 'type': 'string'}, {'description': 'Source code as string', 'minItems': 0, 'subtype': 'udf-code', 'type': 'string'}]}, {'deprecated': False, 'description': 'An UDF runtime identifier available at the back-end.', 'experimental': False, 'name': 'runtime', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'udf-runtime', 'type': 'string'}}, {'deprecated': False, 'description': 'An UDF runtime version. If set to `null`, the default runtime version specified for each runtime is used.', 'experimental': False, 'name': 'version', 'optional': True, 'schema': [{'minItems': 0, 'subtype': 'udf-runtime-version', 'type': 'string'}, {'minItems': 0, 'title': 'Default runtime version', 'type': 'null'}]}, {'default': '{}', 'deprecated': False, 'description': 'Additional data such as configuration options that should be passed to the UDF.', 'experimental': False, 'name': 'context', 'optional': True, 'schema': {'minItems': 0, 'type': 'object'}}], 'process_graph': {}, 'returns': {'description': 'The data processed by the UDF.\n\n* Returns a raster data cube, if a raster data cube is passed for `data`. Details on the dimensions and dimension properties (name, type, labels, reference system and resolution) depend on the UDF.\n* If an array is passed for `data`, the returned value can be of any data type, but is exactly what the UDF returns.', 'schema': [{'minItems': 0, 'subtype': 'raster-cube', 'title': 'Raster data cube', 'type': 'object'}, {'description': 'Any data type.', 'minItems': 0, 'title': 'Any'}]}, 'summary': 'Run an UDF'}, {'categories': ['cubes', 'export'], 'deprecated': False, 'description': 'Saves processed data to the local user workspace / data store of the authenticated user. This process aims to be compatible to GDAL/OGR formats and options. STAC-compatible metadata should be stored with the processed data.\n\nCalling this process may be rejected by back-ends in the context of secondary web services.', 'exceptions': {'FormatUnsuitable': {'http': 400, 'message': "Data can't be transformed into the requested output format."}}, 'experimental': False, 'id': 'save_result', 'links': [{'href': 'https://www.gdal.org/formats_list.html', 'rel': 'about', 'title': 'GDAL Raster Formats'}, {'href': 'https://www.gdal.org/ogr_formats.html', 'rel': 'about', 'title': 'OGR Vector Formats'}], 'parameters': [{'deprecated': False, 'description': 'The data to save.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': [{'minItems': 0, 'subtype': 'raster-cube', 'type': 'object'}, {'minItems': 0, 'subtype': 'vector-cube', 'type': 'object'}]}, {'deprecated': False, 'description': 'The file format to save to. It must be one of the values that the server reports as supported output file formats, which usually correspond to the short GDAL/OGR codes. If the format is not suitable for storing the underlying data structure, a `FormatUnsuitable` exception will be thrown. This parameter is *case insensitive*.', 'experimental': False, 'name': 'format', 'optional': False, 'schema': {'minItems': 0, 'subtype': 'output-format', 'type': 'string'}}, {'default': '{}', 'deprecated': False, 'description': 'The file format parameters to be used to create the file(s). Must correspond to the parameters that the server reports as supported parameters for the chosen `format`. The parameter names and valid values usually correspond to the GDAL/OGR format options.', 'experimental': False, 'name': 'options', 'optional': True, 'schema': {'minItems': 0, 'subtype': 'output-format-options', 'type': 'object'}}], 'process_graph': {}, 'returns': {'description': '`false` if saving failed, `true` otherwise.', 'schema': {'minItems': 0, 'type': 'boolean'}}, 'summary': 'Save processed data to storage'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the sample standard deviation, which quantifies the amount of variation of an array of numbers. It is defined to be the square root of the corresponding variance (see ``variance()``).\n\nA low standard deviation indicates that the values tend to be close to the expected value, while a high standard deviation indicates that the values are spread out over a wider range.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [-1, 1, 3, None]}, 'returns': 2}, {'arguments': {'data': [-1, 1, 3, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sd', 'links': [{'href': 'http://mathworld.wolfram.com/StandardDeviation.html', 'rel': 'about', 'title': 'Standard deviation explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'power': {'arguments': {'base': {'from_node': 'variance'}, 'p': 0.5}, 'process_id': 'power', 'result': True}, 'variance': {'arguments': {'data': {'from_parameter': 'data'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'variance'}}, 'returns': {'description': 'The computed sample standard deviation.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Standard deviation'}, {'categories': ['math'], 'deprecated': False, 'description': 'The signum (also known as *sign*) of `x` is defined as:\n\n* *1* if *x > 0*\n* *0* if *x = 0*\n* *-1* if *x < 0*\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': -2}, 'returns': -1}, {'arguments': {'x': 3.5}, 'returns': 1}, {'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sgn', 'links': [{'href': 'http://mathworld.wolfram.com/Sign.html', 'rel': 'about', 'title': 'Sign explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'gt0': {'arguments': {'x': {'from_parameter': 'x'}, 'y': 0}, 'process_id': 'gt'}, 'if_gt0': {'arguments': {'accept': 1, 'reject': {'from_parameter': 'x'}, 'value': {'from_node': 'gt0'}}, 'process_id': 'if'}, 'if_lt0': {'arguments': {'accept': -1, 'reject': {'from_node': 'if_gt0'}, 'value': {'from_node': 'lt0'}}, 'process_id': 'if', 'result': True}, 'lt0': {'arguments': {'x': {'from_parameter': 'x'}, 'y': 0}, 'process_id': 'lt'}}, 'returns': {'description': 'The computed signum value of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Signum'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the sine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'sin', 'links': [{'href': 'http://mathworld.wolfram.com/Sine.html', 'rel': 'about', 'title': 'Sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed sine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Sine'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the hyperbolic sine of `x`.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'sinh', 'links': [{'href': 'http://mathworld.wolfram.com/HyperbolicSine.html', 'rel': 'about', 'title': 'Hyperbolic sine explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed hyperbolic sine of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Hyperbolic sine'}, {'categories': ['math', 'math > exponential & logarithmic'], 'deprecated': False, 'description': 'Computes the square root of a real number `x`, which is equal to calculating `x` to the power of *0.5*.\n\nA square root of x is a number a such that *a^2^ = x*. Therefore, the square root is the inverse function of a to the power of 2, but only for *a >= 0*.\n\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}, {'arguments': {'x': 1}, 'returns': 1}, {'arguments': {'x': 9}, 'returns': 3}, {'arguments': {'x': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sqrt', 'links': [{'href': 'http://mathworld.wolfram.com/SquareRoot.html', 'rel': 'about', 'title': 'Square root explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'A number.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {'power': {'arguments': {'base': {'from_parameter': 'x'}, 'p': 0.5}, 'process_id': 'power', 'result': True}}, 'returns': {'description': 'The computed square root.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Square root'}, {'categories': ['math'], 'deprecated': False, 'description': 'Subtracts argument `y` from the argument `x` (*x - y*) and returns the computed result.\n\nNo-data values are taken into account so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'x': 5, 'y': 2.5}, 'returns': 2.5}, {'arguments': {'x': -2, 'y': 4}, 'returns': -6}, {'arguments': {'x': 1, 'y': None}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'subtract', 'links': [{'href': 'http://mathworld.wolfram.com/Subtraction.html', 'rel': 'about', 'title': 'Subtraction explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'The minuend.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}, {'deprecated': False, 'description': 'The subtrahend.', 'experimental': False, 'name': 'y', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed result.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Subtraction of two numbers'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Sums up all elements in a sequential array of numbers and returns the computed sum.\n\nBy default no-data values are ignored. Setting `ignore_nodata` to `false` considers no-data values so that `null` is returned if any element is such a value.\n\nThe computations follow [IEEE Standard 754](https://ieeexplore.ieee.org/document/8766229) whenever the processing environment supports it.', 'examples': [{'arguments': {'data': [5, 1]}, 'returns': 6}, {'arguments': {'data': [-2, 4, 2.5]}, 'returns': 4.5}, {'arguments': {'data': [1, None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': [100]}, 'returns': 100}, {'arguments': {'data': [None], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'sum', 'links': [{'href': 'http://mathworld.wolfram.com/Sum.html', 'rel': 'about', 'title': 'Sum explained by Wolfram MathWorld'}, {'href': 'https://ieeexplore.ieee.org/document/8766229', 'rel': 'about', 'title': 'IEEE Standard 754-2019 for Floating-Point Arithmetic'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {}, 'returns': {'description': 'The computed sum of the sequence of numbers.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Compute the sum by adding up numbers'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the tangent of `x`. The tangent is defined to be the sine of x divided by the cosine of x.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'tan', 'links': [{'href': 'http://mathworld.wolfram.com/Tangent.html', 'rel': 'about', 'title': 'Tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed tangent of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Tangent'}, {'categories': ['math > trigonometric'], 'deprecated': False, 'description': 'Computes the hyperbolic tangent of `x`. The tangent is defined to be the hyperbolic sine of x divided by the hyperbolic cosine of x.\n\nWorks on radians only.\nThe no-data value `null` is passed through and therefore gets propagated.', 'examples': [{'arguments': {'x': 0}, 'returns': 0}], 'exceptions': {}, 'experimental': False, 'id': 'tanh', 'links': [{'href': 'http://mathworld.wolfram.com/HyperbolicTangent.html', 'rel': 'about', 'title': 'Hyperbolic tangent explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An angle in radians.', 'experimental': False, 'name': 'x', 'optional': False, 'schema': {'minItems': 0, 'type': ['number', 'null']}}], 'process_graph': {}, 'returns': {'description': 'The computed hyperbolic tangent of `x`.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Hyperbolic tangent'}, {'categories': ['math', 'reducer'], 'deprecated': False, 'description': 'Computes the sample variance of an array of numbers by calculating the square of the standard deviation (see ``sd()``). It is defined to be the expectation of the squared deviation of a random variable from its expected value. Basically, it measures how far the numbers in the array are spread out from their average value.\n\nAn array without non-`null` elements resolves always with `null`.', 'examples': [{'arguments': {'data': [-1, 1, 3]}, 'returns': 4}, {'arguments': {'data': [2, 3, 3, None, 4, 4, 5]}, 'returns': 1.1}, {'arguments': {'data': [-1, 1, None, 3], 'ignore_nodata': False}, 'returns': None}, {'arguments': {'data': []}, 'description': 'The input array is empty: return `null`.', 'returns': None}], 'exceptions': {}, 'experimental': False, 'id': 'variance', 'links': [{'href': 'http://mathworld.wolfram.com/Variance.html', 'rel': 'about', 'title': 'Variance explained by Wolfram MathWorld'}], 'parameters': [{'deprecated': False, 'description': 'An array of numbers.', 'experimental': False, 'name': 'data', 'optional': False, 'schema': {'items': {'type': ['number', 'null']}, 'minItems': 0, 'type': 'array'}}, {'default': True, 'deprecated': False, 'description': 'Indicates whether no-data values are ignored or not. Ignores them by default. Setting this flag to `false` considers no-data values so that `null` is returned if any value is such a value.', 'experimental': False, 'name': 'ignore_nodata', 'optional': True, 'schema': {'minItems': 0, 'type': 'boolean'}}], 'process_graph': {'apply': {'arguments': {'context': {'from_node': 'mean'}, 'data': {'from_parameter': 'data'}, 'process': {'process-graph': {'power': {'arguments': {'base': {'from_node': 'subtract'}, 'p': 2}, 'process_id': 'power', 'result': True}, 'subtract': {'arguments': {'x': {'from_parameter': 'x'}, 'y': {'from_parameter': 'context'}}, 'process_id': 'subtract'}}}}, 'process_id': 'apply'}, 'mean': {'arguments': {'data': {'from_parameter': 'data'}}, 'process_id': 'mean'}, 'mean2': {'arguments': {'data': {'from_node': 'apply'}, 'ignore_nodata': {'from_parameter': 'ignore_nodata'}}, 'process_id': 'mean', 'result': True}}, 'returns': {'description': 'The computed sample variance.', 'schema': {'minItems': 0, 'type': ['number', 'null']}}, 'summary': 'Variance'}]}, queue='process') parallelise_dag.set_upstream([save_13]) diff --git a/tests/test_write_airflow_dag.py b/tests/test_write_airflow_dag.py index 972cb1b..df3e397 100644 --- a/tests/test_write_airflow_dag.py +++ b/tests/test_write_airflow_dag.py @@ -14,120 +14,114 @@ def get_ref_node_from_name(name, all_nodes): return all_nodes[cur_ref_index] -def test_airflow_dag(test_folder, evi_file, csw_server_default, - setup_airflow_dag_folder, setup_ref_job_folder, backend_processes): - - job_data = os.path.join(test_folder, 'openeo_job') +def test_airflow_dag(evi_file, + airflow_dag_folder, setup_ref_job_folder, + backend_processes, S2_filepaths): job_id = "jb-12345" - out_filepath = os.path.join(os.environ['AIRFLOW_DAGS'], f'dag_{job_id}_prep.py') + out_filepath = os.path.join(airflow_dag_folder, f'dag_{job_id}_prep.py') user_name = "jdoe_67890" writer = AirflowDagWriter() - writer.write_and_move_job(job_id=job_id, user_name=user_name, process_graph_json=evi_file, job_data=job_data, - process_defs=backend_processes) + writer.write_and_move_job(job_id=job_id, user_name=user_name, dags_folder=airflow_dag_folder, process_graph_json=evi_file, job_data='./openeo_job', + process_defs=backend_processes, in_filepaths=S2_filepaths) with open(out_filepath) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') - ref_filepath = out_filepath.replace('.py', '_ref.py').replace(os.environ['AIRFLOW_DAGS'], os.environ['REF_JOBS']) + ref_filepath = out_filepath.replace('.py', '_ref.py').replace(airflow_dag_folder, os.environ['REF_JOBS']) with open(ref_filepath) as ref_file: ref_content = ref_file.read() assert out_content == ref_content -def test_airflow_dag_vrt_only(test_folder, evi_file, csw_server_default, - setup_airflow_dag_folder, setup_ref_job_folder, backend_processes): - - job_data = os.path.join(test_folder, 'openeo_job') +def test_airflow_dag_vrt_only(evi_file, + airflow_dag_folder, setup_ref_job_folder, + backend_processes, S2_filepaths): job_id = "jb-12346" - out_filepath = os.path.join(os.environ['AIRFLOW_DAGS'], f'dag_{job_id}_prep.py') + out_filepath = os.path.join(airflow_dag_folder, f'dag_{job_id}_prep.py') user_name = "jdoe_67890" writer = AirflowDagWriter() - writer.write_and_move_job(job_id=job_id, user_name=user_name, process_graph_json=evi_file, job_data=job_data, - process_defs=backend_processes, vrt_only=True) + writer.write_and_move_job(job_id=job_id, user_name=user_name, dags_folder=airflow_dag_folder, process_graph_json=evi_file, job_data='./openeo_job', + process_defs=backend_processes, in_filepaths=S2_filepaths, vrt_only=True) with open(out_filepath) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') - ref_filepath = out_filepath.replace('.py', '_ref.py').replace(os.environ['AIRFLOW_DAGS'], os.environ['REF_JOBS']) + ref_filepath = out_filepath.replace('.py', '_ref.py').replace(airflow_dag_folder, os.environ['REF_JOBS']) with open(ref_filepath) as outfile: ref_content = outfile.read() assert out_content == ref_content -def test_airflow_dag_parallel(test_folder, evi_file, setup_airflow_dag_folder, airflow_job_folder, - setup_ref_job_folder, backend_processes, csw_server_default): +def test_airflow_dag_parallel(evi_file, airflow_dag_folder, airflow_job_folder, + setup_ref_job_folder, backend_processes, S2_filepaths): - job_data = os.path.join(test_folder, 'openeo_job') + job_data = './openeo_job' job_id = "jb-12347" user_name = "jdoe_67890" writer = AirflowDagWriter() - writer.write_and_move_job(job_id=job_id, user_name=user_name, process_graph_json=evi_file, job_data=job_data, - process_defs=backend_processes, vrt_only=True, add_delete_sensor=True, add_parallel_sensor=True) + writer.write_and_move_job(job_id=job_id, user_name=user_name, dags_folder=airflow_dag_folder, process_graph_json=evi_file, job_data=job_data, + process_defs=backend_processes, in_filepaths=S2_filepaths, + vrt_only=True, add_delete_sensor=True, add_parallel_sensor=True) # Check DAG before parallelisation - out_filepath = os.path.join(os.environ['AIRFLOW_DAGS'], f'dag_{job_id}_prep.py') + out_filepath = os.path.join(airflow_dag_folder, f'dag_{job_id}_prep.py') with open(out_filepath) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') - ref_filepath = out_filepath.replace('.py', '_ref.py').replace(os.environ['AIRFLOW_DAGS'], os.environ['REF_JOBS']) + ref_filepath = out_filepath.replace('.py', '_ref.py').replace(airflow_dag_folder, os.environ['REF_JOBS']) with open(ref_filepath) as outfile: ref_content = outfile.read() assert out_content == ref_content # Simulate that job has ran (place vrt files in node folders) - if os.path.isdir(os.path.join(test_folder, 'openeo_job')): - rmtree(os.path.join(test_folder, 'openeo_job')) + if os.path.isdir(job_data): + rmtree(job_data) copytree(airflow_job_folder, job_data) + # Recreate (parallelised DAG) writer = AirflowDagWriter() - domain = writer.get_domain(job_id, user_name, evi_file, job_data, process_defs=backend_processes, + domain = writer.get_domain(job_id, user_name, airflow_dag_folder, evi_file, job_data, + process_defs=backend_processes, in_filepaths=S2_filepaths, vrt_only=False, parallelize_tasks=True, add_delete_sensor=True) # domain.job_id = domain.job_id + "_2" # (Re)write DAG, now parallelised writer.rewrite_and_move_job(domain) - rmtree(os.path.join(test_folder, 'openeo_job')) + rmtree(job_data) # Check DAG after parallelisation - out_filepath = os.path.join(os.environ['AIRFLOW_DAGS'], f'dag_{job_id}_parallel.py') + out_filepath = os.path.join(airflow_dag_folder, f'dag_{job_id}_parallel.py') with open(out_filepath) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') - ref_filepath = out_filepath.replace('.py', '_ref.py').replace(os.environ['AIRFLOW_DAGS'], os.environ['REF_JOBS']) + ref_filepath = out_filepath.replace('.py', '_ref.py').replace(airflow_dag_folder, os.environ['REF_JOBS']) with open(ref_filepath) as outfile: ref_content = outfile.read() assert out_content == ref_content -def test_airflow_dag_delete_sensor(test_folder, evi_file, setup_airflow_dag_folder, - setup_ref_job_folder, backend_processes, csw_server_default,): - - job_data = os.path.join(test_folder, 'openeo_job') +def test_airflow_dag_delete_sensor(evi_file, airflow_dag_folder, setup_ref_job_folder, + backend_processes, S2_filepaths): job_id = "jb-12345_delete_sensor" - out_filepath = os.path.join(os.environ['AIRFLOW_DAGS'], f'dag_{job_id}_prep.py') + out_filepath = os.path.join(airflow_dag_folder, f'dag_{job_id}_prep.py') user_name = "jdoe_67890" writer = AirflowDagWriter() - writer.write_and_move_job(job_id=job_id, user_name=user_name, process_graph_json=evi_file, job_data=job_data, - process_defs=backend_processes, add_delete_sensor=True) + writer.write_and_move_job(job_id=job_id, user_name=user_name, dags_folder=airflow_dag_folder, process_graph_json=evi_file, job_data='./openeo_job', + process_defs=backend_processes, in_filepaths=S2_filepaths, add_delete_sensor=True) with open(out_filepath) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') - ref_filepath = out_filepath.replace('.py', '_ref.py').replace(os.environ['AIRFLOW_DAGS'], os.environ['REF_JOBS']) + ref_filepath = out_filepath.replace('.py', '_ref.py').replace(airflow_dag_folder, os.environ['REF_JOBS']) with open(ref_filepath) as outfile: ref_content = outfile.read() assert out_content == ref_content diff --git a/tests/test_write_basic_job.py b/tests/test_write_basic_job.py index 5e32bd5..71a4267 100644 --- a/tests/test_write_basic_job.py +++ b/tests/test_write_basic_job.py @@ -7,11 +7,11 @@ from eodc_openeo_bindings.job_writer.basic_writer import BasicJobWriter -def test_basic(csw_server_default, test_folder, evi_file, out_filepath_basic, backend_processes, setup_ref_job_folder): - job_data = os.path.join(test_folder, 'basic_job') +def test_basic(test_folder, evi_file, out_filepath_basic, + backend_processes, S2_filepaths, setup_ref_job_folder): - BasicJobWriter().write_job(process_graph_json=evi_file, job_data=job_data, - process_defs=backend_processes, output_filepath=out_filepath_basic) + BasicJobWriter().write_job(process_graph_json=evi_file, job_data='./basic_job', + process_defs=backend_processes, in_filepaths=S2_filepaths, output_filepath=out_filepath_basic) with open(out_filepath_basic) as outfile: out_content = outfile.read() @@ -21,21 +21,19 @@ def test_basic(csw_server_default, test_folder, evi_file, out_filepath_basic, ba ref_filepath = os.path.join(os.environ['REF_JOBS'], filename + '_ref.py') with open(ref_filepath) as outfile: ref_content = outfile.read() - out_content = out_content.replace(test_folder, '') assert out_content == ref_content -def test_UC1_temporal_basic(acube_csw_server_default, test_folder, uc1_temporal_file, out_filepath_basic, setup_ref_job_folder): - job_data = os.path.join(test_folder, 'basic_job') +def test_UC1_temporal_basic(ACube_filepaths, test_folder, uc1_temporal_file, out_filepath_basic, setup_ref_job_folder): + backend_processes = 'https://openeo.eodc.eu/v1.0/processes' - BasicJobWriter().write_job(process_graph_json=uc1_temporal_file, job_data=job_data, - process_defs=backend_processes, output_filepath=out_filepath_basic) + BasicJobWriter().write_job(process_graph_json=uc1_temporal_file, job_data='./basic_job', + process_defs=backend_processes, in_filepaths=ACube_filepaths, output_filepath=out_filepath_basic) with open(out_filepath_basic) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') filepath_split = os.path.splitext(out_filepath_basic)[0] filename = filepath_split.split(os.path.sep)[-1] @@ -46,16 +44,15 @@ def test_UC1_temporal_basic(acube_csw_server_default, test_folder, uc1_temporal_ assert out_content == ref_content -def test_UC1_spectral_basic(acube_csw_server_default, test_folder, uc1_spectral_file, out_filepath_basic, setup_ref_job_folder): - job_data = os.path.join(test_folder, 'basic_job') +def test_UC1_spectral_basic(ACube_filepaths, test_folder, uc1_spectral_file, out_filepath_basic, setup_ref_job_folder): + backend_processes = 'https://openeo.eodc.eu/v1.0/processes' - BasicJobWriter().write_job(process_graph_json=uc1_spectral_file, job_data=job_data, - process_defs=backend_processes, output_filepath=out_filepath_basic) + BasicJobWriter().write_job(process_graph_json=uc1_spectral_file, job_data='./basic_job', + process_defs=backend_processes, in_filepaths=ACube_filepaths, output_filepath=out_filepath_basic) with open(out_filepath_basic) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') filepath_split = os.path.splitext(out_filepath_basic)[0] filename = filepath_split.split(os.path.sep)[-1] diff --git a/tests/test_write_basic_job_apply.py b/tests/test_write_basic_job_apply.py index b7dedf9..91ebc6c 100644 --- a/tests/test_write_basic_job_apply.py +++ b/tests/test_write_basic_job_apply.py @@ -7,15 +7,15 @@ from eodc_openeo_bindings.job_writer.basic_writer import BasicJobWriter -def test_basic(csw_server_default, test_folder, apply_file, out_filepath_basic_apply, setup_ref_job_folder, backend_processes): - job_data = os.path.join(test_folder, 'basic_job') +def test_basic(apply_file, out_filepath_basic_apply, + setup_ref_job_folder, backend_processes, S2_filepaths): - BasicJobWriter().write_job(process_graph_json=apply_file, job_data=job_data, - process_defs=backend_processes, output_filepath=out_filepath_basic_apply) + BasicJobWriter().write_job(process_graph_json=apply_file, job_data='./basic_job', + process_defs=backend_processes, in_filepaths=S2_filepaths, + output_filepath=out_filepath_basic_apply) with open(out_filepath_basic_apply) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') filepath_split = os.path.splitext(out_filepath_basic_apply)[0] filename = filepath_split.split(os.path.sep)[-1] diff --git a/tests/test_write_basic_udf.py b/tests/test_write_basic_udf.py index 93dc41c..8b0a48c 100644 --- a/tests/test_write_basic_udf.py +++ b/tests/test_write_basic_udf.py @@ -8,22 +8,14 @@ from eodc_openeo_bindings.job_writer.basic_writer import BasicJobWriter -def test_basic_python_udf(test_folder, out_filepath_basic, backend_processes, mocker): +def test_basic_python_udf(test_folder, out_filepath_basic, backend_processes, S2_filepaths): evi_file = os.path.join(test_folder, 'process_graphs', 'udf_python.json') - job_data = os.path.join(test_folder, 'output_udf_python') - csw_server_response = [ - '/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', - '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', - ] - mocker.patch('eodc_openeo_bindings.map_cubes_processes.csw_query', return_value=csw_server_response) - - BasicJobWriter().write_job(process_graph_json=evi_file, job_data=job_data, - process_defs=backend_processes, output_filepath=out_filepath_basic) + BasicJobWriter().write_job(process_graph_json=evi_file, job_data='./output_udf_python', + process_defs=backend_processes, in_filepaths=S2_filepaths[:2], output_filepath=out_filepath_basic) with open(out_filepath_basic) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') filepath_split = os.path.splitext(out_filepath_basic)[0] filename = filepath_split.split(os.path.sep)[-1] @@ -34,22 +26,14 @@ def test_basic_python_udf(test_folder, out_filepath_basic, backend_processes, mo assert out_content == ref_content -def test_basic_r_udf(test_folder, out_filepath_basic, backend_processes, mocker): +def test_basic_r_udf(test_folder, out_filepath_basic, backend_processes, S2_filepaths): evi_file = os.path.join(test_folder, 'process_graphs', 'udf_r.json') - job_data = os.path.join(test_folder, 'output_udf_r') - - csw_server_response = [ - '/s2a_prd_msil1c/2018/06/08/S2A_MSIL1C_20180608T101021_N0206_R022_T32TPS_20180608T135059.zip', - '/s2a_prd_msil1c/2018/06/11/S2A_MSIL1C_20180611T102021_N0206_R065_T32TPS_20180611T123241.zip', - ] - mocker.patch('eodc_openeo_bindings.map_cubes_processes.csw_query', return_value=csw_server_response) - BasicJobWriter().write_job(process_graph_json=evi_file, job_data=job_data, - process_defs=backend_processes, output_filepath=out_filepath_basic) + BasicJobWriter().write_job(process_graph_json=evi_file, job_data='./output_udf_r', + process_defs=backend_processes, in_filepaths=S2_filepaths[:2], output_filepath=out_filepath_basic) with open(out_filepath_basic) as outfile: out_content = outfile.read() - out_content = out_content.replace(test_folder, '') filepath_split = os.path.splitext(out_filepath_basic)[0] filename = filepath_split.split(os.path.sep)[-1]