How do I find where/how a wave is computed within an igor procedure?

Hello,

I am a new igor pro user. I am using an igor procedure written by someone else which (*I think*) computes a wave called 'totscanvol'. Could you please help me figure how the wave is being computed? I am copy pasting the procedure here. I did control+F and control+G to find out where this wave is mentioned, but I could not find how it is being computed. Any help is appreciated. Thank you.

 

 #include <igorthief>
#pragma rtGlobals=3        // Use modern global access method and strict wave access.
Menu "SEMS"
    "SEMS Panel", DisplaySEMSPanel()
    
End

Function BrowseforFolder()
    DFREF dfsave = GetDataFolderDFR()
    SVAR pathstring = root:SEMS:gSEMS_pathstr
    NewPath/O/Q/M="Choose the folder where the SEMS data lives" SEMSfolder  //get folder where SEMS data lives, folder is put in a Path
        if (V_flag == 0)
            pathinfo SEMSfolder
            pathstring = S_path
        endif
    Setdatafolder dfsave
end

Window SEMS_Data_Analysis() : Panel
    PauseUpdate; Silent 1        // building window...
    NewPanel /W=(299,244,1108,607)
    ModifyPanel frameStyle=1
    ShowTools/A
    ShowInfo/W=SEMS_Data_Analysis
    GroupBox group2_tab1,pos={195,165},size={169,64}
    GroupBox group1_tab1,pos={195,236},size={167,101}
    GroupBox group0_tab1,pos={195,73},size={168,84}
    SetVariable name_range_tab1,pos={205,277},size={145,16},proc=SetRange_name,title="Name:"
    SetVariable name_range_tab1,limits={-inf,inf,0},value= root:SEMS:g_range_name,live= 1
    Button Make_dist_tab1,pos={203,305},size={121,21},proc=Make_dist_Proc,title="Make Avg. Distribution"
    TitleBox title0,pos={8,7},size={173,28},title="SEMS Data Analysis"
    TitleBox title0,labelBack=(65535,65535,65535),fSize=16,fStyle=1,anchor= MC
    Button Button_Browse,pos={692,11},size={50,20},proc=ButtonProc_Browse,title="Browse"
    Button Button_Load,pos={747,11},size={50,20},proc=ButtonProc_Load,title="Load"
    SetVariable sv_FilePath,pos={234,14},size={444,16},proc=SetVarProc,title="File Path"
    SetVariable sv_FilePath,limits={-inf,inf,0},value= root:SEMS:gSEMS_pathstr
    Button pop_volume_tab0,pos={780,79},size={13,47},disable=1,proc=Button_pop_vol,title="p\ro\rp"
    Button pop_volume_tab0,labelBack=(61440,61440,61440),fColor=(65280,65280,0)
    Button GetRange_tab1,pos={205,124},size={75,21},proc=GetRange_Proc,title="Get Selection"
    SetVariable from_tab1,pos={206,101},size={76,16},bodyWidth=33,title="From Pt."
    SetVariable from_tab1,limits={-inf,inf,0},value= root:SEMS:g_fRow,live= 1
    SetVariable to_tab1,pos={288,101},size={66,16},bodyWidth=33,title="To Pt."
    SetVariable to_tab1,limits={-inf,inf,0},value= root:SEMS:g_lRow,live= 1
    PopupMenu popup0_tab1,pos={203,196},size={64,21},proc=PopMenuProc_disttype
    PopupMenu popup0_tab1,mode=1,popvalue="Number",value= #"\"Number;Surface Area;Volume\""
    TabControl SEMSTabs,pos={8,50},size={793,304},proc=TabProc
    TabControl SEMSTabs,labelBack=(60928,60928,60928)
    TabControl SEMSTabs,tabLabel(0)="Total Concentrations"
    TabControl SEMSTabs,tabLabel(1)="Size Distributions",value= 1
    TitleBox Range_title_tab1,pos={205,81},size={105,13},title="Select or Enter Range"
    TitleBox Range_title_tab1,frame=0
    TitleBox disttype_title_tab1,pos={201,173},size={112,13},title="Select Distribution Type"
    TitleBox disttype_title_tab1,frame=0
    TitleBox distname_title_tab1,pos={202,242},size={120,26},title="Give a name to the range\r(optional)"
    TitleBox distname_title_tab1,frame=0
    Button pop_number_tab0,pos={385,77},size={13,47},disable=1,proc=Button_pop_num,title="p\ro\rp"
    Button pop_number_tab0,labelBack=(61440,61440,61440),fColor=(65280,65280,0)
    Button pop_number_tab1,pos={777,78},size={13,47},proc=Button_pop_dist,title="p\ro\rp"
    Button pop_number_tab1,labelBack=(61440,61440,61440),fColor=(65280,65280,0)
    String fldrSav0= GetDataFolder(1)
    SetDataFolder root:SEMS:
    Display/W=(408,77,773,335)/HOST=# /HIDE=1  totScanVol vs startdatetime
    SetDataFolder fldrSav0
    ModifyGraph dateInfo(bottom)={0,0,0}
    Label left "SEMS Volume"
    Label bottom "Date and Time"
    RenameWindow #,G0_tab0
    SetActiveSubwindow ##
    String fldrSav1= GetDataFolder(1)
    SetDataFolder root:SEMS:
    Display/W=(17,76,377,336)/HOST=# /HIDE=1  totScanConc vs startdatetime
    SetDataFolder fldrSav1
    ModifyGraph dateInfo(bottom)={0,0,0}
    Label left "SEMS Number Concentration"
    Label bottom "Date and Time"
    RenameWindow #,G1_tab0
    SetActiveSubwindow ##
    String fldrSav2= GetDataFolder(1)
    SetDataFolder root:SEMS:
    Edit/W=(14,72,189,343)/HOST=#  startdatetime as "SEMS_Data_Analysis"
    ModifyTable format(Point)=1,width(Point)=40,format(startdatetime)=8,width(startdatetime)=109
    ModifyTable showParts=0x6A
    ModifyTable statsArea=85
    SetDataFolder fldrSav2
    RenameWindow #,T0_tab1
    SetActiveSubwindow ##
    String fldrSav3= GetDataFolder(1)
    SetDataFolder root:SEMS:
    Display/W=(372,74,767,337)/HOST=#  display_dist vs sizebins
    SetDataFolder fldrSav3
    ModifyGraph log(bottom)=1
    Label left "Average Distribution (dX/dlogDp)"
    Label bottom "Diameter (nm)"
    RenameWindow #,G0_tab1
    SetActiveSubwindow ##
