def __init__(self,files,data=None,q_name=None): self.lines = [] #Create the list of lineobjects from file names given. If not given iterable it is assumed to be a single file. #Can also pass list of lineobjects if isinstance(files,tuple): for ele in files: self.lines.append(fc.read_cross(ele)) elif isinstance(files,str): self.lines.append(fc.read_cross(files)) else: for ele in files: self.lines.append(ele) self.data = data #Initialize the plot self.fig = plt.figure() self.ax = self.fig.add_subplot(111)
def elastic_chi(val,fresco,data,pot,term,var): for i,j in zip(var,val): fresco.change_pot(pot,term,i,str(j)) #Change potentials fresco.update_all() fresco.write('new_input') fc.filerun('new_input') cross = fc.read_cross('fort.201') spline = cross_interpolate(cross) theory = interpolate.splev(data.theta,spline) exper = data.sigma err = data.errx #Might need to consider aysmmetric data in future. Keep eye out. chi_list = map(chi_sq,theory,exper,err) return .5*np.sum(chi_list)
def __init__(self,fresco,data,pot,term,var,percent_range=.2): #user selects what range they want to vary potentials within defualts to 20% self.fresco = fc.FrescoInput(fresco) self.data = fc.read_data(data) self.f_args = (self.fresco,self.data,pot,term,var) #tuple of arguments to be passed to chi square function self.x0 = [] #inital potential parameters for ele in self.f_args[4]: for line in self.fresco.sorted_pots[self.f_args[2]][self.f_args[3]]:#Just in case potential has two lines if ele in line: init = self.fresco.find_value(ele,line,'=') self.x0.append(float(init)) self.x0 = np.asarray(self.x0) self.init_chi = elastic_chi(self.x0,*self.f_args) #get inital chi square value print "The initial chi squared value is ",self.init_chi self.init_cs = fc.read_cross('fort.201') #the inital cross section data self.iterations = 0 #number of basin hops completed self.bounds = self.set_bounds(percent_range) #range we are allowed to jump around in. We will still sample, but auto rejected outside this range #These are default parameters that can be set with set_basin self.T = 1.0 self.steps = 50 self.step_size = .1
def plot(self): new_cs = fc.read_cross('fort.201') #the cross section for the fitted data plot = fp.CrossSectionPlot([self.init_cs,new_cs],self.data) #create the plot with new_cs vs init_cs vs the data plot.ax.set_title('Best Fit') plot.plot()