Mercurial > repos > rv43 > tomo
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 |
