Merge pull request 'Finished objectifying' (#8) from objectify into master

Reviewed-on: #8
This commit is contained in:
Lukas Schank 2021-07-27 13:09:44 +00:00
commit 4086fbee68
19 changed files with 13269 additions and 217 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
*.asv
*.pdf
*.xml

View File

@ -1,217 +0,0 @@
% 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)

24
TR_EPR_script.m Normal file
View File

@ -0,0 +1,24 @@
clear variables
close all
%Script for calling the functions of TR-EPR toolbox
%path to dataset
datapath = 'C:\Users\lukas\Nextcloud\Uni\Bachelorarbeit\tr-epr-simulation\example_data.mat';
[raw_data,params] = load_matlab(datapath);
[time_corr_data,params] = correct_time_baseline(raw_data,params);
[full_corr_data,params] = correct_magnetic_baseline(time_corr_data,params);
[norm_data,params] = normalize_data(full_corr_data,params);
[params] = pre_simulation_TREPR(params);
[params] = simulation_TREPR(params);
writestruct(params,strcat(params.Path,"/",params.Name,".xml"));
print_figure_pdf(full_corr_data,params,1) %print simuation figure
% print_figure_pdf(full_corr_data,params,1) %print 3D figure

127
correct_magnetic_baseline.m Normal file
View File

@ -0,0 +1,127 @@
function [dataOUT,params] = correct_magnetic_baseline(dataIN,params)
%CORRECT_MAGNETIC_BASELINE UI for basline correction along field axis
%
% Usage: [dataOUT,params] = CORRECT_MAGNETIC_BASELINE(dataIN,params), where
% dataIN is a dataset loaded via the LOAD_MATLAB or LOAD_BRUKER function.
%
% The function will show the input data and offer an input field, where
% the number of field basline points should be set. It is also possible to
% cut the field axis on both sides by the number in the second input field.
% By pressing "Apply" the correction will be executed and the graph changes
% to the corrected data. The number of field baseline points and points,
% which were cut off, will also be appended to the params struct.
% By pressing "Reset" the graph will return to show the original data.
% Exit the function by pressing "Done".
%% creating UI
fig = figure;
fig.Name = 'Correct Magnetic Baseline';
fig.Units = 'Normalized';
fig.Position = [.2 .2 .6 .6];
fig.Tag = 'CorrMagBase';
%panel for plot
plotpanel = uipanel(fig);
plotpanel.Units = 'Normalized';
plotpanel.Position = [.01 .06 .98 .92];
%axes for plot
ax = axes(plotpanel);
ax.XLabel.String = 'Magnetic field';
ax.YLabel.String = 'Intensity';
%plot current data in figure with field as x axis
dataIN_transp = dataIN.';
plot(ax,dataIN_transp)
axis tight
%create push buttons
a = uicontrol(fig,'Style','pushbutton');
a.String = 'Apply';
a.Units = 'Normalized';
a.Position = [.52 .01 .15 .05];
a.FontUnits = 'Normalized';
a.FontSize = 0.6;
a.Tag = 'Apply';
a.Callback = @FieldApplyButtonPushed;
r = uicontrol(fig,'Style','pushbutton');
r.String = 'Reset';
r.Units = 'Normalized';
r.Position = [.68 .01 .15 .05];
r.FontUnits = 'Normalized';
r.FontSize = 0.6;
r.Tag = 'Reset';
r.Callback = @FieldResetButtonPushed;
d = uicontrol(fig,'Style','pushbutton');
d.String = 'Done';
d.Units = 'Normalized';
d.Position = [.84 .01 .15 .05];
d.FontUnits = 'Normalized';
d.FontSize = 0.6;
d.Tag = 'Done';
d.Callback = @FieldDoneButtonPushed;
%create input fields
p1 = uicontrol(fig,'Style','edit');
p1.String = 'No. points baseline';
p1.Units = 'Normalized';
p1.Position = [.01 .01 .24 .05];
p1.HorizontalAlignment = 'left';
p1.FontUnits = 'Normalized';
p1.FontSize = 0.6;
p1.Tag = 'FieldPoints';
p2 = uicontrol(fig,'Style','edit');
p2.String = 'No. points to cut';
p2.Units = 'Normalized';
p2.Position = [.26 .01 .24 .05];
p2.HorizontalAlignment = 'left';
p2.FontUnits = 'Normalized';
p2.FontSize = 0.6;
p2.Tag = 'FieldPoints';
uicontrol(p1); %passes focus to input
uiwait(fig)
%% Callback functions
function FieldApplyButtonPushed(~,event)
field_baseline = str2double(get(p1,'String'));
field_cut = str2double(get(p2,'String'));
%field baseline CUTTING
dataIN(:,1:field_cut) = [];
dataIN(:,end-field_cut:end) = [];
%field baseline CORRECTING
data_size = size(dataIN);
dataOUT = zeros(data_size);
baseline_mean_right = mean(dataIN(:,1:field_baseline),2);
baseline_mean_left = mean(dataIN(:,end-field_baseline:end),2);
baseline_mean = (baseline_mean_right + baseline_mean_left) / 2;
for n = 1:data_size(1)
dataOUT(n,:) = dataIN(n,:) - baseline_mean(n);
end
%plotting result with field as x axis
dataOUT_transp = dataOUT.';
plot(ax,dataOUT_transp)
axis tight
%adjusting parameter
params.Field_Sweep = params.Field_Sweep - params.Field_Step*2*field_cut;
params.Field_Start = params.Field_Start + params.Field_Step*field_cut;
params.Field_End = params.Field_End - params.Field_Step*field_cut;
params.Field_Vector(:,1:field_cut) = [];
params.Field_Vector(:,end-field_cut:end) = [];
%writing parameter
params.No_field_cut_pts = field_cut;
params.No_field_basline_pts = field_baseline;
end
function FieldResetButtonPushed(~,~)
plot(ax,dataIN_transp)
axis tight
end
function FieldDoneButtonPushed(~,~)
close 'Correct Magnetic Baseline'
end
end

101
correct_time_baseline.m Normal file
View File

