Batch File Graph Analysis

Hello,

I've written a code that creates an index to batch analyze graphs from a folder. Each graph in the designated folder has it's own multidimensional matrix, so ideally I should be able to display and analyze each graph before the index (and consequently the loaded file) changes. I've run across a few issues, however. The largest is that the entirety of each loaded matrix is only 1 wave, so I preferably want to be able to make a wave out each column for further graphical analysis. For instance, I want matrix[][1] to be labeled 'wave1'. To do this, I tried the duplicate command to apply the appropriate data from matrix[][1] to 'wave1' and from matrix[][2] to 'wave2'. Then, I did Display wave1 vs wave 2. After running, all 15 displayed graphs came out looking the same and using the last loaded images matrix data. What's weird is I looked at the data in wave1 & 2 while running and all of the values were different, so it must just be an issue with display during iteration. Any help is appreciated.

Function BatchGraphAnalysis(pathName, extension, makePlots)
    String pathName             // Use "" to get a dialog
    String extension                    // File name extension, use ".ibw"
    Variable makePlots              // 1 to display each matrix in a plot
 
    if (strlen(pathName) == 0)
        NewPath/O/M="Choose a folder containing Matrix Files" LoadIndexedMatrixPath
        if (V_flag != 0)
            return -1               // User cancelled
        endif
        pathName = "LoadIndexedMatrixPath"
    endif
 
    String fileName
    Variable index
 
    index = 0
    do
        fileName = IndexedFile($pathName, index, extension)
        if (strlen(fileName) == 0)
            break           // No more files.
        endif
 
        String matrixName = CleanupName(fileName, 0)
        matrixName = ParseFilePath(0, fileName, ".", 0, 0)
        Variable existsCode = exists(matrixName)
        if (existsCode!=0 && existsCode!=1)
            // matrixName conflicts with some name other than a wave name so make it unique
            matrixName = UniqueName(matrixName, 1, 0)
        endif
 
        String columnInfoStr
        sprintf columnInfoStr, "N='%s';", matrixName
 
        LoadWave/M/D/O/P=$pathName/B=columnInfoStr fileName
        wave matrix = $matrixName
        duplicate/o/R=[*][1] matrix, wave1
        duplicate/o/R=[*][2] matrix, wave2
        display wave1 vs wave2
        index += 1
    while (1)

End

bls44 wrote:

...
Then, I did Display wave1 vs wave 2. After running, all 15 displayed graphs came out looking the same and using the last loaded images matrix data. What's weird is I looked at the data in wave1 & 2 while running and all of the values were different, so it must just be an issue with display during iteration. Any help is appreciated.

..
        LoadWave/M/D/O/P=$pathName/B=columnInfoStr fileName
        wave matrix = $matrixName
        duplicate/o/R=[*][1] matrix, wave1
        duplicate/o/R=[*][2] matrix, wave2
        display wave1 vs wave2
..


In this part of the code, you load a wave matrix and you copy the coulmn data into wave1 and wave2.

But on the next iteration wave1 and wave2 will be overwritten with the data from the newly loaded matrix.

You can think of graphs in Igor as visual representations of the waves. So if you do something like this:
..
        LoadWave/M/D/O/P=$pathName/B=columnInfoStr fileName
        wave matrix = $matrixName
        duplicate/o/R=[*][1] matrix, wave1
        duplicate/o/R=[*][2] matrix, wave2
        display wave1 vs wave2

                doupdate
..


you will see that the graphs will update at every iteration (hopefully), displaying the same graph at each step of the loop.

The best solution would have been to do this, but Igor cannot handle slices, thus the /R specifier on a few Igor operations:
..
        LoadWave/M/D/O/P=$pathName/B=columnInfoStr fileName
        wave matrix = $matrixName
        display matrix[*][1] vs matrix[*][2]
..


You can try loading each wave slice with a unique name:
string s_wave1 = matrixName + "_col1"
string s_wave2 = matrixName + "_col2"

LoadWave/M/D/O/P=$pathName/B=columnInfoStr fileName
wave matrix = $matrixName

duplicate/o/R=[*][1] matrix, $s_wave1
duplicate/o/R=[*][2] matrix, $s_wave2


I am not sure this is the best way, however.

best,
_sk
Thank you very much! It worked perfectly.

string s_wave1 = matrixName + "_col1"
string s_wave2 = matrixName + "_col2"
 
LoadWave/M/D/O/P=$pathName/B=columnInfoStr fileName
wave matrix = $matrixName
 
duplicate/o/R=[*][1] matrix, $s_wave1
duplicate/o/R=[*][2] matrix, $s_wave2

wave wave1 = $s_wave1
wave wave2 = $s_wave2
display wave1 vs wave2