Use of Hold in DoNewGlobalFit

I've included the full code in case anyone wants to utilize it...it's a bit long, but it should be straightforward for anyone familiar with the DoNewGlobalFit functionality.

This function is not utilizing the hold functionality like I thought...when I use print getdimlabel(coefwave,1,-1), though, it returns Hold. The fit functions are included at the bottom. They might have a typo...I was trying to use hold to test them.



function ngf(base0,base1,templist,cfstr0,cfvar0,cfstr1,cfvar1,cfstr2,cfvar2,cfstr3,cfvar3,cfstr4,cfvar4)

// base0 and base1 are the basenames of the two data sets (without temperature)

string base0, base1, templist
string cfstr0
variable cfvar0
string cfstr1
variable cfvar1
string cfstr2
variable cfvar2
string cfstr3
variable cfvar3
string cfstr4
variable cfvar4

variable i, numdatapts

// name of data
	make/o/n=(2,2)/t datasets
	DataSets[0][0]=base0+"_"+stringfromlist(i,templist)
	DataSets[1][0]=base1+"_"+stringfromlist(i,templist)
	DataSets[0][1]="_calculated_"
	DataSets[1][1]="_calculated_"
	
// extract number of points in data wave	
wave sampledataset = $datasets[0][0]
numdatapts = numpnts(sampledataset)

// format: [row][column]
// a row for each data set
// # columns: (max # of coefficients used by any fit functions) + 4
	make/o/n=(2,8) CoefDataSetLinkage
	
	
// fit functions
	make/o/t/n=2 fitfuncnames
	fitfuncnames[0]="sigma1ff"
	fitfuncnames[1]="eps1ff"
	
// column 0: contains index in the fitfuncnames where the name of a fitting function will be found
	CoefDataSetLinkage[0][0]=0
// column 1: point # within concatenated data set where this data set begins 	
	CoefDataSetLinkage[0][1]=0
// column 2: point # where a given data set ends (this number is not used...)	
	CoefDataSetLinkage[0][2]=numdatapts-1
// column 3: how many fit coefficents are used by the fit function for the corresponding data set
	CoefDataSetLinkage[0][3]=4
// column 4: index to the master coefficient wave 	
	CoefDataSetLinkage[0][4]=0
	CoefDataSetLinkage[0][5]=1
	CoefDataSetLinkage[0][6]=2
	CoefDataSetLinkage[0][7]=3
	
// column 0: contains index in the fitfuncnames where the name of a fitting function will be found
	CoefDataSetLinkage[1][0]=0
// column 1: point # within concatenated data set where this data set begins 	
	CoefDataSetLinkage[1][1]=numdatapts
// column 2: point # where a given data set ends (this number is not used...)	
	CoefDataSetLinkage[1][2]=2*numdatapts-1
// column 3: how many fit coefficents are used by the fit function for the corresponding data set
	CoefDataSetLinkage[1][3]=4
// column 4: index to the master coefficient wave 	
	CoefDataSetLinkage[1][4]=4
	CoefDataSetLinkage[1][5]=1
	CoefDataSetLinkage[1][6]=2
	CoefDataSetLinkage[1][7]=3


// coefwave contains initial guesses
// inidices established in coefdatasetlinkage are repeated here
// i.e. the length of coefwave will be the total number of variables, not just the number
// used by any particular fit function
	make/o/n=(5,2) coefwave
	setdimlabel 1, -1, Hold, coefwave
	coefwave[0][0]=cfvar0
	coefwave[1][0]=cfvar1
	coefwave[2][0]=cfvar2
	coefwave[3][0]=cfvar3
	coefwave[4][0]=cfvar4
// set coefwave[n][1]=0 to not hold n, 1 to hold n	
	coefwave[][1]=1
	

	
	
// coefnames provides strings for the variable names
// same index convention as coefwave and coefdatasetlinkage	
	make/o/t/n=5 coefnames
	coefnames[0]=cfstr0
	coefnames[1]=cfstr1
	coefnames[2]=cfstr2
	coefnames[3]=cfstr3
	coefnames[4]=cfstr4

donewglobalfit(FitFuncNames, DataSets, CoefDataSetLinkage, CoefWave, CoefNames, $"",NewGFOptionAPPEND_RESULTS, 200, 1)
	
end

function eps1ff(w,x) : FitFunc
	wave w
	variable x

	//CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
	//CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
	//CurveFitDialog/ Independent Variables 1
	//CurveFitDialog/ x
	//CurveFitDialog/ Coefficients 4
	//CurveFitDialog/ w[0] = eps_inf 
	//CurveFitDialog/ w[1] = sj1
	//CurveFitDialog/ w[2] = fj1
	//CurveFitDialog/ w[3] = gj1

//	return real(8.854*4*pi*2*pi*x*(w[0]-1+w[1]*(2*pi*w[2])^2 / ((2*pi*w[2])^2-(2*pi*x)^2-sqrt(-1)*w[3]*x*(2*pi)^2)+ w[4]*(2*pi*w[5])^2 / ((2*pi*w[5])^2-(2*pi*x)^2-sqrt(-1)*w[6]*x*(2*pi)^2)  )  / (100*4* pi * sqrt(-1)))
       return real(w[0]-1+w[1]*(2*pi*w[2])^2 / ((2*pi*w[2])^2-(2*pi*x)^2-sqrt(-1)*w[3]*x*(2*pi)^2))
end


function sigma1ff(w,x) : FitFunc
	wave w
	variable x

	//CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
	//CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
	//CurveFitDialog/ Independent Variables 1
	//CurveFitDialog/ x
	//CurveFitDialog/ Coefficients 4
	//CurveFitDialog/ w[0] = sigma0
	//CurveFitDialog/ w[1] = sj1
	//CurveFitDialog/ w[2] = fj1
	//CurveFitDialog/ w[3] = gj1	

	return real( 8.854*4*pi*2*pi*x *(w[0]+w[1]*(2*pi*w[2])^2 / ((2*pi*w[2])^2-(2*pi*x)^2-sqrt(-1)*w[3]*x*(2*pi)^2)))
end




I think I solved my problem...it was due to a misinterpretation of "dimindex" in setdimlabel.

I realized I hadn't identified the column I wanted, but labeled used Hold as a dimlabel for all columns. Donewglobalfit probably pulled the first column, saw that none of the numbers were 1, and didn't hold anything. I replaced the setdimlabel line as:


setdimlabel 1, 1, Hold, coefwave
great!
I did not use DoNewGlobalFit in past. So I find it very interesting when I get to know it.
After reading the whole help document about DoNewGlobalFit I understand what id dones.
Now what makes me puzzled is how the global parameters are linked!

Is it fitted in the first data and then holded as constant for other data?

Thanks
Global Fit combines all your data sets into one big one, then runs your fit functions with appropriate subsets of the coefficients. When making those subsets, any global coefficients are used over again for each data/ fit function combination, so that only one coefficient is fitted.

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com