@ -0,0 +1,101 @@
function [dataOUT,params] = correct_time_baseline(dataIN,params)
%CORRECT_TIME_BASELINE UI for basline correction along time axis
%
% Usage: [dataOUT,params] = CORRECT_TIME_BASELINE(dataIN,params), where
% dataIN is a dataset loaded via the LOAD_MATLAB or LOAD_BRUKER function.
%
% The function will show the input data and offer an input field, where
% the number of pretrigger points should be set. By pressing "Apply" the
% correction will be executed and the graph changes to the corrected data.
% The number of pretigger points will also be appended to the params struct.
% By pressing "Reset" the graph will return to show the original data.
% Exit the function by pressing "Done".
%% creating UI
fig = figure;
fig.Name = 'Correct Time Baseline';
fig.Units = 'Normalized';
fig.Position = [.2 .2 .6 .6];
fig.Tag = 'CorrTimeBase';
%panel for plot
plotpanel = uipanel(fig);
plotpanel.Units = 'Normalized';
plotpanel.Position = [.01 .06 .98 .92];
%axes for plot
ax = axes(plotpanel);
ax.XLabel.String = 'Time';
ax.YLabel.String = 'Intensity';
%plot current data in figure
plot(ax,dataIN)
axis tight
%create push buttons
a = uicontrol(fig,'Style','pushbutton');
a.String = 'Apply';
a.Units = 'Normalized';
a.Position = [.52 .01 .15 .05];
a.FontUnits = 'Normalized';
a.FontSize = 0.6;
a.Tag = 'Apply';
a.Callback = @TimeApplyButtonPushed;
r = uicontrol(fig,'Style','pushbutton');
r.String = 'Reset';
r.Units = 'Normalized';
r.Position = [.68 .01 .15 .05];
r.FontUnits = 'Normalized';
r.FontSize = 0.6;
r.Tag = 'Reset';
r.Callback = @TimeResetButtonPushed;
d = uicontrol(fig,'Style','pushbutton');
d.String = 'Done';
d.Units = 'Normalized';
d.Position = [.84 .01 .15 .05];
d.FontUnits = 'Normalized';
d.FontSize = 0.6;
d.Tag = 'Done';
d.Callback = @TimeDoneButtonPushed;
%create input field
inp = uicontrol(fig,'Style','edit');
inp.String = 'No. points baseline';
inp.Units = 'Normalized';
inp.Position = [.01 .01 .5 .05];
inp.HorizontalAlignment = 'left';
inp.FontUnits = 'Normalized';
inp.FontSize = 0.6;
inp.Tag = 'TimePoints';
uicontrol(inp); %passes focus to input
uiwait(fig)
%% Callback functions
function TimeApplyButtonPushed(~,~)
pretrigger = str2double(get(inp,'String'));
%timeline CORRECTING
data_size = size(dataIN);
dataOUT = zeros(data_size);
for n = 1:data_size(2)
column_mean = mean(dataIN(1:pretrigger,n));
dataOUT(:,n) = dataIN(:,n) - column_mean;
end
%plotting result
plot(ax,dataOUT)
axis tight
%writing parameter
params.pretrigger = pretrigger;
end
function TimeResetButtonPushed(~,~)
plot(ax,dataIN)
axis tight
end
function TimeDoneButtonPushed(~,~)
close 'Correct Time Baseline'
end
end

11766
example_data.xml Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

65
figure_testing.m Normal file
View File

@ -0,0 +1,65 @@
%% function for testing of uifigures and buttons
function [] = figure_testing()
%% figure with "Apply", "Reset" and "Done" button
%create figure
fig = figure;
fig.Name = 'Test Window';
fig.Units = 'Normalized';
fig.Position = [.2 .2 .6 .6];
fig.Tag = 'Test Window';
%create push buttons
a = uicontrol(fig,'Style','pushbutton');
a.String = 'Apply';
a.Units = 'Normalized';
a.Position = [.52 .01 .15 .05];
a.FontUnits = 'Normalized';
a.FontSize = 0.6;
a.Tag = 'Apply';
a.Callback = @ApplyButtonPushed;
r = uicontrol(fig,'Style','pushbutton');
r.String = 'Reset';
r.Units = 'Normalized';
r.Position = [.68 .01 .15 .05];
r.FontUnits = 'Normalized';
r.FontSize = 0.6;
r.Tag = 'Reset';
r.Callback = @ResetButtonPushed;
d = uicontrol(fig,'Style','pushbutton');
d.String = 'Done';
d.Units = 'Normalized';
d.Position = [.84 .01 .15 .05];
d.FontUnits = 'Normalized';
d.FontSize = 0.6;
d.Tag = 'Done';
d.Callback = @DoneButtonPushed;
%create input field
inp = uicontrol(fig,'Style','edit');
inp.Units = 'Normalized';
inp.Position = [.01 .01 .5 .05];
inp.HorizontalAlignment = 'left';
inp.FontUnits = 'Normalized';
inp.FontSize = 0.6;
% inp.Tag = 'input';
uicontrol(inp); %passes focus to input
%% Callback functions
function ApplyButtonPushed(src,event)
out = get(inp,'String');
txt = strcat("Applied correction by ",out," points!");
disp(txt)
end
function ResetButtonPushed(src,event)
disp('Resetted data!')
end
function DoneButtonPushed(src,event)
close 'Test Window'
end
end

66
load_bruker.m Normal file
View File

