Commit 61d6ebfa72727b21617892f7b14ef792c3bcb050

Authored by Paulo Henrique Junqueira Amorim
1 parent d6839add

ENH: Turned thread support in importation

invesalius/control.py
... ... @@ -120,12 +120,13 @@ class Controller():
120 120 answer = dialog.SaveChangesDialog2(filename)
121 121 if answer:
122 122 self.ShowDialogSaveProject()
123   -
124 123 # Import project
125 124 dirpath = dialog.ShowImportDirDialog()
126 125 if dirpath and not os.listdir(dirpath):
  126 + print "IFFFFFFFfff"
127 127 dialog.ImportEmptyDirectory(dirpath)
128 128 elif dirpath:
  129 + print "ELSE..........."
129 130 self.StartImportPanel(dirpath)
130 131 ps.Publisher().sendMessage("Load data to import panel", dirpath)
131 132  
... ...
invesalius/reader/dicom_reader.py
... ... @@ -79,60 +79,132 @@ def SortFiles(filelist, dicom):
79 79  
80 80 return filelist
81 81  
82   -"""
  82 +tag_labels = {}
  83 +main_dict = {}
  84 +dict_file = {}
  85 +
83 86 class LoadDicom(threading.Thread):
  87 +
84 88 def __init__(self, grouper, q, l):
85 89 threading.Thread.__init__(self)
86 90 self.grouper = grouper
87 91 self.q = q
88 92 self.l = l
  93 +
89 94 def run(self):
  95 +
90 96 grouper = self.grouper
91 97 q = self.q
  98 +
92 99 while 1:
  100 +
93 101 filepath = q.get()
94 102 if not filepath:
95 103 break
96   - parser = dicom.Parser()
97   - #if parser.SetFileName(filepath):
98   - dcm = dicom.Dicom()
99   - self.l.acquire()
100   - dcm.SetParser(parser)
101   - grouper.AddFile(dcm)
102   - self.l.release()
103   -"""
104   -
105   -"""
106   -class LoadDicom():
107   - def __init__(self, grouper, dicom_dict):
108   - self.grouper = grouper
109   - self.dicom_dict = dicom_dict
  104 +
  105 + reader = gdcm.Reader()
  106 + reader.SetFileName(filepath)
  107 +
  108 + if (reader.Read()):
  109 +
  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()
  118 +
  119 + field_dict = {}
  120 + data_dict = {}
  121 +
  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()
  139 +
  140 + group = stag.split("|")[0][1:]
  141 + field = stag.split("|")[1][:-1]
  142 + tag_labels[stag] = data[0]
  143 +
  144 + if not group in data_dict.keys():
  145 + data_dict[group] = {}
  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"
110 151  
111   - def Start(self):
112   - images = self.dicom_dict['data']
113 152  
114   - grouper = self.grouper
115   -
116   - for x in images.keys():
117   - data_image = images[x]
118   - parser = dicom.Parser()
119   - parser.SetDataImage(data_image)
120   -
121   - dcm = dicom.Dicom()
122   - dcm.SetParser(parser)
123   - grouper.AddFile(dcm)
124   -
125   -
126   - #while 1:
127   - #filepath = path
128   - #if not filepath:
129   - # break
130   - #parser = dicom.Parser()
131   - #if parser.SetFileName(filepath):
132   - # dcm = dicom.Dicom()
133   - # dcm.SetParser(parser)
134   - # grouper.AddFile(dcm)
135   -"""
  153 + # Iterate through the Data set
  154 + iterator = dataSet.GetDES().begin()
  155 + while (not iterator.equal(dataSet.GetDES().end())):
  156 + dataElement = iterator.next()
  157 +
  158 + stf.SetFile(file)
  159 + tag = dataElement.GetTag()
  160 + data = stf.ToStringPair(tag)
  161 + stag = tag.PrintAsPipeSeparatedString()
  162 +
  163 + group = stag.split("|")[0][1:]
  164 + field = stag.split("|")[1][:-1]
  165 + tag_labels[stag] = data[0]
  166 +
  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 + # ---------- Refactory --------------------------------------
  178 + data_dict['invesalius'] = {'orientation_label' : GetImageOrientationLabel(filepath)}
  179 +
  180 + # -------------------------------------------------------------
  181 + dict_file[filepath] = data_dict
  182 +
  183 + #---------- Verify is DICOMDir -------------------------------
  184 + is_dicom_dir = 1
  185 + try:
  186 + if (data_dict['0002']['0002'] != "1.2.840.10008.1.3.10"): #DICOMDIR
  187 + is_dicom_dir = 0
  188 + except(KeyError):
  189 + is_dicom_dir = 0
  190 +
  191 + if not(is_dicom_dir):
  192 + parser = dicom.Parser()
  193 + parser.SetDataImage(dict_file[filepath], filepath)
  194 +
  195 + dcm = dicom.Dicom()
  196 + self.l.acquire()
  197 + dcm.SetParser(parser)
  198 + grouper.AddFile(dcm)
  199 +
  200 + self.l.release()
  201 +
  202 + #========== used in test =======================================
  203 + #main_dict = dict(
  204 + # data = dict_file,
  205 + # labels = tag_labels)
  206 +
  207 + #plistlib.writePlist(main_dict, ".//teste.plist")"""
