Wave reference

Function AverageNephData()

SETDataFolder root:working
Variable avgTime
Prompt avgtime,"Enter Averaging Time in Minutes"
Doprompt "Data Averaging Time",avgTime
String VariPrefix = num2str(AvgTime)+"_Min_avg"//, noisevari
variable a,b,c,d
//Print avgTime, VariPrefix

//Sets up wave lists
Wave Neph_450_STP
Wave Corr_450,Corr_550,Corr_700,Neph_D8Time //These are 5 second data
Make/T/O/N=3 source={"Corr_450","Corr_550","Corr_700"}
Make/T/O/N=3 result={"Corr_450","Corr_550","Corr_700"}
Make/T/O/N=3 noise={"Corr_450_stdev","Corr_550_stdev","Corr_700_stdev"}
    //Makes wave names: attaches averaging prefix to the beginning of the wave name
    FOR(a=0;a<3; a+=1)
        result[a] = variPrefix+"_"+source[a]
        noise[a] = variPrefix+"_"+noise[a]
    ENDFOR
//  MAke/O/D/N=3 localwaveavg, localwavesdev
    Print source[0]
   
   

variable pointer, Min1, Min2   
string timestring1,minute1,timestring2,minute2  //averging window starttime, startminute, averaging window endtime, endminute

Make/D/O/N=(numpnts(Neph_D8Time)/(12*Avgtime)) WinStart, WinEnd //These are the start and ending indices for each averaging win\ow
Make/T/O/N=(numpnts(Neph_D8Time)) NephTimeString    //This will hold the D8Time wave as a string

NephTimeString = secs2Time(Neph_D8Time,1)   //Converts time, in seconds, to a string time format
    c=0; d=0            //c holds the window start index as fixed. d increments and then the average is taken from the c and indices

Make/D/O/N=(numpnts(Neph_D8Time)/(12*avgtime)) AveragedTime //Creates the time wave for the averaged data

    FOR(pointer=0;pointer<(numpnts(result));pointer+=1)
        Wave localwaveavg = $result[pointer]
        Wave localwavesdev = $noise[pointer]
       
        FOR(b=0;b<(numpnts(neph_D8Time));b+=1)          //Loops through the length of the Neph_D8Time wave
            Timestring1 = NephTimeString[c]; Timestring2 = NephTimeString[b]
            Minute1 = TimeString1[2,3]; Minute2 = TimeString2[2,3]
            Min1 = str2num(Minute1); Min2 = str2num(Minute2)
            IF(Min1+avgtime == Min2 || Min1+avgtime == Min2+60)         //Will execute when the minutes are different by the amount of the averaging time
                Wavestats/Q/R=[c,b] $source[pointer]                    //The OR part of the IF covers the time when the minutes go from 59 back to 0.
                localwaveavg[d]=v_avg
                localwavesdev[d]=v_sdev
                AveragedTime[d] = Neph_D8Time[c]               
                d+=1
                //IF(Timestring2 - Timestring1 > 10*avgtime)
               
                //ENDIF
            c=b     //This sets the index to the beginning of the next averaging window
            ENDIF          
        ENDFOR
    ENDFOR
END

The reference to localwaveavg or localwavesdev are not being creating using the list from $result[pointer] and noise[pointer]. I've used this technique in other code. I'm sure it's something simple that I'm missing. localwaveavg should be a named wave from the the list of waves in result. Any help would be greatly appreciated. Thanks.

 

ssmith@bnl.gov

Have you used the debugger to step through the code? You may need to do put the text content in ().

wave localwaveavg = $(result[pointer])

What happens when you use intermediate strings to assign the terms first?

string rstr = result[pointer]
string nstr = noise[pointer]

wave localwaveavg = $rstr
...

I don't think there is anything wrong with making the wave references from the text wave. The following code seems to work fine.

Function testwaveRef()

make/O/N=10 testw
testw=x*gnoise(2)
Make/O/T/N=1 textw
textw[0]="testw"
variable pointer=0
wave tw=$textw[pointer]
display tw


End

I did notice that in the line

NephTimeString = secs2Time(Neph_D8Time,1)

The first parameter, Neph_D8Time, is a wave reference, while secs2Time() requires the first parameter to be a number. Maybe that hepls?

I suspect that the wave references are failing because the waves do not exist. Here is a simplified test that shows that the technique you are using works if the waves exist:

Function Test(int flag)  // Execute Test(0) then Test(1)
    if (flag == 0)
        KillWaves/Z Corr_450, Corr_550, Corr_700
    else
        Make/O Corr_450, Corr_550, Corr_700
    endif

    Make/T/O/N=3 result={"Corr_450","Corr_550","Corr_700"}

    int pointer
    for(pointer=0;pointer<(numpnts(result));pointer+=1)
        Wave/Z localwaveavg = $result[pointer]
        if (WaveExists(localwaveavg))
            Printf  "Wave %s exists\r", NameOfWave(localwaveavg)
        else
            Printf "Wave %d does not exist\r", pointer
        endif
    endfor
End

 

This is the error from the debugger:   error: WAVE reference to "localwaveavg" failed.  Adding () around the $[pointer]doesn't work.

hm, and you are sure the wave(s) exists in the current datafolder?

 

I thought that these lines created the waves programmatically. I'm now thinking that is not the case. I'm trying to create waves that are programmatically named based on the the user input averaging time.

        Wave localwaveavg = $result[pointer]
        Wave localwavesdev = $noise[pointer]
 

To create a new wave with a name contained in a string (in this case, element of a text wave) you need something like this:

Function test()
    WAVE/T result
    WAVE/T noise
    Variable pointer
    Variable npnts=10
    Make/D/N=(npnts) $(result[pointer])/WAVE=localwaveavg
    Make/D/N=(npnts) $(noise[pointer])/WAVE=localwavesdev
end

If you have a pre-existing wave that is a template for the waves you need to create, you can replace `Make/D/N=(npnts)` with `Duplicate`