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.data.hydra;
030    
031    import visad.Data;
032    import visad.FlatField;
033    import visad.Set;
034    import visad.CoordinateSystem;
035    import visad.RealType;
036    import visad.RealTupleType;
037    import visad.SetType;
038    import visad.Linear2DSet;
039    import visad.Unit;
040    import visad.BaseUnit;
041    import visad.OffsetUnit;
042    import visad.FunctionType;
043    import visad.VisADException;
044    import visad.data.units.Parser;
045    import java.rmi.RemoteException;
046    
047    import java.util.Hashtable;
048    import java.util.HashMap;
049    import java.util.StringTokenizer;
050    
051    import java.io.BufferedReader;
052    import java.io.FileInputStream;
053    import java.io.IOException;
054    import java.io.InputStream;
055    import java.io.InputStreamReader;
056    
057    
058    public class Calipso2D extends ProfileAlongTrack {
059    
060          double start_time;
061    
062          public Calipso2D() {
063          }
064    
065          public Calipso2D(MultiDimensionReader reader, HashMap metadata, boolean isVertTypeAlt) {
066            super(reader, metadata, isVertTypeAlt);
067          }
068    
069          public Calipso2D(MultiDimensionReader reader, HashMap metadata) {
070            super(reader, metadata);
071            HashMap table = ProfileAlongTrack.getEmptyMetadataTable();
072            table.put(ProfileAlongTrack.array_name, "Surface_Elevation");
073          }
074    
075          public float[] getVertBinAltitude() throws Exception {
076            String propertyFileName = null;
077            float[] altitude = new float[VertLen];
078            int line_cnt = 0;
079            try {
080              propertyFileName = (String) metadata.get(ancillary_file_name);
081              InputStream ios = getClass().getResourceAsStream(propertyFileName);
082              BufferedReader ancillaryReader = new BufferedReader(new InputStreamReader(ios));
083    
084              while (true) {
085                String line = ancillaryReader.readLine();
086                if (line == null) break;
087                if (line.startsWith("!")) continue;
088                StringTokenizer strTok = new StringTokenizer(line);
089                String[] tokens = new String[strTok.countTokens()];
090                int tokCnt = 0;
091                while (strTok.hasMoreElements()) {
092                  tokens[tokCnt++] = strTok.nextToken();
093                }
094                altitude[line_cnt] = (Float.valueOf(tokens[0]))*1000f;
095                line_cnt++;
096              }
097              ios.close();
098              }
099              catch (Exception e) {
100                System.out.println("fail on ancillary file read: "+propertyFileName);
101              }
102              return altitude;
103          }
104    
105          public float[] getTrackTimes() throws Exception {
106            int[] start = new int[] {0,0};
107            int[] count = new int[] {TrackLen/10, 1};
108            int[] stride = new int[] {10,1};
109            double[] times = reader.getDoubleArray((String)metadata.get(profileTime_name), start, count, stride);
110            start_time = times[0];
111            double time_inc = (times[times.length-1] - times[0])/times.length;
112            float[] new_times = new float[TrackLen];
113            for (int t=0; t<TrackLen;t++) {
114              new_times[t] = (float) times[0] + (float)(t*time_inc);
115            }
116            return new_times;
117          }
118    
119          public float[] getTrackLongitude() throws Exception {
120            int[] start = new int[] {0,0};
121            int[] count = new int[] {TrackLen, 1};
122            int[] stride = new int[] {1,1};
123            float[] vals = reader.getFloatArray((String)metadata.get(longitude_name), start, count, stride);
124            return vals;
125          }
126    
127          public float[] getTrackLatitude() throws Exception {
128            int[] start = new int[] {0,0};
129            int[] count = new int[] {TrackLen, 1};
130            int[] stride = new int[] {1,1};
131            float[] vals = reader.getFloatArray((String)metadata.get(latitude_name), start, count, stride);
132            return vals;
133          }
134    
135          public RealType makeVertLocType() throws Exception {
136            return RealType.Altitude;
137          }
138    
139          public RealType makeTrackTimeType() throws Exception {
140            OffsetUnit unit = (OffsetUnit) Parser.parse("seconds since 1993-01-01 00:00:00Z");
141            OffsetUnit new_unit = new OffsetUnit(start_time, unit);
142            RealType timeType = RealType.getRealType("Track_Time", new_unit);
143            return timeType;
144          }
145    
146          public FlatField getData(Object subset) throws Exception {
147            FlatField field = super.getData(subset);
148            return field;
149          }
150    }