Ticket #112 (assigned enhancement)
N-Dimensional Support
| Reported by: | andrew | Owned by: | andrew |
|---|---|---|---|
| Priority: | major | Milestone: | September-2010-Schema-Release |
| Component: | Schema | Version: | |
| Keywords: | Cc: | josh@…, dzmacdonald, jburel, cxallan, wmoore, jason, mlinkert-x |
Description (last modified by wmoore) (diff)
Will highlighted that the new N-Dimensional model will affect how we can represent ROI, and specifically link them to a particular dimension.
- Different images will have different dimensions
- We may want to have a particular ROI on (x,y) but independent of all others, Softworx for instance draws an ROI on the screen, but measurements change depending of Z,T.
- We could have a situation where we have a different ROI tables, or templates of tables for types of imaging.
Josh, 7th Dec notes from ASCB. "The decision was to start work (simultaneously with the 4.2 release, but well integrated into the iterations!) on an experimental API (planning toward for OME 5). This would include a new combined DataService? (Curtis suggests "OMEIS" ~ :) ) with base methods:
Dimension[] getDimensions(); DataBlob? getSlice(Dimension[] reorderedDims,
long[] start, long[] stop, long[]);
Simpler methods can be built on top of these, and even the legacy APIs can be kept.
One open questions is where to store the metadata (planeinfo, etc.) We might prefer to keep it in an HDF file, for example.
The plan is based on the assumption that we will work toward reading planes directly from the original files with bioformats, which, however, requires re-import functionality (i.e. hashing).
The n-dimensional work in the server code will most likely happen with mercurial as a test bed for whether or not it works for us (and hopefully, to make merging later)"
Use Cases
Sparse Data Collection
- As I understand it, we are *NOT going to support sparse data* with complex pixel types. However it could be supported with Image Container http://trac.openmicroscopy.org.uk/omero/ticket/2552 (Multiple pixels is another possibility but more work & break more code).
- Sparse Data is actually quite a common requirement (will become more so) E.g.:
- I have a stack of fluorescent planes (channel 0) but only 1 plane for transmitted light (channel 1)
- I acquire a DAPI channel and a FLIM channel (which has bins that are not in the DAPI channel).
- I have a transmitted light plane and a wavelength scan for each time point.
- Subsampling of certain dimensions (e.g. 1ms. bursts of high-resolution over a given period) * This could be handled by having burst_delta_T as a different dimension from T.
Flim
- Each pixel is an n-bin histogram. Do all the pixels have the same number of bins? If not, it seems like sparse data?
- FLIM (phase method - E.g. Lambert). Extra dimensions are Frequency and Phase. 7 Dimensions in total.
- FLIM with polarisation. http://dx.doi.org/10.1016/j.copbio.2009.01.004 Curtis: "recording whether each event has a positive or negative spin. I don't know all the details of this yet. We have spoken to Klaus Suhling about his work in this area"
Other modalities
- AFM: multiple parameters over scan lines. Needs flexible modelling of the parameters since they are created so frequently. Again, not sure if this is sparse data?
- FCM: multiple parameters per cell
- HCS: representing entire plate in a single structure
EM
- Tomography. Extra dimension is Angle. Usually tilt in 1 direction only, but 2 is possible. "Tilting is a rotation. And rotation is nothing more than one dimension, I agree. But the unit of this dimension is again a new one. It is not nanometers, it is not seconds. it is angles. And you could tilt around any axis. The axis of rotation has one direction and a center of rotation, all with respect to a reference image (not tilted). AT the very least you should be able to store these informations with the data. And the increment is often not constant. There are schemes where you try to have the increment in the sinus of the angle constant. Jean-Marc 13.1.2010"
- Spectral data: "In EELS you could have a full spectum of energies for each pixel. Likewise in EDX but with a resolution different from the EM data. Johannes 12.1.2010"
Other issues
- Tiling, or "chunking", of very large dimensions. Related to / same as stitching representation (is there a ticket for this?)
- Hashing (corruption detection) and/or compression of various/arbitrary/specific dimensions
Proposals
This proposal has been updated in line with the 29th June discussion to produce proposal version 4.
The current proposal included here can be edited at Resources/112-NDim/Proposal.
<!--
Proposal Version 4 (based on Will's Proposal)
- Define the dimensions using a controlled vocabulary.
- Have a single indexes attribute that has comma separated list.
- Define both Incremental and Absolute dimensions.
- Specifying units for all dimensions (including X, Y, Z, T) allows us to use non-standard units. E.g. Angstroms or nm for EM pixels or nano-seconds for FLIM time-bins etc. One way of ensuring we all use the same standard (e.g. "Seconds" vv "seconds" vv "s" or "um" vv "microns") is to use an ontology. See units ontology http://obo.cvs.sourceforge.net/viewvc/obo/obo/ontology/phenotype/unit.obo
Just ignore the next XML block
--> <example xmlns:OME="http://www.openmicroscopy.org/Schemas/OME/2010-06" xmlns:BIN="http://www.openmicroscopy.org/Schemas/BinaryFile/2010-06" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:import namespace="http://www.openmicroscopy.org/Schemas/OME/2010-06" schemaLocation=" http://cvs.openmicroscopy.org.uk/svn/specification/Xml/Working/ome.xsd"/> <!--
Updated Example XML. Proposed Dimension elements under Pixels
--> <IncrementingDimension name="ExcitationLamba" unit="nm" Size="20" Key="L" Increment="10" StartValue="405"> <OME:Description>Excitation Wavelength Window of 15 nm</OME:Description> </IncrementingDimension> <IncrementingDimension name="X" unit="um" Size="3" Key="X" Increment="0.06631"/> <AbsoluteDimension name="Angle" unit="degrees" Size="3" Key="A"> <OME:Description>The angle of acquisition</OME:Description> </AbsoluteDimension> <!--
On Pixels the DimensionOrder attribute now is an array of the keys
--> <OME:Pixels DimensionOrder="X,Y,Z,L,A" ID="Pixels:1" Type="int16"> <!-- List of dimensions used --> </OME:Pixels> <!--
On Plane add an indices array that replaces TheT, TheC, etc.
--> <Plane Indices="0,0,0,0,0"> <AbsoluteValue key="T">0.0</AbsoluteValue> <AbsoluteValue key="A">4e+007</AbsoluteValue> </Plane> <!--
- Phase-domain FLIM (7 dimensions)
- Don't have to specify 'Increment' for incrementing dimension (E.g. no acquisition data - see T below or C)
- If no 'StartValue?' is specified for incrementing dimension, assume 0.
--> <OME:Image ID="Image:1" Name="example_R3D_D3D.dv"> <OME:Pixels DimensionOrder="X,Y,Z,C,T,P,F" ID="Pixels:1" Type="int16"> <IncrementingDimension name="X" size="480" key="X" Increment="0.06631"/> <IncrementingDimension name="Y" size="480" key="Y" Increment="0.06631"/> <IncrementingDimension name="Z" size="1" key="Z" Increment="0.2"/> <IncrementingDimension name="T" size="1" key="T"/> <IncrementingDimension name="C" size="1" key="C"/> <AbsoluteDimension name="Phase" unit="degree" size="12" key="P"/> <IncrementingDimension name="Frequency" unit="Hz" size="1" key="F" Increment="30"/> <OME:Channel EmissionWavelength="457" ExcitationWavelength="360" ID="Channel:1:0"/> <BIN:BinData BigEndian="false" Length="0"/> <OME:Plane Indices="0,0,0,0,0,0,0"> <AbsoluteValue key="P">0</AbsoluteValue> </OME:Plane> <OME:Plane Indices="0,0,0,0,0,1,0"> <AbsoluteValue key="P">30</AbsoluteValue> </OME:Plane> <OME:Plane Indices="0,0,0,0,0,2,0"> <AbsoluteValue key="P">60</AbsoluteValue> </OME:Plane> <OME:Plane Indices="0,0,0,0,0,3,0"> <AbsoluteValue key="P">90</AbsoluteValue> </OME:Plane> <OME:Plane Indices="0,0,0,0,0,4,0"> <AbsoluteValue key="P">120</AbsoluteValue> </OME:Plane> <!-- ... other planes here ... --> </OME:Pixels> </OME:Image> <!--
- SPIM (Tilt Angle)
--> <OME:Image ID="Image:1" Name="example_R3D_D3D.dv"> <OME:Pixels DimensionOrder="X,Y,Z,C,T,A" ID="Pixels:1" Type="int16"> <IncrementingDimension name="X" size="480" key="X" Increment="0.06631" unit="um"/> <IncrementingDimension name="Y" size="480" key="Y" Increment="0.06631" unit="um"/> <IncrementingDimension name="Z" size="1" key="Z" Increment="0.2" unit="um"/> <IncrementingDimension name="T" size="100" key="T" Increment="30" unit="seconds"/> <IncrementingDimension name="C" size="1" key="C"/> <IncrementingDimension name="Angle" unit="degree" size="4" key="A" Increment="45"/> <OME:Channel EmissionWavelength="528" ExcitationWavelength="490" ID="Channel:0:0"/> <!-- Don't need planes since dimension increment is stated above and no precise values are needed for individual planes Also must assume Increment has default of 1 --> <BIN:BinData BigEndian="false" Length="0"/> </OME:Pixels> </OME:Image> <!--
- Big Lamda (excitation sweep for each emission wavelength window/channel)
--> <Instrument ID="Instrument:0"> <Filter ID="Filter:0:0"> <TransmittanceRange CutIn="400" CutOut="450"/> </Filter> <Filter ID="Filter:0:1"> <TransmittanceRange CutIn="450" CutOut="500"/> </Filter> <Filter ID="Filter:0:2"> <TransmittanceRange CutIn="500" CutOut="550"/> </Filter> <Filter ID="Filter:0:3"> <TransmittanceRange CutIn="550" CutOut="650"/> </Filter> </Instrument> <Image ID="Image:1" Name="bigLamda.dv"> <Pixels DimensionOrder="X,Y,Z,C,T,Lamda" ID="Pixels:1" Type="int16"> <IncrementingDimension name="X" size="480" key="X" Increment="0.06631" unit="um"/> <IncrementingDimension name="Y" size="480" key="Y" Increment="0.06631" unit="um"/> <IncrementingDimension name="Z" size="1" key="Z" Increment="0.2" unit="um"/> <IncrementingDimension name="T" size="100" key="T" Increment="30" unit="seconds"/> <IncrementingDimension name="C" size="4" key="C"/> <IncrementingDimension name="ExcitationLamba" unit="um" size="20" key="Lamda" Increment="10"> <OME:Description>Excitation Wavelength Window of 15 nm</OME:Description> </IncrementingDimension> <Channel ID="Channel:0:0"> <LightPath> <EmissionFilterRef ID="Filter:0:0"/> </LightPath> </Channel> <Channel ID="Channel:0:1"> <LightPath> <EmissionFilterRef ID="Filter:0:1"/> </LightPath> </Channel> <Channel ID="Channel:0:2"> <LightPath> <EmissionFilterRef ID="Filter:0:2"/> </LightPath> </Channel> <Channel ID="Channel:0:3"> <LightPath> <EmissionFilterRef ID="Filter:0:3"/> </LightPath> </Channel> <!-- Don't need planes since dimension increment is stated above and no precise values are needed for individual planes --> <BIN:BinData BigEndian="false" Length="0"/> </Pixels> </Image> <!--
-->
</example>
