
Fityk (curve fitting software) file integration

This is a small script for saving an loading files for use with Fityk (https://fityk.nieto.pl/), which is a small but powerful fitting software. 1D waves are saved to Fityk's native '.fit' file format, which is basically just a text file containing a script. These files then can be directly opened in Fityk. Fit results can be exported as many file formats. Currently '.dat' for fit data and '.peaks' for individual peaks are supported, which are loaded together as set. The loading part might not be well suited to your workflow (e.g., exporting data in Fityk via scripts etc.). Suggestions for improvements are welcome. You can use the 'Fityk' menu at the top bar for saving 1D waves selected in the Data Browser or use the following functions for saving and loading:
ExportToFityk(inwave) // save fit files or LoadDataFromFityk() // load dat and peaks files
Menu "Fityk" "Export to Fityk [.fit] ...",/Q, CreateBrowser; ExportToFityk_wrapper() "Load from Fityk [.dat] ...",/Q, LoadDataFromFityk() End Function ExportToFityk_wrapper() Variable index=0 do String name = GetBrowserSelection(index) if (strlen(name) <= 0) break endif Wave/Z work = $name if (WaveExists(work)) ExportToFityk(work) endif index+=1 while(1) return 0 End //################################# Function ExportToFityk(in) wave in if (WaveDims(in) > 1) Abort "This is meant for 1D waves!" endif Variable refNum String fileFilters = "Data Files (*.fit):.fit;All Files:.*;" Open/F=fileFilters/M="Save a fit file" refNum String outputPath = S_fileName if(strlen(outputPath) == 0) return -1 //canceled endif Variable i, size = numpnts(in) String Header = "", Data = "" Header += "set verbosity = -1\r\n" Header += "set autoplot = 0\r\n" Header += "reset\r\n\r\n" Header += "use @0\r\n" Header += "title = '"+ NameOfWave(in) + "'\r\n" Header += "M="+num2str(size)+"\r\n" if (DimDelta(in, 0) < 0) // inverse waves Header += "X="+num2str(pnt2x(in,0))+"\r\n" FPrintF refnum, Header for (i = 0; i < size; i += 1) sprintf Data, "X[%d]=%f, Y[%d]=%.15f, S[%d]=1, A[%d]=1\r\n", i, pnt2x(in,size-1-i), i, numtype(in[size-1-i]) == 0 ? in[size-1-i] : 0, i, i FPrintF refnum, Data endfor else Header += "X="+num2str(pnt2x(in, (DimDelta(in, 0) < 1)*(size-1) ))+"\r\n" FPrintF refnum, Header for (i = 0; i < size; i += 1) sprintf Data, "X[%d]=%f, Y[%d]=%.15f, S[%d]=1, A[%d]=1\r\n", i, pnt2x(in,i), i, numtype(in[i]) == 0 ? in[i] : 0, i, i FPrintF refnum, Data endfor endif Header = "\r\nplot\r\n" Header += "use @0\r\n" Header += "set autoplot = 1\r\n" Header += "set verbosity = 0" FPrintF refnum, Header close refnum return 0 End //################################# Function LoadDataFromFityk() Variable refNum String FileRef = "Fityk Files (*.dat):.dat;All Files:.*;" Open/D/R/MULT=1/F=FileRef/M="Select files to load" refNum if (strlen(S_fileName) == 0) return -1 //canceled endif Variable fileindex = 0, Datanum = 0 String filePath = "", filename = "", fileList = S_FileName, Waves = "" DFREF saveDFR = GetDataFolderDFR() For (fileIndex = 0; fileIndex < ItemsInList(fileList,"\r"); fileIndex +=1) filePath = StringFromList (fileIndex, fileList,"\r") filename = ParseFilePath(3, filePath, ":", 0, 0) Print "Loading data from file '" + filename + "'." NewDataFolder/O/S $filename LoadWave/G/O/N=peak_/Q filePath Waves = S_waveNames LoadPeaksFromFityk(filePath) Wave xaxis = $StringFromList(0, Waves) For (Datanum = 1; Datanum < itemsinlist(Waves); Datanum += 1) SetScale/I x, xaxis[0], xaxis[numpnts(xaxis)-1], "", $StringFromList(Datanum, Waves) Endfor Wave total = $StringFromList(itemsinlist(Waves)-1, Waves) Duplicate/O total, $"summed" Killwaves xaxis, total SetDataFolder saveDFR Endfor End //################################# Static Function LoadPeaksFromFityk(filePath) String filePath filePath = ReplaceString(".dat",filePath,".peaks") GetFileFolderInfo/Q/Z filePath if( V_Flag != 0) Print "Peak parameter file for this set not found." return -1 endif LoadWave/J/M/K=2/O/U={1, 0, 1, 0}/V={"\t, ", " ", 0, 0}/N=parameters_/Q filePath Wave/T para = parameters_0 // get rid of empty row at end if(strlen(para[DimSize(para,0)-1]) == 0) DeletePoints/M=0 DimSize(para,0)-1, 1, para endif return 0 End

Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More