Revision: 7890
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7890&view=rev
Author:   jswhit
Date:     2009-10-17 13:02:30 +0000 (Sat, 17 Oct 2009)

Log Message:
-----------
remove restriction that cyclic point be included in shiftgrid function
(patch from Eric Bruning).  Add unit tests for shiftgrid in test.py

Modified Paths:
--------------
    trunk/toolkits/basemap/Changelog
    trunk/toolkits/basemap/README
    trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py
    trunk/toolkits/basemap/lib/mpl_toolkits/basemap/test.py

Modified: trunk/toolkits/basemap/Changelog
===================================================================
--- trunk/toolkits/basemap/Changelog    2009-10-16 17:31:42 UTC (rev 7889)
+++ trunk/toolkits/basemap/Changelog    2009-10-17 13:02:30 UTC (rev 7890)
@@ -1,4 +1,6 @@
 version 0.99.5 (not yet released)
+           * shiftgrid no longer requires a cyclic point to be present
+             (patch from Eric Bruning).
            * fix date2index bugs.
            * update date2index function with a bug-fix from netcdf4-python.
            * in contourf method, mask data outside map projection region

Modified: trunk/toolkits/basemap/README
===================================================================
--- trunk/toolkits/basemap/README       2009-10-16 17:31:42 UTC (rev 7889)
+++ trunk/toolkits/basemap/README       2009-10-17 13:02:30 UTC (rev 7890)
@@ -140,5 +140,6 @@
 Chris Murphy
 Pierre Gerard-Marchant
 Christoph Gohlke
+Eric Bruning
 
 for valuable contributions.

Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py
===================================================================
--- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009-10-16 
17:31:42 UTC (rev 7889)
+++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009-10-17 
13:02:30 UTC (rev 7890)
@@ -3677,10 +3677,9 @@
         dataout = np.where(xymask,masked,dataout)
     return dataout
 
-def shiftgrid(lon0,datain,lonsin,start=True):
+def shiftgrid(lon0,datain,lonsin,start=True,cyclic=360.0):
     """
     Shift global lat/lon grid east or west.
-    assumes wraparound (or cyclic point) is included.
 
     .. tabularcolumns:: |l|L|
 
@@ -3702,15 +3701,21 @@
     start            if True, lon0 represents the starting longitude
                      of the new grid. if False, lon0 is the ending
                      longitude. Default True.
+    cyclic           width of periodic domain (default 360)
     ==============   ====================================================
 
     returns ``dataout,lonsout`` (data and longitudes on shifted grid).
     """
-    if np.fabs(lonsin[-1]-lonsin[0]-360.) > 1.e-4:
-        raise ValueError, 'cyclic point not included'
+    if np.fabs(lonsin[-1]-lonsin[0]-cyclic) > 1.e-4:
+        # Use all data instead of raise ValueError, 'cyclic point not included'
+        start_idx = 0
+    else:
+        # If cyclic, remove the duplicate point
+        start_idx = 1
     if lon0 < lonsin[0] or lon0 > lonsin[-1]:
         raise ValueError, 'lon0 outside of range of lonsin'
     i0 = np.argmin(np.fabs(lonsin-lon0))
+    i0_shift = len(lonsin)-i0
     if hasattr(datain,'mask'):
         dataout  = ma.zeros(datain.shape,datain.dtype)
     else:
@@ -3720,15 +3725,15 @@
     else:
         lonsout = np.zeros(lonsin.shape,lonsin.dtype)
     if start:
-        lonsout[0:len(lonsin)-i0] = lonsin[i0:]
+        lonsout[0:i0_shift] = lonsin[i0:]
     else:
-        lonsout[0:len(lonsin)-i0] = lonsin[i0:]-360.
-    dataout[:,0:len(lonsin)-i0] = datain[:,i0:]
+        lonsout[0:i0_shift] = lonsin[i0:]-cyclic
+    dataout[:,0:i0_shift] = datain[:,i0:]
     if start:
-        lonsout[len(lonsin)-i0:] = lonsin[1:i0+1]+360.
+        lonsout[i0_shift:] = lonsin[start_idx:i0+start_idx]+cyclic
     else:
-        lonsout[len(lonsin)-i0:] = lonsin[1:i0+1]
-    dataout[:,len(lonsin)-i0:] = datain[:,1:i0+1]
+        lonsout[i0_shift:] = lonsin[start_idx:i0+start_idx]
+    dataout[:,i0_shift:] = datain[:,start_idx:i0+start_idx]
     return dataout,lonsout
 
 def addcyclic(arrin,lonsin):

Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/test.py
===================================================================
--- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/test.py     2009-10-16 
17:31:42 UTC (rev 7889)
+++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/test.py     2009-10-17 
13:02:30 UTC (rev 7890)
@@ -1,10 +1,12 @@
-from mpl_toolkits.basemap import Basemap
+from mpl_toolkits.basemap import Basemap, shiftgrid
 import numpy as np
 
 # beginnings of a test suite.
 
