Changeset 395


Ignore:
Timestamp:
05/26/2011 05:21:15 PM (12 years ago)
Author:
marcus
Message:
  • added controls to plotting test
  • caching of reduced plotting data (2 stages)
  • example from web
Location:
SHX/trunk
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • SHX/trunk/SeismicHandler/patches/ObsPy.py

    r394 r395  
    2929import numpy as np 
    3030import math 
    31 import wx 
    3231from obspy.core import Stream, Trace 
    3332#from obspy.core import UTCDateTime 
     
    9493    # width of the total screen that is covered by trace data (pixels) 
    9594    pixel_width = duration_trace * width / duration_total 
    96     self.shxPixelWidth = pixel_width 
    97      
    98     # data points per pixel 
    99     npts = pt.stats.npts 
    100     dpp = int(npts / pixel_width) 
    101  
    102     # get copy of data 
    103     self.shxPlotData = pt.data.copy() 
     95 
     96    # remember values for caching 
     97    CacheTraceID = \ 
     98              (windowstart, windowend, "%.5f" % pixel_width, height, zoom, norm) 
     99    try: 
     100        cachedX = CacheTraceID[:3] == self.shxCacheTraceID[:3] 
     101        cachedY = cachedX and CacheTraceID[3:] == self.shxCacheTraceID[3:] 
     102    except: 
     103        cachedX = False 
     104        cachedY = False 
     105 
     106    if not cachedX: 
     107        # save new ID 
     108        self.shxCacheTraceID = CacheTraceID 
     109 
     110        # data points per pixel 
     111        npts = pt.stats.npts 
     112        dpp = int(npts / pixel_width) 
     113 
     114        # get copy of data 
     115        self.shxPlotData = pt.data.copy() 
     116    else: 
     117        print "using cachedX data for", CacheTraceID[:3] 
    104118 
    105119    # use minmax approach if more than 4 data points per pixel 
    106120    # self.shx_plotdata will be changed 
    107     if dpp >= 4: 
     121    if not cachedX and dpp >= 4: 
    108122        # do integer division since array shape values cannot be floats 
    109123        dimx = npts // dpp 
     
    128142        print "pixel_width", pixel_width, "minmax", "npts", npts, "dpp", dpp, "dimx", dimx, \ 
    129143              "covered", covered, "len_rest", len(remaining), "data_len", \ 
    130               len(data), "joined", len(joined) 
    131  
     144              len(data), "joined", len(joined), "width", width 
     145 
     146        # At this stage the x-transformed data can be cached! If pixel_width 
     147        # doesn't change, the data can be reused to save time. 
    132148        self.shxPlotData = joined 
    133149 
    134     # At this stage the x-transformed data can be cached! If pixel_width doesn't 
    135     # change, the data can be reused to save time. 
    136  
    137     print width, height, norm, duration_trace, duration_total, pixel_width, dpp, type(self.shxPlotData) 
     150    print width, height, norm, type(self.shxPlotData) 
     151 
     152    if cachedY: 
     153        print "using cachedY data for", CacheTraceID[3:] 
     154        return 
    138155 
    139156    # get basis for normation 
     
    153170    y *= self.stats.calib / norm * height / 2 * zoom 
    154171 
    155     print self.shxPlotData.min(), self.shxPlotData.max(), y.min(), y.max() 
     172#    print self.shxPlotData.min(), self.shxPlotData.max(), y.min(), y.max() 
    156173 
    157174    # factor for x stretching (trade-off between pixel_width and array shape) 
  • SHX/trunk/sandbox/traceplotter.py

    r394 r395  
    22 
    33import wx 
     4import sys 
     5import os 
    46import wx.lib.scrolledpanel as SP 
    57from SeismicHandler.core import read 
     8from obspy.sh.core import fromUTCDateTime 
    69 
    710class MyPanel(SP.ScrolledPanel): 
    8     def __init__(self, parent): 
     11    def __init__(self, parent, fname=None): 
    912        SP.ScrolledPanel.__init__(self, parent, style=wx.BORDER_SIMPLE) 
     13         
     14        self.parent = parent 
    1015        self.Bind(wx.EVT_PAINT, self.OnPaint) 
    11 #        self.Bind(wx.EVT_RESIZE, self.OnPaint) 
     16        self.Bind(wx.EVT_SIZE, self.OnPaint) 
    1217        self.Bind(wx.EVT_IDLE, self.OnIdle) 
     18        self.Bind(wx.EVT_MOTION, self.OnMotion) 
     19 
    1320        self.refresh = False 
     21        self.load(fname) 
    1422        self.OnPaint(None) 
     23        self.SetFocus() 
    1524 
    16         st = read("/online4/2011/GR/BFO/BHZ.D/GR.BFO..BHZ.D.2011.124") 
     25    def OnMotion(self, evt): 
     26        duration = self.end - self.start 
     27        x = evt.GetX() 
     28         
     29        t = x * duration / self.width 
     30 
     31        self.parent.SetStatusText(fromUTCDateTime(self.start + t)) 
     32 
     33        evt.Skip() 
     34 
     35    def load(self, fname=None): 
     36        if not fname: 
     37            st = read() 
     38        else: 
     39            try: 
     40                st = read(fname) 
     41            except Exception, e: 
     42                print e.message 
     43                return 
     44         
     45        print "Loading %s..." % fname 
    1746        self.tr = st[0] 
    1847 
     
    2756    def Paint(self): 
    2857        width, height = self.GetClientSize() 
     58        self.width = width 
    2959 
    30         start = self.tr.stats.starttime - 4 
    31         end = self.tr.stats.endtime + 4 
     60        start = self.start = self.tr.stats.starttime - 36 
     61        end = self.end = self.tr.stats.endtime + 36 
    3262 
    33         self.tr.shxPrepareImageData(width, height, (start, end)) 
     63        self.tr.shxPrepareImageData(width, height, (start, end), zoom=0.9) 
    3464 
    3565        bitmap = wx.EmptyBitmap(width, height) 
    3666        buffer = wx.MemoryDC(bitmap) 
    37         buffer.Clear() 
     67        # smoothed graphics, slower 
    3868#        dc = wx.GCDC(buffer) 
    3969        dc = buffer 
     70        dc.SetBrush(wx.TRANSPARENT_BRUSH) 
     71        dc.Clear() 
     72 
     73        dc.SetPen(wx.Pen((45,45,45), 1)) 
     74 
    4075        dc.BeginDrawing() 
    4176        dc.DrawLineList(self.tr.shxImageData) 
    4277        dc.EndDrawing() 
    4378 
     79        plotStartSec = self.tr.stats.starttime - start 
     80        offsetX = 0 
     81        if plotStartSec: 
     82            # re-calculate offset 
     83            portion = plotStartSec / (end - start) 
     84            offsetX = portion * width 
     85            print portion, offsetX 
     86             
    4487        dc2 = wx.AutoBufferedPaintDCFactory(self) 
    45         dc2.Blit(0, 0, width, height, buffer, 0, 0, wx.COPY) 
     88        dc2.Clear() 
     89        dc2.Blit(offsetX, 0, width, height, buffer, 0, 0, wx.AND) 
    4690 
    4791class MyFrame(wx.Frame): 
    4892    def __init__(self, parent, title): 
    49         wx.Frame.__init__(self, parent, title=title, size=(640,480), style=wx.DEFAULT_FRAME_STYLE | wx.FULL_REPAINT_ON_RESIZE) 
    50         self.canvas = MyPanel(self) 
     93        wx.Frame.__init__(self, parent, title=title, size=(640,280), style=wx.DEFAULT_FRAME_STYLE | wx.FULL_REPAINT_ON_RESIZE) 
     94        try: 
     95            fname = sys.argv[1] 
     96        except IndexError: 
     97            fname = None 
     98        self.canvas = MyPanel(self, fname) 
     99        self.CreateStatusBar() 
     100        self.SetStatusText("Seimic Handler wxWidgets version") 
     101 
     102        menuBar = wx.MenuBar() 
     103        firstmenu = wx.Menu() 
     104        read = wx.MenuItem(firstmenu, wx.NewId(), 'Re&ad...\tCtrl+A') 
     105        self.Bind(wx.EVT_MENU, self.onRead, id=read.GetId()) 
     106        firstmenu.AppendItem(read) 
     107        quit = wx.MenuItem(firstmenu, wx.NewId(), '&Quit\tCtrl+Q') 
     108        self.Bind(wx.EVT_MENU, self.onQuit, id=quit.GetId()) 
     109        firstmenu.AppendItem(quit) 
     110 
     111        menuBar.Append(firstmenu, "&File"); 
     112        self.SetMenuBar(menuBar) 
     113 
     114        self.Accelerators = wx.AcceleratorTable( 
     115            [(wx.ACCEL_CTRL, ord('r'), read.GetId()), 
     116             (wx.ACCEL_NORMAL, ord('x'), read.GetId()), 
     117             (wx.ACCEL_NORMAL, wx.WXK_LEFT, read.GetId()), 
     118            ]) 
     119        self.SetAcceleratorTable(self.Accelerators) 
     120         
     121        self.Bind(wx.EVT_CHAR_HOOK, self.onKeyDown) 
     122         
    51123        self.Show() 
     124 
     125    def onKeyDown(self, evt): 
     126        print evt.GetKeyCode() 
     127 
     128    def onQuit(self, evt): 
     129        self.Close() 
     130 
     131    def onRead(self, evt): 
     132        """ Open a file""" 
     133        self.dirname = getattr(self, "dirname", "") 
     134        self.filename = getattr(self, "filename", "") 
     135        dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", wx.OPEN) 
     136        if dlg.ShowModal() == wx.ID_OK: 
     137            self.filename = dlg.GetFilename() 
     138            self.dirname = dlg.GetDirectory() 
     139        dlg.Destroy() 
     140 
     141        fqpn = os.path.join(self.dirname, self.filename) 
     142        self.SetStatusText(fqpn) 
     143        self.canvas.load(fqpn) 
    52144 
    53145def main(): 
Note: See TracChangeset for help on using the changeset viewer.