def test_add_errors(self): d = RockPyData(column_names=['A', 'B']) #d['A'].v = 1 # Attribute Error NoneType has no attribute, maybe initialize to np.nan? #d['B'] = 2 #d['A'].e = 4 #d['B'].e = 5 d = d.append_rows([1, 2]) #print d d.e = [[4, 5]] self.assertEqual(5., d['B'].e)
def setUp(self): # run before each test self.testdata = ((1, 2, 3, 4), (1, 6, 7, 8), (1, 2, 11, 12), (1, 6, 55, 66)) self.col_names = ('F', 'Mx', 'My', 'Mz') self.row_names = ('1.Zeile', '2.Zeile_A', '3.Zeile', '4.Zeile_A') self.units = ('T', 'mT', 'fT', 'pT') self.RPD = RockPyData(column_names=self.col_names, row_names=self.row_names, units=self.units, data=self.testdata)
def format_vsm(ftype_data, sobj_name=None): ''' Reading routine for thermal demagnetization curves measured with a VSM. ''' header = ftype_data.header segments = ftype_data.segment_data data = ftype_data.data mdata = OrderedDict() aux = np.array([j for i in data for j in i]) # combine all data arrays a = np.array([(i, v) for i, v in enumerate(np.diff(aux, axis=0)[:, 0])]) sign = np.sign(np.diff(aux, axis=0)[:, 1]) threshold = 3 zero_crossings = [i + 1 for i in range(len(a[:, 1]) - 1) if a[i, 1] > 0 > a[i + 1, 1] and a[i, 1] > 0 > a[i + 2, 1] or a[i, 1] < 0 < a[i + 1, 1] and a[i, 1] < 0 < a[i + 2, 1]] zero_crossings = [0] + zero_crossings # start with zero index zero_crossings += [len(aux)] # append last index ut = 0 # running number warming dt = 0 # running number cooling for i, v in enumerate(zero_crossings): if v < zero_crossings[-1]: # prevents index Error if sum(a[v:zero_crossings[i + 1], 1]) < 0: # cooling name = 'cooling%02i' % (ut) ut += 1 else: name = 'warming%02i' % (dt) dt += 1 data = aux[v:zero_crossings[i + 1] + 1] rpd = RockPyData(column_names=header, data=data) rpd.rename_column('temperature', 'temp') rpd.rename_column('moment', 'mag') mdata.update({name: rpd}) return mdata
def format_mpms(ftype_data, sobj_name=None): if ftype_data.name == sobj_name: temp_index = ftype_data.units.index('K') # see if it a cooling or a warming curve mean_temp_difference_between_steps = np.mean(np.diff(ftype_data.data[:, temp_index])) if mean_temp_difference_between_steps > 0: dtype = 'warming' else: dtype = 'cooling' mdata = RockPyData(column_names=ftype_data.header, data=ftype_data.data, units=ftype_data.units ) mdata.rename_column('Temperature', 'temp') mdata.rename_column('Long Moment', 'mag') data = {dtype: mdata} return data else: RockPy3.logger.error('SAMPLE name of file does not match specified sample_name. << {} != {} >>'.format(ftype_data.name, sobj_name))
def from_simulation(cls, sobj, idx=None, ms=250., bmax=0.5, E=0.005, G=0.3, steps=20, log_steps=False, noise=None, color=None, marker=None, linestyle=None): """ Simulates a backfield measurement based on a single log-normal gaussian distribution. E: Median destructive field - represents the mean value of the log-Gaussian distribution, and therefore, the logarithmic field value of the maximum gradient. G: G describes the standard deviation or half-width of the distribution. """ cls.clslog.info('CREATING simulation measurement with {}'.format( locals())) calculation = np.arange(0, 2, 1e-6) fields = np.round(np.linspace(1e-9, bmax, steps), 4) dist = lognorm([G], loc=E) calc_mag = dist.cdf(calculation) indices = [np.argmin(abs(v - calculation)) for v in fields] mag = [calc_mag[i] for i in indices] # mag /= 1/2 * max(mag) # mag -= 1 # mag *= ms # mag = G * (np.sqrt(np.pi) / 2) * (sp.special.erf((log_fields - E) / G) - sp.special.erf((-E) / G)) #leonhardt2004 # if noise: # n = np.random.normal(0, ms * (noise / 100), steps) # mag = mag + n mdata = cls.empty_mdata() mdata['remanence'] = RockPyData(column_names=['field', 'mag'], data=np.c_[fields - bmax, mag]) return cls(sobj, fpath=None, mdata=mdata, ftype='simulation', color=color, marker=marker, linestyle=linestyle, idx=idx)
def format_vftb(ftype_data, sobj_name=None): ''' formats the output from vftb to measurement.data :return: ''' data = ftype_data.data header = ftype_data.header mdata = {} mdata['data'] = RockPyData(column_names=header, data=data[0]) mdata['data']['mag'] = mdata['data']['mag'].v * ftype_data.mass mdata['data'].define_alias('variable', 'field') return mdata
def format_vsm(ftype_data, sobj_name=None): """ formats the vsm output to be compatible with irm acquisition measurements :return: """ data = ftype_data.data header = ftype_data.header # check if vsm file actually contains a dcd measurement if not ftype_data.info_header['include irm?']: return mdata = {} mdata['data'] = RockPyData(column_names=header, data=data[0]) mdata['data'].rename_column('remanence', 'mag') return mdata
def format_vftb(ftype_data, sobj_name=None): data = ftype_data.data units = ftype_data.units header = ftype_data.header mdata = OrderedDict(warming=None, cooling=None) if len(data) > 2: RockPy3.logger.warning( 'LENGTH of machine.out_thermocurve =! 2. Assuming data[0] = heating data[1] = cooling' ) if 3 > len(data) > 1: for idx, dtype in enumerate(('warming', 'cooling')): mdata[dtype] = RockPyData(column_names=header, data=data[idx], units=units) else: RockPy3.logger.error('LENGTH of machine.out_thermocurve < 2.') return mdata
def format_vsm(ftype_data, sobj_name=None): ''' formats the output from vsm to measurement.data :return: ''' idx = 0 data = ftype_data.data header = ftype_data.header # check if vsm file actually contains a dcd measurement if not ftype_data.info_header['include dcd?']: return else: if ftype_data.info_header['include irm?']: idx += 1 mdata = {} mdata['data'] = RockPyData(column_names=header, data=data[idx]) mdata['data'].rename_column('remanence', 'mag') return mdata
def format_vsm(ftype_data, sobj_name=None): ''' Reading routine for thermal demagnetization curves measured with a VSM. ''' header = ftype_data.header segments = ftype_data.segment_data data = ftype_data.data mdata = OrderedDict() aux = np.array([j for i in data for j in i]) # combine all data arrays a = np.array([(i, v) for i, v in enumerate(np.diff(aux, axis=0)[:, 0])]) sign = np.sign(np.diff(aux, axis=0)[:, 1]) threshold = 3 zero_crossings = [ i + 1 for i in range(len(a[:, 1]) - 1) if a[i, 1] > 0 > a[i + 1, 1] and a[i, 1] > 0 > a[i + 2, 1] or a[i, 1] < 0 < a[i + 1, 1] and a[i, 1] < 0 < a[i + 2, 1] ] zero_crossings = [0] + zero_crossings # start with zero index zero_crossings += [len(aux)] # append last index ut = 0 # running number warming dt = 0 # running number cooling for i, v in enumerate(zero_crossings): if v < zero_crossings[-1]: # prevents index Error if sum(a[v:zero_crossings[i + 1], 1]) < 0: # cooling name = 'cooling%02i' % (ut) ut += 1 else: name = 'warming%02i' % (dt) dt += 1 data = aux[v:zero_crossings[i + 1] + 1] rpd = RockPyData(column_names=header, data=data) rpd.rename_column('temperature', 'temp') rpd.rename_column('moment', 'mag') mdata.update({name: rpd}) return mdata
def format_mpms(ftype_data, sobj_name=None): if ftype_data.name == sobj_name: temp_index = ftype_data.units.index('K') # see if it a cooling or a warming curve mean_temp_difference_between_steps = np.mean( np.diff(ftype_data.data[:, temp_index])) if mean_temp_difference_between_steps > 0: dtype = 'warming' else: dtype = 'cooling' mdata = RockPyData(column_names=ftype_data.header, data=ftype_data.data, units=ftype_data.units) mdata.rename_column('Temperature', 'temp') mdata.rename_column('Long Moment', 'mag') data = {dtype: mdata} return data else: RockPy3.logger.error( 'SAMPLE name of file does not match specified sample_name. << {} != {} >>' .format(ftype_data.name, sobj_name))
class TestRockPyData(TestCase): def setUp(self): # run before each test self.testdata = ((1, 2, 3, 4), (1, 6, 7, 8), (1, 2, 11, 12), (1, 6, 55, 66)) self.col_names = ('F', 'Mx', 'My', 'Mz') self.row_names = ('1.Zeile', '2.Zeile_A', '3.Zeile', '4.Zeile_A') self.units = ('T', 'mT', 'fT', 'pT') self.RPD = RockPyData(column_names=self.col_names, row_names=self.row_names, units=self.units, data=self.testdata) def test_column_names(self): self.assertEqual(self.RPD.column_names, list(self.col_names)) def test_column_count(self): self.assertEqual(self.RPD.column_count, len(self.col_names)) def test__find_duplicate_variable_rows(self): # self.assertTrue((self.RPD._find_duplicate_variables()[0] == np.array([0, 1, 2])).all()) self.assertEqual(self.RPD._find_duplicate_variable_rows(), [(0, 1, 2, 3)]) # redefine variabe alias to the first two columns self.RPD.define_alias('variable', ('F', 'Mx')) self.assertEqual(self.RPD._find_duplicate_variable_rows(), [(0, 2), (1, 3)]) def test_rename_column(self): self.RPD.rename_column('Mx', 'M_x') self.assertEqual(self.RPD.column_names, ['F', 'M_x', 'My', 'Mz']) def test_append_rows(self): d1 = [[5, 6, 7, 8], [9, 10, 11, 12]] self.RPD = self.RPD.append_rows(d1, ('5.Zeile', '6.Zeile')) self.assertTrue(np.array_equal(self.RPD.v[-2:, :], np.array(d1))) d2 = [5, 6, 7, 8] self.RPD = self.RPD.append_rows(d2, '5.Zeile') self.assertTrue(np.array_equal(self.RPD.v[-1, :], np.array(d2))) # lets try with other RockPyData object rpd = copy.deepcopy(self.RPD) rpd.rename_column('Mx', 'M_x') self.RPD = self.RPD.append_rows(rpd) # TODO: add assert #print self.RPD def test_delete_rows(self): self.RPD = self.RPD.delete_rows((0, 2)) self.assertTrue( np.array_equal(self.RPD.v, np.array(self.testdata)[(1, 3), :])) def test_eliminate_duplicate_variable_rows(self): # check for one variable column self.RPD = self.RPD.eliminate_duplicate_variable_rows() self.assertTrue(np.array_equal(self.RPD.v, np.array([]).reshape(0, 4))) def test_eliminate_duplicate_variable_rows2(self): # check for two variable columns self.RPD.define_alias('variable', ('F', 'Mx')) rpd = self.RPD.eliminate_duplicate_variable_rows(substfunc='mean') self.assertTrue( np.array_equal(rpd.v, np.array([[1., 2., 7., 8.], [1., 6., 31., 37.]]))) self.assertTrue( np.array_equal(rpd.e, np.array([[0., 0., 4., 4.], [0., 0., 24., 29.]]))) rpd = self.RPD.eliminate_duplicate_variable_rows(substfunc='last') self.assertTrue( np.array_equal(rpd.v, np.array([[1., 2., 11., 12.], [1., 6., 55., 66.]]))) def test_mean(self): self.RPD = self.RPD.mean() self.assertTrue( np.array_equal(self.RPD.v, np.array([[1., 4., 19., 22.5]]))) np.testing.assert_allclose(self.RPD.e, np.array([[0., 2., 20.976, 25.273]]), atol=0.01) def test_max(self): self.RPD = self.RPD.max() self.assertTrue( np.array_equal(self.RPD.v, np.array([[1., 6., 55., 66.]]))) def test_filter_row_names(self): self.assertEqual( self.RPD.filter_row_names(('1.Zeile', '3.Zeile')).row_names, ['1.Zeile', '3.Zeile']) def test_filter_match_row_names(self): # get all rows ending with '_A' self.assertEqual( self.RPD.filter_match_row_names('.*_A').row_names, ['2.Zeile_A', '4.Zeile_A']) def test_append_columns_1(self): cb = self.RPD.column_count d = (8, 7, 6, 5) self.RPD = self.RPD.append_columns('neue Spalte', d) self.assertEqual(cb + 1, self.RPD.column_count) self.assertTrue(np.array_equal(self.RPD['neue Spalte'].v, np.array(d))) def test_append_columns_2(self): cb = self.RPD.column_count self.RPD = self.RPD.append_columns('leere Spalte') self.RPD['leere Spalte'] = (1, 2, 3, 4) self.assertEqual(cb + 1, self.RPD.column_count) self.assertTrue( np.array_equal(self.RPD['leere Spalte'].v, np.array((1, 2, 3, 4)))) def test_append_columns_3(self): cb = self.RPD.column_count self.RPD = self.RPD.append_columns('new col') self.RPD['new col'] = 7 self.assertEqual(cb + 1, self.RPD.column_count) self.assertTrue( np.array_equal(self.RPD['new col'].v, np.array((7, 7, 7, 7)))) def test_sort(self): self.assertTrue( np.array_equal( self.RPD.sort('Mx')['Mx'].v, np.array((2, 2, 6, 6)))) #def test_interpolate(self): # self.RPD.define_alias('variable', 'My') # iv = (1, 11, 33, 55, 100) # self.assertTrue(np.array_equal((self.RPD.interpolate(iv))['My'].v, np.array(iv))) # self.assertTrue(np.array_equal((self.RPD.interpolate(iv))['Mx'].v[1:-1], np.array([2., 4., 6.]))) def test_magnitude(self): self.RPD.define_alias('m', ('Mx', 'My', 'Mz')) self.RPD = self.RPD.append_columns('mag', self.RPD.magnitude('m')) np.testing.assert_allclose( self.RPD['mag'].v, np.array([5.38516481, 12.20655562, 16.40121947, 86.12200648]), atol=1e-5) def test_column_names_to_indices(self): self.assertEqual(self.RPD.column_names_to_indices(('Mx', 'Mz')), [1, 3]) def test_interation(self): # TODO: add proper assertion for l in self.RPD: #print l pass def test_add_errors(self): d = RockPyData(column_names=['A', 'B']) #d['A'].v = 1 # Attribute Error NoneType has no attribute, maybe initialize to np.nan? #d['B'] = 2 #d['A'].e = 4 #d['B'].e = 5 d = d.append_rows([1, 2]) #print d d.e = [[4, 5]] self.assertEqual(5., d['B'].e) def test_data_assignment(self): print(self.RPD) # set only values self.RPD['Mx'] = [1.1, 1.2, 1.3, 1.4] print(self.RPD) # set values and errors self.RPD['Mx'] = [[[1.1, 0.11]], [[1.2, 0.12]], [[1.3, 0.13]], [[1.4, 0.14]]] print(self.RPD) def test_define_delete_alias(self): self.RPD.define_alias('m', ('Mx', 'My', 'Mz')) self.assertTrue(self.RPD.alias_exists('m')) self.RPD.delete_alias('m') self.assertFalse(self.RPD.alias_exists('m')) def test_add_delete_columns(self): #print(self.RPD._column_dict) self.RPD.append_columns('empty') self.RPD.define_alias('variable', ('F', 'empty')) #print(self.RPD._column_dict) self.assertTrue(self.RPD.column_exists('empty')) #print(self.RPD) self.RPD.delete_columns('empty') #print(self.RPD._column_dict) self.assertFalse(self.RPD.column_exists('empty'))
class TestRockPyData(TestCase): def setUp(self): # run before each test self.testdata = ((1, 2, 3, 4), (1, 6, 7, 8), (1, 2, 11, 12), (1, 6, 55, 66)) self.col_names = ('F', 'Mx', 'My', 'Mz') self.row_names = ('1.Zeile', '2.Zeile_A', '3.Zeile', '4.Zeile_A') self.units = ('T', 'mT', 'fT', 'pT') self.RPD = RockPyData(column_names=self.col_names, row_names=self.row_names, units=self.units, data=self.testdata) def test_column_names(self): self.assertEqual(self.RPD.column_names, list(self.col_names)) def test_column_count(self): self.assertEqual(self.RPD.column_count, len(self.col_names)) def test__find_duplicate_variable_rows(self): # self.assertTrue((self.RPD._find_duplicate_variables()[0] == np.array([0, 1, 2])).all()) self.assertEqual(self.RPD._find_duplicate_variable_rows(), [(0, 1, 2, 3)]) # redefine variabe alias to the first two columns self.RPD.define_alias('variable', ('F', 'Mx')) self.assertEqual(self.RPD._find_duplicate_variable_rows(), [(0, 2), (1, 3)]) def test_rename_column(self): self.RPD.rename_column('Mx', 'M_x') self.assertEqual(self.RPD.column_names, ['F', 'M_x', 'My', 'Mz']) def test_append_rows(self): d1 = [[5, 6, 7, 8], [9, 10, 11, 12]] self.RPD = self.RPD.append_rows(d1, ('5.Zeile', '6.Zeile')) self.assertTrue(np.array_equal(self.RPD.v[-2:, :], np.array(d1))) d2 = [5, 6, 7, 8] self.RPD = self.RPD.append_rows(d2, '5.Zeile') self.assertTrue(np.array_equal(self.RPD.v[-1, :], np.array(d2))) # lets try with other RockPyData object rpd = copy.deepcopy(self.RPD) rpd.rename_column('Mx', 'M_x') self.RPD = self.RPD.append_rows(rpd) # TODO: add assert #print self.RPD def test_delete_rows(self): self.RPD = self.RPD.delete_rows((0, 2)) self.assertTrue(np.array_equal(self.RPD.v, np.array(self.testdata)[(1, 3), :])) def test_eliminate_duplicate_variable_rows(self): # check for one variable column self.RPD = self.RPD.eliminate_duplicate_variable_rows() self.assertTrue(np.array_equal(self.RPD.v, np.array([]).reshape(0, 4))) def test_eliminate_duplicate_variable_rows2(self): # check for two variable columns self.RPD.define_alias('variable', ('F', 'Mx')) rpd = self.RPD.eliminate_duplicate_variable_rows(substfunc='mean') self.assertTrue(np.array_equal(rpd.v, np.array([[1., 2., 7., 8.], [1., 6., 31., 37.]]))) self.assertTrue(np.array_equal(rpd.e, np.array([[0., 0., 4., 4.], [0., 0., 24., 29.]]))) rpd = self.RPD.eliminate_duplicate_variable_rows(substfunc='last') self.assertTrue(np.array_equal(rpd.v, np.array([[1., 2., 11., 12.], [1., 6., 55., 66.]]))) def test_mean(self): self.RPD = self.RPD.mean() self.assertTrue(np.array_equal(self.RPD.v, np.array([[1., 4., 19., 22.5]]))) np.testing.assert_allclose(self.RPD.e, np.array([[0., 2., 20.976, 25.273]]), atol=0.01) def test_max(self): self.RPD = self.RPD.max() self.assertTrue(np.array_equal(self.RPD.v, np.array([[1., 6., 55., 66.]]))) def test_filter_row_names(self): self.assertEqual(self.RPD.filter_row_names(('1.Zeile', '3.Zeile')).row_names, ['1.Zeile', '3.Zeile']) def test_filter_match_row_names(self): # get all rows ending with '_A' self.assertEqual(self.RPD.filter_match_row_names('.*_A').row_names, ['2.Zeile_A', '4.Zeile_A']) def test_append_columns_1(self): cb = self.RPD.column_count d = (8, 7, 6, 5) self.RPD = self.RPD.append_columns('neue Spalte', d) self.assertEqual(cb + 1, self.RPD.column_count) self.assertTrue(np.array_equal(self.RPD['neue Spalte'].v, np.array(d))) def test_append_columns_2(self): cb = self.RPD.column_count self.RPD = self.RPD.append_columns('leere Spalte') self.RPD['leere Spalte'] = (1,2,3,4) self.assertEqual(cb + 1, self.RPD.column_count) self.assertTrue(np.array_equal(self.RPD['leere Spalte'].v, np.array((1,2,3,4)))) def test_append_columns_3(self): cb = self.RPD.column_count self.RPD = self.RPD.append_columns('new col') self.RPD['new col'] = 7 self.assertEqual(cb + 1, self.RPD.column_count) self.assertTrue(np.array_equal(self.RPD['new col'].v, np.array((7,7,7,7)))) def test_sort(self): self.assertTrue(np.array_equal(self.RPD.sort('Mx')['Mx'].v, np.array((2, 2, 6, 6)))) #def test_interpolate(self): # self.RPD.define_alias('variable', 'My') # iv = (1, 11, 33, 55, 100) # self.assertTrue(np.array_equal((self.RPD.interpolate(iv))['My'].v, np.array(iv))) # self.assertTrue(np.array_equal((self.RPD.interpolate(iv))['Mx'].v[1:-1], np.array([2., 4., 6.]))) def test_magnitude(self): self.RPD.define_alias('m', ('Mx', 'My', 'Mz')) self.RPD = self.RPD.append_columns('mag', self.RPD.magnitude('m')) np.testing.assert_allclose(self.RPD['mag'].v, np.array([5.38516481, 12.20655562, 16.40121947, 86.12200648]), atol=1e-5) def test_column_names_to_indices(self): self.assertEqual( self.RPD.column_names_to_indices(('Mx', 'Mz')), [1,3]) def test_interation(self): # TODO: add proper assertion for l in self.RPD: #print l pass def test_add_errors(self): d = RockPyData(column_names=['A', 'B']) #d['A'].v = 1 # Attribute Error NoneType has no attribute, maybe initialize to np.nan? #d['B'] = 2 #d['A'].e = 4 #d['B'].e = 5 d = d.append_rows([1, 2]) #print d d.e = [[4, 5]] self.assertEqual(5., d['B'].e) def test_data_assignment(self): print(self.RPD) # set only values self.RPD['Mx'] = [1.1, 1.2, 1.3, 1.4] print(self.RPD) # set values and errors self.RPD['Mx'] = [[[1.1, 0.11]], [[1.2, 0.12]], [[1.3, 0.13]], [[1.4, 0.14]]] print(self.RPD) def test_define_delete_alias(self): self.RPD.define_alias('m', ('Mx', 'My', 'Mz')) self.assertTrue(self.RPD.alias_exists('m')) self.RPD.delete_alias('m') self.assertFalse(self.RPD.alias_exists('m')) def test_add_delete_columns(self): #print(self.RPD._column_dict) self.RPD.append_columns('empty') self.RPD.define_alias('variable', ('F', 'empty')) #print(self.RPD._column_dict) self.assertTrue(self.RPD.column_exists('empty')) #print(self.RPD) self.RPD.delete_columns('empty') #print(self.RPD._column_dict) self.assertFalse(self.RPD.column_exists('empty'))