paradigma 0.1.5__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. paradigma/__init__.py +1 -3
  2. paradigma/constants.py +65 -0
  3. paradigma/feature_extraction.py +703 -0
  4. paradigma/gait_analysis.py +415 -0
  5. paradigma/gait_analysis_config.py +266 -0
  6. paradigma/heart_rate_analysis.py +127 -0
  7. paradigma/heart_rate_analysis_config.py +9 -0
  8. paradigma/heart_rate_util.py +173 -0
  9. paradigma/imu_preprocessing.py +232 -0
  10. paradigma/ppg/classifier/LR_PPG_quality.pkl +0 -0
  11. paradigma/ppg/classifier/LR_model.mat +0 -0
  12. paradigma/ppg/feat_extraction/acc_feature.m +20 -0
  13. paradigma/ppg/feat_extraction/peakdet.m +64 -0
  14. paradigma/ppg/feat_extraction/ppg_features.m +53 -0
  15. paradigma/ppg/glob_functions/extract_hr_segments.m +37 -0
  16. paradigma/ppg/glob_functions/extract_overlapping_segments.m +23 -0
  17. paradigma/ppg/glob_functions/jsonlab/AUTHORS.txt +41 -0
  18. paradigma/ppg/glob_functions/jsonlab/ChangeLog.txt +74 -0
  19. paradigma/ppg/glob_functions/jsonlab/LICENSE_BSD.txt +25 -0
  20. paradigma/ppg/glob_functions/jsonlab/LICENSE_GPLv3.txt +699 -0
  21. paradigma/ppg/glob_functions/jsonlab/README.txt +394 -0
  22. paradigma/ppg/glob_functions/jsonlab/examples/.svn/entries +368 -0
  23. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/demo_jsonlab_basic.m.svn-base +180 -0
  24. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/demo_ubjson_basic.m.svn-base +180 -0
  25. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/example1.json.svn-base +23 -0
  26. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/example2.json.svn-base +22 -0
  27. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/example3.json.svn-base +11 -0
  28. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/example4.json.svn-base +34 -0
  29. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/jsonlab_basictest.matlab.svn-base +662 -0
  30. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/jsonlab_selftest.m.svn-base +27 -0
  31. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/jsonlab_selftest.matlab.svn-base +144 -0
  32. paradigma/ppg/glob_functions/jsonlab/examples/.svn/text-base/jsonlab_speedtest.m.svn-base +21 -0
  33. paradigma/ppg/glob_functions/jsonlab/examples/demo_jsonlab_basic.m +180 -0
  34. paradigma/ppg/glob_functions/jsonlab/examples/demo_ubjson_basic.m +180 -0
  35. paradigma/ppg/glob_functions/jsonlab/examples/example1.json +23 -0
  36. paradigma/ppg/glob_functions/jsonlab/examples/example2.json +22 -0
  37. paradigma/ppg/glob_functions/jsonlab/examples/example3.json +11 -0
  38. paradigma/ppg/glob_functions/jsonlab/examples/example4.json +34 -0
  39. paradigma/ppg/glob_functions/jsonlab/examples/jsonlab_basictest.matlab +662 -0
  40. paradigma/ppg/glob_functions/jsonlab/examples/jsonlab_selftest.m +27 -0
  41. paradigma/ppg/glob_functions/jsonlab/examples/jsonlab_selftest.matlab +144 -0
  42. paradigma/ppg/glob_functions/jsonlab/examples/jsonlab_speedtest.m +21 -0
  43. paradigma/ppg/glob_functions/jsonlab/jsonopt.m +32 -0
  44. paradigma/ppg/glob_functions/jsonlab/loadjson.m +566 -0
  45. paradigma/ppg/glob_functions/jsonlab/loadubjson.m +528 -0
  46. paradigma/ppg/glob_functions/jsonlab/mergestruct.m +33 -0
  47. paradigma/ppg/glob_functions/jsonlab/savejson.m +475 -0
  48. paradigma/ppg/glob_functions/jsonlab/saveubjson.m +504 -0
  49. paradigma/ppg/glob_functions/jsonlab/varargin2struct.m +40 -0
  50. paradigma/ppg/glob_functions/sample_prob_final.m +49 -0
  51. paradigma/ppg/glob_functions/synchronization.m +76 -0
  52. paradigma/ppg/glob_functions/tsdf_scan_meta.m +22 -0
  53. paradigma/ppg/hr_functions/Long_TFD_JOT.m +37 -0
  54. paradigma/ppg/hr_functions/PPG_TFD_HR.m +59 -0
  55. paradigma/ppg/hr_functions/TFD toolbox JOT/.gitignore +4 -0
  56. paradigma/ppg/hr_functions/TFD toolbox JOT/CHANGELOG.md +23 -0
  57. paradigma/ppg/hr_functions/TFD toolbox JOT/LICENCE.md +27 -0
  58. paradigma/ppg/hr_functions/TFD toolbox JOT/README.md +251 -0
  59. paradigma/ppg/hr_functions/TFD toolbox JOT/README.pdf +0 -0
  60. paradigma/ppg/hr_functions/TFD toolbox JOT/common/gen_Doppler_kern.m +142 -0
  61. paradigma/ppg/hr_functions/TFD toolbox JOT/common/gen_Doppler_lag_kern.m +314 -0
  62. paradigma/ppg/hr_functions/TFD toolbox JOT/common/gen_lag_kern.m +123 -0
  63. paradigma/ppg/hr_functions/TFD toolbox JOT/dec_tfd.m +154 -0
  64. paradigma/ppg/hr_functions/TFD toolbox JOT/decimated_TFDs/dec_di_gdtfd.m +194 -0
  65. paradigma/ppg/hr_functions/TFD toolbox JOT/decimated_TFDs/dec_li_gdtfd.m +200 -0
  66. paradigma/ppg/hr_functions/TFD toolbox JOT/decimated_TFDs/dec_nonsep_gdtfd.m +229 -0
  67. paradigma/ppg/hr_functions/TFD toolbox JOT/decimated_TFDs/dec_sep_gdtfd.m +241 -0
  68. paradigma/ppg/hr_functions/TFD toolbox JOT/full_TFDs/di_gdtfd.m +157 -0
  69. paradigma/ppg/hr_functions/TFD toolbox JOT/full_TFDs/li_gdtfd.m +190 -0
  70. paradigma/ppg/hr_functions/TFD toolbox JOT/full_TFDs/nonsep_gdtfd.m +196 -0
  71. paradigma/ppg/hr_functions/TFD toolbox JOT/full_TFDs/sep_gdtfd.m +199 -0
  72. paradigma/ppg/hr_functions/TFD toolbox JOT/full_tfd.m +144 -0
  73. paradigma/ppg/hr_functions/TFD toolbox JOT/load_curdir.m +13 -0
  74. paradigma/ppg/hr_functions/TFD toolbox JOT/pics/decimated_TFDs_examples.png +0 -0
  75. paradigma/ppg/hr_functions/TFD toolbox JOT/pics/full_TFDs_examples.png +0 -0
  76. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/check_dec_params_seq.m +79 -0
  77. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/dispEE.m +9 -0
  78. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/dispVars.m +26 -0
  79. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/disp_bytes.m +25 -0
  80. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/fold_vector_full.m +40 -0
  81. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/fold_vector_half.m +34 -0
  82. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/gen_LFM.m +29 -0
  83. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/get_analytic_signal.m +76 -0
  84. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/get_window.m +176 -0
  85. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/isreal_fn.m +11 -0
  86. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/padWin.m +97 -0
  87. paradigma/ppg/hr_functions/TFD toolbox JOT/utils/vtfd.m +149 -0
  88. paradigma/ppg/preprocessing/preprocessing_imu.m +15 -0
  89. paradigma/ppg/preprocessing/preprocessing_ppg.m +13 -0
  90. paradigma/ppg_preprocessing.py +313 -0
  91. paradigma/preprocessing_config.py +69 -0
  92. paradigma/quantification.py +58 -0
  93. paradigma/tremor/TremorFeaturesAndClassification.m +345 -0
  94. paradigma/tremor/feat_extraction/DerivativesExtract.m +22 -0
  95. paradigma/tremor/feat_extraction/ExtractBandSignalsRMS.m +72 -0
  96. paradigma/tremor/feat_extraction/MFCCExtract.m +100 -0
  97. paradigma/tremor/feat_extraction/PSDBandPower.m +52 -0
  98. paradigma/tremor/feat_extraction/PSDEst.m +63 -0
  99. paradigma/tremor/feat_extraction/PSDExtrAxis.m +88 -0
  100. paradigma/tremor/feat_extraction/PSDExtrOpt.m +95 -0
  101. paradigma/tremor/preprocessing/InterpData.m +32 -0
  102. paradigma/tremor/weekly_aggregates/WeeklyAggregates.m +295 -0
  103. paradigma/util.py +50 -0
  104. paradigma/windowing.py +219 -0
  105. paradigma-0.3.0.dist-info/LICENSE +192 -0
  106. paradigma-0.3.0.dist-info/METADATA +79 -0
  107. paradigma-0.3.0.dist-info/RECORD +108 -0
  108. paradigma/dummy.py +0 -3
  109. paradigma-0.1.5.dist-info/LICENSE +0 -201
  110. paradigma-0.1.5.dist-info/METADATA +0 -18
  111. paradigma-0.1.5.dist-info/RECORD +0 -6
  112. {paradigma-0.1.5.dist-info → paradigma-0.3.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,528 @@
1
+ function data = loadubjson(fname,varargin)
2
+ %
3
+ % data=loadubjson(fname,opt)
4
+ % or
5
+ % data=loadubjson(fname,'param1',value1,'param2',value2,...)
6
+ %
7
+ % parse a JSON (JavaScript Object Notation) file or string
8
+ %
9
+ % authors:Qianqian Fang (fangq<at> nmr.mgh.harvard.edu)
10
+ % created on 2013/08/01
11
+ %
12
+ % $Id: loadubjson.m 460 2015-01-03 00:30:45Z fangq $
13
+ %
14
+ % input:
15
+ % fname: input file name, if fname contains "{}" or "[]", fname
16
+ % will be interpreted as a UBJSON string
17
+ % opt: a struct to store parsing options, opt can be replaced by
18
+ % a list of ('param',value) pairs - the param string is equivallent
19
+ % to a field in opt. opt can have the following
20
+ % fields (first in [.|.] is the default)
21
+ %
22
+ % opt.SimplifyCell [0|1]: if set to 1, loadubjson will call cell2mat
23
+ % for each element of the JSON data, and group
24
+ % arrays based on the cell2mat rules.
25
+ % opt.IntEndian [B|L]: specify the endianness of the integer fields
26
+ % in the UBJSON input data. B - Big-Endian format for
27
+ % integers (as required in the UBJSON specification);
28
+ % L - input integer fields are in Little-Endian order.
29
+ %
30
+ % output:
31
+ % dat: a cell array, where {...} blocks are converted into cell arrays,
32
+ % and [...] are converted to arrays
33
+ %
34
+ % examples:
35
+ % obj=struct('string','value','array',[1 2 3]);
36
+ % ubjdata=saveubjson('obj',obj);
37
+ % dat=loadubjson(ubjdata)
38
+ % dat=loadubjson(['examples' filesep 'example1.ubj'])
39
+ % dat=loadubjson(['examples' filesep 'example1.ubj'],'SimplifyCell',1)
40
+ %
41
+ % license:
42
+ % BSD or GPL version 3, see LICENSE_{BSD,GPLv3}.txt files for details
43
+ %
44
+ % -- this function is part of JSONLab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab)
45
+ %
46
+
47
+ global pos inStr len esc index_esc len_esc isoct arraytoken fileendian systemendian
48
+
49
+ if(regexp(fname,'[\{\}\]\[]','once'))
50
+ string=fname;
51
+ elseif(exist(fname,'file'))
52
+ fid = fopen(fname,'rb');
53
+ string = fread(fid,inf,'uint8=>char')';
54
+ fclose(fid);
55
+ else
56
+ error('input file does not exist');
57
+ end
58
+
59
+ pos = 1; len = length(string); inStr = string;
60
+ isoct=exist('OCTAVE_VERSION','builtin');
61
+ arraytoken=find(inStr=='[' | inStr==']' | inStr=='"');
62
+ jstr=regexprep(inStr,'\\\\',' ');
63
+ escquote=regexp(jstr,'\\"');
64
+ arraytoken=sort([arraytoken escquote]);
65
+
66
+ % String delimiters and escape chars identified to improve speed:
67
+ esc = find(inStr=='"' | inStr=='\' ); % comparable to: regexp(inStr, '["\\]');
68
+ index_esc = 1; len_esc = length(esc);
69
+
70
+ opt=varargin2struct(varargin{:});
71
+ fileendian=upper(jsonopt('IntEndian','B',opt));
72
+ [os,maxelem,systemendian]=computer;
73
+
74
+ jsoncount=1;
75
+ while pos <= len
76
+ switch(next_char)
77
+ case '{'
78
+ data{jsoncount} = parse_object(opt);
79
+ case '['
80
+ data{jsoncount} = parse_array(opt);
81
+ otherwise
82
+ error_pos('Outer level structure must be an object or an array');
83
+ end
84
+ jsoncount=jsoncount+1;
85
+ end % while
86
+
87
+ jsoncount=length(data);
88
+ if(jsoncount==1 && iscell(data))
89
+ data=data{1};
90
+ end
91
+
92
+ if(~isempty(data))
93
+ if(isstruct(data)) % data can be a struct array
94
+ data=jstruct2array(data);
95
+ elseif(iscell(data))
96
+ data=jcell2array(data);
97
+ end
98
+ end
99
+
100
+
101
+ %%
102
+ function newdata=parse_collection(id,data,obj)
103
+
104
+ if(jsoncount>0 && exist('data','var'))
105
+ if(~iscell(data))
106
+ newdata=cell(1);
107
+ newdata{1}=data;
108
+ data=newdata;
109
+ end
110
+ end
111
+
112
+ %%
113
+ function newdata=jcell2array(data)
114
+ len=length(data);
115
+ newdata=data;
116
+ for i=1:len
117
+ if(isstruct(data{i}))
118
+ newdata{i}=jstruct2array(data{i});
119
+ elseif(iscell(data{i}))
120
+ newdata{i}=jcell2array(data{i});
121
+ end
122
+ end
123
+
124
+ %%-------------------------------------------------------------------------
125
+ function newdata=jstruct2array(data)
126
+ fn=fieldnames(data);
127
+ newdata=data;
128
+ len=length(data);
129
+ for i=1:length(fn) % depth-first
130
+ for j=1:len
131
+ if(isstruct(getfield(data(j),fn{i})))
132
+ newdata(j)=setfield(newdata(j),fn{i},jstruct2array(getfield(data(j),fn{i})));
133
+ end
134
+ end
135
+ end
136
+ if(~isempty(strmatch('x0x5F_ArrayType_',fn)) && ~isempty(strmatch('x0x5F_ArrayData_',fn)))
137
+ newdata=cell(len,1);
138
+ for j=1:len
139
+ ndata=cast(data(j).x0x5F_ArrayData_,data(j).x0x5F_ArrayType_);
140
+ iscpx=0;
141
+ if(~isempty(strmatch('x0x5F_ArrayIsComplex_',fn)))
142
+ if(data(j).x0x5F_ArrayIsComplex_)
143
+ iscpx=1;
144
+ end
145
+ end
146
+ if(~isempty(strmatch('x0x5F_ArrayIsSparse_',fn)))
147
+ if(data(j).x0x5F_ArrayIsSparse_)
148
+ if(~isempty(strmatch('x0x5F_ArraySize_',fn)))
149
+ dim=double(data(j).x0x5F_ArraySize_);
150
+ if(iscpx && size(ndata,2)==4-any(dim==1))
151
+ ndata(:,end-1)=complex(ndata(:,end-1),ndata(:,end));
152
+ end
153
+ if isempty(ndata)
154
+ % All-zeros sparse
155
+ ndata=sparse(dim(1),prod(dim(2:end)));
156
+ elseif dim(1)==1
157
+ % Sparse row vector
158
+ ndata=sparse(1,ndata(:,1),ndata(:,2),dim(1),prod(dim(2:end)));
159
+ elseif dim(2)==1
160
+ % Sparse column vector
161
+ ndata=sparse(ndata(:,1),1,ndata(:,2),dim(1),prod(dim(2:end)));
162
+ else
163
+ % Generic sparse array.
164
+ ndata=sparse(ndata(:,1),ndata(:,2),ndata(:,3),dim(1),prod(dim(2:end)));
165
+ end
166
+ else
167
+ if(iscpx && size(ndata,2)==4)
168
+ ndata(:,3)=complex(ndata(:,3),ndata(:,4));
169
+ end
170
+ ndata=sparse(ndata(:,1),ndata(:,2),ndata(:,3));
171
+ end
172
+ end
173
+ elseif(~isempty(strmatch('x0x5F_ArraySize_',fn)))
174
+ if(iscpx && size(ndata,2)==2)
175
+ ndata=complex(ndata(:,1),ndata(:,2));
176
+ end
177
+ ndata=reshape(ndata(:),data(j).x0x5F_ArraySize_);
178
+ end
179
+ newdata{j}=ndata;
180
+ end
181
+ if(len==1)
182
+ newdata=newdata{1};
183
+ end
184
+ end
185
+
186
+ %%-------------------------------------------------------------------------
187
+ function object = parse_object(varargin)
188
+ parse_char('{');
189
+ object = [];
190
+ type='';
191
+ count=-1;
192
+ if(next_char == '$')
193
+ type=inStr(pos+1); % TODO
194
+ pos=pos+2;
195
+ end
196
+ if(next_char == '#')
197
+ pos=pos+1;
198
+ count=double(parse_number());
199
+ end
200
+ if next_char ~= '}'
201
+ num=0;
202
+ while 1
203
+ str = parseStr(varargin{:});
204
+ if isempty(str)
205
+ error_pos('Name of value at position %d cannot be empty');
206
+ end
207
+ %parse_char(':');
208
+ val = parse_value(varargin{:});
209
+ num=num+1;
210
+ eval( sprintf( 'object.%s = val;', valid_field(str) ) );
211
+ if next_char == '}' || (count>=0 && num>=count)
212
+ break;
213
+ end
214
+ %parse_char(',');
215
+ end
216
+ end
217
+ if(count==-1)
218
+ parse_char('}');
219
+ end
220
+
221
+ %%-------------------------------------------------------------------------
222
+ function [cid,len]=elem_info(type)
223
+ id=strfind('iUIlLdD',type);
224
+ dataclass={'int8','uint8','int16','int32','int64','single','double'};
225
+ bytelen=[1,1,2,4,8,4,8];
226
+ if(id>0)
227
+ cid=dataclass{id};
228
+ len=bytelen(id);
229
+ else
230
+ error_pos('unsupported type at position %d');
231
+ end
232
+ %%-------------------------------------------------------------------------
233
+
234
+
235
+ function [data adv]=parse_block(type,count,varargin)
236
+ global pos inStr isoct fileendian systemendian
237
+ [cid,len]=elem_info(type);
238
+ datastr=inStr(pos:pos+len*count-1);
239
+ if(isoct)
240
+ newdata=int8(datastr);
241
+ else
242
+ newdata=uint8(datastr);
243
+ end
244
+ id=strfind('iUIlLdD',type);
245
+ if(id<=5 && fileendian~=systemendian)
246
+ newdata=swapbytes(typecast(newdata,cid));
247
+ end
248
+ data=typecast(newdata,cid);
249
+ adv=double(len*count);
250
+
251
+ %%-------------------------------------------------------------------------
252
+
253
+
254
+ function object = parse_array(varargin) % JSON array is written in row-major order
255
+ global pos inStr isoct
256
+ parse_char('[');
257
+ object = cell(0, 1);
258
+ dim=[];
259
+ type='';
260
+ count=-1;
261
+ if(next_char == '$')
262
+ type=inStr(pos+1);
263
+ pos=pos+2;
264
+ end
265
+ if(next_char == '#')
266
+ pos=pos+1;
267
+ if(next_char=='[')
268
+ dim=parse_array(varargin{:});
269
+ count=prod(double(dim));
270
+ else
271
+ count=double(parse_number());
272
+ end
273
+ end
274
+ if(~isempty(type))
275
+ if(count>=0)
276
+ [object adv]=parse_block(type,count,varargin{:});
277
+ if(~isempty(dim))
278
+ object=reshape(object,dim);
279
+ end
280
+ pos=pos+adv;
281
+ return;
282
+ else
283
+ endpos=matching_bracket(inStr,pos);
284
+ [cid,len]=elem_info(type);
285
+ count=(endpos-pos)/len;
286
+ [object adv]=parse_block(type,count,varargin{:});
287
+ pos=pos+adv;
288
+ parse_char(']');
289
+ return;
290
+ end
291
+ end
292
+ if next_char ~= ']'
293
+ while 1
294
+ val = parse_value(varargin{:});
295
+ object{end+1} = val;
296
+ if next_char == ']'
297
+ break;
298
+ end
299
+ %parse_char(',');
300
+ end
301
+ end
302
+ if(jsonopt('SimplifyCell',0,varargin{:})==1)
303
+ try
304
+ oldobj=object;
305
+ object=cell2mat(object')';
306
+ if(iscell(oldobj) && isstruct(object) && numel(object)>1 && jsonopt('SimplifyCellArray',1,varargin{:})==0)
307
+ object=oldobj;
308
+ elseif(size(object,1)>1 && ndims(object)==2)
309
+ object=object';
310
+ end
311
+ catch
312
+ end
313
+ end
314
+ if(count==-1)
315
+ parse_char(']');
316
+ end
317
+
318
+ %%-------------------------------------------------------------------------
319
+
320
+ function parse_char(c)
321
+ global pos inStr len
322
+ skip_whitespace;
323
+ if pos > len || inStr(pos) ~= c
324
+ error_pos(sprintf('Expected %c at position %%d', c));
325
+ else
326
+ pos = pos + 1;
327
+ skip_whitespace;
328
+ end
329
+
330
+ %%-------------------------------------------------------------------------
331
+
332
+ function c = next_char
333
+ global pos inStr len
334
+ skip_whitespace;
335
+ if pos > len
336
+ c = [];
337
+ else
338
+ c = inStr(pos);
339
+ end
340
+
341
+ %%-------------------------------------------------------------------------
342
+
343
+ function skip_whitespace
344
+ global pos inStr len
345
+ while pos <= len && isspace(inStr(pos))
346
+ pos = pos + 1;
347
+ end
348
+
349
+ %%-------------------------------------------------------------------------
350
+ function str = parseStr(varargin)
351
+ global pos inStr esc index_esc len_esc
352
+ % len, ns = length(inStr), keyboard
353
+ type=inStr(pos);
354
+ if type ~= 'S' && type ~= 'C' && type ~= 'H'
355
+ error_pos('String starting with S expected at position %d');
356
+ else
357
+ pos = pos + 1;
358
+ end
359
+ if(type == 'C')
360
+ str=inStr(pos);
361
+ pos=pos+1;
362
+ return;
363
+ end
364
+ bytelen=double(parse_number());
365
+ if(length(inStr)>=pos+bytelen-1)
366
+ str=inStr(pos:pos+bytelen-1);
367
+ pos=pos+bytelen;
368
+ else
369
+ error_pos('End of file while expecting end of inStr');
370
+ end
371
+
372
+ %%-------------------------------------------------------------------------
373
+
374
+ function num = parse_number(varargin)
375
+ global pos inStr len isoct fileendian systemendian
376
+ id=strfind('iUIlLdD',inStr(pos));
377
+ if(isempty(id))
378
+ error_pos('expecting a number at position %d');
379
+ end
380
+ type={'int8','uint8','int16','int32','int64','single','double'};
381
+ bytelen=[1,1,2,4,8,4,8];
382
+ datastr=inStr(pos+1:pos+bytelen(id));
383
+ if(isoct)
384
+ newdata=int8(datastr);
385
+ else
386
+ newdata=uint8(datastr);
387
+ end
388
+ if(id<=5 && fileendian~=systemendian)
389
+ newdata=swapbytes(typecast(newdata,type{id}));
390
+ end
391
+ num=typecast(newdata,type{id});
392
+ pos = pos + bytelen(id)+1;
393
+
394
+ %%-------------------------------------------------------------------------
395
+
396
+ function val = parse_value(varargin)
397
+ global pos inStr len
398
+ true = 1; false = 0;
399
+
400
+ switch(inStr(pos))
401
+ case {'S','C','H'}
402
+ val = parseStr(varargin{:});
403
+ return;
404
+ case '['
405
+ val = parse_array(varargin{:});
406
+ return;
407
+ case '{'
408
+ val = parse_object(varargin{:});
409
+ if isstruct(val)
410
+ if(~isempty(strmatch('x0x5F_ArrayType_',fieldnames(val), 'exact')))
411
+ val=jstruct2array(val);
412
+ end
413
+ elseif isempty(val)
414
+ val = struct;
415
+ end
416
+ return;
417
+ case {'i','U','I','l','L','d','D'}
418
+ val = parse_number(varargin{:});
419
+ return;
420
+ case 'T'
421
+ val = true;
422
+ pos = pos + 1;
423
+ return;
424
+ case 'F'
425
+ val = false;
426
+ pos = pos + 1;
427
+ return;
428
+ case {'Z','N'}
429
+ val = [];
430
+ pos = pos + 1;
431
+ return;
432
+ end
433
+ error_pos('Value expected at position %d');
434
+ %%-------------------------------------------------------------------------
435
+
436
+ function error_pos(msg)
437
+ global pos inStr len
438
+ poShow = max(min([pos-15 pos-1 pos pos+20],len),1);
439
+ if poShow(3) == poShow(2)
440
+ poShow(3:4) = poShow(2)+[0 -1]; % display nothing after
441
+ end
442
+ msg = [sprintf(msg, pos) ': ' ...
443
+ inStr(poShow(1):poShow(2)) '<error>' inStr(poShow(3):poShow(4)) ];
444
+ error( ['JSONparser:invalidFormat: ' msg] );
445
+
446
+ %%-------------------------------------------------------------------------
447
+
448
+ function str = valid_field(str)
449
+ global isoct
450
+ % From MATLAB doc: field names must begin with a letter, which may be
451
+ % followed by any combination of letters, digits, and underscores.
452
+ % Invalid characters will be converted to underscores, and the prefix
453
+ % "x0x[Hex code]_" will be added if the first character is not a letter.
454
+ pos=regexp(str,'^[^A-Za-z]','once');
455
+ if(~isempty(pos))
456
+ if(~isoct)
457
+ str=regexprep(str,'^([^A-Za-z])','x0x${sprintf(''%X'',unicode2native($1))}_','once');
458
+ else
459
+ str=sprintf('x0x%X_%s',char(str(1)),str(2:end));
460
+ end
461
+ end
462
+ if(isempty(regexp(str,'[^0-9A-Za-z_]', 'once' ))) return; end
463
+ if(~isoct)
464
+ str=regexprep(str,'([^0-9A-Za-z_])','_0x${sprintf(''%X'',unicode2native($1))}_');
465
+ else
466
+ pos=regexp(str,'[^0-9A-Za-z_]');
467
+ if(isempty(pos)) return; end
468
+ str0=str;
469
+ pos0=[0 pos(:)' length(str)];
470
+ str='';
471
+ for i=1:length(pos)
472
+ str=[str str0(pos0(i)+1:pos(i)-1) sprintf('_0x%X_',str0(pos(i)))];
473
+ end
474
+ if(pos(end)~=length(str))
475
+ str=[str str0(pos0(end-1)+1:pos0(end))];
476
+ end
477
+ end
478
+ %str(~isletter(str) & ~('0' <= str & str <= '9')) = '_';
479
+
480
+ %%-------------------------------------------------------------------------
481
+ function endpos = matching_quote(str,pos)
482
+ len=length(str);
483
+ while(pos<len)
484
+ if(str(pos)=='"')
485
+ if(~(pos>1 && str(pos-1)=='\'))
486
+ endpos=pos;
487
+ return;
488
+ end
489
+ end
490
+ pos=pos+1;
491
+ end
492
+ error('unmatched quotation mark');
493
+ %%-------------------------------------------------------------------------
494
+ function [endpos e1l e1r maxlevel] = matching_bracket(str,pos)
495
+ global arraytoken
496
+ level=1;
497
+ maxlevel=level;
498
+ endpos=0;
499
+ bpos=arraytoken(arraytoken>=pos);
500
+ tokens=str(bpos);
501
+ len=length(tokens);
502
+ pos=1;
503
+ e1l=[];
504
+ e1r=[];
505
+ while(pos<=len)
506
+ c=tokens(pos);
507
+ if(c==']')
508
+ level=level-1;
509
+ if(isempty(e1r)) e1r=bpos(pos); end
510
+ if(level==0)
511
+ endpos=bpos(pos);
512
+ return
513
+ end
514
+ end
515
+ if(c=='[')
516
+ if(isempty(e1l)) e1l=bpos(pos); end
517
+ level=level+1;
518
+ maxlevel=max(maxlevel,level);
519
+ end
520
+ if(c=='"')
521
+ pos=matching_quote(tokens,pos+1);
522
+ end
523
+ pos=pos+1;
524
+ end
525
+ if(endpos==0)
526
+ error('unmatched "]"');
527
+ end
528
+
@@ -0,0 +1,33 @@
1
+ function s=mergestruct(s1,s2)
2
+ %
3
+ % s=mergestruct(s1,s2)
4
+ %
5
+ % merge two struct objects into one
6
+ %
7
+ % authors:Qianqian Fang (fangq<at> nmr.mgh.harvard.edu)
8
+ % date: 2012/12/22
9
+ %
10
+ % input:
11
+ % s1,s2: a struct object, s1 and s2 can not be arrays
12
+ %
13
+ % output:
14
+ % s: the merged struct object. fields in s1 and s2 will be combined in s.
15
+ %
16
+ % license:
17
+ % BSD or GPL version 3, see LICENSE_{BSD,GPLv3}.txt files for details
18
+ %
19
+ % -- this function is part of jsonlab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab)
20
+ %
21
+
22
+ if(~isstruct(s1) || ~isstruct(s2))
23
+ error('input parameters contain non-struct');
24
+ end
25
+ if(length(s1)>1 || length(s2)>1)
26
+ error('can not merge struct arrays');
27
+ end
28
+ fn=fieldnames(s2);
29
+ s=s1;
30
+ for i=1:length(fn)
31
+ s=setfield(s,fn{i},getfield(s2,fn{i}));
32
+ end
33
+