123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- classdef KTUEAMapFile
- % UEAMAPFILE -- Defines a class that contains information on a UEA
- % electrode array using CMP files provided by Blackrock Microsystems.
- %
- % To load a CMP file type 'MapName = UEAMapFile' where MapName is the name
- % of the variable that will be created and will contain the map class.
- %
- % Example: myArrayMap = UEAMapFile;
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % METHODS:
- %
- % There are several available methods for mapfiles. Here's a list and a
- % description of what they perform.
- %
- % Electrode2Channel(Electrode):
- % Will return the Channel number corresponding to a passed Electrode.
- %
- % Channel2Electrode(Channel):
- % Will return the Electrode number corresponding to a passed Channel.
- %
- % GetChannelBankID(Channel):
- % Returns the BankID for a passed Channel.
- %
- % GetChannelPin(Channel):
- % Returns the Pin for a passed Channel.
- %
- % GetChannelLabel(Channel):
- % Returns the Label for a passed Channel.
- %
- % GenerateChannelSubplot(Channel):
- % Returns a subplot handle for the passed Channel to be used in plotting
- % UEA-like maps.
- %
- % GenerateChannelSubplotNames(Channel):
- % Plots the names of channels and electrodes on the subplot corresponding
- % to the passed Channel.
- %
- % GetChannelColumnRow(Channel):
- % Returns the Column and Row positions of the passed number that is used
- % to plot UEA-like maps.
- %
- % PlotCMP:
- % Will plot a map of the CMP Map with all the electrode and channel
- % names.
- %
- % Kian Torab
- % Blackrock Microsystems
- % ktorab@blackrockmicro.com
- %
- % Version 1.6.1.0
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % Version History
- %
- % 1.0.0.0:
- % - Initial release.
- %
- % 1.6.1.0:
- % - Minor bug fix.
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%
- properties (SetAccess = private)
- ElecNum
- ChanNum
- Column
- Row
- Bank
- Pin
- Label
- pathHandle
- fileHandle
- end
- methods (Hidden)
- function obj = KTUEAMapFile(fileName)
- if ~exist('fileName', 'var')
- if exist('getFile.m', 'file') == 2
- [obj.fileHandle obj.pathHandle] = getFile('*.cmp', 'Open a CMP Mapfile...');
- else
- [obj.fileHandle obj.pathHandle] = uigetfile('*.cmp', 'Open a CMP Mapfile...');
- end
- if ~obj.fileHandle
- disp('No file was selected.');
- return;
- end
- mapfileDataCell = importdata([obj.pathHandle obj.fileHandle], ' ', 200);
- else
- mapfileDataCell = importdata(fileName, ' ', 200);
- end
- mapfileDataCellParsed = regexp(mapfileDataCell, '\t', 'split');
- if size(mapfileDataCellParsed, 2) == 1
- mapfileDataCellParsed = regexp(mapfileDataCell, '\s+', 'split');
- end
- lastJunkIDX = 1;
- while 1
- if size(mapfileDataCellParsed{lastJunkIDX}, 2) == 6 || size(mapfileDataCellParsed{lastJunkIDX}, 2) == 5
- if ~isempty(str2num(mapfileDataCellParsed{lastJunkIDX}{1})) && ...
- ~isempty(str2num(mapfileDataCellParsed{lastJunkIDX}{2})) && ...
- ~isempty(str2num(mapfileDataCellParsed{lastJunkIDX}{4}))
- lastJunkIDX = lastJunkIDX - 1;
- break;
- end
- end
- lastJunkIDX = lastJunkIDX + 1;
- end
- mapfileDataCellParsed(1:lastJunkIDX) = [];
- for i = 1:size(mapfileDataCellParsed, 1)
- if ~all(isspace(mapfileDataCellParsed{i}))
- obj.Column(i) = str2num(mapfileDataCellParsed{i,:}{1});
- obj.Row(i) = str2num(mapfileDataCellParsed{i,:}{2});
- obj.Bank(i) = mapfileDataCellParsed{i,:}{3}-'@';
- obj.Pin(i) = str2num(mapfileDataCellParsed{i,:}{4});
- ElectNum = str2num(mapfileDataCellParsed{i,:}{5}(5:end));
- if isempty(ElectNum)
- obj.ElecNum(i) = str2num(mapfileDataCellParsed{i,:}{5}(2:end-4));
- else
- obj.ElecNum(i) = ElectNum;
- end
- obj.ChanNum(i) = (obj.Bank(i) - 1) * 32 + obj.Pin(i);
- obj.Label{i} = mapfileDataCellParsed{i,:}{5};
- end
- end
- end
- end
- methods
- function validFlag = isValid(obj)
- if ~obj.getFilename
- validFlag = 0;
- else
- validFlag = 1;
- end
- end
- function FilePath = getPathName(obj)
- FilePath = obj.pathHandle;
- end
- function FileName = getFilename(obj)
- FileName = obj.fileHandle;
- end
- function Channel = Electrode2Channel(obj, Electrode)
- if ~exist('Electrode', 'var'); disp('Electrode is a required input. Refer to help for more information.'); return; end;
- if isempty(obj.ChanNum(obj.ElecNum == Electrode(1)))
- disp('Electrode number is invalid.');
- Channel = [];
- return;
- end
- for ElecIDX = 1:length(Electrode)
- Channel(ElecIDX) = obj.ChanNum(obj.ElecNum == Electrode(ElecIDX));
- end
- end
- function Electrode = Channel2Electrode(obj, Channel)
- if isempty(obj.ElecNum(obj.ChanNum == Channel(1)))
- disp('Channel number is invalid.');
- Electrode = [];
- return;
- end
- if ~exist('Channel', 'var'); disp('Channel is a required input. Refer to help for more information.'); return; end;
- for ChanIDX = 1:length(Channel)
- Electrode(ChanIDX) = obj.ElecNum(obj.ChanNum == Channel(ChanIDX));
- end
- end
- function BankID = getChannelBankID(obj, Channel)
- BankID = obj.Bank(obj.ChanNum == Channel);
- end
- function Label = getChannelLabel(obj, Channel)
- Label = char(obj.Label{obj.ChanNum == Channel});
- end
- function Pin = getChannelPin(obj, Channel)
- Pin = obj.Pin(obj.ChanNum == Channel);
- end
- function spHandle = GenerateChannelSubplot(obj, Channel)
- if ~exist('Channel', 'var'); disp('Channel is a required input. Refer to help for more information.'); return; end;
- [x, y] = getChannelColumnRow(obj, Channel);
- spHandle=subplot('position', [x/10+0.004, y/10+0.004, 1/10-0.004, 1/10-0.004]);
- axis off;
- box on;
- set(spHandle,'XTickLabel', []);
- set(spHandle,'YTickLabel', []);
- %%
- end
- function GenerateChannelSubplotNames(obj, Channel, fColor)
- if ~exist('Channel', 'var'); disp('Channel is a required input. Refer to help for more information.'); return; end;
- if ~exist('fColor', 'var'); fColor = [1,1,1]; end
- Electrode = Channel2Electrode(obj, Channel);
- text(0.13, 0.23, ['elec ', num2str(Electrode)], 'Color', fColor, 'FontSize', 8);
- text(0.13, 0.10, ['chan ', num2str(Channel)], 'Color', fColor, 'FontSize', 8);
- end
- function [x, y] = getChannelColumnRow(obj, Channel)
- if ~exist('Channel', 'var'); disp('Channel is a required input. Refer to help for more information.'); return; end;
- x = obj.Column(obj.ChanNum == Channel);
- y = obj.Row(obj.ChanNum == Channel);
- end
- function PlotCMP(obj)
- figure;
- for Channel = 1:96
- GenerateChannelSubplot(obj, Channel);
- GenerateChannelSubplotNames(obj, Channel, [0,0,0]);
- end
- end
- function setAxisBackgroundColor(~, curColor)
- if isa(curColor, 'double') && (length(curColor) == 3)
- if all(curColor <= 1) && all(curColor >= 0)
- set(gca, 'Color', curColor);
- else
- disp('The color values have to be between 0 and 1.');
- end
- elseif isa(curColor, 'char')
- try
- set(gca, 'Color', curColor);
- catch
- disp('Color is not valid. Type ''doc color'' for more information.');
- end
- else
- disp('The input needs to be a valid color input.');
- disp('A valid color input is a vector of length 3 of values between 0 and 1.');
- end
- end
- function setXAxisColor(~, curColor)
- if isa(curColor, 'double') && (length(curColor) == 3)
- if all(curColor <= 1) && all(curColor >= 0)
- set(gca, 'XColor', curColor);
- else
- disp('The color values have to be between 0 and 1.');
- end
- elseif isa(curColor, 'char')
- try
- set(gca, 'XColor', curColor);
- catch
- disp('Color is not valid. Type ''doc color'' for more information.');
- end
- else
- disp('The input needs to be a valid color input.');
- disp('A valid color input is a vector of length 3 of values between 0 and 1.');
- end
- end
- function setYAxisColor(~, curColor)
- if isa(curColor, 'double') && (length(curColor) == 3)
- if all(curColor <= 1) && all(curColor >= 0)
- set(gca, 'YColor', curColor);
- else
- disp('The color values have to be between 0 and 1.');
- end
- elseif isa(curColor, 'char')
- try
- set(gca, 'YColor', curColor);
- catch
- disp('Color is not valid. Type ''doc color'' for more information.');
- end
- else
- disp('The input needs to be a valid color input.');
- disp('A valid color input is a vector of length 3 of values between 0 and 1.');
- end
- end
- function setAxesColor(~, curColor)
- if isa(curColor, 'double') && (length(curColor) == 3)
- if all(curColor <= 1) && all(curColor >= 0)
- set(gca, 'YColor', curColor);
- set(gca, 'XColor', curColor);
- else
- disp('The color values have to be between 0 and 1.');
- end
- elseif isa(curColor, 'char')
- try
- set(gca, 'YColor', curColor);
- set(gca, 'XColor', curColor);
- catch
- disp('Color is not valid. Type ''doc color'' for more information.');
- end
- else
- disp('The input needs to be a valid color input.');
- disp('A valid color input is a vector of length 3 of values between 0 and 1.');
- end
- end
- end
- end
|