Am 17.10.2012 16:27, schrieb Tom Rink:
Hi Tom,
Hi Stefan,
Stefan Below wrote:
Hello,
i tried the example from Don Murray for Logarithmic Axis
(http://www.unidata.ucar.edu/mailing_lists/archives/visad/2007/msg00053.html)
and i think i found the bug why auto scaling is not working.
First, in LogCoordinateSystem.toReference(vales):
there is no validation if log value can be calculated (no "0"
checking, so log(0) results in -INFINITE). I changed the line
logValues[i][j] = Math.log(values[i][j])/Math.log(base);
to
logValues[i][j] =(values[i][j]==0)?0:
Math.log(values[i][j])/Math.log(base);
I'm not sure this a bug. The logarithm of '0' is not '0'. What
happens in your
test if you make log(0) -> Float.NaN combined with your change below?
I think we need to handle this correctly in the scaling logic, rather
than make
this change in the coord sys code.
if i set log(0) -> Float.Nan, the "0" value is ignored in the range
calculation (min Val is set to 2.4). So it depends what should be
displayed. If it should work like the example above, i need to set
log(0)->0. If we say we ignore "0" values, than Float.NaN should work.
The next possible bug is in FlatField.computeRanges(ShadowType type,
DataShadow shadow) line 54318.
If i comment out the range component mapping, ( if (!any_mapped)
return shadow), line 5322)
it works (Log Axis with auto scaling). The problem is, that the
rangeComponent has the RealType "Values", not "LogValues", so the
Display Indices is set to -1;
I have no idea if the modification has some side effects (I could not
find any unit test), but for my use case it works.
Side effect are certainly possible with changes at this level of the
code base. I'll
take a look what you've done here more closely to try and figure out
what's
going on. Thanks for digging into this!
Thanks for picking this up.
Stefan