-
Notifications
You must be signed in to change notification settings - Fork 0
/
6_update_SerialEM_XML.py
134 lines (81 loc) · 3.93 KB
/
6_update_SerialEM_XML.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 8 12:12:38 2021
@author: schorb
"""
import os
import mobie
from pybdv import transformations as tf
import copy
import xml.etree.ElementTree as ET
import numpy as np
import shutil
dataset = "./data/hela"
shutil.copy(dataset + '/dataset_orig.json', dataset + '/dataset.json')
meta = mobie.metadata.read_dataset_metadata(dataset)
os.chdir(dataset)
#%%
sourcetrafos = dict()
for (sourcename,source) in meta['sources'].items():
for xmlfile in [source['image']['imageData']['bdv.n5']['relativePath'],
source['image']['imageData']['bdv.n5.s3']['relativePath']]:
origfile = os.path.splitext(xmlfile)[0]+'_orig.xml'
tree = ET.parse(xmlfile)
if not os.path.exists(origfile):
tree.write(origfile)
else:
tree = ET.parse(origfile)
root = tree.getroot()
sd = root.find('SequenceDescription')
vs = sd.find('ViewSetups')
vs_attr = vs.find('ViewSetup')
vxs = vs_attr.find('voxelSize')
voxs = vxs.find('size')
voxel_sz = np.array(list(map(float,voxs.text.split(' '))))
m_vox = np.diag(voxel_sz)
vr = root.find('ViewRegistrations')
vr_el = vr.find('ViewRegistration')
vr_attr = vr_el.attrib
trafos = [None]*len(vr_el)
trafo_names = []
for ix,vt in enumerate(vr_el):
aff = vt.find('affine')
t_name = vt.find('name').text
trafo1 = aff.text
t = np.array(list(map(float,trafo1.split(' ')))).reshape([3,4])
trafos[-ix-1] = t
trafo_names.append(t_name)
# update transformation to be written into XML
trafos[0][:3,:3] = trafos[0][:3,:3] @ np.linalg.inv(m_vox)
voxs_mat = np.concatenate((m_vox,[[0],[0],[0]]),axis=1)
voxs_mat = np.concatenate((voxs_mat,[[0,0,0,1]]))
voxs_mat1 = tf.matrix_to_transformation(voxs_mat).tolist()
vr_el.clear()
vr_el.attrib = vr_attr
vt = ET.SubElement(vr_el, 'ViewTransform')
vt.attrib = {'type':'affine'}
ET.SubElement(vt,'name').text = 'Scaling'
ET.SubElement(vt, 'affine').text = ' '.join(map(str,voxs_mat1))
# write the xml
tf.indent_xml(root)
tree = ET.ElementTree(root)
tree.write(xmlfile)
sourcetrafos[sourcename]={'names':trafo_names, 'trafos':trafos}
# now deal with the views:
for viewname, orig_view in meta['views'].items():
outview = copy.deepcopy(orig_view)
v_sources = []
for v_transform in orig_view['sourceTransforms']:
if 'affine' in v_transform.keys():
v_sources.append(v_transform['affine']['sources'])
elif 'crop' in v_transform.keys():
v_sources.append(v_transform['crop']['sources'])
for xml_source in sourcetrafos.keys():
if [xml_source] in v_sources:
for t_idx,xml_trafo in enumerate(sourcetrafos[xml_source]['trafos']):
t_view = mobie.metadata.get_affine_source_transform([xml_source],
tf.matrix_to_transformation(np.concatenate((xml_trafo,[[0,0,0,1]]))).tolist(),
name = sourcetrafos[xml_source]['names'][t_idx])
outview['sourceTransforms'].insert(v_sources.index([xml_source])+t_idx,t_view)
mobie.metadata.add_view_to_dataset('../../' + dataset, viewname, outview)