Commit b94711ad85011589d49f7c067eb2e03e75661156
1 parent
3e89f362
Exists in
master
and in
67 other branches
ENH: Removed thread to load DICOM
Showing
1 changed file
with
149 additions
and
150 deletions
Show diff stats
invesalius/reader/dicom_reader.py
... | ... | @@ -85,162 +85,161 @@ tag_labels = {} |
85 | 85 | main_dict = {} |
86 | 86 | dict_file = {} |
87 | 87 | |
88 | -class LoadDicom(threading.Thread): | |
88 | +class LoadDicom:#(threading.Thread): | |
89 | 89 | |
90 | - def __init__(self, grouper, q, l): | |
91 | - threading.Thread.__init__(self) | |
90 | + def __init__(self, grouper, filepath): | |
91 | + #threading.Thread.__init__(self) | |
92 | 92 | self.grouper = grouper |
93 | - self.q = q | |
94 | - self.l = l | |
93 | + self.filepath = filepath | |
94 | + self.run() | |
95 | 95 | |
96 | 96 | def run(self): |
97 | 97 | |
98 | 98 | grouper = self.grouper |
99 | - q = self.q | |
100 | 99 | |
101 | - while 1: | |
100 | + #while 1: | |
102 | 101 | |
103 | - filepath = q.get() | |
104 | - if not filepath: | |
105 | - break | |
106 | - | |
107 | - reader = gdcm.Reader() | |
108 | - reader.SetFileName(filepath.encode(utils.get_system_encoding())) | |
109 | - | |
110 | - if (reader.Read()): | |
111 | - file = reader.GetFile() | |
112 | - | |
113 | - # Retrieve data set | |
114 | - dataSet = file.GetDataSet() | |
115 | - | |
116 | - # Retrieve header | |
117 | - header = file.GetHeader() | |
118 | - stf = gdcm.StringFilter() | |
119 | - | |
120 | - field_dict = {} | |
121 | - data_dict = {} | |
102 | + #filepath = q.get() | |
103 | + #if not filepath: | |
104 | + # break | |
105 | + | |
106 | + reader = gdcm.Reader() | |
107 | + reader.SetFileName(self.filepath.encode(utils.get_system_encoding())) | |
108 | + | |
109 | + if (reader.Read()): | |
110 | + file = reader.GetFile() | |
111 | + | |
112 | + # Retrieve data set | |
113 | + dataSet = file.GetDataSet() | |
114 | + | |
115 | + # Retrieve header | |
116 | + header = file.GetHeader() | |
117 | + stf = gdcm.StringFilter() | |
122 | 118 | |
119 | + field_dict = {} | |
120 | + data_dict = {} | |
123 | 121 | |
124 | - tag = gdcm.Tag(0x0008, 0x0005) | |
125 | - ds = reader.GetFile().GetDataSet() | |
126 | - if ds.FindDataElement(tag): | |
127 | - encoding = str(ds.GetDataElement(tag).GetValue()) | |
128 | - if not(encoding != None and encoding != "None" and encoding != "Loaded"): | |
129 | - encoding = "ISO_IR 100" | |
130 | - else: | |
131 | - encoding = "ISO_IR_100" | |
132 | - # Iterate through the Header | |
133 | - iterator = header.GetDES().begin() | |
134 | - while (not iterator.equal(header.GetDES().end())): | |
135 | - dataElement = iterator.next() | |
136 | - stf.SetFile(file) | |
137 | - tag = dataElement.GetTag() | |
138 | - data = stf.ToStringPair(tag) | |
139 | - stag = tag.PrintAsPipeSeparatedString() | |
140 | - | |
141 | - group = stag.split("|")[0][1:] | |
142 | - field = stag.split("|")[1][:-1] | |
143 | - tag_labels[stag] = data[0] | |
144 | - | |
145 | - if not group in data_dict.keys(): | |
146 | - data_dict[group] = {} | |
147 | - | |
148 | - if not(utils.VerifyInvalidPListCharacter(data[1])): | |
149 | - data_dict[group][field] = data[1].decode(encoding) | |
150 | - else: | |
151 | - data_dict[group][field] = "Invalid Character" | |
152 | 122 | |
123 | + tag = gdcm.Tag(0x0008, 0x0005) | |
124 | + ds = reader.GetFile().GetDataSet() | |
125 | + if ds.FindDataElement(tag): | |
126 | + encoding = str(ds.GetDataElement(tag).GetValue()) | |
127 | + if not(encoding != None and encoding != "None" and encoding != "Loaded"): | |
128 | + encoding = "ISO_IR 100" | |
129 | + else: | |
130 | + encoding = "ISO_IR_100" | |
131 | + # Iterate through the Header | |
132 | + iterator = header.GetDES().begin() | |
133 | + while (not iterator.equal(header.GetDES().end())): | |
134 | + dataElement = iterator.next() | |
135 | + stf.SetFile(file) | |
136 | + tag = dataElement.GetTag() | |
137 | + data = stf.ToStringPair(tag) | |
138 | + stag = tag.PrintAsPipeSeparatedString() | |
153 | 139 | |
154 | - # Iterate through the Data set | |
155 | - iterator = dataSet.GetDES().begin() | |
156 | - while (not iterator.equal(dataSet.GetDES().end())): | |
157 | - dataElement = iterator.next() | |
158 | - | |
159 | - stf.SetFile(file) | |
160 | - tag = dataElement.GetTag() | |
161 | - data = stf.ToStringPair(tag) | |
162 | - stag = tag.PrintAsPipeSeparatedString() | |
163 | - | |
164 | - group = stag.split("|")[0][1:] | |
165 | - field = stag.split("|")[1][:-1] | |
166 | - tag_labels[stag] = data[0] | |
167 | - | |
168 | - if not group in data_dict.keys(): | |
169 | - data_dict[group] = {} | |
170 | - | |
171 | - if not(utils.VerifyInvalidPListCharacter(data[1])): | |
172 | - data_dict[group][field] = data[1].decode(encoding) | |
173 | - else: | |
174 | - data_dict[group][field] = "Invalid Character" | |
140 | + group = stag.split("|")[0][1:] | |
141 | + field = stag.split("|")[1][:-1] | |
142 | + tag_labels[stag] = data[0] | |
175 | 143 | |
144 | + if not group in data_dict.keys(): | |
145 | + data_dict[group] = {} | |
176 | 146 | |
147 | + if not(utils.VerifyInvalidPListCharacter(data[1])): | |
148 | + data_dict[group][field] = data[1].decode(encoding) | |
149 | + else: | |
150 | + data_dict[group][field] = "Invalid Character" | |
177 | 151 | |
178 | - # -------------- To Create DICOM Thumbnail ----------- | |
179 | - rvtk = vtkgdcm.vtkGDCMImageReader() | |
180 | - rvtk.SetFileName(filepath.encode(utils.get_system_encoding())) | |
181 | - rvtk.Update() | |
182 | - | |
183 | - try: | |
184 | - data = data_dict['0028']['1050'] | |
185 | - level = [float(value) for value in data.split('\\')][0] | |
186 | - data = data_dict['0028']['1051'] | |
187 | - window = [float(value) for value in data.split('\\')][0] | |
188 | - except(KeyError): | |
189 | - level = 300.0 | |
190 | - window = 2000.0 | |
191 | - | |
192 | - colorer = vtk.vtkImageMapToWindowLevelColors() | |
193 | - colorer.SetInput(rvtk.GetOutput()) | |
194 | - colorer.SetWindow(float(window)) | |
195 | - colorer.SetLevel(float(level)) | |
196 | - colorer.SetOutputFormatToRGB() | |
197 | - colorer.Update() | |
152 | + | |
153 | + # Iterate through the Data set | |
154 | + iterator = dataSet.GetDES().begin() | |
155 | + while (not iterator.equal(dataSet.GetDES().end())): | |
156 | + dataElement = iterator.next() | |
198 | 157 | |
199 | - resample = vtk.vtkImageResample() | |
200 | - resample.SetInput(colorer.GetOutput()) | |
201 | - resample.SetAxisMagnificationFactor ( 0, 0.25 ) | |
202 | - resample.SetAxisMagnificationFactor ( 1, 0.25 ) | |
203 | - resample.SetAxisMagnificationFactor ( 2, 1 ) | |
204 | - resample.Update() | |
205 | - | |
206 | - thumbnail_path = tempfile.mktemp() | |
158 | + stf.SetFile(file) | |
159 | + tag = dataElement.GetTag() | |
160 | + data = stf.ToStringPair(tag) | |
161 | + stag = tag.PrintAsPipeSeparatedString() | |
207 | 162 | |
208 | - write_png = vtk.vtkPNGWriter() | |
209 | - write_png.SetInput(resample.GetOutput()) | |
210 | - write_png.SetFileName(thumbnail_path) | |
211 | - write_png.Write() | |
212 | - | |
213 | - # ---------- Refactory -------------------------------------- | |
214 | - data_dict['invesalius'] = {'orientation_label' : GetImageOrientationLabel(filepath.encode(utils.get_system_encoding()))} | |
163 | + group = stag.split("|")[0][1:] | |
164 | + field = stag.split("|")[1][:-1] | |
165 | + tag_labels[stag] = data[0] | |
215 | 166 | |
216 | - # ------------------------------------------------------------- | |
217 | - dict_file[filepath] = data_dict | |
218 | - | |
219 | - #---------- Verify is DICOMDir ------------------------------- | |
220 | - is_dicom_dir = 1 | |
221 | - try: | |
222 | - if (data_dict['0002']['0002'] != "1.2.840.10008.1.3.10"): #DICOMDIR | |
223 | - is_dicom_dir = 0 | |
224 | - except(KeyError): | |
225 | - is_dicom_dir = 0 | |
226 | - | |
227 | - if not(is_dicom_dir): | |
228 | - parser = dicom.Parser() | |
229 | - parser.SetDataImage(dict_file[filepath], filepath, thumbnail_path) | |
230 | - | |
231 | - dcm = dicom.Dicom() | |
232 | - self.l.acquire() | |
233 | - dcm.SetParser(parser) | |
234 | - grouper.AddFile(dcm) | |
235 | - | |
236 | - self.l.release() | |
167 | + if not group in data_dict.keys(): | |
168 | + data_dict[group] = {} | |
169 | + | |
170 | + if not(utils.VerifyInvalidPListCharacter(data[1])): | |
171 | + data_dict[group][field] = data[1].decode(encoding) | |
172 | + else: | |
173 | + data_dict[group][field] = "Invalid Character" | |
174 | + | |
175 | + | |
176 | + | |
177 | + # -------------- To Create DICOM Thumbnail ----------- | |
178 | + rvtk = vtkgdcm.vtkGDCMImageReader() | |
179 | + rvtk.SetFileName(self.filepath.encode(utils.get_system_encoding())) | |
180 | + rvtk.Update() | |
181 | + | |
182 | + try: | |
183 | + data = data_dict['0028']['1050'] | |
184 | + level = [float(value) for value in data.split('\\')][0] | |
185 | + data = data_dict['0028']['1051'] | |
186 | + window = [float(value) for value in data.split('\\')][0] | |
187 | + except(KeyError): | |
188 | + level = 300.0 | |
189 | + window = 2000.0 | |
190 | + | |
191 | + colorer = vtk.vtkImageMapToWindowLevelColors() | |
192 | + colorer.SetInput(rvtk.GetOutput()) | |
193 | + colorer.SetWindow(float(window)) | |
194 | + colorer.SetLevel(float(level)) | |
195 | + colorer.SetOutputFormatToRGB() | |
196 | + colorer.Update() | |
197 | + | |
198 | + resample = vtk.vtkImageResample() | |
199 | + resample.SetInput(colorer.GetOutput()) | |
200 | + resample.SetAxisMagnificationFactor ( 0, 0.25 ) | |
201 | + resample.SetAxisMagnificationFactor ( 1, 0.25 ) | |
202 | + resample.SetAxisMagnificationFactor ( 2, 1 ) | |
203 | + resample.Update() | |
204 | + | |
205 | + thumbnail_path = tempfile.mktemp() | |
206 | + | |
207 | + write_png = vtk.vtkPNGWriter() | |
208 | + write_png.SetInput(resample.GetOutput()) | |
209 | + write_png.SetFileName(thumbnail_path) | |
210 | + write_png.Write() | |
211 | + | |
212 | + # ---------- Refactory -------------------------------------- | |
213 | + data_dict['invesalius'] = {'orientation_label' : GetImageOrientationLabel(self.filepath.encode(utils.get_system_encoding()))} | |
214 | + | |
215 | + # ------------------------------------------------------------- | |
216 | + dict_file[self.filepath] = data_dict | |
217 | + | |
218 | + #---------- Verify is DICOMDir ------------------------------- | |
219 | + is_dicom_dir = 1 | |
220 | + try: | |
221 | + if (data_dict['0002']['0002'] != "1.2.840.10008.1.3.10"): #DICOMDIR | |
222 | + is_dicom_dir = 0 | |
223 | + except(KeyError): | |
224 | + is_dicom_dir = 0 | |
225 | + | |
226 | + if not(is_dicom_dir): | |
227 | + parser = dicom.Parser() | |
228 | + parser.SetDataImage(dict_file[self.filepath], self.filepath, thumbnail_path) | |
237 | 229 | |
238 | - #========== used in test ======================================= | |
239 | - #main_dict = dict( | |
240 | - # data = dict_file, | |
241 | - # labels = tag_labels) | |
242 | - | |
243 | - #plistlib.writePlist(main_dict, ".//teste.plist")""" | |
230 | + dcm = dicom.Dicom() | |
231 | + #self.l.acquire() | |
232 | + dcm.SetParser(parser) | |
233 | + grouper.AddFile(dcm) | |
234 | + | |
235 | + #self.l.release() | |
236 | + | |
237 | + #========== used in test ======================================= | |
238 | + #main_dict = dict( | |
239 | + # data = dict_file, | |
240 | + # labels = tag_labels) | |
241 | + | |
242 | + #plistlib.writePlist(main_dict, ".//teste.plist")""" | |
244 | 243 | |
245 | 244 | |
246 | 245 | def GetImageOrientationLabel(filename): |
... | ... | @@ -282,13 +281,13 @@ def yGetDicomGroups(directory, recursive=True, gui=True): |
282 | 281 | |
283 | 282 | counter = 0 |
284 | 283 | grouper = dicom_grouper.DicomPatientGrouper() |
285 | - q = Queue.Queue() | |
286 | - l = threading.Lock() | |
287 | - threads = [] | |
288 | - for i in xrange(cpu_count()): | |
289 | - t = LoadDicom(grouper, q, l) | |
290 | - t.start() | |
291 | - threads.append(t) | |
284 | + #q = Queue.Queue() | |
285 | + #l = threading.Lock() | |
286 | + #threads = [] | |
287 | + #for i in xrange(cpu_count()): | |
288 | + # t = LoadDicom(grouper, q, l) | |
289 | + # t.start() | |
290 | + # threads.append(t) | |
292 | 291 | # Retrieve only DICOM files, splited into groups |
293 | 292 | if recursive: |
294 | 293 | for dirpath, dirnames, filenames in os.walk(directory): |
... | ... | @@ -297,7 +296,7 @@ def yGetDicomGroups(directory, recursive=True, gui=True): |
297 | 296 | counter += 1 |
298 | 297 | if gui: |
299 | 298 | yield (counter,nfiles) |
300 | - q.put(filepath) | |
299 | + LoadDicom(grouper, filepath) | |
301 | 300 | else: |
302 | 301 | dirpath, dirnames, filenames = os.walk(directory) |
303 | 302 | for name in filenames: |
... | ... | @@ -305,13 +304,13 @@ def yGetDicomGroups(directory, recursive=True, gui=True): |
305 | 304 | counter += 1 |
306 | 305 | if gui: |
307 | 306 | yield (counter,nfiles) |
308 | - q.put(filepath) | |
307 | + #q.put(filepath) | |
309 | 308 | |
310 | - for t in threads: | |
311 | - q.put(0) | |
309 | + #for t in threads: | |
310 | + # q.put(0) | |
312 | 311 | |
313 | - for t in threads: | |
314 | - t.join() | |
312 | + #for t in threads: | |
313 | + # t.join() | |
315 | 314 | |
316 | 315 | #TODO: Is this commented update necessary? |
317 | 316 | #grouper.Update() | ... | ... |