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_indexes to 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