Mercurial > repos > rv43 > tomo
comparison msnc_tools.py @ 1:e4778148df6b draft
"planemo upload for repository https://github.com/rolfverberg/galaxytools commit 7bc44bd6a5a7d503fc4d6f6fb67b3a04a631430b"
| author | rv43 |
|---|---|
| date | Thu, 31 Mar 2022 18:24:16 +0000 |
| parents | cb1b0d757704 |
| children | f9c52762c32c |
comparison
equal
deleted
inserted
replaced
| 0:cb1b0d757704 | 1:e4778148df6b |
|---|---|
| 34 def is_int(v, v_min=None, v_max=None): | 34 def is_int(v, v_min=None, v_max=None): |
| 35 """Value is an integer in range v_min <= v <= v_max. | 35 """Value is an integer in range v_min <= v <= v_max. |
| 36 """ | 36 """ |
| 37 if not isinstance(v, int): | 37 if not isinstance(v, int): |
| 38 return False | 38 return False |
| 39 if (v_min != None and v < v_min) or (v_max != None and v > v_max): | 39 if (v_min is not None and v < v_min) or (v_max is not None and v > v_max): |
| 40 return False | 40 return False |
| 41 return True | 41 return True |
| 42 | 42 |
| 43 def is_num(v, v_min=None, v_max=None): | 43 def is_num(v, v_min=None, v_max=None): |
| 44 """Value is a number in range v_min <= v <= v_max. | 44 """Value is a number in range v_min <= v <= v_max. |
| 45 """ | 45 """ |
| 46 if not isinstance(v, (int,float)): | 46 if not isinstance(v, (int,float)): |
| 47 return False | 47 return False |
| 48 if (v_min != None and v < v_min) or (v_max != None and v > v_max): | 48 if (v_min is not None and v < v_min) or (v_max is not None and v > v_max): |
| 49 return False | 49 return False |
| 50 return True | 50 return True |
| 51 | 51 |
| 52 def is_index(v, v_min=0, v_max=None): | 52 def is_index(v, v_min=0, v_max=None): |
| 53 """Value is an array index in range v_min <= v < v_max. | 53 """Value is an array index in range v_min <= v < v_max. |
| 54 """ | 54 """ |
| 55 if not isinstance(v, int): | 55 if not isinstance(v, int): |
| 56 return False | 56 return False |
| 57 if v < v_min or (v_max != None and v >= v_max): | 57 if v < v_min or (v_max is not None and v >= v_max): |
| 58 return False | 58 return False |
| 59 return True | 59 return True |
| 60 | 60 |
| 61 def is_index_range(v, v_min=0, v_max=None): | 61 def is_index_range(v, v_min=0, v_max=None): |
| 62 """Value is an array index range in range v_min <= v[0] <= v[1] < v_max. | 62 """Value is an array index range in range v_min <= v[0] <= v[1] <= v_max. |
| 63 """ | 63 """ |
| 64 if not (isinstance(v, list) and len(v) == 2 and isinstance(v[0], int) and | 64 if not (isinstance(v, list) and len(v) == 2 and isinstance(v[0], int) and |
| 65 isinstance(v[1], int)): | 65 isinstance(v[1], int)): |
| 66 return False | 66 return False |
| 67 if not 0 <= v[0] < v[1] or (v_max != None and v[1] >= v_max): | 67 if not 0 <= v[0] <= v[1] or (v_max is not None and v[1] > v_max): |
| 68 return False | 68 return False |
| 69 return True | 69 return True |
| 70 | 70 |
| 71 def illegal_value(name, value, location=None, exit_flag=False): | 71 def illegal_value(name, value, location=None, exit_flag=False): |
| 72 if not isinstance(location, str): | 72 if not isinstance(location, str): |
| 81 exit(1) | 81 exit(1) |
| 82 | 82 |
| 83 def get_trailing_int(string): | 83 def get_trailing_int(string): |
| 84 indexRegex = re.compile(r'\d+$') | 84 indexRegex = re.compile(r'\d+$') |
| 85 mo = indexRegex.search(string) | 85 mo = indexRegex.search(string) |
| 86 if mo == None: | 86 if mo is None: |
| 87 return None | 87 return None |
| 88 else: | 88 else: |
| 89 return int(mo.group()) | 89 return int(mo.group()) |
| 90 | 90 |
| 91 def findImageFiles(path, filetype, name=None): | 91 def findImageFiles(path, filetype, name=None): |
| 106 if num_imgs < 1: | 106 if num_imgs < 1: |
| 107 logging.warning('No available'+name+'files') | 107 logging.warning('No available'+name+'files') |
| 108 return -1, 0, [] | 108 return -1, 0, [] |
| 109 first_index = indexRegex.search(files[0]).group() | 109 first_index = indexRegex.search(files[0]).group() |
| 110 last_index = indexRegex.search(files[-1]).group() | 110 last_index = indexRegex.search(files[-1]).group() |
| 111 if first_index == None or last_index == None: | 111 if first_index is None or last_index is None: |
| 112 logging.error('Unable to find correctly indexed'+name+'images') | 112 logging.error('Unable to find correctly indexed'+name+'images') |
| 113 return -1, 0, [] | 113 return -1, 0, [] |
| 114 first_index = int(first_index) | 114 first_index = int(first_index) |
| 115 last_index = int(last_index) | 115 last_index = int(last_index) |
| 116 if num_imgs != last_index-first_index+1: | 116 if num_imgs != last_index-first_index+1: |
| 149 'use this value ([y]/n)? ', blank=True) | 149 'use this value ([y]/n)? ', blank=True) |
| 150 else: | 150 else: |
| 151 use_input = pyip.inputYesNo('\nCurrent'+name+'first index/offset = '+ | 151 use_input = pyip.inputYesNo('\nCurrent'+name+'first index/offset = '+ |
| 152 f'{first_index}/{offset}, use these values ([y]/n)? ', | 152 f'{first_index}/{offset}, use these values ([y]/n)? ', |
| 153 blank=True) | 153 blank=True) |
| 154 if use_input != 'no': | 154 if num_required is None: |
| 155 use_input = pyip.inputYesNo('Current number of'+name+'images = '+ | 155 if use_input != 'no': |
| 156 f'{num_imgs}, use this value ([y]/n)? ', | 156 use_input = pyip.inputYesNo('Current number of'+name+'images = '+ |
| 157 blank=True) | 157 f'{num_imgs}, use this value ([y]/n)? ', |
| 158 if use_input == 'yes': | 158 blank=True) |
| 159 if use_input != 'no': | |
| 159 return first_index, offset, num_imgs | 160 return first_index, offset, num_imgs |
| 160 | 161 |
| 161 # Check range against requirements | 162 # Check range against requirements |
| 162 if num_imgs < 1: | 163 if num_imgs < 1: |
| 163 logging.warning('No available'+name+'images') | 164 logging.warning('No available'+name+'images') |
| 164 return -1, -1, 0 | 165 return -1, -1, 0 |
| 165 if num_required == None: | 166 if num_required is None: |
| 166 if num_imgs == 1: | 167 if num_imgs == 1: |
| 167 return first_index, 0, 1 | 168 return first_index, 0, 1 |
| 168 else: | 169 else: |
| 169 if not is_int(num_required, 1): | 170 if not is_int(num_required, 1): |
| 170 illegal_value('num_required', num_required, 'selectImageRange') | 171 illegal_value('num_required', num_required, 'selectImageRange') |
| 173 logging.error('Unable to find the required'+name+ | 174 logging.error('Unable to find the required'+name+ |
| 174 f'images ({num_imgs} out of {num_required})') | 175 f'images ({num_imgs} out of {num_required})') |
| 175 return -1, -1, 0 | 176 return -1, -1, 0 |
| 176 | 177 |
| 177 # Select index range | 178 # Select index range |
| 178 if num_required == None: | 179 print('\nThe number of available'+name+f'images is {num_imgs}') |
| 180 if num_required is None: | |
| 179 last_index = first_index+num_imgs | 181 last_index = first_index+num_imgs |
| 180 use_all = f'Use all ([{first_index}, {last_index}])' | 182 use_all = f'Use all ([{first_index}, {last_index}])' |
| 181 pick_offset = 'Pick a first index offset and a number of images' | 183 pick_offset = 'Pick a first index offset and a number of images' |
| 182 pick_bounds = 'Pick the first and last index' | 184 pick_bounds = 'Pick the first and last index' |
| 183 menuchoice = pyip.inputMenu([use_all, pick_offset, pick_bounds], numbered=True) | 185 menuchoice = pyip.inputMenu([use_all, pick_offset, pick_bounds], numbered=True) |
| 227 return None | 229 return None |
| 228 if not img_y_bounds: | 230 if not img_y_bounds: |
| 229 img_y_bounds = [0, img_read.shape[1]] | 231 img_y_bounds = [0, img_read.shape[1]] |
| 230 else: | 232 else: |
| 231 if (not isinstance(img_y_bounds, list) or len(img_y_bounds) != 2 or | 233 if (not isinstance(img_y_bounds, list) or len(img_y_bounds) != 2 or |
| 232 not (0 <= img_y_bounds[0] < img_y_bounds[1] <= img_read.shape[0])): | 234 not (0 <= img_y_bounds[0] < img_y_bounds[1] <= img_read.shape[1])): |
| 233 logging.error(f'inconsistent column dimension in {f}') | 235 logging.error(f'inconsistent column dimension in {f}') |
| 234 return None | 236 return None |
| 235 return img_read[img_x_bounds[0]:img_x_bounds[1],img_y_bounds[0]:img_y_bounds[1]] | 237 return img_read[img_x_bounds[0]:img_x_bounds[1],img_y_bounds[0]:img_y_bounds[1]] |
| 236 | 238 |
| 237 def loadImageStack(files, filetype, img_offset, num_imgs, num_img_skip=0, | 239 def loadImageStack(files, filetype, img_offset, num_imgs, num_img_skip=0, |
| 294 return | 296 return |
| 295 plt.close(fig=re.sub(r"\s+", '_', title)) | 297 plt.close(fig=re.sub(r"\s+", '_', title)) |
| 296 | 298 |
| 297 def quickImshow(a, title=None, path=None, name=None, save_fig=False, save_only=False, | 299 def quickImshow(a, title=None, path=None, name=None, save_fig=False, save_only=False, |
| 298 clear=True, **kwargs): | 300 clear=True, **kwargs): |
| 299 if title != None and not isinstance(title, str): | 301 if title is not None and not isinstance(title, str): |
| 300 illegal_value('title', title, 'quickImshow') | 302 illegal_value('title', title, 'quickImshow') |
| 301 return | 303 return |
| 302 if path is not None and not isinstance(path, str): | 304 if path is not None and not isinstance(path, str): |
| 303 illegal_value('path', path, 'quickImshow') | 305 illegal_value('path', path, 'quickImshow') |
| 304 return | 306 return |
| 341 plt.savefig(path) | 343 plt.savefig(path) |
| 342 plt.pause(1) | 344 plt.pause(1) |
| 343 | 345 |
| 344 def quickPlot(*args, title=None, path=None, name=None, save_fig=False, save_only=False, | 346 def quickPlot(*args, title=None, path=None, name=None, save_fig=False, save_only=False, |
| 345 clear=True, **kwargs): | 347 clear=True, **kwargs): |
| 346 if title != None and not isinstance(title, str): | 348 if title is not None and not isinstance(title, str): |
| 347 illegal_value('title', title, 'quickPlot') | 349 illegal_value('title', title, 'quickPlot') |
| 348 return | 350 return |
| 349 if path is not None and not isinstance(path, str): | 351 if path is not None and not isinstance(path, str): |
| 350 illegal_value('path', path, 'quickPlot') | 352 illegal_value('path', path, 'quickPlot') |
| 351 return | 353 return |
| 400 """Interactively select the lower and upper data bounds for a numpy array. | 402 """Interactively select the lower and upper data bounds for a numpy array. |
| 401 """ | 403 """ |
| 402 if not isinstance(a, np.ndarray) or a.ndim != 1: | 404 if not isinstance(a, np.ndarray) or a.ndim != 1: |
| 403 logging.error('Illegal array type or dimension in selectArrayBounds') | 405 logging.error('Illegal array type or dimension in selectArrayBounds') |
| 404 return None | 406 return None |
| 405 if num_x_min == None: | 407 x_low_save = x_low |
| 408 x_upp_save = x_upp | |
| 409 num_x_min_save = num_x_min | |
| 410 if num_x_min is None: | |
| 406 num_x_min = 1 | 411 num_x_min = 1 |
| 407 else: | 412 else: |
| 408 if num_x_min < 2 or num_x_min > a.size: | 413 if num_x_min < 2 or num_x_min > a.size: |
| 409 logging.warning('Illegal input for num_x_min in selectArrayBounds, input ignored') | 414 logging.warning('Illegal input for num_x_min in selectArrayBounds, input ignored') |
| 410 num_x_min = 1 | 415 num_x_min = 1 |
| 411 if x_low == None: | 416 if x_low is None: |
| 412 x_min = 0 | 417 x_min = 0 |
| 413 x_max = a.size | 418 x_max = a.size |
| 414 x_low_max = a.size-num_x_min | 419 x_low_max = a.size-num_x_min |
| 415 while True: | 420 while True: |
| 416 quickPlot(range(x_min, x_max), a[x_min:x_max], title=title) | 421 quickPlot(range(x_min, x_max), a[x_min:x_max], title=title) |
| 427 break | 432 break |
| 428 else: | 433 else: |
| 429 if not is_int(x_low, 0, a.size-num_x_min): | 434 if not is_int(x_low, 0, a.size-num_x_min): |
| 430 illegal_value('x_low', x_low, 'selectArrayBounds') | 435 illegal_value('x_low', x_low, 'selectArrayBounds') |
| 431 return None | 436 return None |
| 432 if x_upp == None: | 437 if x_upp is None: |
| 433 x_min = x_low+num_x_min | 438 x_min = x_low+num_x_min |
| 434 x_max = a.size | 439 x_max = a.size |
| 435 x_upp_min = x_min | 440 x_upp_min = x_min |
| 436 while True: | 441 while True: |
| 437 quickPlot(range(x_min, x_max), a[x_min:x_max], title=title) | 442 quickPlot(range(x_min, x_max), a[x_min:x_max], title=title) |
| 454 print(f'lower bound = {x_low} (inclusive)\nupper bound = {x_upp} (exclusive)]') | 459 print(f'lower bound = {x_low} (inclusive)\nupper bound = {x_upp} (exclusive)]') |
| 455 #quickPlot(range(bounds[0], bounds[1]), a[bounds[0]:bounds[1]], title=title) | 460 #quickPlot(range(bounds[0], bounds[1]), a[bounds[0]:bounds[1]], title=title) |
| 456 quickPlot((range(a.size), a), ([bounds[0], bounds[0]], [a.min(), a.max()], 'r-'), | 461 quickPlot((range(a.size), a), ([bounds[0], bounds[0]], [a.min(), a.max()], 'r-'), |
| 457 ([bounds[1], bounds[1]], [a.min(), a.max()], 'r-'), title=title) | 462 ([bounds[1], bounds[1]], [a.min(), a.max()], 'r-'), title=title) |
| 458 if pyip.inputYesNo('Accept these bounds ([y]/n)?: ', blank=True) == 'no': | 463 if pyip.inputYesNo('Accept these bounds ([y]/n)?: ', blank=True) == 'no': |
| 459 bounds = selectArrayBounds(a, title=title) | 464 bounds = selectArrayBounds(a, x_low_save, x_upp_save, num_x_min_save, title=title) |
| 460 return bounds | 465 return bounds |
| 461 | 466 |
| 462 def selectImageBounds(a, axis, low=None, upp=None, num_min=None, | 467 def selectImageBounds(a, axis, low=None, upp=None, num_min=None, |
| 463 title='select array bounds'): | 468 title='select array bounds'): |
| 464 """Interactively select the lower and upper data bounds for a 2D numpy array. | 469 """Interactively select the lower and upper data bounds for a 2D numpy array. |
| 467 logging.error('Illegal array type or dimension in selectImageBounds') | 472 logging.error('Illegal array type or dimension in selectImageBounds') |
| 468 return None | 473 return None |
| 469 if axis < 0 or axis >= a.ndim: | 474 if axis < 0 or axis >= a.ndim: |
| 470 illegal_value('axis', axis, 'selectImageBounds') | 475 illegal_value('axis', axis, 'selectImageBounds') |
| 471 return None | 476 return None |
| 472 if num_min == None: | 477 low_save = low |
| 478 upp_save = upp | |
| 479 num_min_save = num_min | |
| 480 if num_min is None: | |
| 473 num_min = 1 | 481 num_min = 1 |
| 474 else: | 482 else: |
| 475 if num_min < 2 or num_min > a.shape[axis]: | 483 if num_min < 2 or num_min > a.shape[axis]: |
| 476 logging.warning('Illegal input for num_min in selectImageBounds, input ignored') | 484 logging.warning('Illegal input for num_min in selectImageBounds, input ignored') |
| 477 num_min = 1 | 485 num_min = 1 |
| 478 if low == None: | 486 if low is None: |
| 479 min_ = 0 | 487 min_ = 0 |
| 480 max_ = a.shape[axis] | 488 max_ = a.shape[axis] |
| 481 low_max = a.shape[axis]-num_min | 489 low_max = a.shape[axis]-num_min |
| 482 while True: | 490 while True: |
| 483 if axis: | 491 if axis: |
| 499 break | 507 break |
| 500 else: | 508 else: |
| 501 if not is_int(low, 0, a.shape[axis]-num_min): | 509 if not is_int(low, 0, a.shape[axis]-num_min): |
| 502 illegal_value('low', low, 'selectImageBounds') | 510 illegal_value('low', low, 'selectImageBounds') |
| 503 return None | 511 return None |
| 504 if upp == None: | 512 if upp is None: |
| 505 min_ = low+num_min | 513 min_ = low+num_min |
| 506 max_ = a.shape[axis] | 514 max_ = a.shape[axis] |
| 507 upp_min = min_ | 515 upp_min = min_ |
| 508 while True: | 516 while True: |
| 509 if axis: | 517 if axis: |
| 536 a_tmp[bounds[0],:] = a.max() | 544 a_tmp[bounds[0],:] = a.max() |
| 537 a_tmp[bounds[1],:] = a.max() | 545 a_tmp[bounds[1],:] = a.max() |
| 538 print(f'lower bound = {low} (inclusive)\nupper bound = {upp} (exclusive)') | 546 print(f'lower bound = {low} (inclusive)\nupper bound = {upp} (exclusive)') |
| 539 quickImshow(a_tmp, title=title) | 547 quickImshow(a_tmp, title=title) |
| 540 if pyip.inputYesNo('Accept these bounds ([y]/n)?: ', blank=True) == 'no': | 548 if pyip.inputYesNo('Accept these bounds ([y]/n)?: ', blank=True) == 'no': |
| 541 bounds = selectImageBounds(a, title=title) | 549 bounds = selectImageBounds(a, axis, low=low_save, upp=upp_save, num_min=num_min_save, |
| 550 title=title) | |
| 542 return bounds | 551 return bounds |
| 543 | 552 |
| 544 def fitStep(x=None, y=None, model='step', form='arctan'): | 553 def fitStep(x=None, y=None, model='step', form='arctan'): |
| 545 if not isinstance(y, np.ndarray) or y.ndim != 1: | 554 if not isinstance(y, np.ndarray) or y.ndim != 1: |
| 546 logging.error('Illegal array type or dimension for y in fitStep') | 555 logging.error('Illegal array type or dimension for y in fitStep') |
| 688 # if item[0].strip() == key: | 697 # if item[0].strip() == key: |
| 689 # lines[index] = newline | 698 # lines[index] = newline |
| 690 # break | 699 # break |
| 691 # else: | 700 # else: |
| 692 # # Insert new key/value pair | 701 # # Insert new key/value pair |
| 693 # if search_string != None: | 702 # if search_string is not None: |
| 694 # if isinstance(search_string, str): | 703 # if isinstance(search_string, str): |
| 695 # search_string = [search_string] | 704 # search_string = [search_string] |
| 696 # elif not isinstance(search_string, (tuple, list)): | 705 # elif not isinstance(search_string, (tuple, list)): |
| 697 # illegal_value('search_string', search_string, 'Config.update') | 706 # illegal_value('search_string', search_string, 'Config.update') |
| 698 # search_string = None | 707 # search_string = None |
| 699 # update_flag = False | 708 # update_flag = False |
| 700 # if search_string != None: | 709 # if search_string is not None: |
| 701 # indices = [[index for index,line in enumerate(lines) if item in line] | 710 # indices = [[index for index,line in enumerate(lines) if item in line] |
| 702 # for item in search_string] | 711 # for item in search_string] |
| 703 # for i,index in enumerate(indices): | 712 # for i,index in enumerate(indices): |
| 704 # if index: | 713 # if index: |
| 705 # if len(search_string) > 1 and key < search_string[i]: | 714 # if len(search_string) > 1 and key < search_string[i]: |
