igor-public/pearl/pearl-tools.ipf

136 lines
4.2 KiB
Igor

#pragma rtGlobals=3 // Use modern global access method and strict wave access.
#pragma version = 1.00
#pragma IgorVersion = 6.2
#pragma ModuleName = PearlTools
#include "pearl-gui-tools"
// general programming tools for Igor
// $Id$
// author: matthias.muntwiler@psi.ch
// Copyright (c) 2009-14 Paul Scherrer Institut
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
function DefaultWaveIterator(w, sdata)
// function prototype for IterateWaves
wave w // wave which the iterator is supposed to work on
string &sdata // string with additional data, shared between calls
// this is a pass-by-reference argument,
// the function may modify the string
end
function AppendToGraphIterator(w, sdata)
// append iterated waves to the current graph
wave w // wave to be displayed
string &sdata // not used
appendtograph w
end
function SumWavesIterator(w, sdata)
// sum waves into one result wave
wave w // wave which the iterator is supposed to work on
string &sdata // name of the result wave, can include absolute path
// the wave must exist and compatible with the summands
// the caller is responsible for initialization of the wave
wave result = $sdata
result += w
end
function/s IterateWaves(matchStr, iterator, sdata)
// iterate over all waves matching a specified pattern (see built-in WaveList function),
// passing each wave to a user-defined iterator function
string matchStr // matchStr as for WaveList
funcref DefaultWaveIterator iterator // iterator function
// use the DefaultWaveIterator function as a template
string sdata // data string passed to iterator function
// the iterator may modify the string
// the function returns the string at the end
string wlist = WaveList(matchStr, ";", "")
variable n = ItemsInList(wlist, ";")
variable i
for (i = 0; i < n; i += 1)
wave w = $(StringFromList(i, wlist, ";"))
iterator(w, sdata)
endfor
return sdata
end
function DefaultFolderIterator(df, sdata)
// function prototype for IterateWaves
dfref df // data folder reference which the iterator is supposed to work on
string &sdata // string with additional data, shared between calls
// this is a pass-by-reference argument,
// the function may modify the string
// switch to requested data folder
setdatafolder df
// for testing
print getdatafolder(1)
// no need to switch back to original folder
end
function/s IterateDataFolders(matchStr, iterator, sdata, [progress_title])
// iterate over all data folders matching a specified pattern in the current data folder,
// passing each folder to a user-defined iterator function
string matchStr // matchStr as for the built-in stringmatch function
funcref DefaultFolderIterator iterator // iterator function
// use the DefaultFolderIterator function as a template
string sdata // data string passed to iterator function
// the iterator may modify the string
// the function returns the string at the end
string progress_title // title of the progress window (optional)
// if not specified or empty, the progress window will not be shown.
// if the progress window is show, the user can abort the iteration.
// the function result does not indicate whether the iteration was completed or aborted.
// the iterator and caller must take care of leaving the data in a consistent state.
if (ParamIsDefault(progress_title))
progress_title = ""
endif
variable show_progress = strlen(progress_title) > 0
dfref origdf = GetDataFolderDFR()
dfref curdf
variable index = 0
variable abort_req = 0
string objName
variable ndf = CountObjectsDFR(origdf, 4)
if (show_progress)
display_progress_panel(progress_title, "", ndf)
endif
do
objName = GetIndexedObjNameDFR(origdf, 4, index)
if (strlen(objName) == 0)
break
endif
if (stringmatch(objname, matchstr))
if (show_progress)
abort_req = update_progress_panel(index, message=objName)
if (abort_req)
break
endif
endif
setdatafolder origdf
curdf = $(":" + objname)
iterator(curdf, sdata)
endif
index += 1
while(1)
if (show_progress)
kill_progress_panel()
endif
setdatafolder origdf
return sdata
end