def test_tOverlap(self): """tOverlap should return a known value for known input""" real_ans = ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]) ans = tb.tOverlap(self.dt_a, self.dt_b) self.assertEqual(real_ans, ans) self.assertEqual( (None, None), tb.tOverlap(self.dt_a, self.dt_b2) )
def test_tOverlapSorted(self): """Exploit the sorting for a fast tOverlap""" real_ans = ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]) ans = tb.tOverlap(self.dt_a, self.dt_b, presort=True) numpy.testing.assert_array_equal(real_ans, ans)
def test_tOverlap_random(self): """Shuffle input before calling tOverlap""" real_ans = ([1, 5, 6, 10, 15, 16, 18, 24, 29, 30, 43, 46, 47, 51, 53, 55, 56, 64, 67, 74], [1, 2, 6, 7, 10, 12, 13, 14, 15, 17, 18, 19, 24, 27, 28, 30, 32, 35, 37, 38]) random.seed(0) random.shuffle(self.dt_a, lambda:round(random.random(), 9)) random.shuffle(self.dt_b, lambda:round(random.random(), 9)) ans = tb.tOverlap(self.dt_a, self.dt_b) numpy.testing.assert_array_equal(real_ans, ans)
"""Tests for the speed of tOverlap Copyright ©2010 Los Alamos National Security, LLC. """ import datetime import random import timeit from spacepy import toolbox n_iter = 500 #Very simple call to make sure everything loaded/init before timing dt_a = [datetime.datetime(2000, 1, 1), datetime.datetime(2000, 1, 2)] dt_b = [datetime.datetime(1999, 12, 31), datetime.datetime(2000, 1, 1)] toolbox.tOverlap(dt_a, dt_b, presort=False) toolbox.tOverlap(dt_a, dt_b, presort=True) dt1 = datetime.datetime(2000, 11, 12) dt_a = [dt1 + datetime.timedelta(hours=offset) for offset in range(10000)] dt_b = [ dt1 + datetime.timedelta(hours=offset) for offset in range(-5000, 5000) ] timing = timeit.timeit('toolbox.tOverlap(dt_a, dt_b)', 'from __main__ import toolbox, dt_a, dt_b', number=n_iter) print('Sorted arrays took ' + str(timing) + ' seconds.') timing = timeit.timeit('toolbox.tOverlap(dt_a, dt_b, presort=True)', 'from __main__ import toolbox, dt_a, dt_b', number=n_iter)
def getPlasmaPause(ticks, model='M2002', LT='all', omnivals=None): """ Plasmapause location model(s) CA1992 -- Carpenter, D. L., and R. R. Anderson, An ISEE/whistler model of equatorial electron density in the magnetosphere, J. Geophys. Res., 97, 1097, 1992. M2002 -- Moldwin, M. B., L. Downward, H. K. Rassoul, R. Amin, and R. R. Anderson, A new model of the location of the plasmapause: CRRES results, J. Geophys. Res., 107(A11), 1339, doi:10.1029/2001JA009211, 2002. RT1970 -- Rycroft, M. J., and J. O. Thomas, The magnetospheric plasmapause and the electron density trough at the alouette i orbit, Planetary and Space Science, 18(1), 65-80, 1970 Parameters ========== ticks : spacepy.time.Ticktock TickTock object of desired times Lpp_model : string, optional 'CA1992' or 'M2002' (default) CA1992 returns the Carpenter and Anderson model, M2002 returns the Moldwin et al. model LT : int, float requested local time sector, 'all' is valid option omnivals : spacepy.datamodel.SpaceData, dict dict-like containing UTC (datetimes) and Kp keys Returns ======= out : float Plasmapause radius in Earth radii Examples ======== >>> import spacepy.time as spt >>> import spacepy.empiricals as emp >>> ticks = spt.tickrange('2002-01-01T12:00:00','2002-01-04T00:00:00',.25) >>> emp.getPlasmaPause(ticks) array([ 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.26859998, 5.772 , 5.6574 , 5.6574 ]) """ def calcLpp(Kpmax, A, B, power=1): currLpp = A - B * Kpmax**power return currLpp model_list = ['CA1992', 'M2002', 'RT1970'] if model == 'CA1992': if LT != 'all': print('No LT dependence currently supported for this model') if model not in model_list: raise ValueError("Please specify a valid model:\n{0}".format( ' or '.join(model_list))) if LT == 'all': parA = {'CA1992': 5.6, 'M2002': 5.39, 'RT1970': 5.64} parB = {'CA1992': 0.46, 'M2002': 0.382, 'RT1970': 0.78} priorvals = { 'CA1992': datetime.timedelta(hours=24), 'M2002': datetime.timedelta(hours=12), 'RT1970': datetime.timedelta(0) } A, B = parA[model], parB[model] prior = priorvals[model] else: try: float(LT) except (ValueError, TypeError): raise ValueError( "Please specify a valid LT:\n'all' or a numeric type") parA = { 'CA1992': [5.6] * 24, 'M2002': [5.7] * 3 + [6.05] * 6 + [5.2] * 6 + [4.45] * 6 + [5.7] * 3, 'RT1970': [5.64] * 24 } parB = { 'CA1992': [0.46] * 24, 'M2002': [0.42] * 3 + [0.573] * 6 + [0.425] * 6 + [0.167] * 6 + [0.42] * 3, 'RT1970': [0.78] * 24 } priorvals = { 'CA1992': [datetime.timedelta(hours=24)] * 24, 'M2002': [datetime.timedelta(hours=12)] * 24, 'RT1970': [datetime.timedelta(0)] * 24 } try: LThr = long(LT) except NameError: LThr = int(LT) prior = priorvals[model][LThr] A, B = parA[model][LThr], parB[model][LThr] st, en = ticks.UTC[0] - prior, ticks.UTC[-1] if omnivals is None: omdat = om.get_omni(spt.tickrange(st, en, 1.0 / 24.0), dbase='QDhourly') else: #now test for sanity of input try: assert isinstance(omnivals, dict) except: raise TypeError( 'Not a valid input type for omnivals, expected spacepy.datamodel.SpaceData' ) try: assert 'UTC' in omnivals assert 'Kp' in omnivals except: raise KeyError( 'Required data not found in input dict-like (omnivals)') omdat = omnivals einds, oinds = tb.tOverlap([st, en], omdat['UTC']) utc = np.array(omdat['UTC'])[oinds] Kp = np.array(omdat['Kp'])[oinds] Lpp = np.zeros(len(ticks)) if model == 'RT1970': power = 0.5 else: power = 1 for i, t1 in enumerate(ticks.UTC): t0 = t1 - prior iprevday, dum = tb.tOverlap(utc, [t0, t1]) if iprevday: Kpmax = max(Kp[iprevday]) Lpp[i] = calcLpp(Kpmax, A, B, power=power) else: Lpp[i] = np.nan return Lpp
def getPlasmaPause(ticks, model='M2002', LT='all', omnivals=None): """ Plasmapause location model(s) CA1992 -- Carpenter, D. L., and R. R. Anderson, An ISEE/whistler model of equatorial electron density in the magnetosphere, J. Geophys. Res., 97, 1097, 1992. M2002 -- Moldwin, M. B., L. Downward, H. K. Rassoul, R. Amin, and R. R. Anderson, A new model of the location of the plasmapause: CRRES results, J. Geophys. Res., 107(A11), 1339, doi:10.1029/2001JA009211, 2002. RT1970 -- Rycroft, M. J., and J. O. Thomas, The magnetospheric plasmapause and the electron density trough at the alouette i orbit, Planetary and Space Science, 18(1), 65-80, 1970 Parameters ========== ticks : spacepy.time.Ticktock TickTock object of desired times Lpp_model : string, optional 'CA1992' or 'M2002' (default) CA1992 returns the Carpenter and Anderson model, M2002 returns the Moldwin et al. model LT : int, float requested local time sector, 'all' is valid option omnivals : spacepy.datamodel.SpaceData, dict dict-like containing UTC (datetimes) and Kp keys Returns ======= out : float Plasmapause radius in Earth radii Examples ======== >>> import spacepy.time as spt >>> import spacepy.empiricals as emp >>> ticks = spt.tickrange('2002-01-01T12:00:00','2002-01-04T00:00:00',.25) >>> emp.getPlasmaPause(ticks) array([ 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.42140002, 6.26859998, 5.772 , 5.6574 , 5.6574 ]) """ def calcLpp(Kpmax, A, B, power=1): currLpp = A - B*Kpmax**power return currLpp model_list = ['CA1992', 'M2002', 'RT1970'] if model == 'CA1992': if LT!='all': print('No LT dependence currently supported for this model') if model not in model_list: raise ValueError("Please specify a valid model:\n{0}".format(' or '.join(model_list))) if LT=='all': parA = {'CA1992': 5.6, 'M2002': 5.39, 'RT1970': 5.64} parB = {'CA1992': 0.46, 'M2002': 0.382, 'RT1970': 0.78} priorvals = {'CA1992': datetime.timedelta(hours=24), 'M2002': datetime.timedelta(hours=12), 'RT1970': datetime.timedelta(0)} A, B = parA[model], parB[model] prior = priorvals[model] else: try: float(LT) except (ValueError, TypeError): raise ValueError("Please specify a valid LT:\n'all' or a numeric type") parA = {'CA1992': [5.6]*24, 'M2002': [5.7]*3+[6.05]*6+[5.2]*6+[4.45]*6+[5.7]*3, 'RT1970': [5.64]*24} parB = {'CA1992': [0.46]*24, 'M2002': [0.42]*3+[0.573]*6+[0.425]*6+[0.167]*6+[0.42]*3, 'RT1970': [0.78]*24} priorvals = {'CA1992': [datetime.timedelta(hours=24)]*24, 'M2002': [datetime.timedelta(hours=12)]*24, 'RT1970': [datetime.timedelta(0)]*24} try: LThr = long(LT) except NameError: LThr = int(LT) prior = priorvals[model][LThr] A, B = parA[model][LThr], parB[model][LThr] st, en = ticks.UTC[0]-prior, ticks.UTC[-1] if omnivals is None: omdat = om.get_omni(spt.tickrange(st, en, 1.0/24.0), dbase='QDhourly') else: #now test for sanity of input try: assert isinstance(omnivals, dict) except: raise TypeError('Not a valid input type for omnivals, expected spacepy.datamodel.SpaceData') try: assert 'UTC' in omnivals assert 'Kp' in omnivals except: raise KeyError('Required data not found in input dict-like (omnivals)') omdat = omnivals einds, oinds = tb.tOverlap([st, en], omdat['UTC']) utc = np.array(omdat['UTC'])[oinds] Kp = np.array(omdat['Kp'])[oinds] Lpp = np.zeros(len(ticks)) if model == 'RT1970': power = 0.5 else: power = 1 for i, t1 in enumerate(ticks.UTC): t0 = t1-prior iprevday, dum = tb.tOverlap(utc, [t0, t1]) if iprevday: Kpmax = max(Kp[iprevday]) Lpp[i] = calcLpp(Kpmax, A, B, power=power) else: Lpp[i] = np.nan return Lpp
data=om.get_omni(ticks) import spacepy.seapy as se import spacepy.omni as om import spacepy.toolbox as tb import datetime as datetime import numpy as np epochs =se.readepochs('/Library/Python/2.7/site-packages/spacepy/data/SEA_epochs_OMNI.txt') st = datetime.datetime(2005,1,1) en = datetime.datetime(2009,1,1) einds,oinds = tb.tOverlap([st,en],data['UTC']) omni1hr = np.array(data['UTC'])[oinds] delta = datetime.timedelta(hours=1) window= datetime.timedelta(days=3) sevx = se.Sea(data['velo'][oinds],omni1hr, epochs, window, delta) # sevx = se.Sea(data['Pdyn'][oinds],omni1hr, epochs, window, delta) sevx.sea() sevx.plot(epochline=True,yquan='V$_{sw}$',xunits='days',yunits='Km s$^{-1}$')
"""Tests for the speed of tOverlap Copyright ©2010 Los Alamos National Security, LLC. """ import datetime import random import timeit from spacepy import toolbox n_iter = 500 #Very simple call to make sure everything loaded/init before timing dt_a = [datetime.datetime(2000, 1, 1), datetime.datetime(2000, 1, 2)] dt_b = [datetime.datetime(1999, 12, 31), datetime.datetime(2000, 1, 1)] toolbox.tOverlap(dt_a, dt_b, presort=False) toolbox.tOverlap(dt_a, dt_b, presort=True) dt1 = datetime.datetime(2000, 11, 12) dt_a = [dt1 + datetime.timedelta(hours=offset) for offset in range(10000)] dt_b = [dt1 + datetime.timedelta(hours=offset) for offset in range(-5000, 5000)] timing = timeit.timeit('toolbox.tOverlap(dt_a, dt_b)', 'from __main__ import toolbox, dt_a, dt_b', number=n_iter) print('Sorted arrays took ' + str(timing) + ' seconds.') timing = timeit.timeit('toolbox.tOverlap(dt_a, dt_b, presort=True)', 'from __main__ import toolbox, dt_a, dt_b', number=n_iter) print('Sorted arrays, sorted algorithm took ' + str(timing) + ' seconds.')