Dictionary of Dictionary Tree tutorialΒΆ
This example input.tsv is a heavily shortened version of a tab separated value flat file you might get form your fellow wet lab scientist, from a immuno histo chemistry experiment, where in HEK293 cells DAPI (4’,6-diamidino-2-phenylindole) intensity at 395nm and INS (inuline) intensity at 512nm wavelength was measured. This shortened file has data from one wellplate (20160506) on two wells (A01, A02) and can be found in the source code package.
Tab separated input (/path/input.tsv):
Plate | Well | CellLine | Object | 395nm | 512nm | Intensity395nm | Intensity512nm | CellCount |
---|---|---|---|---|---|---|---|---|
20160506 | A01 | HEK293 | 1 | DAPI | INS_P01308 | 331.308079 | 74.197754 | 1234 |
20160506 | A01 | HEK293 | 2 | DAPI | INS_P01308 | 709.588133 | 254.110180 | 1234 |
20160506 | A01 | HEK293 | 3 | DAPI | INS_P01308 | 635.814822 | 68.511627 | 1234 |
20160506 | A02 | HEK293 | 1 | DAPI | INS_P01308 | 383.754444 | 101.102400 | 1337 |
20160506 | A02 | HEK293 | 2 | DAPI | INS_P01308 | 483.976757 | 98.300056 | 1337 |
Let’s load some python3 libraries used to analyze and manipulate this data with ddtree:
from pyddtree.ddtree import ddtree # ddtree main library
from pyddtree import calx # ddtree compatible mathematical function library
import json # to display ddtree object
Now we will load the input.tsv and have a look at the resulting ddtree structure. Try to understand the syntax in the string inside the birch.set_ddtree() brackets. It is not that difficult:
“{Plate:{Well:{(395nm:Intensity395nm),(512nm:Intensity512nm),(CellCount:CellCount:True),(CellLine:CellLine:True)}}}”
Study the result with o_birch, print(o_birch) and print(json.dumps(o_birch, indent=2)) command and with the json editor: http://jsoneditoronline.org . Because this is a heavily shortened table, this works well. However, when you work with a table with hundreds or tousends of data rows, you will start to understand the usefulness of the o_birch.xray() function to analyze the resulting ddtree structure.
Code:
# set input file
o_birch = ddtree()
o_birch.set_ifile("input.tsv")
# load input file: {branch:{twig:{primary_vein: vein_value}}}
o_birch.set_ddtree("{Plate:{Well:{(395nm:Intensity395nm),(512nm:Intensity512nm),(CellCount:CellCount:True),(CellLine:CellLine:True)}}}")
o_birch.tsv_read()
o_birch
print(o_birch)
print(json.dumps(o_birch, indent=2))
# set input file
o_birch = ddtree()
# load input file: {branch:{twig:{primary_vein: secondary_vein: vein_value}}}
o_birch.set_ddtree("{Plate:{Well:{(395nm:Intensity395nm),(512nm:Intensity512nm),(CellCount:CellCount:True),(CellLine:CellLine:True)}}}")
o_birch.set_leaf("value") # secondary vein
o_birch.tsv_read()
o_birch
print(o_birch)
print(json.dumps(o_birch, indent=2))
# xray ddtree construct
o_birch.xray()
print(o_birch.xray())
print(json.dumps(o_birch.xray(), indent=2))
Lets have a look at the o_birch.get() function and manipulate the tree a bit by introducing an additional leaf vein called foo via o_birch.put() function. The o_birch.leaf0k() function checks for consistent leaf structure along the leaf layer. Notice that o_birch.leaf0k() throws an error, when we only manipulated one and not all of the leafs on the layer. Notice as well that the o_birch.delete() function not really deletes the specified leaf vein, though merely sets it’s value to None.
Code:
# get CellLine vein values from any leaf
o_birch.set_leaf("CellLine")
o_birch.get()
print(o_birch.l_get)
# put foo vein only on leaf A01
o_birch.set_leaf("CellLine")
o_birch.put(s_vein="foo", o_value="figthers", ls_branchtwigleaf=["20160506","A01"])
o_birch.leaf0k()
print(json.dumps(o_birch, indent=2))
# put foo vein on any leaf of the set_leaf specified leaf layers.
o_birch.set_leaf("CellLine")
o_birch.put(s_vein="foo", o_value="fighters")
o_birch.leaf0k()
print(json.dumps(o_birch, indent=2))
# delete foo vein only on leaf A01
o_birch.set_leaf("foo")
o_birch.delete(["20160506","A01"])
o_birch.leaf0k()
print(json.dumps(o_birch, indent=2))
Let’s get the calx.mean function on the leaf layer on the intensity measurement working and have a look at the result.
Code:
# calculate dapi mean
o_birch.set_leaf("value")
o_birch.calx(calx.mean)
o_birch.set_leaf("mean")
o_birch.rename("mean_value")
print(json.dumps(o_birch, indent=2))
Let’s pop the value vein.
Code:
# twigpop
o_birch.set_leaf("DAPI")
o_birch.twigpop("value")
print(json.dumps(o_birch, indent=2))
# twigpop
o_birch.set_leaf("INS_P01308")
o_birch.twigpop("value")
print(json.dumps(o_birch, indent=2))
And finally, print out the ddtree object in all possible tsv tab separated value and json file formats.
Code:
# write /path/output_listing.tsv file
o_birch.set_leaf("CellLine")
o_birch.set_ofile("output_listing.tsv")
o_birch.tsv_write()
# write /path/output_inline.tsv file
o_birch.set_leaf("CellLine")
o_birch.set_ofile("output_inline.tsv")
o_birch.tsv_write(b_listing=False)
# write /path/output.json file
o_birch.set_ofile("output.json")
o_birch.json_write()
# write /path/output_xray.json file
o_birch.set_ofile("output_xray.json")
o_birch.jsonxray_write()
Tab separated listed output (/path/output_listing.tsv):
Plate | Well | CellCount | CellLine | DAPI | INS_P01308 |
---|---|---|---|---|---|
20160506 | A02 | 1337 | HEK293 | 383.754444 | 101.102400 |
20160506 | A02 | 1337 | HEK293 | 483.976757 | 98.300056 |
20160506 | A01 | 1234 | HEK293 | 331.308079 | 74.197754 |
20160506 | A01 | 1234 | HEK293 | 709.588133 | 254.110180 |
20160506 | A01 | 1234 | HEK293 | 635.814822 | 68.5116277 |
Tab separated inline output (/path/output_inline.tsv):
Plate | Well | CellCount | CellLine | DAPI | INS_P01308 |
---|---|---|---|---|---|
20160506 | A02 | 1337 | “HEK293” | [383.754, 483.976] | [101.102, 98.300] |
20160506 | A01 | 1234 | “HEK293” | [331.308, 709.588, 635.814] | [74.197, 254.110, 68.511] |
Json output (/path/output.json and /path/output_xray.json):
{
"20160506": {
"A01": {
"CellCount": 1234,
"DAPI": [
331.308079,
709.588133,
635.814822
],
"CellLine": "HEK293",
"INS_P01308": [
74.197754,
254.11018,
68.5116277
]
},
"A02": {
"CellCount": 1337,
"DAPI": [
383.754444,
483.976757
],
"CellLine": "HEK293",
"INS_P01308": [
101.1024,
98.300056
]
}
}
}
That’s all, folks! May the force be with you.