Merge pull request 'Finished objectifying' (#8) from objectify into master
Reviewed-on: #8
This commit is contained in:
commit
4086fbee68
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1,3 @@
|
||||
*.asv
|
||||
*.pdf
|
||||
*.xml
|
||||
|
217
EPR_script.m
217
EPR_script.m
@ -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
24
TR_EPR_script.m
Normal 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
127
correct_magnetic_baseline.m
Normal 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
101
correct_time_baseline.m
Normal 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
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
65
figure_testing.m
Normal 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
66
load_bruker.m
Normal 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
47
load_matlab.m
Normal 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
109
normalize_data.m
Normal 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
118
pentacene_355nm_481pt.DSC
Normal 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
BIN
pentacene_355nm_481pt.DTA
Normal file
Binary file not shown.
BIN
pentacene_355nm_481pt.YGF
Normal file
BIN
pentacene_355nm_481pt.YGF
Normal file
Binary file not shown.
300
pre_simulation_TREPR.m
Normal file
300
pre_simulation_TREPR.m
Normal 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
60
print_figure_pdf.m
Normal 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
358
simulation_TREPR.m
Normal 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
9
thyme.m
Normal 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
117
write_params_txt.m
Normal 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
|
Loading…
x
Reference in New Issue
Block a user