EndMacro

Function DisplaySEMSPanel()
    // If the panel is already created, just bring it to the front.
    DoWindow/F SEMS_Data_Analysis
    if (V_Flag != 0)
        return 0
    endif

    DFREF dfSave = GetDataFolderDFR()
    
    
    NewDataFolder/O/S root:SEMS

    wave/Z totScanVol = totScanVol  //need to initialize totScanVol and startdatetime so that the graph is ok at panel start up
    wave/Z/D startdatetime = startdatetime
    wave/Z totScanConc = totScanConc
    wave/Z avg_vol_dist = avg_vol_dist
    wave/Z avg_sa_dist = avg_sa_dist
    wave/Z avg_num_dist = avg_num_dist
    if (!(waveexists(TotScanVol) && waveexists(startdatetime) && waveexists(totScanConc)))
        make/N=0 totScanVol, totScanConc    
        make/D/N=0 startdatetime
        wave totScanVol, totScanConc
        wave/D startdatetime
        totScanVol = nan
        totScanConc = nan
        startdatetime = nan
    endif
    
    if(!(waveexists($"display_dist")))
        make/N=0 display_dist
        wave display_dist
        display_dist = nan
    endif

    if(!(waveexists($"sizebins")))
        make/N=0 sizebins
        wave sizebins
        sizebins = nan
    endif
    
    DFREF SEMS_df = GetDataFolderDFR()
    string SEMS_df_s = GetDataFolder(1,SEMS_df)
    string range_name = strVarOrDefault("g_range_name", "")
    string/G g_range_name = range_name
    
    string dist_name = strVarOrDefault("g_dist_name", "avg_num_dist")
    string/G g_dist_name = dist_name
    
    string dist_label = strVarOrDefault("g_dist_label", "Average Distribution (dN/dlogDp)")
    string/G g_dist_label = dist_label
    
    
    string SEMS_pathstr = StrVarOrDefault(SEMS_df_s+"gSEMS_pathstr", SpecialDirPath("Igor Pro User Files", 0, 0, 0)) //default of user chosen path string
    string/G gSEMS_pathstr = SEMS_pathstr  //gSEMS_pathstr is the path string for the folder where SEMS data lives
    variable frow = numVarOrDefault("g_frow", 0)
    variable lrow = numVarOrDefault("g_lrow",0)
    
    variable popnum = numVarOrDefault("g_popNum",1)
    Variable/G g_popNum = popnum
    
    string popstr = StrVarOrDefault("g_popStr","Number")
    string/G g_popStr = popStr

    Variable/G g_frow =frow
    Variable/G g_lrow =lrow
    
    
    Execute "SEMS_Data_Analysis()"
    setdatafolder dfsave
