Commit ceea67fa2b82620ef0b4b1e27573d02c6bb2e8bc
1 parent
2ce60186
Exists in
master
and in
67 other branches
ENH: Optimize importation of DICOM files
Showing
7 changed files
with
533 additions
and
547 deletions
Show diff stats
invesalius/control.py
| ... | ... | @@ -328,7 +328,6 @@ class Controller(): |
| 328 | 328 | def ImportMedicalImages(self, directory): |
| 329 | 329 | # OPTION 1: DICOM? |
| 330 | 330 | patients_groups = dcm.GetDicomGroups(directory) |
| 331 | - | |
| 332 | 331 | if len(patients_groups): |
| 333 | 332 | group = dcm.SelectLargerDicomGroup(patients_groups) |
| 334 | 333 | imagedata, dicom = self.OpenDicomGroup(group, 0, gui=True) |
| ... | ... | @@ -486,7 +485,6 @@ class Controller(): |
| 486 | 485 | |
| 487 | 486 | wl = float(dicom.image.level) |
| 488 | 487 | ww = float(dicom.image.window) |
| 489 | - | |
| 490 | 488 | self.matrix, self.filename = utils.dcm2memmap(filelist, size, |
| 491 | 489 | orientation) |
| 492 | 490 | self.Slice = sl.Slice() | ... | ... |
invesalius/data/imagedata_utils.py
| ... | ... | @@ -469,7 +469,7 @@ def dcm2memmap(files, slice_size, orientation): |
| 469 | 469 | shape = slice_size[1], len(files), slice_size[0] |
| 470 | 470 | else: |
| 471 | 471 | shape = len(files), slice_size[1], slice_size[0] |
| 472 | - | |
| 472 | + print shape | |
| 473 | 473 | matrix = numpy.memmap(temp_file, mode='w+', dtype='int16', shape=shape) |
| 474 | 474 | dcm_reader = vtkgdcm.vtkGDCMImageReader() |
| 475 | 475 | for n, f in enumerate(files): | ... | ... |
invesalius/invesalius.py
| ... | ... | @@ -31,7 +31,7 @@ if sys.platform == 'win32': |
| 31 | 31 | import _winreg |
| 32 | 32 | else: |
| 33 | 33 | import wxversion |
| 34 | - wxversion.ensureMinimal('2.8-unicode', optionsRequired=True) | |
| 34 | + wxversion.ensureMinimal('2.8-unicode', optionsRequired=True) | |
| 35 | 35 | wxversion.select('2.8-unicode', optionsRequired=True) |
| 36 | 36 | |
| 37 | 37 | import wx | ... | ... |
invesalius/reader/dicom.py
| ... | ... | @@ -18,7 +18,7 @@ |
| 18 | 18 | # detalhes. |
| 19 | 19 | #--------------------------------------------------------------------- |
| 20 | 20 | import time |
| 21 | -import gdcm | |
| 21 | +#import gdcm | |
| 22 | 22 | #import vtkgdcm |
| 23 | 23 | import sys |
| 24 | 24 | |
| ... | ... | @@ -91,15 +91,14 @@ class Parser(): |
| 91 | 91 | def __init__(self): |
| 92 | 92 | self.filename = "" |
| 93 | 93 | self.encoding = "" |
| 94 | - #self.vtkgdcm_reader = vtkgdcm.vtkGDCMImageReader() | |
| 95 | 94 | |
| 96 | - def SetFileName(self, filename): | |
| 95 | + #def SetFileName(self, filename): | |
| 97 | 96 | """ |
| 98 | 97 | Set file name to be parsed given its filename (this should |
| 99 | 98 | include the full path of the file of interest). |
| 100 | 99 | |
| 101 | 100 | Return True/False if file could be read. |
| 102 | - """ | |
| 101 | + | |
| 103 | 102 | import os.path as path |
| 104 | 103 | |
| 105 | 104 | |
| ... | ... | @@ -133,10 +132,15 @@ class Parser(): |
| 133 | 132 | #self.vtkgdcm_reader = vtkgdcm_reader |
| 134 | 133 | return True |
| 135 | 134 | |
| 136 | - return False | |
| 135 | + return False""" | |
| 136 | + | |
| 137 | + #def GetImageData(self): | |
| 138 | + # return None#self.vtkgdcm_reader.GetOutput() | |
| 139 | + | |
| 137 | 140 | |
| 138 | - def GetImageData(self): | |
| 139 | - return None#self.vtkgdcm_reader.GetOutput() | |
| 141 | + def SetDataImage(self, data_image, filename): | |
| 142 | + self.data_image = data_image | |
| 143 | + self.filename = filename | |
| 140 | 144 | |
| 141 | 145 | def __format_time(self,value): |
| 142 | 146 | sp1 = value.split(".") |
| ... | ... | @@ -181,14 +185,7 @@ class Parser(): |
| 181 | 185 | an image. (AXIAL, SAGITTAL, CORONAL, |
| 182 | 186 | OBLIQUE or UNKNOWN) |
| 183 | 187 | """ |
| 184 | - img = self.gdcm_reader.GetImage() | |
| 185 | - direc_cosines = img.GetDirectionCosines() | |
| 186 | - orientation = gdcm.Orientation() | |
| 187 | - try: | |
| 188 | - type = orientation.GetType(tuple(direc_cosines)) | |
| 189 | - except TypeError: | |
| 190 | - type = orientation.GetType(direc_cosines) | |
| 191 | - label = orientation.GetLabel(type) | |
| 188 | + label = self.data_image['invesalius']['orientation_label'] | |
| 192 | 189 | |
| 193 | 190 | if (label): |
| 194 | 191 | return label |
| ... | ... | @@ -201,12 +198,7 @@ class Parser(): |
| 201 | 198 | to the number of columns on the image. |
| 202 | 199 | Return "" if not defined. |
| 203 | 200 | """ |
| 204 | - tag = gdcm.Tag(0x0028, 0x0011) | |
| 205 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 206 | - sf = gdcm.StringFilter() | |
| 207 | - sf.SetFile(self.gdcm_reader.GetFile()) | |
| 208 | - data = sf.ToStringPair(tag)[1] | |
| 209 | - | |
| 201 | + data = self.data_image['0028']['0011'] | |
| 210 | 202 | if (data): |
| 211 | 203 | return int(str(data)) |
| 212 | 204 | return "" |
| ... | ... | @@ -218,12 +210,7 @@ class Parser(): |
| 218 | 210 | to the number of rows on the image. |
| 219 | 211 | Return "" if not defined. |
| 220 | 212 | """ |
| 221 | - tag = gdcm.Tag(0x0028, 0x0010) | |
| 222 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 223 | - sf = gdcm.StringFilter() | |
| 224 | - sf.SetFile(self.gdcm_reader.GetFile()) | |
| 225 | - data = sf.ToStringPair(tag)[1] | |
| 226 | - | |
| 213 | + data = self.data_image['0028']['0010'] | |
| 227 | 214 | if (data): |
| 228 | 215 | return int(str(data)) |
| 229 | 216 | return "" |
| ... | ... | @@ -309,12 +296,9 @@ class Parser(): |
| 309 | 296 | DICOM standard tag (0x0008,0x0022) was used. |
| 310 | 297 | """ |
| 311 | 298 | # TODO: internationalize data |
| 312 | - tag = gdcm.Tag(0x0008, 0x0022) | |
| 313 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 314 | - if ds.FindDataElement(tag): | |
| 315 | - date = ds.GetDataElement(tag).GetValue() | |
| 316 | - if (date) and (date != ''): | |
| 317 | - return self.__format_date(str(date)) | |
| 299 | + date = self.data_image['0008']['0022'] | |
| 300 | + if (date) and (date != ''): | |
| 301 | + return self.__format_date(str(date)) | |
| 318 | 302 | return "" |
| 319 | 303 | |
| 320 | 304 | def GetAcquisitionNumber(self): |
| ... | ... | @@ -324,12 +308,9 @@ class Parser(): |
| 324 | 308 | |
| 325 | 309 | DICOM standard tag (0x0020, 0x0012) was used. |
| 326 | 310 | """ |
| 327 | - tag = gdcm.Tag(0x0020, 0x0012) | |
| 328 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 329 | - if ds.FindDataElement(tag): | |
| 330 | - data = ds.GetDataElement(tag).GetValue() | |
| 331 | - if (data): | |
| 332 | - return int(str(data)) | |
| 311 | + data = self.data_image['0020']['0012'] | |
| 312 | + if (data): | |
| 313 | + return int(str(data)) | |
| 333 | 314 | return "" |
| 334 | 315 | |
| 335 | 316 | def GetAccessionNumber(self): |
| ... | ... | @@ -338,16 +319,13 @@ class Parser(): |
| 338 | 319 | |
| 339 | 320 | DICOM standard tag (0x0008, 0x0050) was used. |
| 340 | 321 | """ |
| 341 | - tag = gdcm.Tag(0x0008, 0x0050) | |
| 342 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 343 | - if ds.FindDataElement(tag): | |
| 344 | - data = ds.GetDataElement(tag).GetValue() | |
| 345 | - if (data): | |
| 346 | - try: | |
| 347 | - value = int(str(data)) | |
| 348 | - except(ValueError): #Problem in the other\iCatDanielaProjeto | |
| 349 | - value = 0 | |
| 350 | - return value | |
| 322 | + data = self.data_image['0008']['0050'] | |
| 323 | + if (data): | |
| 324 | + try: | |
| 325 | + value = int(str(data)) | |
| 326 | + except(ValueError): #Problem in the other\iCatDanielaProjeto | |
| 327 | + value = 0 | |
| 328 | + return value | |
| 351 | 329 | return "" |
| 352 | 330 | |
| 353 | 331 | def GetAcquisitionTime(self): |
| ... | ... | @@ -358,12 +336,9 @@ class Parser(): |
| 358 | 336 | |
| 359 | 337 | DICOM standard tag (0x0008,0x0032) was used. |
| 360 | 338 | """ |
| 361 | - tag = gdcm.Tag(0x0008, 0x0032) | |
| 362 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 363 | - if ds.FindDataElement(tag): | |
| 364 | - data = ds.GetDataElement(tag).GetValue() | |
| 365 | - if (data) and (data != ''): | |
| 366 | - return self.__format_time(str(data)) | |
| 339 | + data = self.data_image['0008']['0032'] | |
| 340 | + if (data) and (data != ''): | |
| 341 | + return self.__format_time(str(data)) | |
| 367 | 342 | return "" |
| 368 | 343 | |
| 369 | 344 | def GetPatientAdmittingDiagnosis(self): |
| ... | ... | @@ -388,33 +363,28 @@ class Parser(): |
| 388 | 363 | Return image window center / level (related to brightness). |
| 389 | 364 | This is an integer or a floating point. If the value can't |
| 390 | 365 | be read, return "". |
| 391 | - | |
| 392 | 366 | By default, only one level value is returned, according to |
| 393 | 367 | "preset" parameter. If no value is passed, WL_PRESET constant |
| 394 | 368 | is used. In case one wishes to acquire a list with all |
| 395 | 369 | level values, one should set "multiple" parameter to True. |
| 396 | - | |
| 397 | 370 | Return "" if field is not defined. |
| 398 | - | |
| 399 | 371 | DICOM standard tag (0x0028,0x1050) was used. |
| 400 | 372 | """ |
| 401 | - | |
| 402 | - tag = gdcm.Tag(0x0028, 0x1050) | |
| 403 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 404 | - | |
| 405 | - if ds.FindDataElement(tag): | |
| 406 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 407 | - if (data): | |
| 408 | - # Usually 'data' is a number. However, in some DICOM | |
| 409 | - # files, there are several values separated by '\'. | |
| 410 | - # If multiple values are present for the "Window Center" | |
| 411 | - # we choose only one. As this should be paired to "Window | |
| 412 | - # Width", it is set based on WL_PRESET | |
| 413 | - value_list = [float(value) for value in data.split('\\')] | |
| 414 | - if multiple: | |
| 415 | - return value_list | |
| 416 | - else: | |
| 417 | - return value_list[preset] | |
| 373 | + try: | |
| 374 | + data = self.data_image['0028']['1050'] | |
| 375 | + except(KeyError): | |
| 376 | + return "300" | |
| 377 | + if (data): | |
| 378 | + # Usually 'data' is a number. However, in some DICOM | |
| 379 | + # files, there are several values separated by '\'. | |
| 380 | + # If multiple values are present for the "Window Center" | |
| 381 | + # we choose only one. As this should be paired to "Window | |
| 382 | + # Width", it is set based on WL_PRESET | |
| 383 | + value_list = [float(value) for value in data.split('\\')] | |
| 384 | + if multiple: | |
| 385 | + return value_list | |
| 386 | + else: | |
| 387 | + return value_list[preset] | |
| 418 | 388 | return "300" |
| 419 | 389 | |
| 420 | 390 | def GetImageWindowWidth(self, preset=WL_PRESET, multiple=WL_MULT): |
| ... | ... | @@ -432,24 +402,23 @@ class Parser(): |
| 432 | 402 | |
| 433 | 403 | DICOM standard tag (0x0028,0x1051) was used. |
| 434 | 404 | """ |
| 405 | + try: | |
| 406 | + data = self.data_image['0028']['1051'] | |
| 407 | + except(KeyError): | |
| 408 | + return "2000" | |
| 435 | 409 | |
| 436 | - tag = gdcm.Tag(0x0028,0x1051) | |
| 437 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 438 | - | |
| 439 | - if ds.FindDataElement(tag): | |
| 440 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 441 | - if (data): | |
| 442 | - # Usually 'data' is a number. However, in some DICOM | |
| 443 | - # files, there are several values separated by '\'. | |
| 444 | - # If multiple values are present for the "Window Center" | |
| 445 | - # we choose only one. As this should be paired to "Window | |
| 446 | - # Width", it is set based on WL_PRESET | |
| 447 | - value_list = [float(value) for value in data.split('\\')] | |
| 448 | - | |
| 449 | - if multiple: | |
| 450 | - return str(value_list) | |
| 451 | - else: | |
| 452 | - return str(value_list[preset]) | |
| 410 | + if (data): | |
| 411 | + # Usually 'data' is a number. However, in some DICOM | |
| 412 | + # files, there are several values separated by '\'. | |
| 413 | + # If multiple values are present for the "Window Center" | |
| 414 | + # we choose only one. As this should be paired to "Window | |
| 415 | + # Width", it is set based on WL_PRESET | |
| 416 | + value_list = [float(value) for value in data.split('\\')] | |
| 417 | + | |
| 418 | + if multiple: | |
| 419 | + return str(value_list) | |
| 420 | + else: | |
| 421 | + return str(value_list[preset]) | |
| 453 | 422 | return "2000" |
| 454 | 423 | |
| 455 | 424 | def GetImagePosition(self): |
| ... | ... | @@ -462,12 +431,12 @@ class Parser(): |
| 462 | 431 | |
| 463 | 432 | DICOM standard tag (0x0020, 0x0032) was used. |
| 464 | 433 | """ |
| 465 | - tag = gdcm.Tag(0x0020, 0x0032) | |
| 466 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 467 | - if ds.FindDataElement(tag): | |
| 468 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 469 | - if (data): | |
| 470 | - return [eval(value) for value in data.split('\\')] | |
| 434 | + try: | |
| 435 | + data = self.data_image['0020']['0032'] | |
| 436 | + except(KeyError): | |
| 437 | + return "" | |
| 438 | + if (data): | |
| 439 | + return [eval(value) for value in data.split('\\')] | |
| 471 | 440 | return "" |
| 472 | 441 | |
| 473 | 442 | def GetImageLocation(self): |
| ... | ... | @@ -478,12 +447,9 @@ class Parser(): |
| 478 | 447 | |
| 479 | 448 | DICOM standard tag (0x0020, 0x0032) was used. |
| 480 | 449 | """ |
| 481 | - tag = gdcm.Tag(0x0020, 0x1041) | |
| 482 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 483 | - if ds.FindDataElement(tag): | |
| 484 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 485 | - if (data): | |
| 486 | - return eval(data) | |
| 450 | + data = self.data_image['0020']['1041'] | |
| 451 | + if (data): | |
| 452 | + return eval(data) | |
| 487 | 453 | return "" |
| 488 | 454 | |
| 489 | 455 | def GetImageOffset(self): |
| ... | ... | @@ -493,12 +459,9 @@ class Parser(): |
| 493 | 459 | |
| 494 | 460 | DICOM standard tag (0x7fe0, 0x0010) was used. |
| 495 | 461 | """ |
| 496 | - tag = gdcm.Tag(0x7fe0, 0x0010) | |
| 497 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 498 | - if ds.FindDataElement(tag): | |
| 499 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 500 | - if (data): | |
| 501 | - return int(data.split(':')[1]) | |
| 462 | + data = self.data_image['7fe0']['0010'] | |
| 463 | + if (data): | |
| 464 | + return int(data.split(':')[1]) | |
| 502 | 465 | return "" |
| 503 | 466 | |
| 504 | 467 | |
| ... | ... | @@ -510,12 +473,9 @@ class Parser(): |
| 510 | 473 | |
| 511 | 474 | DICOM standard tag (0x0020, 0x0011) was used. |
| 512 | 475 | """ |
| 513 | - tag = gdcm.Tag(0x0020, 0x0011) | |
| 514 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 515 | - if ds.FindDataElement(tag): | |
| 516 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 517 | - if (data) and (data != '""') and (data != "None"): | |
| 518 | - return int(data) | |
| 476 | + data = self.data_image['0020']['0011'] | |
| 477 | + if (data) and (data != '""') and (data != "None"): | |
| 478 | + return int(data) | |
| 519 | 479 | return "" |
| 520 | 480 | |
| 521 | 481 | |
| ... | ... | @@ -529,12 +489,9 @@ class Parser(): |
| 529 | 489 | |
| 530 | 490 | DICOM standard tag (0x0028, 0x0030) was used. |
| 531 | 491 | """ |
| 532 | - tag = gdcm.Tag(0x0028, 0x0030) | |
| 533 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 534 | - if ds.FindDataElement(tag): | |
| 535 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 536 | - if (data): | |
| 537 | - return [eval(value) for value in data.split('\\')] | |
| 492 | + data = self.data_image['0028']['0030'] | |
| 493 | + if (data): | |
| 494 | + return [eval(value) for value in data.split('\\')] | |
| 538 | 495 | return "" |
| 539 | 496 | |
| 540 | 497 | def GetPatientWeight(self): |
| ... | ... | @@ -544,12 +501,9 @@ class Parser(): |
| 544 | 501 | |
| 545 | 502 | DICOM standard tag (0x0010, 0x1030) was used. |
| 546 | 503 | """ |
| 547 | - tag = gdcm.Tag(0x0010, 0x1030) | |
| 548 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 549 | - if ds.FindDataElement(tag): | |
| 550 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 551 | - if (data): | |
| 552 | - return float(data) | |
| 504 | + data = self.data_image['0010']['1030'] | |
| 505 | + if (data): | |
| 506 | + return float(data) | |
| 553 | 507 | return "" |
| 554 | 508 | |
| 555 | 509 | def GetPatientHeight(self): |
| ... | ... | @@ -559,12 +513,9 @@ class Parser(): |
| 559 | 513 | |
| 560 | 514 | DICOM standard tag (0x0010, 0x1030) was used. |
| 561 | 515 | """ |
| 562 | - tag = gdcm.Tag(0x0010, 0x1020) | |
| 563 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 564 | - if ds.FindDataElement(tag): | |
| 565 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 566 | - if (data): | |
| 567 | - return float(data) | |
| 516 | + data = self.data_image['0010']['1020'] | |
| 517 | + if (data): | |
| 518 | + return float(data) | |
| 568 | 519 | return "" |
| 569 | 520 | |
| 570 | 521 | def GetPatientAddress(self): |
| ... | ... | @@ -573,12 +524,9 @@ class Parser(): |
| 573 | 524 | |
| 574 | 525 | DICOM standard tag (0x0010, 0x1040) was used. |
| 575 | 526 | """ |
| 576 | - tag = gdcm.Tag(0x0010, 0x1040) | |
| 577 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 578 | - if ds.FindDataElement(tag): | |
| 579 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 580 | - if (data): | |
| 581 | - return data | |
| 527 | + data = self.data_image['0010']['1040'] | |
| 528 | + if (data): | |
| 529 | + return data | |
| 582 | 530 | return "" |
| 583 | 531 | |
| 584 | 532 | def GetPatientMilitarRank(self): |
| ... | ... | @@ -588,12 +536,9 @@ class Parser(): |
| 588 | 536 | |
| 589 | 537 | DICOM standard tag (0x0010, 0x1080) was used. |
| 590 | 538 | """ |
| 591 | - tag = gdcm.Tag(0x0010,0x1080) | |
| 592 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 593 | - if ds.FindDataElement(tag): | |
| 594 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 595 | - if (data): | |
| 596 | - return data | |
| 539 | + data = self.data_image['0010']['1080'] | |
| 540 | + if (data): | |
| 541 | + return data | |
| 597 | 542 | return "" |
| 598 | 543 | |
| 599 | 544 | def GetPatientMilitarBranch(self): |
| ... | ... | @@ -605,12 +550,9 @@ class Parser(): |
| 605 | 550 | |
| 606 | 551 | DICOM standard tag (0x0010, 0x1081) was used. |
| 607 | 552 | """ |
| 608 | - tag = gdcm.Tag(0x0010,0x1081) | |
| 609 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 610 | - if ds.FindDataElement(tag): | |
| 611 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 612 | - if (data): | |
| 613 | - return data | |
| 553 | + data = self.data_image['0010']['1081'] | |
| 554 | + if (data): | |
| 555 | + return data | |
| 614 | 556 | return "" |
| 615 | 557 | |
| 616 | 558 | def GetPatientCountry(self): |
| ... | ... | @@ -621,12 +563,9 @@ class Parser(): |
| 621 | 563 | |
| 622 | 564 | DICOM standard tag (0x0010, 0x2150) was used. |
| 623 | 565 | """ |
| 624 | - tag = gdcm.Tag(0x0010,0x2150) | |
| 625 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 626 | - if ds.FindDataElement(tag): | |
| 627 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 628 | - if (data): | |
| 629 | - return data | |
| 566 | + data = self.data_image['0010']['2150'] | |
| 567 | + if (data): | |
| 568 | + return data | |
| 630 | 569 | return "" |
| 631 | 570 | |
| 632 | 571 | def GetPatientRegion(self): |
| ... | ... | @@ -637,12 +576,9 @@ class Parser(): |
| 637 | 576 | |
| 638 | 577 | DICOM standard tag (0x0010, 0x2152) was used. |
| 639 | 578 | """ |
| 640 | - tag = gdcm.Tag(0x0010,0x2152) | |
| 641 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 642 | - if ds.FindDataElement(tag): | |
| 643 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 644 | - if (data): | |
| 645 | - return data | |
| 579 | + data = self.data_image['0010']['2152'] | |
| 580 | + if (data): | |
| 581 | + return data | |
| 646 | 582 | return "" |
| 647 | 583 | |
| 648 | 584 | def GetPatientTelephone(self): |
| ... | ... | @@ -652,12 +588,9 @@ class Parser(): |
| 652 | 588 | |
| 653 | 589 | DICOM standard tag (0x0010, 0x2154) was used. |
| 654 | 590 | """ |
| 655 | - tag = gdcm.Tag(0x0010,0x2154) | |
| 656 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 657 | - if ds.FindDataElement(tag): | |
| 658 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 659 | - if (data): | |
| 660 | - return data | |
| 591 | + data = self.data_image['0010']['2154'] | |
| 592 | + if (data): | |
| 593 | + return data | |
| 661 | 594 | return "" |
| 662 | 595 | |
| 663 | 596 | def GetPatientResponsible(self): |
| ... | ... | @@ -668,12 +601,9 @@ class Parser(): |
| 668 | 601 | |
| 669 | 602 | DICOM standard tag (0x0010, 0x2297) was used. |
| 670 | 603 | """ |
| 671 | - tag = gdcm.Tag(0x0010,0x2297) | |
| 672 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 673 | - if ds.FindDataElement(tag): | |
| 674 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 675 | - if (data): | |
| 676 | - return data | |
| 604 | + data = self.data_image['0010']['2297'] | |
| 605 | + if (data): | |
| 606 | + return data | |
| 677 | 607 | return "" |
| 678 | 608 | |
| 679 | 609 | def GetPatientResponsibleRole(self): |
| ... | ... | @@ -684,12 +614,9 @@ class Parser(): |
| 684 | 614 | |
| 685 | 615 | DICOM standard tag (0x0010, 0x2298) was used. |
| 686 | 616 | """ |
| 687 | - tag = gdcm.Tag(0x0010,0x2298) | |
| 688 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 689 | - if ds.FindDataElement(tag): | |
| 690 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 691 | - if (data): | |
| 692 | - return data | |
| 617 | + data = self.data_image['0010']['2298'] | |
| 618 | + if (data): | |
| 619 | + return data | |
| 693 | 620 | return "" |
| 694 | 621 | |
| 695 | 622 | def GetPatientResponsibleOrganization(self): |
| ... | ... | @@ -700,12 +627,9 @@ class Parser(): |
| 700 | 627 | |
| 701 | 628 | DICOM standard tag (0x0010, 0x2299) was used. |
| 702 | 629 | """ |
| 703 | - tag = gdcm.Tag(0x0010,0x2299) | |
| 704 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 705 | - if ds.FindDataElement(tag): | |
| 706 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 707 | - if (data): | |
| 708 | - return data | |
| 630 | + data = self.data_image['0010']['2299'] | |
| 631 | + if (data): | |
| 632 | + return data | |
| 709 | 633 | return "" |
| 710 | 634 | |
| 711 | 635 | def GetPatientMedicalCondition(self): |
| ... | ... | @@ -716,12 +640,9 @@ class Parser(): |
| 716 | 640 | |
| 717 | 641 | DICOM standard tag (0x0010, 0x2000) was used. |
| 718 | 642 | """ |
| 719 | - tag = gdcm.Tag(0x0010,0x2000) | |
| 720 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 721 | - if ds.FindDataElement(tag): | |
| 722 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 723 | - if (data): | |
| 724 | - return data | |
| 643 | + data = self.data_image['0010']['2000'] | |
| 644 | + if (data): | |
| 645 | + return data | |
| 725 | 646 | return "" |
| 726 | 647 | |
| 727 | 648 | def GetPatientContrastAllergies(self): |
| ... | ... | @@ -732,12 +653,9 @@ class Parser(): |
| 732 | 653 | |
| 733 | 654 | DICOM standard tag (0x0008, 0x2110) was used. |
| 734 | 655 | """ |
| 735 | - tag = gdcm.Tag(0x0008, 0x2110) | |
| 736 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 737 | - if ds.FindDataElement(tag): | |
| 738 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 739 | - if (data): | |
| 740 | - return data | |
| 656 | + data = self.data_image['0008']['2110'] | |
| 657 | + if (data): | |
| 658 | + return data | |
| 741 | 659 | return "" |
| 742 | 660 | |
| 743 | 661 | |
| ... | ... | @@ -749,14 +667,11 @@ class Parser(): |
| 749 | 667 | |
| 750 | 668 | DICOM standard tag (0x0008, 0x0090) was used. |
| 751 | 669 | """ |
| 752 | - tag = gdcm.Tag(0x0008,0x0090) | |
| 753 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 754 | - if ds.FindDataElement(tag): | |
| 755 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 756 | - if data == "None": | |
| 757 | - return "" | |
| 758 | - if (data): | |
| 759 | - return data | |
| 670 | + data = self.data_image['0008']['0090'] | |
| 671 | + if data == "None": | |
| 672 | + return "" | |
| 673 | + if (data): | |
| 674 | + return data | |
| 760 | 675 | return "" |
| 761 | 676 | |
| 762 | 677 | |
| ... | ... | @@ -767,12 +682,9 @@ class Parser(): |
| 767 | 682 | |
| 768 | 683 | DICOM standard tag (0x0008, 0x0092) was used. |
| 769 | 684 | """ |
| 770 | - tag = gdcm.Tag(0x0008, 0x0092) | |
| 771 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 772 | - if ds.FindDataElement(tag): | |
| 773 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 774 | - if (data): | |
| 775 | - return data | |
| 685 | + data = self.data_image['0008']['0092'] | |
| 686 | + if (data): | |
| 687 | + return data | |
| 776 | 688 | return "" |
| 777 | 689 | |
| 778 | 690 | def GetPhysicianeReferringTelephone(self): |
| ... | ... | @@ -782,12 +694,9 @@ class Parser(): |
| 782 | 694 | |
| 783 | 695 | DICOM standard tag (0x0008, 0x0094) was used. |
| 784 | 696 | """ |
| 785 | - tag = gdcm.Tag(0x0008, 0x0094) | |
| 786 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 787 | - if ds.FindDataElement(tag): | |
| 788 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 789 | - if (data): | |
| 790 | - return data | |
| 697 | + data = self.data_image['0008']['0094'] | |
| 698 | + if (data): | |
| 699 | + return data | |
| 791 | 700 | return "" |
| 792 | 701 | |
| 793 | 702 | def GetProtocolName(self): |
| ... | ... | @@ -797,12 +706,9 @@ class Parser(): |
| 797 | 706 | |
| 798 | 707 | DICOM standard tag (0x0018, 0x1030) was used. |
| 799 | 708 | """ |
| 800 | - tag = gdcm.Tag(0x0018, 0x1030) | |
| 801 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 802 | - if ds.FindDataElement(tag): | |
| 803 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 804 | - if (data): | |
| 805 | - return data | |
| 709 | + data = self.data_image['0018']['1030'] | |
| 710 | + if (data): | |
| 711 | + return data | |
| 806 | 712 | return None |
| 807 | 713 | |
| 808 | 714 | def GetImageType(self): |
| ... | ... | @@ -814,15 +720,12 @@ class Parser(): |
| 814 | 720 | |
| 815 | 721 | Critical DICOM tag (0x0008, 0x0008). Cannot be editted. |
| 816 | 722 | """ |
| 817 | - tag = gdcm.Tag(0x0008, 0x0008) | |
| 818 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 819 | - if ds.FindDataElement(tag): | |
| 820 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 821 | - if (data): | |
| 822 | - try: | |
| 823 | - return data.split('\\') | |
| 824 | - except(IndexError): | |
| 825 | - return [] | |
| 723 | + data = self.data_image['0008']['0008'] | |
| 724 | + if (data): | |
| 725 | + try: | |
| 726 | + return data.split('\\') | |
| 727 | + except(IndexError): | |
| 728 | + return [] | |
| 826 | 729 | return [] |
| 827 | 730 | |
| 828 | 731 | def GetSOPClassUID(self): |
| ... | ... | @@ -833,12 +736,9 @@ class Parser(): |
| 833 | 736 | |
| 834 | 737 | Critical DICOM tag (0x0008, 0x0016). Cannot be edited. |
| 835 | 738 | """ |
| 836 | - tag = gdcm.Tag(0x0008, 0x0016) | |
| 837 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 838 | - if ds.FindDataElement(tag): | |
| 839 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 840 | - if (data): | |
| 841 | - return data | |
| 739 | + data = self.data_image['0008']['0016'] | |
| 740 | + if (data): | |
| 741 | + return data | |
| 842 | 742 | return "" |
| 843 | 743 | |
| 844 | 744 | def GetSOPInstanceUID(self): |
| ... | ... | @@ -849,12 +749,9 @@ class Parser(): |
| 849 | 749 | |
| 850 | 750 | Critical DICOM tag (0x0008, 0x0018). Cannot be edited. |
| 851 | 751 | """ |
| 852 | - tag = gdcm.Tag(0x0008, 0x0018) | |
| 853 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 854 | - if ds.FindDataElement(tag): | |
| 855 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 856 | - if (data): | |
| 857 | - return data | |
| 752 | + data = self.data_image['0008']['0018'] | |
| 753 | + if (data): | |
| 754 | + return data | |
| 858 | 755 | return "" |
| 859 | 756 | |
| 860 | 757 | def GetSeriesDescription(self): |
| ... | ... | @@ -863,12 +760,9 @@ class Parser(): |
| 863 | 760 | |
| 864 | 761 | DICOM tag (0x0008, 0x1030). Cannot be edited. |
| 865 | 762 | """ |
| 866 | - tag = gdcm.Tag(0x0008, 0x1030) | |
| 867 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 868 | - if ds.FindDataElement(tag): | |
| 869 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 870 | - if (data): | |
| 871 | - return data | |
| 763 | + data = self.data_image['0008']['1030'] | |
| 764 | + if (data): | |
| 765 | + return data | |
| 872 | 766 | return "" |
| 873 | 767 | |
| 874 | 768 | def GetStudyInstanceUID(self): |
| ... | ... | @@ -879,12 +773,9 @@ class Parser(): |
| 879 | 773 | |
| 880 | 774 | Critical DICOM Tag (0x0020,0x000D). Cannot be edited. |
| 881 | 775 | """ |
| 882 | - tag = gdcm.Tag(0x0020,0x000D) | |
| 883 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 884 | - if ds.FindDataElement(tag): | |
| 885 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 886 | - if (data): | |
| 887 | - return data | |
| 776 | + data = self.data_image['0020']['000D'] | |
| 777 | + if (data): | |
| 778 | + return data | |
| 888 | 779 | return "" |
| 889 | 780 | |
| 890 | 781 | def GetImagePatientOrientation(self): |
| ... | ... | @@ -898,12 +789,9 @@ class Parser(): |
| 898 | 789 | |
| 899 | 790 | Critical DICOM tag (0x0020,0x0037). Cannot be edited. |
| 900 | 791 | """ |
| 901 | - tag = gdcm.Tag(0x0020,0x0037) | |
| 902 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 903 | - if ds.FindDataElement(tag): | |
| 904 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 905 | - if (data): | |
| 906 | - return [float(value) for value in data.split('\\')] | |
| 792 | + data = self.data_image['0020']['0037'] | |
| 793 | + if (data): | |
| 794 | + return [float(value) for value in data.split('\\')] | |
| 907 | 795 | return [1.0, 0.0, 0.0, 0.0, 1.0, 0.0] |
| 908 | 796 | |
| 909 | 797 | def GetImageColumnOrientation(self): |
| ... | ... | @@ -915,12 +803,9 @@ class Parser(): |
| 915 | 803 | |
| 916 | 804 | Critical DICOM tag (0x0020,0x0037). Cannot be edited. |
| 917 | 805 | """ |
| 918 | - tag = gdcm.Tag(0x0020,0x0037) | |
| 919 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 920 | - if ds.FindDataElement(tag): | |
| 921 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 922 | - if (data): | |
| 923 | - return [float(value) for value in data.split('\\')[3:6]] | |
| 806 | + data = self.data_image['0020']['0037'] | |
| 807 | + if (data): | |
| 808 | + return [float(value) for value in data.split('\\')[3:6]] | |
| 924 | 809 | return [0.0, 1.0, 0.0] |
| 925 | 810 | |
| 926 | 811 | def GetImageRowOrientation(self): |
| ... | ... | @@ -932,12 +817,9 @@ class Parser(): |
| 932 | 817 | |
| 933 | 818 | Critical DICOM tag (0x0020,0x0037). Cannot be edited. |
| 934 | 819 | """ |
| 935 | - tag = gdcm.Tag(0x0020,0x0037) | |
| 936 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 937 | - if ds.FindDataElement(tag): | |
| 938 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 939 | - if (data): | |
| 940 | - return [float(value) for value in data.split('\\')[0:3]] | |
| 820 | + data = self.data_image['0020']['0037'] | |
| 821 | + if (data): | |
| 822 | + return [float(value) for value in data.split('\\')[0:3]] | |
| 941 | 823 | return [1.0, 0.0, 0.0] |
| 942 | 824 | |
| 943 | 825 | def GetFrameReferenceUID(self): |
| ... | ... | @@ -947,12 +829,9 @@ class Parser(): |
| 947 | 829 | |
| 948 | 830 | Critical DICOM tag (0x0020,0x0052). Cannot be edited. |
| 949 | 831 | """ |
| 950 | - tag = gdcm.Tag(0x0020,0x0052) | |
| 951 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 952 | - if ds.FindDataElement(tag): | |
| 953 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 954 | - if (data): | |
| 955 | - return data | |
| 832 | + data = self.data_image['0020']['0052'] | |
| 833 | + if (data): | |
| 834 | + return data | |
| 956 | 835 | return "" |
| 957 | 836 | |
| 958 | 837 | def GetImageSamplesPerPixel(self): |
| ... | ... | @@ -1026,12 +905,12 @@ class Parser(): |
| 1026 | 905 | |
| 1027 | 906 | DICOM standard tag (0x0018, 0x1030) was used. |
| 1028 | 907 | """ |
| 1029 | - tag = gdcm.Tag(0x0018, 0x1030) | |
| 1030 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1031 | - if ds.FindDataElement(tag): | |
| 1032 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 908 | + try: | |
| 909 | + data = self.data_image['0018']['1030'] | |
| 1033 | 910 | if (data): |
| 1034 | 911 | return data |
| 912 | + except(KeyError): | |
| 913 | + return "" | |
| 1035 | 914 | return "" |
| 1036 | 915 | |
| 1037 | 916 | def GetAcquisionSequence(self): |
| ... | ... | @@ -1050,12 +929,9 @@ class Parser(): |
| 1050 | 929 | |
| 1051 | 930 | Critical DICOM tag (0x0018, 0x0020). Cannot be edited. |
| 1052 | 931 | """ |
| 1053 | - tag = gdcm.Tag(0x0018, 0x0020) | |
| 1054 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1055 | - if ds.FindDataElement(tag): | |
| 1056 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1057 | - if (data): | |
| 1058 | - return data | |
| 932 | + data = self.data_image['0018']['0020'] | |
| 933 | + if (data): | |
| 934 | + return data | |
| 1059 | 935 | return "" |
| 1060 | 936 | |
| 1061 | 937 | def GetInstitutionName(self): |
| ... | ... | @@ -1065,14 +941,10 @@ class Parser(): |
| 1065 | 941 | |
| 1066 | 942 | DICOM standard tag (0x0008, 0x0080) was used. |
| 1067 | 943 | """ |
| 1068 | - tag = gdcm.Tag(0x0008, 0x0080) | |
| 1069 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1070 | - if ds.FindDataElement(tag): | |
| 1071 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1072 | - if (data): | |
| 944 | + data = self.data_image['0008']['0080'] | |
| 945 | + if (data): | |
| 1073 | 946 | return data |
| 1074 | - | |
| 1075 | - 0x0008, 0x0081 | |
| 947 | + return "" | |
| 1076 | 948 | |
| 1077 | 949 | def GetInstitutionAddress(self): |
| 1078 | 950 | """ |
| ... | ... | @@ -1083,12 +955,9 @@ class Parser(): |
| 1083 | 955 | |
| 1084 | 956 | DICOM standard tag (0x0008, 0x0081) was used. |
| 1085 | 957 | """ |
| 1086 | - tag = gdcm.Tag(0x0008, 0x0081) | |
| 1087 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1088 | - if ds.FindDataElement(tag): | |
| 1089 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1090 | - if (data): | |
| 1091 | - return data | |
| 958 | + data = self.data_image['0008']['0081'] | |
| 959 | + if (data): | |
| 960 | + return data | |
| 1092 | 961 | return "" |
| 1093 | 962 | |
| 1094 | 963 | def GetStudyInstanceUID(self): |
| ... | ... | @@ -1099,12 +968,9 @@ class Parser(): |
| 1099 | 968 | |
| 1100 | 969 | Critical DICOM tag (0x0020, 0x000D). Cannot be edited. |
| 1101 | 970 | """ |
| 1102 | - tag = gdcm.Tag(0x0020, 0x000D) | |
| 1103 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1104 | - if ds.FindDataElement(tag): | |
| 1105 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1106 | - if (data): | |
| 1107 | - return data | |
| 971 | + data = self.data_image['0020']['000D'] | |
| 972 | + if (data): | |
| 973 | + return data | |
| 1108 | 974 | return "" |
| 1109 | 975 | |
| 1110 | 976 | def GetPatientOccupation(self): |
| ... | ... | @@ -1114,12 +980,9 @@ class Parser(): |
| 1114 | 980 | |
| 1115 | 981 | DICOM standard tag (0x0010,0x2180) was used. |
| 1116 | 982 | """ |
| 1117 | - tag = gdcm.Tag(0x0010, 0x2180) | |
| 1118 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1119 | - if ds.FindDataElement(tag): | |
| 1120 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1121 | - if (data): | |
| 1122 | - return data | |
| 983 | + data = self.data_image['0010']['2180'] | |
| 984 | + if (data): | |
| 985 | + return data | |
| 1123 | 986 | return "" |
| 1124 | 987 | |
| 1125 | 988 | def _GetPixelRepresentation(self): |
| ... | ... | @@ -1147,13 +1010,13 @@ class Parser(): |
| 1147 | 1010 | |
| 1148 | 1011 | DICOM standard tag (0x0028, 0x0100) was used. |
| 1149 | 1012 | """ |
| 1150 | - tag = gdcm.Tag(0x0028, 0x0100) | |
| 1151 | - sf = gdcm.StringFilter() | |
| 1152 | - sf.SetFile(self.gdcm_reader.GetFile()) | |
| 1153 | - res = sf.ToStringPair(tag) | |
| 1154 | - | |
| 1155 | - if (res[1]): | |
| 1156 | - return int(res[1]) | |
| 1013 | + #tag = gdcm.Tag(0x0028, 0x0100) | |
| 1014 | + #sf = gdcm.StringFilter() | |
| 1015 | + #sf.SetFile(self.gdcm_reader.GetFile()) | |
| 1016 | + #res = sf.ToStringPair(tag) | |
| 1017 | + data = self.data_image['0028']['0100'] | |
| 1018 | + if (data): | |
| 1019 | + return int(data) | |
| 1157 | 1020 | return "" |
| 1158 | 1021 | |
| 1159 | 1022 | |
| ... | ... | @@ -1166,12 +1029,9 @@ class Parser(): |
| 1166 | 1029 | DICOM standard tag (0x0010,0x0030) was used. |
| 1167 | 1030 | """ |
| 1168 | 1031 | # TODO: internationalize data |
| 1169 | - tag = gdcm.Tag(0x0010, 0x0030) | |
| 1170 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1171 | - if ds.FindDataElement(tag): | |
| 1172 | - data = ds.GetDataElement(tag).GetValue() | |
| 1173 | - if (data) and (data != 'None'): | |
| 1174 | - return self.__format_date(str(data)) | |
| 1032 | + data = self.data_image['0010']['0030'] | |
| 1033 | + if (data) and (data != 'None'): | |
| 1034 | + return self.__format_date(str(data)) | |
| 1175 | 1035 | return "" |
| 1176 | 1036 | |
| 1177 | 1037 | |
| ... | ... | @@ -1182,12 +1042,9 @@ class Parser(): |
| 1182 | 1042 | |
| 1183 | 1043 | DICOM standard tag (0x0020,0x0010) was used. |
| 1184 | 1044 | """ |
| 1185 | - tag = gdcm.Tag(0x0020, 0x0010) | |
| 1186 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1187 | - if ds.FindDataElement(tag): | |
| 1188 | - data = ds.GetDataElement(tag).GetValue() | |
| 1189 | - if (data): | |
| 1190 | - return str(data) | |
| 1045 | + data = self.data_image['0020']['0010'] | |
| 1046 | + if (data): | |
| 1047 | + return str(data) | |
| 1191 | 1048 | return "" |
| 1192 | 1049 | |
| 1193 | 1050 | def GetAcquisitionGantryTilt(self): |
| ... | ... | @@ -1198,14 +1055,9 @@ class Parser(): |
| 1198 | 1055 | |
| 1199 | 1056 | DICOM standard tag (0x0018,0x1120) was used. |
| 1200 | 1057 | """ |
| 1201 | - tag = gdcm.Tag(0x0018, 0x1120) | |
| 1202 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1203 | - if ds.FindDataElement(tag): | |
| 1204 | - data = ds.GetDataElement(tag).GetValue() | |
| 1205 | - | |
| 1206 | - if (data): | |
| 1207 | - return float(str(data)) | |
| 1208 | - | |
| 1058 | + data = self.data_image['0018']['1120'] | |
| 1059 | + if (data): | |
| 1060 | + return float(str(data)) | |
| 1209 | 1061 | return 0.0 |
| 1210 | 1062 | |
| 1211 | 1063 | def GetPatientGender(self): |
| ... | ... | @@ -1218,13 +1070,9 @@ class Parser(): |
| 1218 | 1070 | |
| 1219 | 1071 | DICOM standard tag (0x0010,0x0040) was used. |
| 1220 | 1072 | """ |
| 1221 | - tag = gdcm.Tag(0x0010, 0x0040) | |
| 1222 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1223 | - if ds.FindDataElement(tag): | |
| 1224 | - data = ds.GetDataElement(tag).GetValue() | |
| 1225 | - | |
| 1226 | - if (data): | |
| 1227 | - return str(data) | |
| 1073 | + data = self.data_image['0010']['0040'] | |
| 1074 | + if (data): | |
| 1075 | + return str(data) | |
| 1228 | 1076 | return "" |
| 1229 | 1077 | |
| 1230 | 1078 | def GetPatientAge(self): |
| ... | ... | @@ -1235,17 +1083,13 @@ class Parser(): |
| 1235 | 1083 | |
| 1236 | 1084 | DICOM standard tag (0x0010, 0x1010) was used. |
| 1237 | 1085 | """ |
| 1238 | - tag = gdcm.Tag(0x0010, 0x1010) | |
| 1239 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1240 | - if ds.FindDataElement(tag): | |
| 1241 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1242 | - | |
| 1243 | - if (data): | |
| 1244 | - age = (data.split('Y')[0]) | |
| 1245 | - try: | |
| 1246 | - return int(age) | |
| 1247 | - except ValueError: | |
| 1248 | - return age | |
| 1086 | + data = self.data_image['0010']['0010'] | |
| 1087 | + if (data): | |
| 1088 | + age = (data.split('Y')[0]) | |
| 1089 | + try: | |
| 1090 | + return int(age) | |
| 1091 | + except ValueError: | |
| 1092 | + return age | |
| 1249 | 1093 | return "" |
| 1250 | 1094 | |
| 1251 | 1095 | def GetPatientName(self): |
| ... | ... | @@ -1255,16 +1099,12 @@ class Parser(): |
| 1255 | 1099 | |
| 1256 | 1100 | DICOM standard tag (0x0010,0x0010) was used. |
| 1257 | 1101 | """ |
| 1258 | - tag = gdcm.Tag(0x0010, 0x0010) | |
| 1259 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1260 | - if ds.FindDataElement(tag): | |
| 1261 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1262 | - | |
| 1263 | - if (data): | |
| 1264 | - name = data.strip() | |
| 1265 | - encoding = self.GetEncoding() | |
| 1266 | - # Returns a unicode decoded in the own dicom encoding | |
| 1267 | - return name.decode(encoding) | |
| 1102 | + data = self.data_image['0010']['0010'] | |
| 1103 | + if (data): | |
| 1104 | + name = data.strip() | |
| 1105 | + encoding = self.GetEncoding() | |
| 1106 | + # Returns a unicode decoded in the own dicom encoding | |
| 1107 | + return name.decode(encoding) | |
| 1268 | 1108 | return "" |
| 1269 | 1109 | |
| 1270 | 1110 | def GetPatientID(self): |
| ... | ... | @@ -1275,15 +1115,11 @@ class Parser(): |
| 1275 | 1115 | |
| 1276 | 1116 | DICOM standard tag (0x0010,0x0020) was used. |
| 1277 | 1117 | """ |
| 1278 | - tag = gdcm.Tag(0x0010, 0x0020) | |
| 1279 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1280 | - if ds.FindDataElement(tag): | |
| 1281 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1282 | - | |
| 1283 | - if (data): | |
| 1284 | - encoding = self.GetEncoding() | |
| 1285 | - # Returns a unicode decoded in the own dicom encoding | |
| 1286 | - return data.decode(encoding) | |
| 1118 | + data = self.data_image['0010']['0020'] | |
| 1119 | + if (data): | |
| 1120 | + encoding = self.GetEncoding() | |
| 1121 | + # Returns a unicode decoded in the own dicom encoding | |
| 1122 | + return data.decode(encoding) | |
| 1287 | 1123 | return "" |
| 1288 | 1124 | |
| 1289 | 1125 | |
| ... | ... | @@ -1295,13 +1131,9 @@ class Parser(): |
| 1295 | 1131 | |
| 1296 | 1132 | DICOM standard tag (0x0018,0x1151) was used. |
| 1297 | 1133 | """ |
| 1298 | - tag = gdcm.Tag(0x0018, 0x1151) | |
| 1299 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1300 | - if ds.FindDataElement(tag): | |
| 1301 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1302 | - | |
| 1303 | - if (data): | |
| 1304 | - return data | |
| 1134 | + data = self.data_image['0018']['1151'] | |
| 1135 | + if (data): | |
| 1136 | + return data | |
| 1305 | 1137 | return "" |
| 1306 | 1138 | |
| 1307 | 1139 | def GetExposureTime(self): |
| ... | ... | @@ -1312,13 +1144,9 @@ class Parser(): |
| 1312 | 1144 | |
| 1313 | 1145 | DICOM standard tag (0x0018, 0x1152) was used. |
| 1314 | 1146 | """ |
| 1315 | - tag = gdcm.Tag(0x0018, 0x1152) | |
| 1316 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1317 | - if ds.FindDataElement(tag): | |
| 1318 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1319 | - | |
| 1320 | - if (data): | |
| 1321 | - return float(data) | |
| 1147 | + data = self.data_image['0018']['1152'] | |
| 1148 | + if (data): | |
| 1149 | + return float(data) | |
| 1322 | 1150 | return "" |
| 1323 | 1151 | |
| 1324 | 1152 | def GetEquipmentKVP(self): |
| ... | ... | @@ -1329,13 +1157,9 @@ class Parser(): |
| 1329 | 1157 | |
| 1330 | 1158 | DICOM standard tag (0x0018,0x0060) was used. |
| 1331 | 1159 | """ |
| 1332 | - tag = gdcm.Tag(0x0018, 0x0060) | |
| 1333 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1334 | - if ds.FindDataElement(tag): | |
| 1335 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1336 | - | |
| 1337 | - if (data): | |
| 1338 | - return float(data) | |
| 1160 | + data = self.data_image['0018']['0060'] | |
| 1161 | + if (data): | |
| 1162 | + return float(data) | |
| 1339 | 1163 | return "" |
| 1340 | 1164 | |
| 1341 | 1165 | def GetImageThickness(self): |
| ... | ... | @@ -1346,12 +1170,9 @@ class Parser(): |
| 1346 | 1170 | |
| 1347 | 1171 | DICOM standard tag (0x0018,0x0050) was used. |
| 1348 | 1172 | """ |
| 1349 | - tag = gdcm.Tag(0x0018, 0x0050) | |
| 1350 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1351 | - if ds.FindDataElement(tag): | |
| 1352 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1353 | - if (data): | |
| 1354 | - return float(data) | |
| 1173 | + data = self.data_image['0018']['0050'] | |
| 1174 | + if (data): | |
| 1175 | + return float(data) | |
| 1355 | 1176 | return 0 |
| 1356 | 1177 | |
| 1357 | 1178 | def GetImageConvolutionKernel(self): |
| ... | ... | @@ -1364,13 +1185,9 @@ class Parser(): |
| 1364 | 1185 | |
| 1365 | 1186 | DICOM standard tag (0x0018,0x1210) was used. |
| 1366 | 1187 | """ |
| 1367 | - tag = gdcm.Tag(0x0018, 0x1210) | |
| 1368 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1369 | - if ds.FindDataElement(tag): | |
| 1370 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1371 | - | |
| 1372 | - if (data): | |
| 1373 | - return data | |
| 1188 | + data = self.data_image['0018']['1210'] | |
| 1189 | + if (data): | |
| 1190 | + return data | |
| 1374 | 1191 | return "" |
| 1375 | 1192 | |
| 1376 | 1193 | def GetEquipmentInstitutionName(self): |
| ... | ... | @@ -1381,13 +1198,9 @@ class Parser(): |
| 1381 | 1198 | |
| 1382 | 1199 | DICOM standard tag (0x0008,0x0080) was used. |
| 1383 | 1200 | """ |
| 1384 | - tag = gdcm.Tag(0x0008, 0x0080) | |
| 1385 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1386 | - if ds.FindDataElement(tag): | |
| 1387 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1388 | - | |
| 1389 | - if (data): | |
| 1390 | - return data | |
| 1201 | + data = self.data_image['0008']['0080'] | |
| 1202 | + if (data): | |
| 1203 | + return data | |
| 1391 | 1204 | return "" |
| 1392 | 1205 | |
| 1393 | 1206 | def GetStationName(self): |
| ... | ... | @@ -1398,13 +1211,9 @@ class Parser(): |
| 1398 | 1211 | |
| 1399 | 1212 | DICOM standard tag (0x0008, 0x1010) was used. |
| 1400 | 1213 | """ |
| 1401 | - tag = gdcm.Tag(0x0008, 0x1010) | |
| 1402 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1403 | - if ds.FindDataElement(tag): | |
| 1404 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1405 | - | |
| 1406 | - if (data): | |
| 1407 | - return data | |
| 1214 | + data = self.data_image['0008']['1010'] | |
| 1215 | + if (data): | |
| 1216 | + return data | |
| 1408 | 1217 | return "" |
| 1409 | 1218 | |
| 1410 | 1219 | def GetManufacturerModelName(self): |
| ... | ... | @@ -1415,13 +1224,9 @@ class Parser(): |
| 1415 | 1224 | |
| 1416 | 1225 | DICOM standard tag (0x0008,0x1090) was used. |
| 1417 | 1226 | """ |
| 1418 | - tag = gdcm.Tag(0x0008, 0x1090) | |
| 1419 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1420 | - if ds.FindDataElement(tag): | |
| 1421 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1422 | - | |
| 1423 | - if (data): | |
| 1424 | - return data | |
| 1227 | + data = self.data_image['0008']['1090'] | |
| 1228 | + if (data): | |
| 1229 | + return data | |
| 1425 | 1230 | return "" |
| 1426 | 1231 | |
| 1427 | 1232 | def GetEquipmentManufacturer(self): |
| ... | ... | @@ -1431,13 +1236,9 @@ class Parser(): |
| 1431 | 1236 | |
| 1432 | 1237 | DICOM standard tag (0x0008, 0x1010) was used. |
| 1433 | 1238 | """ |
| 1434 | - tag = gdcm.Tag(0x0008, 0x1010) | |
| 1435 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1436 | - if ds.FindDataElement(tag): | |
| 1437 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1438 | - | |
| 1439 | - if (data): | |
| 1440 | - return data | |
| 1239 | + data = self.data_image['0008']['1010'] | |
| 1240 | + if (data): | |
| 1241 | + return data | |
| 1441 | 1242 | return "" |
| 1442 | 1243 | |
| 1443 | 1244 | def GetAcquisitionModality(self): |
| ... | ... | @@ -1449,13 +1250,9 @@ class Parser(): |
| 1449 | 1250 | |
| 1450 | 1251 | DICOM standard tag (0x0008,0x0060) was used. |
| 1451 | 1252 | """ |
| 1452 | - tag = gdcm.Tag(0x0008, 0x0060) | |
| 1453 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1454 | - if ds.FindDataElement(tag): | |
| 1455 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1456 | - | |
| 1457 | - if (data): | |
| 1458 | - return data | |
| 1253 | + data = self.data_image['0008']['0060'] | |
| 1254 | + if (data): | |
| 1255 | + return data | |
| 1459 | 1256 | return "" |
| 1460 | 1257 | |
| 1461 | 1258 | |
| ... | ... | @@ -1466,13 +1263,13 @@ class Parser(): |
| 1466 | 1263 | |
| 1467 | 1264 | DICOM standard tag (0x0020,0x0013) was used. |
| 1468 | 1265 | """ |
| 1469 | - tag = gdcm.Tag(0x0020, 0x0013) | |
| 1470 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1471 | - if ds.FindDataElement(tag): | |
| 1472 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1266 | + try: | |
| 1267 | + data = self.data_image['0020']['0013'] | |
| 1268 | + except(KeyError): | |
| 1269 | + return "" | |
| 1473 | 1270 | |
| 1474 | - if (data): | |
| 1475 | - return int(data) | |
| 1271 | + if (data): | |
| 1272 | + return int(data) | |
| 1476 | 1273 | return "" |
| 1477 | 1274 | |
| 1478 | 1275 | def GetStudyDescription(self): |
| ... | ... | @@ -1482,15 +1279,13 @@ class Parser(): |
| 1482 | 1279 | |
| 1483 | 1280 | DICOM standard tag (0x0008,0x1030) was used. |
| 1484 | 1281 | """ |
| 1485 | - tag = gdcm.Tag(0x0008, 0x1030) | |
| 1486 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1487 | - if ds.FindDataElement(tag): | |
| 1488 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1489 | - | |
| 1282 | + try: | |
| 1283 | + data = self.data_image['0008']['1030'] | |
| 1490 | 1284 | if (data): |
| 1491 | 1285 | encoding = self.GetEncoding() |
| 1492 | 1286 | return data.decode(encoding) |
| 1493 | - return "" | |
| 1287 | + except(KeyError): | |
| 1288 | + return "" | |
| 1494 | 1289 | |
| 1495 | 1290 | def GetStudyAdmittingDiagnosis(self): |
| 1496 | 1291 | """ |
| ... | ... | @@ -1515,27 +1310,27 @@ class Parser(): |
| 1515 | 1310 | Return a string with a description of the series. |
| 1516 | 1311 | DICOM standard tag (0x0008, 0x103E) was used. |
| 1517 | 1312 | """ |
| 1518 | - tag = gdcm.Tag(0x0008, 0x103E) | |
| 1519 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1520 | - if ds.FindDataElement(tag): | |
| 1521 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1313 | + try: | |
| 1314 | + data = self.data_image['0008']['103E'] | |
| 1522 | 1315 | if data == "None": |
| 1523 | 1316 | return _("unnamed") |
| 1524 | 1317 | if (data): |
| 1525 | 1318 | return data |
| 1526 | - return _("unnamed") | |
| 1319 | + except(KeyError): | |
| 1320 | + return _("unnamed") | |
| 1527 | 1321 | |
| 1528 | 1322 | def GetImageTime(self): |
| 1529 | 1323 | """ |
| 1530 | 1324 | Return the image time. |
| 1531 | 1325 | DICOM standard tag (0x0008,0x0033) was used. |
| 1532 | 1326 | """ |
| 1533 | - tag = gdcm.Tag(0x0008, 0x0033) | |
| 1534 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1535 | - if ds.FindDataElement(tag): | |
| 1536 | - date = str(ds.GetDataElement(tag).GetValue()) | |
| 1537 | - if (date) and (date != 'None'): | |
| 1538 | - return self.__format_time(date) | |
| 1327 | + try: | |
| 1328 | + data = self.data_image['0008']['0033'] | |
| 1329 | + except(KeyError): | |
| 1330 | + return "" | |
| 1331 | + | |
| 1332 | + if (data) and (data != 'None'): | |
| 1333 | + return self.__format_time(data) | |
| 1539 | 1334 | return "" |
| 1540 | 1335 | |
| 1541 | 1336 | def GetAcquisitionTime(self): |
| ... | ... | @@ -1543,12 +1338,9 @@ class Parser(): |
| 1543 | 1338 | Return the acquisition time. |
| 1544 | 1339 | DICOM standard tag (0x0008,0x032) was used. |
| 1545 | 1340 | """ |
| 1546 | - tag = gdcm.Tag(0x0008, 0x0032) | |
| 1547 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1548 | - if ds.FindDataElement(tag): | |
| 1549 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1550 | - if (data): | |
| 1551 | - return self.__format_time(data) | |
| 1341 | + data = self.data_image['0008']['0032'] | |
| 1342 | + if (data): | |
| 1343 | + return self.__format_time(data) | |
| 1552 | 1344 | return "" |
| 1553 | 1345 | |
| 1554 | 1346 | def GetSerieNumber(self): |
| ... | ... | @@ -1556,12 +1348,9 @@ class Parser(): |
| 1556 | 1348 | Return the serie number |
| 1557 | 1349 | DICOM standard tag (0x0020, 0x0011) was used. |
| 1558 | 1350 | """ |
| 1559 | - tag = gdcm.Tag(0x0020, 0x0011) | |
| 1560 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1561 | - if ds.FindDataElement(tag): | |
| 1562 | - data = str(ds.GetDataElement(tag).GetValue()) | |
| 1563 | - if (data): | |
| 1564 | - return data | |
| 1351 | + data = self.data_image['0020']['0011'] | |
| 1352 | + if (data): | |
| 1353 | + return data | |
| 1565 | 1354 | return "" |
| 1566 | 1355 | |
| 1567 | 1356 | def GetEncoding(self): |
| ... | ... | @@ -1569,18 +1358,18 @@ class Parser(): |
| 1569 | 1358 | Return the dicom encoding |
| 1570 | 1359 | DICOM standard tag (0x0008, 0x0005) was used. |
| 1571 | 1360 | """ |
| 1572 | - tag = gdcm.Tag(0x0008, 0x0005) | |
| 1573 | - ds = self.gdcm_reader.GetFile().GetDataSet() | |
| 1574 | - if ds.FindDataElement(tag): | |
| 1575 | - encoding = str(ds.GetDataElement(tag).GetValue()) | |
| 1361 | + try: | |
| 1362 | + encoding = self.data_image['0008']['0005'] | |
| 1363 | + except(KeyError): | |
| 1364 | + return 'ISO_IR_100' | |
| 1576 | 1365 | |
| 1577 | - if encoding != None and encoding != "None": | |
| 1366 | + if encoding != None and encoding != "None": | |
| 1578 | 1367 | |
| 1579 | - #Problem with 0051 anonymized | |
| 1580 | - if (encoding.split(":"))[0] == "Loaded": | |
| 1581 | - return 'ISO_IR 100' | |
| 1582 | - else: | |
| 1583 | - return encoding | |
| 1368 | + #Problem with 0051 anonymized | |
| 1369 | + if (encoding.split(":"))[0] == "Loaded": | |
| 1370 | + return 'ISO_IR 100' | |
| 1371 | + else: | |
| 1372 | + return encoding | |
| 1584 | 1373 | return 'ISO_IR 100' |
| 1585 | 1374 | |
| 1586 | 1375 | |
| ... | ... | @@ -1924,7 +1713,7 @@ class Image(object): |
| 1924 | 1713 | self.time = parser.GetImageTime() |
| 1925 | 1714 | self.type = parser.GetImageType() |
| 1926 | 1715 | self.size = (parser.GetDimensionX(), parser.GetDimensionY()) |
| 1927 | - self.imagedata = parser.GetImageData() | |
| 1716 | + #self.imagedata = parser.GetImageData() | |
| 1928 | 1717 | self.bits_allocad = parser._GetBitsAllocated() |
| 1929 | 1718 | |
| 1930 | 1719 | if (parser.GetImageThickness()): | ... | ... |
invesalius/reader/dicom_grouper.py
invesalius/reader/dicom_reader.py
| ... | ... | @@ -31,6 +31,12 @@ import dicom |
| 31 | 31 | import dicom_grouper |
| 32 | 32 | import session |
| 33 | 33 | |
| 34 | +import glob | |
| 35 | +import utils | |
| 36 | + | |
| 37 | + | |
| 38 | +import plistlib | |
| 39 | + | |
| 34 | 40 | def ReadDicomGroup(dir_): |
| 35 | 41 | |
| 36 | 42 | patient_group = GetDicomGroups(dir_) |
| ... | ... | @@ -73,6 +79,7 @@ def SortFiles(filelist, dicom): |
| 73 | 79 | |
| 74 | 80 | return filelist |
| 75 | 81 | |
| 82 | +""" | |
| 76 | 83 | class LoadDicom(threading.Thread): |
| 77 | 84 | def __init__(self, grouper, q, l): |
| 78 | 85 | threading.Thread.__init__(self) |
| ... | ... | @@ -87,66 +94,242 @@ class LoadDicom(threading.Thread): |
| 87 | 94 | if not filepath: |
| 88 | 95 | break |
| 89 | 96 | parser = dicom.Parser() |
| 90 | - if parser.SetFileName(filepath): | |
| 97 | + #if parser.SetFileName(filepath): | |
| 91 | 98 | dcm = dicom.Dicom() |
| 92 | 99 | self.l.acquire() |
| 93 | 100 | dcm.SetParser(parser) |
| 94 | 101 | grouper.AddFile(dcm) |
| 95 | 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 | |
| 110 | + | |
| 111 | + def Start(self): | |
| 112 | + images = self.dicom_dict['data'] | |
| 113 | + | |
| 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 | +""" | |
| 96 | 136 | |
| 97 | 137 | |
| 98 | -def yGetDicomGroups(directory, recursive=True, gui=True): | |
| 138 | +def GetImageOrientationLabel(filename): | |
| 139 | + """ | |
| 140 | + Return Label regarding the orientation of | |
| 141 | + an image. (AXIAL, SAGITTAL, CORONAL, | |
| 142 | + OBLIQUE or UNKNOWN) | |
| 143 | + """ | |
| 144 | + gdcm_reader = gdcm.ImageReader() | |
| 145 | + gdcm_reader.SetFileName(filename) | |
| 146 | + | |
| 147 | + img = gdcm_reader.GetImage() | |
| 148 | + direc_cosines = img.GetDirectionCosines() | |
| 149 | + orientation = gdcm.Orientation() | |
| 150 | + try: | |
| 151 | + type = orientation.GetType(tuple(direc_cosines)) | |
| 152 | + except TypeError: | |
| 153 | + type = orientation.GetType(direc_cosines) | |
| 154 | + label = orientation.GetLabel(type) | |
| 155 | + | |
| 156 | + if (label): | |
| 157 | + return label | |
| 158 | + else: | |
| 159 | + return "" | |
| 160 | + | |
| 161 | + | |
| 162 | +def GetDicomGroups(directory, recursive=True, gui=True): | |
| 99 | 163 | """ |
| 100 | 164 | Return all full paths to DICOM files inside given directory. |
| 101 | 165 | """ |
| 102 | 166 | nfiles = 0 |
| 103 | 167 | # Find total number of files |
| 104 | 168 | if recursive: |
| 105 | - for dirpath, dirnames, filenames in os.walk(directory): | |
| 106 | - nfiles += len(filenames) | |
| 107 | - else: | |
| 108 | - dirpath, dirnames, filenames = os.walk(directory) | |
| 109 | - nfiles = len(filenames) | |
| 110 | - | |
| 111 | - counter = 0 | |
| 112 | - grouper = dicom_grouper.DicomPatientGrouper() | |
| 113 | - q = Queue.Queue() | |
| 114 | - l = threading.Lock() | |
| 115 | - threads = [] | |
| 116 | - for i in xrange(cpu_count()): | |
| 117 | - t = LoadDicom(grouper, q, l) | |
| 118 | - t.start() | |
| 119 | - threads.append(t) | |
| 120 | - # Retrieve only DICOM files, splited into groups | |
| 121 | - if recursive: | |
| 122 | - for dirpath, dirnames, filenames in os.walk(directory): | |
| 123 | - for name in filenames: | |
| 124 | - filepath = os.path.join(dirpath, name) | |
| 125 | - counter += 1 | |
| 126 | - if gui: | |
| 127 | - yield (counter,nfiles) | |
| 128 | - q.put(filepath) | |
| 169 | + | |
| 170 | + folders = [f[0] for f in os.walk(directory)] | |
| 171 | + | |
| 172 | + tag_labels = {} | |
| 173 | + main_dict = {} | |
| 174 | + dict_file = {} | |
| 175 | + | |
| 176 | + for folder in folders: | |
| 177 | + files = glob.glob(os.path.join(folder, "*")) | |
| 178 | + | |
| 179 | + for filename in files: | |
| 180 | + | |
| 181 | + # Read file | |
| 182 | + reader = gdcm.Reader() | |
| 183 | + reader.SetFileName(filename) | |
| 184 | + | |
| 185 | + if (reader.Read()): | |
| 186 | + | |
| 187 | + file = reader.GetFile() | |
| 188 | + | |
| 189 | + # Retrieve data set | |
| 190 | + dataSet = file.GetDataSet() | |
| 191 | + | |
| 192 | + # Retrieve header | |
| 193 | + header = file.GetHeader() | |
| 194 | + stf = gdcm.StringFilter() | |
| 195 | + | |
| 196 | + field_dict = {} | |
| 197 | + data_dict = {} | |
| 198 | + | |
| 199 | + | |
| 200 | + tag = gdcm.Tag(0x0008, 0x0005) | |
| 201 | + ds = reader.GetFile().GetDataSet() | |
| 202 | + if ds.FindDataElement(tag): | |
| 203 | + encoding = str(ds.GetDataElement(tag).GetValue()) | |
| 204 | + if not(encoding != None and encoding != "None" and encoding != "Loaded"): | |
| 205 | + encoding = "ISO_IR 100" | |
| 206 | + else: | |
| 207 | + encoding = "ISO_IR_100" | |
| 208 | + # Iterate through the Header | |
| 209 | + iterator = header.GetDES().begin() | |
| 210 | + while (not iterator.equal(header.GetDES().end())): | |
| 211 | + dataElement = iterator.next() | |
| 212 | + stf.SetFile(file) | |
| 213 | + tag = dataElement.GetTag() | |
| 214 | + data = stf.ToStringPair(tag) | |
| 215 | + stag = tag.PrintAsPipeSeparatedString() | |
| 216 | + | |
| 217 | + group = stag.split("|")[0][1:] | |
| 218 | + field = stag.split("|")[1][:-1] | |
| 219 | + tag_labels[stag] = data[0] | |
| 220 | + | |
| 221 | + if not group in data_dict.keys(): | |
| 222 | + data_dict[group] = {} | |
| 223 | + | |
| 224 | + if not(utils.VerifyInvalidPListCharacter(data[1])): | |
| 225 | + data_dict[group][field] = data[1].decode(encoding) | |
| 226 | + else: | |
| 227 | + data_dict[group][field] = "Invalid Character" | |
| 228 | + | |
| 229 | + | |
| 230 | + # Iterate through the Data set | |
| 231 | + iterator = dataSet.GetDES().begin() | |
| 232 | + while (not iterator.equal(dataSet.GetDES().end())): | |
| 233 | + dataElement = iterator.next() | |
| 234 | + | |
| 235 | + stf.SetFile(file) | |
| 236 | + tag = dataElement.GetTag() | |
| 237 | + data = stf.ToStringPair(tag) | |
| 238 | + stag = tag.PrintAsPipeSeparatedString() | |
| 239 | + | |
| 240 | + group = stag.split("|")[0][1:] | |
| 241 | + field = stag.split("|")[1][:-1] | |
| 242 | + tag_labels[stag] = data[0] | |
| 243 | + | |
| 244 | + if not group in data_dict.keys(): | |
| 245 | + data_dict[group] = {} | |
| 246 | + | |
| 247 | + if not(utils.VerifyInvalidPListCharacter(data[1])): | |
| 248 | + data_dict[group][field] = data[1].decode(encoding) | |
| 249 | + else: | |
| 250 | + data_dict[group][field] = "Invalid Character" | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + # ---------- Refactory -------------------------------------- | |
| 255 | + data_dict['invesalius'] = {'orientation_label' : GetImageOrientationLabel(filename)} | |
| 256 | + | |
| 257 | + # ------------------------------------------------------------- | |
| 258 | + | |
| 259 | + dict_file[os.path.abspath(filename)] = data_dict | |
| 260 | + | |
| 261 | + main_dict = dict( | |
| 262 | + data = dict_file, | |
| 263 | + labels = tag_labels) | |
| 264 | + | |
| 265 | + #plistlib.writePlist(main_dict, ".//teste.plist") | |
| 266 | + | |
| 267 | + images = main_dict['data'] | |
| 268 | + grouper = dicom_grouper.DicomPatientGrouper() | |
| 269 | + | |
| 270 | + for x in images.keys(): | |
| 271 | + data_image = images[x] | |
| 272 | + | |
| 273 | + if (data_image['0002']['0002'] != "1.2.840.10008.1.3.10"): #DICOMDIR | |
| 274 | + parser = dicom.Parser() | |
| 275 | + parser.SetDataImage(data_image, x) | |
| 276 | + | |
| 277 | + dcm = dicom.Dicom() | |
| 278 | + dcm.SetParser(parser) | |
| 279 | + grouper.AddFile(dcm) | |
| 280 | + | |
| 281 | + grouper.Update() | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + return grouper.GetPatientsGroups() | |
| 286 | + #print "_____________________________________" | |
| 287 | + #print dirpath | |
| 288 | + #nfiles += len(filenames) | |
| 129 | 289 | else: |
| 130 | - dirpath, dirnames, filenames = os.walk(directory) | |
| 131 | - for name in filenames: | |
| 132 | - filepath = str(os.path.join(dirpath, name)) | |
| 133 | - counter += 1 | |
| 134 | - if gui: | |
| 135 | - yield (counter,nfiles) | |
| 136 | - q.put(filepath) | |
| 290 | + pass | |
| 291 | + #dirpath, dirnames, filenames = os.walk(directory) | |
| 292 | + #nfiles = len(filenames) | |
| 137 | 293 | |
| 138 | - for t in threads: | |
| 139 | - q.put(0) | |
| 294 | + #counter = 0 | |
| 295 | + #grouper = dicom_grouper.DicomPatientGrouper() | |
| 296 | + #q = Queue.Queue() | |
| 297 | + #l = threading.Lock() | |
| 298 | + #threads = [] | |
| 299 | + #for i in xrange(cpu_count()): | |
| 300 | + # t = LoadDicom(grouper, q, l) | |
| 301 | + # t.start() | |
| 302 | + # threads.append(t) | |
| 303 | + ## Retrieve only DICOM files, splited into groups | |
| 304 | + #if recursive: | |
| 305 | + # for dirpath, dirnames, filenames in os.walk(directory): | |
| 306 | + # for name in filenames: | |
| 307 | + # filepath = os.path.join(dirpath, name) | |
| 308 | + # counter += 1 | |
| 309 | + # if gui: | |
| 310 | + # yield (counter,nfiles) | |
| 311 | + # q.put(filepath) | |
| 312 | + #else: | |
| 313 | + # dirpath, dirnames, filenames = os.walk(directory) | |
| 314 | + # for name in filenames: | |
| 315 | + # filepath = str(os.path.join(dirpath, name)) | |
| 316 | + # counter += 1 | |
| 317 | + # if gui: | |
| 318 | + # yield (counter,nfiles) | |
| 319 | + # q.put(filepath) | |
| 140 | 320 | |
| 141 | - for t in threads: | |
| 142 | - t.join() | |
| 321 | + #for t in threads: | |
| 322 | + # q.put(0) | |
| 143 | 323 | |
| 144 | - #TODO: Is this commented update necessary? | |
| 145 | - #grouper.Update() | |
| 146 | - yield grouper.GetPatientsGroups() | |
| 324 | + #for t in threads: | |
| 325 | + # t.join() | |
| 147 | 326 | |
| 148 | -def GetDicomGroups(directory, recursive=True): | |
| 149 | - return yGetDicomGroups(directory, recursive, gui=False).next() | |
| 327 | + ##TODO: Is this commented update necessary? | |
| 328 | + ##grouper.Update() | |
| 329 | + #yield grouper.GetPatientsGroups() | |
| 330 | + | |
| 331 | +#def GetDicomGroups(directory, recursive=True): | |
| 332 | +# return yGetDicomGroups(directory, recursive, gui=False).next() | |
| 150 | 333 | |
| 151 | 334 | |
| 152 | 335 | class ProgressDicomReader: |
| ... | ... | @@ -158,7 +341,7 @@ class ProgressDicomReader: |
| 158 | 341 | self.stoped = True |
| 159 | 342 | |
| 160 | 343 | def SetWindowEvent(self, frame): |
| 161 | - self.frame = frame | |
| 344 | + self.frame = frame | |
| 162 | 345 | |
| 163 | 346 | def SetDirectoryPath(self, path,recursive=True): |
| 164 | 347 | self.running = True |
| ... | ... | @@ -193,4 +376,5 @@ class ProgressDicomReader: |
| 193 | 376 | #the load, ensure that dicomdialog is closed |
| 194 | 377 | if(self.stoped): |
| 195 | 378 | self.UpdateLoadFileProgress(None) |
| 196 | - self.stoped = False | |
| 379 | + self.stoped = False | |
| 380 | + | ... | ... |
invesalius/utils.py
| ... | ... | @@ -19,7 +19,7 @@ |
| 19 | 19 | import platform |
| 20 | 20 | import sigar |
| 21 | 21 | import sys |
| 22 | - | |
| 22 | +import re | |
| 23 | 23 | |
| 24 | 24 | def debug(error_str): |
| 25 | 25 | """ |
| ... | ... | @@ -79,6 +79,21 @@ def next_copy_name(original_name, names_list): |
| 79 | 79 | return next_copy |
| 80 | 80 | |
| 81 | 81 | |
| 82 | +def VerifyInvalidPListCharacter(text): | |
| 83 | + #print text | |
| 84 | + #text = unicode(text) | |
| 85 | + | |
| 86 | + _controlCharPat = re.compile( | |
| 87 | + r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f" | |
| 88 | + r"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]") | |
| 89 | + m = _controlCharPat.search(text) | |
| 90 | + | |
| 91 | + if m is not None: | |
| 92 | + return True | |
| 93 | + else: | |
| 94 | + False | |
| 95 | + | |
| 96 | + | |
| 82 | 97 | #http://www.garyrobinson.net/2004/03/python_singleto.html |
| 83 | 98 | # Gary Robinson |
| 84 | 99 | class Singleton(type): | ... | ... |