-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLabels.py
More file actions
226 lines (176 loc) · 5.48 KB
/
Copy pathLabels.py
File metadata and controls
226 lines (176 loc) · 5.48 KB
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#!/usr/bin/env python3
#*********************************************************************
# 24 Sep 2015
# Andrew J. Worth
# andy@neuromorphometrics.com
#
# Neuromorphometrics
# 22 Westminster Street
# Somerville, MA 02144-1630 USA
#
# http://neuromorphometrics.com
#
#*********************************************************************
#* *
#* (c) Copyright 2015 Neuromorphometrics All rights reserved *
#* *
#*********************************************************************
#-------------------------------------------------------------------------------
# Usage String:
"""
SYNOPSIS
Labels.py
DESCRIPTION
Reads and writes NVM label files
EXAMPLES
Import to set things up,
then Read() to read in all labels
Should eventually add a Write() function
AUTHOR
Andrew J. Worth
andy@neuromorphometrics.com
Neuromorphometrics, Inc.
22 Westminster Street
Somerville, MA 02144-1630 USA
http://Neuromorphometrics.com
LICENSE
(c) Copyright 2015 Neuromorphometrics, Inc. All rights reserved.
VERSION
"""
import sys
import os
import xml.etree.ElementTree as ET
import json
whoIam = os.path.basename(__file__)
#print(whoIam)
#print('Exiting Early.')
#sys.exit()
DefaultLabelFiles = [ \
'defaultLabel', \
'parcLabels', \
'sulciLabels' ]
Columns = [
'Name', \
'Number', \
'RGBColor', \
'Type', \
]
# Label files be like:
#
# <?xml version="1.0"?>
# <LabelList>
# <Label>
# <Name>3rd Ventricle</Name>
# <Number>4</Number>
# <Kind>GeneralLabel</Kind>
# <RGBColor>204 182 142</RGBColor>
# </Label>
# ...
# </LabelList>
#
# Where 'Kind' can be: (MUST BE SAME as in nvm_LabelXML.cxx)
# <Kind>ExtractableContour</Kind>
# <Kind>SulciLine</Kind>
# <Kind>CerebralParcUnit</Kind>
# <Kind>CerebellarParcUnit</Kind>
# <Kind>GeneralLabel</Kind>
# <Kind>UnknownLabel</Kind>
numLabels = 0
maxLabelNumber = 0
Labels = [ ]
#-------------------------------------------------------------------------------
# Read the given label xml file and append to list
def readFile(fullLabelFileName,VerboseLevel):
global numLabels, maxLabelNumber, Labels
tree = ET.parse(fullLabelFileName)
root = tree.getroot()
#print('root', root)
labellist = root.findall('Label')
#print('labellist ', labellist)
names = [ e.find('Name').text for e in labellist]
#print('names ', names)
numbers = [ int(e.find('Number').text) for e in labellist]
#print('numbers', numbers)
colors = [ e.find('RGBColor').text for e in labellist]
#print('colors ', colors)
kinds = [ e.find('Kind').text for e in labellist]
for ii, name in enumerate(names):
if VerboseLevel >= 2:
print(ii,name,numbers[ii],colors[ii],kinds[ii])
if numbers[ii] > maxLabelNumber:
maxLabelNumber = numbers[ii]
Labels.append([name,numbers[ii],colors[ii],kinds[ii]])
#print('Exiting Early.')
#sys.exit()
# End for fName
#-------------------------------------------------------------------------------
# Read all default label files and sort resulting Labels
def Read(VerboseLevel):
global numLabels, maxLabelNumber, Labels
for fName in DefaultLabelFiles:
fullLabelFileName = './Labels/'+fName+'.xml'
if VerboseLevel >= 0:
print(whoIam,': Reading Label file', fullLabelFileName)
if os.access(fullLabelFileName,os.F_OK) == False:
print(whoIam,'ERROR: missing default label file: '+fullLabelFileName)
continue
readFile(fullLabelFileName)
Labels.sort(key=lambda tup: tup[1])
numLabels = len(Labels)
if VerboseLevel >= 1:
print(whoIam,': All Sorted Labels...')
sys.stdout.write('#')
for ii in range(len(Columns)):
sys.stdout.write(', {}'.format(Columns[ii]))
print('')
for ii in range(len(Labels)):
print(ii,Labels[ii])
if VerboseLevel >= 0:
print(whoIam,': maxLabelNumber',maxLabelNumber)
print(whoIam,': numLabels', numLabels)
#print('Exiting Early.')
#sys.exit()
# End Read()
#-------------------------------------------------------------------------------
def Write(FileName,VerboseLevel):
f = open(FileName,'w')
# Print first part of result XML file
f.write("<?xml version=\"1.0\"?>\n")
f.write("<LabelList>\n")
for ll in Labels:
if ll[1] != 0:
f.write('<Label>\n')
f.write(' <Name>'+ll[0]+'</Name>\n')
f.write(' <Number>'+str(ll[1])+'</Number>\n')
f.write(' <RGBColor>'+ll[2]+'</RGBColor>\n')
f.write(' <Kind>'+ll[3]+'</Kind>\n')
f.write('</Label>\n')
f.write("</LabelList>\n")
f.close()
if VerboseLevel >= 1:
print("All done.")
#print('Exiting Early.')
#sys.exit()
# End Write()
#-------------------------------------------------------------------------------
# Write the labels as a dictionary mapping label numbers to the other info
def Writejson(FileName,VerboseLevel):
dictLabels = dict()
for ll in Labels:
if ll[1] != 0:
thisLabel = {
'Name': ll[0],
'RGBColor': ll[2],
'Kind': ll[3]
}
dictLabels[str(ll[1])] = thisLabel
outstr = json.dumps(dictLabels, indent=2)
if VerboseLevel >= 1:
print(outstr)
f = open(FileName,'w')
f.write(outstr)
f.close()
#print('Exiting Early.')
#sys.exit()
# End Write()
# vi:set autoindent ts=2 sw=2 expandtab : See Vim, :help 'modeline'