def test_z_error2r_phi_error(self): # relative error in resistivity is 2 * relative error in z res_rel_err_test = 2. * self.z_err / np.abs(self.z) phase_err_test = np.rad2deg(np.arctan(self.z_err / np.abs(self.z))) phase_err_test[res_rel_err_test > 1.] = 90. # test providing an array res_rel_err, phase_err = z_error2r_phi_error(self.z.real, self.z.imag, self.z_err) self.assertTrue( np.all( np.abs(res_rel_err - res_rel_err_test) / res_rel_err_test < 1e-8)) self.assertTrue( np.all(np.abs(phase_err - phase_err_test) / phase_err_test < 1e-8)) # test providing a single value res_rel_err, phase_err = z_error2r_phi_error(self.z.real[0, 0, 1], self.z.imag[0, 0, 1], self.z_err[0, 0, 1]) self.assertTrue( np.all( np.abs(res_rel_err - res_rel_err_test[0, 0, 1]) / res_rel_err_test[0, 0, 1] < 1e-8)) self.assertTrue( np.all( np.abs(phase_err - phase_err_test[0, 0, 1]) / phase_err_test[0, 0, 1] < 1e-8))
def _compute_res_phase(z, z_err, freq): """ calculates *resistivity*, *phase*, *resistivity_err*, *phase_err* values for resistivity are in in Ohm m and phase in degrees. """ resistivity_err = np.zeros_like(z_err) phase_err = np.zeros_like(z_err) resistivity = np.zeros_like(z, dtype='float') phase = np.zeros_like(z, dtype='float') # calculate resistivity and phase for idx_f in range(len(z)): for i in range(2): for j in range(2): resistivity[idx_f, i, j] = np.abs(z[idx_f, i, j])**2 /\ freq[idx_f] * 0.2 phase[idx_f, i, j] = math.degrees(cmath.phase(z[idx_f, i, j])) if z_err is not None: r_err, phi_err = MTcc.z_error2r_phi_error( np.real(z[idx_f, i, j]), z_err[idx_f, i, j], np.imag(z[idx_f, i, j]), z_err[idx_f, i, j]) resistivity_err[idx_f, i, j] = \ 0.4 * np.abs(z[idx_f, i, j]) /\ freq[idx_f] * r_err phase_err[idx_f, i, j] = phi_err return resistivity, resistivity_err, phase, phase_err
def _compute_res_phase(z, z_err, freq): """ calculates *resistivity*, *phase*, *resistivity_err*, *phase_err* values for resistivity are in in Ohm m and phase in degrees. """ resistivity_err = np.zeros_like(z_err) phase_err = np.zeros_like(z_err) resistivity = np.zeros_like(z, dtype="float") phase = np.zeros_like(z, dtype="float") # calculate resistivity and phase for idx_f in range(len(z)): for i in range(2): for j in range(2): resistivity[idx_f, i, j] = np.abs(z[idx_f, i, j]) ** 2 / freq[idx_f] * 0.2 phase[idx_f, i, j] = math.degrees(cmath.phase(z[idx_f, i, j])) if z_err is not None: r_err, phi_err = MTcc.z_error2r_phi_error( np.real(z[idx_f, i, j]), z_err[idx_f, i, j], np.imag(z[idx_f, i, j]), z_err[idx_f, i, j] ) resistivity_err[idx_f, i, j] = 0.4 * np.abs(z[idx_f, i, j]) / freq[idx_f] * r_err phase_err[idx_f, i, j] = phi_err return resistivity, resistivity_err, phase, phase_err
def read_datafile(self): """ read data file into the data object. calculate resistivity and phase """ if self.datafile is None: default_files = [ 'ai1dat.dat', 'ai1mod.dat', 'ai1fit.dat', 'inmodel.dat', 'inregulm.dat' ] dlst = [ i for i in os.listdir(self.working_directory) if (i[-4:] == '.dat') and (i not in default_files) ] if len(dlst) == 1: self.datafile = dlst[0] else: print("please define datafile") return # define path to file datafpath = os.path.join(self.working_directory, self.datafile) self.mode = open(datafpath).readline().strip().split()[0] data = np.loadtxt(datafpath, skiprows=2) self.freq = 1. / data[:, 0] if self.mode == 'I': zr = np.vstack( [data[:, i] for i in range(len(data[0])) if (i - 1) % 4 == 0]) ze = np.vstack( [data[:, i] for i in range(len(data[0])) if (i - 2) % 4 == 0]) zi = -np.vstack( [data[:, i] for i in range(len(data[0])) if (i - 3) % 4 == 0]) z = zr + 1j * zi self.z = z.T.reshape(len(z[0]), 2, 2) self.z_err = ze.T.reshape(len(z[0]), 2, 2) # make a frequency array that has the same shape as z freq2 = np.zeros(np.shape(self.z)) for i in range(len(freq2)): freq2[i, :, :] = 1. / data[:, 0][i] # calculate resistivity self.resistivity = 0.2 * np.abs(self.z)**2 / freq2 q = np.zeros(np.shape(self.resistivity)) # q[(zr<0)&(zi<0)] = np.pi # q[(zr<0)&(zi>0)] = -np.pi phase = np.zeros([len(self.z), 2, 2]) res = np.zeros([len(self.z), 2, 2]) self.resistivity_err = np.zeros([len(self.z), 2, 2]) self.phase_err = np.zeros([len(self.z), 2, 2]) self.q = q for iz in range(len(self.z)): for i in range(2): for j in range(2): phase[iz, i, j] = np.rad2deg(cmath.phase(self.z[iz, i, j])) res[iz, i, j] = 0.2 * \ np.abs(self.z[iz, i, j])**2 / self.freq[iz] r_err, phi_err = MTcc.z_error2r_phi_error( np.real(self.z[iz, i, j]), self.z_err[iz, i, j], np.imag(self.z[iz, i, j]), self.z_err[iz, i, j]) self.resistivity_err[iz, i, j] = \ 0.4 * np.abs(self.z[iz, i, j]) /\ self.freq[iz] * r_err self.phase_err[iz, i, j] = phi_err phase[phase < -180] += 360 self.phase = phase self.resistivity = res elif self.mode == 'R': res = np.vstack( [data[:, i] for i in range(len(data[0])) if (i - 1) % 4 == 0]) self.resistivity = res.T.reshape(len(res[0]), 2, 2) res_err = np.vstack( [data[:, i] for i in range(len(data[0])) if (i - 2) % 4 == 0]) self.resistivity_err = res_err.T.reshape(len(res_err[0]), 2, 2) phs = np.vstack( [data[:, i] for i in range(len(data[0])) if (i - 3) % 4 == 0]) self.phase = phs.T.reshape(len(phs[0]), 2, 2) phs_err = np.vstack( [data[:, i] for i in range(len(data[0])) if (i - 4) % 4 == 0]) self.phase_err = phs_err.T.reshape(len(phs_err[0]), 2, 2)
def read_datafile(self): """ read data file into the data object. calculate resistivity and phase """ if self.datafile is None: default_files = ["ai1dat.dat", "ai1mod.dat", "ai1fit.dat", "inmodel.dat", "inregulm.dat"] dlst = [i for i in os.listdir(self.working_directory) if (i[-4:] == ".dat") and (i not in default_files)] if len(dlst) == 1: self.datafile = dlst[0] else: print "please define datafile" return # define path to file datafpath = os.path.join(self.working_directory, self.datafile) self.mode = open(datafpath).readline().strip().split()[0] data = np.loadtxt(datafpath, skiprows=2) self.freq = 1.0 / data[:, 0] if self.mode == "I": zr = np.vstack([data[:, i] for i in range(len(data[0])) if (i - 1) % 4 == 0]) ze = np.vstack([data[:, i] for i in range(len(data[0])) if (i - 2) % 4 == 0]) zi = -np.vstack([data[:, i] for i in range(len(data[0])) if (i - 3) % 4 == 0]) z = zr + 1j * zi self.z = z.T.reshape(len(z[0]), 2, 2) self.z_err = ze.T.reshape(len(z[0]), 2, 2) # make a frequency array that has the same shape as z freq2 = np.zeros(np.shape(self.z)) for i in range(len(freq2)): freq2[i, :, :] = 1.0 / data[:, 0][i] # calculate resistivity self.resistivity = 0.2 * np.abs(self.z) ** 2 / freq2 q = np.zeros(np.shape(self.resistivity)) # q[(zr<0)&(zi<0)] = np.pi # q[(zr<0)&(zi>0)] = -np.pi phase = np.zeros([len(self.z), 2, 2]) res = np.zeros([len(self.z), 2, 2]) self.resistivity_err = np.zeros([len(self.z), 2, 2]) self.phase_err = np.zeros([len(self.z), 2, 2]) self.q = q for iz in range(len(self.z)): for i in range(2): for j in range(2): phase[iz, i, j] = np.rad2deg(cmath.phase(self.z[iz, i, j])) res[iz, i, j] = 0.2 * np.abs(self.z[iz, i, j]) ** 2 / self.freq[iz] r_err, phi_err = MTcc.z_error2r_phi_error( np.real(self.z[iz, i, j]), self.z_err[iz, i, j], np.imag(self.z[iz, i, j]), self.z_err[iz, i, j], ) self.resistivity_err[iz, i, j] = 0.4 * np.abs(self.z[iz, i, j]) / self.freq[iz] * r_err self.phase_err[iz, i, j] = phi_err phase[phase < -180] += 360 self.phase = phase self.resistivity = res elif self.mode == "R": res = np.vstack([data[:, i] for i in range(len(data[0])) if (i - 1) % 4 == 0]) self.resistivity = res.T.reshape(len(res[0]), 2, 2) res_err = np.vstack([data[:, i] for i in range(len(data[0])) if (i - 2) % 4 == 0]) self.resistivity_err = res_err.T.reshape(len(res_err[0]), 2, 2) phs = np.vstack([data[:, i] for i in range(len(data[0])) if (i - 3) % 4 == 0]) self.phase = phs.T.reshape(len(phs[0]), 2, 2) phs_err = np.vstack([data[:, i] for i in range(len(data[0])) if (i - 4) % 4 == 0]) self.phase_err = phs_err.T.reshape(len(phs_err[0]), 2, 2)