tr-epr-simulation/EPR_script.m
sakul-45 eb4f59fe15 Update EPR_script.m
Finished requests on correcting and plotting section. Also moved normalising into "Baseline correcting" section.
2021-04-24 12:48:38 +02:00

157 lines
5.4 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)
% 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];
%% 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'
%% Baseline Correcting
% plot the raw data & check the number of points before the signal (pre-trigger)
plot(Data)
title('raw data')
set(gcf,'Position',position)
% substract the pre-trigger
pre_trigger = input('Number of pre-trigger points: ');
signal_baseline_time = bsxfun(@minus, Data, mean(Data(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
return
%% Simulation section. Use the "Run Section" button to avoid running the previous section every time
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
Exp.Temperature = [0 0.67 0.33]; % populations of the triplet sub-levels. These need to be varied manually to get the right shape
Sys.S = 1; % Total Spin
Sys.g = 1.9951; % needs to be optimised
Sys.D = [2148.02 75.35]; % mT; The D and E values need to be optimised
Sys.lw = [8.1034 0]; % mT; linewidth needs to be optimised
Vary.g = 0.01;
Vary.D = [10 10];
Vary.lw = [1 0];
FitOpt.Method = 'simplex fcn';
FitOpt.Scaling = 'lsq';
% When you have got a good fit by eye, use esfit to optimise
% esfit('pepper',signal_baseline_field_time_mean_norm,Sys,Vary,Exp,[],FitOpt);%fitting route
% return
[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',position) % 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')
return
set(gcf,'Units','Inches');
pos = get(gcf,'Position');
set(gcf,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)]);
print(gcf,'..\Abbildungen\Regression5','-dpdf','-r0');