comparison tomo.py @ 34:63de912323e5 draft

"planemo upload for repository https://github.com/rolfverberg/galaxytools commit c81dfe083e164b51b3688e512f2a0b00b953851c"
author rv43
date Tue, 19 Apr 2022 16:40:34 +0000
parents afb612b64f26
children 20829cd7aaef
comparison
equal deleted inserted replaced
33:afb612b64f26 34:63de912323e5
1298 # RV should we remove stripes? 1298 # RV should we remove stripes?
1299 # https://tomopy.readthedocs.io/en/latest/api/tomopy.prep.stripe.html 1299 # https://tomopy.readthedocs.io/en/latest/api/tomopy.prep.stripe.html
1300 # RV should we remove rings? 1300 # RV should we remove rings?
1301 # https://tomopy.readthedocs.io/en/latest/api/tomopy.misc.corr.html 1301 # https://tomopy.readthedocs.io/en/latest/api/tomopy.misc.corr.html
1302 # RV: Add an option to do (extra) secondary iterations later or to do some sort of convergence test? 1302 # RV: Add an option to do (extra) secondary iterations later or to do some sort of convergence test?
1303 print(f'OK AA row_bounds = {row_bounds}')
1304 if row_bounds is None: 1303 if row_bounds is None:
1305 row_bounds = [0, tomo_stack.shape[0]] 1304 row_bounds = [0, tomo_stack.shape[0]]
1306 else: 1305 else:
1307 if not msnc.is_index_range(row_bounds, 0, tomo_stack.shape[0]): 1306 if not msnc.is_index_range(row_bounds, 0, tomo_stack.shape[0]):
1308 raise ValueError('Illegal row bounds in reconstructOneTomoStack') 1307 raise ValueError('Illegal row bounds in reconstructOneTomoStack')
1316 else: 1315 else:
1317 if center_offsets.size != row_bounds[1]-row_bounds[0]: 1316 if center_offsets.size != row_bounds[1]-row_bounds[0]:
1318 raise ValueError('center_offsets dimension mismatch in reconstructOneTomoStack') 1317 raise ValueError('center_offsets dimension mismatch in reconstructOneTomoStack')
1319 centers = center_offsets 1318 centers = center_offsets
1320 centers += tomo_stack.shape[2]/2 1319 centers += tomo_stack.shape[2]/2
1321 print(f'num_core = {num_core}') 1320 # RV hangs here with more than 24 cores and sge_64G_4
1322 print(f'thetas = {thetas}')
1323 print(f'centers = {centers}')
1324 if True: 1321 if True:
1325 tomo_stack = tomopy.prep.stripe.remove_stripe_fw( 1322 tomo_stack = tomopy.prep.stripe.remove_stripe_fw(
1326 tomo_stack[row_bounds[0]:row_bounds[1]], sigma=sigma, ncore=num_core) 1323 tomo_stack[row_bounds[0]:row_bounds[1]], sigma=sigma, ncore=num_core)
1327 else: 1324 else:
1328 tomo_stack = tomo_stack[row_bounds[0]:row_bounds[1]] 1325 tomo_stack = tomo_stack[row_bounds[0]:row_bounds[1]]
1329 print('OK BB') 1326 logging.info('performing initial reconstruction')
1330 tomo_recon_stack = tomopy.recon(tomo_stack, thetas, centers, sinogram_order=True, 1327 tomo_recon_stack = tomopy.recon(tomo_stack, thetas, centers, sinogram_order=True,
1331 algorithm=algorithm, ncore=num_core) 1328 algorithm=algorithm, ncore=num_core)
1332 print('OK CC')
1333 if run_secondary_sirt and secondary_iter > 0: 1329 if run_secondary_sirt and secondary_iter > 0:
1330 logging.info(f'running {secondary_iter} secondary iterations')
1334 #options = {'method':'SIRT_CUDA', 'proj_type':'cuda', 'num_iter':secondary_iter} 1331 #options = {'method':'SIRT_CUDA', 'proj_type':'cuda', 'num_iter':secondary_iter}
1335 #RV: doesn't work for me: "Error: CUDA error 803: system has unsupported display driver / 1332 #RV: doesn't work for me: "Error: CUDA error 803: system has unsupported display driver /
1336 # cuda driver combination." 1333 # cuda driver combination."
1337 #options = {'method':'SIRT', 'proj_type':'linear', 'MinConstraint': 0, 'num_iter':secondary_iter} 1334 #options = {'method':'SIRT', 'proj_type':'linear', 'MinConstraint': 0, 'num_iter':secondary_iter}
1338 #SIRT did not finish while running overnight 1335 #SIRT did not finish while running overnight
1340 options = {'method':'SART', 'proj_type':'linear', 'MinConstraint': 0, 1337 options = {'method':'SART', 'proj_type':'linear', 'MinConstraint': 0,
1341 'num_iter':secondary_iter} 1338 'num_iter':secondary_iter}
1342 tomo_recon_stack = tomopy.recon(tomo_stack, thetas, centers, 1339 tomo_recon_stack = tomopy.recon(tomo_stack, thetas, centers,
1343 init_recon=tomo_recon_stack, options=options, sinogram_order=True, 1340 init_recon=tomo_recon_stack, options=options, sinogram_order=True,
1344 algorithm=tomopy.astra, ncore=num_core) 1341 algorithm=tomopy.astra, ncore=num_core)
1345 print('OK DD')
1346 if True: 1342 if True:
1347 tomopy.misc.corr.remove_ring(tomo_recon_stack, rwidth=rwidth, out=tomo_recon_stack, 1343 tomopy.misc.corr.remove_ring(tomo_recon_stack, rwidth=rwidth, out=tomo_recon_stack,
1348 ncore=num_core) 1344 ncore=num_core)
1349 return tomo_recon_stack 1345 return tomo_recon_stack
1350 1346
1893 def reconstructTomoStacks(self, galaxy_param=None, num_core=None): 1889 def reconstructTomoStacks(self, galaxy_param=None, num_core=None):
1894 """Reconstruct tomography stacks. 1890 """Reconstruct tomography stacks.
1895 """ 1891 """
1896 if num_core is None: 1892 if num_core is None:
1897 num_core = self.num_core 1893 num_core = self.num_core
1898 logging.info(f'num_core = {num_core}') 1894 logging.info(f'num_core available = {num_core}')
1895 if num_core > 24:
1896 num_core = 24
1897 logging.info(f'num_core used = {num_core}')
1899 if self.galaxy_flag: 1898 if self.galaxy_flag:
1900 assert(galaxy_param) 1899 assert(galaxy_param)
1901 if not os.path.exists('center_slice_pngs'): 1900 if not os.path.exists('center_slice_pngs'):
1902 os.mkdir('center_slice_pngs') 1901 os.mkdir('center_slice_pngs')
1903 logging.debug('Reconstruct tomography stacks') 1902 logging.debug('Reconstruct tomography stacks')
1904 stacks = self.config['stack_info']['stacks'] 1903 stacks = self.config['stack_info']['stacks']
1905 assert(len(self.tomo_stacks) == self.config['stack_info']['num']) 1904 assert(len(self.tomo_stacks) == self.config['stack_info']['num'])
1906 assert(len(self.tomo_stacks) == len(stacks)) 1905 assert(len(self.tomo_stacks) == len(stacks))
1907 assert(len(self.tomo_recon_stacks) == len(stacks)) 1906 assert(len(self.tomo_recon_stacks) == len(stacks))
1908 print('OK1')
1909 if self.galaxy_flag: 1907 if self.galaxy_flag:
1910 assert(isinstance(galaxy_param, dict)) 1908 assert(isinstance(galaxy_param, dict))
1911 # Get rotation axis centers 1909 # Get rotation axis centers
1912 center_offsets = galaxy_param['center_offsets'] 1910 center_offsets = galaxy_param['center_offsets']
1913 assert(isinstance(center_offsets, list) and len(center_offsets) == 2) 1911 assert(isinstance(center_offsets, list) and len(center_offsets) == 2)
1921 galaxy_param = None 1919 galaxy_param = None
1922 lower_center_offset = None 1920 lower_center_offset = None
1923 upper_center_offset = None 1921 upper_center_offset = None
1924 1922
1925 # Get rotation axis rows and centers 1923 # Get rotation axis rows and centers
1926 print('OK2')
1927 find_center = self.config['find_center'] 1924 find_center = self.config['find_center']
1928 lower_row = find_center.get('lower_row') 1925 lower_row = find_center.get('lower_row')
1929 if lower_row is None: 1926 if lower_row is None:
1930 logging.error('Unable to read lower_row from config') 1927 logging.error('Unable to read lower_row from config')
1931 return 1928 return
1955 num_theta_skip = self.config['preprocess'].get('num_theta_skip', 0) 1952 num_theta_skip = self.config['preprocess'].get('num_theta_skip', 0)
1956 thetas = np.radians(np.linspace(theta_start, theta_end, 1953 thetas = np.radians(np.linspace(theta_start, theta_end,
1957 int(num_theta/(num_theta_skip+1)), endpoint=False)) 1954 int(num_theta/(num_theta_skip+1)), endpoint=False))
1958 1955
1959 # Reconstruct tomo stacks 1956 # Reconstruct tomo stacks
1960 print('OK3')
1961 zoom_perc = self.config['preprocess'].get('zoom_perc', 100) 1957 zoom_perc = self.config['preprocess'].get('zoom_perc', 100)
1962 if zoom_perc == 100: 1958 if zoom_perc == 100:
1963 basetitle = 'recon stack fullres' 1959 basetitle = 'recon stack fullres'
1964 else: 1960 else:
1965 basetitle = f'recon stack {zoom_perc}p' 1961 basetitle = f'recon stack {zoom_perc}p'
1968 for i,stack in enumerate(stacks): 1964 for i,stack in enumerate(stacks):
1969 # Check if stack can be loaded 1965 # Check if stack can be loaded
1970 # reconstructed stack order for each one in stack : row/z,x,y 1966 # reconstructed stack order for each one in stack : row/z,x,y
1971 # preprocessed stack order for each one in stack: row,theta,column 1967 # preprocessed stack order for each one in stack: row,theta,column
1972 index = stack['index'] 1968 index = stack['index']
1973 print(f'OK4 {i} a')
1974 if not self.galaxy_flag: 1969 if not self.galaxy_flag:
1975 available = False 1970 available = False
1976 if stack.get('reconstructed', False): 1971 if stack.get('reconstructed', False):
1977 self.tomo_recon_stacks[i], available = self._loadTomo('recon stack', index) 1972 self.tomo_recon_stacks[i], available = self._loadTomo('recon stack', index)
1978 if self.tomo_recon_stacks[i].size or available: 1973 if self.tomo_recon_stacks[i].size or available:
1979 if self.tomo_stacks[i].size: 1974 if self.tomo_stacks[i].size:
1980 self.tomo_stacks[i] = np.array([]) 1975 self.tomo_stacks[i] = np.array([])
1981 assert(stack.get('preprocessed', False) == True) 1976 assert(stack.get('preprocessed', False) == True)
1982 assert(stack.get('reconstructed', False) == True) 1977 assert(stack.get('reconstructed', False) == True)
1983 continue 1978 continue
1984 print(f'OK4 {i} b size = {self.tomo_stacks[i].size}')
1985 stack['reconstructed'] = False 1979 stack['reconstructed'] = False
1986 if not self.tomo_stacks[i].size: 1980 if not self.tomo_stacks[i].size:
1987 self.tomo_stacks[i], available = self._loadTomo('red stack', index, 1981 self.tomo_stacks[i], available = self._loadTomo('red stack', index,
1988 required=True) 1982 required=True)
1989 if not self.tomo_stacks[i].size: 1983 if not self.tomo_stacks[i].size:
1990 logging.error(f'Unable to load tomography stack {index} for reconstruction') 1984 logging.error(f'Unable to load tomography stack {index} for reconstruction')
1991 stack[i]['preprocessed'] = False 1985 stack[i]['preprocessed'] = False
1992 load_error = True 1986 load_error = True
1993 continue 1987 continue
1994 print(f'lower_row = {lower_row} upper_row = {upper_row} self.tomo_stacks[i].shape[0] = {self.tomo_stacks[i].shape[0]}')
1995 assert(0 <= lower_row < upper_row < self.tomo_stacks[i].shape[0]) 1988 assert(0 <= lower_row < upper_row < self.tomo_stacks[i].shape[0])
1996 center_offsets = [lower_center_offset-lower_row*center_slope, 1989 center_offsets = [lower_center_offset-lower_row*center_slope,
1997 upper_center_offset+(self.tomo_stacks[i].shape[0]-1-upper_row)*center_slope] 1990 upper_center_offset+(self.tomo_stacks[i].shape[0]-1-upper_row)*center_slope]
1998 t0 = time() 1991 t0 = time()
1999 print(f'OK4 {i} c')
2000 self.tomo_recon_stacks[i]= self._reconstructOneTomoStack(self.tomo_stacks[i], 1992 self.tomo_recon_stacks[i]= self._reconstructOneTomoStack(self.tomo_stacks[i],
2001 thetas, center_offsets=center_offsets, sigma=0.1, num_core=num_core, 1993 thetas, center_offsets=center_offsets, sigma=0.1, num_core=num_core,
2002 algorithm='gridrec', run_secondary_sirt=True, secondary_iter=25) 1994 algorithm='gridrec', run_secondary_sirt=True, secondary_iter=25)
2003 print(f'OK4 {i} d')
2004 logging.info(f'Reconstruction of stack {index} took {time()-t0:.2f} seconds!') 1995 logging.info(f'Reconstruction of stack {index} took {time()-t0:.2f} seconds!')
2005 if self.galaxy_flag: 1996 if self.galaxy_flag:
2006 x_slice = int(self.tomo_stacks[i].shape[0]/2) 1997 x_slice = int(self.tomo_stacks[i].shape[0]/2)
2007 title = f'{basetitle} {index} xslice{x_slice}' 1998 title = f'{basetitle} {index} xslice{x_slice}'
2008 msnc.quickImshow(self.tomo_recon_stacks[i][x_slice,:,:], title=title, 1999 msnc.quickImshow(self.tomo_recon_stacks[i][x_slice,:,:], title=title,
2033 stack['reconstructed'] = True 2024 stack['reconstructed'] = True
2034 combine_stacks = self.config.get('combine_stacks') 2025 combine_stacks = self.config.get('combine_stacks')
2035 if combine_stacks and index in combine_stacks.get('stacks', []): 2026 if combine_stacks and index in combine_stacks.get('stacks', []):
2036 combine_stacks['stacks'].remove(index) 2027 combine_stacks['stacks'].remove(index)
2037 self.cf.saveFile(self.config_out) 2028 self.cf.saveFile(self.config_out)
2038 print(f'OK4 {i} e')
2039 2029
2040 # Save reconstructed tomography stack to file 2030 # Save reconstructed tomography stack to file
2041 print('OK5')
2042 if self.galaxy_flag: 2031 if self.galaxy_flag:
2043 t0 = time() 2032 t0 = time()
2044 output_name = galaxy_param['output_name'] 2033 output_name = galaxy_param['output_name']
2045 logging.info(f'Saving reconstructed tomography stack to {output_name} ...') 2034 logging.info(f'Saving reconstructed tomography stack to {output_name} ...')
2046 save_stacks = {f'set_{stack["index"]}':tomo_stack 2035 save_stacks = {f'set_{stack["index"]}':tomo_stack
2047 for stack,tomo_stack in zip(stacks,self.tomo_recon_stacks)} 2036 for stack,tomo_stack in zip(stacks,self.tomo_recon_stacks)}
2048 np.savez(output_name, **save_stacks) 2037 np.savez(output_name, **save_stacks)
2049 logging.info(f'... done in {time()-t0:.2f} seconds!') 2038 logging.info(f'... done in {time()-t0:.2f} seconds!')
2050 print('OK6')
2051 2039
2052 def combineTomoStacks(self): 2040 def combineTomoStacks(self):
2053 """Combine the reconstructed tomography stacks. 2041 """Combine the reconstructed tomography stacks.
2054 """ 2042 """
2055 # stack order: stack,row(z),x,y 2043 # stack order: stack,row(z),x,y