tr-epr-simulation/EPR_script.m
sakul-45 7f55917f9f Added parameter saving feature
Script now concatenates simulated parameters to end of an excel sheet, specified at the top. May ran into problems if no matching excel sheet exits.
2021-04-26 22:28:33 +02:00

218 lines
8.2 KiB
Matlab

% high-spin S=1 simulation
% Inputs requested in command line at certain points
clear variables
close all
% window positions (currently optimised for dual WQHD with main on right)
% also uncomment all figure(gcf) when working with single monitor
% Give desired position of figure window as number of pixels [pos_x pos_y size_x size_y]:
position = [-1250,50,1200,800];
% Give desired position of figure(2) window (will have two stacked subplots)
% as number of pixels [pos_x pos_y size_x size_y]:
position2 = [-2000,50,700,800];
% Give desired position of figure(3) window (will contain EPR spectrum and
% simulation) as number of pixels [pos_x pos_y size_x size_y]:
position3 = [-1250,50,1200,600];
% specify dir for printing figures
figdir = './';
% specifiy excel-file for saving parameters
table_path = 'example_results.xlsx';
%% loading Data
path = input('Path to dataset: ','s');
load(path)
whos % what variables have been loaded
params % what information is contained in the structure called 'params'
% get name of dataset
dataname = string(extractBefore(extractAfter(path,asManyOfPattern(wildcardPattern + "/")),'.'));
% using Parallel Computing toolbox to speed up (check with "gpuDevice" if you can use this)
gpuData = gpuArray(Data);
%% Baseline Correcting
% plot the raw data & check the number of points before the signal (pre-trigger)
plot(gpuData)
title('raw data')
set(gcf,'Position',position)
% substract the pre-trigger
pre_trigger = input('Number of pre-trigger points: ');
signal_baseline_time = bsxfun(@minus, gpuData, mean(gpuData(1:pre_trigger,:)));
plot(signal_baseline_time) % plot the corrected data set
title('time corrected data')
set(gcf,'Position',position)
% figure(gcf) % bring figure to foreground
ready = input('Proceed?');
% plot the transpose and check the number of points to the lower and higher fields of the signal
plot(signal_baseline_time.')
title('transposed time corrected data')
set(gcf,'Position',position)
% figure(gcf) % bring figure to foreground
% BASELINE correction
baseline_points = input('Number of baseline points (use smaller value from left and right): ');
l1 = mean(signal_baseline_time(:,1:baseline_points),2); % calculate the mean on the left along the time axis
l2 = mean(signal_baseline_time(:,end-baseline_points:end),2); %calculate the mean on the right along the time axis
baseline_time = (l1 +l2)/2; %take the average
signal_baseline_time_field = bsxfun(@minus, signal_baseline_time, baseline_time); % subtract the background in the time-domain
% plot the corrected data set
plot(signal_baseline_time_field.')
title('transposed fully corrected data')
set(gcf,'Position',position)
% figure(gcf) % bring figure to foreground
clear ready
ready = input('Proceed?');
% plot the transpose to find the region of maximum signal. Use this below
plot(signal_baseline_time_field)
title('fully corrected data')
set(gcf,'Position',position)
% figure(gcf) % bring figure to foreground
% contour plot: The index gives the number of contours
% contourf(signal_baseline_field_time,6)
% NORMALISING
max_region = input('Region of the maximum signal as [x1:x2]: ');
% take the mean over the maxium region. You can decide how wide it is
signal_baseline_time_field_mean = (mean(signal_baseline_time_field(max_region,:)));
% normalise the amplitude to 1
signal_baseline_time_field_mean_norm = signal_baseline_time_field_mean/max(signal_baseline_time_field_mean);
%% Creating figure with two subplots
figure(2)
set(gcf,'PaperUnits','centimeters')
set(gcf,'Position',position2)
set(gcf,'InvertHardcopy','off','Color',[1 1 1])
set(0,'DefaultAxesFontSize', 12,'DefaultAxesLineWidth',2)
cont_or_surf = input('Should lower subplot be contour(1) or surface(2) plot? (1/2): ');
subplot(2,1,2)
if cont_or_surf == 1
% contour plot: add the time and field axes
contourf(0.1*params.Field_Vector, TimeBase*1e6 ,signal_baseline_time_field,'LineColor','none')
elseif cont_or_surf == 2
% surface plot: add the time and field axes
surf(0.1*params.Field_Vector, TimeBase*1e6 ,signal_baseline_time_field)
colormap default
shading interp
end
xlabel('Magnetic Field / mT')
ylabel('Time / \mus')
subplot(2,1,1)
% plot the spectrum
plot(0.1*params.Field_Vector,signal_baseline_time_field_mean_norm,'LineWidth',2)
xlabel('Magnetic Field / mT')
axis('tight')
box off
%% Simulation section
Exp.mwFreq = params.mwFreq; % GHz
Exp.nPoints = length(params.Field_Vector);
Exp.CenterSweep = 0.1*[params.Field_Center params.Field_Sweep]; % mT (converted from Gauss)
Exp.Harmonic = 0; % zeroth harmonic
init_proceed = 'n';
while init_proceed == 'n'
% populations of the triplet sub-levels
% these need to be varied manually to get the right shape
Exp.Temperature = input('Input population of triplett sublevels as [T_x T_y T_z]: ');
% initial simulation settings
Sys.S = 1; % Total Spin
Sys.g = input('g value: '); % needs to be optimised
Sys.D = input('D and E value as [D E]: '); % mT, The D and E values need to be optimised
Sys.lw = input('Isotropic line broadening at FWHM as [Gaussian Lorentzian]: '); % mT, linewidth needs to be optimised
[bfield,spec] = pepper(Sys,Exp); % perform a simulation with the parameters above
spec_norm = spec/max(spec); % normalize the simulation
figure(3)
set (gcf,'PaperUnits','centimeters')
set (gcf,'Position',position3) % set the position, size and shape of the plot
set (gcf,'InvertHardcopy','off','Color',[1 1 1])
set(0,'DefaultAxesFontSize', 16,'DefaultAxesLineWidth',1.5)
plot(0.1*params.Field_Vector,signal_baseline_time_field_mean_norm,'r', bfield,spec_norm,'b','LineWidth',1);
axis('tight')
legend('experimental','simulation')
legend boxoff
xlabel('Magnetic Field / mT')
ylabel('EPR signal / A. U.')
set(gca,'Box','Off', 'XMinorTick','On', 'YMinorTick','On', 'TickDir','Out', 'YColor','k')
pause(2);
init_proceed = input('Spectrum shape manually fitted? [y/n]: ','s');
end
% variation settings for simulation
Vary.g = 0.01;
Vary.D = [10 10];
Vary.lw = [1 0];
% further setup
FitOpt.Method = 'simplex fcn';
FitOpt.Scaling = 'lsq';
% When you have got a good fit by eye, use esfit to optimise
simu_proceed = 'n';
while simu_proceed == 'n'
% fitting routine
[BestSys,BestSpc] = esfit('pepper',signal_baseline_time_field_mean_norm,Sys,Vary,Exp,[],FitOpt);
% plot best fit
figure(3)
plot(0.1*params.Field_Vector,signal_baseline_time_field_mean_norm,'r',...
0.1*params.Field_Vector,BestSpc,'b','LineWidth',1);
axis('tight')
legend('experimental','simulation')
legend boxoff
xlabel('Magnetic Field / mT')
ylabel('EPR signal / A. U.')
set(gca,'Box','Off', 'XMinorTick','On', 'YMinorTick','On', 'TickDir','Out', 'YColor','k')
simu_proceed = input('Did the simulation converge? [y/n]: ','s');
if simu_proceed == 'n'
simu_val = input('Do you want to repeat the simulation with new best values? [y/n]: ','s');
if simu_val == 'y'
Sys.g = BestSys.g;
Sys.D = BestSys.D;
Sys.lw = BestSys.lw;
end
end
end
%% printing figures
printing = input('Do you want to print figure(3)? [y/n]: ','s');
if printing == 'y'
figure(3)
set(gcf,'Units','Inches');
pos = get(gcf,'Position');
set(gcf,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)]);
print(gcf,strcat(figdir,dataname),'-dpdf','-r0');
end
%% saving parameters
% concatenate data to existing table
table_old = readtable(table_path);
table_old.Properties.VariableNames = {'filename', 'date', 'pre-trigger', ...
'baseline_points', 'max_area_left', 'max_area_right', 'T_x', 'T_y', 'T_z', ...
'sim. g-value', 'sim_D', 'sim_E', 'sim_lw_gauss', 'sim_lw_lorentz'};
% new data as table
table_new = table(dataname, string(datestr(clock)), pre_trigger, baseline_points, ...
max_region(1), max_region(end), Exp.Temperature(1), Exp.Temperature(2), Exp.Temperature(3), ...
BestSys.g, BestSys.D(1), BestSys.D(2), BestSys.lw(1), BestSys.lw(2), ...
'VariableNames', {'filename', 'date', 'pre-trigger', 'baseline_points', ...
'max_area_left', 'max_area_right', 'T_x', 'T_y', 'T_z', 'sim. g-value', ...
'sim_D', 'sim_E', 'sim_lw_gauss', 'sim_lw_lorentz'});
table_conc = [table_old;table_new];
writetable(table_conc,table_path)