Wave Reference in Function Call

Hi,

 

I have put together a little function to help create box plots. And it seems to do the job nicely.

The idea is that I have a couple of waves, one containing the data and a second containing a text based description. 

 and the idea is to group by the text label and use those labels in a box plot.  All good here and now I want to take it to the next level and be able to use a numeric wave as the grouping and label.  The example would be if I had an experimental condition in a wave such as a temperature setting.  I would like to use the numeric value as an ordinal/nominal value instead of a continuous one.  The code to remap from numeric to text is straightforward.

Now the question: I would like to have a single function to call and have the use of a text wave or the needed remapping within the function.  In my code the two waves passed by reference include the numeric wave of the data and the second is the labelwave which is now set to text in the declaration.  Is it possible to pass a wave reference with declaring the type immediately and then determining the type with in the body of function and proceed accordingly?  So I an wondering if I can set the labelwave to be either text or numeric in the pass reference and then use wavetype to decide how it is handled?

Hope that is a clear question.

Andy

Function NewBox(Inwave,LabelWave)
	wave Inwave
	wave/T labelwave
	
	Findduplicates/FREE /RT=textlabels Labelwave
	
	variable index,maxindex,points,maxpoints
	maxindex= numpnts(textLabels)
	
	Make/O /n=(numpnts(Inwave),maxindex) $(nameOfWave(inWave)+"_box")
	Wave results = $(nameOfWave(inWave)+"_box")
	results=NaN
	For(index=0;index<maxindex;index+=1)
		SetDimLabel 1,index,$cleanupName(textlabels[index],0),results
		extract/FREE inWave, tempwave, !cmpstr(labelwave,textlabels[index])
		points = numpnts(tempwave)-1
		results[0,points][index]=tempwave[p]
		maxpoints = max(maxpoints,points)
	endfor
	redimension /N=(maxpoints,-1) results
	Display;AppendBoxPlot/CATL results
end

 

How about having a text wave with numbers in this case? This way you could pass this into your function without jumping through hoops. A clumsy way to achieve what you want could be to pass the path to your label wave as a string to the function and then do this:

Variable Type = WaveType($pathToWave)
if (Type == 0)	// text wave
	...
else
	...
endif

You could then convert the wave to text internally in your function. However, it is not possible to just switch between Wave and Wave/T declarations in the if statement, so it will be fiddly to handle inside the code.

Hi,

I did really quick test and I think it should work

 

Function NewBox2(Inwave,LabelWave)
	wave Inwave
	string labelwave
	
	print wavetype($labelwave,1)
end

 

 

Andy

Yes this can be done. The type of the wave is not fixed at compile time. It is a mere hint (yes this is simplified).

The following example illustrates that:

Function PrintMe(WAVE/Z wv)
	//	assumes wv is not emtpy

	variable var
	string str

	switch(WaveType(wv, 1))
		case 0:
			print "null wave"
			break
		case 1:
			var = wv[0]
			printf "Numeric wave: %g\r", var
			break
		case 2:
			WAVE/T wvText = wv
			str = wvText[0]
			printf "Text wave: %s\r", str
			break
		default:
			// and so on
			break
	endswitch
End

And feeding in some data gives

•make/o data = p
•make/T/o dataText = num2str(p^2)
•printme($"")
  null wave
•printme(data)
  Numeric wave: 0
•printme(dataText)
  Text wave: 0


One noteworthy thing is that we have to declare the wave wvText with /T so that we can read from it into a string. The same approach would work if wave is a wave reference wave or datafolder reference wave.