end



Function SetVarProc(sva) : SetVariableControl
    STRUCT WMSetVariableAction &sva
    SVAR pathstring =  root:SEMS:gSEMS_pathstr
    switch( sva.eventCode )
        case 1: // mouse up
        case 2: // Enter key
        case 3: // Live update
            Variable dval = sva.dval
            pathstring = sva.sval
            break
        case -1: // control being killed
            break
    endswitch

    return 0
End

Function ButtonProc_Browse(ba) : ButtonControl
    STRUCT WMButtonAction &ba
    
    switch( ba.eventCode )
        case 2: // mouse up
            BrowseforFolder()

            break
        case -1: // control being killed
            break
    endswitch

    return 0
End

Function ButtonProc_Load(ba) : ButtonControl
    STRUCT WMButtonAction &ba
    DFREF dfsave = getdatafolderDFR()
    switch( ba.eventCode )
        case 2: //mouse up
            SVAR pathstring = root:SEMS:gSEMS_pathstr
            NewPath/O/Z/Q SEMSfolder pathstring
            if (V_flag != 0)
                BrowseforFolder()
            endif
            string/G root:SEMS:gSEMS_datfilelist = IndexedFile (SEMSfolder, -1, ".dat")
            SVAR fileliststring =  root:SEMS:gSEMS_datfilelist
            if (StringMatch(fileliststring, ""))
                print "No SEMS data files were found."
            endif
            string/G root:SEMS:gSEMS_conclist = ListMatch(fileliststring, "SEMS_CONC*")
            string/G root:SEMS:gSEMS_auxlist = ListMatch(fileliststring, "SEMS_AUX*")
            SVAR conclist = root:SEMS:gSEMS_conclist
            SVAR auxlist = root:SEMS:gSEMS_auxlist
            auxlist = SortList(auxlist)
            conclist = SortList(conclist)
            
            //start loading files
            //loadmultfiles(filelist, line number for column names, first line, first column, number of columns)
            loadmultfiles(auxlist,9,10,0, 11,"")
            loadmultfiles(auxlist,9,10,43, 0,"")
            NVAR bincols = root:SEMS:bincols
            loadmultfiles(auxlist,9,10, 11, 42,"binlimits")
            loadmultfiles(conclist, 26,27,9,bincols,"numdist")
            
            setdatafolder root:SEMS:
            appendwaves()
            Make/O/N=(bincols) root:SEMS:sizebins
                wave sizebins = root:SEMS:sizebins
                wave numdist0 = root:SEMS:numdist0
                variable v1, v2
                variable j = 0
                for (j = 0; j<bincols; j+=1)
                    string dimtemp = GetDimLabel(numdist0,1,j)
                    sscanf dimtemp,"Bin%f_%f", v1, v2
                    sizebins[j] = v2
                endfor
                    
                    
            setdatafolder root:SEMS:
            plot_sems_totals("root:SEMS")
            wave startdatetime, binlimits0
            duplicate/O numdist0, numdist
            duplicate/O binlimits0, binlimits
            killwaves binlimits0, numdist0
            
            Totals_calc(sizebins, numdist, startdatetime, binlimits)
            
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End

Function TabProc(tca) : TabControl
    STRUCT WMTabControlAction &tca

    switch( tca.eventCode )
        case 2: // mouse up
            Variable tab = tca.tab
            String curTabMatch= "*_tab"+num2istr(tca.tab)

            String controls= ControlNameList("")
            String childwindows = ChildWindowList("#")
            Variable i, n= ItemsInList(controls)
            for(i=0; i<n; i+=1)
                String control= StringFromList(i, controls)
                Variable isInATab= stringmatch(control,"*_tab*")
                if( isInATab )
                    Variable show= stringmatch(control,curTabMatch)
                    ControlInfo $control    // gets V_disable
                    if( show )
                        V_disable= V_disable & ~0x1   // clear the hide bit
                    else
                        V_disable= V_disable | 0x1   // set the hide bit
                    endif
                    ModifyControl $control disable=V_disable
                endif
            endfor
            n = ItemsInList(childwindows)
            for(i=0; i<n; i+=1)
                String windowname = StringFromList(i, childwindows)
                windowname = "#"+windowname
                isInATab= stringmatch(windowname,"*_tab*")
                if( isInATab )
                    show= stringmatch(windowname,curTabMatch)
                    
                    if( show )
                        Setwindow $windowname hide = 0, needUpdate= 1
                        
                    else
                        Setwindow $windowname hide = 1
                    endif
                    
                endif
            endfor
            
            return 0
            
            break
        case -1: // control being killed
            break
    endswitch

    return 0
End


Function Button_pop_vol(ba) : ButtonControl
    STRUCT WMButtonAction &ba
    DFREF dfsave =getdatafolderDFR()
    SetDataFolder root:SEMS:
    wave TotScanVol, startdatetime
    switch( ba.eventCode )
        case 2:
            String fldrSav0= GetDataFolder(1)
            Display/W=(13,72,314,245)  TotScanVol vs startdatetime
            SetDataFolder fldrSav0
            ModifyGraph dateInfo(bottom)={0,0,0}
            Label left "SEMS Volume"
            Label bottom "Date and Time"
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End

Function Button_pop_num(ba) : ButtonControl
    STRUCT WMButtonAction &ba
    DFREF dfsave =getdatafolderDFR()
    SetDataFolder root:SEMS:
    wave totscanconc, startdatetime
    switch( ba.eventCode )
        case 2: // mouse up
            String fldrSav0= GetDataFolder(1)
            Display/W=(13,72,314,245)  TotScanConc vs startdatetime
            SetDataFolder fldrSav0
            ModifyGraph dateInfo(bottom)={0,0,0}
            Label left "SEMS Number Concentration"
            Label bottom "Date and Time"
            break
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End

Function Button_pop_dist(ba) : ButtonControl
    STRUCT WMButtonAction &ba
    DFREF dfsave = getdatafolderDFR()
    setDataFolder root:SEMS:
    switch( ba.eventCode )
        case 2: // mouse up
            wave sizebins
            NVAR g_popNum
            SVAR g_dist_name, g_dist_label
            //switch (g_popNum)
                //case 1:
                    //display $g_dist_name vs sizebins
                    //break
                //case 2:
                    
                    //break
                //case 3:
                    
                    //break
            //endswitch
            display $g_dist_name vs sizebins
            label left g_dist_label
            label bottom "Diameter (nm)"
            ModifyGraph log(bottom)=1
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End