@ -0,0 +1,66 @@
function [Data,params] = load_bruker(path)
%LOAD_MATLAB imports TR-EPR data recorded with Bruker's xEPR
% Usage: ['data_as_double','struct_with_parameters'] = load_bruker('C:/full/path/to/file.mat')
%
% Imports data recorded by xEPR, where x axis is time and y axis is
% magnetic field.
% PATH can be either pointing to .DSC or .DTA, but both need to be there
% and in the same folder. PATH must also contain forwardslashes only.
% The params struct contains metadata of the measurement and is displayed
% in the command window when calling the function.
%
% Note that this funtion is dependent on easyspin.
%
% Example for params output:
% params =
%
% struct with fields: Units
%
% Field_Center: 3500 G
% Field_Sweep: 2700 G
% Field_Step: 5 G
% Accumulations: 100 -
% laser_shotreprate: 20 -
% Field_Start: 2150 G
% Field_End: 4850 G
% Field_Vector: [1×540 double] G
% mwFreq: 9.6845 GHz
% mwPower: 0.2000 W
% QValue: 22800 -
% mwAtten: 30 dB
% mwFreqs: [681×1 double] GHz
% TimeBase: [1×10001 double] s
% Path: '/some/path/' -
% Name: 'example_data' -
%correct \ for /
corrpath = replace(path,"\","/");
%load Bruker data with help of easyspin
[bruker_axes,Data,bruker_params] = eprload(corrpath);
%assign metadata to custom params struct
params.Field_Center = bruker_params.YMIN + 0.5*bruker_params.YWID;
params.Field_Sweep = bruker_params.YWID;
params.Field_Step = bruker_params.YWID / (bruker_params.YPTS-1);
params.Accumulations = bruker_params.AVGS;
params.laser_shotreprate = "NOT RECORDED";
params.Field_Start = bruker_params.YMIN;
params.Field_End = bruker_params.YMIN + bruker_params.YWID;
params.Field_Vector = cell2mat(bruker_axes(1,2));
params.mwFreq = bruker_params.MWFQ / 1e9;
params.mwPower = bruker_params.MWPW * 1e3;
params.QValue = "NOT RECORDED";
params.mwAtten = str2double(extractBefore(string(bruker_params.PowerAtten),' '));
params.mwFreqs = "NOT RECORDED";
params.TimeBase = (bruker_params.XMIN:(bruker_params.XWID/bruker_params.XPTS):(bruker_params.XMIN+bruker_params.XWID)) .* 1e-9;
%get filename for further documentation and exporting figures
[datapath,dataname,~] = fileparts(corrpath);
params.Path = datapath;
params.Name = dataname;
%echo what information is contained in the structure called 'params'
params
end

47
load_matlab.m Normal file
View File

@ -0,0 +1,47 @@
function [Data,params] = load_matlab(path)
%LOAD_MATLAB imports EPR data recorded with MATLAB script
% Usage: ['data_as_double','struct_with_parameters'] = load_matlab('C:/full/path/to/file.mat')
%
% Imports data exported from MATLAB workspace and extracts the filename.
% Input has to be the full path to file with forwardslashes as char or
% string. The extracted name is appended to the 'params' struct, whos
% contents are displayed in the command window afterwards.
%
% Example for params output:
% params =
%
% struct with fields: Units
%
% Field_Center: 3500 G
% Field_Sweep: 2700 G
% Field_Step: 5 G
% Accumulations: 100 -
% laser_shotreprate: 20 -
% Field_Start: 2150 G
% Field_End: 4850 G
% Field_Vector: [1×540 double] G
% mwFreq: 9.6845 GHz
% mwPower: 0.2000 W
% QValue: 22800 -
% mwAtten: 30 dB
% mwFreqs: [681×1 double] GHz
% TimeBase: [1×10001 double] s
% Path: '/some/path/' -
% Name: 'example_data' -
%correct \ for /
corrpath = replace(path,"\","/");
%load data and write TimeBase in params
load(corrpath,'Data','params','TimeBase')
params.TimeBase = TimeBase;
%get filename for further documentation and exporting figures
[datapath,dataname,~] = fileparts(corrpath);
params.Path = datapath;
params.Name = dataname;
%echo what information is contained in the structure called 'params'
params
end

109
normalize_data.m Normal file
View File

@ -0,0 +1,109 @@
function [dataOUT,params] = normalize_data(dataIN,params)
%NORMALISE_DATA normalizes data by max of region
%
% Usage: [dataOUT,params] = NORMALISE_DATA(dataIN,params), where dataIN
% is a dataset loaded via the LOAD_MATLAB or LOAD_BRUKER function.
%
% The function will show the input data and offer two input fields, where
% the left and right borders of the maximum's region should be set.
% By pressing "Apply" the normalization will be executed and the graph
% changes to the normalized data. The borders of the maximum region and
% the mean of maximums will also be appended to the params struct.
% By pressing "Reset" the graph will return to show the original data.
% Exit the function by pressing "Done".
%% creating UI
fig = figure;
fig.Name = 'Normalize Data';
fig.Units = 'Normalized';
fig.Position = [.2 .2 .6 .6];
fig.Tag = 'Normalize';
%panel for plot
plotpanel = uipanel(fig);
plotpanel.Units = 'Normalized';
plotpanel.Position = [.01 .06 .98 .92];
%axes for plot
ax = axes(plotpanel);
ax.XLabel.String = 'Time';
ax.YLabel.String = 'Intensity';
%plot current data in figure with time as x axis
plot(ax,dataIN)
axis tight
%create push buttons
a = uicontrol(fig,'Style','pushbutton');
a.String = 'Apply';
a.Units = 'Normalized';
a.Position = [.52 .01 .15 .05];
a.FontUnits = 'Normalized';
a.FontSize = 0.6;
a.Tag = 'Apply';
a.Callback = @NormApplyButtonPushed;
r = uicontrol(fig,'Style','pushbutton');
r.String = 'Reset';
r.Units = 'Normalized';
r.Position = [.68 .01 .15 .05];
r.FontUnits = 'Normalized';
r.FontSize = 0.6;
r.Tag = 'Reset';
r.Callback = @NormResetButtonPushed;
d = uicontrol(fig,'Style','pushbutton');
d.String = 'Done';
d.Units = 'Normalized';
d.Position = [.84 .01 .15 .05];
d.FontUnits = 'Normalized';
d.FontSize = 0.6;
d.Tag = 'Done';
d.Callback = @NormDoneButtonPushed;
%create input fields
p1 = uicontrol(fig,'Style','edit');
p1.String = 'Left point of max region';
p1.Units = 'Normalized';
p1.Position = [.01 .01 .24 .05];
p1.HorizontalAlignment = 'left';
p1.FontUnits = 'Normalized';
p1.FontSize = 0.6;
p1.Tag = 'MaxRegionLeft';
p2 = uicontrol(fig,'Style','edit');
p2.String = 'Right point of max region';
p2.Units = 'Normalized';
p2.Position = [.25 .01 .24 .05];
p2.HorizontalAlignment = 'left';
p2.FontUnits = 'Normalized';
p2.FontSize = 0.6;
p2.Tag = 'MaxRegionRight';
uicontrol(p1); %passes focus to first input
uiwait(fig)
%% Callback functions
function NormApplyButtonPushed(~,~)
left_point = str2double(get(p1,'String'));
right_point = str2double(get(p2,'String'));
%take mean of each field line between specified min and max time
maxima_mean = mean(dataIN([left_point right_point],:));
%normalize amplitude to 1 by dividing by max of means
dataOUT = dataIN / max(maxima_mean);
%plotting result with time as x axis
plot(ax,dataOUT)
axis tight
%writing parameter
params.region_of_max = [left_point right_point];
params.max_mean = maxima_mean / max(maxima_mean);
end
function NormResetButtonPushed(~,~)
plot(ax,dataIN)
axis tight
end
function NormDoneButtonPushed(~,~)
close 'Normalize Data'
end
end

118
pentacene_355nm_481pt.DSC Normal file
View File

@ -0,0 +1,118 @@
#DESC 1.2 * DESCRIPTOR INFORMATION ***********************
*
* Dataset Type and Format:
*
DSRC EXP
BSEQ BIG
IKKF REAL
XTYP IDX
YTYP IGD
ZTYP NODATA
*
* Item Formats:
*
IRFMT D
YFMT D
*
* Data Ranges and Resolutions:
*
XPTS 1024
XMIN 0.000000
XWID 10230.000000
YPTS 481
YMIN 2799.991821
YWID 1199.999976
*
* Documentational Text:
*
TITL 'pentacene_355nm_481pt'
IRNAM 'Intensity'
XNAM 'Time'
YNAM 'Field'
IRUNI ''
XUNI 'ns'
YUNI 'G'
*
************************************************************
*
#SPL 1.2 * STANDARD PARAMETER LAYER
*
OPER xuser
DATE 04/14/21
TIME 15:27:19
CMNT
SAMP
SFOR
STAG C
EXPT CW
OXS1 TADC
AXS1 ETIM
AXS2 B0VL
AXS3
A2RS 481
A2CT 0.34
A2SW 0.12
MWFQ 9.625755e+09
MWPW 0.0006331
AVGS 30
*
************************************************************
*
#DSL 1.0 * DEVICE SPECIFIC LAYER
*
.DVC acqStart, 1.0
.DVC fieldCtrl, 1.0
AllegroMode False
Delay 0.0 s
FieldFlyback On
FieldWait Wait LED off
GFactor 2.000000
MeasuringHall False
NbPoints 481
RampCenter 3400.00 G
RampData G
RampWidth 1200.0 G
SetToSampleG False
StaticField 2800.000 G
StaticFieldMon 3480.000 G
SweepDirection Up
WidthTM 200.0 G
.DVC freqCounter, 1.0
FrequencyMon 9.625755 GHz
QMonitBridge On
.DVC mwBridge, 1.0
AcqFineTuning Never
AcqScanFTuning Off
AcqSliceFTuning Off
BridgeCalib 100.0
Power 0.6331 mW
PowerAtten 25 dB
.DVC recorder, 1.0
BaselineCorr Off
NbScansAcc 30
NbScansDone 1
NbScansToDo 1
ReplaceMode Off
SmoothMode Auto
SmoothPoints 1
.DVC transRec, 1.0
AcqMode Start Single Trace
NbCompScansToDo 1
ReplaceMode Off
TrRecTrgTimeOut 10 s
TransPerScan 30
*
************************************************************

BIN
pentacene_355nm_481pt.DTA Normal file

Binary file not shown.

BIN
pentacene_355nm_481pt.YGF Normal file

Binary file not shown.

300
pre_simulation_TREPR.m Normal file
View File

@ -0,0 +1,300 @@
function [params] = pre_simulation_TREPR(params)
%PRE_SIMULATION_TREPR allows manual fitting of parameters in GUI
%
% Usage: [params] = PRE_SIMULATION_TREPR(params), where params is
% a struct, created by the load_bruker/matlab function and preprocessed
% by NORMALIZE_DATA, at least.
%
% The function will show a window with a plot of the normalized mean of
% maxima (calculated by NORMALIZE_DATA) and serveral input fields for
% different relevant paramters of TREPR simulation.
% By pressing "Apply" the simulation will be calculated and displayed.
% The simulation parameters will be saved to the params struct.
%% creating UI
fig = figure;
fig.Name = 'Manual Simulation';
fig.Units = 'Normalized';
fig.Position = [.15 .2 .7 .6];
fig.Tag = 'Normalize';
%panel for plot
plotpanel = uipanel(fig);
plotpanel.Units = 'Normalized';
plotpanel.Position = [.01 .01 .7 .98];
%axes for plot
ax = axes(plotpanel);
ax.XLabel.String = 'magnetic field';
ax.YLabel.String = 'Intensity';
%plot current data in figure with field as x axis
plot(ax,0.1*params.Field_Vector,params.max_mean,'r')
axis tight
%% create push buttons
a = uicontrol(fig,'Style','pushbutton');
a.String = 'Apply';
a.Units = 'Normalized';
a.Position = [.71 .06 .28 .05];
a.FontUnits = 'Normalized';
a.FontSize = 0.6;
a.Tag = 'Apply';
a.Callback = @PreSimApplyButtonPushed;
d = uicontrol(fig,'Style','pushbutton');
d.String = 'Done';
d.Units = 'Normalized';
d.Position = [.71 .01 .28 .05];
d.FontUnits = 'Normalized';
d.FontSize = 0.6;
d.Tag = 'Done';
d.Callback = @PreSimDoneButtonPushed;
%% create input and text fields (Triplet)
textTrip = uicontrol(fig,'Style','text');
textTrip.String = 'Triplett populations';
textTrip.Units = 'Normalized';
textTrip.Position = [.71 .94 .28 .05];
textTrip.HorizontalAlignment = 'center';
textTrip.FontUnits = 'Normalized';
textTrip.FontSize = 0.6;
textTrip.FontWeight = 'bold';
textTrip.Tag = 'textTrip';
textTx = uicontrol(fig,'Style','text');
textTx.String = 'T_1 = ';
textTx.Units = 'Normalized';
textTx.Position = [.71 .89 .04333 .05];
textTx.HorizontalAlignment = 'right';
textTx.FontUnits = 'Normalized';
textTx.FontSize = 0.6;
textTx.Tag = 'textTx';
InpTx = uicontrol(fig,'Style','edit');
InpTx.String = '1';
InpTx.Units = 'Normalized';
InpTx.Position = [.75334 .89 .04333 .05];
InpTx.HorizontalAlignment = 'left';
InpTx.FontUnits = 'Normalized';
InpTx.FontSize = 0.6;
InpTx.Tag = 'InpTx';
textTy = uicontrol(fig,'Style','text');
textTy.String = 'T_2 = ';
textTy.Units = 'Normalized';
textTy.Position = [.80668 .89 .04333 .05];
textTy.HorizontalAlignment = 'right';
textTy.FontUnits = 'Normalized';
textTy.FontSize = 0.6;
textTy.Tag = 'textTy';
InpTy = uicontrol(fig,'Style','edit');
InpTy.String = '1';
InpTy.Units = 'Normalized';
InpTy.Position = [.85001 .89 .04333 .05];
InpTy.HorizontalAlignment = 'left';
InpTy.FontUnits = 'Normalized';
InpTy.FontSize = 0.6;
InpTy.Tag = 'InpTy';
textTz = uicontrol(fig,'Style','text');
textTz.String = 'T_3 = ';
textTz.Units = 'Normalized';
textTz.Position = [.90334 .89 .04333 .05];
textTz.HorizontalAlignment = 'right';
textTz.FontUnits = 'Normalized';
textTz.FontSize = 0.6;
textTz.Tag = 'textTz';
InpTz = uicontrol(fig,'Style','edit');
InpTz.String = '1';
InpTz.Units = 'Normalized';
InpTz.Position = [.94667 .89 .04333 .05];
InpTz.HorizontalAlignment = 'left';
InpTz.FontUnits = 'Normalized';
InpTz.FontSize = 0.6;
InpTz.Tag = 'InpTz';
%% create input and text fields (D & E)
textDE = uicontrol(fig,'Style','text');
textDE.String = 'D tensor';
textDE.Units = 'Normalized';
textDE.Position = [.71 .77 .28 .05];
textDE.HorizontalAlignment = 'center';
textDE.FontUnits = 'Normalized';
textDE.FontSize = 0.6;
textDE.FontWeight = 'bold';
textDE.Tag = 'textDE';
textD = uicontrol(fig,'Style','text');
textD.String = 'D = ';
textD.Units = 'Normalized';
textD.Position = [.71 .72 .0675 .05];
textD.HorizontalAlignment = 'right';
textD.FontUnits = 'Normalized';
textD.FontSize = 0.6;
textD.Tag = 'textD';
InpD = uicontrol(fig,'Style','edit');
InpD.String = '1/2 width';
InpD.Units = 'Normalized';
InpD.Position = [.7775 .72 .0675 .05];
InpD.HorizontalAlignment = 'left';
InpD.FontUnits = 'Normalized';
InpD.FontSize = 0.6;
InpD.Tag = 'InpD';
textE = uicontrol(fig,'Style','text');
textE.String = 'E = ';
textE.Units = 'Normalized';
textE.Position = [.855 .72 .0675 .05];
textE.HorizontalAlignment = 'right';
textE.FontUnits = 'Normalized';
textE.FontSize = 0.6;
textE.Tag = 'textE';
InpE = uicontrol(fig,'Style','edit');
InpE.String = '1/3 D';
InpE.Units = 'Normalized';
InpE.Position = [.9225 .72 .0675 .05];
InpE.HorizontalAlignment = 'left';
InpE.FontUnits = 'Normalized';
InpE.FontSize = 0.6;
InpE.Tag = 'InpE';
%% create input and text fields (Spin & g)
textSG = uicontrol(fig,'Style','text');
textSG.String = 'Spin and g-value';
textSG.Units = 'Normalized';
textSG.Position = [.71 .60 .28 .05];
textSG.HorizontalAlignment = 'center';
textSG.FontUnits = 'Normalized';
textSG.FontSize = 0.6;
textSG.FontWeight = 'bold';
textSG.Tag = 'textSG';
textS = uicontrol(fig,'Style','text');
textS.String = 'Spin = ';
textS.Units = 'Normalized';
textS.Position = [.71 .55 .0675 .05];
textS.HorizontalAlignment = 'right';
textS.FontUnits = 'Normalized';
textS.FontSize = 0.6;
textS.Tag = 'textS';
InpS = uicontrol(fig,'Style','edit');
InpS.String = '1';
InpS.Units = 'Normalized';
InpS.Position = [.7775 .55 .0675 .05];
InpS.HorizontalAlignment = 'left';
InpS.FontUnits = 'Normalized';
InpS.FontSize = 0.6;
InpS.Tag = 'InpS';
textG = uicontrol(fig,'Style','text');
textG.String = 'g-value = ';
textG.Units = 'Normalized';
textG.Position = [.855 .55 .0675 .05];
textG.HorizontalAlignment = 'right';
textG.FontUnits = 'Normalized';
textG.FontSize = 0.6;
textG.Tag = 'textG';
InpG = uicontrol(fig,'Style','edit');
InpG.String = '2';
InpG.Units = 'Normalized';
InpG.Position = [.9225 .55 .0675 .05];
InpG.HorizontalAlignment = 'left';
InpG.FontUnits = 'Normalized';
InpG.FontSize = 0.6;
InpG.Tag = 'InpG';
%% create input and text fields (linewidth)
textLW = uicontrol(fig,'Style','text');
textLW.String = 'Linewidth';
textLW.Units = 'Normalized';
textLW.Position = [.71 .43 .28 .05];
textLW.HorizontalAlignment = 'center';
textLW.FontUnits = 'Normalized';
textLW.FontSize = 0.6;
textLW.FontWeight = 'bold';
textLW.Tag = 'textLW';
textGauss = uicontrol(fig,'Style','text');
textGauss.String = 'lw(Gau) = ';
textGauss.Units = 'Normalized';
textGauss.Position = [.71 .38 .0675 .05];
textGauss.HorizontalAlignment = 'right';
textGauss.FontUnits = 'Normalized';
textGauss.FontSize = 0.6;
textGauss.Tag = 'textGauss';
InpGauss = uicontrol(fig,'Style','edit');
InpGauss.String = '1';
InpGauss.Units = 'Normalized';
InpGauss.Position = [.7775 .38 .0675 .05];
InpGauss.HorizontalAlignment = 'left';
InpGauss.FontUnits = 'Normalized';
InpGauss.FontSize = 0.6;
InpGauss.Tag = 'InpGauss';
textLor = uicontrol(fig,'Style','text');
textLor.String = 'lw(Lor) = ';
textLor.Units = 'Normalized';
textLor.Position = [.855 .38 .0675 .05];
textLor.HorizontalAlignment = 'right';
textLor.FontUnits = 'Normalized';
textLor.FontSize = 0.6;
textLor.Tag = 'textLor';
InpLor = uicontrol(fig,'Style','edit');
InpLor.String = '0';
InpLor.Units = 'Normalized';
InpLor.Position = [.9225 .38 .0675 .05];
InpLor.HorizontalAlignment = 'left';
InpLor.FontUnits = 'Normalized';
InpLor.FontSize = 0.6;
InpLor.Tag = 'InpLor';
uicontrol(InpTx); %passes focus to first input
uiwait(fig)
%% Callback functions
function PreSimApplyButtonPushed(~,~)
%get values from params
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
%get values from UI
T1 = str2double(get(InpTx,'String'));
T2 = str2double(get(InpTy,'String'));
T3 = str2double(get(InpTz,'String'));
Tsum = T1 + T2 + T3;
T1n = T1/Tsum; T2n = T2/Tsum; T3n = T3/Tsum; %normalize population
Exp.Temperature = [T1n T2n T3n]; %Triplet population
Sys.S = str2double(get(InpS,'String')); % Total Spin
Sys.g = str2double(get(InpG,'String')); % g-value
D = str2double(get(InpD,'String'));
E = str2double(get(InpE,'String'));
Sys.D = [D E]; % MHz, D and E values
lwGau = str2double(get(InpGauss,'String'));
lwLor = str2double(get(InpLor,'String'));
Sys.lw = [lwGau lwLor]; % mT, linewidth needs to be optimised
%perform a simulation with the parameters above
[bfield,spec] = pepper(Sys,Exp);
spec_norm = spec/max(spec); % normalize the simulation
%plot result
plot(ax,0.1*params.Field_Vector,params.max_mean,'r',...
bfield,spec_norm,'b','LineWidth',1.2)
legend('experimental','simulation')
axis tight
%write manual fit to params
params.Manual_Sys = Sys;
params.Triplett_pop = Exp.Temperature;
end
function PreSimDoneButtonPushed(~,~)
close 'Manual Simulation'
end
end

60
print_figure_pdf.m Normal file
View File

@ -0,0 +1,60 @@
function [] = print_figure_pdf(data,params,type)
%PRINT_FIGURE_PDF creates pdf figures of TREPR data
%
% Usage: PRINT_FIGURE_PDF(data,params,type), where data are TREPR data
% loaded by LOAD_MATLAB or LOAD_BRUKER, params is a struct created by
% SIMULATION_TREPR and type a number.
%
% type = 1: 2D plot of data and simulation with magnetic field as x-axis
% type = 2: 3D plot of data without simulation
if type == 1
%getting simulation values
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 = params.Triplett_pop;
Sys = params.Fitted_Simulation;
%calculate simulation
[~,spec] = pepper(Sys,Exp);
spec_norm = spec/max(spec); % normalize the simulation
%plot invisible and print
figure('Visible','off')
plot(0.1*params.Field_Vector,params.max_mean,'r',...
0.1*params.Field_Vector,spec_norm,'b','LineWidth',1.2)
xlabel 'Magnetic Field / mT'
ylabel 'EPR signal / A. U.'
legend('experimental','simulation')
title(params.Name, 'Interpreter','none')
axis tight
set(gcf,'Units','Inches');
pos = get(gcf,'Position');
set(gcf,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)]);
figurepath = strcat(params.Path,"/",params.Name,"_Sim.pdf"); %create full filename
print(gcf,figurepath,'-dpdf','-r0');
elseif type == 2
%plot invisible and print
figure('Visible','off')
surf(0.1*params.Field_Vector, params.TimeBase*1e6, data)
colormap default
shading interp
view(305,10)
axis tight
xlabel 'Magnetic Field / mT'
ylabel 'Time / \mus'
zlabel 'EPR Signal / A.U.'
title(params.Name, 'Interpreter','none')
set(gcf,'Units','Inches');
pos = get(gcf,'Position');
set(gcf,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)]);
figurepath = strcat(params.Path,"/",params.Name,"_3D.pdf"); %create full filename
print(gcf,figurepath,'-dpdf','-r0');
else
error('Unknown plot type.');
end
end

