Skip to content

Commit 0ec7056

Browse files
committed
Added
- New sub GUI 2DInv in NUCLEUSinv for 2D T1-T2 inversion (works so far for HELIOS, DART and JAVELIN (Vista Clara) and RockCoreAnalyzer (Magritek) data) - New import routines in NUCLEUSinv for the NMR Dart Logging tool - New Extra menu entry in NUCLEUSinv to find duplicate NMR signals in the file list - New fitting options in the PhaseView sub GUI of NUCLEUSinv Changed - Unified the appearance along several sub GUIs for consistency - Updated the wait bar increments for very long batch runs - When HELIOS data is imported, the user can now decide if several files should be stacked together Fixed - Fixed a bug when importing data and the Statistics Toolbox is not available
1 parent 9408835 commit 0ec7056

File tree

147 files changed

+21188
-8030
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

147 files changed

+21188
-8030
lines changed

CHANGELOG.md

+17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# Changelog
22

3+
## [0.3.0] - 2024-11-27
4+
5+
### Added
6+
- New sub GUI *2DInv* in **NUCLEUSinv** for 2D T1-T2 inversion (works so far for HELIOS, DART and JAVELIN (Vista Clara) and RockCoreAnalyzer (Magritek) data)
7+
- New import routines in **NUCLEUSinv** for the NMR Dart Logging tool
8+
- New *Extra* menu entry in **NUCLEUSinv** to find duplicate NMR signals in the file list
9+
- New fitting options in the *PhaseView* sub GUI of **NUCLEUSinv**
10+
11+
### Changed
12+
- Unified the appearance along several sub GUIs for consistency
13+
- Updated the wait bar increments for very long batch runs
14+
- When *HELIOS* data is imported, the user can now decide if several files should be stacked together
15+
16+
### Fixed
17+
- Fixed a bug when importing data and the Statistics Toolbox is not available
18+
319
## [0.2.1] - 2024-02-11
420

521
### Added
@@ -215,6 +231,7 @@
215231

216232
Initial Version
217233

234+
[0.3.0]: https://github.com/ThoHiller/nmr-nucleus/compare/v.0.2.1...v.0.3.0
218235
[0.2.1]: https://github.com/ThoHiller/nmr-nucleus/compare/v.0.2.0...v.0.2.1
219236
[0.2.0]: https://github.com/ThoHiller/nmr-nucleus/compare/v.0.1.14...v.0.2.0
220237
[0.1.14]: https://github.com/ThoHiller/nmr-nucleus/compare/v.0.1.13...v.0.1.14

NUCLEUSinv/NUCLEUSinv.m

+3-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
if ~isempty(h0); close(h0); end
3939

4040
%% GUI 'header' info and defaults
41-
myui.version = '0.2.1';
42-
myui.date = '11.02.2024';
41+
myui.version = '0.3.0';
42+
myui.date = '27.11.2024';
4343
myui.author = {'Stephan Costabel','Thomas Hiller'};
4444
myui.email = 'thomas.hiller[at]bgr.de';
4545
myui.fontsize = 10;
@@ -68,6 +68,7 @@
6868
data.uncert = defaults.uncert;
6969
data.calib = defaults.calib;
7070
data.invjoint = defaults.invjoint;
71+
data.inv2D = defaults.inv2D;
7172
data.pressure = defaults.pressure;
7273
gui.myui = myui;
7374

NUCLEUSinv/NUCLEUSinv_createMenus.m

+56-25
Original file line numberDiff line numberDiff line change
@@ -48,88 +48,108 @@
4848
gui.menu.file_import_lab = uimenu(gui.menu.file_import,...
4949
'Label','Lab');
5050

51-
% 1.1.1.1 BAM
51+
% 1.1.1.1 AARHUS
52+
gui.menu.file_import_lab_aarhus = uimenu(gui.menu.file_import_lab,...
53+
'Label','AARHUS');
54+
% 1.1.1.1.1 AARHUS Dart T1T2
55+
gui.menu.file_import_lab_aarhus_dartT1T2 = uimenu(gui.menu.file_import_lab_aarhus,...
56+
'Label','Dart T1T2','Tag','Lab','Callback',@onMenuImport);
57+
% 1.1.1.1.2 AARHUS Dart T2 logging
58+
gui.menu.file_import_lab_aarhus_dartT2 = uimenu(gui.menu.file_import_lab_aarhus,...
59+
'Label','Dart T2 logging','Tag','Lab','Callback',@onMenuImport);
60+
61+
% 1.1.1.2 BAM
5262
gui.menu.file_import_lab_bam = uimenu(gui.menu.file_import_lab,...
5363
'Label','BAM');
54-
% 1.1.1.1.1 BAM TOM
64+
% 1.1.1.2.1 BAM TOM
5565
gui.menu.file_import_lab_bam_tom = uimenu(gui.menu.file_import_lab_bam,...
5666
'Label','BAM TOM','Tag','Lab','Callback',@onMenuImport);
5767

58-
% 1.1.1.2 BGR
68+
% 1.1.1.3 BGR
5969
gui.menu.file_import_lab_bgr = uimenu(gui.menu.file_import_lab,...
6070
'Label','BGR');
61-
% 1.1.1.2.1 BGR std
71+
% 1.1.1.3.1 BGR std
6272
gui.menu.file_import_lab_bgr_std = uimenu(gui.menu.file_import_lab_bgr,...
6373
'Label','BGR std','Tag','Lab','Callback',@onMenuImport);
64-
% 1.1.1.2.2 BGR mat
74+
% 1.1.1.3.2 BGR mat
6575
gui.menu.file_import_lab_bgr_mat = uimenu(gui.menu.file_import_lab_bgr,...
6676
'Label','BGR mat','Tag','Lab','Callback',@onMenuImport);
67-
% 1.1.1.2.3 Mouse CPMG data, single data subfolders from CPMG
77+
% 1.1.1.3.3 Mouse CPMG data, single data subfolders from CPMG
6878
gui.menu.file_import_lab_bgr_mouse_cpmg = uimenu(gui.menu.file_import_lab_bgr,...
6979
'Label','MouseCPMG','Tag','Lab','Callback',@onMenuImport);
70-
% 1.1.1.2.4 Mouse plus Lift, all data subfolders from t1test,...
80+
% 1.1.1.3.4 Mouse plus Lift, all data subfolders from t1test,...
7181
% cpmgfastautotest, or (old Prospa Versions) cpmgfastauto
7282
gui.menu.file_import_lab_bgr_mouse_lift = uimenu(gui.menu.file_import_lab_bgr,...
7383
'Label','MouseLift','Tag','Lab','Callback',@onMenuImport);
74-
% 1.1.1.2.5 Helios CPMG standard data, single subfolders with individual data files
84+
% 1.1.1.3.5 Helios CPMG standard data, single subfolders with individual data files
7585
gui.menu.file_import_lab_bgr_helios_cpmg = uimenu(gui.menu.file_import_lab_bgr,...
7686
'Label','HeliosCPMG','Tag','Lab','Callback',@onMenuImport);
77-
% 1.1.1.2.6 Helios series of CPMG data, several files of a series in the target
87+
% 1.1.1.3.6 Helios series of CPMG data, several files of a series in the target
7888
% folder, as used e.g. for T1 measurements
7989
gui.menu.file_import_lab_bgr_helios_series = uimenu(gui.menu.file_import_lab_bgr,...
8090
'Label','HeliosSeries','Tag','Lab','Callback',@onMenuImport);
8191

82-
% 1.1.1.3 LIAG
92+
% 1.1.1.4 LIAG
8393
gui.menu.file_import_lab_liag = uimenu(gui.menu.file_import_lab,...
8494
'Label','LIAG');
85-
% 1.1.1.3.1 LIAG
95+
% 1.1.1.4.1 LIAG
8696
gui.menu.file_import_lab_liag_single = uimenu(gui.menu.file_import_lab_liag,...
8797
'Label','LIAG single','Tag','Lab','Callback',@onMenuImport);
88-
% 1.1.1.3.2 LIAG
98+
% 1.1.1.4.2 LIAG
8999
gui.menu.file_import_lab_liag_project = uimenu(gui.menu.file_import_lab_liag,...
90100
'Label','LIAG from project','Tag','Lab','Callback',@onMenuImport);
91-
% 1.1.1.3.3 LIAG
101+
% 1.1.1.4.3 LIAG
92102
gui.menu.file_import_lab_liag_core = uimenu(gui.menu.file_import_lab_liag,...
93103
'Label','LIAG core','Tag','Lab','Callback',@onMenuImport);
94104

95-
% 1.1.1.4 RWTH
105+
% 1.1.1.5 RUTGERS
106+
gui.menu.file_import_lab_rutgers = uimenu(gui.menu.file_import_lab,...
107+
'Label','RUTGERS');
108+
% 1.1.1.5.1 RUTGERS
109+
gui.menu.file_import_lab_rutgers_T1T2 = uimenu(gui.menu.file_import_lab_rutgers,...
110+
'Label','RoCA T1T2','Tag','Lab','Callback',@onMenuImport);
111+
112+
% 1.1.1.6 RWTH
96113
gui.menu.file_import_lab_rwth = uimenu(gui.menu.file_import_lab,...
97114
'Label','RWTH');
98-
% 1.1.1.4.1 IBAC
115+
% 1.1.1.6.1 IBAC
99116
gui.menu.file_import_lab_ibac = uimenu(gui.menu.file_import_lab_rwth,...
100117
'Label','IBAC');
101-
% 1.1.1.4.1.1 IBAC
118+
% 1.1.1.6.1.1 IBAC
102119
gui.menu.file_import_lab_ibac_pm5 = uimenu(gui.menu.file_import_lab_ibac,...
103120
'Label','PM5','Tag','Lab','Callback',@onMenuImport);
104-
% 1.1.1.4.1.2 IBAC
121+
% 1.1.1.6.1.2 IBAC
105122
gui.menu.file_import_lab_ibac_pm25 = uimenu(gui.menu.file_import_lab_ibac,...
106123
'Label','PM25','Tag','Lab','Callback',@onMenuImport);
107124

108-
% 1.1.1.4.2 GGE
125+
% 1.1.1.6.2 GGE
109126
gui.menu.file_import_lab_gge = uimenu(gui.menu.file_import_lab_rwth,...
110127
'Label','GGE');
111-
% 1.1.1.4.2.1 GGE ascii
128+
% 1.1.1.6.2.1 GGE ascii
112129
gui.menu.file_import_lab_gge_ascii = uimenu(gui.menu.file_import_lab_gge,...
113130
'Label','GGE ascii','Tag','Lab','Callback',@onMenuImport);
114-
% 1.1.1.4.2.2 GGE field
131+
% 1.1.1.6.2.2 GGE field
115132
gui.menu.file_import_lab_gge_field = uimenu(gui.menu.file_import_lab_gge,...
116133
'Label','GGE field','Tag','Lab','Callback',@onMenuImport);
117-
% 1.1.1.4.2.3 GGE Dart
134+
% 1.1.1.6.2.3 GGE Dart
118135
gui.menu.file_import_lab_gge_dart = uimenu(gui.menu.file_import_lab_gge,...
119136
'Label','GGE Dart','Tag','Lab','Callback',@onMenuImport);
120137

121-
% 1.1.1.5 OTHER
138+
% 1.1.1.7 OTHER
122139
gui.menu.file_import_lab_other = uimenu(gui.menu.file_import_lab,...
123140
'Label','OTHER');
124-
% 1.1.1.5.1 CoreLab ascii
141+
% 1.1.1.7.1 CoreLab ascii
125142
gui.menu.file_import_lab_corelab = uimenu(gui.menu.file_import_lab_other,...
126143
'Label','CoreLab ascii','Tag','Lab','Callback',@onMenuImport);
127-
% 1.1.1.5.2 MOUSE
144+
% 1.1.1.7.2 MOUSE
128145
gui.menu.file_import_lab_mouse = uimenu(gui.menu.file_import_lab_other,...
129146
'Label','MOUSE','Tag','Lab','Callback',@onMenuImport);
130-
% 1.1.1.5.3 DART (University of Vienna)
147+
% 1.1.1.7.3 DART (University of Vienna)
131148
gui.menu.file_import_lab_dart = uimenu(gui.menu.file_import_lab_other,...
132149
'Label','DART','Tag','Lab','Callback',@onMenuImport);
150+
% 1.1.1.7.4 DART (incl. Burst echoes)
151+
gui.menu.file_import_lab_dartburst = uimenu(gui.menu.file_import_lab_other,...
152+
'Label','DART (+Burst)','Tag','Lab','Callback',@onMenuImport);
133153