136 208  
137 209  
138 210 def GetImageOrientationLabel(filename):
... ... @@ -158,180 +230,60 @@ def GetImageOrientationLabel(filename):
158 230 else:
159 231 return ""
160 232  
161   -grouper = dicom_grouper.DicomPatientGrouper()
162 233  
163   -def GetDicomGroups(directory, recursive=True, gui=True):
  234 +def yGetDicomGroups(directory, recursive=True, gui=True):
164 235 """
165 236 Return all full paths to DICOM files inside given directory.
166 237 """
167   -
168 238 nfiles = 0
169 239 # Find total number of files
170 240 if recursive:
171   -
172   - folders = [f[0] for f in os.walk(directory)]
173   -
174   - tag_labels = {}
175   - main_dict = {}
176   - dict_file = {}
177   -
178   - for folder in folders:
179   - files = glob.glob(os.path.join(folder, "*"))
180   -
181   - for filename in files:
182   -
183   - # Read file
184   - reader = gdcm.Reader()
185   - reader.SetFileName(filename)
186   -
187   - if (reader.Read()):
188   -
189   - file = reader.GetFile()
190   -
191   - # Retrieve data set
192   - dataSet = file.GetDataSet()
193   -
194   - # Retrieve header
195   - header = file.GetHeader()
196   - stf = gdcm.StringFilter()
197   -
198   - field_dict = {}
199   - data_dict = {}
200   -
  241 + for dirpath, dirnames, filenames in os.walk(directory):
  242 + nfiles += len(filenames)
  243 + else:
  244 + dirpath, dirnames, filenames = os.walk(directory)
  245 + nfiles = len(filenames)
  246 +
  247 + counter = 0
  248 + grouper = dicom_grouper.DicomPatientGrouper()
  249 + q = Queue.Queue()
  250 + l = threading.Lock()
  251 + threads = []
  252 + for i in xrange(cpu_count()):
  253 + t = LoadDicom(grouper, q, l)
  254 + t.start()
  255 + threads.append(t)
  256 + # Retrieve only DICOM files, splited into groups
  257 + if recursive:
  258 + for dirpath, dirnames, filenames in os.walk(directory):
  259 + for name in filenames:
  260 + filepath = os.path.join(dirpath, name)
  261 + counter += 1
  262 + if gui:
  263 + yield (counter,nfiles)
  264 + q.put(filepath)
  265 + else:
  266 + dirpath, dirnames, filenames = os.walk(directory)
  267 + for name in filenames:
  268 + filepath = str(os.path.join(dirpath, name))
  269 + counter += 1
  270 + if gui:
  271 + yield (counter,nfiles)
  272 + q.put(filepath)
201 273  
202   - tag = gdcm.Tag(0x0008, 0x0005)
203   - ds = reader.GetFile().GetDataSet()
204   - if ds.FindDataElement(tag):
205   - encoding = str(ds.GetDataElement(tag).GetValue())
206   - if not(encoding != None and encoding != "None" and encoding != "Loaded"):
207   - encoding = "ISO_IR 100"
208   - else:
209   - encoding = "ISO_IR_100"
210   - # Iterate through the Header
211   - iterator = header.GetDES().begin()
212   - while (not iterator.equal(header.GetDES().end())):
213   - dataElement = iterator.next()
214   - stf.SetFile(file)
215   - tag = dataElement.GetTag()
216   - data = stf.ToStringPair(tag)
217   - stag = tag.PrintAsPipeSeparatedString()
218   -
219   - group = stag.split("|")[0][1:]
220   - field = stag.split("|")[1][:-1]
221   - tag_labels[stag] = data[0]
222   -
223   - if not group in data_dict.keys():
224   - data_dict[group] = {}
225   -
226   - if not(utils.VerifyInvalidPListCharacter(data[1])):
227   - data_dict[group][field] = data[1].decode(encoding)
228   - else:
229   - data_dict[group][field] = "Invalid Character"
  274 + for t in threads:
  275 + q.put(0)
