Pārlūkot izejas kodu

Fixed waveformsMean empty array bug

dervinism 1 gadu atpakaļ
vecāks
revīzija
97a1b796dc
4 mainītis faili ar 27 papildinājumiem un 31 dzēšanām
  1. 15 5
      convert2nwb.m
  2. 5 5
      nwbAnimalParams.m
  3. 2 2
      nwbParams.m
  4. 5 19
      nwbSessionParams.m

+ 15 - 5
convert2nwb.m

@@ -103,9 +103,9 @@ for iSess = 1:numel(sessionID)
     waveformsProbe1.maxWaveforms = [];
   end
   if probeInserted{iSess}{1} && ~isempty(spikes)
-    [waveformMat1, waveformVecGrp1, waveformVec1, waveformMeans1] = reshapeWaveforms(waveformsProbe1, 1, metadata, nCh{iSess}{1});
+    [waveformMat1, waveformVecGrp1, waveformVec1, waveformMeans1, nWaveformSamples1] = reshapeWaveforms(waveformsProbe1, 1, metadata, nCh{iSess}{1});
   else
-    waveformMat1 = []; waveformVecGrp1 = {}; waveformVec1 = {}; waveformMeans1 = {};
+    waveformMat1 = []; waveformVecGrp1 = {}; waveformVec1 = {}; waveformMeans1 = {}; nWaveformSamples1 = 0;
   end
   waveformsFile2 = [electrodeFolder{iSess}{2} filesep 'waveforms.mat'];
   if exist(waveformsFile2, 'file')
@@ -115,14 +115,20 @@ for iSess = 1:numel(sessionID)
     waveformsProbe2.maxWaveforms = [];
   end
   if probeInserted{iSess}{2} && ~isempty(spikes)
-    [waveformMat2, waveformVecGrp2, waveformVec2, waveformMeans2] = reshapeWaveforms(waveformsProbe2, 2, metadata, nCh{iSess}{2});
+    [waveformMat2, waveformVecGrp2, waveformVec2, waveformMeans2, nWaveformSamples2] = reshapeWaveforms(waveformsProbe2, 2, metadata, nCh{iSess}{2});
   else
-    waveformMat2 = []; waveformVecGrp2 = {}; waveformVec2 = {}; waveformMeans2 = {};
+    waveformMat2 = []; waveformVecGrp2 = {}; waveformVec2 = {}; waveformMeans2 = {}; nWaveformSamples2 = 0;
   end
   maxWaveforms = [waveformsProbe1.maxWaveforms; waveformsProbe2.maxWaveforms];
   waveformMat = [waveformMat1; waveformMat2];
   waveformVec = [waveformVec1; waveformVec2];
   waveformMeans = [waveformMeans1; waveformMeans2];
+  nWaveformSamples = max([nWaveformSamples1 nWaveformSamples2]);
+  for iWave = 1:numel(waveformMeans)
+    if isempty(waveformMeans{iWave})
+      waveformMeans{iWave} = nan(1,nWaveformSamples);
+    end
+  end
   
   % Create waveform indices
   % These indices are not used as our waveform array has a different form and meaning than the one used in the NWB file.
@@ -630,7 +636,7 @@ else
 end
 end
 
-function [reshapedWaveformsMat, reshapedWaveformsVecGrp, reshapedWaveformsVec, waveformsMean] = reshapeWaveforms(waveforms, iEl, metadata, nCh)
+function [reshapedWaveformsMat, reshapedWaveformsVecGrp, reshapedWaveformsVec, waveformsMean, nWaveformSamples] = reshapeWaveforms(waveforms, iEl, metadata, nCh)
 % [reshapedWaveformsMat, reshapedWaveformsVecGrp, reshapedWaveformsVec, waveformsMean] = reshapeWaveforms(waveforms, iEl, metadata)
 %
 % Function extracts relevant waveform information and reshapes the waveform
