def norm_group(pos, _, **kargs): """Takes the drain current for each file in group and builds an analysis file and works out the mean drain""" if "signal" in kargs: signal = kargs["signal"] else: signal = "fluo" lfit = kargs["lfit"] rfit = kargs["rfit"] posfile = Data() posfile.metadata = pos[0].metadata posfile = posfile & pos[0].column(0) posfile.column_headers = ["Energy"] for f in pos: print(str(f["run"]) + str(f.find_col(signal))) posfile = posfile & f.column(signal) posfile.add_column(lambda r: np.mean(r[1:]), "mean drain") ec = posfile.find_col("Energy") md = posfile.find_col("mean drain") linearfit = scipy.poly1d( posfile.polyfit(ec, md, 1, lambda x, y: lfit[0] <= x <= lfit[1])) posfile.add_column(lambda r: r[md] - linearfit(r[ec]), "minus linear") highend = posfile.mean("minus", lambda r: rfit[0] <= r[ec] <= rfit[1]) ml = posfile.find_col("minus linear") posfile.add_column(lambda r: r[ml] / highend, "normalised") if "group_key" in kargs: posfile[kargs["group_key"]] = pos.key return posfile
def norm_group(pos,_,**kargs): """Takes the drain current for each file in group and builds an analysis file and works out the mean drain""" if "signal" in kargs: signal=kargs["signal"] else: signal="fluo" lfit=kargs["lfit"] rfit=kargs["rfit"] posfile=Data() posfile.metadata=pos[0].metadata posfile=posfile&pos[0].column(0) posfile.column_headers=['Energy'] for f in pos: print(str(f["run"])+str(f.find_col(signal))) posfile=posfile&f.column(signal) posfile.add_column(lambda r:np.mean(r[1:]),"mean drain") ec=posfile.find_col('Energy') md=posfile.find_col('mean drain') linearfit=scipy.poly1d(posfile.polyfit(ec,md,1,lambda x,y:lfit[0]<=x<=lfit[1])) posfile.add_column(lambda r:r[md]-linearfit(r[ec]),'minus linear') highend=posfile.mean('minus',lambda r:rfit[0]<=r[ec]<=rfit[1]) ml=posfile.find_col('minus linear') posfile.add_column(lambda r:r[ml]/highend,"normalised") if "group_key" in kargs: posfile[kargs["group_key"]]=pos.key return posfile
def LoadData(self, data_item_number, filename): """LoadData(self, data_item_number, filename) --> none Loads the data from filename into the data_item_number. """ try: datafile = Data(str(filename), debug=True) # does all the hard work here except Exception as e: ShowWarningDialog( self.parent, "Could not load the file: " + filename + " \nPlease check the format.\n\n Stoner.Data" + " gave the following error:\n" + str(e), ) else: # For the freak case of only one data point try: if datafile.setas.cols["axes"] == 0: self.x_col = datafile.find_col(self.x_col) self.y_col = datafile.find_col(self.y_col) self.e_col = datafile.find_col(self.e_col) datafile.etsas(x=self.x_col, y=self.y_col, e=self.e_col) else: self.x_col = datafile.setas.cols["xcol"] self.y_col = datafile.setas.cols["ycol"][0] if len(datafile.setas.cols["yerr"]) > 0: self.e_col = datafile.setas.cols["yerr"][0] else: datafile.add_column(np.ones(len(datafile))) datafile.setas[-1] = "e" except Exception as e: ShowWarningDialog( self.parent, "The data file does not contain" + "all the columns specified in the opions\n" + e.message, ) # Okay now we have showed a dialog lets bail out ... return # The data is set by the default Template.__init__ function, neat hu # Know the loaded data goes into *_raw so that they are not # changed by the transforms datafile.y = np.where(datafile.y == 0.0, 1e-8, datafile.y) self.data[data_item_number].x_raw = datafile.x self.data[data_item_number].y_raw = datafile.y self.data[data_item_number].error_raw = datafile.e # Run the commands on the data - this also sets the x,y, error memebers # of that data item. self.data[data_item_number].run_command() # Send an update that new data has been loaded self.SendUpdateDataEvent()
def LoadData(self, data_item_number, filename): """LoadData(self, data_item_number, filename) --> none Loads the data from filename into the data_item_number. """ try: datafile=Data(str(filename),debug=True) # does all the hard work here except Exception as e: ShowWarningDialog(self.parent, 'Could not load the file: ' +\ filename + ' \nPlease check the format.\n\n Stoner.Data'\ + ' gave the following error:\n' + str(e)) else: # For the freak case of only one data point try: if datafile.setas.cols["axes"]==0: self.x_col=datafile.find_col(self.x_col) self.y_col=datafile.find_col(self.y_col) self.e_col=datafile.find_col(self.e_col) datafile.etsas(x=self.x_col,y=self.y_col,e=self.e_col) else: self.x_col=datafile.setas.cols["xcol"] self.y_col=datafile.setas.cols["ycol"][0] if len(datafile.setas.cols["yerr"])>0: self.e_col=datafile.setas.cols["yerr"][0] else: datafile.add_column(np.ones(len(datafile))) datafile.setas[-1]="e" except Exception as e: ShowWarningDialog(self.parent, 'The data file does not contain'\ + 'all the columns specified in the opions\n'+e.message) # Okay now we have showed a dialog lets bail out ... return # The data is set by the default Template.__init__ function, neat hu # Know the loaded data goes into *_raw so that they are not # changed by the transforms datafile.y=np.where(datafile.y==0.0,1E-8,datafile.y) self.data[data_item_number].x_raw = datafile.x self.data[data_item_number].y_raw = datafile.y self.data[data_item_number].error_raw = datafile.e # Run the commands on the data - this also sets the x,y, error memebers # of that data item. self.data[data_item_number].run_command() # Send an update that new data has been loaded self.SendUpdateDataEvent()
# This has proved most succesful for me looking at some MdV data. # We then threshold for zero crossing of the derivative # And check the second derivative to see whether we like the peak as signficant. This is the significance parameter # and seems to be largely empirical # Finally we interpolate back to the complete data set to make sure we get the angle as well as the counts. d.lmfit(ExponentialModel,result=True,replace=False,header="Envelope") d.subtract("Counts","Envelope",replace=False,header="peaks") d.setas="xy" sys.exit() t=Data(d.interpolate(d.peaks(significance=sensitivity,width=8,poly=4))) t.column_headers=copy(d.column_headers) d%='peaks' t%='peaks' d.setas="xy" d.labels[d.find_col('Angle')]=r"Reflection Angle $\theta$" t.del_rows(0, lambda x,y: x<critical_edge) t.setas="xy" t.template.fig_width=7.0 t.template.fig_height=5.0 t.plot(fmt='go', plotter=pyplot.semilogy) main_fig=d.plot(figure=t.fig, plotter=pyplot.semilogy) d.show() #Now convert the angle to sin^2 t.apply(lambda x: np.sin(np.radians(x[0]/2.0))**2, 0,header=r"$sin^2\theta$") # Now create the m^2 order m=np.arange(len(t))+fringe_offset m=m**2 #And add it to t t.add_column(m, column_header='$m^2$') #Now we can it a straight line
# This has proved most succesful for me looking at some MdV data. # We then threshold for zero crossing of the derivative # And check the second derivative to see whether we like the peak as signficant. This is the significance parameter # and seems to be largely empirical # Finally we interpolate back to the complete data set to make sure we get the angle as well as the counts. d.lmfit(ExponentialModel, result=True, replace=False, header="Envelope") d.subtract("Counts", "Envelope", replace=False, header="peaks") d.setas = "xy" sys.exit() t = Data(d.interpolate(d.peaks(significance=sensitivity, width=8, poly=4))) t.column_headers = copy(d.column_headers) d %= "peaks" t %= "peaks" d.setas = "xy" d.labels[d.find_col("Angle")] = r"Reflection Angle $\theta$" t.del_rows(0, lambda x, y: x < critical_edge) t.setas = "xy" t.template.fig_width = 7.0 t.template.fig_height = 5.0 t.plot(fmt="go", plotter=pyplot.semilogy) main_fig = d.plot(figure=t.fig, plotter=pyplot.semilogy) d.show() # Now convert the angle to sin^2 t.apply(lambda x: np.sin(np.radians(x[0] / 2.0)) ** 2, 0, header=r"$sin^2\theta$") # Now create the m^2 order m = np.arange(len(t)) + fringe_offset m = m ** 2 # And add it to t t.add_column(m, column_header="$m^2$") # Now we can it a straight line
# We differentiate the data using a Savitsky-Golay filter with a 5 point window fitting quartics. # This has proved most succesful for me looking at some MdV data. # We then threshold for zero crossing of the derivative # And check the second derivative to see whether we like the peak as signficant. This is the significance parameter # and seems to be largely empirical # Finally we interpolate back to the complete data set to make sure we get the angle as well as the counts. d.lmfit(ExponentialModel, result=True, replace=False, header="Envelope") d.subtract("Counts", "Envelope", replace=False, header="peaks") d %= "Envelope" t = Data(d.interpolate(d.peaks(significance=sensitivity, width=8, poly=4))) t.column_headers = copy(d.column_headers) d %= 'peaks' t %= 'peaks' d.setas = "xy" d.labels[d.find_col('Angle')] = r"Reflection Angle $\theta$" t.del_rows(0, lambda x, y: x < critical_edge) t.setas = "xy" t.template.fig_width = 7.0 t.template.fig_height = 5.0 t.plot(fmt='go', plotter=pyplot.semilogy) main_fig = d.plot(figure=t.fig, plotter=pyplot.semilogy) d.show() #Now convert the angle to sin^2 t.apply(lambda x: np.sin(np.radians(x[0] / 2.0))**2, 0, header=r"$sin^2\theta$") # Now create the m^2 order m = np.arange(len(t)) + fringe_offset m = m**2 #And add it to t
while True: try: return int(input(message)) except ValueError: print("Please select a column number") continue # Load a datafile d = Data(False) t_pat = [re.compile(r"^[Tt][\s\(]"), re.compile(r"[Tt]emp")] r_pat = [re.compile(r"[Rr]ho"), re.compile(r"[Rr]es")] for pat in t_pat: t_col = d.find_col(pat, force_list=True) if len(t_col) == 1: t_col = t_col[0] break else: t_col = select_col(d, "Select column for temperature data :") for pat in r_pat: r_col = d.find_col(pat, force_list=True) if len(r_col) == 1: r_col = r_col[0] break else: r_col = select_col(d, "Select column for resistance data :") rho0 = d.min(r_col)[0]