comparison tomo.py @ 27:9d631a5e118f draft

"planemo upload for repository https://github.com/rolfverberg/galaxytools commit aa8c5847f708ec917089859955382dfe3e82567e"
author rv43
date Mon, 18 Apr 2022 21:18:05 +0000
parents 7791b6e7d4e6
children c7211931fc99
comparison
equal deleted inserted replaced
26:7791b6e7d4e6 27:9d631a5e118f
1182 sinogram_T = sinogram.T 1182 sinogram_T = sinogram.T
1183 center = sinogram.shape[1]/2 1183 center = sinogram.shape[1]/2
1184 1184
1185 # try automatic center finding routines for initial value 1185 # try automatic center finding routines for initial value
1186 num_core=1 1186 num_core=1
1187 print(f'OK2 numcore = {num_core}') 1187 #tomo_center = tomopy.find_center_vo(sinogram, ncore=1)
1188 tomo_center = tomopy.find_center_vo(sinogram, ncore=num_core) 1188 tomo_center = tomopy.find_center_vo(sinogram, ncore=num_core)
1189 center_offset_vo = tomo_center-center 1189 center_offset_vo = tomo_center-center
1190 print(f'center_offset_vo = {center_offset_vo}')
1191 if self.test_mode: 1190 if self.test_mode:
1192 logging.info(f'Center at row {row} using Nghia Vo’s method = {center_offset_vo:.2f}') 1191 logging.info(f'Center at row {row} using Nghia Vo’s method = {center_offset_vo:.2f}')
1193 del sinogram_T 1192 del sinogram_T
1194 return float(center_offset_vo) 1193 return float(center_offset_vo)
1195 elif self.galaxy_flag: 1194 elif self.galaxy_flag:
1197 recon_plane = self._reconstructOnePlane(sinogram_T, tomo_center, thetas_deg, 1196 recon_plane = self._reconstructOnePlane(sinogram_T, tomo_center, thetas_deg,
1198 eff_pixel_size, cross_sectional_dim, False, num_core) 1197 eff_pixel_size, cross_sectional_dim, False, num_core)
1199 title = f'edges row{row} center offset{center_offset_vo:.2f} Vo' 1198 title = f'edges row{row} center offset{center_offset_vo:.2f} Vo'
1200 self._plotEdgesOnePlane(recon_plane, title, path='find_center_pngs') 1199 self._plotEdgesOnePlane(recon_plane, title, path='find_center_pngs')
1201 del recon_plane 1200 del recon_plane
1202 print(f'center_type_selector = {galaxy_param["center_type_selector"]}')
1203 if not galaxy_param['center_type_selector']: 1201 if not galaxy_param['center_type_selector']:
1204 del sinogram_T 1202 del sinogram_T
1205 return float(center_offset_vo) 1203 return float(center_offset_vo)
1206 else: 1204 else:
1207 print(f'Center at row {row} using Nghia Vo’s method = {center_offset_vo:.2f}') 1205 print(f'Center at row {row} using Nghia Vo’s method = {center_offset_vo:.2f}')
1265 center_offset_step = pyip.inputInt('Enter step size for center offset search '+ 1263 center_offset_step = pyip.inputInt('Enter step size for center offset search '+
1266 f'[1, {center_offset_upp-center_offset_low}]: ', 1264 f'[1, {center_offset_upp-center_offset_low}]: ',
1267 min=1, max=center_offset_upp-center_offset_low) 1265 min=1, max=center_offset_upp-center_offset_low)
1268 num_center_offset = 1+int((center_offset_upp-center_offset_low)/center_offset_step) 1266 num_center_offset = 1+int((center_offset_upp-center_offset_low)/center_offset_step)
1269 center_offsets = np.linspace(center_offset_low, center_offset_upp, num_center_offset) 1267 center_offsets = np.linspace(center_offset_low, center_offset_upp, num_center_offset)
1270 print(f'center_offsets = {center_offsets}')
1271 for center_offset in center_offsets: 1268 for center_offset in center_offsets:
1272 if center_offset == center_offset_vo: 1269 if center_offset == center_offset_vo:
1273 continue 1270 continue
1274 logging.info(f'center_offset = {center_offset:.2f}') 1271 logging.info(f'center_offset = {center_offset:.2f}')
1275 recon_plane = self._reconstructOnePlane(sinogram_T, center_offset+center, 1272 recon_plane = self._reconstructOnePlane(sinogram_T, center_offset+center,
1277 title = f'edges row{row} center_offset{center_offset:.2f}' 1274 title = f'edges row{row} center_offset{center_offset:.2f}'
1278 if self.galaxy_flag: 1275 if self.galaxy_flag:
1279 self._plotEdgesOnePlane(recon_plane, title, path='find_center_pngs') 1276 self._plotEdgesOnePlane(recon_plane, title, path='find_center_pngs')
1280 else: 1277 else:
1281 self._plotEdgesOnePlane(recon_plane, title) 1278 self._plotEdgesOnePlane(recon_plane, title)
1282 print('OK3')
1283 if self.galaxy_flag or pyip.inputInt('\nContinue (0) or end the search (1): ', 1279 if self.galaxy_flag or pyip.inputInt('\nContinue (0) or end the search (1): ',
1284 min=0, max=1): 1280 min=0, max=1):
1285 break 1281 break
1286 1282
1287 del sinogram_T 1283 del sinogram_T
1738 if use_row != 'no': 1734 if use_row != 'no':
1739 center_offset = find_center.get('lower_center_offset') 1735 center_offset = find_center.get('lower_center_offset')
1740 if msnc.is_num(center_offset): 1736 if msnc.is_num(center_offset):
1741 use_center = pyip.inputYesNo('Current lower center offset = '+ 1737 use_center = pyip.inputYesNo('Current lower center offset = '+
1742 f'{center_offset}, use this value ([y]/n)? ', blank=True) 1738 f'{center_offset}, use this value ([y]/n)? ', blank=True)
1743 logging.info(f'use_center = {use_center}') 1739 #logging.info(f'use_center = {use_center}')
1744 logging.info(f'use_row = {use_row}') 1740 #logging.info(f'use_row = {use_row}')
1745 if use_center == 'no': 1741 if use_center == 'no':
1746 if use_row == 'no': 1742 if use_row == 'no':
1747 if not self.test_mode: 1743 if not self.test_mode:
1748 msnc.quickImshow(center_stack[:,0,:], title=f'theta={theta_start}', 1744 msnc.quickImshow(center_stack[:,0,:], title=f'theta={theta_start}',
1749 aspect='auto') 1745 aspect='auto')
1785 if use_row != 'no': 1781 if use_row != 'no':
1786 center_offset = find_center.get('upper_center_offset') 1782 center_offset = find_center.get('upper_center_offset')
1787 if msnc.is_num(center_offset): 1783 if msnc.is_num(center_offset):
1788 use_center = pyip.inputYesNo('Current upper center offset = '+ 1784 use_center = pyip.inputYesNo('Current upper center offset = '+
1789 f'{center_offset}, use this value ([y]/n)? ', blank=True) 1785 f'{center_offset}, use this value ([y]/n)? ', blank=True)
1790 logging.info(f'use_center = {use_center}') 1786 #logging.info(f'use_center = {use_center}')
1791 logging.info(f'use_row = {use_row}') 1787 #logging.info(f'use_row = {use_row}')
1792 if use_center == 'no': 1788 if use_center == 'no':
1793 if use_row == 'no': 1789 if use_row == 'no':
1794 if not self.test_mode: 1790 if not self.test_mode:
1795 msnc.quickImshow(center_stack[:,0,:], title=f'theta={theta_start}', 1791 msnc.quickImshow(center_stack[:,0,:], title=f'theta={theta_start}',
1796 aspect='auto') 1792 aspect='auto')
1899 logging.debug('Reconstruct tomography stacks') 1895 logging.debug('Reconstruct tomography stacks')
1900 stacks = self.config['stack_info']['stacks'] 1896 stacks = self.config['stack_info']['stacks']
1901 assert(len(self.tomo_stacks) == self.config['stack_info']['num']) 1897 assert(len(self.tomo_stacks) == self.config['stack_info']['num'])
1902 assert(len(self.tomo_stacks) == len(stacks)) 1898 assert(len(self.tomo_stacks) == len(stacks))
1903 assert(len(self.tomo_recon_stacks) == len(stacks)) 1899 assert(len(self.tomo_recon_stacks) == len(stacks))
1900 print('OK1')
1904 if self.galaxy_flag: 1901 if self.galaxy_flag:
1905 assert(isinstance(galaxy_param, dict)) 1902 assert(isinstance(galaxy_param, dict))
1906 # Get rotation axis centers 1903 # Get rotation axis centers
1907 center_offsets = galaxy_param['center_offsets'] 1904 center_offsets = galaxy_param['center_offsets']
1908 assert(isinstance(center_offsets, list) and len(center_offsets) == 2) 1905 assert(isinstance(center_offsets, list) and len(center_offsets) == 2)
1916 galaxy_param = None 1913 galaxy_param = None
1917 lower_center_offset = None 1914 lower_center_offset = None
1918 upper_center_offset = None 1915 upper_center_offset = None
1919 1916
1920 # Get rotation axis rows and centers 1917 # Get rotation axis rows and centers
1918 print('OK2')
1921 find_center = self.config['find_center'] 1919 find_center = self.config['find_center']
1922 lower_row = find_center.get('lower_row') 1920 lower_row = find_center.get('lower_row')
1923 if lower_row is None: 1921 if lower_row is None:
1924 logging.error('Unable to read lower_row from config') 1922 logging.error('Unable to read lower_row from config')
1925 return 1923 return
1949 num_theta_skip = self.config['preprocess'].get('num_theta_skip', 0) 1947 num_theta_skip = self.config['preprocess'].get('num_theta_skip', 0)
1950 thetas = np.radians(np.linspace(theta_start, theta_end, 1948 thetas = np.radians(np.linspace(theta_start, theta_end,
1951 int(num_theta/(num_theta_skip+1)), endpoint=False)) 1949 int(num_theta/(num_theta_skip+1)), endpoint=False))
1952 1950
1953 # Reconstruct tomo stacks 1951 # Reconstruct tomo stacks
1952 print('OK3')
1954 zoom_perc = self.config['preprocess'].get('zoom_perc', 100) 1953 zoom_perc = self.config['preprocess'].get('zoom_perc', 100)
1955 if zoom_perc == 100: 1954 if zoom_perc == 100:
1956 basetitle = 'recon stack fullres' 1955 basetitle = 'recon stack fullres'
1957 else: 1956 else:
1958 basetitle = f'recon stack {zoom_perc}p' 1957 basetitle = f'recon stack {zoom_perc}p'
1961 for i,stack in enumerate(stacks): 1960 for i,stack in enumerate(stacks):
1962 # Check if stack can be loaded 1961 # Check if stack can be loaded
1963 # reconstructed stack order for each one in stack : row/z,x,y 1962 # reconstructed stack order for each one in stack : row/z,x,y
1964 # preprocessed stack order for each one in stack: row,theta,column 1963 # preprocessed stack order for each one in stack: row,theta,column
1965 index = stack['index'] 1964 index = stack['index']
1965 print(f'OK4 {i} a')
1966 if not self.galaxy_flag: 1966 if not self.galaxy_flag:
1967 available = False 1967 available = False
1968 if stack.get('reconstructed', False): 1968 if stack.get('reconstructed', False):
1969 self.tomo_recon_stacks[i], available = self._loadTomo('recon stack', index) 1969 self.tomo_recon_stacks[i], available = self._loadTomo('recon stack', index)
1970 if self.tomo_recon_stacks[i].size or available: 1970 if self.tomo_recon_stacks[i].size or available:
1971 if self.tomo_stacks[i].size: 1971 if self.tomo_stacks[i].size:
1972 self.tomo_stacks[i] = np.array([]) 1972 self.tomo_stacks[i] = np.array([])
1973 assert(stack.get('preprocessed', False) == True) 1973 assert(stack.get('preprocessed', False) == True)
1974 assert(stack.get('reconstructed', False) == True) 1974 assert(stack.get('reconstructed', False) == True)
1975 continue 1975 continue
1976 print(f'OK4 {i} b')
1976 stack['reconstructed'] = False 1977 stack['reconstructed'] = False
1977 if not self.tomo_stacks[i].size: 1978 if not self.tomo_stacks[i].size:
1978 self.tomo_stacks[i], available = self._loadTomo('red stack', index, 1979 self.tomo_stacks[i], available = self._loadTomo('red stack', index,
1979 required=True) 1980 required=True)
1980 if not self.tomo_stacks[i].size: 1981 if not self.tomo_stacks[i].size:
1988 t0 = time() 1989 t0 = time()
1989 self.tomo_recon_stacks[i]= self._reconstructOneTomoStack(self.tomo_stacks[i], 1990 self.tomo_recon_stacks[i]= self._reconstructOneTomoStack(self.tomo_stacks[i],
1990 thetas, center_offsets=center_offsets, sigma=0.1, num_core=num_core, 1991 thetas, center_offsets=center_offsets, sigma=0.1, num_core=num_core,
1991 algorithm='gridrec', run_secondary_sirt=True, secondary_iter=25) 1992 algorithm='gridrec', run_secondary_sirt=True, secondary_iter=25)
1992 logging.info(f'Reconstruction of stack {index} took {time()-t0:.2f} seconds!') 1993 logging.info(f'Reconstruction of stack {index} took {time()-t0:.2f} seconds!')
1994 print(f'OK4 {i} c')
1993 if self.galaxy_flag: 1995 if self.galaxy_flag:
1994 x_slice = int(self.tomo_stacks[i].shape[0]/2) 1996 x_slice = int(self.tomo_stacks[i].shape[0]/2)
1995 title = f'{basetitle} {index} xslice{x_slice}' 1997 title = f'{basetitle} {index} xslice{x_slice}'
1996 msnc.quickImshow(self.tomo_recon_stacks[i][x_slice,:,:], title=title, 1998 msnc.quickImshow(self.tomo_recon_stacks[i][x_slice,:,:], title=title,
1997 path='center_slice_pngs', save_fig=True, save_only=True) 1999 path='center_slice_pngs', save_fig=True, save_only=True)
2021 stack['reconstructed'] = True 2023 stack['reconstructed'] = True
2022 combine_stacks = self.config.get('combine_stacks') 2024 combine_stacks = self.config.get('combine_stacks')
2023 if combine_stacks and index in combine_stacks.get('stacks', []): 2025 if combine_stacks and index in combine_stacks.get('stacks', []):
2024 combine_stacks['stacks'].remove(index) 2026 combine_stacks['stacks'].remove(index)
2025 self.cf.saveFile(self.config_out) 2027 self.cf.saveFile(self.config_out)
2028 print(f'OK4 {i} d')
2026 2029
2027 # Save reconstructed tomography stack to file 2030 # Save reconstructed tomography stack to file
2031 print('OK5')
2028 if self.galaxy_flag: 2032 if self.galaxy_flag:
2029 t0 = time() 2033 t0 = time()
2030 output_name = galaxy_param['output_name'] 2034 output_name = galaxy_param['output_name']
2031 logging.info(f'Saving reconstructed tomography stack to {output_name} ...') 2035 logging.info(f'Saving reconstructed tomography stack to {output_name} ...')
2032 save_stacks = {f'set_{stack["index"]}':tomo_stack 2036 save_stacks = {f'set_{stack["index"]}':tomo_stack
2033 for stack,tomo_stack in zip(stacks,self.tomo_recon_stacks)} 2037 for stack,tomo_stack in zip(stacks,self.tomo_recon_stacks)}
2034 np.savez(output_name, **save_stacks) 2038 np.savez(output_name, **save_stacks)
2035 logging.info(f'... done in {time()-t0:.2f} seconds!') 2039 logging.info(f'... done in {time()-t0:.2f} seconds!')
2040 print('OK6')
2036 2041
2037 def combineTomoStacks(self): 2042 def combineTomoStacks(self):
2038 """Combine the reconstructed tomography stacks. 2043 """Combine the reconstructed tomography stacks.
2039 """ 2044 """
2040 # stack order: stack,row(z),x,y 2045 # stack order: stack,row(z),x,y