358
simulation_TREPR.m Normal file
View File

@ -0,0 +1,358 @@
function [params] = simulation_TREPR(params)
%SIMULATION_TREPR uses esfit to perform fitting of TREPR simulation
%
% Usage: [params] = SIMULATION_TREPR(params), where params is a struct
% created by the PRE_SIMULATION_TREPR function.
%
% This function will show the mean of maxima, specified in the
% NORMALIZE_DATA function and allow inputs for Variation limits of
% relevant parameters for the simulations and for fitting options.
% "Start Fit" will call esfit and perform the specified fitting. For
% possible values, please refer to the easyspin docs.
% "Save Parameters" will write the current best fitting simulation
% parameters as starting values for a possible next iteration of fitting
% and also write them to the params struct. The button may only be
% pressed after performing at least one iteration of fitting.
% "Done" will close the window.
%% setup
%create struct for passing data between callbacks
eventdata.manSys = params.Manual_Sys;
eventdata.manExp.mwFreq = params.mwFreq; %GHz
eventdata.manExp.nPoints= length(params.Field_Vector);
eventdata.manExp.CenterSweep = 0.1*[params.Field_Center params.Field_Sweep]; % mT (converted from Gauss)
eventdata.manExp.Harmonic = 0; % zeroth harmonic
eventdata.manExp.Temperature = params.Triplett_pop;
eventdata.simSys = params.Manual_Sys; %initialize simulation parameters
eventdata.simExp = eventdata.manExp;
%% creating UI
fig = figure;
fig.Name = 'Simulation';
fig.Units = 'Normalized';
fig.Position = [.15 .2 .7 .6];
fig.Tag = 'Normalize';
%panel for plot
plotpanel = uipanel(fig);
plotpanel.Units = 'Normalized';
plotpanel.Position = [.01 .01 .7 .98];
%axes for plot
ax = axes(plotpanel);
ax.XLabel.String = 'magnetic field';
ax.YLabel.String = 'Intensity';
%plot manual simulation
[bfield,spec] = pepper(eventdata.manSys,eventdata.manExp);
spec_norm = spec/max(spec); % normalize the simulation
plot(ax,0.1*params.Field_Vector,params.max_mean,'r',...
bfield,spec_norm,'b','LineWidth',1.2)
xlabel 'Magnetic Field / mT'
ylabel 'EPR signal / A. U.'
legend('experimental','simulation')
axis tight
%% create push buttons
s = uicontrol(fig,'Style','pushbutton');
s.String = 'Start Fit';
s.Units = 'Normalized';
s.Position = [.72 .13 .27 .05];
s.FontUnits = 'Normalized';
s.FontSize = 0.6;
s.Tag = 'Start';
s.Callback = @SimStartButtonPushed;
p = uicontrol(fig,'Style','pushbutton');
p.String = 'Save Parameters';
p.Units = 'Normalized';
p.Position = [.72 .07 .27 .05];
p.FontUnits = 'Normalized';
p.FontSize = 0.6;
p.Tag = 'Save';
p.Callback = @SimSaveButtonPushed;
d = uicontrol(fig,'Style','pushbutton');
d.String = 'Done';
d.Units = 'Normalized';
d.Position = [.72 .01 .27 .05];
d.FontUnits = 'Normalized';
d.FontSize = 0.6;
d.Tag = 'Done';
d.Callback = @SimDoneButtonPushed;
%% create input and text fields (Triplet)
textTrip = uicontrol(fig,'Style','text');
textTrip.String = 'Triplett population variations';
textTrip.Units = 'Normalized';
textTrip.Position = [.71 .94 .28 .05];
textTrip.HorizontalAlignment = 'center';
textTrip.FontUnits = 'Normalized';
textTrip.FontSize = 0.6;
textTrip.FontWeight = 'bold';
textTrip.Tag = 'textTrip';
textTx = uicontrol(fig,'Style','text');
textTx.String = 'T_1 = ';
textTx.Units = 'Normalized';
textTx.Position = [.71 .89 .04333 .05];
textTx.HorizontalAlignment = 'right';
textTx.FontUnits = 'Normalized';
textTx.FontSize = 0.6;
textTx.Tag = 'textTx';
InpTx = uicontrol(fig,'Style','edit');
InpTx.String = '0';
InpTx.Units = 'Normalized';
InpTx.Position = [.75334 .89 .04333 .05];
InpTx.HorizontalAlignment = 'left';
InpTx.FontUnits = 'Normalized';
InpTx.FontSize = 0.6;
InpTx.Tag = 'InpTx';
textTy = uicontrol(fig,'Style','text');
textTy.String = 'T_2 = ';
textTy.Units = 'Normalized';
textTy.Position = [.80668 .89 .04333 .05];
textTy.HorizontalAlignment = 'right';
textTy.FontUnits = 'Normalized';
textTy.FontSize = 0.6;
textTy.Tag = 'textTy';
InpTy = uicontrol(fig,'Style','edit');
InpTy.String = '0';
InpTy.Units = 'Normalized';
InpTy.Position = [.85001 .89 .04333 .05];
InpTy.HorizontalAlignment = 'left';
InpTy.FontUnits = 'Normalized';
InpTy.FontSize = 0.6;
InpTy.Tag = 'InpTy';
textTz = uicontrol(fig,'Style','text');
textTz.String = 'T_3 = ';
textTz.Units = 'Normalized';
textTz.Position = [.90334 .89 .04333 .05];
textTz.HorizontalAlignment = 'right';
textTz.FontUnits = 'Normalized';
textTz.FontSize = 0.6;
textTz.Tag = 'textTz';
InpTz = uicontrol(fig,'Style','edit');
InpTz.String = '0';
InpTz.Units = 'Normalized';
InpTz.Position = [.94667 .89 .04333 .05];
InpTz.HorizontalAlignment = 'left';
InpTz.FontUnits = 'Normalized';
InpTz.FontSize = 0.6;
InpTz.Tag = 'InpTz';
%% create input and text fields (D & E)
textDE = uicontrol(fig,'Style','text');
textDE.String = 'D tensor variation';
textDE.Units = 'Normalized';
textDE.Position = [.71 .78 .28 .05];
textDE.HorizontalAlignment = 'center';
textDE.FontUnits = 'Normalized';
textDE.FontSize = 0.6;
textDE.FontWeight = 'bold';
textDE.Tag = 'textDE';
textD = uicontrol(fig,'Style','text');
textD.String = 'D = ';
textD.Units = 'Normalized';
textD.Position = [.71 .73 .0675 .05];
textD.HorizontalAlignment = 'right';
textD.FontUnits = 'Normalized';
textD.FontSize = 0.6;
textD.Tag = 'textD';
InpD = uicontrol(fig,'Style','edit');
InpD.String = '100';
InpD.Units = 'Normalized';
InpD.Position = [.7775 .73 .0675 .05];
InpD.HorizontalAlignment = 'left';
InpD.FontUnits = 'Normalized';
InpD.FontSize = 0.6;
InpD.Tag = 'InpD';
textE = uicontrol(fig,'Style','text');
textE.String = 'E = ';
textE.Units = 'Normalized';
textE.Position = [.855 .73 .0675 .05];
textE.HorizontalAlignment = 'right';
textE.FontUnits = 'Normalized';
textE.FontSize = 0.6;
textE.Tag = 'textE';
InpE = uicontrol(fig,'Style','edit');
InpE.String = '20';
InpE.Units = 'Normalized';
InpE.Position = [.9225 .73 .0675 .05];
InpE.HorizontalAlignment = 'left';
InpE.FontUnits = 'Normalized';
InpE.FontSize = 0.6;
InpE.Tag = 'InpE';
%% create input and text fields (linewidth)
textLW = uicontrol(fig,'Style','text');
textLW.String = 'Linewidth variations';
textLW.Units = 'Normalized';
textLW.Position = [.71 .62 .28 .05];
textLW.HorizontalAlignment = 'center';
textLW.FontUnits = 'Normalized';
textLW.FontSize = 0.6;
textLW.FontWeight = 'bold';
textLW.Tag = 'textLW';
textGauss = uicontrol(fig,'Style','text');
textGauss.String = 'lw(Gau) = ';
textGauss.Units = 'Normalized';
textGauss.Position = [.71 .57 .0675 .05];
textGauss.HorizontalAlignment = 'right';
textGauss.FontUnits = 'Normalized';
textGauss.FontSize = 0.6;
textGauss.Tag = 'textGauss';
InpGauss = uicontrol(fig,'Style','edit');
InpGauss.String = '1';
InpGauss.Units = 'Normalized';
InpGauss.Position = [.7775 .57 .0675 .05];
InpGauss.HorizontalAlignment = 'left';
InpGauss.FontUnits = 'Normalized';
InpGauss.FontSize = 0.6;
InpGauss.Tag = 'InpGauss';
textLor = uicontrol(fig,'Style','text');
textLor.String = 'lw(Lor) = ';
textLor.Units = 'Normalized';
textLor.Position = [.855 .57 .0675 .05];
textLor.HorizontalAlignment = 'right';
textLor.FontUnits = 'Normalized';
textLor.FontSize = 0.6;
textLor.Tag = 'textLor';
InpLor = uicontrol(fig,'Style','edit');
InpLor.String = '0';
InpLor.Units = 'Normalized';
InpLor.Position = [.9225 .57 .0675 .05];
InpLor.HorizontalAlignment = 'left';
InpLor.FontUnits = 'Normalized';
InpLor.FontSize = 0.6;
InpLor.Tag = 'InpLor';
%% create input and text fields (g)
textG = uicontrol(fig,'Style','text');
textG.String = 'g-value variation = ';
textG.Units = 'Normalized';
textG.Position = [.71 .46 .2 .05];
textG.HorizontalAlignment = 'right';
textG.FontUnits = 'Normalized';
textG.FontSize = 0.6;
textG.Tag = 'textG';
InpG = uicontrol(fig,'Style','edit');
InpG.String = '0.01';
InpG.Units = 'Normalized';
InpG.Position = [.9225 .46 .0675 .05];
InpG.HorizontalAlignment = 'left';
InpG.FontUnits = 'Normalized';
InpG.FontSize = 0.6;
InpG.Tag = 'InpG';
%% create input and text fields (FitOpt)
textOpt = uicontrol(fig,'Style','text');
textOpt.String = 'Fitting Options';
textOpt.Units = 'Normalized';
textOpt.Position = [.71 .35 .28 .05];
textOpt.HorizontalAlignment = 'center';
textOpt.FontUnits = 'Normalized';
textOpt.FontSize = 0.6;
textOpt.FontWeight = 'bold';
textOpt.Tag = 'textFitOpt';
textMeth = uicontrol(fig,'Style','text');
textMeth.String = 'Method: ';
textMeth.Units = 'Normalized';
textMeth.Position = [.71 .30 .0675 .05];
textMeth.HorizontalAlignment = 'right';
textMeth.FontUnits = 'Normalized';
textMeth.FontSize = 0.6;
textMeth.Tag = 'textMeth';
InpMeth = uicontrol(fig,'Style','edit');
InpMeth.String = 'simplex fcn';
InpMeth.Units = 'Normalized';
InpMeth.Position = [.7775 .30 .2125 .05];
InpMeth.HorizontalAlignment = 'left';
InpMeth.FontUnits = 'Normalized';
InpMeth.FontSize = 0.6;
InpMeth.Tag = 'InpMeth';
textScal = uicontrol(fig,'Style','text');
textScal.String = 'Scaling: ';
textScal.Units = 'Normalized';
textScal.Position = [.71 .24 .0675 .05];
textScal.HorizontalAlignment = 'right';
textScal.FontUnits = 'Normalized';
textScal.FontSize = 0.6;
textScal.Tag = 'textScal';
InpScal = uicontrol(fig,'Style','edit');
InpScal.String = 'lsq';
InpScal.Units = 'Normalized';
InpScal.Position = [.7775 .24 .2125 .05];
InpScal.HorizontalAlignment = 'left';
InpScal.FontUnits = 'Normalized';
InpScal.FontSize = 0.6;
InpScal.Tag = 'InpScal';
%% UI wait
uicontrol(InpTx); %passes focus to first input
uiwait(fig)
%% Callback functions
function SimStartButtonPushed(~,~)
%get Vary and Opt from Input
varT1 = str2double(get(InpTx,'String'));
varT2 = str2double(get(InpTy,'String'));
varT3 = str2double(get(InpTz,'String'));
Vary.Temperature = [varT1 varT2 varT3];
varD = str2double(get(InpD,'String'));
varE = str2double(get(InpE,'String'));
Vary.D = [varD varE];
varGauss = str2double(get(InpGauss,'String'));
varLor = str2double(get(InpLor,'String'));
Vary.lw = [varGauss varLor];
Vary.g = str2double(get(InpG,'String'));
FitOpt.Method = get(InpMeth,'String');
FitOpt.Scaling = get(InpScal,'String');
%get previous simulation parameters (manual or saved)
Sys0 = eventdata.simSys;
Exp0 = eventdata.simExp;
%perform fit
Sys0.Temperature = [0 0 0];
[BestSys,BestSpc] = esfit('thyme',params.max_mean,Sys0,Vary,Exp0,[],FitOpt);
plot(ax,0.1*params.Field_Vector,params.max_mean,'r',...
0.1*params.Field_Vector,BestSpc,'b','LineWidth',1.2)
xlabel 'Magnetic Field / mT'
ylabel 'EPR signal / A. U.'
legend('experimental','simulation')
axis tight
%normalize Triplett population
Tsum = sum(BestSys.Temperature);
BestSys.Temperature = BestSys.Temperature ./ Tsum;
%write best simulation parameters to eventdata
eventdata.BestSys = BestSys;
end
function SimSaveButtonPushed(~,~)
%set current parameters as new start values
eventdata.simSys = eventdata.BestSys;
eventdata.simExp.Temperature = eventdata.BestSys.Temperature;
%save fitted parameters to struct
params.Fitted_Simulation = eventdata.BestSys;
end
function SimDoneButtonPushed(~,~)
close 'Simulation'
end
end

