Histograms with logarithmic x scale (LogHist and LogHistBins)
Hi,
currently I am using Igor Pro 7.08 and the procedure Log Histogram.ipf version 3.0. When using the two functions LogHist and LogHistBins I realized that they are not doing there work as they should do. Since programming this function should not be too difficult, I am wondering whether I am missing something, therefore let us consider the following simple case:
I have a distribution of some values [1,5,6,8,15,56,169] and want to create a histogram with a logarithmic x scale and a "logarithmically varying" bin size. Bin size shall be same as decades to keep it simple, i.e. 1-10^1, 10^1-10^2, 10^2-10^3, ...
Now just by looking you see that the histogram y values should be the following: [4, 2, 1, 0, 0, ...].
LogHistBin(test_values, 1, 1000, 3) gives me [1, 4, 2] (LogHistBins(wave, startValue, endValue, binNumbers))
LogHist(test_values, 3, 1, 1) gives me [1, 2, 0, 0] (LogHist(wave, decadesNumber, startValue, binsPerDecade))
First of all, none of the above functions provide me with the outcome I expected. Secondly, although those two are different functions, they should provide the same results when same conditions are provided, but they don´t. I am quite confused and could not find an answer to this. Am I missing something here?
You're right- there was a bug. Apparently sometime in the past 25 years something in Igor changed. In the function DoLogHist(), this line
needs to be
I have made that change to the file that ships with Igor, but it won't get out until the next release, probably only for the Igor 9 beta. You can change your file, though. To make a WaveMetrics Procedure editable, create the global variable V_AllowProcEdits and set it to 1:
Close the procedure file Log Histogram.ipf and recompile. That will bring it back but now the lock icon in the lower left corner of the window will be a crossed-out pencil. Click it to un-cross out the pencil and you can now edit the file.
Warning: we make it purposely difficult to edit WaveMetrics Procedures files! This is a bug fix, otherwise if you want to make your own edits to a WaveMetrics Procedure file, you should make a copy, rename it, put in your own space and work on the copy.
March 2, 2021 at 10:44 am - Permalink
In reply to You're right- there was a… by johnweeks
Hi John,
thank you for your quick reply. I tried to modify Log Histogram.ipf but somehow it does not work as you suggested. I created a global variable V_allowProcEdits=1. What do you mean by "closing" file Log Histogram.ipf? I could only "hide" or "kill" the procedure. And I can only compile a procedure window which was edited already, but since I cannot edit Log Histogram.ipf, I cannot compile anything here. Could you explain this step in more detail, please?
March 3, 2021 at 03:18 am - Permalink
By "closing" John meant "kill".
I'm not sure about V_allowProcEdits but you can edit the file like this:
1. Comment out your "#include <Log Histogram>" statement and compile procedures.
The Log Histogram file will be killed if it was opened by #include.
2. Choose Help->Show Igor Pro Folder.
3. In the desktop, open the "WaveMetrics Procedures/Analysis" folder in your Igor Pro folder.
4. Drag the "Log Histogram.ipf" file from the Analysis folder into Igor Pro to open it as a procedure file.
5. Edit the file as John showed above.
6. Choose File->Save Procedure to save the edited file.
7. Kill the "Log Histogram.ipf" window to close the file and delete the window.
8. Uncomment your "#include <Log Histogram>" statement.
9. Choose" Windows->Procedure Windows->Log Histogram.ifp" and verify that your edit is there.
March 3, 2021 at 05:47 am - Permalink
Hi Howard,
thank you for your explanation. This helped me to correct the error. Now "LogHistBins()" is doing its work correctly. However LogHist() is still not working properly. Since I am only using "LogHistBins()", the case is solved for me.
March 3, 2021 at 09:09 am - Permalink
What isn't working about LogHist()? If there is still a problem, I'd like to know so that I can fix it.
Using your example, I did this:
•print junk_hy
junk_hy[0]= {4,2,1,0}
•print junk_hx
junk_hx[0]= {1,10,100,1000}
I think that's the expected output. The inputs to LogHist() are the name of the input wave (as a string because the procedure file is very old), the number of decades, the starting decade as log(start), and the number of bins per decade.
March 3, 2021 at 10:24 am - Permalink
In reply to What isn't working about… by johnweeks
Hi John,
I wrongly interpreted the starting decade as the starting value.Yes you are right, LogHist() also provides with the expected results!
March 5, 2021 at 01:18 am - Permalink
Great! Thanks for checking.
March 5, 2021 at 11:38 am - Permalink