Wave with Y values at a single X value from a graph

Function extractGraphAtXValue(theX, theGraph)
	Variable theX
	String theGraph

	String outwname = theGraph+"at"+num2str(theX)
	outwname = CleanupName(outwname, 1)
	extractGraphAtX(theX, theGraph, outwname)
end

Function extractGraphAtX(theX, theGraph, outwname)
	Variable theX
	String theGraph
	String outwname
	
	if (strlen(theGraph) == 0)
		theGraph = WinName(0,1)
	endif
	
	String tlist = TraceNameList(theGraph, ";", 1)
	Variable i
	Variable ntraces = ItemsInList(tlist)
	Variable pnt
	
	Make/D/O/N=(ntraces) $outwname
	Wave outw = $outwname
	
	for (i = 0; i < ntraces; i += 1)
		String oneTrace = StringFromList(i, tlist)
		Wave w = TraceNameToWaveRef(theGraph, oneTrace)
		Wave/Z xw = XWaveRefFromTrace(theGraph, oneTrace)
		if (WaveExists(xw))
			// assume monotonic X values
			pnt = BinarySearch(xw, theX)
		else
			pnt = x2pnt(w,  theX)
		endif
		outw[i] = w[pnt]
	endfor
end



This function extractGraphAtXValue() extracts one Y value at a given X value from every trace on the named graph. If theGraph is "" then it works on the top graph window. It creates a wave with the name derived from the graph name and the X value.

The function extractGraphAtX() allows you to specify your own output wave name.

These functions will work on a mix of both XY and waveform traces.

Note that it does not check that all the traces have sufficient points- any short trace will contribute the value at the last point.

A nice enhancement would be to allow a filter string to select only traces with certain naming convention.

To get the Y values from a graph at the X value of the round (A) cursor in the top graph, you would use the function like this:

extractGraphAtXValue(hcsr(A), "")

This code will add a dynamic update- call SetupDynamicYatXforGraph() to add the A cursor to the graph, make a new graph with the output wave, and set up a window hook on the graph to update the output graph any time the cursor is moved.

Function SetupDynamicYatXforGraph(theGraph)
	String theGraph
	
	if (strlen(theGraph) == 0)
		theGraph = WinName(0,1)
	endif
	
	Cursor/H=2/L=0/P A $(StringFromList(0, TraceNameList(theGraph, ";", 1))) 0
	
	SetWindow $theGraph hook(YatXCursorHook) = YatXCursorHook
	String outwname = "DynamicYatX"+theGraph
	SetWindow $theGraph userdata(YatXDynamicName)=outwname
	Make/N=0/D $outwname
	Display $outwname
	extractGraphAtX(hcsr(a), theGraph, outwname)
end

Function YatXCursorHook(s)
	STRUCT WMWinHookStruct &s
	
	String outwname = GetUserData(s.winName, "", "YatXDynamicName")
	extractGraphAtX(hcsr(a), s.winName, outwname)
end

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More