broadinstitute / lincs-cell-painting

Processed Cell Painting Data for the LINCS Drug Repurposing Project
BSD 3-Clause "New" or "Revised" License
25 stars 13 forks source link

Upload Image Files to IDR #54

Open shntnu opened 3 years ago

shntnu commented 3 years ago

We will upload image files to the Image Data Resource and add URL and metadata information to the Broad Bioimage Benchmark Collection.

We will use this issue to outline the required steps.

From IDR:

  1. study file describing the overall study and the screens that were performed e.g. cell health
  2. library file(s) describing the plate layout of each screen e.g. cell health
  3. processed data file(s) containing summary results and/or a ‘hit' list for each screen

All files should be in tab-delimited text format. Templates are provided but can be modified to suit your experiment. Add or remove columns from the templates as necessary.

@gwaygenomics Did you have a processed data file for cell health?

shntnu commented 3 years ago

A conclusion from our internal discussion: Let's also include the LKCP dataset when submitting to IDR.

gwaybio commented 3 years ago

The first step is to reach out to IDR to see if they would be interested in hosting these data. I plan on doing this today.

Becki will be taking notes on the submission process, on the wiki. I will use this issue to jot down specific metadata information that we'll likely need to track for IDR.

A couple immediate answers to track:

How many files? How big is the total set?

Batch Plates File count Size
2016_04_01_a549_48hr_batch1 136 ~2,200,000 22 TB
2017_12_05_Batch2 135 ~2,700,000 23.8 TB

Could you send us a draft of the publication or is it submitted to an pre-print archive such as BioRxiv? Do you have a time line for publication?

We hope to submit a preprint in 2-3 months.

What is the image file format?

.tiff

Do you have feature level data, ROIs or tracking data available for this dataset?

Yes. Feature level data are available at https://github.com/broadinstitute/lincs-cell-painting/

Could this dataset can be integrated with other datasets e.g. through genes (orthologs) or phenotypes?

Definitely. These data are morphologies after thousands of drug perturbations. Data can be linked by drug information.

gwaybio commented 3 years ago

Initial inquiry sent on March 16, 2021 with ipLINCS project tag and subject: "[IDR] LINCS Cell Painting - a 45TB benchmark dataset of drug perturbations"

gwaybio commented 3 years ago

On March 23, 2021, we received word from the IDR staff that they will not accept our data without first a manuscript draft.

I believe the current plan is to introduce this dataset with the LINCS profiling complementarity paper.

shntnu commented 2 years ago

I've created a checklist based on an email Frances Wong:


Transfer images

