block_evolution.m 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. %% Evolution Analysis
  2. %This script analyses the evolution of firing activity over the course of
  3. %the two blocks
  4. %% Clear and load
  5. % clearvars;
  6. % close all;
  7. load('RAWintBlocks.mat');
  8. RAW=RAWblocks;
  9. %% Generate spike rates per trial (Takes some time)
  10. events = {'Cue';'PECue';'RD'};
  11. event_intervals = [0. 0.5;
  12. -0.5 0.5;
  13. 0.75 1.95];
  14. base_intervals = [-11. -1.;
  15. -11. -1.;
  16. -11. -1.]; %all relative to cue
  17. RD1 = strcmp('RD1',RAW(1).Einfo(:,2));
  18. RD2 = strcmp('RD2',RAW(1).Einfo(:,2));
  19. Cue = strcmp('Cue',RAW(1).Einfo(:,2));
  20. num_trials = 60;
  21. num_neurons = 0;
  22. for session = 1:length(RAW)
  23. num_neurons = num_neurons + length(RAW(session).Nrast);
  24. end
  25. trial_info(num_neurons).blocks = [];
  26. for event = 1:length(events)
  27. counter = 1;
  28. neuron_spike_rate = zeros(num_neurons,num_trials);
  29. baseline_spike_rate = zeros(num_neurons,num_trials);
  30. for session = 1:length(RAW)
  31. event_index = strcmp(events{event,1},RAW(session).Einfo(:,2));
  32. event_onsets = RAW(session).Erast{event_index, 1};
  33. baseline_onsets = RAW(session).Erast{Cue, 1};
  34. if event == 2 % PECue
  35. RD_onsets = RAW(session).Erast{strcmp('RD',RAW(session).Einfo(:,2)), 1};
  36. index = zeros(length(event_onsets),1);
  37. for i = 1:length(event_onsets)
  38. index(i) = any(abs(RD_onsets-event_onsets(i))<2);
  39. end
  40. event_onsets = event_onsets(logical(index));
  41. end
  42. intervals = event_onsets + event_intervals(event,:);
  43. baseline_intervals = baseline_onsets + base_intervals(event,:);
  44. for neuron = 1:length(RAW(session).Nrast)
  45. spike_times = RAW(session).Nrast{neuron,1};
  46. spike_count = NaN(num_trials,1);
  47. baseline_count = NaN(num_trials,1);
  48. for interval = 1:length(intervals)
  49. spike_count(interval,1) = sum(spike_times>=intervals(interval,1) & ...
  50. spike_times<=intervals(interval,2));
  51. end
  52. for interval = 1:length(baseline_intervals)
  53. baseline_count(interval,1) = sum(spike_times>=baseline_intervals(interval,1) & ...
  54. spike_times<=baseline_intervals(interval,2));
  55. end
  56. neuron_spike_rate(counter,:) = spike_count'./(event_intervals(event,2)-event_intervals(event,1));
  57. baseline_spike_rate(counter,:) = baseline_count'./(base_intervals(event,2)-base_intervals(event,1));
  58. name = RAW(session).Ninfo{neuron,1};
  59. if event == 1 % On the first pass make the trial info struct
  60. if name(5) == 'n'
  61. trial_info(counter).blocks = 0;
  62. else
  63. trial_info(counter).blocks = str2double(name(5));
  64. end
  65. trial_info(counter).session = session;
  66. trial_info(counter).RD_suc = length(RAW(session).Erast{RD1});
  67. trial_info(counter).RD_mal = length(RAW(session).Erast{RD2});
  68. trial_info(counter).area = name(1:2);
  69. reward_times = sortrows([RAW(session).Erast{RD1},ones(length(RAW(session).Erast{RD1}),1);
  70. RAW(session).Erast{RD2},zeros(length(RAW(session).Erast{RD2}),1)],1);
  71. trial_info(counter).current_reward = reward_times(:,2);
  72. % Find previous rewards for cues:
  73. cue_times = RAW(session).Erast{Cue}(2:end);
  74. cue_previous_reward = zeros(length(cue_times),1);
  75. for cue = 1:length(cue_times)
  76. [~,index] = max(reward_times(reward_times(:,1) < cue_times(cue),1)); %index of most recent reward consumed
  77. if isempty(index)
  78. cue_previous_reward(cue,1) = NaN;
  79. else
  80. cue_previous_reward(cue,1) = reward_times(index,2);
  81. end
  82. end
  83. trial_info(counter).cue_previous_reward = cue_previous_reward;
  84. end
  85. counter = counter + 1;
  86. end
  87. end
  88. baseline_mean = nanmean(baseline_spike_rate,2);
  89. baseline_std = nanstd(baseline_spike_rate,0,2);
  90. events{event, 2} = (neuron_spike_rate-baseline_mean)./baseline_std; %z-score
  91. events{event, 3} = (neuron_spike_rate-baseline_mean); %just baseline substracted for linear models
  92. events{event, 4} = (neuron_spike_rate-baseline_mean)./(max(neuron_spike_rate,[],2)-min(neuron_spike_rate,[],2)); %baseline subtracted and normalized to total range
  93. end
  94. %% Define responsive logical vectors
  95. interspersed = [trial_info.blocks]' == 0;
  96. blocks1 = [trial_info.blocks]' == 1;
  97. blocks2 = [trial_info.blocks]' == 2;
  98. area_vectors = [strcmp({trial_info.area},'NA')',strcmp({trial_info.area},'VP')'];
  99. blocks_vectors = [[trial_info.blocks]'==0,[trial_info.blocks]'>0]; %Interspersed, blocks
  100. session_type = {interspersed,blocks1,blocks2};
  101. session_titles = {'Interspersed','Sucrose First','Malt First'};
  102. %% five samplings of 3 trials, equally space through each block of rewards
  103. fives = NaN(num_neurons,10);
  104. for event = 1:size(events,1)
  105. for neuron = 1:num_neurons
  106. trial_firing = events{event,2}(neuron,:); % Pull up the trial by trial firing
  107. trial_firing = trial_firing(~isnan(trial_firing)); % Remove any NaN values
  108. first1 = 1;
  109. last2 = length(trial_firing);
  110. switch trial_info(neuron).blocks
  111. case 0 % Interspersed
  112. suc_trials = find(trial_info(neuron).current_reward == 1);
  113. malt_trials = find(trial_info(neuron).current_reward == 0);
  114. suc_first = suc_trials(1:3);
  115. suc_quarter = ceil(length(suc_trials)/4);
  116. suc_second = suc_trials(suc_quarter-1:suc_quarter+1);
  117. suc_center = ceil(length(suc_trials)/2);
  118. suc_mid = suc_trials(suc_center-1:suc_center+1);
  119. suc_3rdquarter = ceil(3*length(suc_trials)/4);
  120. suc_fourth = suc_trials(suc_3rdquarter-1:suc_3rdquarter+1);
  121. suc_last = suc_trials(end-2:end);
  122. malt_first = malt_trials(1:3);
  123. malt_quarter = ceil(length(malt_trials)/4);
  124. malt_second = malt_trials(malt_quarter-1:malt_quarter+1);
  125. malt_center = ceil(length(malt_trials)/2);
  126. malt_mid = malt_trials(malt_center-1:malt_center+1);
  127. malt_3rdquarter = ceil(3*length(malt_trials)/4);
  128. malt_fourth = malt_trials(malt_3rdquarter-1:malt_3rdquarter+1);
  129. malt_last = malt_trials(end-2:end);
  130. slices = [suc_first';malt_first';suc_second';malt_second';suc_mid';malt_mid';suc_fourth';malt_fourth';suc_last';malt_last'];
  131. case 1 % Suc first
  132. first2 = trial_info(neuron).RD_suc+1;
  133. last1 = first2-1;
  134. mid1 = ceil((last1-first1)/2)+first1;
  135. mid2 = ceil((last2-first2)/2)+first2;
  136. second1 = ceil((last1-first1)/4)+first1;
  137. second2 = ceil((last2-first2)/4)+first2;
  138. fourth1 = ceil(3*(last1-first1)/4)+first1;
  139. fourth2 = ceil(3*(last2-first2)/4)+first2;
  140. slices = [first1:first1+2;...
  141. second1-1:second1+1;...
  142. mid1-1:mid1+1;...
  143. fourth1-1:fourth1+1;...
  144. last1-2:last1;...
  145. first2:first2+2;...
  146. second2-1:second2+1;...
  147. mid2-1:mid2+1;...
  148. fourth2-1:fourth2+1;...
  149. last2-2:last2];
  150. case 2 % Malt first
  151. first2 = trial_info(neuron).RD_mal+1;
  152. last1 = first2-1;
  153. mid1 = ceil((last1-first1)/2)+first1;
  154. mid2 = ceil((last2-first2)/2)+first2;
  155. second1 = ceil((last1-first1)/4)+first1;
  156. second2 = ceil((last2-first2)/4)+first2;
  157. fourth1 = ceil(3*(last1-first1)/4)+first1;
  158. fourth2 = ceil(3*(last2-first2)/4)+first2;
  159. slices = [first1:first1+2;...
  160. second1-1:second1+1;...
  161. mid1-1:mid1+1;...
  162. fourth1-1:fourth1+1;...
  163. last1-2:last1;...
  164. first2:first2+2;...
  165. second2-1:second2+1;...
  166. mid2-1:mid2+1;...
  167. fourth2-1:fourth2+1;...
  168. last2-2:last2];
  169. end
  170. for slice = 1:size(slices,1)
  171. fives(neuron,slice) = mean(trial_firing(slices(slice,:)));
  172. end
  173. end
  174. events{event,5} = fives; %Just finished changing fives here
  175. end
  176. save('evolution_data.mat','events')
  177. save('evolution_info.mat','trial_info')
  178. disp('done')