cdm/src/main/java/ucar/nc2/iosp/nids/Nidsheader.java
void setProductInfo(int prod_type, Pinfo pinfo)
    {
                                 /* memo field                */
        String[] cmode = new String[]{"Maintenance", "Clear Air", "Precip Mode"};

        short prod_max = pinfo.p4;
        short prod_min = 0;
        int prod_elevation = 0;
        //int prod_info;
        int prod_top;
        int radial = 0;
        String summary = null;
        java.util.Date endDate;
        java.util.Date startDate;
        String dstring;
        double t1 = 124.0 * 1.853 / 111.26;
        double t2 = 230 / (111.26 * Math.cos(Math.toRadians(latitude)));
        lat_min = latitude -  t1;
        lat_max = latitude + t1;
        lon_min = longitude +  t2; //* Math.cos(Math.toRadians(lat_min));
        lon_max = longitude -  t2; //* Math.cos(Math.toRadians(lat_min));
        startDate = getDate( volumeScanDate, volumeScanTime*1000);
        endDate = getDate( volumeScanDate, volumeScanTime*1000);

        if (prod_type == SPECTRUM) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Specturm Width " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(pcode, prod_elevation/10);
            ctitle = "BREF: Base Spectrum Width";
            cunit = "Knots";
            cname = "SpectrumWidth";
            summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 124 nm";
            if(pcode == 28 ){
                t1 = t1 * 0.25;
                t2 = t2 * 0.25;
                lat_min = latitude -  t1;
                lat_max = latitude + t1;
                lon_min = longitude +  t2; //* Math.cos(Math.toRadians(lat_min));
                lon_max = longitude -  t2; //* Math.cos(Math.toRadians(lat_min));
                summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 32 nm";
            }
        }
        else if (prod_type == DigitalDifferentialReflectivity) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Differential Reflectivity " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(15, pLevel);

            ctitle = "Dualpol: Digital Differential Reflectivity";
            cunit = "dBz";
            cname = "DifferentialReflectivity";
            summary = ctilt + " is a radial image of dual pol differential reflectivity field and its range 162 nm";

        }
        else if (prod_type == DigitalCorrelationCoefficient) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Correlation Coefficient " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(16, pLevel);

            ctitle = "Dualpol: Digital Correlation Coefficient";
            cunit = " ";
            cname = "CorrelationCoefficient";
            summary = ctilt + " is a radial image of dual pol Correlation Coefficient field and its range 162 nm";

        }
        else if (prod_type == DigitalDifferentialPhase) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Differential Phase " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(17, pLevel);


            ctitle = "Dualpol: Digital Differential Phase";
            cunit = "Degree/km";
            cname = "DifferentialPhase";
            summary = ctilt + " is a radial image of dual pol Differential Phase field and its range 162 nm";

        }
        else if (prod_type == HydrometeorClassification ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Hydrometeor Classification " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(18, pLevel);


            ctitle = "Dualpol: Hydrometeor Classification";
            cunit = " ";
            cname = "HydrometeorClassification";
            summary = ctilt + " is a radial image of dual pol Hydrometeor Classification field and its range 162 nm";

        }
        else if (prod_type == HypridHydrometeorClassification ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Hyprid Hydrometeor Classification " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(18, pLevel);


            ctitle = "Dualpol: Hyprid Hydrometeor Classification";
            cunit = " ";
            cname = "HypridHydrometeorClassification";
            summary = ctilt + " is a radial image of dual pol Hyprid Hydrometeor Classification field and its range 162 nm";

        }
        else if (prod_type == OneHourAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "One Hour Accumulation " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];
            ctilt = "OHA";
            ctitle = "Dualpol: One Hour Accumulation";
            cunit = "IN";
            cname = "OneHourAccumulation";
            summary = ctilt + " is a radial image of dual pol One Hour Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalAccumulationArray ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Accumulation Array " + cmode[pinfo.opmode];
            ctilt = "DAA";
            ctitle = "Dualpol: Digital Accumulation Array";
            cunit = "IN";
            cname = "DigitalAccumulationArray";
            summary = ctilt + " is a radial image of dual pol Digital Accumulation Array field and its range 124 nm";
        }
        else if (prod_type == StormTotalAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Storm Total Accumulation " +  cmode[pinfo.opmode];
            ctilt = "PTA";
            ctitle = "Dualpol: Storm Total Accumulation";
            cunit = "IN";
            cname = "StormTotalAccumulation";
            summary = ctilt + " is a radial image of dual pol Storm Total Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalStormTotalAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Storm Total Accumulation  " +  cmode[pinfo.opmode];
            ctilt = "DTA";
            ctitle = "Dualpol: Digital Storm Total Accumulation";
            cunit = "IN";
            cname = "DigitalStormTotalAccumulation";
            summary = ctilt + " is a radial image of dual pol Digital StormTotal Accumulation field and its range 124 nm";
        }
        else if (prod_type == Accumulation3Hour ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Hyprid Hydrometeor Classification " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];
            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(18, pLevel);
            ctitle = "Dualpol: 3-hour Accumulation";
            cunit = "IN";
            cname = "Accumulation3Hour";
            summary = ctilt + " is a radial image of dual pol 3-hour Accumulation field and its range 124 nm";

        }
        else if (prod_type == Digital1HourDifferenceAccumulation) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital One Hour Difference Accumulation "  + cmode[pinfo.opmode];
            ctilt = "DOD";
            ctitle = "Dualpol: Digital One Hour Difference Accumulation";
            cunit = "IN";
            cname = "Digital1HourDifferenceAccumulation";
            summary = ctilt + " is a radial image of dual pol Digital One Hour Difference Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalTotalDifferenceAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Total Difference Accumulation " + cmode[pinfo.opmode];
            ctilt = "DSD";
            ctitle = "Dualpol: Digital Total Difference Accumulation";
            cunit = "IN";
            cname = "DigitalTotalDifferenceAccumulation";
            summary = ctilt + " is a radial image of dual pol Digital Total Difference Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalInstantaneousPrecipitationRate ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Instantaneous Precipitation Rate " + cmode[pinfo.opmode];
            ctilt = "DPR";
            ctitle = "Dualpol: Digital Instantaneous Precipitation Rate";
            cunit = "IN/Hour";
            cname = "DigitalInstantaneousPrecipitationRate";
            summary = ctilt + " is a radial image of dual pol Digital Instantaneous Precipitation Rate field and its range 124 nm";
        }
        else if (prod_type == BaseReflectivityDR) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Reflectivity DR " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(94, pLevel);

            ctitle = "HighResolution: Base Reflectivity";
            cunit = "dBz";
            cname = "BaseReflectivityDR";
            summary = ctilt + " is a radial image of base reflectivity field and its range 248 nm";

        }
        else if (prod_type == BaseVelocityDV) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Velocity DR " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(99, pLevel);

            ctitle = "HighResolution: Base Velocity";
            cunit = "m/s";
            cname = "BaseVelocityDV";
            summary = ctilt + " is a radial image of base velocity field and its range 124 nm";

        } else if (prod_type == DigitalVert_Liquid) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Hybrid Reflect " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(134, prod_elevation/10);
            ctitle = "Digital: Vertical Integ Liquid";
            cunit = "kg/m^2";
            cname = "DigitalIntegLiquid";
            summary = ctilt + " is a radial image high resolution vertical integral liquid and range 248 nm";

        }
        else if (prod_type == DigitalHybridReflect) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Hybrid Reflect " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(19, prod_elevation/10);
            ctitle = "DigitalHybrid: Reflectivity";
            cunit = "dBz";
            cname = "DigitalHybridReflectivity";
            summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 124 nm";

        } else if (prod_type == Base_Reflect || prod_type == Reflect1) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Reflct " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];
            if(prod_type == Reflect1){
                ctilt = "R" + prod_elevation/10;
                summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1);
            }
            else {
                ctilt = pname_lookup(19, prod_elevation/10);
                summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 124 nm";
            }
            ctitle = "BREF: Base Reflectivity";
            cunit = "dBz";
            cname = "BaseReflectivity";

        } else if (prod_type == BaseReflect248) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Reflct 248 " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(20, prod_elevation/10);
            ctitle = "BREF: 248 nm Base Reflectivity";
            cunit = "dBz";
            cname = "BaseReflectivity248";
            summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 248 nm";
            t1 = 248.0 * 1.853 / 111.26;
            t2 = 460 / (111.26 * Math.cos(Math.toRadians(latitude)));
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Comp_Reflect) {
            radial               = 3;
            prod_elevation  = -1;

            ctilt = pname_lookup(pinfo.pcode, elevationNumber);
            if(pinfo.pcode == 36 || pinfo.pcode == 38 ) {
                 t1 = t1 * 2;
                 t2 = t2 * 2;
                 lat_min = latitude -  t1;
                 lat_max = latitude + t1;
                 lon_min = longitude + t2;
                 lon_max = longitude - t2;
            }
            summary = ctilt + "is a raster image of composite reflectivity";
            cmemo = "Composite Reflectivity at " + cmode[pinfo.opmode];
            ctitle = "CREF Composite Reflectivity" + ctilt;
            cunit = "dBz" ;
            cname = "BaseReflectivityComp";
        } else if (prod_type == Layer_Reflect_Avg ||
                 prod_type == Layer_Reflect_Max)   {
            radial               = 3;
            prod_elevation  = pinfo.p5;
            prod_top        = pinfo.p6;
            ctilt = pname_lookup(pcode, 0);
            summary = ctilt + " is a raster image of composite reflectivity at range 124 nm";
            cmemo = "Layer Reflct " + prod_elevation + " - " + prod_top + cmode[pinfo.opmode];
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude - t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
            ctitle = "LREF: Layer Composite Reflectivity" ;
            cunit = "dBz" ;
            cname = "LayerCompReflect";
        } else if (prod_type == EnhancedEcho_Tops) {
            radial          = 1;
            prod_elevation  = -1;
            summary = "EET is a radial image of echo tops at range 186 nm";
            cmemo = "Enhanced Echo Tops [K FT] " + cmode[pinfo.opmode];
            ctilt = pname_lookup(135, elevationNumber);
            ctitle = "TOPS: Enhanced Echo Tops";
            cunit = "K FT" ;
            cname = "EnhancedEchoTop";
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Echo_Tops) {
            radial          = 3;
            prod_elevation  = -1;
            summary = "NET is a raster image of echo tops at range 124 nm";
            cmemo = "Echo Tops [K FT] " + cmode[pinfo.opmode];
            ctilt = pname_lookup(41, elevationNumber);
            ctitle = "TOPS: Echo Tops";
            cunit = "K FT" ;
            cname = "EchoTop";
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Precip_1)   {
            radial               = 1;
            prod_elevation  = -1;
            prod_max       /= 10;
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "N1P is a raster image of 1 hour surface rainfall accumulation at range 124 nm";
            cmemo = "1-hr Rainfall [IN] " + cmode[pinfo.opmode];
            ctilt = pname_lookup(78, elevationNumber);
            ctitle = "PRE1: Surface 1-hour Rainfall Total";
            cunit = "IN";
            cname = "Precip1hr";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Precip_3)   {
            radial               = 1;
            prod_elevation  = -1;
            prod_max       /= 10;
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "N3P is a raster image of 3 hour surface rainfall accumulation at range 124 nm";
            cmemo = "3-hr Rainfall [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(79, elevationNumber);
            ctitle = "PRE3: Surface 3-hour Rainfall Total" ;
            cunit = "IN" ;
            cname = "Precip3hr";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == DigitalStormTotalPrecip) {
            radial               = 1;
            prod_elevation  = -1;
            //startDate = getDate( pinfo.p5, pinfo.p6 * 60 * 1000);
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "DSP is a radial image of digital storm total rainfall";
            cmemo = "Digital Strm Total Precip [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(80, elevationNumber);
            ctitle = "DPRE: Digital Storm Total Rainfall" ;
            cunit = "IN" ;
            cname = "DigitalPrecip";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Precip_Accum) {
            radial               = 1;
            prod_elevation  = -1;
            //startDate = getDate( pinfo.p5, pinfo.p6 * 60 * 1000);
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "NTP is a raster image of storm total rainfall accumulation at range 124 nm";
            cmemo = "Strm Tot Rain [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(80, elevationNumber);
            ctitle = "PRET: Surface Storm Total Rainfall" ;
            cunit = "IN" ;
            cname = "PrecipAccum";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
         } else if (prod_type == Precip_Array) {
            radial          = 3;
            prod_elevation  = -1;
            summary = "DPA is a raster image of hourly digital precipitation array at range 124 nm";
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            cmemo = "Precip Array [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(81, elevationNumber);
            ctitle = "PRET: Hourly Digital Precipitation Array" ;
            cunit = "dBA" ;
            cname = "PrecipArray";
        } else if (prod_type == Vert_Liquid) {
            radial               = 3;
            prod_elevation  = -1;
            summary = "NVL is a raster image of verticalintegrated liguid at range 124 nm";
            cmemo = "Vert Int Lq H2O [mm] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(57, elevationNumber);
            ctitle =  "VIL: Vertically-integrated Liquid Water" ;
            cunit =  "kg/m^2" ;
            cname = "VertLiquid";
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Velocity || prod_type == Velocity1) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            prod_min        = pinfo.p4;
            prod_max        = pinfo.p5;
            if(prod_type == Velocity) {
                ctilt = pname_lookup(pinfo.pcode, prod_elevation/10);
            }
            else {
                ctilt = "V" + prod_elevation/10;
            }

            if(pinfo.pcode == 25) {
                t1 = 32.0 * 1.853 / 111.26;
                t2 = 64 / (111.26 * Math.cos(Math.toRadians(latitude)));
                lat_min = latitude -  t1;
                lat_max = latitude + t1;
                lon_min = longitude + t2;
                lon_max = longitude - t2;
                summary = ctilt + " is a radial image of base velocity" + (prod_elevation/10 + 1) +  " and  range 32 nm";
                cunit = "m/s";
            }
            else {
                summary = ctilt + " is a radial image of base velocity at tilt " + (prod_elevation/10 + 1);
                cunit = "m/s";
            }
            cmemo = "Rad Vel "+ prod_elevation/10. + " DEG " + cmode[pinfo.opmode];
            ctitle = "VEL: Radial Velocity" ;
            cname = "RadialVelocity";
        } else if (prod_type == StrmRelMeanVel) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            prod_min        = pinfo.p4;
            prod_max        = pinfo.p5;
            ctilt = pname_lookup(56, prod_elevation/10);
            summary = ctilt + " is a radial image of storm relative mean radial velocity at tilt " + (prod_elevation/10 + 1) +  " and  range 124 nm";
            cmemo = "StrmRelMnVl " + prod_elevation/10. + " DEG " + cmode[pinfo.opmode];
            ctitle = "SRMV: Storm Relative Mean Velocity" ;
            cunit = "KT" ;
            cname = "StormMeanVelocity";
        } else if (prod_type == VAD) {
            radial               = 0;
            prod_elevation  = pinfo.p3;
            prod_min        = pinfo.p4;
            prod_max        = pinfo.p5;
            summary = "NVW is VAD wind profile which contains wind barbs and alpha numeric data";
            cmemo = "StrmRelMnVl " + prod_elevation/10. + " DEG " + cmode[pinfo.opmode];
            ctilt = pname_lookup(48, elevationNumber);
            ctitle = "SRMV: Velocity Azimuth Display" ;
            cunit = "KT" ;
            cname = "VADWindSpeed";
            lat_min = latitude;
            lat_max = latitude;
            lon_min = longitude;
            lon_max = longitude;
        } else {
            ctilt = "error";
            ctitle = "error" ;
            cunit = "error" ;
            cname = "error";
        }
        /* add geo global att  */
        ncfile.addAttribute(null, new Attribute("summary", "Nexrad level 3 data are WSR-88D radar products." +
                  summary ));
        ncfile.addAttribute(null, new Attribute("keywords_vocabulary", ctilt));
        ncfile.addAttribute(null, new Attribute("conventions", _Coordinate.Convention));
        ncfile.addAttribute(null, new Attribute("format", "Level3/NIDS"));
        ncfile.addAttribute(null, new Attribute("geospatial_lat_min", new Float(lat_min)));
        ncfile.addAttribute(null, new Attribute("geospatial_lat_max", new Float(lat_max)));
        ncfile.addAttribute(null, new Attribute("geospatial_lon_min", new Float(lon_min)));
        ncfile.addAttribute(null, new Attribute("geospatial_lon_max", new Float(lon_max)));
        ncfile.addAttribute(null, new Attribute("geospatial_vertical_min", new Float(height)));
        ncfile.addAttribute(null, new Attribute("geospatial_vertical_max", new Float(height)));

        ncfile.addAttribute(null, new Attribute("RadarElevationNumber", new Integer(prod_elevation)));
        dstring = formatter.toDateTimeStringISO(startDate);
        ncfile.addAttribute(null, new Attribute("time_coverage_start", dstring));
        dstring = formatter.toDateTimeStringISO(endDate);
        ncfile.addAttribute(null, new Attribute("time_coverage_end", dstring));
        ncfile.addAttribute(null, new Attribute("data_min", new Float(prod_min)));
        ncfile.addAttribute(null, new Attribute("data_max", new Float(prod_max)));
        ncfile.addAttribute(null, new Attribute("isRadial", new Integer(radial)));
    }
