-
Notifications
You must be signed in to change notification settings - Fork 58
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
***** NPMK Version 4.4.1.0 August 31, 2016 *****
splitNSxPauses: 1.0.0.0: August 31, 2016 - Initial release. - Successor to separateNSxPaused running much more memory efficient. separateNSxPaused: This function is obsoleted. Use splitNSxPauses instead.
- Loading branch information
Kian Torab
committed
Aug 31, 2016
1 parent
5174633
commit ee11a73
Showing
3 changed files
with
146 additions
and
86 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,89 +1,8 @@ | ||
function separatePausedNSx(varargin) | ||
|
||
% separatePausedNsx Saves paused data segments from a single NSx file | ||
% as individual NSx files | ||
% | ||
% separatePausedNSx(FILENAME) where FILENAME has N paused segments | ||
% will create N individual files with the same extension named | ||
% FILENAME-1, FILENAME-2, ..., FILENAME-N. | ||
% | ||
% separatePausedFiles without any input arguments opens a UIgetfile to | ||
% select the NSx file to separate | ||
% | ||
% Brett Dowden | ||
% [email protected] | ||
% Nick Halper | ||
% [email protected] | ||
% Blackrock Microsystems | ||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
% Version History | ||
% | ||
% 1.0.0.0: Initial release | ||
% | ||
% 1.1.0.0: | ||
% - Fixed a broken function that dependent on a non-existant saveNEV | ||
% script. | ||
% | ||
% 1.2.0.0: | ||
% - Corrected NSx_out.MetaTags.Filename = | ||
% [NSx.MetaTags.Filename(1:end) '-p' sprintf('%03d', i) | ||
% NSx.MetaTags.FileExt] which was incorrectly removing the last 4 | ||
% characters of the filename in an attempt to remove the extension. | ||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
% separatePausedNsx Obsoleted. Use splitNSxPauses instead. | ||
|
||
% Since openNSx checks input parameters for file validity and for no input | ||
% argument case, just pass varargin to openNSx | ||
NSx = openNSx('read',varargin{:}); | ||
disp('This function is obsoleted.') | ||
disp('Use splitNSxPauses instead.'); | ||
|
||
% Check to see if there were pauses in the file. If so, save the sections | ||
% as individual files, if not just report that to the user and end function | ||
if length(NSx.MetaTags.Timestamp) == 1 | ||
disp('No pauses in data file. No action taken'); | ||
else | ||
for i = 1 : length(NSx.MetaTags.Timestamp) | ||
% create a copy of NSx, except with only one data segment and the | ||
% corresponding Timestamp, DataPoints, and NumofPacket fields | ||
NSx_out.MetaTags = NSx.MetaTags; | ||
NSx_out.MetaTags.Timestamp = NSx.MetaTags.Timestamp(i); | ||
NSx_out.MetaTags.DataPoints = NSx.MetaTags.DataPoints(i); | ||
NSx_out.MetaTags.NumofPackets = NSx.MetaTags.DataPoints(i); | ||
|
||
NSx_out.ElectrodesInfo = NSx.ElectrodesInfo; | ||
|
||
NSx_out.Data = NSx.Data{i}; | ||
NSx_out.RawData.Headers = NSx.RawData.Headers; | ||
%Data headers are only 9 bytes, so only check for the correct, | ||
%respective 9 bytes | ||
NSx_out.RawData.DataHeader = NSx.RawData.DataHeader(1+(9*(i-1)):9+(9*(i-1))); | ||
|
||
% Create enumerated file name | ||
NSx_out.MetaTags.Filename = [NSx.MetaTags.Filename(1:end) '-p' sprintf('%03d', i) NSx.MetaTags.FileExt]; | ||
disp('Opening the original file...'); | ||
|
||
|
||
% Check for filename existence | ||
newFilename = fullfile(NSx.MetaTags.FilePath, NSx_out.MetaTags.Filename); | ||
if exist(newFilename, 'file') == 2 | ||
overwriteFlag = input('The file already exists. Overwrite? ', 's'); | ||
if ~strcmpi(overwriteFlag, 'y') | ||
return; | ||
end | ||
end | ||
|
||
|
||
% Create new file | ||
FIDw = fopen(newFilename, 'w+', 'ieee-le'); | ||
|
||
|
||
% Writing the header information | ||
fwrite(FIDw, NSx_out.RawData.Headers, 'uint8'); | ||
fwrite(FIDw, NSx_out.RawData.DataHeader, 'uint8'); | ||
|
||
|
||
% Writing data into file | ||
disp('Writing into the new file...'); | ||
fwrite(FIDw, NSx_out.Data, 'int16'); | ||
fclose(FIDw); | ||
end | ||
clear all; | ||
end | ||
splitNSxPauses; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
function splitNSxPauses(fileName) | ||
|
||
% splitNSxPauses | ||
% | ||
% Opens and splits an NSx file in smaller pieces, timewise. | ||
% | ||
% Use splitNSx(fileName) | ||
% | ||
% All input arguments are optional. Input arguments can be in any order. | ||
% | ||
% fileName: File name of the file that needs to be split. | ||
% DEFAULT: The user will be prompted to select a file. | ||
% | ||
% Example 1: | ||
% splitNSx('C:\Datafolder\mydata.ns5'); | ||
% | ||
% In the example above, the file C:\Datafolder\mydata.ns5 will be opened. | ||
% The loaded file will be split in samller files representing its paused | ||
% sub-segments. | ||
% | ||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
% Kian Torab | ||
% [email protected] | ||
% Blackrock Microsystems | ||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
|
||
% Version History | ||
% | ||
% 1.0.0.0: August 31, 2016 | ||
% - Initial release. | ||
% - Successor to separateNSxPaused running much more memory efficient. | ||
% | ||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
|
||
%% Getting the file name | ||
if ~exist('fileName', 'var') | ||
fileName = ''; | ||
end | ||
|
||
if ~(exist(fileName, 'file') == 2) | ||
if ~ismac | ||
[fname, path] = getFile('*.ns*', 'Choose an NSx file...'); | ||
else | ||
[fname, path] = getFile('*.*', 'Choose an NSx file...'); | ||
end | ||
if fname == 0 | ||
disp('No file was selected.'); | ||
if nargout | ||
clear variables; | ||
end | ||
return; | ||
end | ||
fext = fname(end-3:end); | ||
else | ||
[path, fname, fext] = fileparts(fileName); | ||
if ismac path = [path '/']; else path = [path '\']; end | ||
fname = [fname fext]; | ||
end | ||
|
||
%% Getting header information | ||
NSx = openNSx('noread', [path fname ]); | ||
|
||
% Loading the file | ||
%% Reading Basic Header from file into NSx structure. | ||
FID = fopen([path fname], 'r', 'ieee-le'); | ||
NSx.MetaTags.Filename = fname; | ||
NSx.MetaTags.FilePath = path(1:end-1); | ||
NSx.MetaTags.FileExt = fext; | ||
NSx.MetaTags.FileTypeID = fread(FID, [1,8] , '*char'); | ||
if strcmpi(NSx.MetaTags.FileTypeID, 'NEURALSG') | ||
disp('File type 2.1 is not yet implemented.'); | ||
%NOT IMPLEMENTED YET | ||
% fseek(FID, 0, 'bof'); | ||
% header = fread(FID, 314,'*uint8'); | ||
% positionEOH = ftell(FID); | ||
% fseek(FID, 0, 'eof'); | ||
% positionEOD = ftell(FID); | ||
% dataLength = positionEOD - positionEOH; | ||
% fseek(FID, 28, 'bof'); | ||
% channelCount = fread(FID, 1 , 'uint32=>double'); | ||
elseif strcmpi(NSx.MetaTags.FileTypeID, 'NEURALCD') | ||
% Calculating different points in the file | ||
fseek(FID, 0, 'bof'); | ||
basicHeader = fread(FID, 314, '*uint8'); | ||
positionEOE = typecast(basicHeader(11:14), 'uint32'); | ||
fseek(FID, 0, 'eof'); | ||
positionEOD = ftell(FID); | ||
% Calculating channelCount, data Length | ||
channelCount = typecast(basicHeader(311:314), 'uint32'); | ||
dataLength = positionEOD - positionEOE - 9; | ||
% Reading the number of packets | ||
fseek(FID, 28, 'bof'); | ||
numOfPackets = (dataLength)/(2*channelCount); | ||
% Calculating the number of splits | ||
splitCount = length(NSx.MetaTags.Timestamp); | ||
% Calculating the number of bytes in each segment | ||
segmentBytes = NSx.MetaTags.DataPoints * 2 * double(channelCount); | ||
% Reading the headers and the data header | ||
fseek(FID, 0, 'bof'); | ||
fileHeader = fread(FID, positionEOE, 'char'); | ||
dataHeader = fread(FID, 9, 'char'); | ||
fseek(FID, positionEOE, 'bof'); | ||
disp(['Splitting the NSx file in ' num2str(splitCount) ' pieces...']); | ||
for idx = 1:splitCount | ||
% Opening a file for saving | ||
FIDw = fopen([path fname(1:end-4) '-s' sprintf('%03d', idx) fname(end-3:end)], 'w+', 'ieee-le'); | ||
fprintf('\nReading segment %d... ', idx); | ||
% Reading the segment | ||
fseek(FID, 9, 'cof'); % Skipping the data header | ||
dataSegment = fread(FID, segmentBytes(idx), 'char'); | ||
fprintf('Writing segment %d... ', idx); | ||
% Writing the segmented data into file | ||
fwrite(FIDw, fileHeader, 'char'); | ||
% Set the timestamp of the segments 2+ to 0 so there's no | ||
% introduced shift by openNSx. | ||
if idx > 1 | ||
dataHeader(2:5) = 0; | ||
end | ||
fwrite(FIDw, dataHeader, 'char'); | ||
fwrite(FIDw, dataSegment, 'char'); | ||
% Clearing variables and closing file | ||
clear dataSegment; | ||
fclose(FIDw); | ||
end | ||
fprintf('\n'); | ||
else | ||
% Display error if non-compatible file is trying to open. | ||
disp('This version of splitNSx can only split File Specs 2.2 and 2.3'); | ||
disp(['The selected file spec is ' NSx.MetaTags.FileSpec '.']); | ||
fclose(FID); | ||
clear variables; | ||
return; | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters