From 0d2763fbee7033a481cf7024dfdc8d50238a9dd2 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 18 Oct 2021 13:53:57 +0100 Subject: [PATCH] Re #356 working serializable class, modified IX_aperture and unit tests for it and its previous versions --- .../check_matfile_IO.m | 33 +++ .../ver1_IX_aperture_ap.mat | Bin 0 -> 591 bytes .../ver1_IX_aperture_ap_arr.mat | Bin 0 -> 733 bytes .../ver1_IX_divergence_profile_div.mat | Bin 0 -> 1194 bytes .../ver1_IX_divergence_profile_div_arr.mat | Bin 0 -> 7510 bytes .../ver1_IX_doubledisk_chopper_disk.mat | Bin 0 -> 2627 bytes .../ver1_IX_doubledisk_chopper_disk_arr.mat | Bin 0 -> 6423 bytes .../ver1_IX_fermi_chopper_fermi.mat | Bin 0 -> 848 bytes .../ver1_IX_fermi_chopper_fermi_arr.mat | Bin 0 -> 1245 bytes .../ver1_IX_moderator_moderator.mat | Bin 0 -> 6808 bytes .../ver1_IX_moderator_moderator_arr.mat | Bin 0 -> 24885 bytes .../ver1_IX_sample_sample.mat | Bin 0 -> 1204 bytes .../ver1_IX_sample_sample_arr.mat | Bin 0 -> 1741 bytes .../test_IX_aperture.m | 57 +++- .../test_IX_aperture_output.mat | Bin 883 -> 898 bytes .../instrument/@IX_aperture/IX_aperture.m | 243 ++++-------------- .../classes/@serializable/private/loadobj_.m | 4 +- .../classes/@serializable/serializable.m | 14 +- .../utilities/misc/get_object_conts.m | 2 + 19 files changed, 149 insertions(+), 204 deletions(-) create mode 100644 _test/test_instrument_classes/check_matfile_IO.m create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_aperture_ap.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_aperture_ap_arr.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_divergence_profile_div.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_divergence_profile_div_arr.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_doubledisk_chopper_disk.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_doubledisk_chopper_disk_arr.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_fermi_chopper_fermi.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_fermi_chopper_fermi_arr.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_moderator_moderator.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_moderator_moderator_arr.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_sample_sample.mat create mode 100644 _test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_sample_sample_arr.mat diff --git a/_test/test_instrument_classes/check_matfile_IO.m b/_test/test_instrument_classes/check_matfile_IO.m new file mode 100644 index 000000000..48934ab5c --- /dev/null +++ b/_test/test_instrument_classes/check_matfile_IO.m @@ -0,0 +1,33 @@ +function [ok,mess] = check_matfile_IO (ver_str, save_variables, filepath,varargin) +% Save to or read from mat file +% input +% ver_str -- the name of the version string e.g. ver0 for old +% version ver1 for version 1 etc +% save_variables -- if true, saves sample variables, if false load +% them from disk +% filepath -- the location of source test files on hdd. +% If the routine writes to disk, it writes +% test files into temporarty directory +% varargin -- variables to save/load on hdd +mess = ''; +ok = true; +for i=1:numel(varargin) + class_name = class(varargin{i}); + arg_name = inputname(i+3); + flname = [ver_str,'_',class_name,'_',arg_name,'.mat']; + if save_variables + eval([arg_name,' = varargin{i};']); + try + save(fullfile(tmp_dir,flname),arg_name); + catch + mess=['*** ERROR: Problem writing ',arg_name,' to ',flname]; + ok = false; + end + else + tmp = load(fullfile(filepath,'saved_class_versions_as_mat_files',flname),arg_name); + if ~isequal(varargin{i},tmp.(arg_name)) + ok = false; + mess=['*** ERROR: Argument ''',arg_name,''' read from ',flname,' does not match original']; + end + end +end diff --git a/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_aperture_ap.mat b/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_aperture_ap.mat new file mode 100644 index 0000000000000000000000000000000000000000..f19ab9dec602a263be4334c550f9203d534b30e2 GIT binary patch literal 591 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQV4Jk_w+L}(NSSQvRWLNMGBvU?HC8Y(Ffvpi65L{d0!B|?ejqalh%4qiPEJU8!H{I8 z@QfkJk&PoEB_YW}hvA|Q&%Sg24)!=0<|%yZ>G0R_(ACn^^%Q|tRbuIaFFQQFtZ#kZJ~|LL{v-#!OQQTd z$pQA$AIep|I#Q`y$#net!D|yOt4&SKUu(VbE}QhN^sj8}a>wWIHn%^Paz9>w)!trn z53l*@|8bY!hkOxPRr~(c#=I?i<5&O6+PAElP5bqRS^uW~c{lH!;{FL?nL&5&dEc

rUSQvRWLNMGBvU?HC8Y(Ffvpi5G(xZg-Bo3(@hisok>-3stZ(di&>0T(js!ZSyS5tTQgBPkh zjn`jaeW|;-z9Q!S>ECys%1+;>&2*rGQNjJVjVW_d>df_lzfB$)iX_@)oL;>!eo2_A z&^(Wdyuz6Nd6_!trHQ%C=YyR-^K7npTYY8moeT0yw!L_BbN0NaySAmz>dAj9Y!|8j z&AsJ2$7k&&)pu1d&GV1YVKxk2UUp8$r|RmX=P|t5_stTIe`H?0(YJoCg|*||mR)b( zTw@lVwtAUsysgEjoE!Hx*W9<+W_#ZQINfn&#Tv;om*KfgG$U5b^{zEna^Nt-#r=*+ig}5Y3PWpW0J6An>MZEWw z+2yAN&6{`3X*v8mXG6uBja^#xrIN4e^zQyzYq@pT@=I6W{yJ4Ee@-lJ-Cg#lyX0pr zoG1Evo=_4ZaN@Fa%mt>V{{-fH6SrGIyEyoFgGAFFfuV9ARr(hARr(hARr(hARr(hARr(h zARr(hARr(hARr(hARr(hARr*-00000000000ZB~{000190001Zoa19)V3+{JY(UHb z#DWYEz{tSNkdj#jq*)kzo&AFufnuUS>=_Xc6izKlPt8kCjV~z5Ps_|n1&Z?lu?Lbl zyijvkp?o&5nGnnXNRK`=1T z3Y08FBl@M*zp{Gi+?g}GcgNYSOkb?SclqwQ_ndR@opU)eOax;rHJY(d?F2so@d&$c-)t2kw*wz&l zyLPypisEw1GWmB!`uu(CY5EkyKDd3O6!_eglE1x$#;mmdIc!bXMzH1K_%2DC*Tq?S zgeiLqK6UZAyfU#rj;Z6w3EHNbv@Nrb?P z?a%IAB8Pi`2JQf-~K{>vA-}H*Te(dzdeY5tcm|cufIJ* z<9OmZ#B+(~5hoER6VE4JK)jGRm3R^HV&WylX~av3mk}=~UO}9m@ptFKlbv!RuENZ> z-S)TL$Q!mJu0dQ~`^>s_o7}ciBnpTpK#oOS!s6>$W>|aRcUn)KT?lC&QF=0 zpK=ps-@A;s2??syLqcUWq8<|aVh|0GxaJI^0ivE-5seUOb41x3jiB#qtohdCjL&na zhM4<>h+9ybHH3HoRo0&K)}9u4QNA0|203d_AUfb+P2YiPRM!bgGwRXfCX#E!Q=v&A;_^!%($iDP-)1|K;;o;{W4?h3+ zM9)RL$E`umHN)gw)k2;#)I4kkM*J(?$bsyCH*V!|jVVtL)%s%{Tiw~nM%5jy!h1z8 z^(5YkPpV1XACEedD)`$B{<`S?QNp^x?kl&CWs|Qy1wR*Kxpxvye#r5_6=mhL&dVP7 zlDzY5^RNdpd&^_%*Z0GP8ZQ0tF^3!W!z#2=Rt^9fq2&OmX1xQjM3q6nU}!i9+-h3q zAf)hc$wN@V&B}-1aT}K*NK_4nVLxA183r|6^RQoi$`sBOZa7yc^S>utw`<*(7GX~B z^LQR>;hg}9%;`A@;+ ICxY6y{c8L)t^fc4 literal 0 HcmV?d00001 diff --git a/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_divergence_profile_div_arr.mat b/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_divergence_profile_div_arr.mat new file mode 100644 index 0000000000000000000000000000000000000000..3c8fdcb88b491bbdbb8efe797ebb071ddb013266 GIT binary patch literal 7510 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 literal 0 HcmV?d00001 diff --git a/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_doubledisk_chopper_disk_arr.mat b/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_doubledisk_chopper_disk_arr.mat new file mode 100644 index 0000000000000000000000000000000000000000..3573e94b0ebbbd2a4af9a53c7b4ee522966cab3b GIT binary patch literal 6423 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 P(sApjhZI*b9GL$FWHp|P literal 0 HcmV?d00001 diff --git a/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_fermi_chopper_fermi.mat b/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_fermi_chopper_fermi.mat new file mode 100644 index 0000000000000000000000000000000000000000..bd6064a2aa566abd2f3a34bb2aad03ae1915b474 GIT binary patch literal 848 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 literal 0 HcmV?d00001 diff --git a/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_moderator_moderator_arr.mat b/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_moderator_moderator_arr.mat new file mode 100644 index 0000000000000000000000000000000000000000..0d91e57d06ede53881393b6a9796185b344f67d8 GIT binary patch literal 24885 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 S`TwOEzoYzrDdjg8!k$G3@=Ip` literal 0 HcmV?d00001 diff --git a/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_sample_sample_arr.mat b/_test/test_instrument_classes/saved_class_versions_as_mat_files/ver1_IX_sample_sample_arr.mat new file mode 100644 index 0000000000000000000000000000000000000000..e252a6b61f57c258bb9a4fcc5a2f0ea822bfccdf GIT binary patch literal 1741 zcmV;;1~U0gK~zjZLLfCRFd$7qR4ry{Y-KDUP;6mzW^ZzBIv`L(S4mDbG%O%Pa%Ew3 zWn>_4ZaN@Fa%mt>V{{-fH6SrGIyE#pG&CSGFfuV9ARr(hARr(hARr(hARr(hARr(h zARr(hARr(hARr(hARr(hARr*&00000000000ZB~{000140001Zoa19)U|0aeY(UHb z#DWYEzzD=#KwO-dTac3)pIB4`6K7%Yb@mSi$#Vj+XGAd4wjRpMq9FDNIP*g7$1a?FHBpN7m|^ zz-OTC&t?2}4!>&Yc)2rYNt(5#yX#8Mt|sT4q_?_#xkD@PX=uxyPah;Cj%k9i3RtId-mXcU$T4YZ8=tg{yelVQn?Li-=Q5?>AV6Gw$bVa4kAXpI;#7GF}zI^ z=0zb!J7mXW7`4+brNMDy6Qh_UB%mA!v0!H;h<%E-i0@<84r-B)5%a>PPjNkIGfn{C zY0@YFVQI&>$U7(vKL2_QD*6R&{plh0m`tN$Pw+i2 z9nG(2CGJ2A2=_@Xi6WlPGb+5rqXa2Dz|eQ(oHu`q9z1J0QtjR>!`7~u(&|3U(2&co?NR(u7%tY`5ejT*hjPDDT!a!?1B() z$5h%1YC`%2HU&G9Chd!}JpE=3dkH)NbIa_Fo212)c%L-vA@F*u7I}@)_xEJ>{q1j$c~$kl-~Rl%R&)CH zXVyKXOIG)~``goNsQMnq`8%rLtsK5l5Ly4P~_=!zR1%>o-XqAN#*JNYVltGf8Xostc~xzKJL0S<(%w${Z;kX(?=iq z%iU`G$K2Jacdy6xURVD*{w-b}I>+^1w@~(9D79-DEz@=HB;ME%tZ|#t)2}#<*#@iz^4>MxOae#4i(F7;~Ez zqgGPIuNJJ=5$dg87X$S@%k&D^dbveo2xKK{SP@CkolesMzLShEV5&@ui(S>h_kDop zTgDTxpW_!oOC07aNBo1SR*i3!_yX6cOzVd$$Xq*qfp(78@#S_Gm9fYx1w=?(YI622 zP~3O%>E%^y-QO9x28X;)j#o|W?I!7?=;rOtg_7e$@l(8i!C1}&kjS}HJ`GF`DmEDj7@4BhcG-8*3lVMsyiwSNi0p8HTp2K0& zq6N3I+o&}txkyfEXi~Zd>h<&e(0lJJonMzXjXN%XpSSd1-CIiUOJBW5S-sDbdRb-< z)CgoN0}Z0w?=B$qf1^-XK6iseLT(L#%y2D@ve^_W%94<^#6r@FW(lk;&Rrf-=DnuZjND}oqzn?@dWz?;3vW literal 0 HcmV?d00001 diff --git a/_test/test_instrument_classes/test_IX_aperture.m b/_test/test_instrument_classes/test_IX_aperture.m index 2eebfee0d..fe2935119 100644 --- a/_test/test_instrument_classes/test_IX_aperture.m +++ b/_test/test_instrument_classes/test_IX_aperture.m @@ -15,7 +15,7 @@ error('HERBERT:test_IX_apperture:invalid_argument',... 'the test can be called only with one or two parameters') elseif numel(is)==1 - filename = 'test_IX_aperture_data.mat'; + filename = 'test_IX_aperture_output.mat'; else filename = varargin{~is}; end @@ -28,7 +28,7 @@ params= {'test_IX_aperture'}; end self@TestCaseWithSave(params{:}); - self.home_folder = test_files_folder; + self.home_folder = test_files_folder; %does nothing unless the constructor called with '-save' key self.save() end @@ -69,6 +69,59 @@ function test_pdf (~) assertEqualToTol(stdev.^2, [0.1^2;0.06^2]/12, 'reltol', 1e-3); end + function test_apperture_array_prev_versions(obj) + % 2x2 array example + ap_arr = [IX_aperture('Ap0', 11, 0.2, 0.25), IX_aperture('Ap1', 121, 0.22, 0.225);... + IX_aperture('Ap3', 311, 0.23, 0.325), IX_aperture('Ap4', 114, 0.24, 0.245)]; + sample_file_location = obj.home_folder; + if obj.save_output % prepare test data for the future. + % move test data to data folder manually + % run test_IX_apperture with -save option to obtain reference + % files when changed to new class version + + save_variables=true; + ver = ap_arr.classVersion(); + verstr = ['ver',num2str(ver)]; + [ok,mess] = check_matfile_IO(verstr, save_variables, sample_file_location ,ap_arr); + assertTrue(ok,mess) + else + save_variables=false; + verstr = 'ver0'; + [ok,mess] = check_matfile_IO(verstr, save_variables,sample_file_location ,ap_arr); + assertTrue(ok,mess) + + verstr= 'ver1'; + [ok,mess] = check_matfile_IO(verstr, save_variables, sample_file_location ,ap_arr); + assertTrue(ok,mess) + end + + end + % + function test_single_apperture_load_prev_versions(obj) + % Scalar example + ap = IX_aperture ('Ap0', 11, 0.2, 0.25); + sample_files_location = obj.home_folder; + if obj.save_output + % run test_IX_apperture with -save option to obtain reference + % files when changed to new class version + save_variables=true; + ver = ap.classVersion(); + verstr = ['ver',num2str(ver)]; + [ok,mess] = check_matfile_IO(verstr, save_variables, sample_files_location ,ap); + assertTrue(ok,mess) + + else + save_variables=false; + verstr = 'ver0'; + [ok,mess] = check_matfile_IO(verstr, save_variables,sample_files_location ,ap); + assertTrue(ok,mess) + + verstr= 'ver1'; + [ok,mess] = check_matfile_IO(verstr, save_variables, sample_files_location ,ap); + assertTrue(ok,mess) + end + end + %-------------------------------------------------------------------------- end end diff --git a/_test/test_instrument_classes/test_IX_aperture_output.mat b/_test/test_instrument_classes/test_IX_aperture_output.mat index 09a6e4b5b21f77f347a9c89c063eebf7729a07f4..02411234aedcb91a12269a6b92e1ff7d04032bbe 100644 GIT binary patch delta 474 zcmV<00VV$P27(8WG#E{9ZXi!%bRaP}ATcpIGB!FhIUq7HGBJ@+BavVQv2OWRZsm5qtHOC`o`R6;^@s1RZxTNKfVM1oMI;qL*Ecm&}stIP&SYakhG$7hWu_wDTpf_SbrdN z6S-$(cwT@{S=y_~H>P|BJNt)ef1J-o7H3`gvx%%GzCvF^-t|x2qtF?R+|afaJ|_4q zpVaGG9m3yZ)Bn56^8Q@eDj+cy@-^~{=pWiQnEalS6Wl=GvK_21x(HneoHN&kp+AnC z;22j|{xI@v@Ld1Ii)<()USQMv$$sD>JdLBTnP%riQhP;{vye&TBb#r(e;7*dAd5aG zAJSIJP6~_cB`z-AaO|H4lYCo{<*RD>QcCl+NS$4RtNl`^k&D;vmBl~Y3wqryi;p*N zKMvyO(s)Hl{ZD^9Ct9yQClR*}`8f&Q4>}_}3YPPN<-BIWFVegyepSPB(C3vuuLS;$ z%v<-<@p`_Z{Q;2QA3ENeFmr!3mEHzW_n)9|cOU?{2LI>0UJU#l!56*5EQ04sr|+;m Qm~TGQ-eH2i0OpE?`>IUj_W%F@ delta 459 zcmV;+0W|)C2lEDyG#FE1bRbG~Y#=f)ATT*PH8MIhHXt%EF*%V@BavVQv2@;_9}m?(0ZBi?J_w&3 z%^e{16^yw3?ZJquo(U?(3^gkQe~3GP_y7fa&P`Z{pOI<=^`pllNFO@`YCMAYnR&Vez@lk1K1bto(8VXRejYUaObqDpiCSKP%QYt4^((r5 zbo;QS9|i{0^nP5EzXM4>w)SNNl71#AAGv+$!9ZF%z}3D40RX>7q=6`# B#K-^u diff --git a/herbert_core/classes/instrument_classes/instrument/@IX_aperture/IX_aperture.m b/herbert_core/classes/instrument_classes/instrument/@IX_aperture/IX_aperture.m index 9d595c207..0ed9fa545 100644 --- a/herbert_core/classes/instrument_classes/instrument/@IX_aperture/IX_aperture.m +++ b/herbert_core/classes/instrument_classes/instrument/@IX_aperture/IX_aperture.m @@ -1,10 +1,9 @@ -classdef IX_aperture +classdef IX_aperture < serializable % Aperture class definition properties (Access=private) % Stored properties - but kept private and accessible only through % public dependent properties because validity checks of setters % require checks against the other properties - class_version_ = 1; name_ = ''; distance_ = 0; width_ = 0; @@ -20,6 +19,7 @@ end methods + %------------------------------------------------------------------ % Constructor %------------------------------------------------------------------ @@ -118,7 +118,6 @@ error('HERBERT:IX_apperture:invalid_argument',... 'Aperture height must be a numeric scalar greater than or equal to zero') end - obj.height_=val; end @@ -140,6 +139,33 @@ val=obj.height_; end %------------------------------------------------------------------ + function obj = from_old_struct(obj,inputs) + % restore object from the old structure, which describes the + % previous version of the object. + % + % The method is called by loadobj in the case if the input + % structure does not contain version or the version, stored + % in the structure does not correspond to the current version + % + % By default, this function interfaces the default from_struct + % function, but when the old strucure substantially differs from + % the moden structure, this method needs the specific overloading + % to allow loadob to recover new structure from an old structure. + if isfield(inputs(1),'class_version_') && inputs(1).class_version_ == 1 + inputs = rmfield(inputs,'class_version_'); + old_fld_names = fieldnames(inputs); + % use the fact that the old field names are the new field + % names with _ attached at the end + new_fld_names = cellfun(@(x)(x(1:end-1)),old_fld_names,... + 'UniformOutput',false); + cell_data = struct2cell(inputs); + inputs = cell2struct(cell_data,new_fld_names); + end + % optimization here is possible to not to use the public + % interface. But is it necessary? its the question + obj = from_old_struct@serializable(obj,inputs); + end + end @@ -150,214 +176,41 @@ % Determine the independent property names and cache the result. % Code is boilerplate persistent names_store - if isempty(names_store) - names_store = fieldnamesIndep(eval(mfilename('class'))); - end - names = names_store; - end - - function names = propNamesPublic_ - % Determine the visible public property names and cache the result. - % Code is boilerplate - persistent names_store if isempty(names_store) - names_store = properties(eval(mfilename('class'))); + names_store = fieldnamesIndep(eval(mfilename('class'))); + % here we rely on agreement that private independent + % porperties have the same names as public properties but + % have added suffix '_' at the end + for i=1:numel(names_store) + if names_store{i}(end)=='_' + names_store{i} = names_store{i}(1:end-1); + end + end end names = names_store; end - - function struc = scalarEmptyStructIndep_ - % Create a scalar structure with empty fields, and cache the result - % Code is boilerplate - persistent struc_store - if isempty(struc_store) - names = eval([mfilename('class'),'.propNamesIndep_''']); - arg = [names; repmat({[]},size(names))]; - struc_store = struct(arg{:}); - end - struc = struc_store; - end - - function struc = scalarEmptyStructPublic_ - % Create a scalar structure with empty fields, and cache the result - % Code is boilerplate - persistent struc_store - if isempty(struc_store) - names = eval([mfilename('class'),'.propNamesPublic_''']); - arg = [names; repmat({[]},size(names))]; - struc_store = struct(arg{:}); - end - struc = struc_store; - end end methods - function S = structIndep(obj) - % Return the independent properties of an object as a structure - % - % >> s = structIndep(obj) - % - % Use structArrIndep to convert an object array to a structure array - % - % Has the same behaviour as the Matlab instrinsic struct in that: - % - Any structure array is returned unchanged - % - If an object is empty, an empty structure is returned with fieldnames - % but the same size as the object - % - If the object is non-empty array, returns a scalar structure corresponding - % to the the first element in the array of objects - % - % - % See also structPublic, structArrIndep, structArrPublic - - names = obj.propNamesIndep_'; - if ~isempty(obj) - tmp = obj(1); - S = obj.scalarEmptyStructIndep_; - for i=1:numel(names) - S.(names{i}) = tmp.(names{i}); - end - else - args = [names; repmat({cell(size(obj))},size(names))]; - S = struct(args{:}); - end - end - - function S = structArrIndep(obj) - % Return the independent properties of an object array as a structure array - % - % >> s = structArrIndep(obj) - % - % Use structIndep for behaviour that more closely matches the Matlab - % intrinsic function struct. - % - % Has the same behaviour as the Matlab instrinsic struct in that: - % - Any structure array is returned unchanged - % - If an object is empty, an empty structure is returned with fieldnames - % but the same size as the object - % - % However, differs in the behaviour if an object array: - % - If the object is non-empty array, returns a structure array of the same - % size. This is different to the instrinsic Matlab, which returns a scalar - % structure from the first element in the array of objects - % - % - % See also structIndep, structPublic, structArrPublic - - if numel(obj)>1 - S = arrayfun(@fill_it, obj); - else - S = structIndep(obj); - end - - function S = fill_it (obj) - names = obj.propNamesIndep_'; - S = obj.scalarEmptyStructIndep_; - for i=1:numel(names) - S.(names{i}) = obj.(names{i}); - end - end - - end - - function S = structPublic(obj) - % Return the public properties of an object as a structure - % - % >> s = structPublic(obj) - % - % Use structArrPublic to convert an object array to a structure array + function flds = indepFields(obj) + % Return cellarray of independent properties of the class % - % Has the same behaviour as struct in that - % - Any structure array is returned unchanged - % - If an object is empty, an empty structure is returned with fieldnames - % but the same size as the object - % - If the object is non-empty array, returns a scalar structure corresponding - % to the the first element in the array of objects - % - % - % See also structIndep, structArrPublic, structArrIndep - - names = obj.propNamesPublic_'; - if ~isempty(obj) - tmp = obj(1); - S = obj.scalarEmptyStructPublic_; - for i=1:numel(names) - S.(names{i}) = tmp.(names{i}); - end - else - args = [names; repmat({cell(size(obj))},size(names))]; - S = struct(args{:}); - end + flds = obj.propNamesIndep_; end - - function S = structArrPublic(obj) - % Return the public properties of an object array as a structure array - % - % >> s = structArrPublic(obj) - % - % Use structPublic for behaviour that more closely matches the Matlab - % intrinsic function struct. - % - % Has the same behaviour as the Matlab instrinsic struct in that: - % - Any structure array is returned unchanged - % - If an object is empty, an empty structure is returned with fieldnames - % but the same size as the object - % - % However, differs in the behaviour if an object array: - % - If the object is non-empty array, returns a structure array of the same - % size. This is different to the instrinsic Matlab, which returns a scalar - % structure from the first element in the array of objects - % - % - % See also structPublic, structIndep, structArrIndep - - if numel(obj)>1 - S = arrayfun(@fill_it, obj); - else - S = structPublic(obj); - end - - function S = fill_it (obj) - names = obj.propNamesPublic_'; - S = obj.scalarEmptyStructPublic_; - for i=1:numel(names) - S.(names{i}) = obj.(names{i}); - end - end - + function ver = classVersion(~) + % return current class version as it is stored on hdd + ver = 2; end end %------------------------------------------------------------------ methods (Static) function obj = loadobj(S) - % Static method used my Matlab load function to support custom - % loading. - % - % >> obj = loadobj(S) - % - % Input: - % ------ - % S Either (1) an object of the class, or (2) a structure - % or structure array - % - % Output: - % ------- - % obj Either (1) the object passed without change, or (2) an - % object (or object array) created from the input structure - % or structure array) - - % The following is boilerplate code; it calls a class-specific function - % called loadobj_private_ that takes a scalar structure and returns - % a scalar instance of the class - - if isobject(S) - obj = S; - else - obj = arrayfun(@(x)loadobj_private_(x), S); - end + % boilerplate loadobj method, calling generic method of + % saveable class + class_instance = IX_aperture(); + obj = serializable.loadobj_generic(S,class_instance); end - %------------------------------------------------------------------ - end %====================================================================== diff --git a/herbert_core/utilities/classes/@serializable/private/loadobj_.m b/herbert_core/utilities/classes/@serializable/private/loadobj_.m index c23702048..ad401baac 100644 --- a/herbert_core/utilities/classes/@serializable/private/loadobj_.m +++ b/herbert_core/utilities/classes/@serializable/private/loadobj_.m @@ -20,6 +20,6 @@ else obj = from_old_struct(class_instance,S); end -else % previous version(s), written without version info - obj = from_old_struct(S); +else % previous version(s), written without version info or any old version + obj = from_old_struct(class_instance,S); end diff --git a/herbert_core/utilities/classes/@serializable/serializable.m b/herbert_core/utilities/classes/@serializable/serializable.m index 15171930f..f36186aeb 100644 --- a/herbert_core/utilities/classes/@serializable/serializable.m +++ b/herbert_core/utilities/classes/@serializable/serializable.m @@ -3,13 +3,13 @@ % from/to structure used in serialization and defines the % standard for any Horace/Herbert custom class loadobj/saveobj methods. % - methods(Abstract,Access=protected) - % get independent fields, which fully define the state of a - % serializable object. - flds = indepFields(obj); + methods(Abstract,Access=public) % get class version, which would affect the way class is stored on/ % /restore from an external media ver = classVersion(obj); + % get independent fields, which fully define the state of a + % serializable object. + flds = indepFields(obj); end methods(Abstract,Static) % Static method used by Matlab load function to support custom @@ -18,7 +18,7 @@ % % function obj = loadobj(S) % class_instance = EmptyClassConstructur(); - % obj = class_instance.loadobj_generic(S,class_instance) + % obj = serializable.loadobj_generic(S,class_instance); % end % % where EmpytClassConstructor is the empty constructor of the @@ -31,6 +31,10 @@ % convert class or array of classes into a plain structure % using independent properties obtained from indepFields method. str = struct(obj); + % convert class or array of classes into a plain structure + % using independent properties obtained from indepFields method. + str = struct(obj); + % %------------------------------------------------------------------ % set up object or array of objects from a plain structure, diff --git a/herbert_core/utilities/misc/get_object_conts.m b/herbert_core/utilities/misc/get_object_conts.m index e04e13c2b..79f3b5d5c 100644 --- a/herbert_core/utilities/misc/get_object_conts.m +++ b/herbert_core/utilities/misc/get_object_conts.m @@ -2,6 +2,8 @@ % Objects need special treatment in C++ if any(strcmp(methods(v), 'serialize')) conts = arrayfun(@(x) (x.serialize()), v); + elseif isa(v,'serializable') + conts = struct(v); else try % try to use the saveobj method first to get the contents