
Why NULL Waves?

pczjrh
Can anyone tell me why the following code produces a NULL wave on the first run?
I have identified that the problem is with the wave M_ImageObjPerimeter. The debugger shows it as a NULL wave, but plots values in it, in the wave display panel (I find that weird). If I leave the waves intact (by commenting out my clean-up KillWaves section), on a second run, it is fine. Do I have to declare anything special to do this - other routines that use the same ImageThreshold and ImageAnalyzeParticles calls are fine though?
I'm running this on 6.2beta2.
Thanks in advance,
Jason.
Function ParticlesAnalysis(Image,thresholdval,size) Wave Image Variable Thresholdval,size Variable wlen,i,j,k Wave W_SpotX, W_SpotY,W_ImageObjArea,W_ImageObjPerimeter,W_circularity,W_rectangularity ImageThreshold/I/T=(thresholdval)/Q image ImageAnalyzeParticles/E/W/Q/M=3/A=25 stats, M_ImageThresh Make/O/N=(numpnts(W_ImageObjArea),7) ImageAnalysisData ImageAnalysisData[][0]=W_ImageObjArea[p] ImageAnalysisData[][1]=W_ImageObjPerimeter[p] ImageAnalysisData[][2]=W_circularity[p] ImageAnalysisData[][3]=W_rectangularity[p] ImageAnalysisData[][4]=W_SpotX[p] ImageAnalysisData[][5]=W_SpotY[p] for (i=0;i<numpnts(W_ImageObjArea);i+=1) if ((ImageAnalysisData[i][0] > 700 && ImageAnalysisData[i][0] <1500) && (ImageAnalysisData[i][1] > 90 && ImageAnalysisData[i][1] < 155) && (ImageAnalysisData[i][2]>1 && ImageAnalysisData[i][2]<1.3)) ImageAnalysisData[i][6]=1 Elseif ((ImageAnalysisData[i][0] > 300 && ImageAnalysisData[i][0] <1500) && (ImageAnalysisData[i][1] > 90 && ImageAnalysisData[i][1] < 300) && (ImageAnalysisData[i][2]>1 && ImageAnalysisData[i][2]<4)) ImageAnalysisData[i][6]=2 Else ImageAnalysisData[i][6]=0 Endif endfor Newimage image appendtograph ImageAnalysisData[][5] vs ImageAnalysisData[][4] ModifyGraph mode=3,marker=19,msize=2,rgb=(65565,0,0) for (i=0;i<numpnts(W_ImageObjArea);i+=1) if (ImageAnalysisData[i][6]==1) ModifyGraph rgb(ImageAnalysisData[i])=(0,65535,0) ModifyGraph msize(ImageAnalysisData[i])=5 elseif (ImageAnalysisData[i][6]==2) ModifyGraph rgb(ImageAnalysisData[i])=(0,0,65535) ModifyGraph msize(ImageAnalysisData[i])=3 Else ModifyGraph rgb(ImageAnalysisData[i])=(65535,0,65535) ModifyGraph msize(ImageAnalysisData[i])=2 endif endfor KillWaves M_ImageThresh,W_ImageObjArea,W_SpotX,W_SpotY,W_circularity;DelayUpdate KillWaves W_rectangularity,W_ImageObjPerimeter,W_xmin,W_xmax,W_ymin,W_ymax;DelayUpdate KillWaves M_Moments,M_RawMoments,W_BoundaryX,W_BoundaryY,W_BoundaryIndex;DelayUpdate KillWaves M_Particle End <pre><code class="language-igor">
You are missing the wave references in your function.
Suppose your function calls an operation (say operation1) that creates as an output a wave called wave_A which you then want to pass to operation2. The syntax should be:
Function myFunction()
operation1 // this creates wave_A
Wave wave_A // create the reference
operation2 wave_A
End
To read more about this, execute:
Displayhelptopic "wave references"
A.G.
WaveMetrics, Inc.
May 18, 2010 at 12:20 pm - Permalink
May 18, 2010 at 10:46 pm - Permalink
I put the wave declarations on the line before I created the waves when they should have gone right after.
I note in my other procedures, that I have not hit this problem before because I have duplicated and renamed the waves of interest. This automatically created the wave reference.
Jason.
May 19, 2010 at 02:21 am - Permalink