IGOR Pro
Wave Metrics IGOR Pro
General
Deklarations
variable thickness,messstrom String str= "huhu" wave calcHTemp,calcHRdcA
Functions
Function Funktion(param1,param2) variable param1,param2 variable int return int end
Function/S Funktion(param1,param2) variable param1,param2 String str return str end
Loops
if (a==b) [BODY] else [BODY] endif for (i=0;i<numpnts(wave);i=i+1) [BODY] endfor
Menu-Entry
menu "MyMacros" "Eintrag", Funktion() end
Prompt
Prompt thickness, "Dicke der Schicht in Nanometern" Prompt messstrom, "Messstrom in Mikroampere" DoPrompt "Nur eine Kleinigkeit noch . . .",thickness,messstrom
Strings
num2str(dicke*10^9)+"nm" String str = "Hello World" str[0] = "HuHu " -> str = "HuHu Hello World" String str = "Hello World" str[0,4] = "HuHu " -> str = "HuHu World"
Find a substring
strsearch(str, searchStr, start )
File Access
Variable lauf wave /T filelist NewPath/O MyPath // New Path NumOfImages = ItemsInList(IndexedFile(MyPath,-1,".txt")) Redimension/N=(NumOfImages) filelist for (lauf=0;lauf<NumOfImages;lauf+=1) filelist[lauf] = IndexedFile(MyPath,lauf,".txt") endfor Sort filelist,filelist
My Toolbox
Main File
#include "m:igor:werkzeugkiste:Waves" #include "m:igor:werkzeugkiste:Graphs" #include "m:igor:werkzeugkiste:Fits" #include "m:igor:werkzeugkiste:Styles" menu "Werkzeugkiste" end Function ZeitenAusInfoEinlesen() LoadWave /J/L={0, 5, 0, 1, 1 }/O/N=Zeiten //P=GreenPath "info.txt" wave Zeiten0 rename Zeiten0,Zeiten Wave Zeiten Zeiten/=1000 //ms -> s // die ersten Zeiten müssen evtl noch manuel rausgenommen werden // Zeiten[0] muss dann auf Null gesetzt werden End Function makeNewFolders(anzahl) Variable anzahl Variable i for (i=1;i<=anzahl;i+=1) String str ="" if (i<10) str = "0" endif str = str + num2str(i) NewDataFolder /O $str endfor End Function /S GetListOfFolderCont(objectType) Variable objectType //1==Waves, 2==Vars, 3==Strings, 4==Folders String sourceFolderStr = GetDataFolder(1) String Liste = "" Variable i For(i=0;i<CountObjects(sourceFolderStr, objectType ); i+=1) Liste += GetIndexedObjName(sourceFolderStr, objectType, i )+";" EndFor Return Liste End Function/S PopUpChooseFolder() String liste = GetListOfFolderCont(4) String verz = "" Prompt verz,"Folder",popup,liste DoPrompt "",verz if (V_Flag == 1) return "" endif Return verz End
Waves
menu "Werkzeugkiste" "ForEach Wave", ForEachWave() "Dublicate Waves", WavesDublizieren() "Rename Waves", WavesUmbenennen() "Delete Waves", WavesLoeschen() //findmin, findmax, createx "Waves -> Matrix", Waves2Matrix() "Matrix-Y-Region -> Wave", Matrix2Wave() "-" end Function ForEachWave(Cmd) String Cmd String WaveNameMatch = "*" Prompt WaveNameMatch, "Only waves matching:" String RegExp = "^m..$" Prompt RegExp, "Regular Expression Filter" If(StrLen(Cmd)==0) Cmd += "Display %n%,%n%_smth vs ::%n%xwave_eV;" Cmd += "ModifyGraph rgb(%n%)=(0,0,0);" Cmd += "ModifyGraph rgb(%n%_smth)=(65280,0,0);" // Cmd += "Duplicate/O %n%,%n%_smth;" // Cmd += "Smooth 25, %n%_smth;" EndIf Prompt Cmd, "Command" DoPrompt "", WaveNameMatch,RegExp, Cmd if (V_Flag) return -1 // User canceled endif String List = GrepList( WaveList(WaveNameMatch,";","") , RegExp) Variable i For (i=0;i<ItemsInList(List);i+=1) String n = StringFromList(i,List) String ThisCmd = ReplaceString("%n%", Cmd, n) Execute ThisCmd EndFor End Function WavesDublizieren() String WaveNameMatch = "*" Prompt WaveNameMatch, "Only doublicate waves matching" String RegExp = ".*" Prompt RegExp, "Regular Expression Filter" String TargetFolder = "Copy" Prompt TargetFolder, "Target Folder" DoPrompt "", WaveNameMatch, RegExp, TargetFolder if (V_Flag) return -1 // User canceled endif String List = GrepList(WaveList(WaveNameMatch,";","") , RegExp) If (!DataFolderExists(TargetFolder)) NewDataFolder $TargetFolder EndIf Variable i For (i=0;i<ItemsInList(List);i+=1) String n = StringFromList(i,List) String new = ":"+TargetFolder+":"+n Duplicate $n, $new EndFor End Function WavesUmbenennen() String WaveNameMatch = "*" Prompt WaveNameMatch, "Only rename waves matching:" String RegExp = "^.*$" Prompt RegExp, "Regular Expression Filter" String Was = "00" Prompt Was , "Replace what" String Womit = "__" Prompt Womit, "Replace with" DoPrompt "", WaveNameMatch,RegExp, Was, Womit if (V_Flag) return -1 // User canceled endif String List = GrepList ( WaveList(WaveNameMatch,";","") , RegExp ) Variable i For (i=0;i<ItemsInList(List);i+=1) String oldname = StringFromList(i,List) String newname = ReplaceString(Was,oldname,Womit) Wave wo = $oldname Wave wn = $newname Rename wo,$newname EndFor End Function WavesLoeschen() String WaveNameMatch = "*_smth" Prompt WaveNameMatch, "Only rename waves matching:" String RegExp = ".*" Prompt RegExp, "Regular Expression Filter" DoPrompt "", WaveNameMatch,RegExp if (V_Flag) return -1 // User canceled endif String List = GrepList(WaveList(WaveNameMatch,";","") , RegExp) DoAlert 1, "REALLY sure to delete " + num2str(ItemsInList(List)) + "waves???\r " + ReplaceString(";",List," ") if (V_Flag!=1) // Not "Yes" clicked return -1 endif Variable i For (i=0;i<ItemsInList(List);i+=1) String n = StringFromList(i,List) Wave w = $n KillWaves w EndFor End function findmin(data) wave data variable i variable mini =data[0] variable maxi=data[0] for (i=1;i<numpnts(data);i=i+1) // hier nicht von i=0 mini=min(mini,data[i]) maxi=max(maxi,data[i]) endfor return mini end // findmin function findmax(data) wave data variable i variable maxi=data[0] for (i=1;i<numpnts(data);i=i+1) // hier nicht von i=0 maxi=max(maxi,data[i]) endfor return maxi end // findmax // Extracts an xwave from an igor combined wave // use: createx("wave") function createx(NameDerWave) String NameDerWave wave w=$NameDerWave variable start=leftx(w) variable delta=deltax(w) String NameDerXWave = NameDerWave+"x" Make /N=(numpnts(w)) $NameDerXWave wave wx = $NameDerXWave variable index=0 for (index=0;index<numpnts(xaxis);index+=1) wx[index]=start+ index*delta endfor end // joins all waves of folder "Waves" into matrix "Matrix", having the wave# as the x-axis // Sorts waves by name function Waves2Matrix() if (!DataFolderExists("waves")) DoAlert 0,"No child datafolder named waves" return -1 endif SetDataFolder("waves") String sWaveListe = WaveList("*",";","") sWaveListe = SortList(sWaveListe,";",16) // case-insensitive alphanumeric sort that sorts wave0 and wave9 before wave10. Variable numWaves = ItemsInList(sWaveListe,";") Make /N=(numWaves,0)/O/U/I ::Matrix //unsigned integer Wave m=::Matrix Variable index for (index=0; index<numWaves; index+=1) String sWaveName = StringFromList(index, sWaveListe) Print sWaveName Wave w = $sWaveName Variable numpntsInWave = numpnts(w) If (index==0) Redimension/N=(-1,numpntsInWave) m ElseIf(numpntsInWave != dimsize(m,1)) DoAlert 0, "Waves do not have the same number of points!" SetDataFolder("::") return -1 EndIf Variable i for (i=0;i<numpntsInWave;i+=1) m[index][i] = w[i] endfor endfor SetDataFolder("::") end // joins averages an Y-region of a matrix into a single wave // Matrixname = "Matrix" function Matrix2Wave() If (!WaveExists(Matrix)) DoAlert 0, "No matrix named \"Matrix\" existing" Return -1 EndIf Wave m = Matrix Variable numXValues = DimSize(m,0) Variable maxLines = DimSize(m,1) Variable loiUp=maxLines-1 Variable LoiDown=0 Prompt loiUp, "Upper Line of Interest" Prompt loiDown, "Lower Line of Interest" DoPrompt "", loiDown,loiUp if (V_flag != 0) return -1 endif If (loiUp>=maxLines) loiUp=maxLines-1 EndIf If(loiUp<loiDown) Variable var = loiUp loiUp=loiDown loiDown=var EndIf Variable numLines = loiUp - loiDown String nameDerWave = "MatrixRegion" + num2str(loiDown) + "-" + num2str(loiUp) Make /O/N=(numXValues) $nameDerWave Wave w = $nameDerWave w=0 Variable i,j For (i=0;i<numXValues;i+=1) For (j=0;j<numLines;j+=1) w[i] += m[i][j] EndFor EndFor end
Graphs
menu "Werkzeugkiste" "Plot File", plotfile() "Colorize Traces", colorizeTraces() "Label Graph", LabelGraph() "Add Legend to Graph", AddLegend() "Save Graph as PNG", exportPNG() "Save Graph as PNG, Screen-Resolution", exportPNGScreen() "KillAll", killAll() "ForEach Graph", ForEachGraph() // "ForEach Graph-Trace", ForEachGraphTrace() "-" end function plotfile() KillWaves /Z xwave, ywave, matrix0, matrix string file = OpenFileDialog() if (StrLen(file)==0) // canceled return -1 endif LoadWave /A=matrix/M/O/G file // /M for Matrix rename matrix0,matrix wave matrix variable anzSpalten = DimSize(matrix, 1) if (anzSpalten==1) rename matrix, xwave Display xwave else if (anzSpalten==2) make /O /N=(DimSize(matrix, 0)) xwave make /O /N=(DimSize(matrix, 0)) ywave variable i=0 for (i=0;i<DimSize(matrix,0);i+=1) xwave[i]=matrix[i][0] ywave[i]=matrix[i][1] endfor Display ywave vs xwave endif if (anzSpalten>2) // turnMatrix("matrix") NewImage /F/K=0 matrix ; ModifyGraph swapXY=1; ModifyImage matrix ctab= {0,50,Rainbow,1} endif endif KillWaves /Z xwave, ywave, matrix0, matrix end //Plotfile() Function/S OpenFileDialog() // used by Plotfile() Variable refNum // String message = "Select a file" String outputPath Open/D/R/M="Choose File" refNum outputPath = S_fileName return outputPath End function colorizeTraces() String traces = TraceNameList("", ",", 1) //traces = SortList(traces,",",16) Variable numoftraces=ItemsInList(traces,",") Variable i=0 do String tracename = StringFromList(i, traces,",") if(strlen(tracename)==0) break endif variable r,g,b String farbcode = colorizeTracesGenColor (i,numoftraces) r = str2num(StringFromList(0, farbcode,",")) g = str2num(StringFromList(1, farbcode,",")) b = str2num(StringFromList(2, farbcode,",")) ModifyGraph rgb($tracename)=(r,g,b) i+=1 while(i) AddLegend() end function /S colorizeTracesGenColor (index,anztraces) variable index // 0,1,2,3... anztraces-1 variable anztraces String farbcode = "" index = mod(index,10) switch (index) // color codes taken from the Package KBColorizTraces case 0: farbcode = "00000,00000,00000" break case 1: farbcode = "65535,16385,16385" break case 2: farbcode = "000002,39321,00001" break case 3: farbcode = "00000,00000,65535" break case 4: farbcode = "39321,00001,31457" break case 5: farbcode = "48059,48059,48059" break case 6: farbcode = "65535,32768,32768" break case 7: farbcode = "00000,65535,00000" break case 8: farbcode = "16385,65535,65535" break case 9: farbcode = "65535,32768,58981" break endswitch return farbcode end //colorizeTracesGenColor Function LabelGraph() String title = "" String bottom = "" String left = "" Prompt title, "Title of Graph" Prompt bottom, "Label of bottom-axis" Prompt left, "Label of left-axis" DoPrompt "", title, bottom, left if (V_flag == 1) return -1 endif If (! StringMatch(title , "")) title = "\JR"+title TextBox/C/N=text_titel/Z=1/D={1,1,0}/A=RT/X=0.00/Y=0.00 title EndIf If (! StringMatch(bottom , "")) Label bottom bottom EndIf If (! StringMatch(left , "")) Label left left EndIf end Function AddLegend() Legend/C/N=text_legend/X=0.00/Y=0.00 end Function exportPNG() SavePICT/E=-5/B=288/M/W=(0,0,20,15) End Function exportPNGScreen()//resulution=screen SavePICT/E=-5/B=72/M/W=(0,0,12,9) End Function killall() String Filter = "*" Prompt Filter, "Name Match String" String RegExp = "^.*$" Prompt RegExp, "Regular Expression Filter" String sType //1=graph, 2=table, 4=layout Prompt sType , "Choose Type?", popup, "Graphs;Tables;Layouts;All of Them" DoPrompt "What do you want to kill today?",sType,Filter,RegExp If (V_flag==1) // cancel clicked Return 0 EndIf Variable Type If(StringMatch(sType,"Graphs") ) Type = 1 ElseIf(StringMatch(sType,"Tables") ) Type = 2 ElseIf(StringMatch(sType,"Layouts") ) Type = 4 ElseIf(StringMatch(sType,"All of them") ) Type = 7 EndIF String allItems = GrepList ( WinList(Filter, ";","WIN: "+num2str(Type)) , RegExp) Variable numOfItems = ItemsInList(allItems) DoAlert 1, "Are you SURE to delete all " + num2str(numOfItems)+ " items?" If (V_flag!=1) // no clicked Return 0 EndIf Variable itemCounter For (itemCounter=0; itemCounter < numOfitems; itemCounter+=1) String oneitem = StringFromList(itemCounter, allitems, ";") DoWindow/K $oneitem EndFor End Function ForEachGraph() String GraphNameMatch = "*" Prompt GraphNameMatch, "Only graph names matching" String RegExp = ".*" Prompt RegExp, "Regular Expression Filter" String Cmd = "" Cmd += "DoWindow /F %n%" Prompt Cmd, "Command" DoPrompt "", GraphNameMatch,RegExp, Cmd String List = GrepList ( WinList(GraphNameMatch, ";","WIN: 1") , RegExp) Variable i For (i=0; i < ItemsInList(List); i+=1) String name = StringFromList(i, List, ";") String ThisCmd = ReplaceString("%n%",Cmd,name) Execute ThisCmd // SetAxis left 0,* // SetAxis bottom 1.45,1.90 EndFor End Function ForEachGraphTrace() String graphList = WinList("*", ";","WIN: 1") Variable graphCounter For (graphCounter=0; graphCounter < ItemsInList(graphList); graphCounter+=1) String NameOfGraph = StringFromList(graphCounter, graphList, ";") print NameOfGraph DoWindow/F $NameOfGraph //bring to front String traceList = TraceNameList(NameOfGraph, ";", 1) Variable traceCounter For (traceCounter=0; traceCounter < ItemsInList(traceList); traceCounter+=1) String NameOfTrace EndFor // String data = StringFromList(0,traces,";") // String fit = StringFromList(1,traces,";") // String peak1 = StringFromList(2,traces,";") // String peak2 = StringFromList(3,traces,";") // String peak3 = StringFromList(4,traces,";") // ModifyGraph rgb($data)=(0,0,0) // ModifyGraph rgb($fit)=(65280,43520,0) // ModifyGraph rgb($peak1)=(65280,0,0) // ModifyGraph rgb($peak2)=(0,65280,0) // ModifyGraph rgb($peak3)=(0,0,65280) endfor end
Styles
menu "GraphStyles" "Intensity vs. Energy", Style_IvE() "Intensity vs. Wavelength", Style_IvL() "Intensity vs. Time", Style_IvT() "Energy vs. Time", Style_EvT() end Proc Style_Defaults() PauseUpdate; Silent 1 // modifying window... ModifyGraph/Z mirror=1 ModifyGraph/Z tick=2 ModifyGraph/Z grid=2,nticks=4,minor=1 ModifyGraph/Z standoff=0 EndMacro Proc Style_IvE() : GraphStyle PauseUpdate; Silent 1 // modifying window... Style_Defaults() SetAxis left 0,* ModifyGraph prescaleExp(left)=-3 Label/Z left "PL Intensity (a.u.)" Label/Z bottom "Energy (eV)" EndMacro Proc Style_IvL() : GraphStyle PauseUpdate; Silent 1 // modifying window... SetAxis left 0,* ModifyGraph prescaleExp(left)=-3 Style_Defaults() Label/Z left "PL Intensity (a.u.)" Label/Z bottom "Wavelength (nm)" EndMacro Proc Style_IvT() : GraphStyle PauseUpdate; Silent 1 // modifying window... SetAxis left 0,* ModifyGraph prescaleExp(left)=-3 Style_Defaults() Label/Z left "PL Intensity (a.u.)" Label/Z bottom "Time (s)" EndMacro Proc Style_EvT() : GraphStyle PauseUpdate; Silent 1 // modifying window... ModifyGraph/Z mirror=1 ModifyGraph/Z tick=2 ModifyGraph/Z grid=0,nticks=4,minor=1 ModifyGraph/Z standoff=0 Label/Z left "Energy (eV)" Label/Z bottom "Time (s)" EndMacro
Fitting
menu "Werkzeugkiste" "Gauss-Fit on many waves ", machVieleGaussFits() "Create Gauss-Curve", makeGaussPrompt() "-" end //reads x-scaling from a wave //TODO: read x-scaling from scaled waves function makeGaussPrompt() // Gauss: offset + amp + Exp(- (x-pos)^2/width) String NameDesGauss = "gauss1_m01" Variable offset = 0 Variable amp = 42964 Variable pos = 2.0805 Variable width = 0.13698 Prompt NameDesGauss, "Name of Output Wave" Prompt offset, "Gauss Parameter 0: Offset" Prompt amp, "Gauss Parameter 1: Amplitude" Prompt pos, "Gauss Parameter 2: Position" Prompt width, "Gauss Parameter 3: Width" DoPrompt "TITEL", NameDesGauss, offset, amp, pos, width if (V_Flag != 0) return 0 endif makeGauss2(NameDesGauss, offset, amp, pos, width) end function makeGauss2(NameDesGauss, offset, amp, pos, width) String NameDesGauss Variable offset Variable amp Variable pos Variable width Variable relBreite = 2 Variable punkte = 128 Variable startx=pos - relBreite*width //relBreite = 5 Variable endx =pos + relBreite*width Make /N=(punkte) $NameDesGauss Wave w = $NameDesGauss SetScale/I x startx,endx,"", w w = offset + amp * Exp(- ((x-pos)/width)^2) end Function machVieleGaussFits() // Does a Gauss-Fit on all waves in current folder, matching a certain name // results can be found in Fit_Offset, Fit_Ampl, Fit_Pos, Fit_Width String MatchName = "*" Prompt MatchName , "Wave names matching:" String RegExp = "^.*$" Prompt RegExp, "Regular Expression Filter" DoPrompt "Filter Waves", MatchName, RegExp If (V_flag==1) return -1 EndIf String Liste = SortList (GrepList ( WaveList(MatchName,";","") , RegExp) , ";" , 2 ) Variable AnzWaves = itemsinlist(Liste) Make /O/N=(AnzWaves) Fit_Offset ; Wave Fit_Offset ; Fit_Offset=0 Make /O/N=(AnzWaves) Fit_Ampl ; Wave Fit_Ampl ; Fit_Ampl=0 Make /O/N=(AnzWaves) Fit_Pos ; Wave Fit_Pos ; Fit_Pos=0 Make /O/N=(AnzWaves) Fit_Width ; Wave Fit_Width ; Fit_Width=0 If (DataFolderExists ("tempfit")) DoAlert 0, "DataFolder \"tempfit\" does already exist, so quitting" return -1 EndIf NewDataFolder /S/O tempfit Variable i For (i=0;i<AnzWaves;i+=1) String name = "::" + StringFromList(i,Liste) Wave w = $name CurveFit/N/M=0/W=0/Q gauss, w Wave W_coef Fit_Offset[i] = W_coef[0] Fit_Ampl[i] = W_coef[1] Fit_Pos[i] = W_coef[2] Fit_Width[i] = W_coef[3] EndFor SetDataFolder :: KillDataFolder tempfit End