Source code for pyNAVIS.savers

#################################################################################
##                                                                             ##
##    Copyright C 2018  Juan P. Dominguez-Morales                              ##
##                                                                             ##
##    This file is part of pyNAVIS.                                            ##
##                                                                             ##
##    pyNAVIS is free software: you can redistribute it and/or modify          ##
##    it under the terms of the GNU General Public License as published by     ##
##    the Free Software Foundation, either version 3 of the License, or        ##
##    (at your option) any later version.                                      ##
##                                                                             ##
##    pyNAVIS is distributed in the hope that it will be useful,               ##
##    but WITHOUT ANY WARRANTY; without even the implied warranty of           ##
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the              ##
##    GNU General Public License for more details.                             ##
##                                                                             ##
##    You should have received a copy of the GNU General Public License        ##
##    along with pyNAVIS.  If not, see <http://www.gnu.org/licenses/>.         ##
##                                                                             ##
#################################################################################

import struct
import time
from .utils import Utils

[docs]class Savers:
[docs] @staticmethod def save_AEDAT(spikes_file, path, settings, verbose = False): """ Saves a SpikesFile into an AEDAT file. Parameters: spikes_file (SpikesFile): File to save. path (string): Path where the output file will be saved, including name. Extension should not be specified. settings (MainSettings): Configuration parameters for the file to save. verbose (boolean, optional): Set to True if you want the execution time of the function to be printed. Returns: None. """ if verbose == True: start_time = time.time() unpack_param = '>L' if settings.address_size == 2: unpack_param = ">H" elif settings.address_size == 4: unpack_param = ">L" with open(path + '.aedat', 'wb') as f: for i in range(len(spikes_file.addresses)): addr = struct.pack(unpack_param, int(spikes_file.addresses[i])) ts = struct.pack('>L', int(spikes_file.timestamps[i]//settings.ts_tick)) f.write(addr) f.write(ts) if verbose == True: print("AEDAT file saved correctly.Took:", time.time() - start_time, 'seconds')
[docs] @staticmethod def save_CSV(spikes_file, path, split = False, separator = ', ', verbose = False): """ Saves a SpikesFile into a CSV file where each spike is represented in one line following the same patter: "address, timestamp". Parameters: spikes_file (SpikesFile): File to save. path (string): Path where the output file will be saved, including name. Extension should not be specified. split (boolean, optional): True for generating two files (addresses and timestamps), and False for generating one with all the information. separator (string, optional): which character to use as separator between addresses and timestamps when split = False verbose (boolean, optional): Set to True if you want the execution time of the function to be printed. Returns: None. """ if verbose == True: start_time = time.time() if split == False: with open(path + '.csv', 'w') as f: for i in range(len(spikes_file.addresses)): f.write(str(spikes_file.addresses[i]) + separator + str(int(spikes_file.timestamps[i])) + "\n") else: with open(path + '_addrs.csv', 'w') as f: for addr in spikes_file.addresses: f.write(str(addr) + "\n") with open(path + '_tss.csv', 'w') as f: for ts in spikes_file.timestamps: f.write(str(int(ts)) + '\n') if verbose == True: print("CSV file saved correctly. Took:", time.time() - start_time, "seconds")
[docs] @staticmethod def save_TXT(spikes_file, path, split = True, separator = ', ', verbose = False): """ Saves a SpikesFile into two different TXT files, where addresses and timestamps are stored, respectively. Parameters: spikes_file (SpikesFile): File to save. path (string): Path where the output file will be saved, including name. Extension should not be specified. split (boolean, optional): True for generating two files (addresses and timestamps), and False for generating one with all the information. separator (string, optional): which character to use as separator between addresses and timestamps when split = False verbose (boolean, optional): Set to True if you want the execution time of the function to be printed. Returns: None. """ if verbose == True: start_time = time.time() if split == True: with open(path + '_addrs.txt', 'w') as f: for addr in spikes_file.addresses: f.write(str(addr) + '\n') with open(path + '_tss.txt', 'w') as f: for ts in spikes_file.timestamps: f.write(str(int(ts)) + '\n') else: with open(path + '.txt', 'w') as f: for i in range(len(spikes_file.addresses)): f.write(str(spikes_file.addresses[i]) + separator + str(int(spikes_file.timestamps[i])) + '\n') if verbose == True: print("TXT file saved correctly. Took:", time.time() - start_time, "seconds")
[docs] @staticmethod def save_TXT_relativeTS(spikes_file, path, split = True, separator = ', ', verbose = False): """ Saves a SpikesFile into two different TXT files, where addresses and timestamps are stored, respectively. Timestamps are relative to the previous spike. Parameters: spikes_file (SpikesFile): File to save. path (string): Path where the output file will be saved, including name. Extension should not be specified. split (boolean, optional): True for generating two files (addresses and timestamps), and False for generating one with all the information. separator (string, optional): which character to use as separator between addresses and timestamps when split = False verbose (boolean, optional): Set to True if you want the execution time of the function to be printed. Returns: None. """ spikes_file_ordered = Utils.order_timestamps(spikes_file) if verbose == True: start_time = time.time() if split == True: with open(path + '_addrs.txt', 'w') as f: for addr in spikes_file_ordered.addresses: f.write(str(addr) + '\n') with open(path + '_tss.txt', 'w') as f: for i in range(len(spikes_file_ordered.timestamps)): if i == 0: f.write(str(0) + '\n') else: f.write(str(int(spikes_file_ordered.timestamps[i]-spikes_file_ordered.timestamps[i-1])) + '\n') else: with open(path + '_relativeTS.txt', 'w') as f: for i in range(len(spikes_file.addresses)): if i == 0: f.write(str(spikes_file.addresses[i]) + separator + str(0) + '\n') else: f.write(spikes_file.addresses[i] + separator + str(int(spikes_file_ordered.timestamps[i]-spikes_file_ordered.timestamps[i-1])) + '\n') if verbose == True: print("TXT file saved correctly. Took:", time.time() - start_time, "seconds")
[docs] @staticmethod def save_as_any(spikes_file, path, output_format, settings=None): """ Saves a SpikesFile into any of the implemented Savers, depending on the output format selected. Parameters: spikes_file (SpikesFile): File to save. path (string): Path where the output file will be saved. Format should not be specified. output_format (string): Output format of the file. Currently supports '.aedat', '.csv', ".txt" and ".txt_rel". See the Savers class for more information. settings (MainSettings, optional): Configuration parameters for the output file. Only needed when saving the output as an AEDAT file. Returns: None. Raises: SettingsError: if settings are not specified and output_format refers to AEDAT. """ if output_format in ['aedat', 'AEDAT', 'AEDAT', 'AEDAT', 'Aedat', '.aedat']: if settings != None: Savers.save_AEDAT(spikes_file, path, settings) else: print('[Savers.save_as_any] > SettingsError: Settings need to be specified when saving the file as an AEDAT filea.') elif output_format in ['csv', 'CSV', '.csv']: Savers.save_CSV(spikes_file, path) elif output_format in ['txt', 'TXT', '.txt']: Savers.save_TXT(spikes_file, path) elif output_format in ['txt_rel', 'TXT_rel', '.txt_rel']: Savers.save_TXT_relativeTS(spikes_file, path)