From 46d4190085b338da446d64d0edc40cdb4b6b398e Mon Sep 17 00:00:00 2001 From: Celso Reyes Date: Wed, 12 Dec 2018 16:52:45 +0100 Subject: [PATCH 1/5] starting to smarten up FDSN data import --- sample_low_level_http_request.m | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 sample_low_level_http_request.m diff --git a/sample_low_level_http_request.m b/sample_low_level_http_request.m new file mode 100644 index 00000000..72afe5ac --- /dev/null +++ b/sample_low_level_http_request.m @@ -0,0 +1,31 @@ +% dealing with fdsn data more-or-less directly +% this is a temporary script, and should be rolled into the +% FDSN import routines +% with the anticipation that matlab.net.http.ProgressMonitor +% will be used to provide feedback. + +% U = matlab.net.URI('http://service.iris.edu/fdsnws/event/1/count?starttime=2018-01-11T00:00:00&orderby=time&format=text&nodata=404'); +tic +U = matlab.net.URI('http://service.iris.edu/fdsnws/event/1/query?starttime=2018-01-11T00:00:00&orderby=time&format=text&nodata=404'); +method = matlab.net.http.RequestMethod.GET; +type1 = matlab.net.http.MediaType('text/*'); +acceptField = matlab.net.http.field.AcceptField([type1]); +contentTypeField = matlab.net.http.field.ContentTypeField('text/plain'); +header = [acceptField contentTypeField]; +request = matlab.net.http.RequestMessage(method,header); + +consumer=matlab.net.http.io.StringConsumer; + +[resp,req,hist] = request.send(U,matlab.net.http.HTTPOptions('SavePayload',true),consumer); +% show(request) +% resp.show +ss=strsplit(string(char(resp.Body.Payload')),newline)'; +numel(ss) +%% +f=fopen('junkk.dat','w'); +fprintf(f,"%s",char(resp.Body.Payload')); +fclose(f); +%% +ZG.primeCatalog = import_fdsn_event(1,'junk.dat') +% ZmapMainWindow(ZG.primeCatalog) +toc From 71d69a139511750a476c80517eaa1405434021d0 Mon Sep 17 00:00:00 2001 From: Celso Reyes Date: Wed, 12 Dec 2018 17:05:32 +0100 Subject: [PATCH 2/5] with basic progress monitor (that will change) --- MyProgressMonitorNew.m | 102 ++++++++++++++++++++++++++++++++ sample_low_level_http_request.m | 12 ++-- 2 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 MyProgressMonitorNew.m diff --git a/MyProgressMonitorNew.m b/MyProgressMonitorNew.m new file mode 100644 index 00000000..207d3c25 --- /dev/null +++ b/MyProgressMonitorNew.m @@ -0,0 +1,102 @@ + classdef MyProgressMonitorNew < matlab.net.http.ProgressMonitor + properties + ProgHandle + Direction matlab.net.http.MessageType + Value uint64 + NewDir matlab.net.http.MessageType = matlab.net.http.MessageType.Request + end + + methods + function obj = MyProgressMonitorNew + obj.Interval = .01; + end + + function done(obj) + obj.closeit(); + end + + function delete(obj) + obj.closeit(); + end + + function set.Direction(obj, dir) + obj.Direction = dir; + obj.changeDir(); + end + + function set.Value(obj, value) + obj.Value = value; + obj.update(); + end + end + + methods (Access = private) + function update(obj,~) + % called when Value is set + import matlab.net.http.* + if ~isempty(obj.Value) + if isempty(obj.Max) + % no maximum means we don't know length, so message changes on + % every call + value = 0; + if obj.Direction == MessageType.Request + msg = sprintf('Sent %d bytes...', obj.Value); + else + msg = sprintf('Received %d bytes...', obj.Value); + end + else + % maximum known; update proportional value + value = double(obj.Value)/double(obj.Max); + if obj.NewDir == MessageType.Request + % message changes only on change of direction + if obj.Direction == MessageType.Request + msg = 'Sending...'; + else + msg = 'Receiving...'; + end + end + end + if isempty(obj.ProgHandle) + % if we don't have a progress bar, display it for first time + obj.ProgHandle = ... + waitbar(value, msg, 'CreateCancelBtn', @(~,~)cancelAndClose(obj)); + + obj.NewDir = MessageType.Response; + elseif obj.NewDir == MessageType.Request || isempty(obj.Max) + % on change of direction or if no maximum known, change message + waitbar(value, obj.ProgHandle, msg); + obj.NewDir = MessageType.Response; + else + % no direction change else just update proportional value + waitbar(value, obj.ProgHandle); + end + end + + function cancelAndClose(obj) + % Call the required CancelFcn and then close our progress bar. This is + % called when user clicks cancel or closes the window. + obj.CancelFcn(); + obj.closeit(); + end + end + + function changeDir(obj,~) + % Called when Direction is set or changed. Leave the progress bar displayed. + obj.NewDir = matlab.net.http.MessageType.Request; + end + end + + methods (Access=private) + function closeit(obj) + % Close the progress bar by deleting the handle so CloseRequestFcn isn't + % called, because waitbar calls our cancelAndClose(), which would cause + % recursion. + if ~isempty(obj.ProgHandle) + delete(obj.ProgHandle); + obj.ProgHandle = []; + end + end + end + end + + \ No newline at end of file diff --git a/sample_low_level_http_request.m b/sample_low_level_http_request.m index 72afe5ac..3e0a2bc8 100644 --- a/sample_low_level_http_request.m +++ b/sample_low_level_http_request.m @@ -4,9 +4,9 @@ % with the anticipation that matlab.net.http.ProgressMonitor % will be used to provide feedback. -% U = matlab.net.URI('http://service.iris.edu/fdsnws/event/1/count?starttime=2018-01-11T00:00:00&orderby=time&format=text&nodata=404'); +% U = matlab.net.URI('http://service.iris.edu/fdsnws/event/1/query?starttime=2018-01-11T00:00:00&orderby=time&format=text&nodata=404'); tic -U = matlab.net.URI('http://service.iris.edu/fdsnws/event/1/query?starttime=2018-01-11T00:00:00&orderby=time&format=text&nodata=404'); +U = matlab.net.URI('http://service.iris.edu/fdsnws/event/1/query?starttime=2018-09-11T00:00:00&orderby=time&format=text&nodata=404'); method = matlab.net.http.RequestMethod.GET; type1 = matlab.net.http.MediaType('text/*'); acceptField = matlab.net.http.field.AcceptField([type1]); @@ -16,14 +16,16 @@ consumer=matlab.net.http.io.StringConsumer; -[resp,req,hist] = request.send(U,matlab.net.http.HTTPOptions('SavePayload',true),consumer); +[resp,req,hist] = request.send(U,matlab.net.http.HTTPOptions('SavePayload',true,'ProgressMonitorFcn',@MyProgressMonitorNew,'UseProgressMonitor',true),consumer); % show(request) % resp.show -ss=strsplit(string(char(resp.Body.Payload')),newline)'; + +% if there is an error, it would be shown in hist.Response.Body.Data +ss=strsplit(string(char(resp.Body.Data')),newline)'; numel(ss) %% f=fopen('junkk.dat','w'); -fprintf(f,"%s",char(resp.Body.Payload')); +fprintf(f,"%s",resp.Body.Data); %resp.Body.Payload fclose(f); %% ZG.primeCatalog = import_fdsn_event(1,'junk.dat') From 0171c5d475f85ee55d4ae81850f725fb344fbb68 Mon Sep 17 00:00:00 2001 From: reyesc Date: Fri, 14 Dec 2018 14:27:58 +0100 Subject: [PATCH 3/5] downloading from fdsn just became smarter for requests that exceed max # of downloadable events, it will break it into pieces and then download. This depends, however, on the error message provided by the service, and is therefore somewhat fragile. I have done away with the parallel processing and plotting during downloads, as it was complex and buggy. It has been replaced with a status window that appears and counts the number of bytes received. So, after the service starts returning data, you will know that something is happening. --- importfilters/import_fdsn_event.m | 222 ++++++++++++++---------------- 1 file changed, 105 insertions(+), 117 deletions(-) diff --git a/importfilters/import_fdsn_event.m b/importfilters/import_fdsn_event.m index f91c9ebf..32a4642e 100644 --- a/importfilters/import_fdsn_event.m +++ b/importfilters/import_fdsn_event.m @@ -127,125 +127,58 @@ disp(['sending request to:' baseurl 'query with options']) disp(varargin) - hasParallel=license('test','Distrib_Computing_Toolbox') && ZG.ParallelProcessingOpts.Enable; - try - if hasParallel - fn = tempname; - p=gcp(); - f=parfeval(p,@websave,1,fn, [baseurl 'query'], varargin{:},'format','text',options); - warning('off','MATLAB:table:ModifiedAndSavedVarnames'); - nQuakes = 0; - lastsize = 0; - infmt = string(missing); - earliest = datetime(missing); - latest=datetime(missing); - myfig = figure('Name','Downloading events'); - ax1=subplot(2,1,1); - scDate=scatter(ax1,NaT,nan,'.');title(ax1,'Date of downloaded events'); - ax2=subplot(2,1,2); - scLoc=scatter(ax2,nan,nan,'.');title(ax2,'Location of downloaded events'); - while f.State=="running" - startDownloadTime = f.StartDateTime; - pause(1); - d=dir(fn); - if isempty(d) || d.bytes == lastsize - fprintf('.'); - continue - end - lastsize=d.bytes; - rightnow = datetime; - rightnow.TimeZone = f.StartDateTime.TimeZone; - elapsedTime = rightnow - f.StartDateTime; - bytes_per_second = lastsize / seconds(elapsedTime); - try - tb=readtable(fn); - catch ME - continue - end - if ~isempty(tb) && any([ismissing(tb.Time(end)) ismissing(tb.Magnitude(end))]) - tb(end,:)=[]; - end - if isempty(tb) - continue - end - events_per_minute = height(tb) / minutes(elapsedTime); - if ismissing(infmt) - infmt = "uuuu-MM-dd'T'HH:mm:ss"; - infmt{1}([5 8])=tb.Time{1}(5); - infmt{1}(12)=tb.Time{1}(11); - end - tb.Time = datetime(extractBefore(tb.Time,20),'InputFormat',infmt); - if isvalid(scDate) - set(scDate,'XData',tb.Time,'YData',tb.Magnitude); - end - if isvalid(scLoc) - set(scLoc,'XData',tb.Longitude,'YData',tb.Latitude); - end - drawnow nocallbacks - nQuakes=height(tb); - minTime = min(tb.Time); - maxTime=max(tb.Time); - minMag=min(tb.Magnitude); - maxMag=max(tb.Magnitude); - if minTime ~= earliest - earliest=minTime; - earlyStr = ""+string(earliest)+""; - else - earlyStr=string(earliest); - end - if maxTime ~= latest - latest=maxTime; - lateStr = ""+string(earliest)+""; - else - lateStr=string(latest); - end - timespan_per_minute = (latest - earliest) / minutes(elapsedTime); - if timespan_per_minute > years(1) - timespan_per_minute.Format='y'; - elseif timespan_per_minute > days(5) - timespan_per_minute.Format='d'; - end - - msg.dbfprintf("[%d events found... still downloading ]\n"+... - " Download Statistics:\n"+... - " Elapsed Time : %s\n"+... - " Bytes / sec : %d\n"+... - " Events / min : %d\n"+... - " Timespan / min : %s\n\n" +... - " Catalog Statistics:\n"+... - " start time : %s\n"+... - " end time : %s\n"+... - " magnitude range : [%g to %g]\n",... - nQuakes, elapsedTime,... - round(bytes_per_second), round(events_per_minute), string(timespan_per_minute),... - earlyStr, lateStr, min(tb.Magnitude), max(tb.Magnitude)); - fprintf('\nwaiting for next update'); + % hasParallel=license('test','Distrib_Computing_Toolbox') && ZG.ParallelProcessingOpts.Enable; + myuri=[baseurl, 'query?', sprintf('%s=%s&',string(varargin)), 'format=text']; + resp = get_low_level_fdsn_query(myuri); + switch resp.StatusCode + case "OK" + ok=true; + case "NoContent" + warning("No Data was found"); + uOutput=[]; + ok=false; + case "BadRequest" + disp(resp.Body.Data) + + % as of 2018-12-14, USGS returns this result when limit is exceeded. these depend on the error message wording + maxSearchLimit = double(extractBefore(extractAfter(resp.Body.Data,'exceeds search limit of '),'.')); + nFound = double(extractBefore(extractAfter(resp.Body.Data,'exceeds search limit of '),'.')); + if ~ismissing(maxSearchLimit) + warning("maximum number of events [%d] exceeded. atttempting to limit results", maxSearchLimit); + % try again, in chunks of maxSearchLimit + disp('* trying again while limiting results') + [resp, ok] = get_in_chunks(myuri, maxSearchLimit, nFound); + else + uOutput=[]; + ok=false; end - msg.dbfprintf('\nDone finding events. Final total: %d\n', nQuakes); - warning('on','MATLAB:table:ModifiedAndSavedVarnames'); - fetchOutputs(f); - data = fileread(fn); - delete(fn); - if isvalid(myfig) - close(myfig) + + case "PayloadTooLarge" + disp(resp.Body.Data) + + % as of 2018-12-14, INGV returns this result when limit is exceeded. these depend on the error message wording + nFound = double(extractBefore(extractAfter(resp.Body.Data,'the number of requested events is "'),'";')); + maxSearchLimit = double(extractBefore(extractAfter(resp.Body.Data,'your request must be less then "'),'" events.')); + if ~ismissing(maxSearchLimit) + warning("maximum number of events [%d] exceeded. atttempting to limit results", maxSearchLimit); + % try again, in chunks of maxSearchLimit + disp('* trying again while limiting results') + [resp, ok] = get_in_chunks(myuri, maxSearchLimit, nFound); + else + uOutput=[]; + ok=false; end - else - data = webread([baseurl 'query'], varargin{:},'format','text',options); - end - catch ME - cancel(f) - if isvalid(myfig) - close(myfig) - end - switch ME.identifier - %case 'MATLAB:webservices:CopyContentToDataStreamError' - otherwise - txt = 'An error occurred attempting to reach the FDSN web services'; - errordlg(sprintf('%s\n\n%s\n\nidentifier: ''%s''', txt, ME.message, ME.identifier),... - 'Error retrieving data'); - end - uOutput=[]; - ok=false; + + otherwise + warning("there was some sort of problem. The response follows") + disp(resp) + warning(resp.Body.Data) + uOutput=[]; + ok=false; + end + if ok + data = char(resp.Body.Data); + else return end @@ -369,4 +302,59 @@ end +function [resp,ok] = get_in_chunks(myuri, maxAllowed, expected) + % try again, in chunks of maxSearchLimit + starts=1:maxAllowed:expected; + uOutput=''; + for n=starts + fprintf(' ** retrieving events %d to %d\n', n, min(n+maxAllowed-1, expected)); + resp = get_low_level_fdsn_query(myuri + "&offset=" + n + "&limit="+ maxAllowed); + if resp.StatusCode == "OK" + if isempty(uOutput) + uOutput=string(resp.Body.Data); + else + uOutput=uOutput + newline + extractAfter(resp.Body.Data, newline); + end + ok=true; + else + ok=false; + break + end + end + if ok + resp.Body.Data=uOutput; + end +end + +function resp = get_low_level_fdsn_query(uri) + U = matlab.net.URI(uri); + method = matlab.net.http.RequestMethod.GET; + type1 = matlab.net.http.MediaType('text/*'); + acceptField = matlab.net.http.field.AcceptField(type1); + uafield=matlab.net.http.HeaderField('UserAgent','MATLAB 9.4.0.949201 (R2018a) Update 6 ZMAP/7.1'); + contentTypeField = matlab.net.http.field.ContentTypeField('text/plain'); + header = [acceptField contentTypeField uafield]; + request = matlab.net.http.RequestMessage(method,header); + + consumer=matlab.net.http.io.StringConsumer; + options=matlab.net.http.HTTPOptions(...'SavePayload',true ... + 'ProgressMonitorFcn',@MyProgressMonitorNew ... + ,'UseProgressMonitor',true ... + ,'ConnectTimeout',30 ... % in seconds + ); + [resp,req,hist] = request.send(U,options,consumer); + %{ + % if there is an error, it would be shown in hist.Response.Body.Data + ss=strsplit(string(resp.Body.Data),newline)'; + numel(ss) + + %% + f=fopen('junkk.dat','w'); + fprintf(f,"%s",resp.Body.Data); %resp.Body.Payload + fclose(f); + %% + ZG.primeCatalog = import_fdsn_event(1,'junk.dat') + % ZmapMainWindow(ZG.primeCatalog) + %} +end From 2cd753e20fe7fcc3e322b5945a2cdc4e8f91e76f Mon Sep 17 00:00:00 2001 From: reyesc Date: Fri, 4 Jan 2019 14:35:53 +0100 Subject: [PATCH 4/5] misc stuff including strike-dip added ability to plot stike/dip of events fixed dip direction of ndk made grid recaculate valid areas after cutting catalog to a polygon fixed bug in stressgrid --- src/+XYfun/stressgrid.m | 2 +- src/@ZmapMainWindow/plot_base_events.m | 6 +++ src/cgr_utils/NDK.m | 2 +- src/cgr_utils/gui/fdsn_chooser.mlapp | Bin 74179 -> 74320 bytes src/cgr_utils/place2coords.m | 36 +++++++++++++ src/cgr_utils/plot_strike_dip.m | 69 +++++++++++++++++++++++++ src/pvals/MyPvalClass.m | 14 +++-- 7 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 src/cgr_utils/place2coords.m create mode 100644 src/cgr_utils/plot_strike_dip.m diff --git a/src/+XYfun/stressgrid.m b/src/+XYfun/stressgrid.m index 37d3b254..b6e5f263 100644 --- a/src/+XYfun/stressgrid.m +++ b/src/+XYfun/stressgrid.m @@ -1,7 +1,7 @@ classdef stressgrid < ZmapHGridFunction % STRESSGRID calculate stress grid for event that have Dip, DipDirection, and Rake properties - + calcmethod end properties(Constant) diff --git a/src/@ZmapMainWindow/plot_base_events.m b/src/@ZmapMainWindow/plot_base_events.m index 76d8d995..40d3c375 100644 --- a/src/@ZmapMainWindow/plot_base_events.m +++ b/src/@ZmapMainWindow/plot_base_events.m @@ -202,6 +202,12 @@ function cb_crop_to_selection(~, ~) yl = [min(ol(:,2)) max(ol(:,2))]; obj.map_axes.XLim = xl; obj.map_axes.YLim = yl; + + % update the grid boundaries, too + obj.gridopt.AbsoluteGridLimits = [xl , yl]; + % obj.Grid = obj.Grid.MaskWithShape(obj.shape); + obj.Grid = ZmapGrid(obj.Grid.Name, 'FromGridOptions',obj.gridopt,'Shape',obj.shape); + end function cb_crop_to_axes(~, ~) diff --git a/src/cgr_utils/NDK.m b/src/cgr_utils/NDK.m index 807ee6bb..446c2687 100644 --- a/src/cgr_utils/NDK.m +++ b/src/cgr_utils/NDK.m @@ -177,7 +177,7 @@ mt.Properties.VariableNames={'mrr', 'mtt', 'mff', 'mrt', 'mrf', 'mtf'}; c.MomentTensor= mt; c.Dip=double(obj.allNDKs.Dip_NodalPlane1); - c.DipDirection=double(obj.allNDKs.Strike_NodalPlane1)+ 90; + c.DipDirection = mod(double(obj.allNDKs.Strike_NodalPlane1)+ 90, 360 ); c.Rake=double(obj.allNDKs.Rake_NodalPlane1); end end diff --git a/src/cgr_utils/gui/fdsn_chooser.mlapp b/src/cgr_utils/gui/fdsn_chooser.mlapp index caf48e20de0766885599b2bb31d197e8cea3c3d2..d7dd67964322a4124ba4fe723a939f4be09cedbd 100644 GIT binary patch delta 53088 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 delta 52972 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 mainshockDate; - catalog = catalog.subset(l); %keep events AFTER mainshock + % keep events AFTER mainshock + catalog = catalog.subset( catalog.Date > mainshockDate ); - % cat at selected magnitude threshold - l = catalog.Magnitude >= obj.MinThreshMag; - catalog = catalog.subset(l); %keep big-enough events + % keep big-enough events + catalog = catalog.subset( catalog.Magnitude >= obj.MinThreshMag ); ZG.hold_state2=true; ctp=CumTimePlot(catalog); @@ -465,7 +463,6 @@ function pvalcat(catalog) tmin = min(timeSinceMainshock); tmax = max(timeSinceMainshock); - tint = [tmin tmax]; [pv, pstd, cv, cstd, kv, kstd, rja, rjb] = mypval2m(obj, eqDates, eqMags,'date',valeg2,CO); @@ -524,6 +521,7 @@ function pvalcat(catalog) ratac = numv ./ dursir; + tint = [tmin tmax]; frf = kv ./ ((tavg + cv).^pv); frf2 = kv ./ ((days(tint) + cv).^pv); From 1b0414ef98eacc19a9e457d5f9902737eadedcbd Mon Sep 17 00:00:00 2001 From: reyesc Date: Mon, 7 Jan 2019 14:08:53 +0100 Subject: [PATCH 5/5] updated reasenberg declustering - expanded options dialog box, so you don't have to answer a series of questions afterward. - declustered catalog now becomes main catalog in window. there had been an error where it confused clustered events with the declustered catalog. that should be fixed. added infrastructure so that a ZmapFunction can call a function when a calculation completes. --- src/@ZmapMainWindow/catalog_menu.m | 1 + src/@ZmapMainWindow/create_all_menus.m | 16 +- src/as_class/ZmapFunction.m | 3 + .../decluster/ReasenbergDeclusterClass.m | 279 +++++++++--------- 4 files changed, 160 insertions(+), 139 deletions(-) diff --git a/src/@ZmapMainWindow/catalog_menu.m b/src/@ZmapMainWindow/catalog_menu.m index ea3ce3be..296cf181 100644 --- a/src/@ZmapMainWindow/catalog_menu.m +++ b/src/@ZmapMainWindow/catalog_menu.m @@ -85,6 +85,7 @@ function cb_recall(~,~) hh=msgbox_nobutton('The catalog has been recalled.','Recall Catalog'); hh.delay_for_close(1); + %obj.replot_all(); else warndlg('No catalog is currently memorized','Recall Catalog'); end diff --git a/src/@ZmapMainWindow/create_all_menus.m b/src/@ZmapMainWindow/create_all_menus.m index 2eb7d112..0f5f10cc 100644 --- a/src/@ZmapMainWindow/create_all_menus.m +++ b/src/@ZmapMainWindow/create_all_menus.m @@ -455,7 +455,7 @@ function explore_catalog(~,~) function create_decluster_menu(parent) submenu = parent;% uimenu(parent,'Label','Decluster the catalog'); - uimenu(submenu,'Label','Decluster (Reasenberg)',MenuSelectedField(),@(~,~)ReasenbergDeclusterClass(obj.catalog),... + uimenu(submenu,'Label','Decluster (Reasenberg)',MenuSelectedField(),@cb_reasen,... 'Separator','on'); uimenu(submenu,'Label','Decluster (Gardner & Knopoff)',... 'Enable','off',... @@ -465,4 +465,18 @@ function cb_declus_inp(~,~) [out,nMethod]=declus_inp(obj.catalog) error('declustered. now what to do with results?'); end + + function cb_reasen(~,~) + rdc = ReasenbergDeclusterClass(obj.catalog, "CalcFinishedFcn",@update_window_with_declust); + + function update_window_with_declust() + if ~isempty(rdc.declusteredCatalog) + msg.dbdisp('replacing the catalog') + obj.rawcatalog = rdc.declusteredCatalog; + obj.replot_all() + else + errordlg('Empty declustered catalog, Main window will not be updated') + end + end + end end \ No newline at end of file diff --git a/src/as_class/ZmapFunction.m b/src/as_class/ZmapFunction.m index 67a076e1..31256d41 100644 --- a/src/as_class/ZmapFunction.m +++ b/src/as_class/ZmapFunction.m @@ -62,6 +62,7 @@ AutoShowPlots logical = true; % will plots be generated upon calculation? InteractiveMode logical = true; DelayProcessing logical = false; + CalcFinishedFcn function_handle = @do_nothing ; %call this once calculation ("do it") has finished. end properties(Constant,Abstract) @@ -145,6 +146,7 @@ p.addParameter('AutoShowPlots', obj.AutoShowPlots) p.addParameter('InteractiveMode', obj.InteractiveMode); p.addParameter('DelayProcessing', obj.DelayProcessing); + p.addParameter('CalcFinishedFcn', obj.CalcFinishedFcn); p.parse(varginstuff{:}); % assign values from parameter to this object @@ -154,6 +156,7 @@ obj.AutoShowPlots = p.Results.AutoShowPlots; obj.InteractiveMode = p.Results.InteractiveMode; obj.DelayProcessing = p.Results.DelayProcessing; + obj.CalcFinishedFcn = p.Results.CalcFinishedFcn; end function StartProcess(obj) diff --git a/src/thomas/decluster/ReasenbergDeclusterClass.m b/src/thomas/decluster/ReasenbergDeclusterClass.m index 9c1501e4..e613244e 100644 --- a/src/thomas/decluster/ReasenbergDeclusterClass.m +++ b/src/thomas/decluster/ReasenbergDeclusterClass.m @@ -5,32 +5,46 @@ properties taumin duration = days(1) % look ahead time for not clustered events taumax duration = days(10) % maximum look ahead time for clustered events - P = 0.95 % confidence level, that you are observing next event in sequence + P = 0.95 % confidence level that this is next event in sequence xk = 0.5 % is the factor used in xmeff - xmeff = 1.5 % effective" lower magnitude cutoff for catalog. it is raised by a factor xk*cmag1 during clusters + + % effective lower magnitude cutoff for catalog. + % During clusteres, it is raised by a factor xk*cmag1 + xmeff = 1.5 + rfact = 10 % factor for interaction radius for dependent events err = 1.5 % epicenter error derr = 2 % depth error, km %declustRoutine = "ReasenbergDeclus" declusteredCatalog ZmapCatalog replaceSequenceWithEquivMainshock logical = false - clusterDetailsVariableName char = 'cluster_details' % if empty, clustering details will not be saved to workspace - declusteredCatalogVariableName char = 'declustered_catalog' % if empty, catalog will not be saved to workspace + + % if empty, clustering details will not be saved to workspace + clusterDetailsVariableName char = 'cluster_details' + + % if empty, catalog will not be saved to workspace + declusteredCatalogVariableName char = 'declustered_catalog' + memorizeOriginalCatalog logical = true end properties(Constant) PlotTag = "ReasenbergDecluster" + ParameterableProperties = ["taumin", "taumax", "P",... "xk","xmeff","rfact","err","derr",..."declustRoutine",... "replaceSequenceWithEquivMainshock",... "clusterDetailsVariableName",... - "declusteredCatalogVariableName"]; - References = 'Paul Reasenberg (1985) "Second -order Moment of Central California Seismicity", JGR, Vol 90, P. 5479-5495.'; + "declusteredCatalogVariableName",... + "memorizeOriginalCatalog"]; + + References = ['Paul Reasenberg (1985) ',... + '"Second -order Moment of Central California Seismicity"',... + ', JGR, Vol 90, P. 5479-5495.']; end methods - function obj=ReasenbergDeclusterClass(catalog, varargin) + function obj = ReasenbergDeclusterClass(catalog, varargin) % BVALGRID % obj = BVALGRID() takes catalog, grid, and eventselection from ZmapGlobal.Data % @@ -61,17 +75,31 @@ function InteractiveSetup(obj) zdlg.AddEdit('rfact', 'Interation radius factor:', obj.rfact, 'RFACT>/b>factor for interaction radius for dependent events'); zdlg.AddEdit('err', 'Epicenter error', obj.err, 'Epicenter error'); zdlg.AddEdit('derr', 'Depth error', obj.derr, 'derrDepth error'); + %zdlg.AddHeader('Output') + zdlg.AddCheckbox('replaceSequenceWithEquivMainshock','Replace clusters with equivalent event',... + obj.replaceSequenceWithEquivMainshock, {},... + 'Will replace each set of cluster earthquakes with a single event of equivalent Magnitude'); + zdlg.AddEdit('clusterDetailsVariableName', 'Save Clusters to workspace as', ... + obj.clusterDetailsVariableName, 'if empty, then nothing will be separately saved'); + zdlg.AddEdit('declusteredCatalogVariableName', 'Save Declustered catalog to workspace as', ... + obj.declusteredCatalogVariableName,'if empty, then nothing will be separately saved'); + zdlg.AddCheckbox('memorizeOriginalCatalog', 'Memorize Original catalog after sucessful decluster:', ... + obj.memorizeOriginalCatalog, {}, 'Memorize original catalog prior to declustering'); + + - zdlg.Create('Name', 'Reasenberg Declustering','WriteToObj',obj,'OkFcn',@obj.declus); + zdlg.Create('Name', 'Reasenberg Declustering','WriteToObj',obj,'OkFcn',@obj.Calculate); end function Results = Calculate(obj) calcFn = @obj.declus; - [declustered_catalog, misc] = calcFn(obj); + [obj.declusteredCatalog, misc] = calcFn(obj); if nargout == 1 - Results = declustered_catalog; + Results = obj.declusteredCatalog; end + + obj.CalcFinishedFcn(); end @@ -121,14 +149,14 @@ function InteractiveSetup(obj) %% calculate interaction_zone (1 value per event) interactzone_main_km = 0.011*10.^(0.4* obj.RawCatalog.Magnitude); %interaction zone for mainshock - interactzone_in_clust_km = obj.rfact * interactzone_main_km; %interaction zone if included in a cluster + interactzone_in_clust_km = obj.rfact * interactzone_main_km; %interaction zone if included in a cluster tau_min = days(obj.taumin); tau_max = days(obj.taumax); %calculation of the eq-time relative to 1902 - eqtime=clustime(obj.RawCatalog); + eqtime = clustime(obj.RawCatalog); %variable to store information whether earthquake is already clustered clus = zeros(1,obj.RawCatalog.Count); @@ -140,6 +168,7 @@ function InteractiveSetup(obj) drawnow declustering_start = tic; %for every earthquake in catalog, main loop + confine_value = @(value, min_val, max_val) max( min( value, max_val), min_val); for i = 1: (obj.RawCatalog.Count-1) % "myXXX" refers to the XXX for this event @@ -152,7 +181,7 @@ function InteractiveSetup(obj) end % variable needed for distance and timediff - my_cluster=clus(i); + my_cluster = clus(i); alreadyInCluster = my_cluster~=0; % attach interaction time @@ -160,37 +189,36 @@ function InteractiveSetup(obj) if alreadyInCluster if my_mag >= max_mag_in_cluster(my_cluster) max_mag_in_cluster(my_cluster) = my_mag; - idx_biggest_event_in_cluster(my_cluster)=i; - look_ahead_days=tau_min; + idx_biggest_event_in_cluster(my_cluster) = i; + look_ahead_days = tau_min; else bgdiff = eqtime(i) - eqtime(idx_biggest_event_in_cluster(my_cluster)); look_ahead_days = clustLookAheadTime(obj.xk, max_mag_in_cluster(my_cluster), obj.xmeff, bgdiff, obj.P); - look_ahead_days = min(look_ahead_days, tau_max); - look_ahead_days = max(look_ahead_days, tau_min); + look_ahead_days = confine_value(look_ahead_days, tau_min, tau_max); end else - look_ahead_days=tau_min; + look_ahead_days = tau_min; end %extract eqs that fit interation time window - [~,ac]=timediff(i, look_ahead_days, clus, eqtime); + [~,ac] = timediff(i, look_ahead_days, clus, eqtime); if ~isempty(ac) %if some eqs qualify for further examination - rtest1=interactzone_in_clust_km(i); - if look_ahead_days==obj.taumin + rtest1 = interactzone_in_clust_km(i); + if look_ahead_days == obj.taumin rtest2 = 0; else - rtest2=interactzone_main_km(idx_biggest_event_in_cluster(my_cluster)); + rtest2 = interactzone_main_km(idx_biggest_event_in_cluster(my_cluster)); end - if alreadyInCluster % if i is already related with a cluster - tm1 = clus(ac) ~= my_cluster; %eqs with a clustnumber different than i + if alreadyInCluster % if i is already related with a cluster + tm1 = clus(ac) ~= my_cluster; % eqs with a clustnumber different than i if any(tm1) - ac=ac(tm1); + ac = ac(tm1); end bg_ev_for_dist = idx_biggest_event_in_cluster(my_cluster); else @@ -203,22 +231,22 @@ function InteractiveSetup(obj) %extract eqs that fit the spatial interaction time sl0 = dist1<= rtest1 | dist2<= rtest2; - if any(sl0) %if some eqs qualify for further examination - ll=ac(sl0); %eqs that fit spatial and temporal criterion - lla=ll(clus(ll)~=0); %eqs which are already related with a cluster - llb=ll(clus(ll)==0); %eqs that are not already in a cluster - if ~isempty(lla) %find smallest clustnumber in the case several - sl1=min(clus(lla)); %numbers are possible + if any(sl0) %if some eqs qualify for further examination + ll = ac(sl0); %eqs that fit spatial and temporal criterion + lla = ll(clus(ll)~=0); %eqs which are already related with a cluster + llb = ll(clus(ll)==0); %eqs that are not already in a cluster + if ~isempty(lla) %find smallest clustnumber in the case several + sl1 = min(clus(lla)); %numbers are possible if alreadyInCluster - my_cluster= min([sl1,my_cluster]); + my_cluster = min([sl1, my_cluster]); else my_cluster = sl1; end if clus(i)==0 - clus(i)=my_cluster; + clus(i) = my_cluster; end - %merge all related clusters together in the cluster with the smallest number - sl2 = lla(clus(lla)~=my_cluster); + % merge related clusters together into cluster with the smallest number + sl2 = lla(clus(lla) ~= my_cluster); for j1 = [i,sl2] if clus(j1) ~= my_cluster clus(clus==clus(j1)) = my_cluster; @@ -227,62 +255,63 @@ function InteractiveSetup(obj) end if my_cluster==0 %if there was neither an event in the interaction zone nor i, already related to cluster - k=k+1; % - my_cluster=k; + k = k+1; % + my_cluster = k; clus(i) = my_cluster; max_mag_in_cluster(my_cluster) = my_mag; idx_biggest_event_in_cluster(my_cluster) = i; end - if size(llb)>0 %attach clustnumber to events not already related to a cluster + if size(llb)>0 % attach clustnumber to events yet unrelated to a cluster clus(llb) = my_cluster * ones(1,length(llb)); % end - end %if ac - end %if sl0 - end %for loop + end %if ac + end %if sl0 + end close(wai); msg.dbfprintf('Declustering complete. It took %g seconds\n',toc(declustering_start)); %% this table contains all we need to know about the clusters. maybe. details = table; - details.Properties.UserData=struct; - for j=1 : numel(obj.ParameterableProperties) - details.Properties.UserData.(obj.ParameterableProperties(j))=obj.(obj.ParameterableProperties(j)); + details.Properties.UserData = struct; + for j = 1 : numel(obj.ParameterableProperties) + details.Properties.UserData.(obj.ParameterableProperties(j)) = obj.(obj.ParameterableProperties(j)); end - details.Properties.Description='Details for cluster as done by reasenberg declustering'; - details.eventNumber = (1:obj.RawCatalog.Count)'; - details.clusterNumber = clus(:); - details.clusterNumber(details.clusterNumber==0)=missing; - details.isBiggest=false(size(details.clusterNumber)); - details.isBiggest(idx_biggest_event_in_cluster)=true; - details.Latitude = obj.RawCatalog.Latitude; - details.Properties.VariableUnits(width(details))={'degrees'}; + details.Properties.Description = 'Details for cluster, from reasenberg declustering'; + details.eventNumber = (1:obj.RawCatalog.Count)'; + details.clusterNumber = clus(:); + details.clusterNumber(details.clusterNumber==0) = missing; + details.isBiggest = false(size(details.clusterNumber)); + details.isBiggest(idx_biggest_event_in_cluster) = true; - details.Longitude = obj.RawCatalog.Longitude; - details.Properties.VariableUnits(width(details))={'degrees'}; + details.Latitude = obj.RawCatalog.Latitude; + details.Properties.VariableUnits(width(details)) = {'degrees'}; - details.Depth = obj.RawCatalog.Depth; - details.Properties.VariableUnits(width(details))={'kilometers'}; + details.Longitude = obj.RawCatalog.Longitude; + details.Properties.VariableUnits(width(details)) = {'degrees'}; - details.Magnitude = obj.RawCatalog.Magnitude; + details.Depth = obj.RawCatalog.Depth; + details.Properties.VariableUnits(width(details)) = {'kilometers'}; - details.MagnitudeType = obj.RawCatalog.MagnitudeType; + details.Magnitude = obj.RawCatalog.Magnitude; - details.Date = obj.RawCatalog.Date; + details.MagnitudeType = obj.RawCatalog.MagnitudeType; - details.InteractionZoneIfMain= interactzone_main_km; - details.Properties.VariableUnits(width(details))={'kilometers'}; + details.Date = obj.RawCatalog.Date; + + details.InteractionZoneIfMain = interactzone_main_km; + details.Properties.VariableUnits(width(details)) = {'kilometers'}; details.InteractionZoneIfInClust = interactzone_in_clust_km; - details.Properties.VariableUnits(width(details))={'kilometers'}; + details.Properties.VariableUnits(width(details)) = {'kilometers'}; clusterFreeCatalog = obj.RawCatalog.subset(ismissing(details.clusterNumber)); %biggest_events_in_cluster = obj.RawCatalog.subset(details.isBiggest); - outputcatalog=clusterFreeCatalog; + outputcatalog = clusterFreeCatalog; if ~any(clus) return @@ -292,93 +321,66 @@ function InteractiveSetup(obj) %build a matrix clust that stored clusters [~, biggest_events_in_cluster, max_mag_in_cluster,~,~] = funBuildclu(obj.RawCatalog,idx_biggest_event_in_cluster,clus,max_mag_in_cluster); - %% replace each cluster sequence with one event that summarizes it + + % replace cluster sequences with summary events if obj.replaceSequenceWithEquivMainshock - ans_ = 'Replace'; + equi = obj.equevent(details(~ismissing(details.clusterNumber),:)); % calculates equivalent events + if isempty(equi) + disp('No clusters in the catalog with this input parameters'); + return; + end + tmpcat = cat(clusterFreeCatalog, equi); %new, unsorted catalog + else - ans_ = 'No'; + tmpcat = cat(clusterFreeCatalog, biggest_events_in_cluster); % builds catalog with biggest events instead + disp('Original mainshocks kept'); end - if obj.InteractiveMode - ans_ = questdlg('Replace mainshocks with equivalent events?',... - 'Replace mainshocks with equivalent events?',... - 'Replace','No',ans_ ); - end - - switch ans_ - case 'Replace' - equi = obj.equevent(details(~ismissing(details.clusterNumber),:)); % calculates equivalent events - if isempty(equi) - disp('No clusters in the catalog with this input parameters'); - return; - end - tmpcat=cat(clusterFreeCatalog, equi); %new catalog, but not sorted - case 'No' - tmpcat=cat(clusterFreeCatalog, biggest_events_in_cluster); % builds catalog with biggest events instead - disp('Original mainshocks kept'); - - end + tmpcat.sort('Date'); + tmpcat.Name = string(tmpcat.Name) + " (declust)"; - %% save the clustering details - if obj.InteractiveMode - answer=inputdlg('Save cluster information to workspace as:','Declustering details',... - 1,{obj.clusterDetailsVariableName}); - else - answer = {obj.clusterDetailsVariableName}; + % save clustering details to workspace + if ~isempty(obj.clusterDetailsVariableName) + assignin('base',matlab.lang.makeValidName(obj.clusterDetailsVariableName),details); end - if ~isempty(answer) - assignin('base',matlab.lang.makeValidName(answer{1}),details); - end - - tmpcat.sort('Date') - - ZG = ZmapGlobal.Data; - ZG.original=obj.RawCatalog; %save catalog in variable original - ZG.newcat=ZG.primeCatalog; - ZG.storedcat=ZG.original; - ZG.cluscat=ZG.original.subset(clus(clus~=0)); - - %% save the declustered catalog - if obj.InteractiveMode - answer=inputdlg('Save declustered catalog to workspace as:','Declustered catalog',... - 1,{obj.declusteredCatalogVariableName}); - else - answer = {obj.declusteredCatalogVariableName}; - end - if ~isempty(answer) - assignin('base', answer{1}, tmpcat); + if obj.memorizeOriginalCatalog + mm = MemorizedCatalogManager(); + mm.memorize(obj.RawCatalog,'predeclust') end + ZG = ZmapGlobal.Data; + ZG.original = obj.RawCatalog; %save catalog in variable original + %ZG.newcat = ZG.primeCatalog; + %ZG.storedcat = ZG.original; + ZG.cluscat = ZG.original.subset(clus(clus~=0)); - %{ - warning('should somehow zmap_update_displays()'); - plot_ax = findobj(gcf,'Tag','mainmap_ax'); - hold(plot_ax,'on'); - pl=scatter3(plot_ax,ZG.cluscat.Longitude, ZG.cluscat.Latitude,ZG.cluscat.Depth,[],'m', 'DisplayName','Clustered Events'); - pl.ZData=ZG.cluscat.Depth; - %} + % save declustered catalog to workspace + if ~isempty(obj.declusteredCatalogVariableName) + assignin('base', obj.declusteredCatalogVariableName, tmpcat); + end + st1 = sprintf([' The declustering found %d clusters of earthquakes, a total of %d'... - ' events (out of %d). The map window [would] now display the declustered catalog containing %d events.'... - 'The individual clusters are displayed as magenta on the map.' ], ... + ' events (out of %d). The map window now displays the declustered catalog containing %d events.'], ... biggest_events_in_cluster.Count, ZG.cluscat.Count, ZG.original.Count , ZG.primeCatalog.Count); msgbox(st1,'Declustering Information') watchoff - outputcatalog=ZG.cluscat; + outputcatalog = tmpcat; obj.Result(1).values.cluster_details = details; + end function plot(obj, varargin) - f=figure('Name','Reasenberg Deslustering Results'); - ax=subplot(2,2,1); - ZG=ZmapGlobal.Data; + f = figure('Name','Reasenberg Deslustering Results'); + ax = subplot(2,2,1); + ZG = ZmapGlobal.Data; biggest = obj.Result.values.cluster_details(obj.Result.values.cluster_details.isBiggest,:); - non_cluster= obj.Result.values.cluster_details(ismissing(obj.Result.values.cluster_details.clusterNumber),:); - msf=str2func(ZG.MainEventOpts.MarkerSizeFcn); + non_cluster = obj.Result.values.cluster_details(ismissing(obj.Result.values.cluster_details.clusterNumber),:); + msf = str2func(ZG.MainEventOpts.MarkerSizeFcn); scatter3(biggest.Longitude,biggest.Latitude,biggest.Depth,msf(biggest.Magnitude)); ax.ZDir='reverse'; title(ax,'Biggest events in each cluster'); @@ -392,7 +394,7 @@ function plot(obj, varargin) ax = subplot(2,2,2); - ax=subplot(2,1,2); + ax = subplot(2,1,2); isInClust = ~ismissing(obj.Result.values.cluster_details.clusterNumber); isNotBig = ~obj.Result.values.cluster_details.isBiggest; @@ -401,7 +403,7 @@ function plot(obj, varargin) ax.YDir='reverse'; hold on; scatter(biggest.Date,biggest.Depth,msf(biggest.Magnitude),categorical(biggest.clusterNumber),'DisplayName','primary events in each cluster'); - cb=colorbar; + cb = colorbar; cb.Label.String = 'Cluster #'; ax.YLabel.String = 'Depth [km]'; ax.XLabel.String = 'Date'; @@ -411,14 +413,14 @@ function plot(obj, varargin) end methods(Static) - function h=AddMenuItem(parent,catalog) + function h = AddMenuItem(parent,catalog) % create a menu item label='Reasenberg Decluster'; - h=uimenu(parent,'Label',label,MenuSelectedField(), @(~,~)ReasenbergDeclusterClass(catalog)); + h = uimenu(parent,'Label',label,MenuSelectedField(), @(~,~)ReasenbergDeclusterClass(catalog)); end - function equi=equevent(tb) + function equi = equevent(tb) % equevent calc equivalent event to cluster % equi = equevent(catalog, cluster, bg) % catalog : earthquake catalog @@ -431,19 +433,19 @@ function plot(obj, varargin) % report_this_filefun(); - equi=ZmapCatalog; + equi = ZmapCatalog; equi.Name='clusters'; if isempty(tb) return end - j=0; + j = 0; nClusts = max(tb.clusterNumber); [elat, elon, edep, emag] = deal(nan(nClusts,1)); edate(nClusts,1) = datetime(missing); - emagtype(nClusts,1)=categorical(missing); + emagtype(nClusts,1) = categorical(missing); - for n=1 : max(tb.clusterNumber) + for n = 1 : max(tb.clusterNumber) clust_events = tb(tb.clusterNumber==n,:); if isempty(clust_events) continue; @@ -451,7 +453,7 @@ function plot(obj, varargin) j = j + 1; eqmoment = 10.^(clust_events.Magnitude .* 1.2); - emoment=sum(eqmoment); %moment + emoment = sum(eqmoment); %moment weights = eqmoment./emoment; %weightfactor elat(j) = sum(clust_events.Latitude .* weights); @@ -471,10 +473,11 @@ function plot(obj, varargin) equi.Date = edate(1:j); equi.Magnitude = emag(1:j); equi.MagnitudeType = emagtype(1:j); - equi.Depth=edep(1:j); + equi.Depth = edep(1:j); [equi.Dip, equi.DipDirection, equi.Rake]=deal(nan(size(equi.Date))); end end + end