From d3769f2f9db65ecd20b428656215232bbae11c69 Mon Sep 17 00:00:00 2001 From: Vasu Jaganath Date: Wed, 10 Jun 2026 18:28:26 -0400 Subject: [PATCH 1/3] feat: update the code to use new Sophios API --- .github/workflows/ci_send_pull_request.yml | 4 +- .github/workflows/ci_send_push.yml | 4 +- workflows/bbbc.py | 15 +++--- workflows/bbbc_sub.py | 55 +++------------------- 4 files changed, 18 insertions(+), 60 deletions(-) diff --git a/.github/workflows/ci_send_pull_request.yml b/.github/workflows/ci_send_pull_request.yml index b5e3466..f9393f4 100644 --- a/.github/workflows/ci_send_pull_request.yml +++ b/.github/workflows/ci_send_pull_request.yml @@ -65,5 +65,5 @@ jobs: sender_repo_owner: ${{ github.event.pull_request.head.repo.owner.login }} sender_repo_ref: ${{ github.event.pull_request.head.ref }} commit_message: ${{ env.commit_message }} - target_repository: workflow-inference-compiler - access_token: ${{ steps.generate_token.outputs.token }} \ No newline at end of file + target_repository: sophios + access_token: ${{ steps.generate_token.outputs.token }} diff --git a/.github/workflows/ci_send_push.yml b/.github/workflows/ci_send_push.yml index d9d4a7f..d5c69ed 100644 --- a/.github/workflows/ci_send_push.yml +++ b/.github/workflows/ci_send_push.yml @@ -29,5 +29,5 @@ jobs: sender_repo_owner: ${{ github.repository_owner }} sender_repo_ref: ${{ github.ref_name }} commit_message: ${{ github.event.head_commit.message }} - target_repository: workflow-inference-compiler - access_token: ${{ steps.generate_token.outputs.token }} \ No newline at end of file + target_repository: sophios + access_token: ${{ steps.generate_token.outputs.token }} diff --git a/workflows/bbbc.py b/workflows/bbbc.py index 73e0a39..6fd0439 100644 --- a/workflows/bbbc.py +++ b/workflows/bbbc.py @@ -1,9 +1,10 @@ from pathlib import Path -from sophios.apis.python.api import Step, Workflow +from sophios.apis.python.workflow import Step, Workflow + def workflow() -> Workflow: - bbbcdownload = Step(clt_path='../image-workflows/cwl_adapters/bbbcdownload.cwl') + bbbcdownload = Step(clt_path='cwl_adapters/bbbcdownload.cwl') # NOTE: object fields monkey patched at runtime from *.cwl file bbbcdownload.name = 'BBBC001' bbbcdownload.outDir = Path('bbbcdownload.outDir') @@ -12,30 +13,30 @@ def workflow() -> Workflow: subdirectory.directory = bbbcdownload.outDir subdirectory.glob_pattern = 'bbbcdownload.outDir/BBBC/BBBC001/raw/Images/human_ht29_colon_cancer_1_images/' - filerenaming = Step(clt_path='../image-workflows/cwl_adapters/file-renaming.cwl') + filerenaming = Step(clt_path='cwl_adapters/file-renaming.cwl') # NOTE: FilePattern {} syntax shadows python f-string {} syntax filerenaming.filePattern = '.*_{row:c}{col:dd}f{f:dd}d{channel:d}.tif' filerenaming.inpDir = subdirectory.subdirectory filerenaming.outDir = Path('file-renaming.outDir') filerenaming.outFilePattern = 'x{row:dd}_y{col:dd}_p{f:dd}_c{channel:d}.tif' - omeconverter = Step(clt_path='../image-workflows/cwl_adapters/ome-converter.cwl') + omeconverter = Step(clt_path='cwl_adapters/ome-converter.cwl') omeconverter.inpDir = filerenaming.outDir omeconverter.filePattern = '.*.tif' omeconverter.outDir = Path('omeconverter.outDir') - montage = Step(clt_path='../image-workflows/cwl_adapters/montage.cwl') + montage = Step(clt_path='cwl_adapters/montage.cwl') montage.inpDir = omeconverter.outDir montage.filePattern = 'x00_y03_p{p:dd}_c0.ome.tif' montage.layout = 'p' montage.outDir = Path('montage.outDir') - image_assembler = Step(clt_path='../image-workflows/cwl_adapters/image_assembler.cwl') + image_assembler = Step(clt_path='cwl_adapters/image_assembler.cwl') image_assembler.stitchPath = montage.outDir image_assembler.imgPath = omeconverter.outDir image_assembler.outDir = Path('image_assembler.outDir') - precompute_slide = Step(clt_path='../image-workflows/cwl_adapters/precompute_slide.cwl') + precompute_slide = Step(clt_path='cwl_adapters/precompute_slide.cwl') precompute_slide.inpDir = image_assembler.outDir precompute_slide.pyramidType = 'Zarr' precompute_slide.imageType = 'image' diff --git a/workflows/bbbc_sub.py b/workflows/bbbc_sub.py index 3610927..b9d1d6e 100644 --- a/workflows/bbbc_sub.py +++ b/workflows/bbbc_sub.py @@ -1,8 +1,7 @@ from pathlib import Path -from sophios import plugins -from sophios.apis.python import api -from sophios.apis.python.api import Step, Workflow +from sophios.apis.python.workflow import Step, Workflow + def workflow() -> Workflow: bbbcdownload = Step(clt_path='cwl_adapters/bbbcdownload.cwl') @@ -10,7 +9,7 @@ def workflow() -> Workflow: bbbcdownload.name = 'BBBC001' bbbcdownload.outDir = Path('bbbcdownload.outDir') - subdirectory = Step(clt_path='../workflow-inference-compiler/cwl_adapters/subdirectory.cwl') + subdirectory = Step(clt_path='../sophios/cwl_adapters/subdirectory.cwl') subdirectory.directory = bbbcdownload.outDir subdirectory.glob_pattern = 'bbbcdownload.outDir/BBBC/BBBC001/raw/Images/human_ht29_colon_cancer_1_images/' @@ -21,56 +20,14 @@ def workflow() -> Workflow: filerenaming.outDir = Path('file-renaming.outDir') filerenaming.outFilePattern = 'x{row:dd}_y{col:dd}_p{f:dd}_c{channel:d}.tif' - # Trivially wrap the subdirectory step in a subworkflow. - # But notice that we are still linking the individual Steps above, - # which defeats the whole purpose of having reusable black boxes. - steps = [bbbcdownload, - Workflow([subdirectory], 'bbbc_sub_sub_py'), - filerenaming] - filename = 'bbbc_sub_py' # .yml - return Workflow(steps, filename) + steps = [bbbcdownload, subdirectory, filerenaming] + return Workflow(steps, 'bbbc_sub_py') def workflow2() -> Workflow: - bbbcdownload = Step(clt_path='cwl_adapters/bbbcdownload.cwl') - # NOTE: object fields monkey patched at runtime from *.cwl file - bbbcdownload.name = 'BBBC001' - bbbcdownload.outDir = Path('bbbcdownload.outDir') + return workflow() - subdirectory = Step(clt_path='../workflow-inference-compiler/cwl_adapters/subdirectory.cwl') - subworkflow = Workflow([subdirectory], 'bbbc_sub_sub_py') # fails validation, due to - # https://workflow-inference-compiler.readthedocs.io/en/latest/dev/algorithms.html#deferred-satisfaction - - # First link all inputs within the subworkflow to the explicit inputs: tag. - # i.e. This is the API for the subworkflow. - subworkflow.steps[0].directory = subworkflow.directory - subworkflow.steps[0].glob_pattern = subworkflow.glob_pattern - - # Then apply arguments at the call site. - # Notice how the caller does not need to know about the internal details of the subworkflow - # (For example, that the subdirectory step is index 0) - subworkflow.directory = bbbcdownload.outDir - subworkflow.glob_pattern = 'bbbcdownload.outDir/BBBC/BBBC001/raw/Images/human_ht29_colon_cancer_1_images/' - - filerenaming = Step(clt_path='cwl_adapters/file-renaming.cwl') - # NOTE: FilePattern {} syntax shadows python f-string {} syntax - filerenaming.filePattern = '.*_{row:c}{col:dd}f{f:dd}d{channel:d}.tif' - filerenaming.inpDir = subworkflow.steps[0].subdirectory # TODO: workflow outputs: tag - filerenaming.outDir = Path('file-renaming.outDir') - filerenaming.outFilePattern = 'x{row:dd}_y{col:dd}_p{f:dd}_c{channel:d}.tif' - - steps = [bbbcdownload, - subworkflow, - filerenaming] - filename = 'bbbc_sub_py' # .yml - return Workflow(steps, filename) - - -# viz = workflow() -# viz.compile() # Do NOT .run() here if __name__ == '__main__': - api.global_config = plugins.get_tools_cwl(str(Path().home())) # Use path fallback - viz = workflow2() viz.run() # .run() here, inside main From 4433174f026c2aa20502f9d51b320b24755fe381 Mon Sep 17 00:00:00 2001 From: Vasu Jaganath Date: Tue, 16 Jun 2026 09:08:06 -0400 Subject: [PATCH 2/3] fix: correct the import names again --- workflows/bbbc.py | 2 +- workflows/bbbc_sub.py | 26 ++++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/workflows/bbbc.py b/workflows/bbbc.py index 6fd0439..dd7a31e 100644 --- a/workflows/bbbc.py +++ b/workflows/bbbc.py @@ -1,6 +1,6 @@ from pathlib import Path -from sophios.apis.python.workflow import Step, Workflow +from sophios.api.python.workflow import Step, Workflow def workflow() -> Workflow: diff --git a/workflows/bbbc_sub.py b/workflows/bbbc_sub.py index b9d1d6e..4a77400 100644 --- a/workflows/bbbc_sub.py +++ b/workflows/bbbc_sub.py @@ -1,6 +1,6 @@ from pathlib import Path -from sophios.apis.python.workflow import Step, Workflow +from sophios.api.python.workflow import Step, Workflow def workflow() -> Workflow: @@ -25,7 +25,29 @@ def workflow() -> Workflow: def workflow2() -> Workflow: - return workflow() + bbbcdownload = Step(clt_path='cwl_adapters/bbbcdownload.cwl') + # NOTE: object fields monkey patched at runtime from *.cwl file + bbbcdownload.name = 'BBBC001' + bbbcdownload.outDir = Path('bbbcdownload.outDir') + + subdirectory = Step(clt_path='../sophios/cwl_adapters/subdirectory.cwl') + subworkflow = Workflow([subdirectory], 'bbbc_sub_sub_py') + subworkflow.add_input('directory', 'Directory') + subworkflow.add_input('glob_pattern', 'string') + subdirectory.directory = subworkflow.inputs.directory + subdirectory.glob_pattern = subworkflow.inputs.glob_pattern + # Intentionally leave directory unbound; Sophios infers it from bbbcdownload.outDir. + subworkflow.glob_pattern = 'bbbcdownload.outDir/BBBC/BBBC001/raw/Images/human_ht29_colon_cancer_1_images/' + + filerenaming = Step(clt_path='cwl_adapters/file-renaming.cwl') + # NOTE: FilePattern {} syntax shadows python f-string {} syntax + filerenaming.filePattern = '.*_{row:c}{col:dd}f{f:dd}d{channel:d}.tif' + # Intentionally leave inpDir unbound; Sophios infers it from the preceding subworkflow output. + filerenaming.outDir = Path('file-renaming.outDir') + filerenaming.outFilePattern = 'x{row:dd}_y{col:dd}_p{f:dd}_c{channel:d}.tif' + + steps = [bbbcdownload, subworkflow, filerenaming] + return Workflow(steps, 'bbbc_sub_py') if __name__ == '__main__': From bb0f73d533555089abfffa638cac38d168abf4b6 Mon Sep 17 00:00:00 2001 From: Vasu Jaganath Date: Wed, 1 Jul 2026 10:45:46 -0400 Subject: [PATCH 3/3] fix: remove superflous add_input and add a gitignore to the repo --- .gitignore | 9 +++++++++ workflows/bbbc_sub.py | 8 +++----- 2 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05cf733 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +__pycache__/ +*.py[cod] + +.mypy_cache/ +.pytest_cache/ + +autogenerated/ +provenance/ +output_*.json diff --git a/workflows/bbbc_sub.py b/workflows/bbbc_sub.py index 4a77400..296f7fc 100644 --- a/workflows/bbbc_sub.py +++ b/workflows/bbbc_sub.py @@ -32,12 +32,10 @@ def workflow2() -> Workflow: subdirectory = Step(clt_path='../sophios/cwl_adapters/subdirectory.cwl') subworkflow = Workflow([subdirectory], 'bbbc_sub_sub_py') - subworkflow.add_input('directory', 'Directory') - subworkflow.add_input('glob_pattern', 'string') - subdirectory.directory = subworkflow.inputs.directory - subdirectory.glob_pattern = subworkflow.inputs.glob_pattern + subdirectory.inputs.directory = subworkflow.inputs.directory + subdirectory.inputs.glob_pattern = subworkflow.inputs.glob_pattern # Intentionally leave directory unbound; Sophios infers it from bbbcdownload.outDir. - subworkflow.glob_pattern = 'bbbcdownload.outDir/BBBC/BBBC001/raw/Images/human_ht29_colon_cancer_1_images/' + subworkflow.inputs.glob_pattern = 'bbbcdownload.outDir/BBBC/BBBC001/raw/Images/human_ht29_colon_cancer_1_images/' filerenaming = Step(clt_path='cwl_adapters/file-renaming.cwl') # NOTE: FilePattern {} syntax shadows python f-string {} syntax