We’ve recently setup the Globus platform for file transfer (https://www.globus.org/).

When preparing your image files for transfer, you may wish to refer to your previous submission (idr00080) as scripts like https://github.com/IDR/idr0080-way-perturbation/blob/master/scripts/illumcorrect_plate_symlinks.sh may be useful.

Note: We will not create illumination corrected files; we don't have the capacity to do that. See https://github.com/broadinstitute/cell-health/issues/106 to understand why this is a very labor-intensive task.

Steps

du -h --max-depth 0 /cmap/imaging/2015_10_05_DrugRepurposing_AravindSubramanian_GolubLab_Broad/2016_04_01_a549_48hr_batch1/images/
26T     /cmap/imaging/2015_10_05_DrugRepurposing_AravindSubramanian_GolubLab_Broad/2016_04_01_a549_48hr_batch1/images/

Upload script

TOP_LEVEL_FOLDER=/cmap/imaging/2015_10_05_DrugRepurposing_AravindSubramanian_GolubLab_Broad/2016_04_01_a549_48hr_batch1/images/
aws s3 sync \
  --profile jump-cp-role \
  --acl bucket-owner-full-control \
  ${TOP_LEVEL_FOLDER} \
  s3://cellpainting-gallery/lincs/broad/images/2016_04_01_a549_48hr_batch1/images/

I should exclude 4 plates because these were bad plates (they got left behind in the freezer, and the images were terrible once we did image them; they were excluded from all analyses)

 parallel aws s3 rm --recursive --profile jump-cp-role s3://cellpainting-gallery/lincs/broad/images/2016_04_01_a549_48hr_batch1/images/{1} ::: SQ00015225__2016-10-29T16_09_17-Measurement1 SQ00015226__2016-10-29T17_50_20-Measurement1 SQ00015227__2016-10-29T19_31_37-Measurement1 SQ00015228__2016-10-29T21_13_50-Measurement1

Fill templates

As before with idr0080, we need some information about the study and the images for this new submission. We have some metadata templates for this information. Empty templates can be downloaded here https://github.com/IDR/idr0000-lastname-example/archive/master.zip.

There are 3 template files to fill in.

There are examples of completed templates for other studies here https://github.com/IDR/idr-metadata/. Please try to fill in as much information as you can.

Our most recent submission is idr0080:

Wrap up

Please keep using idr@openmicroscopy.org email address for any future communication.

shntnu commented 2 years ago

@gwaygenomics Any thoughts on this?

gwaybio commented 2 years ago

I didn't add phenotypes or any quantification to the cell health submission.

The info on the right is all I provided:

image

https://idr.openmicroscopy.org/webclient/?show=screen-2701

Thanks!

shntnu commented 2 years ago
  • [ ] @gwaygenomics Please note accepted datasets will be published under the Creative Commons Attribution 4.0 International license (CC BY 4.0, https://creativecommons.org/licenses/by/4.0/). If this is not suitable please discuss your preferred licence with us before submitting any data.

This is less permissive than the license that we will use in the s3://cellpainting-gallery (CC0 https://github.com/awslabs/open-data-registry/blob/899c7a0e44e331dfc9c844a2a28261406ad73eb7/datasets/cellpainting-gallery.yml#L29) but that's ok I think. Do you see any issues @gwaygenomics ?

gwaybio commented 2 years ago

Sounds good to me 👍 - as long as people are free to use, I'm good

francesw commented 2 years ago

It's fine, we are happy to go with a more permissive license than CC BY 4.0, so CC0 is good for us. Thanks

gwaybio commented 2 years ago

Hi all! Sorry to not have pinged sooner, but how are we doing with this upload?

We received favorable reviews, but the journal will not publish without public data. Thanks! (hope all is well!)

shntnu commented 2 years ago

@joshmoore said:

The next step is for you to send us a link to the Docker you already have for doing these conversions, and then Erin will create a tool use the template https://github.com/CellProfiler/Distributed-Something to do the conversion, and then actually do the conversion.

I gave everything a trial run earlier this week sans upload. (Scripts below) Download went well enough. With default parameters, conversion took 4 hours. If the download/upload are not part of the blackbox, then I can create this as an official image like “openmicroscopy/bioformats2raw”. If we want more logic within, then we’ll need to discuss naming.

head -n 100 download.sh

aws --no-sign-request --region us-east-1 s3 ls --summarize --human-readable --recursive s3://cellpainting-gallery/lincs/broad/images/2016_04_01_a549_48hr_batch1/images/SQ00014812__2016-05-23T20_44_31-Measurement1/Images/ 2>&1 | tail -n 2

exec time \
    conda run -n aws \
    aws --no-sign-request --region us-east-1 s3 sync \
    s3://cellpainting-gallery/lincs/broad/images/2016_04_01_a549_48hr_batch1/images/SQ00014812__2016-05-23T20_44_31-Measurement1/Images/ \
    SQ00014812__2016-05-23T20_44_31-Measurement1/Images/ | tee "$(date "+%F_%T").log"

head -n 100 run.sh

time sudo docker run \
    -u $(id -u) -v $PWD:/src --rm josh-bf2raw \
    --debug=INFO \
    /src/SQ00014812__2016-05-23T20_44_31-Measurement1/Images/Index.idx.xml \
    /src/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr

head -n 100 docker/Dockerfile

# See https://github.com/mamba-org/micromamba-docker

FROM mambaorg/micromamba

COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml

RUN micromamba install -y -f /tmp/env.yaml && \

    micromamba clean --all --yes

ENTRYPOINT ["/usr/local/bin/_entrypoint.sh", "bioformats2raw"]
du -sh SQ00014812__2016-05-23T20_44_31-Measurement1*
151G     SQ00014812__2016-05-23T20_44_31-Measurement1
202G     SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr
ome_zarr info SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/
/data/josh/cellpainting/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr [zgroup]

- metadata
   - Plate

- data
   - (1, 5, 1, 2160, 3240)
ome_zarr info SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/0/0/0
/data/josh/cellpainting/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/0/0/0 [zgroup]

- metadata
   - Multiscales

- data

   - (1, 5, 1, 2160, 2160)
   - (1, 5, 1, 1080, 1080)
   - (1, 5, 1, 540, 540)
   - (1, 5, 1, 270, 270)
   - (1, 5, 1, 135, 135)
shntnu commented 2 years ago

Over to @ErinWeisbart and @bethac07

bethac07 commented 2 years ago

@joshmoore -

If the download/upload are not part of the blackbox, then I can create this as an official image like “openmicroscopy/bioformats2raw”. If we want more logic within, then we’ll need to discuss naming

I think it makes sense to leave the download and upload out .

joshmoore commented 2 years ago

@bethac07 : Perfect. Thanks.

shntnu commented 2 years ago

151G SQ000148122016-05-23T20_44_31-Measurement1 202G SQ000148122016-05-23T20_44_31-Measurement1.ome.zarr

@joshmoore – do we expect this 33% increase in storage?

From David Logan, I had learned this:

With zlib compression switch on when running bioformat2raw causes a small (~5%) but acceptable increase in storage space for cell painting-style HCS images.

I wonder if the zlib compression switch was off in your conversion?

joshmoore commented 2 years ago

@joshmoore – do we expect this 33% increase in storage?

On average the TIFFs are 9 MB and 5 make up the equivalent of one OME Image. Looking at the pyramid of an OME-Zarr:

(base) [jamoore@pilot-zarr1-dev cellpainting]$ du -sh SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/4/0/6/*
45M SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/4/0/6/0
12M SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/4/0/6/1
2.8M    SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/4/0/6/2
720K    SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/4/0/6/3
184K    SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/4/0/6/4

the full resolution matches 5*9MB. So the extra space should come primarily from the extra four levels of the pyramid (1080x1080, 540x540, 270x270 and 135x135):

>>> 45 * 0.34
15.3
>>> 12 + 2.8 + .72 + .184
15.704

A different compression might help, but configuring the pyramid levels will definitely make a difference:

  "compressor" : {
    "clevel" : 5,
    "blocksize" : 0,
    "shuffle" : 1,
    "cname" : "lz4",
    "id" : "blosc"
  },
shntnu commented 2 years ago

Thanks for the explainer @joshmoore!

A different compression might help, but configuring the pyramid levels will definitely make a difference:

Is this a decision that IDR will make (to keep it standard across all datasets) or do we need to / get to decide? If we need to decide, we might need some help on understanding what we'd trade if we went with fewer levels (better storage-wise but worse interactivity-wise?)

sbesson commented 2 years ago

At least from the OMERO perspective, the individual fields of view would not classify under the category of large images (aka larger than 3K x 3K) where the server would mandate pyramidal levels. This means all data access operations would only happen using tiled access to the top-level resolution .

Said otherwise, the intermediate resolutions generated are not critical for OMERO/IDR and we can likely make compromises in order to keep the data volumes largely equivalent between both representation. I pre-computing some intermediate resolution levels in the NGFF representation is valuable. In particular the lowest resolution typically correspond to the thumbnail representation of a field of view. OMERO currently recomputes these levels internally but with growing usage of NGFF, I could certainly imagine it could make natively use of these resolutions if they exist.

Maybe rather than using scale factor of 2 which will create a 1/4+1/16+1/64+1/256 i.e. a 33% increase, we could use a scale factor of 4 which would bring us to 1/16+1/256 i.e. a 6.7 % increase for the conversion?

ErinWeisbart commented 2 years ago

I've talked to Beth and I think I'm up to speed on my part of this project, at least as up-to-speed as I can get without starting to get my hands dirty. (Sorry for missing out on joining the meeting, but I'm on the West Coast which makes it quite a challenge to reasonably schedule meetings with folks across the pond).

It sounds like I should go ahead with a scale factor of 4? @joshmoore It doesn't look like scale factor is being passed to the docker. Is this easily configurable?

joshmoore commented 2 years ago

Hi @ErinWeisbart. If a US-timezone call is necessary in the next few weeks, let me know. The docker has the ENTRYPOINT set to the equivalent of the bioformats2raw executable so all arguments should be passed directly including -h to see all available options.

ErinWeisbart commented 2 years ago

Thanks @joshmoore. This project is right at the edge of my knowledge base, so I apologize for asking naive questions.

Our "Distributed-Something" usually points to a Docker on Dockerhub. Were you planning on creating an official openmicroscopy/bioformats2raw docker?

shntnu commented 2 years ago

Were you planning on creating an official openmicroscopy/bioformats2raw docker?

@joshmoore would you recommend that @ErinWeisbart creates a docker herself using this?:

# See https://github.com/mamba-org/micromamba-docker

FROM mambaorg/micromamba

COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml

RUN micromamba install -y -f /tmp/env.yaml && \

    micromamba clean --all --yes

ENTRYPOINT ["/usr/local/bin/_entrypoint.sh", "bioformats2raw"]
joshmoore commented 2 years ago

@shntnu : I've failed to find an automated mechanism that will keep the conda-based docker above up-to-date with the latest tag of glencoesoftware/bioformat2raw. Instead, I've built that repo directly and pushed it to openmicroscopy/bioformats2raw:0.4.0 (link). Note: there's no automation there either but adding it will be straight-forward if we choose to stick with this strategy.

shntnu commented 2 years ago

@joshmoore I believe @ErinWeisbart will be following up on this once she is back from vacation.

Meanwhile, is it possible to get an IDR identifier while we are working through this pilot? Very soon, we will be submitting our revision for the paper associated with this dataset, and they require an identifier for us to be able to submit.

joshmoore commented 2 years ago

@shntnu: re: @ErinWeisbart :+1:. I'll be here. :wink:

For the IDR identifier, I'd gently push you back to the standard IDR channels.

shntnu commented 2 years ago

For the IDR identifier, I'd gently push you back to the standard IDR channels.

Of course, will do

shntnu commented 2 years ago

Frances said

Your IDR accession number is idr0125. To cite your submission in a manuscript, please include your IDR accession number and the URL to the IDR homepage (https://idr.openmicroscopy.org/). For example, “Data was deposited to the Image Data Resource (https://idr.openmicroscopy.org/) under accession number idr0125.” Please note, this accession number won’t be active until your submission is publicly available in IDR.

🎉

cc @gwaygenomics

ErinWeisbart commented 2 years ago

@joshmoore I'm running some tests to optimize instance specs for our distributed deployment and it looks like I'm getting slightly different outputs than you. Is it obvious to you what I'm missing? Thanks in advance for your help.

I have an EBS volume mounted as /ebs_tmp with the images downloaded to it (for PLATE I used the same SQ00014812__2016-05-23T20_44_31-Measurement1 as you).

# Enter shell in docker, allowing access to ebs_tmp:
sudo docker run -it --rm --entrypoint /bin/sh -v ~/ebs_tmp:/ebs_tmp openmicroscopy/bioformats2raw:latest
# Run bioformats2raw:
sh /opt/bioformats2raw/bin/bioformats2raw /ebs_tmp/PLATE/Images/Index.idx.xml /ebs_tmp/images_zarr/PLATE.ome.zarr

du -sh SQ00014812__2016-05-23T20_44_31-Measurement1* 151G du -sh images_zarr/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/ 194G

ome_zarr info SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/ doesn't return anything. This is what concerns me.

ome_zarr info images_zarr/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/0/0/0

WARNING:ome_zarr.io:version mismatch: detected:FormatV02, requested:FormatV04
WARNING:ome_zarr.io:version mismatch: detected:FormatV04, requested:FormatV02
/home/ubuntu/ebs_tmp/images_zarr/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/0/0/0 [zgroup]
 - metadata
   - Multiscales
 - data
   - (1, 5, 1, 2160, 2160)
   - (1, 5, 1, 1080, 1080)
   - (1, 5, 1, 540, 540)
   - (1, 5, 1, 270, 270)
   - (1, 5, 1, 135, 135)

I don't know if the warnings matter, but the output otherwise matches yours

joshmoore commented 2 years ago

ome_zarr info SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/ doesn't return anything. This is what concerns me.

Agreed, that is concerning. Can you paste the contents of the top-level .zattrs file? Perhaps also run ome_zarr with -vvv: ome_zarr -vvv info ....

ErinWeisbart commented 2 years ago

Debug First Run nano /images_zarr/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr/.zattrs

{
  "bioformats2raw.layout" : 3
}

ome_zarr -vvv info images_zarr/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr

DEBUG:ome_zarr.format:Created nested FSStore(/home/ubuntu/ebs_tmp/images_zarr/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr, r, {'dimension_separator': '/', 'normalize_keys': False})
DEBUG:ome_zarr.format:0.4 matches None?
DEBUG:ome_zarr.format:0.3 matches None?
DEBUG:ome_zarr.format:0.2 matches None?
DEBUG:ome_zarr.format:V01:None v. 0.1
DEBUG:ome_zarr.reader:ignoring /home/ubuntu/ebs_tmp/images_zarr/SQ00014812__2016-05-23T20_44_31-Measurement1.ome.zarr [zgroup]

New Run I ran it again (same EC2 instance, on a different EBS volume, though that shouldn't matter), this time specifying --resolutions 4 and it seems like it works, so I suggest we skip trying to figure out what went wrong with the first run.

du -sh PLATE.ome.zarr/ 202G ome_zarr info PLATE.ome.zarr/

WARNING:ome_zarr.io:version mismatch: detected:FormatV02, requested:FormatV04
WARNING:ome_zarr.io:version mismatch: detected:FormatV04, requested:FormatV02
/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr [zgroup]
 - metadata
   - Plate
 - data
   - (1, 5, 1, 4320, 6480)

ome_zarr info PLATE.ome.zarr/0/0/0

WARNING:ome_zarr.io:version mismatch: detected:FormatV02, requested:FormatV04
WARNING:ome_zarr.io:version mismatch: detected:FormatV04, requested:FormatV02
/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0 [zgroup]
 - metadata
   - Multiscales
 - data
   - (1, 5, 1, 2160, 2160)
   - (1, 5, 1, 1080, 1080)
   - (1, 5, 1, 540, 540)
   - (1, 5, 1, 270, 270)

ome_zarr -vvv info PLATE.ome.zarr

click for output

```python DEBUG:ome_zarr.format:Created nested FSStore(PLATE.ome.zarr/, r, {'dimension_separator': '/', 'normalize_keys': False}) DEBUG:ome_zarr.format:0.4 matches None? DEBUG:ome_zarr.format:0.3 matches None? DEBUG:ome_zarr.format:0.2 matches None? DEBUG:ome_zarr.format:V01:None v. 0.1 DEBUG:ome_zarr.reader:treating /home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr [zgroup] as Plate INFO:ome_zarr.reader:root_attr: bioformats2raw.layout DEBUG:ome_zarr.reader:3 INFO:ome_zarr.reader:root_attr: plate DEBUG:ome_zarr.reader:{'columns': [{'name': '0'}, {'name': '1'}, {'name': '2'}, {'name': '3'}, {'name': '4'}, {'name': '5'}, {'name': '6'}, {'name': '7'}, {'name': '8'}, {'name': '9'}, {'name': '10'}, {'name': '11'}, {'name': '12'}, {'name': '13'}, {'name': '14'}, {'name': '15'}, {'name': '16'}, {'name': '17'}, {'name': '18'}, {'name': '19'}, {'name': '20'}, {'name': '21'}, {'name': '22'}, {'name': '23'}], 'name': 'SQ00014812', 'wells': [{'path': '0/0', 'row_index': 0, 'column_index': 0}, {'path': '0/1', 'row_index': 0, 'column_index': 1}, {'path': '0/2', 'row_index': 0, 'column_index': 2}, {'path': '0/3', 'row_index': 0, 'column_index': 3}, {'path': '0/4', 'row_index': 0, 'column_index': 4}, {'path': '0/5', 'row_index': 0, 'column_index': 5}, {'path': '0/6', 'row_index': 0, 'column_index': 6}, {'path': '0/7', 'row_index': 0, 'column_index': 7}, {'path': '0/8', 'row_index': 0, 'column_index': 8}, {'path': '0/9', 'row_index': 0, 'column_index': 9}, {'path': '0/10', 'row_index': 0, 'column_index': 10}, {'path': '0/11', 'row_index': 0, 'column_index': 11}, {'path': '0/12', 'row_index': 0, 'column_index': 12}, {'path': '0/13', 'row_index': 0, 'column_index': 13}, {'path': '0/14', 'row_index': 0, 'column_index': 14}, {'path': '0/15', 'row_index': 0, 'column_index': 15}, {'path': '0/16', 'row_index': 0, 'column_index': 16}, {'path': '0/17', 'row_index': 0, 'column_index': 17}, {'path': '0/18', 'row_index': 0, 'column_index': 18}, {'path': '0/19', 'row_index': 0, 'column_index': 19}, {'path': '0/20', 'row_index': 0, 'column_index': 20}, {'path': '0/21', 'row_index': 0, 'column_index': 21}, {'path': '0/22', 'row_index': 0, 'column_index': 22}, {'path': '0/23', 'row_index': 0, 'column_index': 23}, {'path': '1/0', 'row_index': 1, 'column_index': 0}, {'path': '1/1', 'row_index': 1, 'column_index': 1}, {'path': '1/2', 'row_index': 1, 'column_index': 2}, {'path': '1/3', 'row_index': 1, 'column_index': 3}, {'path': '1/4', 'row_index': 1, 'column_index': 4}, {'path': '1/5', 'row_index': 1, 'column_index': 5}, {'path': '1/6', 'row_index': 1, 'column_index': 6}, {'path': '1/7', 'row_index': 1, 'column_index': 7}, {'path': '1/8', 'row_index': 1, 'column_index': 8}, {'path': '1/9', 'row_index': 1, 'column_index': 9}, {'path': '1/10', 'row_index': 1, 'column_index': 10}, {'path': '1/11', 'row_index': 1, 'column_index': 11}, {'path': '1/12', 'row_index': 1, 'column_index': 12}, {'path': '1/13', 'row_index': 1, 'column_index': 13}, {'path': '1/14', 'row_index': 1, 'column_index': 14}, {'path': '1/15', 'row_index': 1, 'column_index': 15}, {'path': '1/16', 'row_index': 1, 'column_index': 16}, {'path': '1/17', 'row_index': 1, 'column_index': 17}, {'path': '1/18', 'row_index': 1, 'column_index': 18}, {'path': '1/19', 'row_index': 1, 'column_index': 19}, {'path': '1/20', 'row_index': 1, 'column_index': 20}, {'path': '1/21', 'row_index': 1, 'column_index': 21}, {'path': '1/22', 'row_index': 1, 'column_index': 22}, {'path': '1/23', 'row_index': 1, 'column_index': 23}, {'path': '2/0', 'row_index': 2, 'column_index': 0}, {'path': '2/1', 'row_index': 2, 'column_index': 1}, {'path': '2/2', 'row_index': 2, 'column_index': 2}, {'path': '2/3', 'row_index': 2, 'column_index': 3}, {'path': '2/4', 'row_index': 2, 'column_index': 4}, {'path': '2/5', 'row_index': 2, 'column_index': 5}, {'path': '2/6', 'row_index': 2, 'column_index': 6}, {'path': '2/7', 'row_index': 2, 'column_index': 7}, {'path': '2/8', 'row_index': 2, 'column_index': 8}, {'path': '2/9', 'row_index': 2, 'column_index': 9}, {'path': '2/10', 'row_index': 2, 'column_index': 10}, {'path': '2/11', 'row_index': 2, 'column_index': 11}, {'path': '2/12', 'row_index': 2, 'column_index': 12}, {'path': '2/13', 'row_index': 2, 'column_index': 13}, {'path': '2/14', 'row_index': 2, 'column_index': 14}, {'path': '2/15', 'row_index': 2, 'column_index': 15}, {'path': '2/16', 'row_index': 2, 'column_index': 16}, {'path': '2/17', 'row_index': 2, 'column_index': 17}, {'path': '2/18', 'row_index': 2, 'column_index': 18}, {'path': '2/19', 'row_index': 2, 'column_index': 19}, {'path': '2/20', 'row_index': 2, 'column_index': 20}, {'path': '2/21', 'row_index': 2, 'column_index': 21}, {'path': '2/22', 'row_index': 2, 'column_index': 22}, {'path': '2/23', 'row_index': 2, 'column_index': 23}, {'path': '3/0', 'row_index': 3, 'column_index': 0}, {'path': '3/1', 'row_index': 3, 'column_index': 1}, {'path': '3/2', 'row_index': 3, 'column_index': 2}, {'path': '3/3', 'row_index': 3, 'column_index': 3}, {'path': '3/4', 'row_index': 3, 'column_index': 4}, {'path': '3/5', 'row_index': 3, 'column_index': 5}, {'path': '3/6', 'row_index': 3, 'column_index': 6}, {'path': '3/7', 'row_index': 3, 'column_index': 7}, {'path': '3/8', 'row_index': 3, 'column_index': 8}, {'path': '3/9', 'row_index': 3, 'column_index': 9}, {'path': '3/10', 'row_index': 3, 'column_index': 10}, {'path': '3/11', 'row_index': 3, 'column_index': 11}, {'path': '3/12', 'row_index': 3, 'column_index': 12}, {'path': '3/13', 'row_index': 3, 'column_index': 13}, {'path': '3/14', 'row_index': 3, 'column_index': 14}, {'path': '3/15', 'row_index': 3, 'column_index': 15}, {'path': '3/16', 'row_index': 3, 'column_index': 16}, {'path': '3/17', 'row_index': 3, 'column_index': 17}, {'path': '3/18', 'row_index': 3, 'column_index': 18}, {'path': '3/19', 'row_index': 3, 'column_index': 19}, {'path': '3/20', 'row_index': 3, 'column_index': 20}, {'path': '3/21', 'row_index': 3, 'column_index': 21}, {'path': '3/22', 'row_index': 3, 'column_index': 22}, {'path': '3/23', 'row_index': 3, 'column_index': 23}, {'path': '4/0', 'row_index': 4, 'column_index': 0}, {'path': '4/1', 'row_index': 4, 'column_index': 1}, {'path': '4/2', 'row_index': 4, 'column_index': 2}, {'path': '4/3', 'row_index': 4, 'column_index': 3}, {'path': '4/4', 'row_index': 4, 'column_index': 4}, {'path': '4/5', 'row_index': 4, 'column_index': 5}, {'path': '4/6', 'row_index': 4, 'column_index': 6}, {'path': '4/7', 'row_index': 4, 'column_index': 7}, {'path': '4/8', 'row_index': 4, 'column_index': 8}, {'path': '4/9', 'row_index': 4, 'column_index': 9}, {'path': '4/10', 'row_index': 4, 'column_index': 10}, {'path': '4/11', 'row_index': 4, 'column_index': 11}, {'path': '4/12', 'row_index': 4, 'column_index': 12}, {'path': '4/13', 'row_index': 4, 'column_index': 13}, {'path': '4/14', 'row_index': 4, 'column_index': 14}, {'path': '4/15', 'row_index': 4, 'column_index': 15}, {'path': '4/16', 'row_index': 4, 'column_index': 16}, {'path': '4/17', 'row_index': 4, 'column_index': 17}, {'path': '4/18', 'row_index': 4, 'column_index': 18}, {'path': '4/19', 'row_index': 4, 'column_index': 19}, {'path': '4/20', 'row_index': 4, 'column_index': 20}, {'path': '4/21', 'row_index': 4, 'column_index': 21}, {'path': '4/22', 'row_index': 4, 'column_index': 22}, {'path': '4/23', 'row_index': 4, 'column_index': 23}, {'path': '5/0', 'row_index': 5, 'column_index': 0}, {'path': '5/1', 'row_index': 5, 'column_index': 1}, {'path': '5/2', 'row_index': 5, 'column_index': 2}, {'path': '5/3', 'row_index': 5, 'column_index': 3}, {'path': '5/4', 'row_index': 5, 'column_index': 4}, {'path': '5/5', 'row_index': 5, 'column_index': 5}, {'path': '5/6', 'row_index': 5, 'column_index': 6}, {'path': '5/7', 'row_index': 5, 'column_index': 7}, {'path': '5/8', 'row_index': 5, 'column_index': 8}, {'path': '5/9', 'row_index': 5, 'column_index': 9}, {'path': '5/10', 'row_index': 5, 'column_index': 10}, {'path': '5/11', 'row_index': 5, 'column_index': 11}, {'path': '5/12', 'row_index': 5, 'column_index': 12}, {'path': '5/13', 'row_index': 5, 'column_index': 13}, {'path': '5/14', 'row_index': 5, 'column_index': 14}, {'path': '5/15', 'row_index': 5, 'column_index': 15}, {'path': '5/16', 'row_index': 5, 'column_index': 16}, {'path': '5/17', 'row_index': 5, 'column_index': 17}, {'path': '5/18', 'row_index': 5, 'column_index': 18}, {'path': '5/19', 'row_index': 5, 'column_index': 19}, {'path': '5/20', 'row_index': 5, 'column_index': 20}, {'path': '5/21', 'row_index': 5, 'column_index': 21}, {'path': '5/22', 'row_index': 5, 'column_index': 22}, {'path': '5/23', 'row_index': 5, 'column_index': 23}, {'path': '6/0', 'row_index': 6, 'column_index': 0}, {'path': '6/1', 'row_index': 6, 'column_index': 1}, {'path': '6/2', 'row_index': 6, 'column_index': 2}, {'path': '6/3', 'row_index': 6, 'column_index': 3}, {'path': '6/4', 'row_index': 6, 'column_index': 4}, {'path': '6/5', 'row_index': 6, 'column_index': 5}, {'path': '6/6', 'row_index': 6, 'column_index': 6}, {'path': '6/7', 'row_index': 6, 'column_index': 7}, {'path': '6/8', 'row_index': 6, 'column_index': 8}, {'path': '6/9', 'row_index': 6, 'column_index': 9}, {'path': '6/10', 'row_index': 6, 'column_index': 10}, {'path': '6/11', 'row_index': 6, 'column_index': 11}, {'path': '6/12', 'row_index': 6, 'column_index': 12}, {'path': '6/13', 'row_index': 6, 'column_index': 13}, {'path': '6/14', 'row_index': 6, 'column_index': 14}, {'path': '6/15', 'row_index': 6, 'column_index': 15}, {'path': '6/16', 'row_index': 6, 'column_index': 16}, {'path': '6/17', 'row_index': 6, 'column_index': 17}, {'path': '6/18', 'row_index': 6, 'column_index': 18}, {'path': '6/19', 'row_index': 6, 'column_index': 19}, {'path': '6/20', 'row_index': 6, 'column_index': 20}, {'path': '6/21', 'row_index': 6, 'column_index': 21}, {'path': '6/22', 'row_index': 6, 'column_index': 22}, {'path': '6/23', 'row_index': 6, 'column_index': 23}, {'path': '7/0', 'row_index': 7, 'column_index': 0}, {'path': '7/1', 'row_index': 7, 'column_index': 1}, {'path': '7/2', 'row_index': 7, 'column_index': 2}, {'path': '7/3', 'row_index': 7, 'column_index': 3}, {'path': '7/4', 'row_index': 7, 'column_index': 4}, {'path': '7/5', 'row_index': 7, 'column_index': 5}, {'path': '7/6', 'row_index': 7, 'column_index': 6}, {'path': '7/7', 'row_index': 7, 'column_index': 7}, {'path': '7/8', 'row_index': 7, 'column_index': 8}, {'path': '7/9', 'row_index': 7, 'column_index': 9}, {'path': '7/10', 'row_index': 7, 'column_index': 10}, {'path': '7/11', 'row_index': 7, 'column_index': 11}, {'path': '7/12', 'row_index': 7, 'column_index': 12}, {'path': '7/13', 'row_index': 7, 'column_index': 13}, {'path': '7/14', 'row_index': 7, 'column_index': 14}, {'path': '7/15', 'row_index': 7, 'column_index': 15}, {'path': '7/16', 'row_index': 7, 'column_index': 16}, {'path': '7/17', 'row_index': 7, 'column_index': 17}, {'path': '7/18', 'row_index': 7, 'column_index': 18}, {'path': '7/19', 'row_index': 7, 'column_index': 19}, {'path': '7/20', 'row_index': 7, 'column_index': 20}, {'path': '7/21', 'row_index': 7, 'column_index': 21}, {'path': '7/22', 'row_index': 7, 'column_index': 22}, {'path': '7/23', 'row_index': 7, 'column_index': 23}, {'path': '8/0', 'row_index': 8, 'column_index': 0}, {'path': '8/1', 'row_index': 8, 'column_index': 1}, {'path': '8/2', 'row_index': 8, 'column_index': 2}, {'path': '8/3', 'row_index': 8, 'column_index': 3}, {'path': '8/4', 'row_index': 8, 'column_index': 4}, {'path': '8/5', 'row_index': 8, 'column_index': 5}, {'path': '8/6', 'row_index': 8, 'column_index': 6}, {'path': '8/7', 'row_index': 8, 'column_index': 7}, {'path': '8/8', 'row_index': 8, 'column_index': 8}, {'path': '8/9', 'row_index': 8, 'column_index': 9}, {'path': '8/10', 'row_index': 8, 'column_index': 10}, {'path': '8/11', 'row_index': 8, 'column_index': 11}, {'path': '8/12', 'row_index': 8, 'column_index': 12}, {'path': '8/13', 'row_index': 8, 'column_index': 13}, {'path': '8/14', 'row_index': 8, 'column_index': 14}, {'path': '8/15', 'row_index': 8, 'column_index': 15}, {'path': '8/16', 'row_index': 8, 'column_index': 16}, {'path': '8/17', 'row_index': 8, 'column_index': 17}, {'path': '8/18', 'row_index': 8, 'column_index': 18}, {'path': '8/19', 'row_index': 8, 'column_index': 19}, {'path': '8/20', 'row_index': 8, 'column_index': 20}, {'path': '8/21', 'row_index': 8, 'column_index': 21}, {'path': '8/22', 'row_index': 8, 'column_index': 22}, {'path': '8/23', 'row_index': 8, 'column_index': 23}, {'path': '9/0', 'row_index': 9, 'column_index': 0}, {'path': '9/1', 'row_index': 9, 'column_index': 1}, {'path': '9/2', 'row_index': 9, 'column_index': 2}, {'path': '9/3', 'row_index': 9, 'column_index': 3}, {'path': '9/4', 'row_index': 9, 'column_index': 4}, {'path': '9/5', 'row_index': 9, 'column_index': 5}, {'path': '9/6', 'row_index': 9, 'column_index': 6}, {'path': '9/7', 'row_index': 9, 'column_index': 7}, {'path': '9/8', 'row_index': 9, 'column_index': 8}, {'path': '9/9', 'row_index': 9, 'column_index': 9}, {'path': '9/10', 'row_index': 9, 'column_index': 10}, {'path': '9/11', 'row_index': 9, 'column_index': 11}, {'path': '9/12', 'row_index': 9, 'column_index': 12}, {'path': '9/13', 'row_index': 9, 'column_index': 13}, {'path': '9/14', 'row_index': 9, 'column_index': 14}, {'path': '9/15', 'row_index': 9, 'column_index': 15}, {'path': '9/16', 'row_index': 9, 'column_index': 16}, {'path': '9/17', 'row_index': 9, 'column_index': 17}, {'path': '9/18', 'row_index': 9, 'column_index': 18}, {'path': '9/19', 'row_index': 9, 'column_index': 19}, {'path': '9/20', 'row_index': 9, 'column_index': 20}, {'path': '9/21', 'row_index': 9, 'column_index': 21}, {'path': '9/22', 'row_index': 9, 'column_index': 22}, {'path': '9/23', 'row_index': 9, 'column_index': 23}, {'path': '10/0', 'row_index': 10, 'column_index': 0}, {'path': '10/1', 'row_index': 10, 'column_index': 1}, {'path': '10/2', 'row_index': 10, 'column_index': 2}, {'path': '10/3', 'row_index': 10, 'column_index': 3}, {'path': '10/4', 'row_index': 10, 'column_index': 4}, {'path': '10/5', 'row_index': 10, 'column_index': 5}, {'path': '10/6', 'row_index': 10, 'column_index': 6}, {'path': '10/7', 'row_index': 10, 'column_index': 7}, {'path': '10/8', 'row_index': 10, 'column_index': 8}, {'path': '10/9', 'row_index': 10, 'column_index': 9}, {'path': '10/10', 'row_index': 10, 'column_index': 10}, {'path': '10/11', 'row_index': 10, 'column_index': 11}, {'path': '10/12', 'row_index': 10, 'column_index': 12}, {'path': '10/13', 'row_index': 10, 'column_index': 13}, {'path': '10/14', 'row_index': 10, 'column_index': 14}, {'path': '10/15', 'row_index': 10, 'column_index': 15}, {'path': '10/16', 'row_index': 10, 'column_index': 16}, {'path': '10/17', 'row_index': 10, 'column_index': 17}, {'path': '10/18', 'row_index': 10, 'column_index': 18}, {'path': '10/19', 'row_index': 10, 'column_index': 19}, {'path': '10/20', 'row_index': 10, 'column_index': 20}, {'path': '10/21', 'row_index': 10, 'column_index': 21}, {'path': '10/22', 'row_index': 10, 'column_index': 22}, {'path': '10/23', 'row_index': 10, 'column_index': 23}, {'path': '11/0', 'row_index': 11, 'column_index': 0}, {'path': '11/1', 'row_index': 11, 'column_index': 1}, {'path': '11/2', 'row_index': 11, 'column_index': 2}, {'path': '11/3', 'row_index': 11, 'column_index': 3}, {'path': '11/4', 'row_index': 11, 'column_index': 4}, {'path': '11/5', 'row_index': 11, 'column_index': 5}, {'path': '11/6', 'row_index': 11, 'column_index': 6}, {'path': '11/7', 'row_index': 11, 'column_index': 7}, {'path': '11/8', 'row_index': 11, 'column_index': 8}, {'path': '11/9', 'row_index': 11, 'column_index': 9}, {'path': '11/10', 'row_index': 11, 'column_index': 10}, {'path': '11/11', 'row_index': 11, 'column_index': 11}, {'path': '11/12', 'row_index': 11, 'column_index': 12}, {'path': '11/13', 'row_index': 11, 'column_index': 13}, {'path': '11/14', 'row_index': 11, 'column_index': 14}, {'path': '11/15', 'row_index': 11, 'column_index': 15}, {'path': '11/16', 'row_index': 11, 'column_index': 16}, {'path': '11/17', 'row_index': 11, 'column_index': 17}, {'path': '11/18', 'row_index': 11, 'column_index': 18}, {'path': '11/19', 'row_index': 11, 'column_index': 19}, {'path': '11/20', 'row_index': 11, 'column_index': 20}, {'path': '11/21', 'row_index': 11, 'column_index': 21}, {'path': '11/22', 'row_index': 11, 'column_index': 22}, {'path': '11/23', 'row_index': 11, 'column_index': 23}, {'path': '12/0', 'row_index': 12, 'column_index': 0}, {'path': '12/1', 'row_index': 12, 'column_index': 1}, {'path': '12/2', 'row_index': 12, 'column_index': 2}, {'path': '12/3', 'row_index': 12, 'column_index': 3}, {'path': '12/4', 'row_index': 12, 'column_index': 4}, {'path': '12/5', 'row_index': 12, 'column_index': 5}, {'path': '12/6', 'row_index': 12, 'column_index': 6}, {'path': '12/7', 'row_index': 12, 'column_index': 7}, {'path': '12/8', 'row_index': 12, 'column_index': 8}, {'path': '12/9', 'row_index': 12, 'column_index': 9}, {'path': '12/10', 'row_index': 12, 'column_index': 10}, {'path': '12/11', 'row_index': 12, 'column_index': 11}, {'path': '12/12', 'row_index': 12, 'column_index': 12}, {'path': '12/13', 'row_index': 12, 'column_index': 13}, {'path': '12/14', 'row_index': 12, 'column_index': 14}, {'path': '12/15', 'row_index': 12, 'column_index': 15}, {'path': '12/16', 'row_index': 12, 'column_index': 16}, {'path': '12/17', 'row_index': 12, 'column_index': 17}, {'path': '12/18', 'row_index': 12, 'column_index': 18}, {'path': '12/19', 'row_index': 12, 'column_index': 19}, {'path': '12/20', 'row_index': 12, 'column_index': 20}, {'path': '12/21', 'row_index': 12, 'column_index': 21}, {'path': '12/22', 'row_index': 12, 'column_index': 22}, {'path': '12/23', 'row_index': 12, 'column_index': 23}, {'path': '13/0', 'row_index': 13, 'column_index': 0}, {'path': '13/1', 'row_index': 13, 'column_index': 1}, {'path': '13/2', 'row_index': 13, 'column_index': 2}, {'path': '13/3', 'row_index': 13, 'column_index': 3}, {'path': '13/4', 'row_index': 13, 'column_index': 4}, {'path': '13/5', 'row_index': 13, 'column_index': 5}, {'path': '13/6', 'row_index': 13, 'column_index': 6}, {'path': '13/7', 'row_index': 13, 'column_index': 7}, {'path': '13/8', 'row_index': 13, 'column_index': 8}, {'path': '13/9', 'row_index': 13, 'column_index': 9}, {'path': '13/10', 'row_index': 13, 'column_index': 10}, {'path': '13/11', 'row_index': 13, 'column_index': 11}, {'path': '13/12', 'row_index': 13, 'column_index': 12}, {'path': '13/13', 'row_index': 13, 'column_index': 13}, {'path': '13/14', 'row_index': 13, 'column_index': 14}, {'path': '13/15', 'row_index': 13, 'column_index': 15}, {'path': '13/16', 'row_index': 13, 'column_index': 16}, {'path': '13/17', 'row_index': 13, 'column_index': 17}, {'path': '13/18', 'row_index': 13, 'column_index': 18}, {'path': '13/19', 'row_index': 13, 'column_index': 19}, {'path': '13/20', 'row_index': 13, 'column_index': 20}, {'path': '13/21', 'row_index': 13, 'column_index': 21}, {'path': '13/22', 'row_index': 13, 'column_index': 22}, {'path': '13/23', 'row_index': 13, 'column_index': 23}, {'path': '14/0', 'row_index': 14, 'column_index': 0}, {'path': '14/1', 'row_index': 14, 'column_index': 1}, {'path': '14/2', 'row_index': 14, 'column_index': 2}, {'path': '14/3', 'row_index': 14, 'column_index': 3}, {'path': '14/4', 'row_index': 14, 'column_index': 4}, {'path': '14/5', 'row_index': 14, 'column_index': 5}, {'path': '14/6', 'row_index': 14, 'column_index': 6}, {'path': '14/7', 'row_index': 14, 'column_index': 7}, {'path': '14/8', 'row_index': 14, 'column_index': 8}, {'path': '14/9', 'row_index': 14, 'column_index': 9}, {'path': '14/10', 'row_index': 14, 'column_index': 10}, {'path': '14/11', 'row_index': 14, 'column_index': 11}, {'path': '14/12', 'row_index': 14, 'column_index': 12}, {'path': '14/13', 'row_index': 14, 'column_index': 13}, {'path': '14/14', 'row_index': 14, 'column_index': 14}, {'path': '14/15', 'row_index': 14, 'column_index': 15}, {'path': '14/16', 'row_index': 14, 'column_index': 16}, {'path': '14/17', 'row_index': 14, 'column_index': 17}, {'path': '14/18', 'row_index': 14, 'column_index': 18}, {'path': '14/19', 'row_index': 14, 'column_index': 19}, {'path': '14/20', 'row_index': 14, 'column_index': 20}, {'path': '14/21', 'row_index': 14, 'column_index': 21}, {'path': '14/22', 'row_index': 14, 'column_index': 22}, {'path': '14/23', 'row_index': 14, 'column_index': 23}, {'path': '15/0', 'row_index': 15, 'column_index': 0}, {'path': '15/1', 'row_index': 15, 'column_index': 1}, {'path': '15/2', 'row_index': 15, 'column_index': 2}, {'path': '15/3', 'row_index': 15, 'column_index': 3}, {'path': '15/4', 'row_index': 15, 'column_index': 4}, {'path': '15/5', 'row_index': 15, 'column_index': 5}, {'path': '15/6', 'row_index': 15, 'column_index': 6}, {'path': '15/7', 'row_index': 15, 'column_index': 7}, {'path': '15/8', 'row_index': 15, 'column_index': 8}, {'path': '15/9', 'row_index': 15, 'column_index': 9}, {'path': '15/10', 'row_index': 15, 'column_index': 10}, {'path': '15/11', 'row_index': 15, 'column_index': 11}, {'path': '15/12', 'row_index': 15, 'column_index': 12}, {'path': '15/13', 'row_index': 15, 'column_index': 13}, {'path': '15/14', 'row_index': 15, 'column_index': 14}, {'path': '15/15', 'row_index': 15, 'column_index': 15}, {'path': '15/16', 'row_index': 15, 'column_index': 16}, {'path': '15/17', 'row_index': 15, 'column_index': 17}, {'path': '15/18', 'row_index': 15, 'column_index': 18}, {'path': '15/19', 'row_index': 15, 'column_index': 19}, {'path': '15/20', 'row_index': 15, 'column_index': 20}, {'path': '15/21', 'row_index': 15, 'column_index': 21}, {'path': '15/22', 'row_index': 15, 'column_index': 22}, {'path': '15/23', 'row_index': 15, 'column_index': 23}], 'field_count': 9, 'rows': [{'name': '0'}, {'name': '1'}, {'name': '2'}, {'name': '3'}, {'name': '4'}, {'name': '5'}, {'name': '6'}, {'name': '7'}, {'name': '8'}, {'name': '9'}, {'name': '10'}, {'name': '11'}, {'name': '12'}, {'name': '13'}, {'name': '14'}, {'name': '15'}], 'acquisitions': [{'id': '0'}]} INFO:ome_zarr.reader:plate_data: {'columns': [{'name': '0'}, {'name': '1'}, {'name': '2'}, {'name': '3'}, {'name': '4'}, {'name': '5'}, {'name': '6'}, {'name': '7'}, {'name': '8'}, {'name': '9'}, {'name': '10'}, {'name': '11'}, {'name': '12'}, {'name': '13'}, {'name': '14'}, {'name': '15'}, {'name': '16'}, {'name': '17'}, {'name': '18'}, {'name': '19'}, {'name': '20'}, {'name': '21'}, {'name': '22'}, {'name': '23'}], 'name': 'SQ00014812', 'wells': [{'path': '0/0', 'row_index': 0, 'column_index': 0}, {'path': '0/1', 'row_index': 0, 'column_index': 1}, {'path': '0/2', 'row_index': 0, 'column_index': 2}, {'path': '0/3', 'row_index': 0, 'column_index': 3}, {'path': '0/4', 'row_index': 0, 'column_index': 4}, {'path': '0/5', 'row_index': 0, 'column_index': 5}, {'path': '0/6', 'row_index': 0, 'column_index': 6}, {'path': '0/7', 'row_index': 0, 'column_index': 7}, {'path': '0/8', 'row_index': 0, 'column_index': 8}, {'path': '0/9', 'row_index': 0, 'column_index': 9}, {'path': '0/10', 'row_index': 0, 'column_index': 10}, {'path': '0/11', 'row_index': 0, 'column_index': 11}, {'path': '0/12', 'row_index': 0, 'column_index': 12}, {'path': '0/13', 'row_index': 0, 'column_index': 13}, {'path': '0/14', 'row_index': 0, 'column_index': 14}, {'path': '0/15', 'row_index': 0, 'column_index': 15}, {'path': '0/16', 'row_index': 0, 'column_index': 16}, {'path': '0/17', 'row_index': 0, 'column_index': 17}, {'path': '0/18', 'row_index': 0, 'column_index': 18}, {'path': '0/19', 'row_index': 0, 'column_index': 19}, {'path': '0/20', 'row_index': 0, 'column_index': 20}, {'path': '0/21', 'row_index': 0, 'column_index': 21}, {'path': '0/22', 'row_index': 0, 'column_index': 22}, {'path': '0/23', 'row_index': 0, 'column_index': 23}, {'path': '1/0', 'row_index': 1, 'column_index': 0}, {'path': '1/1', 'row_index': 1, 'column_index': 1}, {'path': '1/2', 'row_index': 1, 'column_index': 2}, {'path': '1/3', 'row_index': 1, 'column_index': 3}, {'path': '1/4', 'row_index': 1, 'column_index': 4}, {'path': '1/5', 'row_index': 1, 'column_index': 5}, {'path': '1/6', 'row_index': 1, 'column_index': 6}, {'path': '1/7', 'row_index': 1, 'column_index': 7}, {'path': '1/8', 'row_index': 1, 'column_index': 8}, {'path': '1/9', 'row_index': 1, 'column_index': 9}, {'path': '1/10', 'row_index': 1, 'column_index': 10}, {'path': '1/11', 'row_index': 1, 'column_index': 11}, {'path': '1/12', 'row_index': 1, 'column_index': 12}, {'path': '1/13', 'row_index': 1, 'column_index': 13}, {'path': '1/14', 'row_index': 1, 'column_index': 14}, {'path': '1/15', 'row_index': 1, 'column_index': 15}, {'path': '1/16', 'row_index': 1, 'column_index': 16}, {'path': '1/17', 'row_index': 1, 'column_index': 17}, {'path': '1/18', 'row_index': 1, 'column_index': 18}, {'path': '1/19', 'row_index': 1, 'column_index': 19}, {'path': '1/20', 'row_index': 1, 'column_index': 20}, {'path': '1/21', 'row_index': 1, 'column_index': 21}, {'path': '1/22', 'row_index': 1, 'column_index': 22}, {'path': '1/23', 'row_index': 1, 'column_index': 23}, {'path': '2/0', 'row_index': 2, 'column_index': 0}, {'path': '2/1', 'row_index': 2, 'column_index': 1}, {'path': '2/2', 'row_index': 2, 'column_index': 2}, {'path': '2/3', 'row_index': 2, 'column_index': 3}, {'path': '2/4', 'row_index': 2, 'column_index': 4}, {'path': '2/5', 'row_index': 2, 'column_index': 5}, {'path': '2/6', 'row_index': 2, 'column_index': 6}, {'path': '2/7', 'row_index': 2, 'column_index': 7}, {'path': '2/8', 'row_index': 2, 'column_index': 8}, {'path': '2/9', 'row_index': 2, 'column_index': 9}, {'path': '2/10', 'row_index': 2, 'column_index': 10}, {'path': '2/11', 'row_index': 2, 'column_index': 11}, {'path': '2/12', 'row_index': 2, 'column_index': 12}, {'path': '2/13', 'row_index': 2, 'column_index': 13}, {'path': '2/14', 'row_index': 2, 'column_index': 14}, {'path': '2/15', 'row_index': 2, 'column_index': 15}, {'path': '2/16', 'row_index': 2, 'column_index': 16}, {'path': '2/17', 'row_index': 2, 'column_index': 17}, {'path': '2/18', 'row_index': 2, 'column_index': 18}, {'path': '2/19', 'row_index': 2, 'column_index': 19}, {'path': '2/20', 'row_index': 2, 'column_index': 20}, {'path': '2/21', 'row_index': 2, 'column_index': 21}, {'path': '2/22', 'row_index': 2, 'column_index': 22}, {'path': '2/23', 'row_index': 2, 'column_index': 23}, {'path': '3/0', 'row_index': 3, 'column_index': 0}, {'path': '3/1', 'row_index': 3, 'column_index': 1}, {'path': '3/2', 'row_index': 3, 'column_index': 2}, {'path': '3/3', 'row_index': 3, 'column_index': 3}, {'path': '3/4', 'row_index': 3, 'column_index': 4}, {'path': '3/5', 'row_index': 3, 'column_index': 5}, {'path': '3/6', 'row_index': 3, 'column_index': 6}, {'path': '3/7', 'row_index': 3, 'column_index': 7}, {'path': '3/8', 'row_index': 3, 'column_index': 8}, {'path': '3/9', 'row_index': 3, 'column_index': 9}, {'path': '3/10', 'row_index': 3, 'column_index': 10}, {'path': '3/11', 'row_index': 3, 'column_index': 11}, {'path': '3/12', 'row_index': 3, 'column_index': 12}, {'path': '3/13', 'row_index': 3, 'column_index': 13}, {'path': '3/14', 'row_index': 3, 'column_index': 14}, {'path': '3/15', 'row_index': 3, 'column_index': 15}, {'path': '3/16', 'row_index': 3, 'column_index': 16}, {'path': '3/17', 'row_index': 3, 'column_index': 17}, {'path': '3/18', 'row_index': 3, 'column_index': 18}, {'path': '3/19', 'row_index': 3, 'column_index': 19}, {'path': '3/20', 'row_index': 3, 'column_index': 20}, {'path': '3/21', 'row_index': 3, 'column_index': 21}, {'path': '3/22', 'row_index': 3, 'column_index': 22}, {'path': '3/23', 'row_index': 3, 'column_index': 23}, {'path': '4/0', 'row_index': 4, 'column_index': 0}, {'path': '4/1', 'row_index': 4, 'column_index': 1}, {'path': '4/2', 'row_index': 4, 'column_index': 2}, {'path': '4/3', 'row_index': 4, 'column_index': 3}, {'path': '4/4', 'row_index': 4, 'column_index': 4}, {'path': '4/5', 'row_index': 4, 'column_index': 5}, {'path': '4/6', 'row_index': 4, 'column_index': 6}, {'path': '4/7', 'row_index': 4, 'column_index': 7}, {'path': '4/8', 'row_index': 4, 'column_index': 8}, {'path': '4/9', 'row_index': 4, 'column_index': 9}, {'path': '4/10', 'row_index': 4, 'column_index': 10}, {'path': '4/11', 'row_index': 4, 'column_index': 11}, {'path': '4/12', 'row_index': 4, 'column_index': 12}, {'path': '4/13', 'row_index': 4, 'column_index': 13}, {'path': '4/14', 'row_index': 4, 'column_index': 14}, {'path': '4/15', 'row_index': 4, 'column_index': 15}, {'path': '4/16', 'row_index': 4, 'column_index': 16}, {'path': '4/17', 'row_index': 4, 'column_index': 17}, {'path': '4/18', 'row_index': 4, 'column_index': 18}, {'path': '4/19', 'row_index': 4, 'column_index': 19}, {'path': '4/20', 'row_index': 4, 'column_index': 20}, {'path': '4/21', 'row_index': 4, 'column_index': 21}, {'path': '4/22', 'row_index': 4, 'column_index': 22}, {'path': '4/23', 'row_index': 4, 'column_index': 23}, {'path': '5/0', 'row_index': 5, 'column_index': 0}, {'path': '5/1', 'row_index': 5, 'column_index': 1}, {'path': '5/2', 'row_index': 5, 'column_index': 2}, {'path': '5/3', 'row_index': 5, 'column_index': 3}, {'path': '5/4', 'row_index': 5, 'column_index': 4}, {'path': '5/5', 'row_index': 5, 'column_index': 5}, {'path': '5/6', 'row_index': 5, 'column_index': 6}, {'path': '5/7', 'row_index': 5, 'column_index': 7}, {'path': '5/8', 'row_index': 5, 'column_index': 8}, {'path': '5/9', 'row_index': 5, 'column_index': 9}, {'path': '5/10', 'row_index': 5, 'column_index': 10}, {'path': '5/11', 'row_index': 5, 'column_index': 11}, {'path': '5/12', 'row_index': 5, 'column_index': 12}, {'path': '5/13', 'row_index': 5, 'column_index': 13}, {'path': '5/14', 'row_index': 5, 'column_index': 14}, {'path': '5/15', 'row_index': 5, 'column_index': 15}, {'path': '5/16', 'row_index': 5, 'column_index': 16}, {'path': '5/17', 'row_index': 5, 'column_index': 17}, {'path': '5/18', 'row_index': 5, 'column_index': 18}, {'path': '5/19', 'row_index': 5, 'column_index': 19}, {'path': '5/20', 'row_index': 5, 'column_index': 20}, {'path': '5/21', 'row_index': 5, 'column_index': 21}, {'path': '5/22', 'row_index': 5, 'column_index': 22}, {'path': '5/23', 'row_index': 5, 'column_index': 23}, {'path': '6/0', 'row_index': 6, 'column_index': 0}, {'path': '6/1', 'row_index': 6, 'column_index': 1}, {'path': '6/2', 'row_index': 6, 'column_index': 2}, {'path': '6/3', 'row_index': 6, 'column_index': 3}, {'path': '6/4', 'row_index': 6, 'column_index': 4}, {'path': '6/5', 'row_index': 6, 'column_index': 5}, {'path': '6/6', 'row_index': 6, 'column_index': 6}, {'path': '6/7', 'row_index': 6, 'column_index': 7}, {'path': '6/8', 'row_index': 6, 'column_index': 8}, {'path': '6/9', 'row_index': 6, 'column_index': 9}, {'path': '6/10', 'row_index': 6, 'column_index': 10}, {'path': '6/11', 'row_index': 6, 'column_index': 11}, {'path': '6/12', 'row_index': 6, 'column_index': 12}, {'path': '6/13', 'row_index': 6, 'column_index': 13}, {'path': '6/14', 'row_index': 6, 'column_index': 14}, {'path': '6/15', 'row_index': 6, 'column_index': 15}, {'path': '6/16', 'row_index': 6, 'column_index': 16}, {'path': '6/17', 'row_index': 6, 'column_index': 17}, {'path': '6/18', 'row_index': 6, 'column_index': 18}, {'path': '6/19', 'row_index': 6, 'column_index': 19}, {'path': '6/20', 'row_index': 6, 'column_index': 20}, {'path': '6/21', 'row_index': 6, 'column_index': 21}, {'path': '6/22', 'row_index': 6, 'column_index': 22}, {'path': '6/23', 'row_index': 6, 'column_index': 23}, {'path': '7/0', 'row_index': 7, 'column_index': 0}, {'path': '7/1', 'row_index': 7, 'column_index': 1}, {'path': '7/2', 'row_index': 7, 'column_index': 2}, {'path': '7/3', 'row_index': 7, 'column_index': 3}, {'path': '7/4', 'row_index': 7, 'column_index': 4}, {'path': '7/5', 'row_index': 7, 'column_index': 5}, {'path': '7/6', 'row_index': 7, 'column_index': 6}, {'path': '7/7', 'row_index': 7, 'column_index': 7}, {'path': '7/8', 'row_index': 7, 'column_index': 8}, {'path': '7/9', 'row_index': 7, 'column_index': 9}, {'path': '7/10', 'row_index': 7, 'column_index': 10}, {'path': '7/11', 'row_index': 7, 'column_index': 11}, {'path': '7/12', 'row_index': 7, 'column_index': 12}, {'path': '7/13', 'row_index': 7, 'column_index': 13}, {'path': '7/14', 'row_index': 7, 'column_index': 14}, {'path': '7/15', 'row_index': 7, 'column_index': 15}, {'path': '7/16', 'row_index': 7, 'column_index': 16}, {'path': '7/17', 'row_index': 7, 'column_index': 17}, {'path': '7/18', 'row_index': 7, 'column_index': 18}, {'path': '7/19', 'row_index': 7, 'column_index': 19}, {'path': '7/20', 'row_index': 7, 'column_index': 20}, {'path': '7/21', 'row_index': 7, 'column_index': 21}, {'path': '7/22', 'row_index': 7, 'column_index': 22}, {'path': '7/23', 'row_index': 7, 'column_index': 23}, {'path': '8/0', 'row_index': 8, 'column_index': 0}, {'path': '8/1', 'row_index': 8, 'column_index': 1}, {'path': '8/2', 'row_index': 8, 'column_index': 2}, {'path': '8/3', 'row_index': 8, 'column_index': 3}, {'path': '8/4', 'row_index': 8, 'column_index': 4}, {'path': '8/5', 'row_index': 8, 'column_index': 5}, {'path': '8/6', 'row_index': 8, 'column_index': 6}, {'path': '8/7', 'row_index': 8, 'column_index': 7}, {'path': '8/8', 'row_index': 8, 'column_index': 8}, {'path': '8/9', 'row_index': 8, 'column_index': 9}, {'path': '8/10', 'row_index': 8, 'column_index': 10}, {'path': '8/11', 'row_index': 8, 'column_index': 11}, {'path': '8/12', 'row_index': 8, 'column_index': 12}, {'path': '8/13', 'row_index': 8, 'column_index': 13}, {'path': '8/14', 'row_index': 8, 'column_index': 14}, {'path': '8/15', 'row_index': 8, 'column_index': 15}, {'path': '8/16', 'row_index': 8, 'column_index': 16}, {'path': '8/17', 'row_index': 8, 'column_index': 17}, {'path': '8/18', 'row_index': 8, 'column_index': 18}, {'path': '8/19', 'row_index': 8, 'column_index': 19}, {'path': '8/20', 'row_index': 8, 'column_index': 20}, {'path': '8/21', 'row_index': 8, 'column_index': 21}, {'path': '8/22', 'row_index': 8, 'column_index': 22}, {'path': '8/23', 'row_index': 8, 'column_index': 23}, {'path': '9/0', 'row_index': 9, 'column_index': 0}, {'path': '9/1', 'row_index': 9, 'column_index': 1}, {'path': '9/2', 'row_index': 9, 'column_index': 2}, {'path': '9/3', 'row_index': 9, 'column_index': 3}, {'path': '9/4', 'row_index': 9, 'column_index': 4}, {'path': '9/5', 'row_index': 9, 'column_index': 5}, {'path': '9/6', 'row_index': 9, 'column_index': 6}, {'path': '9/7', 'row_index': 9, 'column_index': 7}, {'path': '9/8', 'row_index': 9, 'column_index': 8}, {'path': '9/9', 'row_index': 9, 'column_index': 9}, {'path': '9/10', 'row_index': 9, 'column_index': 10}, {'path': '9/11', 'row_index': 9, 'column_index': 11}, {'path': '9/12', 'row_index': 9, 'column_index': 12}, {'path': '9/13', 'row_index': 9, 'column_index': 13}, {'path': '9/14', 'row_index': 9, 'column_index': 14}, {'path': '9/15', 'row_index': 9, 'column_index': 15}, {'path': '9/16', 'row_index': 9, 'column_index': 16}, {'path': '9/17', 'row_index': 9, 'column_index': 17}, {'path': '9/18', 'row_index': 9, 'column_index': 18}, {'path': '9/19', 'row_index': 9, 'column_index': 19}, {'path': '9/20', 'row_index': 9, 'column_index': 20}, {'path': '9/21', 'row_index': 9, 'column_index': 21}, {'path': '9/22', 'row_index': 9, 'column_index': 22}, {'path': '9/23', 'row_index': 9, 'column_index': 23}, {'path': '10/0', 'row_index': 10, 'column_index': 0}, {'path': '10/1', 'row_index': 10, 'column_index': 1}, {'path': '10/2', 'row_index': 10, 'column_index': 2}, {'path': '10/3', 'row_index': 10, 'column_index': 3}, {'path': '10/4', 'row_index': 10, 'column_index': 4}, {'path': '10/5', 'row_index': 10, 'column_index': 5}, {'path': '10/6', 'row_index': 10, 'column_index': 6}, {'path': '10/7', 'row_index': 10, 'column_index': 7}, {'path': '10/8', 'row_index': 10, 'column_index': 8}, {'path': '10/9', 'row_index': 10, 'column_index': 9}, {'path': '10/10', 'row_index': 10, 'column_index': 10}, {'path': '10/11', 'row_index': 10, 'column_index': 11}, {'path': '10/12', 'row_index': 10, 'column_index': 12}, {'path': '10/13', 'row_index': 10, 'column_index': 13}, {'path': '10/14', 'row_index': 10, 'column_index': 14}, {'path': '10/15', 'row_index': 10, 'column_index': 15}, {'path': '10/16', 'row_index': 10, 'column_index': 16}, {'path': '10/17', 'row_index': 10, 'column_index': 17}, {'path': '10/18', 'row_index': 10, 'column_index': 18}, {'path': '10/19', 'row_index': 10, 'column_index': 19}, {'path': '10/20', 'row_index': 10, 'column_index': 20}, {'path': '10/21', 'row_index': 10, 'column_index': 21}, {'path': '10/22', 'row_index': 10, 'column_index': 22}, {'path': '10/23', 'row_index': 10, 'column_index': 23}, {'path': '11/0', 'row_index': 11, 'column_index': 0}, {'path': '11/1', 'row_index': 11, 'column_index': 1}, {'path': '11/2', 'row_index': 11, 'column_index': 2}, {'path': '11/3', 'row_index': 11, 'column_index': 3}, {'path': '11/4', 'row_index': 11, 'column_index': 4}, {'path': '11/5', 'row_index': 11, 'column_index': 5}, {'path': '11/6', 'row_index': 11, 'column_index': 6}, {'path': '11/7', 'row_index': 11, 'column_index': 7}, {'path': '11/8', 'row_index': 11, 'column_index': 8}, {'path': '11/9', 'row_index': 11, 'column_index': 9}, {'path': '11/10', 'row_index': 11, 'column_index': 10}, {'path': '11/11', 'row_index': 11, 'column_index': 11}, {'path': '11/12', 'row_index': 11, 'column_index': 12}, {'path': '11/13', 'row_index': 11, 'column_index': 13}, {'path': '11/14', 'row_index': 11, 'column_index': 14}, {'path': '11/15', 'row_index': 11, 'column_index': 15}, {'path': '11/16', 'row_index': 11, 'column_index': 16}, {'path': '11/17', 'row_index': 11, 'column_index': 17}, {'path': '11/18', 'row_index': 11, 'column_index': 18}, {'path': '11/19', 'row_index': 11, 'column_index': 19}, {'path': '11/20', 'row_index': 11, 'column_index': 20}, {'path': '11/21', 'row_index': 11, 'column_index': 21}, {'path': '11/22', 'row_index': 11, 'column_index': 22}, {'path': '11/23', 'row_index': 11, 'column_index': 23}, {'path': '12/0', 'row_index': 12, 'column_index': 0}, {'path': '12/1', 'row_index': 12, 'column_index': 1}, {'path': '12/2', 'row_index': 12, 'column_index': 2}, {'path': '12/3', 'row_index': 12, 'column_index': 3}, {'path': '12/4', 'row_index': 12, 'column_index': 4}, {'path': '12/5', 'row_index': 12, 'column_index': 5}, {'path': '12/6', 'row_index': 12, 'column_index': 6}, {'path': '12/7', 'row_index': 12, 'column_index': 7}, {'path': '12/8', 'row_index': 12, 'column_index': 8}, {'path': '12/9', 'row_index': 12, 'column_index': 9}, {'path': '12/10', 'row_index': 12, 'column_index': 10}, {'path': '12/11', 'row_index': 12, 'column_index': 11}, {'path': '12/12', 'row_index': 12, 'column_index': 12}, {'path': '12/13', 'row_index': 12, 'column_index': 13}, {'path': '12/14', 'row_index': 12, 'column_index': 14}, {'path': '12/15', 'row_index': 12, 'column_index': 15}, {'path': '12/16', 'row_index': 12, 'column_index': 16}, {'path': '12/17', 'row_index': 12, 'column_index': 17}, {'path': '12/18', 'row_index': 12, 'column_index': 18}, {'path': '12/19', 'row_index': 12, 'column_index': 19}, {'path': '12/20', 'row_index': 12, 'column_index': 20}, {'path': '12/21', 'row_index': 12, 'column_index': 21}, {'path': '12/22', 'row_index': 12, 'column_index': 22}, {'path': '12/23', 'row_index': 12, 'column_index': 23}, {'path': '13/0', 'row_index': 13, 'column_index': 0}, {'path': '13/1', 'row_index': 13, 'column_index': 1}, {'path': '13/2', 'row_index': 13, 'column_index': 2}, {'path': '13/3', 'row_index': 13, 'column_index': 3}, {'path': '13/4', 'row_index': 13, 'column_index': 4}, {'path': '13/5', 'row_index': 13, 'column_index': 5}, {'path': '13/6', 'row_index': 13, 'column_index': 6}, {'path': '13/7', 'row_index': 13, 'column_index': 7}, {'path': '13/8', 'row_index': 13, 'column_index': 8}, {'path': '13/9', 'row_index': 13, 'column_index': 9}, {'path': '13/10', 'row_index': 13, 'column_index': 10}, {'path': '13/11', 'row_index': 13, 'column_index': 11}, {'path': '13/12', 'row_index': 13, 'column_index': 12}, {'path': '13/13', 'row_index': 13, 'column_index': 13}, {'path': '13/14', 'row_index': 13, 'column_index': 14}, {'path': '13/15', 'row_index': 13, 'column_index': 15}, {'path': '13/16', 'row_index': 13, 'column_index': 16}, {'path': '13/17', 'row_index': 13, 'column_index': 17}, {'path': '13/18', 'row_index': 13, 'column_index': 18}, {'path': '13/19', 'row_index': 13, 'column_index': 19}, {'path': '13/20', 'row_index': 13, 'column_index': 20}, {'path': '13/21', 'row_index': 13, 'column_index': 21}, {'path': '13/22', 'row_index': 13, 'column_index': 22}, {'path': '13/23', 'row_index': 13, 'column_index': 23}, {'path': '14/0', 'row_index': 14, 'column_index': 0}, {'path': '14/1', 'row_index': 14, 'column_index': 1}, {'path': '14/2', 'row_index': 14, 'column_index': 2}, {'path': '14/3', 'row_index': 14, 'column_index': 3}, {'path': '14/4', 'row_index': 14, 'column_index': 4}, {'path': '14/5', 'row_index': 14, 'column_index': 5}, {'path': '14/6', 'row_index': 14, 'column_index': 6}, {'path': '14/7', 'row_index': 14, 'column_index': 7}, {'path': '14/8', 'row_index': 14, 'column_index': 8}, {'path': '14/9', 'row_index': 14, 'column_index': 9}, {'path': '14/10', 'row_index': 14, 'column_index': 10}, {'path': '14/11', 'row_index': 14, 'column_index': 11}, {'path': '14/12', 'row_index': 14, 'column_index': 12}, {'path': '14/13', 'row_index': 14, 'column_index': 13}, {'path': '14/14', 'row_index': 14, 'column_index': 14}, {'path': '14/15', 'row_index': 14, 'column_index': 15}, {'path': '14/16', 'row_index': 14, 'column_index': 16}, {'path': '14/17', 'row_index': 14, 'column_index': 17}, {'path': '14/18', 'row_index': 14, 'column_index': 18}, {'path': '14/19', 'row_index': 14, 'column_index': 19}, {'path': '14/20', 'row_index': 14, 'column_index': 20}, {'path': '14/21', 'row_index': 14, 'column_index': 21}, {'path': '14/22', 'row_index': 14, 'column_index': 22}, {'path': '14/23', 'row_index': 14, 'column_index': 23}, {'path': '15/0', 'row_index': 15, 'column_index': 0}, {'path': '15/1', 'row_index': 15, 'column_index': 1}, {'path': '15/2', 'row_index': 15, 'column_index': 2}, {'path': '15/3', 'row_index': 15, 'column_index': 3}, {'path': '15/4', 'row_index': 15, 'column_index': 4}, {'path': '15/5', 'row_index': 15, 'column_index': 5}, {'path': '15/6', 'row_index': 15, 'column_index': 6}, {'path': '15/7', 'row_index': 15, 'column_index': 7}, {'path': '15/8', 'row_index': 15, 'column_index': 8}, {'path': '15/9', 'row_index': 15, 'column_index': 9}, {'path': '15/10', 'row_index': 15, 'column_index': 10}, {'path': '15/11', 'row_index': 15, 'column_index': 11}, {'path': '15/12', 'row_index': 15, 'column_index': 12}, {'path': '15/13', 'row_index': 15, 'column_index': 13}, {'path': '15/14', 'row_index': 15, 'column_index': 14}, {'path': '15/15', 'row_index': 15, 'column_index': 15}, {'path': '15/16', 'row_index': 15, 'column_index': 16}, {'path': '15/17', 'row_index': 15, 'column_index': 17}, {'path': '15/18', 'row_index': 15, 'column_index': 18}, {'path': '15/19', 'row_index': 15, 'column_index': 19}, {'path': '15/20', 'row_index': 15, 'column_index': 20}, {'path': '15/21', 'row_index': 15, 'column_index': 21}, {'path': '15/22', 'row_index': 15, 'column_index': 22}, {'path': '15/23', 'row_index': 15, 'column_index': 23}], 'field_count': 9, 'rows': [{'name': '0'}, {'name': '1'}, {'name': '2'}, {'name': '3'}, {'name': '4'}, {'name': '5'}, {'name': '6'}, {'name': '7'}, {'name': '8'}, {'name': '9'}, {'name': '10'}, {'name': '11'}, {'name': '12'}, {'name': '13'}, {'name': '14'}, {'name': '15'}], 'acquisitions': [{'id': '0'}]} DEBUG:ome_zarr.io:open(ZarrLocation(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0)) DEBUG:ome_zarr.format:Created nested FSStore(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0, r, {'dimension_separator': '/', 'normalize_keys': False}) DEBUG:ome_zarr.format:0.4 matches None? DEBUG:ome_zarr.format:0.3 matches None? DEBUG:ome_zarr.format:0.2 matches None? DEBUG:ome_zarr.format:V01:None v. 0.1 DEBUG:ome_zarr.reader:treating /home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0 [zgroup] as Well INFO:ome_zarr.reader:root_attr: well DEBUG:ome_zarr.reader:{'images': [{'path': '0', 'acquisition': 0}, {'path': '1', 'acquisition': 0}, {'path': '2', 'acquisition': 0}, {'path': '3', 'acquisition': 0}, {'path': '4', 'acquisition': 0}, {'path': '5', 'acquisition': 0}, {'path': '6', 'acquisition': 0}, {'path': '7', 'acquisition': 0}, {'path': '8', 'acquisition': 0}]} INFO:ome_zarr.reader:well_data: {'images': [{'path': '0', 'acquisition': 0}, {'path': '1', 'acquisition': 0}, {'path': '2', 'acquisition': 0}, {'path': '3', 'acquisition': 0}, {'path': '4', 'acquisition': 0}, {'path': '5', 'acquisition': 0}, {'path': '6', 'acquisition': 0}, {'path': '7', 'acquisition': 0}, {'path': '8', 'acquisition': 0}]} DEBUG:ome_zarr.io:open(ZarrLocation(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0)) DEBUG:ome_zarr.format:Created nested FSStore(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0, r, {'dimension_separator': '/', 'normalize_keys': False}) DEBUG:ome_zarr.format:0.4 matches 0.2? DEBUG:ome_zarr.format:0.3 matches 0.2? DEBUG:ome_zarr.format:0.2 matches 0.2? WARNING:ome_zarr.io:version mismatch: detected:FormatV02, requested:FormatV04 DEBUG:ome_zarr.format:Created nested FSStore(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0, r, {'dimension_separator': '/', 'normalize_keys': False}) DEBUG:ome_zarr.reader:treating /home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0 [zgroup] as Multiscales INFO:ome_zarr.reader:root_attr: multiscales DEBUG:ome_zarr.reader:[{'metadata': {'method': 'loci.common.image.SimpleImageScaler', 'version': 'Bio-Formats 6.8.0'}, 'datasets': [{'path': '0'}, {'path': '1'}, {'path': '2'}, {'path': '3'}], 'version': '0.2'}] INFO:ome_zarr.reader:datasets [{'path': '0'}, {'path': '1'}, {'path': '2'}, {'path': '3'}] INFO:ome_zarr.reader:resolution: 0 INFO:ome_zarr.reader: - shape None = (1, 5, 1, 2160, 2160) INFO:ome_zarr.reader: - chunks = ['1', '1', '1', '1024 (+ 112)', '1024 (+ 112)'] INFO:ome_zarr.reader: - dtype = >u2 INFO:ome_zarr.reader:resolution: 1 INFO:ome_zarr.reader: - shape None = (1, 5, 1, 1080, 1080) INFO:ome_zarr.reader: - chunks = ['1', '1', '1', '1024 (+ 56)', '1024 (+ 56)'] INFO:ome_zarr.reader: - dtype = >u2 INFO:ome_zarr.reader:resolution: 2 INFO:ome_zarr.reader: - shape None = (1, 5, 1, 540, 540) INFO:ome_zarr.reader: - chunks = ['1', '1', '1', '540', '540'] INFO:ome_zarr.reader: - dtype = >u2 INFO:ome_zarr.reader:resolution: 3 INFO:ome_zarr.reader: - shape None = (1, 5, 1, 270, 270) INFO:ome_zarr.reader: - chunks = ['1', '1', '1', '270', '270'] INFO:ome_zarr.reader: - dtype = >u2 DEBUG:ome_zarr.io:open(ZarrLocation(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0/labels)) DEBUG:ome_zarr.format:Created nested FSStore(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0/labels, r, {'dimension_separator': '/', 'normalize_keys': False}) WARNING:ome_zarr.io:version mismatch: detected:FormatV04, requested:FormatV02 DEBUG:ome_zarr.format:Created nested FSStore(/home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr/0/0/0/labels, r, {'dimension_separator': '/', 'normalize_keys': False}) DEBUG:ome_zarr.reader:creating lazy_reader. row:0 col:0 DEBUG:ome_zarr.reader:creating lazy_reader. row:0 col:1 DEBUG:ome_zarr.reader:creating lazy_reader. row:0 col:2 DEBUG:ome_zarr.reader:creating lazy_reader. row:1 col:0 DEBUG:ome_zarr.reader:creating lazy_reader. row:1 col:1 DEBUG:ome_zarr.reader:creating lazy_reader. row:1 col:2 DEBUG:ome_zarr.reader:creating lazy_reader. row:2 col:0 DEBUG:ome_zarr.reader:creating lazy_reader. row:2 col:1 DEBUG:ome_zarr.reader:creating lazy_reader. row:2 col:2 DEBUG:ome_zarr.reader:img_pyramid_shapes: [(1, 5, 1, 2160, 2160), (1, 5, 1, 1080, 1080), (1, 5, 1, 540, 540), (1, 5, 1, 270, 270)] DEBUG:ome_zarr.reader:target_level: 3 DEBUG:ome_zarr.reader:get_stitched_grid() level: 3, tile_shape: (1, 5, 1, 270, 270) DEBUG:ome_zarr.reader:treating /home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr [zgroup] as ome-zarr DEBUG:ome_zarr.reader:returning /home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr [zgroup] /home/ubuntu/ebs_tmp2/images_zarr/PLATE.ome.zarr [zgroup] - metadata - Plate - data - (1, 5, 1, 4320, 6480) DEBUG:ome_zarr.utils:[dask.array] ```

@joshmoore Do I need to worry about the version mismatch warnings?
Are there any other checks I should perform to confirm that this second .ome.zarr is as expected before processing the rest of the plates?

@sbesson said:

Maybe rather than using scale factor of 2 which will create a 1/4+1/16+1/64+1/256 i.e. a 33% increase, we could use a scale factor of 4 which would bring us to 1/16+1/256 i.e. a 6.7 % increase for the conversion?

Do I achieve this by setting --resolutions 2? Or...?

joshmoore commented 2 years ago

Do I need to worry about the version mismatch warnings?

No. And I've fixed it in the mainline: https://github.com/ome/ome-zarr-py/pull/190

Are there any other checks I should perform to confirm that this second .ome.zarr is as expected before processing the rest of the plates?

I don't have any reason to believe that something would vary but the fact that you did have an issue makes me wary. What's the cost of the conversion? (i.e. how many plates are we talking about?) If significant at this point, I'd say it's worth having a few eyes on your converted data set and try with a few tools from the set: {raw2ometiff, napari, vizarr, ZarrReader, OMERO}.

sbesson commented 2 years ago

Maybe rather than using scale factor of 2 which will create a 1/4+1/16+1/64+1/256 i.e. a 33% increase, we could use a scale factor of 4 which would bring us to 1/16+1/256 i.e. a 6.7 % increase for the conversion?

Do I achieve this by setting --resolutions 2? Or...?

Thanks for reminding me as I forgot to update on this front after a discussion with @melissalinkert. At the moment, the scaling factor is not configurable in the bioformats2raw utility so there is no built-in way to achieve the proposal above.

To reduce the size of the secondary data, the two options I can think of are:

ErinWeisbart commented 2 years ago

@joshmoore This dataset is ~100 plates/20 TB, so it's probably worth an extra check. I'll confirm that it opens with napari.

In thinking about it some more, I'm wondering if the culprit is just my first job getting interrupted before finishing without me realizing it. I noticed that the first (failed) .ome.zarr was 194G while the second was 202G (same as your test). I've repeated the creation a third time on the same instance and it looks fine.

@sbesson Thanks for the extra info.

I don't really have any sense of the pros/cons of: 1) making the .ome.zarr using default parameters (i.e. accepting the 33% increase)

joshmoore commented 2 years ago

(As a side note, https://forum.image.sc/t/fair-metadata-standards-for-cell-painting/65942 may be someone struggling with similar issues)

bethac07 commented 2 years ago

skipping sub-resolution generation would these meet the goal of playing nicely with OMERO/IDR?

Since the actual size images are individual "normally" sized images (2.2k/side), I would hope so, but good to have an expert answer this

ErinWeisbart commented 2 years ago

@joshmoore @sbesson Can you confirm that if I run our conversion skipping sub-resolution generation it would still meet the goal of playing nicely with OMERO/IDR?

And I would achieve this by including --target-min-size 2160?

sbesson commented 2 years ago

@ErinWeisbart I think so under the same line of argument as https://github.com/broadinstitute/lincs-cell-painting/issues/54#issuecomment-1112063588. I will work on a minimal workflow and report findings here.

shntnu commented 2 years ago

I was lagging on this thread but I like the idea of skipping sub-resolution generation here, if possible.

I will work on a minimal workflow and report findings here.

Thanks @sbesson!

sbesson commented 2 years ago

@shntnu @ErinWeisbart as promised last week, here's a quick summary of my investigation. As a preamble, all the work below consumes the recently released OME-NGFF 0.4 specification as well as development versions of bioformats2raw for the data generation and ZarrReader for the data reading and the integration into OMERO.

Quick summary

shntnu commented 2 years ago

Thanks for the extensive investigation here @sbesson

If you would like to give this pre-release a try using some representative plates for this submission, happy to provide guidance and receive feedback.

It sounds like this is indeed the thing we need to do next because that's the only way to skip the creation of sub-resolution images (and keep up with the specs guidelines); over to @ErinWeisbart

bethac07 commented 2 years ago

One question I have whether to proceed with 0.4.0 (and the 0.2 spec) or wait for 0.5.0 (with the 0.4 spec) to be further along is - what are the relevant timelines for a) when the Broad team needs these zarr files finished vs b) when is a stable-ish version of 0.5 expected to be ready? I'm guessing Erin doesn't mind waiting to proceed until there is a 0.5.0 bioformats2raw Docker, and it should be pretty straightforward to update her workflow as I understand it to handle that, but if we don't expect 0.5 to be available for ie a month or two and we need these made by 2-3 weeks from now, we might make a different decision.

gwaybio commented 2 years ago

I haven't been following this thread closely enough to know what the differences are between 0.4.0 and 0.5.0 so I can't really comment on the tradeoff, but...

what are the relevant timelines for a) when the Broad team needs these zarr files finished

Assuming that this is a critical step before idr0125 can be released, our timeline is on the order of months (maybe ~2). We're about to resubmit to the journal, and our response will need to be re-reviewed by the 3 reviewers.

shntnu commented 2 years ago

b) when is a stable-ish version of 0.5 expected to be ready?

@sbesson I noticed you're tagged in the 4 issues in the 0.5.0 roadmap https://github.com/orgs/glencoesoftware/projects/11/views/1 – so I was wondering if you might be able to guess the timeline?

if we don't expect 0.5 to be available for ie a month or two and we need these made by 2-3 weeks from now, we might make a different decision

Hm, if we don't expect 0.5 to be available for ie a month or two, I think we'd need to use the 0.5.0rc1 because @sbesson said this:

Having discussed this with the OME Formats team, we would strongly recommend to generate HCS according to this specification to simplify usability and support.

(but that would mean the extra work on Erin's part of creating the 0.5.0rc1 docker)

ErinWeisbart commented 2 years ago

@sbesson As I'm working on Distributed-BioFormats2Raw, I just wanted to confirm that there are no major API changes between 0.4 and 0.5 that would mean I couldn't just point to a new 0.5 docker using the infrastructure I've built around 0.4? (I'm guessing based on the command you showed above this is true but I'd like to confirm my understanding.) Thanks.

@shntnu, @joshmoore created the openmicroscopy/bioformats2raw:0.4.0 docker so hopefully he will be willing/able to create the 0.5 docker, though the answer to the question of "how long before 0.5 is available" will determine if we need a 0.5.0rc1 docker created or if we can wait for an actual 0.5 docker.

joshmoore commented 2 years ago

An 0.5.0rc1 tag was pushed earlier today, but latest won't be updated until the final release.

ErinWeisbart commented 2 years ago

Great! Thanks @joshmoore !

sbesson commented 2 years ago

@sbesson I noticed you're tagged in the 4 issues in the 0.5.0 roadmap https://github.com/orgs/glencoesoftware/projects/11/views/1 – so I was wondering if you might be able to guess the timeline?

Obviously not making the final call but my hope is that a full release should be expected in the next days to weeks.

@sbesson As I'm working on Distributed-BioFormats2Raw, I just wanted to confirm that there are no major API changes between 0.4 and 0.5 that would mean I couldn't just point to a new 0.5 docker using the infrastructure I've built around 0.4? (I'm guessing based on the command you showed above this is true but I'd like to confirm my understanding.) Thanks.

Assuming you are primarily wrapping the command-line utility, looking at https://github.com/glencoesoftware/bioformats2raw/compare/v0.4.0...v0.5.0rc1, I think you are correct there are no major API changes at this level, only some additional options.

ErinWeisbart commented 2 years ago

@joshmoore With the 0.4.0 docker the command I used was sh /opt/bioformats2raw/bin/bioformats2raw {index_path} {zarr_path} but that command doesn't work with the 0.5.0rc1 docker.

Looking at the comparison between 0.4.0 and 0.5.0rc1 it doesn't look like the ENTRYPOINT ["/opt/bioformats2raw/bin/bioformats2raw"] changed. However, if I ls /opt in the 0.5.0rc1 docker there is only a conda folder but no bioformats2raw folder. (ls /opt in the 0.4.0 docker gives bioformats2raw gradle java).

What am I missing? Thanks again for your help.

joshmoore commented 2 years ago

With the 0.4.0 docker the command I used was sh /opt/bioformats2raw/bin/bioformats2raw {index_path} {zarr_path} but that command doesn't work with the 0.5.0rc1 docker.

Hi @ErinWeisbart. Apologies. I forgot that there was an upstream docker PR that might change things for you. Can you explain where you are using sh /opt/bioformats2raw/bin/bioformats2raw from? Does the ENTRYPOINT itself not work for you?

Looking at the comparison between 0.4.0 and 0.5.0rc1 it doesn't look like the ENTRYPOINT ["/opt/bioformats2raw/bin/bioformats2raw"] changed.

Hmmm. I see this change:

$ docker inspect -f '{{.Config.Entrypoint}}' openmicroscopy/bioformats2raw:0.4.0
[/opt/bioformats2raw/bin/bioformats2raw]

$ docker inspect -f '{{.Config.Entrypoint}}' openmicroscopy/bioformats2raw:0.5.0rc1
[/usr/local/bin/_entrypoint.sh bioformats2raw]

with the latest version coming from https://github.com/ome/bioformats2raw-docker/blob/main/Dockerfile