def recoil_params(self, plot=False): ''' Calculate recoil parameters, SFD, iSFD, eSFD,... add them to instance as attributes ''' result = copy.copy(self) # Split recoil into return loops as used by hystools.recoil Hsplit, Msplit = [], [] for h, m in zip(self.H, self.M): try: [h1, h2], [m1, m2] = hys.split(h, m) if len(h2) > 0.8*len(h1): # don't append loops that haven't returned at least 80% # Cut out first 10 points, where drift is happening Hsplit.append(h2[10:]) Msplit.append(m2[10:]) except: # split failed, probably incomplete loop. pass rec_params = hys.recoil(Hsplit, Msplit, startdef=1) paramstosave = ['SFD', 'iSFD', 'eSFD', 'H_zminor', 'M_zminor'] # map to these attribute names maptoattrib = ['SFD', 'iSFD', 'eSFD', 'H_zminor', 'M_zminor'] for p, m in zip(paramstosave, maptoattrib): setattr(result, m, rec_params[p]) if self.verbose: paramstoprint = ['SFD', 'iSFD', 'eSFD'] unitstoprint = ['Oe', 'Oe', 'Oe'] for param, unit in zip(paramstoprint, unitstoprint): print(param.ljust(4) + ': {:.2f} {}'.format(rec_params[param], unit)) if plot: # make summary plot #plt.figure() ishold = plt.ishold() plt.plot(self.H[0], self.M[0]) plt.hold(True) for h, m in zip(Hsplit[1:], Msplit[1:]): plt.plot(h, m) plt.plot(rec_params['H_zminor'], rec_params['M_zminor'], color='black', linewidth=3) plt.scatter(*zip(*rec_params['plotpts']), c='g', s=30, zorder=3) plt.grid(True) plt.xlabel('Field (Oe)') plt.ylabel('M (uemu)') plt.title(os.path.split(self.filepath)[1]) plt.hold(ishold) return result
def importdata(self, filepath, split=True, **kwargs): # Read header and locate start of data global bgfilepath header = [] with open(filepath, 'r') as f: # Name the enumerator, so it can be used after breaking from loop fenum = enumerate(f) for num, line in fenum: if line == '[Data]\n': skip = num + 2 break else: header.append(line) #colnames = fenum.next()[1].split(',') # Just import Temp, H and M from col 2, 3, and 4 try: T, H, M = np.genfromtxt(filepath, skip_header=skip, delimiter=',', unpack=True, usecols=(2,3,4)) # drop nan nan = np.isnan(M) M = M[~nan] H = H[~nan] T = T[~nan] except: # Data is invalid, or empty self.H = [] self.M = [] self.T = [] self.filepath = filepath print('Failed to load data from ' + filepath) self.log = 'Failed to load data.\n' return # Get sample area from header try: area = float(header[10].split(',')[1][:5]) except: area = None if not filepath == bgfilepath and self.verbose: print('Area could not be found in file header.') # convert to uemu M = M * 1000000 if split: # split h and m into segments Hsplit, Msplit = hys.split(H, M, shortest=20) # split T too, but hys.split sucks Hsplit, Tsplit = hys.split(H, T, shortest=20) # Remove first and last few points for i in range(len(Hsplit)): Hsplit[i] = Hsplit[i][2:-2] Msplit[i] = Msplit[i][2:-2] Tsplit[i] = Tsplit[i][2:-2] # put the segments back together in groups of two to form loops Hloops = [] Mloops = [] Tloops = [] for j in range(0, len(Hsplit), 2): try: Hloops.append(np.append(Hsplit[j], Hsplit[j+1])) Mloops.append(np.append(Msplit[j], Msplit[j+1])) Tloops.append(np.append(Tsplit[j], Tsplit[j+1])) except: Hloops.append(Hsplit[j]) Mloops.append(Msplit[j]) Tloops.append(Tsplit[j]) self.M = Mloops self.H = Hloops self.T = Tloops else: # Leave M, H, T unsplit, list with len 1 self.M = [M] self.H = [H] self.T = [T] self.filepath = filepath self.area = area self._thickness = None self.header = header self.log = '{}: PyPPMS version {}\n'.format(_importtime, _version) self.log += '{}: Data imported from {}\n'.format(_now(), filepath) if not filepath == bgfilepath: print('Imported {} loops from {}'.format(len(self.H), os.path.split(filepath)[1]))