Finished objectifying #8
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1,3 @@
|
|||||||
*.asv
|
*.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