void setProductInfo(int prod_type, Pinfo pinfo)
    {
                                 /* memo field                */
        String[] cmode = new String[]{"Maintenance", "Clear Air", "Precip Mode"};

        short prod_max = pinfo.p4;
        short prod_min = 0;
        int prod_elevation = 0;
        //int prod_info;
        int prod_top;
        int radial = 0;
        String summary = null;
        java.util.Date endDate;
        java.util.Date startDate;
        String dstring;
        double t1 = 124.0 * 1.853 / 111.26;
        double t2 = 230 / (111.26 * Math.cos(Math.toRadians(latitude)));
        lat_min = latitude -  t1;
        lat_max = latitude + t1;
        lon_min = longitude +  t2; //* Math.cos(Math.toRadians(lat_min));
        lon_max = longitude -  t2; //* Math.cos(Math.toRadians(lat_min));
        startDate = getDate( volumeScanDate, volumeScanTime*1000);
        endDate = getDate( volumeScanDate, volumeScanTime*1000);

        if (prod_type == SPECTRUM) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Specturm Width " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(pcode, prod_elevation/10);
            ctitle = "BREF: Base Spectrum Width";
            cunit = "Knots";
            cname = "SpectrumWidth";
            summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 124 nm";
            if(pcode == 28 ){
                t1 = t1 * 0.25;
                t2 = t2 * 0.25;
                lat_min = latitude -  t1;
                lat_max = latitude + t1;
                lon_min = longitude +  t2; //* Math.cos(Math.toRadians(lat_min));
                lon_max = longitude -  t2; //* Math.cos(Math.toRadians(lat_min));
                summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 32 nm";
            }
        }
        else if (prod_type == DigitalDifferentialReflectivity) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Differential Reflectivity " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(15, pLevel);

            ctitle = "Dualpol: Digital Differential Reflectivity";
            cunit = "dBz";
            cname = "DifferentialReflectivity";
            summary = ctilt + " is a radial image of dual pol differential reflectivity field and its range 162 nm";

        }
        else if (prod_type == DigitalCorrelationCoefficient) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Correlation Coefficient " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(16, pLevel);

            ctitle = "Dualpol: Digital Correlation Coefficient";
            cunit = " ";
            cname = "CorrelationCoefficient";
            summary = ctilt + " is a radial image of dual pol Correlation Coefficient field and its range 162 nm";

        }
        else if (prod_type == DigitalDifferentialPhase) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Differential Phase " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(17, pLevel);


            ctitle = "Dualpol: Digital Differential Phase";
            cunit = "Degree/km";
            cname = "DifferentialPhase";
            summary = ctilt + " is a radial image of dual pol Differential Phase field and its range 162 nm";

        }
        else if (prod_type == HydrometeorClassification ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Hydrometeor Classification " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(18, pLevel);


            ctitle = "Dualpol: Hydrometeor Classification";
            cunit = " ";
            cname = "HydrometeorClassification";
            summary = ctilt + " is a radial image of dual pol Hydrometeor Classification field and its range 162 nm";

        }
        else if (prod_type == HypridHydrometeorClassification ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Hyprid Hydrometeor Classification " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(18, pLevel);


            ctitle = "Dualpol: Hyprid Hydrometeor Classification";
            cunit = " ";
            cname = "HypridHydrometeorClassification";
            summary = ctilt + " is a radial image of dual pol Hyprid Hydrometeor Classification field and its range 162 nm";

        }
        else if (prod_type == OneHourAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "One Hour Accumulation " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];
            ctilt = "OHA";
            ctitle = "Dualpol: One Hour Accumulation";
            cunit = "IN";
            cname = "OneHourAccumulation";
            summary = ctilt + " is a radial image of dual pol One Hour Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalAccumulationArray ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Accumulation Array " + cmode[pinfo.opmode];
            ctilt = "DAA";
            ctitle = "Dualpol: Digital Accumulation Array";
            cunit = "IN";
            cname = "DigitalAccumulationArray";
            summary = ctilt + " is a radial image of dual pol Digital Accumulation Array field and its range 124 nm";
        }
        else if (prod_type == StormTotalAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Storm Total Accumulation " +  cmode[pinfo.opmode];
            ctilt = "PTA";
            ctitle = "Dualpol: Storm Total Accumulation";
            cunit = "IN";
            cname = "StormTotalAccumulation";
            summary = ctilt + " is a radial image of dual pol Storm Total Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalStormTotalAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Storm Total Accumulation  " +  cmode[pinfo.opmode];
            ctilt = "DTA";
            ctitle = "Dualpol: Digital Storm Total Accumulation";
            cunit = "IN";
            cname = "DigitalStormTotalAccumulation";
            summary = ctilt + " is a radial image of dual pol Digital StormTotal Accumulation field and its range 124 nm";
        }
        else if (prod_type == Accumulation3Hour ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Hyprid Hydrometeor Classification " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];
            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(18, pLevel);
            ctitle = "Dualpol: 3-hour Accumulation";
            cunit = "IN";
            cname = "Accumulation3Hour";
            summary = ctilt + " is a radial image of dual pol 3-hour Accumulation field and its range 124 nm";

        }
        else if (prod_type == Digital1HourDifferenceAccumulation) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital One Hour Difference Accumulation "  + cmode[pinfo.opmode];
            ctilt = "DOD";
            ctitle = "Dualpol: Digital One Hour Difference Accumulation";
            cunit = "IN";
            cname = "Digital1HourDifferenceAccumulation";
            summary = ctilt + " is a radial image of dual pol Digital One Hour Difference Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalTotalDifferenceAccumulation ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Total Difference Accumulation " + cmode[pinfo.opmode];
            ctilt = "DSD";
            ctitle = "Dualpol: Digital Total Difference Accumulation";
            cunit = "IN";
            cname = "DigitalTotalDifferenceAccumulation";
            summary = ctilt + " is a radial image of dual pol Digital Total Difference Accumulation field and its range 124 nm";
        }
        else if (prod_type == DigitalInstantaneousPrecipitationRate ) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Instantaneous Precipitation Rate " + cmode[pinfo.opmode];
            ctilt = "DPR";
            ctitle = "Dualpol: Digital Instantaneous Precipitation Rate";
            cunit = "IN/Hour";
            cname = "DigitalInstantaneousPrecipitationRate";
            summary = ctilt + " is a radial image of dual pol Digital Instantaneous Precipitation Rate field and its range 124 nm";
        }
        else if (prod_type == BaseReflectivityDR) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Reflectivity DR " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(94, pLevel);

            ctitle = "HighResolution: Base Reflectivity";
            cunit = "dBz";
            cname = "BaseReflectivityDR";
            summary = ctilt + " is a radial image of base reflectivity field and its range 248 nm";

        }
        else if (prod_type == BaseVelocityDV) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Velocity DR " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            int pLevel = getProductLevel(prod_elevation);
            ctilt = pname_lookup(99, pLevel);

            ctitle = "HighResolution: Base Velocity";
            cunit = "m/s";
            cname = "BaseVelocityDV";
            summary = ctilt + " is a radial image of base velocity field and its range 124 nm";

        } else if (prod_type == DigitalVert_Liquid) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Hybrid Reflect " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(134, prod_elevation/10);
            ctitle = "Digital: Vertical Integ Liquid";
            cunit = "kg/m^2";
            cname = "DigitalIntegLiquid";
            summary = ctilt + " is a radial image high resolution vertical integral liquid and range 248 nm";

        }
        else if (prod_type == DigitalHybridReflect) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Digital Hybrid Reflect " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(19, prod_elevation/10);
            ctitle = "DigitalHybrid: Reflectivity";
            cunit = "dBz";
            cname = "DigitalHybridReflectivity";
            summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 124 nm";

        } else if (prod_type == Base_Reflect || prod_type == Reflect1) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Reflct " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];
            if(prod_type == Reflect1){
                ctilt = "R" + prod_elevation/10;
                summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1);
            }
            else {
                ctilt = pname_lookup(19, prod_elevation/10);
                summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 124 nm";
            }
            ctitle = "BREF: Base Reflectivity";
            cunit = "dBz";
            cname = "BaseReflectivity";

        } else if (prod_type == BaseReflect248) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            cmemo = "Base Reflct 248 " + prod_elevation/10 + " DEG " + cmode[pinfo.opmode];

            ctilt = pname_lookup(20, prod_elevation/10);
            ctitle = "BREF: 248 nm Base Reflectivity";
            cunit = "dBz";
            cname = "BaseReflectivity248";
            summary = ctilt + " is a radial image of base reflectivity at tilt " + (prod_elevation/10 + 1) +  " and range 248 nm";
            t1 = 248.0 * 1.853 / 111.26;
            t2 = 460 / (111.26 * Math.cos(Math.toRadians(latitude)));
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Comp_Reflect) {
            radial               = 3;
            prod_elevation  = -1;

            ctilt = pname_lookup(pinfo.pcode, elevationNumber);
            if(pinfo.pcode == 36 || pinfo.pcode == 38 ) {
                 t1 = t1 * 2;
                 t2 = t2 * 2;
                 lat_min = latitude -  t1;
                 lat_max = latitude + t1;
                 lon_min = longitude + t2;
                 lon_max = longitude - t2;
            }
            summary = ctilt + "is a raster image of composite reflectivity";
            cmemo = "Composite Reflectivity at " + cmode[pinfo.opmode];
            ctitle = "CREF Composite Reflectivity" + ctilt;
            cunit = "dBz" ;
            cname = "BaseReflectivityComp";
        } else if (prod_type == Layer_Reflect_Avg ||
                 prod_type == Layer_Reflect_Max)   {
            radial               = 3;
            prod_elevation  = pinfo.p5;
            prod_top        = pinfo.p6;
            ctilt = pname_lookup(pcode, 0);
            summary = ctilt + " is a raster image of composite reflectivity at range 124 nm";
            cmemo = "Layer Reflct " + prod_elevation + " - " + prod_top + cmode[pinfo.opmode];
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude - t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
            ctitle = "LREF: Layer Composite Reflectivity" ;
            cunit = "dBz" ;
            cname = "LayerCompReflect";
        } else if (prod_type == EnhancedEcho_Tops) {
            radial          = 1;
            prod_elevation  = -1;
            summary = "EET is a radial image of echo tops at range 186 nm";
            cmemo = "Enhanced Echo Tops [K FT] " + cmode[pinfo.opmode];
            ctilt = pname_lookup(135, elevationNumber);
            ctitle = "TOPS: Enhanced Echo Tops";
            cunit = "K FT" ;
            cname = "EnhancedEchoTop";
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Echo_Tops) {
            radial          = 3;
            prod_elevation  = -1;
            summary = "NET is a raster image of echo tops at range 124 nm";
            cmemo = "Echo Tops [K FT] " + cmode[pinfo.opmode];
            ctilt = pname_lookup(41, elevationNumber);
            ctitle = "TOPS: Echo Tops";
            cunit = "K FT" ;
            cname = "EchoTop";
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Precip_1)   {
            radial               = 1;
            prod_elevation  = -1;
            prod_max       /= 10;
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "N1P is a raster image of 1 hour surface rainfall accumulation at range 124 nm";
            cmemo = "1-hr Rainfall [IN] " + cmode[pinfo.opmode];
            ctilt = pname_lookup(78, elevationNumber);
            ctitle = "PRE1: Surface 1-hour Rainfall Total";
            cunit = "IN";
            cname = "Precip1hr";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Precip_3)   {
            radial               = 1;
            prod_elevation  = -1;
            prod_max       /= 10;
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "N3P is a raster image of 3 hour surface rainfall accumulation at range 124 nm";
            cmemo = "3-hr Rainfall [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(79, elevationNumber);
            ctitle = "PRE3: Surface 3-hour Rainfall Total" ;
            cunit = "IN" ;
            cname = "Precip3hr";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == DigitalStormTotalPrecip) {
            radial               = 1;
            prod_elevation  = -1;
            //startDate = getDate( pinfo.p5, pinfo.p6 * 60 * 1000);
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "DSP is a radial image of digital storm total rainfall";
            cmemo = "Digital Strm Total Precip [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(80, elevationNumber);
            ctitle = "DPRE: Digital Storm Total Rainfall" ;
            cunit = "IN" ;
            cname = "DigitalPrecip";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Precip_Accum) {
            radial               = 1;
            prod_elevation  = -1;
            //startDate = getDate( pinfo.p5, pinfo.p6 * 60 * 1000);
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            summary = "NTP is a raster image of storm total rainfall accumulation at range 124 nm";
            cmemo = "Strm Tot Rain [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(80, elevationNumber);
            ctitle = "PRET: Surface Storm Total Rainfall" ;
            cunit = "IN" ;
            cname = "PrecipAccum";
            t1 = t1 * 2;
            t2 = t2 * 2;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
         } else if (prod_type == Precip_Array) {
            radial          = 3;
            prod_elevation  = -1;
            summary = "DPA is a raster image of hourly digital precipitation array at range 124 nm";
            endDate = getDate( pinfo.p7, pinfo.p8 * 60 * 1000);
            cmemo = "Precip Array [IN] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(81, elevationNumber);
            ctitle = "PRET: Hourly Digital Precipitation Array" ;
            cunit = "dBA" ;
            cname = "PrecipArray";
        } else if (prod_type == Vert_Liquid) {
            radial               = 3;
            prod_elevation  = -1;
            summary = "NVL is a raster image of verticalintegrated liguid at range 124 nm";
            cmemo = "Vert Int Lq H2O [mm] " + cmode[pinfo.opmode] ;
            ctilt = pname_lookup(57, elevationNumber);
            ctitle =  "VIL: Vertically-integrated Liquid Water" ;
            cunit =  "kg/m^2" ;
            cname = "VertLiquid";
            t1 = t1 * 4;
            t2 = t2 * 4;
            lat_min = latitude -  t1;
            lat_max = latitude + t1;
            lon_min = longitude + t2;
            lon_max = longitude - t2;
        } else if (prod_type == Velocity || prod_type == Velocity1) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            prod_min        = pinfo.p4;
            prod_max        = pinfo.p5;
            if(prod_type == Velocity) {
                ctilt = pname_lookup(pinfo.pcode, prod_elevation/10);
            }
            else {
                ctilt = "V" + prod_elevation/10;
            }

            if(pinfo.pcode == 25) {
                t1 = 32.0 * 1.853 / 111.26;
                t2 = 64 / (111.26 * Math.cos(Math.toRadians(latitude)));
                lat_min = latitude -  t1;
                lat_max = latitude + t1;
                lon_min = longitude + t2;
                lon_max = longitude - t2;
                summary = ctilt + " is a radial image of base velocity" + (prod_elevation/10 + 1) +  " and  range 32 nm";
                cunit = "m/s";
            }
            else {
                summary = ctilt + " is a radial image of base velocity at tilt " + (prod_elevation/10 + 1);
                cunit = "m/s";
            }
            cmemo = "Rad Vel "+ prod_elevation/10. + " DEG " + cmode[pinfo.opmode];
            ctitle = "VEL: Radial Velocity" ;
            cname = "RadialVelocity";
        } else if (prod_type == StrmRelMeanVel) {
            radial               = 1;
            prod_elevation  = pinfo.p3;
            prod_min        = pinfo.p4;
            prod_max        = pinfo.p5;
            ctilt = pname_lookup(56, prod_elevation/10);
            summary = ctilt + " is a radial image of storm relative mean radial velocity at tilt " + (prod_elevation/10 + 1) +  " and  range 124 nm";
            cmemo = "StrmRelMnVl " + prod_elevation/10. + " DEG " + cmode[pinfo.opmode];
            ctitle = "SRMV: Storm Relative Mean Velocity" ;
            cunit = "KT" ;
            cname = "StormMeanVelocity";
        } else if (prod_type == VAD) {
            radial               = 0;
            prod_elevation  = pinfo.p3;
            prod_min        = pinfo.p4;
            prod_max        = pinfo.p5;
            summary = "NVW is VAD wind profile which contains wind barbs and alpha numeric data";
            cmemo = "StrmRelMnVl " + prod_elevation/10. + " DEG " + cmode[pinfo.opmode];
            ctilt = pname_lookup(48, elevationNumber);
            ctitle = "SRMV: Velocity Azimuth Display" ;
            cunit = "KT" ;
            cname = "VADWindSpeed";
            lat_min = latitude;
            lat_max = latitude;
            lon_min = longitude;
            lon_max = longitude;
        } else {
            ctilt = "error";
            ctitle = "error" ;
            cunit = "error" ;
            cname = "error";
        }
        /* add geo global att  */
        ncfile.addAttribute(null, new Attribute("summary", "Nexrad level 3 data are WSR-88D radar products." +
                  summary ));
        ncfile.addAttribute(null, new Attribute("keywords_vocabulary", ctilt));
        ncfile.addAttribute(null, new Attribute("conventions", _Coordinate.Convention));
        ncfile.addAttribute(null, new Attribute("format", "Level3/NIDS"));
        ncfile.addAttribute(null, new Attribute("geospatial_lat_min", new Float(lat_min)));
        ncfile.addAttribute(null, new Attribute("geospatial_lat_max", new Float(lat_max)));
        ncfile.addAttribute(null, new Attribute("geospatial_lon_min", new Float(lon_min)));
        ncfile.addAttribute(null, new Attribute("geospatial_lon_max", new Float(lon_max)));
        ncfile.addAttribute(null, new Attribute("geospatial_vertical_min", new Float(height)));
        ncfile.addAttribute(null, new Attribute("geospatial_vertical_max", new Float(height)));

        ncfile.addAttribute(null, new Attribute("RadarElevationNumber", new Integer(prod_elevation)));
        dstring = formatter.toDateTimeStringISO(startDate);
        ncfile.addAttribute(null, new Attribute("time_coverage_start", dstring));
        dstring = formatter.toDateTimeStringISO(endDate);
        ncfile.addAttribute(null, new Attribute("time_coverage_end", dstring));
        ncfile.addAttribute(null, new Attribute("data_min", new Float(prod_min)));
        ncfile.addAttribute(null, new Attribute("data_max", new Float(prod_max)));
        ncfile.addAttribute(null, new Attribute("isRadial", new Integer(radial)));
    }