230 276  
231   -
232   - # Iterate through the Data set
233   - iterator = dataSet.GetDES().begin()
234   - while (not iterator.equal(dataSet.GetDES().end())):
235   - dataElement = iterator.next()
236   -
237   - stf.SetFile(file)
238   - tag = dataElement.GetTag()
239   - data = stf.ToStringPair(tag)
240   - stag = tag.PrintAsPipeSeparatedString()
241   -
242   - group = stag.split("|")[0][1:]
243   - field = stag.split("|")[1][:-1]
244   - tag_labels[stag] = data[0]
245   -
246   - if not group in data_dict.keys():
247   - data_dict[group] = {}
248   -
249   - if not(utils.VerifyInvalidPListCharacter(data[1])):
250   - data_dict[group][field] = data[1].decode(encoding)
251   - else:
252   - data_dict[group][field] = "Invalid Character"
253   -
  277 + for t in threads:
  278 + t.join()
254 279  
255   -
256   - # ---------- Refactory --------------------------------------
257   - data_dict['invesalius'] = {'orientation_label' : GetImageOrientationLabel(filename)}
  280 + #TODO: Is this commented update necessary?
  281 + #grouper.Update()
  282 + yield grouper.GetPatientsGroups()
258 283  
259   - # -------------------------------------------------------------
260   - filepath = os.path.abspath(filename)
261   - dict_file[filepath] = data_dict
262   -
263   - #---------- Verify is DICOMDir -------------------------------
264   - is_dicom_dir = 1
265   - try:
266   - if (data_dict['0002']['0002'] != "1.2.840.10008.1.3.10"): #DICOMDIR
267   - is_dicom_dir = 0
268   - except(KeyError):
269   - is_dicom_dir = 0
270   -
271   - if not(is_dicom_dir):
272   - parser = dicom.Parser()
273   - parser.SetDataImage(dict_file[filepath], filepath)
274   -
275   - dcm = dicom.Dicom()
276   - dcm.SetParser(parser)
277   - grouper.AddFile(dcm)
278 284  
279   -
280   - #------- to test -------------------------------------
281   - #main_dict = dict(
282   - # data = dict_file,
283   - # labels = tag_labels)
284   -
285   - #plistlib.writePlist(main_dict, ".//teste.plist")
286   -
287   - grouper.Update()
288   -
289   - return grouper.GetPatientsGroups()
290   -
291   - else:
292   - pass
293   - #dirpath, dirnames, filenames = os.walk(directory)
294   - #nfiles = len(filenames)
295   -
296   - #counter = 0
297   - #grouper = dicom_grouper.DicomPatientGrouper()
298   - #q = Queue.Queue()
299   - #l = threading.Lock()
300   - #threads = []
301   - #for i in xrange(cpu_count()):
302   - # t = LoadDicom(grouper, q, l)
303   - # t.start()
304   - # threads.append(t)
305   - ## Retrieve only DICOM files, splited into groups
306   - #if recursive:
307   - # for dirpath, dirnames, filenames in os.walk(directory):
308   - # for name in filenames:
309   - # filepath = os.path.join(dirpath, name)
310   - # counter += 1
311   - # if gui:
312   - # yield (counter,nfiles)
313   - # q.put(filepath)
314   - #else:
315   - # dirpath, dirnames, filenames = os.walk(directory)
316   - # for name in filenames:
317   - # filepath = str(os.path.join(dirpath, name))
318   - # counter += 1
319   - # if gui:
320   - # yield (counter,nfiles)
321   - # q.put(filepath)
322   -
323   - #for t in threads:
324   - # q.put(0)
325   -
326   - #for t in threads:
327   - # t.join()
328   -
329   - ##TODO: Is this commented update necessary?
330   - ##grouper.Update()
331   - #yield grouper.GetPatientsGroups()
332   -
333   -#def GetDicomGroups(directory, recursive=True):
334   -# return yGetDicomGroups(directory, recursive, gui=False).next()
  285 +def GetDicomGroups(directory, recursive=True):
  286 + return yGetDicomGroups(directory, recursive, gui=False).next()
335 287  
336 288  
337 289 class ProgressDicomReader:
... ... @@ -364,7 +316,9 @@ class ProgressDicomReader:
364 316 fow.SetFileName(log_path)
365 317 ow = vtk.vtkOutputWindow()
366 318 ow.SetInstance(fow)
367   -
  319 + print "=====>>> Progress... dicom_reader.py 367"
  320 +
  321 +
368 322 y = yGetDicomGroups(path, recursive)
369 323 for value_progress in y:
370 324 if not self.running:
... ...