@@ -664,6 +670,10 @@ function [reshapedWaveformsMat, reshapedWaveformsVecGrp, reshapedWaveformsVec, w
 %                                number of recording channels.
 %         waveformsMean - waveforms.waveforms converted into a cell column
 %                         array. MUAs are NaNs.
+%         nWaveformSamples - a total number of data sample points forming a
+%                            single waveform.
+
+nWaveformSamples = size(waveforms.maxWaveforms,2);
 
 if isfield(waveforms, 'waveforms')
   reshapedWaveformsMat = zeros(size(waveforms.waveforms,1)*size(waveforms.waveforms,3),size(waveforms.waveforms,2));

+ 5 - 5
nwbAnimalParams.m

@@ -7,18 +7,18 @@
 %   weight
 %   description
 
-animalID = 'M190114_A_MD';
-dob = '20181104'; % yyyymmdd
+animalID = 'M200324_MD';
+dob = '20200206'; % yyyymmdd
 dob = datetime(str2double(dob(1:4)), str2double(dob(5:6)), str2double(dob(7:8))); % Convert to datetime format
-firstProcedureDate = '20190114'; % yyyymmdd
+firstProcedureDate = '20200324'; % yyyymmdd
 firstProcedureDate = datetime(str2double(firstProcedureDate(1:4)), str2double(firstProcedureDate(5:6)), str2double(firstProcedureDate(7:8)));
 ageInDays = floor(etime(datevec(firstProcedureDate),datevec(dob))/(3600*24));
 age = ['P' num2str(ageInDays) 'D']; % Convert to ISO8601 format: https://en.wikipedia.org/wiki/ISO_8601#Durations
 strain = 'C57BL/6J';
 sex = 'M';
 species = 'Mus musculus';
-weight = 24.2;
-description = '002'; % Animal testing order.
+weight = [];
+description = '025'; % Animal testing order.
 animalRawDataFolder = [rawDataFolder filesep animalID]; % Raw and certain derived data for the animal. Probe map and unit waveforms files are stored here.
 animalDerivedDataFile = [derivedDataFolder filesep animalID filesep animalID '.mat']; % Spiking, behavioural, and certain analysis data produced after running analyses routines on the Neuroscience Gateway Portal are stored here in a single mat file.
 animalDerivedDataFolderNWB = [derivedDataFolderNWB filesep animalID]; % The output folder: The location where derived data after converting to the NWB format is stored.

+ 2 - 2
nwbParams.m

@@ -7,11 +7,11 @@ experimenter = 'Martynas Dervinis';
 institution = 'University of Leicester';
 publications = {};
 lab = 'Michael Okun lab';
-dataset = 'neuronexus';
+dataset = 'neuropixels';
 videoFrameRate = 25; % Hz
 
 % Find the repository root folder
-rootFolderName = 'convert2nwbMatNnx';
+rootFolderName = 'convert2nwbMatNpx';
 cfd = mfilename('fullpath');
 startInd = strfind(cfd, rootFolderName);
 rootFolder = cfd(1:startInd+numel(rootFolderName)-1);

+ 5 - 19
nwbSessionParams.m

@@ -33,20 +33,15 @@ for iSess = 1:numel(sessionID)
     if ~exist(electrodeFolder{iSess}{ref}, 'file') % in case a probe is missing
       electrodeFolder{iSess}{ref} = electrodeFolder{iSess}{ref}(1:end-1);
     end
-    if contains(electrodeName{iSess}{ref}, 'neuropixels', 'IgnoreCase',true)
-      electrodeMap = [electrodeFolder{iSess}{ref} filesep 'forPRB_Neuropixels.mat'];
-    else
-      electrodeMap = [electrodeFolder{iSess}{ref} filesep 'forPRB_' electrodeName{iSess}{ref} '.mat'];
-    end
-    load(electrodeMap, 'ycoords');
+    electrodeMap = [electrodeFolder{iSess}{ref} filesep 'forPRB_' electrodeName{iSess}{ref} '.mat'];
     nShanks{iSess}{ref} = 1;
     nChannelsPerShank{iSess}{ref} = 16;
-    nChannelsPerShank{iSess}{ref} = min([numel(ycoords) nChannelsPerShank{iSess}{ref}]);
     nCh{iSess}{ref} = nChannelsPerShank{iSess}{ref}*nShanks{iSess}{ref}; % total number of probe channels
     areas = {'S1'}; % brain areas that this probe spans
     electrodeLocation{iSess}{ref} = electrodeLocations(areas, endCh{iSess}{ref}, nCh{iSess}{ref}); % Brain area assigned to each recording channel.
     electrodeCoordinates{iSess}{ref} = [-1.8, -2.5, 0]; % Electrode insertion location on the cortical surface in Paxinos coords: AP (posterior negative), ML (left negative), DV (recording site position starting with the tip of the probe.
     electrodeCoordinates{iSess}{ref} = repmat(electrodeCoordinates{iSess}{ref}, nCh{iSess}{ref}, 1); % Coordinates of each probe recording channel (the probe rotation angle is not taken into account). Y coordinates are relative to the tip of the probe.
+    load(electrodeMap, 'ycoords');
     if size(ycoords,1) == 1
       electrodeCoordinates{iSess}{ref}(:,3) = ycoords(1:nCh{iSess}{ref})'./1000;
     else
@@ -82,31 +77,22 @@ for iSess = 1:numel(sessionID)
     if ~exist(electrodeFolder{iSess}{ref}, 'file') % in case a probe is missing
       electrodeFolder{iSess}{ref} = electrodeFolder{iSess}{ref}(1:end-1);
     end
-    if strcmpi(electrodeFolder{iSess}{1}, electrodeFolder{iSess}{2})
-      probeInserted{iSess}{ref} = false;
-      continue
-    end
-    if contains(electrodeName{iSess}{ref}, 'neuropixels', 'IgnoreCase',true)
-      electrodeMap = [electrodeFolder{iSess}{ref} filesep 'forPRB_Neuropixels.mat'];
-    else
-      electrodeMap = [electrodeFolder{iSess}{ref} filesep 'forPRB_' electrodeName{iSess}{ref} '.mat'];
-    end
-    load(electrodeMap, 'ycoords');
+    electrodeMap = [electrodeFolder{iSess}{ref} filesep 'forPRB_' electrodeName{iSess}{ref} '.mat'];
     nShanks{iSess}{ref} = 1;
     nChannelsPerShank{iSess}{ref} = 32;
-    nChannelsPerShank{iSess}{ref} = min([numel(ycoords) nChannelsPerShank{iSess}{ref}]);
     nCh{iSess}{ref} = nChannelsPerShank{iSess}{ref}*nShanks{iSess}{ref};
     areas = {'Po','LP','DG','CA1','RSC'};
     electrodeLocation{iSess}{ref} = electrodeLocations(areas, endCh{iSess}{ref}, nCh{iSess}{ref});
     electrodeCoordinates{iSess}{ref} = [-1.8, -0.5, 0];
     electrodeCoordinates{iSess}{ref} = repmat(electrodeCoordinates{iSess}{ref}, nCh{iSess}{ref}, 1);
+    load(electrodeMap, 'ycoords');
     if size(ycoords,1) == 1
       electrodeCoordinates{iSess}{ref}(:,3) = ycoords(1:nCh{iSess}{ref})'./1000;
     else
       electrodeCoordinates{iSess}{ref}(:,3) = ycoords(1:nCh{iSess}{ref})./1000;
     end
     electrodeLabel{iSess}{ref} = ['probe' num2str(ref)];
-    electrodeImplantationType{iSess}{ref} = 'acute';
+    electrodeImplantationType{iSess}{ref} = 'chronic';
   else % The case when the probe #2 is missing
     electrodeName{iSess}{ref} = []; %#ok<*UNRCH>
     electrodeDescription{iSess}{ref} = [];