void setProductInfo ( int prod_type , Pinfo pinfo ) { /* memo field                */ String [ ] cmode = new String [ ] { "Maintenance" , "Clear Air" , "Precip Mode" } ; short prod_max = pinfo . p4 ; short prod_min = 0 ; int prod_elevation = 0 ; //int prod_info;
 int prod_top ; int radial = 0 ; String summary = null ; java . util . Date endDate ; java . util . Date startDate ; String dstring ; double t1 = 124.0 * 1.853 / 111.26 ; double t2 = 230 / ( 111.26 * Math . cos ( Math . toRadians ( latitude ) ) ) ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; //* Math.cos(Math.toRadians(lat_min));
 lon_max = longitude - t2 ; //* Math.cos(Math.toRadians(lat_min));
 startDate = getDate ( volumeScanDate , volumeScanTime * 1000 ) ; endDate = getDate ( volumeScanDate , volumeScanTime * 1000 ) ; if ( prod_type == SPECTRUM ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Base Specturm Width " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( pcode , prod_elevation / 10 ) ; ctitle = "BREF: Base Spectrum Width" ; cunit = "Knots" ; cname = "SpectrumWidth" ; summary = ctilt + " is a radial image of base reflectivity at tilt " + ( prod_elevation / 10 + 1 ) + " and range 124 nm" ; if ( pcode == 28 ) { t1 = t1 * 0.25 ; t2 = t2 * 0.25 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; //* Math.cos(Math.toRadians(lat_min));
 lon_max = longitude - t2 ; //* Math.cos(Math.toRadians(lat_min));
 summary = ctilt + " is a radial image of base reflectivity at tilt " + ( prod_elevation / 10 + 1 ) + " and range 32 nm" ; } } else if ( prod_type == DigitalDifferentialReflectivity ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Differential Reflectivity " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 15 , pLevel ) ; ctitle = "Dualpol: Digital Differential Reflectivity" ; cunit = "dBz" ; cname = "DifferentialReflectivity" ; summary = ctilt + " is a radial image of dual pol differential reflectivity field and its range 162 nm" ; } else if ( prod_type == DigitalCorrelationCoefficient ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Correlation Coefficient " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 16 , pLevel ) ; ctitle = "Dualpol: Digital Correlation Coefficient" ; cunit = " " ; cname = "CorrelationCoefficient" ; summary = ctilt + " is a radial image of dual pol Correlation Coefficient field and its range 162 nm" ; } else if ( prod_type == DigitalDifferentialPhase ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Differential Phase " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 17 , pLevel ) ; ctitle = "Dualpol: Digital Differential Phase" ; cunit = "Degree/km" ; cname = "DifferentialPhase" ; summary = ctilt + " is a radial image of dual pol Differential Phase field and its range 162 nm" ; } else if ( prod_type == HydrometeorClassification ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Hydrometeor Classification " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 18 , pLevel ) ; ctitle = "Dualpol: Hydrometeor Classification" ; cunit = " " ; cname = "HydrometeorClassification" ; summary = ctilt + " is a radial image of dual pol Hydrometeor Classification field and its range 162 nm" ; } else if ( prod_type == HypridHydrometeorClassification ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Hyprid Hydrometeor Classification " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 18 , pLevel ) ; ctitle = "Dualpol: Hyprid Hydrometeor Classification" ; cunit = " " ; cname = "HypridHydrometeorClassification" ; summary = ctilt + " is a radial image of dual pol Hyprid Hydrometeor Classification field and its range 162 nm" ; } else if ( prod_type == OneHourAccumulation ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "One Hour Accumulation " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; ctilt = "OHA" ; ctitle = "Dualpol: One Hour Accumulation" ; cunit = "IN" ; cname = "OneHourAccumulation" ; summary = ctilt + " is a radial image of dual pol One Hour Accumulation field and its range 124 nm" ; } else if ( prod_type == DigitalAccumulationArray ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Digital Accumulation Array " + cmode [ pinfo . opmode ] ; ctilt = "DAA" ; ctitle = "Dualpol: Digital Accumulation Array" ; cunit = "IN" ; cname = "DigitalAccumulationArray" ; summary = ctilt + " is a radial image of dual pol Digital Accumulation Array field and its range 124 nm" ; } else if ( prod_type == StormTotalAccumulation ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Storm Total Accumulation " + cmode [ pinfo . opmode ] ; ctilt = "PTA" ; ctitle = "Dualpol: Storm Total Accumulation" ; cunit = "IN" ; cname = "StormTotalAccumulation" ; summary = ctilt + " is a radial image of dual pol Storm Total Accumulation field and its range 124 nm" ; } else if ( prod_type == DigitalStormTotalAccumulation ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Digital Storm Total Accumulation  " + cmode [ pinfo . opmode ] ; ctilt = "DTA" ; ctitle = "Dualpol: Digital Storm Total Accumulation" ; cunit = "IN" ; cname = "DigitalStormTotalAccumulation" ; summary = ctilt + " is a radial image of dual pol Digital StormTotal Accumulation field and its range 124 nm" ; } else if ( prod_type == Accumulation3Hour ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Hyprid Hydrometeor Classification " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 18 , pLevel ) ; ctitle = "Dualpol: 3-hour Accumulation" ; cunit = "IN" ; cname = "Accumulation3Hour" ; summary = ctilt + " is a radial image of dual pol 3-hour Accumulation field and its range 124 nm" ; } else if ( prod_type == Digital1HourDifferenceAccumulation ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Digital One Hour Difference Accumulation " + cmode [ pinfo . opmode ] ; ctilt = "DOD" ; ctitle = "Dualpol: Digital One Hour Difference Accumulation" ; cunit = "IN" ; cname = "Digital1HourDifferenceAccumulation" ; summary = ctilt + " is a radial image of dual pol Digital One Hour Difference Accumulation field and its range 124 nm" ; } else if ( prod_type == DigitalTotalDifferenceAccumulation ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Digital Total Difference Accumulation " + cmode [ pinfo . opmode ] ; ctilt = "DSD" ; ctitle = "Dualpol: Digital Total Difference Accumulation" ; cunit = "IN" ; cname = "DigitalTotalDifferenceAccumulation" ; summary = ctilt + " is a radial image of dual pol Digital Total Difference Accumulation field and its range 124 nm" ; } else if ( prod_type == DigitalInstantaneousPrecipitationRate ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Digital Instantaneous Precipitation Rate " + cmode [ pinfo . opmode ] ; ctilt = "DPR" ; ctitle = "Dualpol: Digital Instantaneous Precipitation Rate" ; cunit = "IN/Hour" ; cname = "DigitalInstantaneousPrecipitationRate" ; summary = ctilt + " is a radial image of dual pol Digital Instantaneous Precipitation Rate field and its range 124 nm" ; } else if ( prod_type == BaseReflectivityDR ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Base Reflectivity DR " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 94 , pLevel ) ; ctitle = "HighResolution: Base Reflectivity" ; cunit = "dBz" ; cname = "BaseReflectivityDR" ; summary = ctilt + " is a radial image of base reflectivity field and its range 248 nm" ; } else if ( prod_type == BaseVelocityDV ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Base Velocity DR " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; int pLevel = getProductLevel ( prod_elevation ) ; ctilt = pname_lookup ( 99 , pLevel ) ; ctitle = "HighResolution: Base Velocity" ; cunit = "m/s" ; cname = "BaseVelocityDV" ; summary = ctilt + " is a radial image of base velocity field and its range 124 nm" ; } else if ( prod_type == DigitalVert_Liquid ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Digital Hybrid Reflect " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 134 , prod_elevation / 10 ) ; ctitle = "Digital: Vertical Integ Liquid" ; cunit = "kg/m^2" ; cname = "DigitalIntegLiquid" ; summary = ctilt + " is a radial image high resolution vertical integral liquid and range 248 nm" ; } else if ( prod_type == DigitalHybridReflect ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Digital Hybrid Reflect " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 19 , prod_elevation / 10 ) ; ctitle = "DigitalHybrid: Reflectivity" ; cunit = "dBz" ; cname = "DigitalHybridReflectivity" ; summary = ctilt + " is a radial image of base reflectivity at tilt " + ( prod_elevation / 10 + 1 ) + " and range 124 nm" ; } else if ( prod_type == Base_Reflect || prod_type == Reflect1 ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Base Reflct " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; if ( prod_type == Reflect1 ) { ctilt = "R" + prod_elevation / 10 ; summary = ctilt + " is a radial image of base reflectivity at tilt " + ( prod_elevation / 10 + 1 ) ; } else { ctilt = pname_lookup ( 19 , prod_elevation / 10 ) ; summary = ctilt + " is a radial image of base reflectivity at tilt " + ( prod_elevation / 10 + 1 ) + " and range 124 nm" ; } ctitle = "BREF: Base Reflectivity" ; cunit = "dBz" ; cname = "BaseReflectivity" ; } else if ( prod_type == BaseReflect248 ) { radial = 1 ; prod_elevation = pinfo . p3 ; cmemo = "Base Reflct 248 " + prod_elevation / 10 + " DEG " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 20 , prod_elevation / 10 ) ; ctitle = "BREF: 248 nm Base Reflectivity" ; cunit = "dBz" ; cname = "BaseReflectivity248" ; summary = ctilt + " is a radial image of base reflectivity at tilt " + ( prod_elevation / 10 + 1 ) + " and range 248 nm" ; t1 = 248.0 * 1.853 / 111.26 ; t2 = 460 / ( 111.26 * Math . cos ( Math . toRadians ( latitude ) ) ) ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == Comp_Reflect ) { radial = 3 ; prod_elevation = - 1 ; ctilt = pname_lookup ( pinfo . pcode , elevationNumber ) ; if ( pinfo . pcode == 36 || pinfo . pcode == 38 ) { t1 = t1 * 2 ; t2 = t2 * 2 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } summary = ctilt + "is a raster image of composite reflectivity" ; cmemo = "Composite Reflectivity at " + cmode [ pinfo . opmode ] ; ctitle = "CREF Composite Reflectivity" + ctilt ; cunit = "dBz" ; cname = "BaseReflectivityComp" ; } else if ( prod_type == Layer_Reflect_Avg || prod_type == Layer_Reflect_Max ) { radial = 3 ; prod_elevation = pinfo . p5 ; prod_top = pinfo . p6 ; ctilt = pname_lookup ( pcode , 0 ) ; summary = ctilt + " is a raster image of composite reflectivity at range 124 nm" ; cmemo = "Layer Reflct " + prod_elevation + " - " + prod_top + cmode [ pinfo . opmode ] ; t1 = t1 * 4 ; t2 = t2 * 4 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; ctitle = "LREF: Layer Composite Reflectivity" ; cunit = "dBz" ; cname = "LayerCompReflect" ; } else if ( prod_type == EnhancedEcho_Tops ) { radial = 1 ; prod_elevation = - 1 ; summary = "EET is a radial image of echo tops at range 186 nm" ; cmemo = "Enhanced Echo Tops [K FT] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 135 , elevationNumber ) ; ctitle = "TOPS: Enhanced Echo Tops" ; cunit = "K FT" ; cname = "EnhancedEchoTop" ; t1 = t1 * 4 ; t2 = t2 * 4 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == Echo_Tops ) { radial = 3 ; prod_elevation = - 1 ; summary = "NET is a raster image of echo tops at range 124 nm" ; cmemo = "Echo Tops [K FT] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 41 , elevationNumber ) ; ctitle = "TOPS: Echo Tops" ; cunit = "K FT" ; cname = "EchoTop" ; t1 = t1 * 4 ; t2 = t2 * 4 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == Precip_1 ) { radial = 1 ; prod_elevation = - 1 ; prod_max /= 10 ; endDate = getDate ( pinfo . p7 , pinfo . p8 * 60 * 1000 ) ; summary = "N1P is a raster image of 1 hour surface rainfall accumulation at range 124 nm" ; cmemo = "1-hr Rainfall [IN] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 78 , elevationNumber ) ; ctitle = "PRE1: Surface 1-hour Rainfall Total" ; cunit = "IN" ; cname = "Precip1hr" ; t1 = t1 * 2 ; t2 = t2 * 2 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == Precip_3 ) { radial = 1 ; prod_elevation = - 1 ; prod_max /= 10 ; endDate = getDate ( pinfo . p7 , pinfo . p8 * 60 * 1000 ) ; summary = "N3P is a raster image of 3 hour surface rainfall accumulation at range 124 nm" ; cmemo = "3-hr Rainfall [IN] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 79 , elevationNumber ) ; ctitle = "PRE3: Surface 3-hour Rainfall Total" ; cunit = "IN" ; cname = "Precip3hr" ; t1 = t1 * 2 ; t2 = t2 * 2 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == DigitalStormTotalPrecip ) { radial = 1 ; prod_elevation = - 1 ; //startDate = getDate( pinfo.p5, pinfo.p6 * 60 * 1000);
 endDate = getDate ( pinfo . p7 , pinfo . p8 * 60 * 1000 ) ; summary = "DSP is a radial image of digital storm total rainfall" ; cmemo = "Digital Strm Total Precip [IN] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 80 , elevationNumber ) ; ctitle = "DPRE: Digital Storm Total Rainfall" ; cunit = "IN" ; cname = "DigitalPrecip" ; t1 = t1 * 2 ; t2 = t2 * 2 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == Precip_Accum ) { radial = 1 ; prod_elevation = - 1 ; //startDate = getDate( pinfo.p5, pinfo.p6 * 60 * 1000);
 endDate = getDate ( pinfo . p7 , pinfo . p8 * 60 * 1000 ) ; summary = "NTP is a raster image of storm total rainfall accumulation at range 124 nm" ; cmemo = "Strm Tot Rain [IN] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 80 , elevationNumber ) ; ctitle = "PRET: Surface Storm Total Rainfall" ; cunit = "IN" ; cname = "PrecipAccum" ; t1 = t1 * 2 ; t2 = t2 * 2 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == Precip_Array ) { radial = 3 ; prod_elevation = - 1 ; summary = "DPA is a raster image of hourly digital precipitation array at range 124 nm" ; endDate = getDate ( pinfo . p7 , pinfo . p8 * 60 * 1000 ) ; cmemo = "Precip Array [IN] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 81 , elevationNumber ) ; ctitle = "PRET: Hourly Digital Precipitation Array" ; cunit = "dBA" ; cname = "PrecipArray" ; } else if ( prod_type == Vert_Liquid ) { radial = 3 ; prod_elevation = - 1 ; summary = "NVL is a raster image of verticalintegrated liguid at range 124 nm" ; cmemo = "Vert Int Lq H2O [mm] " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 57 , elevationNumber ) ; ctitle = "VIL: Vertically-integrated Liquid Water" ; cunit = "kg/m^2" ; cname = "VertLiquid" ; t1 = t1 * 4 ; t2 = t2 * 4 ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; } else if ( prod_type == Velocity || prod_type == Velocity1 ) { radial = 1 ; prod_elevation = pinfo . p3 ; prod_min = pinfo . p4 ; prod_max = pinfo . p5 ; if ( prod_type == Velocity ) { ctilt = pname_lookup ( pinfo . pcode , prod_elevation / 10 ) ; } else { ctilt = "V" + prod_elevation / 10 ; } if ( pinfo . pcode == 25 ) { t1 = 32.0 * 1.853 / 111.26 ; t2 = 64 / ( 111.26 * Math . cos ( Math . toRadians ( latitude ) ) ) ; lat_min = latitude - t1 ; lat_max = latitude + t1 ; lon_min = longitude + t2 ; lon_max = longitude - t2 ; summary = ctilt + " is a radial image of base velocity" + ( prod_elevation / 10 + 1 ) + " and  range 32 nm" ; cunit = "m/s" ; } else { summary = ctilt + " is a radial image of base velocity at tilt " + ( prod_elevation / 10 + 1 ) ; cunit = "m/s" ; } cmemo = "Rad Vel " + prod_elevation / 10. + " DEG " + cmode [ pinfo . opmode ] ; ctitle = "VEL: Radial Velocity" ; cname = "RadialVelocity" ; } else if ( prod_type == StrmRelMeanVel ) { radial = 1 ; prod_elevation = pinfo . p3 ; prod_min = pinfo . p4 ; prod_max = pinfo . p5 ; ctilt = pname_lookup ( 56 , prod_elevation / 10 ) ; summary = ctilt + " is a radial image of storm relative mean radial velocity at tilt " + ( prod_elevation / 10 + 1 ) + " and  range 124 nm" ; cmemo = "StrmRelMnVl " + prod_elevation / 10. + " DEG " + cmode [ pinfo . opmode ] ; ctitle = "SRMV: Storm Relative Mean Velocity" ; cunit = "KT" ; cname = "StormMeanVelocity" ; } else if ( prod_type == VAD ) { radial = 0 ; prod_elevation = pinfo . p3 ; prod_min = pinfo . p4 ; prod_max = pinfo . p5 ; summary = "NVW is VAD wind profile which contains wind barbs and alpha numeric data" ; cmemo = "StrmRelMnVl " + prod_elevation / 10. + " DEG " + cmode [ pinfo . opmode ] ; ctilt = pname_lookup ( 48 , elevationNumber ) ; ctitle = "SRMV: Velocity Azimuth Display" ; cunit = "KT" ; cname = "VADWindSpeed" ; lat_min = latitude ; lat_max = latitude ; lon_min = longitude ; lon_max = longitude ; } else { ctilt = "error" ; ctitle = "error" ; cunit = "error" ; cname = "error" ; } /* add geo global att  */ ncfile . addAttribute ( null , new Attribute ( "summary" , "Nexrad level 3 data are WSR-88D radar products." + summary ) ) ; ncfile . addAttribute ( null , new Attribute ( "keywords_vocabulary" , ctilt ) ) ; ncfile . addAttribute ( null , new Attribute ( "conventions" , _Coordinate . Convention ) ) ; ncfile . addAttribute ( null , new Attribute ( "format" , "Level3/NIDS" ) ) ; ncfile . addAttribute ( null , new Attribute ( "geospatial_lat_min" , new Float ( lat_min ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "geospatial_lat_max" , new Float ( lat_max ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "geospatial_lon_min" , new Float ( lon_min ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "geospatial_lon_max" , new Float ( lon_max ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "geospatial_vertical_min" , new Float ( height ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "geospatial_vertical_max" , new Float ( height ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "RadarElevationNumber" , new Integer ( prod_elevation ) ) ) ; dstring = formatter . toDateTimeStringISO ( startDate ) ; ncfile . addAttribute ( null , new Attribute ( "time_coverage_start" , dstring ) ) ; dstring = formatter . toDateTimeStringISO ( endDate ) ; ncfile . addAttribute ( null , new Attribute ( "time_coverage_end" , dstring ) ) ; ncfile . addAttribute ( null , new Attribute ( "data_min" , new Float ( prod_min ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "data_max" , new Float ( prod_max ) ) ) ; ncfile . addAttribute ( null , new Attribute ( "isRadial" , new Integer ( radial ) ) ) ; }
parsing the product information into netcdf dataset
@param prod_type      product type
@param pinfo          product information
parsing the product information into netcdf dataset