9
thyme.m Normal file
View File

@ -0,0 +1,9 @@
function y = thyme(Sys,Exp,Opt)
%THYME custom function for easyspin fitting
%
% Takes Triplett populations into account when performing esfit.
% Call as [B,Spec] = esfit('thyme',Sys,Exp,Opt);
Sys.Temperature = Exp.Temperature;
y = pepper(Sys,Exp,Opt);
end

117
write_params_txt.m Normal file
View File

@ -0,0 +1,117 @@
function [] = write_params_txt(params)
%WRITE_PARAMS_TXT Summary of this function goes here
% Detailed explanation goes here
filename = strcat(params.Path,"/",params.Name,".txt");
struct2File(params,filename);
function struct2File(s,fileName,varargin)
%Write struct to text file. The data in the struct can be both numbers and
%strings. The first line in the file will be a row with the headers/names
%of the columns.
%Ex: struct2File( s, 'c:/test.txt' );
%Ex: struct2File( s, 'c:/test.txt', 'precision', 3 ); %specify precision
%Ex: struct2File( s, 'c:/test.txt', 'promptOverWrite', false );
[varargin,align]=getarg(varargin,'align',false);
align=align{:};
[varargin,delimiter]=getarg(varargin,'delimiter','\t');
delimiter=delimiter{:};
[varargin,units]=getarg(varargin,'units','');
units=units{:};
[varargin,promptOverWrite]=getarg(varargin,'promptOverWrite',false);
promptOverWrite=promptOverWrite{:};
[varargin,precision]=getarg(varargin,'precision',6);
precision=precision{:};
[varargin,Sort]=getarg(varargin,'sort',true);
Sort=Sort{:};
if ~isempty(varargin)
error('Unknown optional arguments specified');
end
fields = fieldnames(s)';
if ~isempty(units)
if numel(units)~=numel(fields)
error('The number of units specified doesn not match the number of fields in the struct');
end
end
if exist(fileName,'file')==2 && promptOverWrite
res = questdlg('File exists, overwrite?','', ...
'Yes', 'No', 'Yes');
if strcmpi(res,'No')
disp('Aborted');
return;
end
end
data=cell(numel(s),numel(fields));
for k=1:numel(fields)
fn=fields{k};
data(:,k) = {s.(fn)};
end
if size(units,2)==1
units = units';
end
if ~isempty(units)
data=[units;data];
end
data=[fields;data];
if Sort
[fields,ind] = sort(fields);
data = data(:,ind);
end
%ex1 = {'a' 1 12 123; 'ab' 4 5 6; 'abc' 7 8 9};
ex_func3 = @(input)ex_func(input,precision);
ex2 = cellfun(ex_func3,data,'UniformOutput',0);
if align
size_ex2 = cellfun(@length,ex2,'UniformOutput',0);
str_length = max(max(cell2mat(size_ex2)))+1;
ex2 = cellfun(@(x) ex_func2(x,str_length),ex2,'uniformoutput',0);
ex2 = cell2mat(ex2);
end
fid = fopen(fileName,'wt');
if fid==-1
error('Could not open %s');
end
if iscell(ex2)
[m,n]=size(ex2);
for i=1:m
for j=1:n
fprintf(fid,'%s',ex2{i,j});
if j<n
fprintf(fid,delimiter);
end
end
if i<m
fprintf(fid,'\n');
end
end
else
m=size(ex2,1);
for i=1:m
fprintf(fid,'%s',strtrim(ex2(i,:)));
if i<m
fprintf(fid,'\n');
end
end
end
fclose(fid);
function [ out ] = ex_func( in, prec )
if iscell(in)
in = in{:};
end
in_datatype = class(in);
switch in_datatype
case 'char'
out = in;
case 'double'
out = num2str(in, prec);
otherwise
error('Unknown type');
end
end
function [ out ] = ex_func2( in, str_length )
a = length(in);
out = [char(32*ones(1,str_length-a)), in];
{"mode":"full","isActive":false};
end
end
end