001    /*
002     * This file is part of McIDAS-V
003     *
004     * Copyright 2007-2013
005     * Space Science and Engineering Center (SSEC)
006     * University of Wisconsin - Madison
007     * 1225 W. Dayton Street, Madison, WI 53706, USA
008     * https://www.ssec.wisc.edu/mcidas
009     * 
010     * All Rights Reserved
011     * 
012     * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013     * some McIDAS-V source code is based on IDV and VisAD source code.  
014     * 
015     * McIDAS-V is free software; you can redistribute it and/or modify
016     * it under the terms of the GNU Lesser Public License as published by
017     * the Free Software Foundation; either version 3 of the License, or
018     * (at your option) any later version.
019     * 
020     * McIDAS-V is distributed in the hope that it will be useful,
021     * but WITHOUT ANY WARRANTY; without even the implied warranty of
022     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
023     * GNU Lesser Public License for more details.
024     * 
025     * You should have received a copy of the GNU Lesser Public License
026     * along with this program.  If not, see http://www.gnu.org/licenses.
027     */
028    
029    package edu.wisc.ssec.mcidasv.control;
030    
031    import java.util.ArrayList;
032    import java.util.List;
033    
034    import ucar.unidata.data.grid.GridUtil;
035    import ucar.unidata.idv.control.ReadoutInfo;
036    import visad.Real;
037    import visad.georef.EarthLocation;
038    
039    public class HydrometeorClassificationControl extends edu.wisc.ssec.mcidasv.control.ImagePlanViewControl {
040    
041        @Override protected List getCursorReadoutInner(EarthLocation el,
042                                                       Real animationValue,
043                                                       int animationStep,
044                                                       List<ReadoutInfo> samples)
045                  throws Exception {
046    
047            if (currentSlice == null) {
048                return null;
049            }
050            List result = new ArrayList();
051            Real r = GridUtil.sampleToReal(
052                         currentSlice, el, animationValue, getSamplingModeValue(NEAREST_NEIGHBOR));
053            if (r != null) {
054                ReadoutInfo readoutInfo = new ReadoutInfo(this, r, el,
055                                              animationValue);
056                readoutInfo.setUnit(getDisplayUnit());
057                readoutInfo.setRange(getRange());
058                samples.add(readoutInfo);
059            }
060    
061            if ((r != null) && !r.isMissing()) {
062                
063                // list of codes found here:
064                // (51.2.2) http://www.roc.noaa.gov/wsr88d/PublicDocs/ICDs/2620003R.pdf
065                String str;
066                switch ((int) r.getValue()) {
067                    case 0:  str = "SNR&lt;Threshold";  // black
068                             break;
069                    case 10:  str = "Biological";  // medium gray
070                             break;
071                    case 20:  str = "AP/Ground Clutter";  // dark gray
072                             break;
073                    case 30:  str = "Ice Crystals";  // light pink
074                             break;
075                    case 40:  str = "Dry Snow";  // light blue
076                             break;
077                    case 50:  str = "Wet Snow";  // medium blue
078                             break;
079                    case 60:  str = "Light-Moderate Rain";  // light green
080                             break;
081                    case 70:  str = "Heavy Rain";  // medium green
082                             break;
083                    case 80:  str = "Big Drops Rain";  // dark yellow
084                             break;
085                    case 90:  str = "Graupel";  // medium pink
086                             break;
087                    case 100: str = "Hail, Possibly With Rain";  // red
088                             break;
089                    // classification algorithm reports "unknown type" here.
090                    // How to distinguish this from "McV doesnt understand the code"?
091                    case 140: str = "Unknown Type";  // purple
092                             break;
093                    case 150: str = "RF";  // dark purple
094                             break;
095                    default: str = "code undefined";
096                             break;
097                }
098    
099                result.add("<tr><td>" + getMenuLabel()
100                           + ":</td><td  align=\"right\">"
101                           + str + "</td></tr>");
102            }
103            return result;
104    
105        }
106    }