Function loadmultfiles (filelist, nameline, firstline, firstcolumn, numcolumns, matrixload)
    string filelist
    variable nameline, firstline, firstcolumn, numcolumns
    string matrixload
    DFREF dfsave = getdatafolderDFR()
    setdatafolder root:SEMS:
    variable filenumber = itemsinlist(filelist)
    variable i
    for (i = 0; i<filenumber; i+=1)
        variable refnum
        Open/R/P=SEMSfolder refNum as stringfromlist(i,filelist)                    
        if (refNum == 0)
            return -1                        
        endif
        
        variable lineNumber = 0
        variable len = 0
        string buffer = ""
        do
            FReadLine refNum, buffer
            len = strlen(buffer)
            if (len == 0)
                break                        // No more lines to be read
            endif
            lineNumber += 1
        
        while (1)
        Close refnum
        
        if (lineNumber>firstline)
            setdatafolder root:SEMS:
            NewDataFolder/O/S  $("file_"+num2str(i))
            if(stringmatch(matrixload,""))
                loadwave/Q/O/A/W/J/L={nameline, firstline, 0, firstcolumn,numcolumns}/k=0 /P=SEMSfolder stringfromlist(i,filelist)
                string/G wavenames = S_wavenames
            else
                loadwave/K=0/J/N=$matrixload/M/U={0,0,1,0} /Q/O/P=SEMSfolder/L={nameline, firstline, 0, firstcolumn,numcolumns} stringfromlist(i,filelist)            
            endif
            if(i==0 && WhichListItem("NumBins",S_wavenames) !=-1)
                wave numbins = numbins
                variable/G root:SEMS:bincols = numbins[0]
                NVAR bincols = root:SEMS:bincols
                print "First file has ",numbins[0]," SEMS bins. Files with different number bins will be skipped"
            endif
            if (i != 0 && WhichListItem("NumBins",S_wavenames) !=-1)
                wave numbins = numbins
                variable tempbins = numbins[0]
                if(tempbins !=bincols)
                    print "File "+stringfromlist(i,filelist)+" has ",tempbins,".  Skipping file."
                    filelist = removelistitem(i,filelist)
                    i = i-1
                    filenumber = filenumber-1
                endif  
            endif
        
        else
            print "File "+stringfromlist(i,filelist)+" has no data.  Skipping it."
            filelist = removelistitem(i,filelist)
            i = i-1
            filenumber = filenumber-1
        endif
        
    endfor
    setdatafolder dfsave
end

Function AppendWaves()
    setdatafolder root:SEMS:file_0
    string listofwaves
    listofwaves = WaveList("*",";","")
    string thewave
    variable index, index2
    index = 0
    do
        thewave  = stringFromList (index, listofwaves)
        if(strlen(thewave) == 0)
            break
        endif
        duplicate/O $thewave, ::$thewave
        
        index += 1
    while (1)
    setdatafolder ::
    
    index = 1
    do
        if(!DataFolderExists(GetDataFolder(1)+"file_"+num2str(index)))
            break
        endif
        Setdatafolder root:SEMS:$("file_"+num2str(index))
        index2=0
        do
            thewave  = stringFromList (index2, listofwaves)
            if(strlen(thewave) == 0)
                break
            endif
            
            Concatenate/NP=0 {$thewave}, ::$thewave
            index2 += 1
            
        while (1)
        setdatafolder ::
        index +=1
    while(1)
end

Function GetRange_Proc(ba) : ButtonControl
    STRUCT WMButtonAction &ba
    DFREF dfsave = getdatafolderDFR()
    SetDataFolder root:SEMS:
    switch( ba.eventCode )
        case 2: // mouse up
            Variable/G g_frow, g_lrow
            GetSelection table, SEMS_Data_Analysis#T0_tab1, 1
            g_frow = V_startRow
            g_lrow = V_endRow
            
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End

Function SetRange_name(sva) : SetVariableControl
    STRUCT WMSetVariableAction &sva
    DFREF dfsave = getdatafolderDFR()
    setdatafolder root:SEMS:
    switch( sva.eventCode )
        case 1: // mouse up
        case 2: // Enter key
        case 3: // Live update
            String/G g_range_name = sva.sval
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End

Function PopMenuProc_disttype(pa) : PopupMenuControl
    STRUCT WMPopupAction &pa
    DFREF dfsave = getdatafolderDFR()
    setdatafolder root:SEMS:
    switch( pa.eventCode )
        case 2: // mouse up
            variable/G g_popNum = pa.popNum
            string/G g_popStr = pa.popStr
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End

Function Make_dist_Proc(ba) : ButtonControl
    STRUCT WMButtonAction &ba
    DFREF dfsave = getdatafolderDFR()
    setdatafolder root:SEMS:
    switch( ba.eventCode )
        case 2: // mouse up
            averagedist()
            break
        case -1: // control being killed
            break
    endswitch
    setdatafolder dfsave
    return 0
End

 

Indeed, I don't see any place in that code where totscanvol is filled with values. Perhaps it is in a different procedure file? Try Cmd-Shift-F to bring up the Find in Multiple Windows dialog. Turn on the checkbox to search in procedure windows, and then search for it.

By the way, it's best to use the "Insert Code Snippet" feature for code like this. If you select Igor as the language the website even colorizes the code appropriately.