src.acoustools.Export.CSV
Export Hologram to CSV
1''' 2Export Hologram to CSV 3''' 4 5from typing import Literal 6from torch import Tensor 7import torch 8 9from acoustools.Utilities.Setup import device 10from acoustools.Utilities.Utilities import get_convert_indexes 11 12 13def write_to_file(activations:Tensor,fname:str,num_frames:int, num_transducers:int=512, flip:bool=True) -> None: 14 ''' 15 Writes each hologram in `activations` to the csv `fname` in order expected by OpenMPD \n 16 :param activations: List of holograms 17 :param fname: Name of file to write to, expected to end in `.csv` 18 :param num_frames: Number of frames in `activations` 19 :param num_transducers: Number of transducers in the boards used. Default:512 20 :param flip: If True uses `get_convert_indexes` to swap order of transducers to be the same as OpenMPD expects. Default: `True` 21 ''' 22 output_f = open(fname,"w") 23 output_f.write(str(num_frames)+","+str(num_transducers)+"\n") 24 25 for row in activations: 26 row = torch.angle(row).squeeze_() 27 28 if flip: 29 FLIP_INDEXES = get_convert_indexes() 30 row = row[FLIP_INDEXES] 31 32 33 34 for i,phase in enumerate(row): 35 output_f.write(str(phase.item())) 36 if i < num_transducers-1: 37 output_f.write(",") 38 else: 39 output_f.write("\n") 40 41 output_f.close() 42 43 44 45def read_phases_from_file(file: str, invert:bool=True, top_board:bool=False, ignore_first_line:bool=True): 46 ''' 47 Gets phases from a csv file, expects a csv with each row being one geometry 48 :param file: The file path to read from 49 :param invert: Convert transducer order from OpenMPD -> Acoustools order. Default True 50 :param top_board: if True assumes only the top board. Default False 51 :param ignore_first_line: If true assumes header is the first line 52 :return: phases 53 ''' 54 phases_out = [] 55 line_one = True 56 with open(file, "r") as f: 57 for line in f.readlines(): 58 if ignore_first_line and line_one: 59 line_one = False 60 continue 61 phases = line.rstrip().split(",") 62 phases = [float(p) for p in phases] 63 phases = torch.tensor(phases).to(device).unsqueeze_(1) 64 phases = torch.exp(1j*phases) 65 if invert: 66 if not top_board: 67 IDX = get_convert_indexes() 68 _,INVIDX = torch.sort(IDX) 69 phases = phases[INVIDX] 70 else: 71 for i in range(16): 72 # print(torch.flipud(TOP_BOARD[i*16:(i+1)*16])) 73 phases[i*16:(i+1)*16] = torch.flipud(phases[i*16:(i+1)*16]) 74 phases_out.append(phases) 75 phases_out = torch.stack(phases_out) 76 return phases_out 77
def
write_to_file( activations: torch.Tensor, fname: str, num_frames: int, num_transducers: int = 512, flip: bool = True) -> None:
14def write_to_file(activations:Tensor,fname:str,num_frames:int, num_transducers:int=512, flip:bool=True) -> None: 15 ''' 16 Writes each hologram in `activations` to the csv `fname` in order expected by OpenMPD \n 17 :param activations: List of holograms 18 :param fname: Name of file to write to, expected to end in `.csv` 19 :param num_frames: Number of frames in `activations` 20 :param num_transducers: Number of transducers in the boards used. Default:512 21 :param flip: If True uses `get_convert_indexes` to swap order of transducers to be the same as OpenMPD expects. Default: `True` 22 ''' 23 output_f = open(fname,"w") 24 output_f.write(str(num_frames)+","+str(num_transducers)+"\n") 25 26 for row in activations: 27 row = torch.angle(row).squeeze_() 28 29 if flip: 30 FLIP_INDEXES = get_convert_indexes() 31 row = row[FLIP_INDEXES] 32 33 34 35 for i,phase in enumerate(row): 36 output_f.write(str(phase.item())) 37 if i < num_transducers-1: 38 output_f.write(",") 39 else: 40 output_f.write("\n") 41 42 output_f.close()
Writes each hologram in activations to the csv fname in order expected by OpenMPD
Parameters
- activations: List of holograms
- fname: Name of file to write to, expected to end in
.csv - num_frames: Number of frames in
activations - num_transducers: Number of transducers in the boards used. Default: 512
- flip: If True uses
get_convert_indexesto swap order of transducers to be the same as OpenMPD expects. Default:True
def
read_phases_from_file( file: str, invert: bool = True, top_board: bool = False, ignore_first_line: bool = True):
46def read_phases_from_file(file: str, invert:bool=True, top_board:bool=False, ignore_first_line:bool=True): 47 ''' 48 Gets phases from a csv file, expects a csv with each row being one geometry 49 :param file: The file path to read from 50 :param invert: Convert transducer order from OpenMPD -> Acoustools order. Default True 51 :param top_board: if True assumes only the top board. Default False 52 :param ignore_first_line: If true assumes header is the first line 53 :return: phases 54 ''' 55 phases_out = [] 56 line_one = True 57 with open(file, "r") as f: 58 for line in f.readlines(): 59 if ignore_first_line and line_one: 60 line_one = False 61 continue 62 phases = line.rstrip().split(",") 63 phases = [float(p) for p in phases] 64 phases = torch.tensor(phases).to(device).unsqueeze_(1) 65 phases = torch.exp(1j*phases) 66 if invert: 67 if not top_board: 68 IDX = get_convert_indexes() 69 _,INVIDX = torch.sort(IDX) 70 phases = phases[INVIDX] 71 else: 72 for i in range(16): 73 # print(torch.flipud(TOP_BOARD[i*16:(i+1)*16])) 74 phases[i*16:(i+1)*16] = torch.flipud(phases[i*16:(i+1)*16]) 75 phases_out.append(phases) 76 phases_out = torch.stack(phases_out) 77 return phases_out
Gets phases from a csv file, expects a csv with each row being one geometry
Parameters
- file: The file path to read from
- invert: Convert transducer order from OpenMPD -> Acoustools order. Default True
- top_board: if True assumes only the top board. Default False
- ignore_first_line: If true assumes header is the first line
Returns
phases