-from numpy.testing import NumpyTestCase,assert_almost_equal
-class TestRotateVector(NumpyTestCase):
+from numpy.testing import TestCase,assert_almost_equal
+
+class TestRotateVector(TestCase):
+
     def make_array(self):
         lat = np.array([0, 45, 75, 90])
         lon = np.array([0,90,180,270])
@@ -17,7 +19,6 @@
         B = Basemap()
         u,v,lat,lon=self.make_array()
         ru, rv = B.rotate_vector(u,v, lon, lat)
-    
         # Check that the vectors are identical.
         assert_almost_equal(ru, u)
         assert_almost_equal(rv, v)
@@ -37,20 +38,74 @@
         B=Basemap(projection='npstere', boundinglat=50., lon_0=0.)
         u,v,lat,lon=self.make_array()
         v = np.ones((len(lat), len(lon)))    
-        
         ru, rv = B.rotate_vector(u,v, lon, lat)
-        
         assert_almost_equal(ru[2, :],[1,-1,-1,1], 6)
         assert_almost_equal(rv[2, :],[1,1,-1,-1], 6)
 
+class TestShiftGrid(TestCase):
+
+    def make_data_cyc(self):
+        loncyc  =  np.array([0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300,\
+            330, 360],dtype=np.float)
+        gridcyc = np.array([[0,  1,  2,  3,   4,   5,   6,   7,   8,   9,  10,\
+            11,   0]],dtype=np.float)
+        lonoutcyc  =  np.array([-180, -150, -120, -90, -60, -30, 0, 30,60,90,\
+            120, 150, 180],dtype=np.float)
+        gridoutcyc = np.array([[   6,    7,   8,    9,  10,  11, 0,  1,  2,3,\
+            4,   5,   6]],dtype=np.float)
+        return loncyc, gridcyc, lonoutcyc, gridoutcyc
+
+    def make_data_nocyc(self):
+        lonnocyc  =  np.array([0, 30, 60, 90, 120, 150, 180, 210, 240, 270,\
+            300, 330],dtype=np.float)
+        gridnocyc = np.array([[0,  1,  2,  3,   4,   5,   6,   7,   8,   9,\
+            10,  11]],dtype=np.float)
+        lonoutnocyc  =  np.array([-180, -150, -120, -90, -60, -30, 0, 30, 60,\
+            90, 120, 150],dtype=np.float)
+        gridoutnocyc = np.array([[   6,    7,   8,    9,  10,  11, 0,  1,  2,\
+            3,   4,   5]],dtype=np.float)
+        return lonnocyc, gridnocyc, lonoutnocyc, gridoutnocyc
+
+    def make_data_nocyc2(self):
+        lonnocyc2  =  np.array([15, 45, 75, 105, 135, 165, 195, 225, 255, 285,\
+            315, 345],dtype=np.float)
+        gridnocyc2 = np.array([[0,  1,  2,  3,   4,   5,   6,   7,   8,   9,\
+            10,  11]],dtype=np.float)
+        lonoutnocyc2  =  np.array([-165, -135, -105, -75, -45, -15, 15,45,75,\
+            105, 135, 165],dtype=np.float)
+        gridoutnocyc2 = np.array([[   6,    7,   8,    9,  10,  11, 0,  1,  2,\
+            3,   4,   5]],dtype=np.float)
+        return lonnocyc2, gridnocyc2, lonoutnocyc2, gridoutnocyc2
+
+    def test_cyc(self):
+        lonin, gridin, lonout, gridout = self.make_data_cyc()
+        grid, lon = shiftgrid(lonin[len(lonin)/2], gridin, lonin, start=False)
+        assert (lon==lonout).all()
+        assert (grid==gridout).all()
+
+    def test_no_cyc(self):
+        lonin, gridin, lonout, gridout = self.make_data_nocyc()
+        grid, lon = shiftgrid(lonin[len(lonin)/2], gridin, lonin, start=False)
+        assert (lon==lonout).all()
+        assert (grid==gridout).all()
+
+    def test_no_cyc2(self):
+        lonin, gridin, lonout, gridout = self.make_data_nocyc2()
+        grid, lon = shiftgrid(lonin[len(lonin)/2], gridin, lonin, start=False)
+        assert (lon==lonout).all()
+        assert (grid==gridout).all()
+
+
 def test():
     """
     Run some tests.
     """
     import unittest
-    suite = unittest.makeSuite(TestRotateVector,'test')
+    rotatevector_suite = unittest.makeSuite(TestRotateVector,'test')
+    shiftgrid_suite = unittest.makeSuite(TestShiftGrid,'test')
     runner = unittest.TextTestRunner()
-    runner.run(suite)
+    runner.run(rotatevector_suite)
+    runner.run(shiftgrid_suite)
 
 if __name__ == '__main__':
     test()


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to