Skip to content

Instantly share code, notes, and snippets.

@Yu-AnChen
Last active October 25, 2020 03:53
Show Gist options
  • Save Yu-AnChen/0cd1e1715deaca272039ee5ad5048b4b to your computer and use it in GitHub Desktop.
Save Yu-AnChen/0cd1e1715deaca272039ee5ad5048b4b to your computer and use it in GitHub Desktop.

Tools

  1. convert .rcpnl file to .ome.tif using
    bfconvert sample.rcpnl sample.ome.tif

  2. extract XML from converted .ome.tif file using
    tiffcomment sample.ome.tif > output_metadata.xml

  3. edit output_metadata.xml using text editor

  4. overwrite the metadata of sample.ome.tif using tiffcomment
    tiffcomment -set 'newmetadata.xml' sample.ome.tif

# Using bftool to extract the xml
# adjust ram limit for larger file
# set BF_MAX_MEM=80g
# bftools\showinf.bat -omexml -nopix -novalid "Scan_20200929_094137_01x4x01180.rcpnl" > "Scan_20200929_094137_01x4x01180.rcpnl.xml"
# Manually cleanup the xml using text editor
from ashlar import reg
import skimage.io
c1r = reg.BioformatsReader('Scan_20200929_094137_01x4x01180.rcpnl')
kwargs_first = dict(
photometric='minisblack', metadata=None, bigtiff=True,
description='!!xml!!', append=True, check_contrast=False
)
kwargs_rest = kwargs_first.copy()
del kwargs_rest['description']
num_images = 772
out_name = 'Scan_20200929_094137_01x4x0{:04}.ome.tif'.format(num_images)
for i in range(num_images):
if i % 50 == 0:
print(i)
for j in range(4):
img = c1r.read(i, j)
k = kwargs_rest
if i == 0 and j == 0:
k = kwargs_first
skimage.io.imsave(out_name, img, **k)
import xml.etree.ElementTree as ET
image_el = '''
<Image ID="Image:{image_num}" Name="{name} #{series}">
<InstrumentRef ID="Instrument:0" />
<ObjectiveSettings ID="Objective:0" />
<Pixels BigEndian="false" DimensionOrder="XYCZT" ID="Pixels:{image_num}" Interleaved="false"
PhysicalSizeX="0.32499998807907104" PhysicalSizeXUnit="\xb5m" PhysicalSizeY="0.32499998807907104"
PhysicalSizeYUnit="\xb5m" PhysicalSizeZ="1.0" PhysicalSizeZUnit="\xb5m" SignificantBits="16" SizeC="4"
SizeT="1" SizeX="2560" SizeY="2160" SizeZ="1" Type="uint16">
<Channel EmissionWavelength="431.0" EmissionWavelengthUnit="nm" ExcitationWavelength="395.0"
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:0" NDFilter="0.0" SamplesPerPixel="1">
<LightPath />
</Channel>
<Channel EmissionWavelength="525.0" EmissionWavelengthUnit="nm" ExcitationWavelength="485.0"
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:1" NDFilter="0.0" SamplesPerPixel="1">
<LightPath />
</Channel>
<Channel EmissionWavelength="590.0" EmissionWavelengthUnit="nm" ExcitationWavelength="555.0"
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:2" NDFilter="0.0" SamplesPerPixel="1">
<LightPath />
</Channel>
<Channel EmissionWavelength="690.0" EmissionWavelengthUnit="nm" ExcitationWavelength="651.0"
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:3" NDFilter="0.0" SamplesPerPixel="1">
<LightPath />
</Channel>
</Pixels>
</Image>
'''
tiffdata_el = '''
<T>
<TiffData FirstC="0" FirstT="0" FirstZ="0" IFD="{aa}" PlaneCount="1">
<UUID FileName="{filename}">{uuid}</UUID>
</TiffData>
<TiffData FirstC="1" FirstT="0" FirstZ="0" IFD="{bb}" PlaneCount="1">
<UUID FileName="{filename}">{uuid}</UUID>
</TiffData>
<TiffData FirstC="2" FirstT="0" FirstZ="0" IFD="{cc}" PlaneCount="1">
<UUID FileName="{filename}">{uuid}</UUID>
</TiffData>
<TiffData FirstC="3" FirstT="0" FirstZ="0" IFD="{dd}" PlaneCount="1">
<UUID FileName="{filename}">{uuid}</UUID>
</TiffData>
</T>
'''
ET.register_namespace('', 'http://www.openmicroscopy.org/Schemas/OME/2016-06')
root = ET.fromstring(open(r'D:\yc296\20201011-CCR-092020-PDAC-TMA2\Scan_20200929_094137_01x4x01180.rcpnl.xml').read())
plane_el = list(root.iter('{http://www.openmicroscopy.org/Schemas/OME/2016-06}Plane'))
for e in plane_el:
e.set('TheT', '0')
import uuid
img_uuid = uuid.uuid4().urn
root.remove(root[1])
for i in range(num_images):
img_el = ET.fromstring(image_el.format(image_num=i, name=out_name, series=i+1))
aa, bb, cc, dd = list(range(i*4, (i+1)*4))
tiff_el = ET.fromstring(tiffdata_el.format(filename=out_name, uuid=img_uuid, aa=aa, bb=bb, cc=cc, dd=dd))
img_el[2].extend(tiff_el[:])
img_el[2].extend(plane_el[i*4:(i+1)*4])
root.append(img_el)
root.set('UUID', img_uuid)
ET.ElementTree(root).write('{}.xml'.format(out_name), encoding='utf-8', xml_declaration=True)
# Using bftool to inject the xml
# bftools\tiffcomment.bat -set "Scan_20200929_094137_01x4x00772.ome.tif.xml" "Scan_20200929_094137_01x4x00772.ome.tif"
@Yu-AnChen
Copy link
Author

Using the correct character is required for a valid ome-xml - μm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment