On Tue, Aug 31, 2010 at 11:59 AM, P Kishor <[email protected]> wrote:
> On Tue, Aug 31, 2010 at 11:54 AM, Chris Marshall <[email protected]> wrote:
>>> I would love to learn that I am doing something stupid,
>>> but I am fairly convinced that there is either a bug or
>>> an untrapped error in the PDL code.
>>
>> Actually the error is being trapped which is what
>> you have reported.  The problem is that you have
>> bad values in the image data that you are trying
>> to save.
>>
>> If there is a problem with the current PDL
>> code, it may be that an error is *not* being given
>> for the non-LUT wpic() case.
>>
>> At any rate, the fix is to save image data *without*
>> bad values in them.  I suggest using setbadtoval()
>> and then make that value in your color map special
>> (e.g., bright red so you can see the erroneous pixels).
>>
>
> I don't even know which value is bad? If I can't see it, if I don't
> know which one it is, if I can't even list it out, how do I know which
> one to setbadtoval()?
>
> I already have set -9999 to bad, as those are pixels with no data. I
> used to have NaNs, and I have gotten rid of those. Now, as far as I
> can tell, I have either -9999, or I have a valid number.
>
> When I write the entire piddle to a b&w image, it writes fine. When I
> try to use a LUT, all hell breaks loose.
>
> as you say, I should use "setbadtoval() and then make that value in
> your color map special." What is "that value"? That is what I am
> trying to determine.
>
>


Assuming that something might be wrong with the BAD values in my
piddles, I did the following --

    # Set the bad value for the piddle and turn on the badflag
    $pdl->badvalue(-9999.0);
    $pdl->badflag(1);

    # Multiply each value by 10
    $pdl = $pdl * 10;
    pdl_info('pdl', $pdl);

    # Get the min max
    my ($min, $max) = $pdl->minmax;
    my $div = int(($max - $min) / 10) + 1;

    # Grab a piddle for one year, and flip the piddle to correct "video coords"
    my $ypdl = $pdl->slice(":,:,0")->squeeze()->slice(':,-1:0:-1');

    # Place each element of the pdl into a corresponding bin and convert to byte
    $ypdl = byte(floor ($ypdl / $div));
    pdl_info('ypdl', $ypdl);

    # Create a lookup table ########
    my $lut = get_lut();
    pdl_info('lut', $lut);

    # Replicate ImageRGB.pm code
    my $foo = byte($lut->xchg(0,1));
    pdl_info('foo', $foo);

    my $bar = $ypdl->dummy(0);
    pdl_info('bar', $bar);

    my $res = index($foo, $bar);
    pdl_info('res', $res);

    print bigstring($res,"%3g") . "\n";


    sub pdl_info {
        my ($name, $pdl) = @_;

        print "\n";
        print "State of bad flag in piddle $name: " .
$pdl->check_badflag . "\n";
        print "The bad value for piddle $name is: " . $pdl->badvalue() . "\n";
        print "            Info for piddle $name: " . $pdl->info . "\n";
        print "-" x 50 . "\n";
    }

    sub get_lut {
        my $lut = byte(zeroes 3, 256);

        # Increment red from 0 to 255
        my $r = $lut->slice('0,:');
        $r .= $r + $r->yvals;

        # Set green to 255
        my $g = $lut->slice('1,:');
        $g .= $g + 255;

        return $lut;
    }

    sub bigstring {
        my($pdl, $fmt, $lev) = @_;

        $fmt = "%g" unless($fmt);
        my $s=" "x$lev;

        if($pdl->ndims > 1) {
               $s .= join("\n", "[", (map { bigstring($_,$fmt,$lev+1)
} dog $pdl), $s."]");
        }
        elsif ($pdl->ndims) {
               $s .= "[ " . join(" ",map { sprintf($fmt,$_) }
$pdl->list) . " ]";
        }
        else {
               $s = sprintf($fmt,$pdl->at(0));
        }

        return $s;
    }

This is what printed out

punk...@hardangervidda ~/Data/carbonmodel/cnnf$perl testindex.pl

State of bad flag in piddle pdl: 1
The bad value for piddle pdl is: -9999
            Info for piddle pdl: PDL: Float D [252,189,100]
--------------------------------------------------

State of bad flag in piddle ypdl: 1
The bad value for piddle ypdl is: 255
            Info for piddle ypdl: PDL: Byte D [252,189]
--------------------------------------------------

State of bad flag in piddle lut: 0
The bad value for piddle lut is: 255
            Info for piddle lut: PDL: Byte D [3,256]
--------------------------------------------------

State of bad flag in piddle foo: 0
The bad value for piddle foo is: 255
            Info for piddle foo: PDL: Byte D [256,3]
--------------------------------------------------

State of bad flag in piddle bar: 1
The bad value for piddle bar is: 255
            Info for piddle bar: PDL: Byte D [1,252,189]
--------------------------------------------------

PDL::index: invalid index -2147483648 (valid range 0..255) at
/usr/local/lib/perl5/site_perl/5.12.1/darwin-2level/PDL/Bad.pm line
493.




-- 
Puneet Kishor http://www.punkish.org
Carbon Model http://carbonmodel.org
Charter Member, Open Source Geospatial Foundation http://www.osgeo.org
Science Commons Fellow, http://sciencecommons.org/about/whoweare/kishor
Nelson Institute, UW-Madison http://www.nelson.wisc.edu
-----------------------------------------------------------------------
Assertions are politics; backing up assertions with evidence is science
=======================================================================

_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to