134154
% 1.1.2 Ascii
135155
gui.menu.file_import_ascii = uimenu(gui.menu.file_import,...
@@ -167,6 +187,9 @@
167187
% 1.1.5.2 NUCLEUSmod from GUI
168188
gui.menu.file_import_nmrmod_gui = uimenu(gui.menu.file_import_nmrmod,....
169189
'Label','GUI','Tag','NUCLEUSmod','Callback',@onMenuImport);
190+
% 1.1.5.3 NUCLEUSmod from 2D GUI
191+
gui.menu.file_import_nmrmod_gui2d = uimenu(gui.menu.file_import_nmrmod,....
192+
'Label','2D GUI','Tag','NUCLEUSmod2d','Callback',@onMenuImport);
170193

171194
% 1.2 Export
172195
gui.menu.file_export = uimenu(gui.menu.file,...
@@ -318,6 +341,9 @@
318341
% 2.9 UncertaintyVIEW GUI
319342
gui.menu.extra_uncert = uimenu(gui.menu.view,...
320343
'Label','UncertView GUI','Enable','off','Callback',@onMenuSubGUIs);
344+
% 2.9 2DInv GUI
345+
gui.menu.extra_T1T2map = uimenu(gui.menu.view,...
346+
'Label','2DInv GUI','Enable','off','Callback',@onMenuSubGUIs);
321347

322348
%% 3. Extras
323349
gui.menu.extra = uimenu(gui.figh,...
@@ -374,6 +400,11 @@
374400
'Label','Surface relaxivity bounds','Enable','off',...
375401
'Callback',@onMenuExtraRhoBounds);
376402

403+
% 3.6 find duplicate data
404+
gui.menu.extra_find_duplicates = uimenu(gui.menu.extra,...
405+
'Label','Find duplicate signals','Enable','on',...
406+
'Callback',@onMenuExtraFindDuplicates);
407+
377408

378409
%% 4. Color theme
379410
gui.menu.color_theme = uimenu(gui.figh,...

NUCLEUSinv/NUCLEUSinv_createPanelInversionStd.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@
184184
gui.push_handles.uncert = uicontrol('Parent',gui.panels.invstd.HBox7,'Enable','off',...
185185
'String','CALC.','FontSize',myui.fontsize,'BackGroundColor','g',...
186186
'Tag','uncert','UserData',1,'Callback',@onPushRun);
187-
set(gui.panels.invstd.HBox7,'Widths',[200 -1 -1]);
187+
set(gui.panels.invstd.HBox7,'Widths',[200 -1 -2]);
188188

189189
%% Java Hack to adjust vertical alignment of text fields
190190
jh = findjobj(gui.text_handles.invstd_InvType);

NUCLEUSinv/NUCLEUSinv_loadDefaults.m

+59
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,65 @@
195195
% corresponding scale factors - 1 | 1e-3 | 1e-6 | 1e-5
196196
out.pressure.unitfac = 1;
197197

198+
%% 2D inversion GUI settings
199+
% system / fluid properties
200+
% diffusion coefficient [m²/s]
201+
out.inv2D.prop.D = 2.025e-9;
202+
% gradient [T/m]
203+
out.inv2D.prop.G0 = 0;
204+
% echo time [s]
205+
out.inv2D.prop.te = 200e-6;
206+
% start echo
207+
out.inv2D.prop.first = 1;
208+
% last echo
209+
out.inv2D.prop.last = 1;
210+
211+
% inversion settings
212+
% IR/SR factor
213+
out.inv2D.inv.T1IRfac = 2;
214+
% IR kernel type (1 or 2)
215+
out.inv2D.inv.IRtype = 1;
216+
% T1 range minimum [s]
217+
out.inv2D.inv.T1min = 1e-4;
218+
% T1 range maximum [s]
219+
out.inv2D.inv.T1max = 10;
220+
% T1 number of points in range
221+
out.inv2D.inv.T1N = 51;
222+
% T2 range minimum [s]
223+
out.inv2D.inv.T2min = 1e-4;
224+
% T2 range maximum [s]
225+
out.inv2D.inv.T2max = 10;
226+
% T2 number of points in range
227+
out.inv2D.inv.T2N = 51;
228+
% T1 regularization parameter lambda
229+
out.inv2D.inv.T1lambda = 5;
230+
% T1 order of smoothness constraint
231+
out.inv2D.inv.T1order = 1;
232+
% T2 regularization parameter lambda
233+
out.inv2D.inv.T2lambda = 2;
234+
% T2 order of smoothness constraint
235+
out.inv2D.inv.T2order = 1;
236+
237+
% information settings / properties
238+
% T1 minimum [s]
239+
out.inv2D.info.T1min = 1e-3;
240+
% T1 maximum [s]
241+
out.inv2D.info.T1max = 1;
242+
% T2 minimum [s]
243+
out.inv2D.info.T2min = 1e-3;
244+
% T2 minimum [s]
245+
out.inv2D.info.T2max = 1;
246+
% initial amplitude E0 [a.u.]
247+
out.inv2D.info.E0 = 0;
248+
% T1 log mean time
249+
out.inv2D.info.T1tlgm = 0;
250+
% T2 log mean time
251+
out.inv2D.info.T2tlgm = 0;
252+
% T1 maximum time
253+
out.inv2D.info.T1tmax = 0;
254+
% T2 maximum time
255+
out.inv2D.info.T2tmax = 0;
256+
198257
return
199258

200259
%------------- END OF CODE --------------

NUCLEUSmod/NUCLEUSmod.m

+3-2
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
if ~isempty(h0); close(h0); end
4242

4343
%% GUI 'header' info and defaults
44-
myui.version = '0.2.1';
45-
myui.date = '11.02.2024';
44+
myui.version = '0.3.0';
45+
myui.date = '27.11.2024';
4646
myui.author = {'Stephan Costabel','Thomas Hiller'};
4747
myui.email = 'thomas.hiller[at]bgr.de';
4848
myui.fontsize = 10;
@@ -65,6 +65,7 @@
6565
data.geometry = defaults.geometry;
6666
data.pressure = defaults.pressure;
6767
data.nmr = defaults.nmr;
68+
data.mod2D = defaults.mod2D;
6869
gui.myui = myui;
6970

7071
% save the data struct within the GUI

NUCLEUSmod/NUCLEUSmod_createMenus.m

+6-2
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,13 @@
9999
% 2.2 Figure Toolbar
100100
gui.menu.view_toolbar = uimenu(gui.menu.view,...
101101
'Label','Figure Toolbar','Callback',@onMenuView);
102-
% 2.3 hydraulic conductivity
102+
% 2.3 2D modelling GUI
103+
gui.menu.view_2dmod = uimenu(gui.menu.view,...
104+
'Label','2DMod GUI','Separator','on','Enable','on',...
105+
'Callback',@onMenuSubGUIs);
106+
% 2.4 hydraulic conductivity
103107
gui.menu.view_conduct = uimenu(gui.menu.view,...
104-
'Label','ConductView GUI','Separator','on','Enable','off',...
108+
'Label','ConductView GUI','Enable','off',...
105109
'Callback',@onMenuSubGUIs);
106110

107111
%% 3. Color theme

NUCLEUSmod/NUCLEUSmod_createPanelNMR.m

-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@
114114
set(gui.panels.nmr.HBox3,'Widths',[200 -1]);
115115

116116
%% noise & porosity
117-
118117
tstr = ['<HTML>NMR data noise method.<br><br>',...
119118
'A noise level will be used globally for all NMR signals.<br>',...
120119
'A signal-to-ratio will be used individually on every single NMR signal.<br><br>',...

NUCLEUSmod/NUCLEUSmod_loadDefaults.m

+51
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,57 @@
9292
% use linear y-axes as default (log=1, lin=2)
9393
out.nmr.logliny = 2;
9494

95+
%% 2D settings
96+
% system / fluid properties
97+
% diffusion coefficient [m²/s]
98+
out.mod2D.prop.D = 2.025e-9;
99+
% gradient [T/m]
100+
out.mod2D.prop.G0 = 0;
101+
% echo time [s]
102+
out.mod2D.prop.te = 0;
103+
% bulk relaxation [s]
104+
out.mod2D.prop.Tbulk = 1e6;
105+
106+
% model space settings
107+
% 2D type
108+
out.mod2D.mod.type = 'T1T2';
109+
% T1 range minimum [s]
110+
out.mod2D.mod.T1min = 1e-4;
111+
% T1 range maximum [s]
112+
out.mod2D.mod.T1max = 10;
113+
% T1 number of points in range
114+
out.mod2D.mod.T1N = 151;
115+
% T2 range minimum [s]
116+
out.mod2D.mod.T2min = 1e-4;
117+
% T2 range maximum [s]
118+
out.mod2D.mod.T2max = 10;
119+
% T2 number of points in range
120+
out.mod2D.mod.T2N = 151;
121+
122+
% number of 2D distribution
123+
out.mod2D.mod.Ndist = 3;
124+
% center point of 2D distribution
125+
out.mod2D.mod.mu = [1 1;0.01 0.03;0.5 0.005];
126+
% covariance matrix of 2D distribution
127+
out.mod2D.mod.sigma{1} = [0.1 0;0 0.1];
128+
out.mod2D.mod.sigma{2} = [0.2 0.3;0 0.2];
129+
out.mod2D.mod.sigma{3} = [0.3 0;0 0.01];
130+
% amplitude of 2D distribution
131+
out.mod2D.mod.amp = [1 1 1];
132+
133+
% NMR data
134+
out.mod2D.nmr.T1IRfac = 2;
135+
out.mod2D.nmr.IRtype = 1;
136+
out.mod2D.nmr.T1trmin = 1e-3;
137+
out.mod2D.nmr.T1trmax = 1;
138+
out.mod2D.nmr.T1trN = 21;
139+
out.mod2D.nmr.T2te = 200e-6;
140+
out.mod2D.nmr.T2teN = 500;
141+
% noise creation type 'level' or 'SNR'
142+
out.mod2D.nmr.noisetype = 'level';
143+
% noise level [0:1] or SNR [-]
144+
out.mod2D.nmr.noise = 0;
145+
95146
return
96147

97148
%------------- END OF CODE --------------

0 commit comments

Comments
 (0)