IGOR Pro
Appearance
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