create plot showing the ams...
as arising from foreign and self generated chirps
This commit is contained in:
		
							parent
							
								
									96ebd10f2f
								
							
						
					
					
						commit
						83969d2a04
					
				
							
								
								
									
										122
									
								
								chirp_ams.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								chirp_ams.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | |||||||
|  | import numpy as np  | ||||||
|  | import scipy.signal as sig  | ||||||
|  | import matplotlib.pyplot as plt | ||||||
|  | 
 | ||||||
|  | from chirp_stimulation import create_chirp | ||||||
|  | from IPython import embed | ||||||
|  | 
 | ||||||
|  | def despine(axis, spines=None, hide_ticks=True): | ||||||
|  | 
 | ||||||
|  |     def hide_spine(spine): | ||||||
|  |         spine.set_visible(False) | ||||||
|  | 
 | ||||||
|  |     for spine in axis.spines.keys(): | ||||||
|  |         if spines is not None: | ||||||
|  |             if spine in spines: | ||||||
|  |                 hide_spine(axis.spines[spine]) | ||||||
|  |         else: | ||||||
|  |             hide_spine(axis.spines[spine]) | ||||||
|  |     if hide_ticks: | ||||||
|  |         axis.xaxis.set_ticks([]) | ||||||
|  |         axis.yaxis.set_ticks([]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_signals(eodfs, condition, contrast, c_size, c_duration, c_ampl_dip, chirp_times, duration, dt): | ||||||
|  |     if not isinstance(condition, str) or ("self" not in condition and "other" not in condition): | ||||||
|  |         raise ValueError("Condition argument must be either 'self' or 'other'!") | ||||||
|  |     if not isinstance(eodfs, dict) or (not "self" in eodfs.keys() or not "other" in eodfs.keys()): | ||||||
|  |         raise ValueError("EOFs must be a dict containing 'self' and 'other' fish's eod frequency!") | ||||||
|  |      | ||||||
|  |     time = np.arange(0.0, duration, dt) | ||||||
|  |     non_chirper_freq = eodfs["self"] if condition == "other" else eodfs["other"] | ||||||
|  |     non_chirper_signal = np.sin(non_chirper_freq * time * 2 * np.pi) | ||||||
|  |     non_chirper_freq_profile = np.ones(time.shape) * non_chirper_freq | ||||||
|  |      | ||||||
|  |     chirper_freq = eodfs["other"] if condition == "other" else eodfs["self"] | ||||||
|  |     _, chirper_signal, _, chirper_freq_profile = create_chirp(eodf=chirper_freq, chirpsize=c_size, chirpduration=c_duration, | ||||||
|  |                                                               ampl_reduction=c_ampl_dip, chirptimes=chirp_times, duration=duration, dt=dt) | ||||||
|  |      | ||||||
|  |     other_ampl = contrast/100 | ||||||
|  |     if condition == "self": | ||||||
|  |         self_signal = chirper_signal | ||||||
|  |         self_freq = chirper_freq_profile | ||||||
|  |         other_signal = non_chirper_signal * other_ampl | ||||||
|  |         other_freq = non_chirper_freq_profile | ||||||
|  |     else: | ||||||
|  |         self_signal = non_chirper_signal | ||||||
|  |         self_freq = non_chirper_freq_profile | ||||||
|  |         other_signal = chirper_signal * other_ampl | ||||||
|  |         other_freq = chirper_freq_profile | ||||||
|  |     return time, self_signal, self_freq, other_signal, other_freq | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     eod_frequencies = {"self": 600, "other": 620}  # Hz, eod frequencies of the two fish, 'self' is the one that we "record" from | ||||||
|  |     eod_contrasts = [20, 10, 5, 2.5, 1.25, 0.625, 0.3125]  # %, strength of 'other' relative to 'self' | ||||||
|  |     chirp_size = 100  # Hz, frequency excursion | ||||||
|  |     chirp_duration = 0.015  # s, chirp duration | ||||||
|  |     chirp_amplitude_dip = 0.05  # %, amplitude drop during chirp | ||||||
|  |     chirp_frequency = 10  # Hz, how often does the fish chirp | ||||||
|  | 
 | ||||||
|  |     total_duration = 0.5  # s, total duration of simulation | ||||||
|  |     dt = 0.00001  # s, stepsize of the simulation | ||||||
|  | 
 | ||||||
|  |     chirp_times = np.arange(0.125+chirp_duration, 0.125 + total_duration - chirp_duration, 1./chirp_frequency) | ||||||
|  |     grid_shape = (5 + len(eod_contrasts) - 1, 7) | ||||||
|  | 
 | ||||||
|  |     conditions = ["other", "self"] | ||||||
|  |     fig = plt.figure(figsize=(4.5, 4.5)) | ||||||
|  |     for i, condition in enumerate(conditions): | ||||||
|  |         time, self_signal, self_freq, other_signal, other_freq = get_signals(eod_frequencies, condition, eod_contrasts[0], chirp_size,  | ||||||
|  |                                                                              chirp_duration, chirp_amplitude_dip, chirp_times,  | ||||||
|  |                                                                              total_duration + 0.25, dt) | ||||||
|  |         plot_time = time[(time >= 0.125) & (time < total_duration + 0.125)] - 0.125 | ||||||
|  |         ax = plt.subplot2grid(grid_shape, (0, i * 3 + i * 1), rowspan=2, colspan=3, fig=fig) | ||||||
|  |         ax.plot(plot_time, self_freq[(time >= 0.125) & (time < total_duration + 0.125)], color="#ff7f0e", label="%iHz" % eod_frequencies["self"]) | ||||||
|  |         ax.plot(plot_time, other_freq[(time >= 0.125) & (time < total_duration + 0.125)], color="#1f77b4", label="%iHz" % eod_frequencies["other"]) | ||||||
|  |         if i == 0: | ||||||
|  |             ax.text(1.15 * plot_time[-1], eod_frequencies["self"], "self", color="#ff7f0e", va="center", ha="left", fontsize=9) | ||||||
|  |             ax.text(1.15 * plot_time[-1], eod_frequencies["other"], "other", color="#1f77b4", va="center", ha="left", fontsize=9) | ||||||
|  |             ax.text(-0.05 * plot_time[-1], eod_frequencies["self"], "%iHz" % eod_frequencies["self"], color="#ff7f0e", va="center", ha="right", fontsize=9) | ||||||
|  |             ax.text(-0.05 * plot_time[-1], eod_frequencies["other"], "%iHz" % eod_frequencies["other"], color="#1f77b4", va="center", ha="right", fontsize=9) | ||||||
|  |         despine(ax, spines=["top", "bottom", "left", "right"]) | ||||||
|  |          | ||||||
|  |         ax = plt.subplot2grid(grid_shape, (3, i * 3 + i * 1), rowspan=2, colspan=3, fig=fig) | ||||||
|  |         combined = self_signal + other_signal | ||||||
|  |         plot_combined = combined[(time >= 0.125) & (time < total_duration + 0.125)] | ||||||
|  |         am = np.abs(sig.hilbert(combined)) | ||||||
|  |         plot_am = am[(time >= 0.125) & (time < total_duration + 0.125)] | ||||||
|  |         ax.plot(plot_time, plot_combined, color="#2ca02c", label="self + other") | ||||||
|  |         ax.plot(plot_time, plot_am, color="#d62728", label="am") | ||||||
|  |         ax.set_ylim([-1.25, 1.25]) | ||||||
|  |         if i == 0:  | ||||||
|  |             ax.text(1.25 * plot_time[-1], np.mean(combined), "contrast=\n20%",color="#d62728", va="center", ha="center", fontsize=9) | ||||||
|  |             ax.text(-0.05 * plot_time[-1], np.mean(am), "am", color="#d62728", va="center", ha="right", fontsize=9) | ||||||
|  |             ax.text(-0.05 * plot_time[-1], np.mean(combined), "self+\nother", color="#2ca02c", va="center", ha="right", fontsize=9) | ||||||
|  |         despine(ax, spines=["top", "bottom", "left", "right"]) | ||||||
|  |          | ||||||
|  |         for j, contrast in enumerate(eod_contrasts[1:]): | ||||||
|  |             time, self_signal, self_freq, other_signal, other_freq = get_signals(eod_frequencies, condition, contrast, chirp_size,  | ||||||
|  |                                                                                  chirp_duration, chirp_amplitude_dip, chirp_times, total_duration + 0.25, dt) | ||||||
|  |             combined = self_signal + other_signal | ||||||
|  |             am = np.abs(sig.hilbert(combined)) | ||||||
|  |              | ||||||
|  |             plot_time = time[(time >= 0.125) & (time < total_duration + 0.125)] - 0.125 | ||||||
|  |             plot_combined = combined[(time >= 0.125) & (time < total_duration + 0.125)] | ||||||
|  |             plot_am = am[(time >= 0.125) & (time < total_duration + 0.125)] | ||||||
|  | 
 | ||||||
|  |             ax = plt.subplot2grid(grid_shape, (5 + j, i * 3 + i * 1), rowspan=1, colspan=3) | ||||||
|  |             ax.plot(plot_time, plot_am, color="#d62728", label="am") | ||||||
|  |             ax.text(1.25 * plot_time[-1], np.mean(am), "%.2f" % contrast, color="#d62728", va="center", ha="center", fontsize=9) | ||||||
|  |             ax.set_ylim([0.8, 1.2]) | ||||||
|  |             if j == len(eod_contrasts)-2: | ||||||
|  |                 despine(ax, spines=["top", "left", "right"]) | ||||||
|  |                 ax.set_xticks(np.arange(0.0, total_duration + 0.001, 0.25)) | ||||||
|  |                 ax.set_xticklabels(np.arange(0.0, total_duration * 1000+1, 250), fontsize=7) | ||||||
|  |                 ax.set_xlabel("times [ms]", fontsize=9) | ||||||
|  |             else: | ||||||
|  |                 despine(ax, spines=["top", "bottom", "left", "right"]) | ||||||
|  | 
 | ||||||
|  |          | ||||||
|  |     fig.subplots_adjust(left=0.1, bottom=0.1, top=0.99, right=0.99) | ||||||
|  |     plt.show() | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user