How to solve this trace name issue?
Hello,
I have hit this some time ago and solved this way described below. But I am bit puzzled since I would expect easier solution.
I have code which appends to graph waves - SourceInWv vs SourceQWv and adds error bars using wave SourceErrorWave
ErrorBars /W=$(GraphWindowName) $(NameOfWave(SourceIntWv)) Y,wave=(SourceErrorWv,SourceErrorWv)
Now, this is a loop going through number of wave triplets. If the names are unique, this is perfectly fine code.
The trouble becomes when the wave names are the same and they are located in different folders. This is, unluckily, common case for me. In this case NameOfWave(SourceInWave)) returns name of wave which is not name name of trace -- but the trace name is needed for ErrorBars command.
Now, my solution is to use /TN= to make sure I know what the trace name is:
ErrorBars /W=$(GraphWindowName) $(NewTraceName) Y,wave=(SourceErrorWv,SourceErrorWv)
but now I have to worry about uniqueness of the NewTraceName, which previously I did not.
I searched through manual to figure out if there is something returned by AppendToGraph command to tell me, what I actually did append... I can surely interrogate recreation macros before and after to figure this out, but all of this seems ridiculously complicated for something which in its way is simple question: "what did I ended up appending"?
I am sure there must be simple solution. Can someone educate me, please? Thank you...
TraceNameList!
February 27, 2021 at 12:51 pm - Permalink
Great, so the last item on TraceNameList is what I added last. That is what I was missing here.
Thanks!
February 27, 2021 at 04:05 pm - Permalink
But using TraceNameList does require calling DoUpdate before or? Otherwise it does not know about the new trace names IIRC.
February 28, 2021 at 07:15 am - Permalink
@thomas_braun I don't think so. I haven't checked the manual but:
Make/O/N=100 myData = gnoise(1)
KillWindow/Z myPlot
Display/N=myPlot/HIDE=1
String myTrace
Variable i
for(i = 0; i < 5; i += 1)
myTrace = "test_" + num2str(i)
AppendToGraph/W=myPlot myData/TN=$myTrace
Print TraceNameList("myPlot",";",1)
endfor
End
Gives:
test_0;
test_0;test_1;
test_0;test_1;test_2;
test_0;test_1;test_2;test_3;
test_0;test_1;test_2;test_3;test_4;
February 28, 2021 at 02:01 pm - Permalink
The need to call DoUpdate is driven by the fact that some members of the graph and trace data structures are only computed when the graph is drawn. So, for instance, the axis range after appending a trace will not be accurate unless you call DoUpdate.
But the trace name is set into the data structure when the name is given, so in this particular case DoUpdate is not needed. Our internal code may well need to look up the trace by name, so it has to be that way. Always good to verify, though.
To be sure, this is not a trivial point, as re-drawing the graph can be time-consuming.
March 1, 2021 at 10:59 am - Permalink
Thanks John and sjr51. Yes indeed DoUpdate is here not needed.
March 10, 2021 at 06:11 am - Permalink