001 /* 002 * $Id: Calipso2D.java,v 1.10 2012/02/19 17:35:40 davep Exp $ 003 * 004 * This file is part of McIDAS-V 005 * 006 * Copyright 2007-2012 007 * Space Science and Engineering Center (SSEC) 008 * University of Wisconsin - Madison 009 * 1225 W. Dayton Street, Madison, WI 53706, USA 010 * https://www.ssec.wisc.edu/mcidas 011 * 012 * All Rights Reserved 013 * 014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and 015 * some McIDAS-V source code is based on IDV and VisAD source code. 016 * 017 * McIDAS-V is free software; you can redistribute it and/or modify 018 * it under the terms of the GNU Lesser Public License as published by 019 * the Free Software Foundation; either version 3 of the License, or 020 * (at your option) any later version. 021 * 022 * McIDAS-V is distributed in the hope that it will be useful, 023 * but WITHOUT ANY WARRANTY; without even the implied warranty of 024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 025 * GNU Lesser Public License for more details. 026 * 027 * You should have received a copy of the GNU Lesser Public License 028 * along with this program. If not, see http://www.gnu.org/licenses. 029 */ 030 031 package edu.wisc.ssec.mcidasv.data.hydra; 032 033 import visad.Data; 034 import visad.FlatField; 035 import visad.Set; 036 import visad.CoordinateSystem; 037 import visad.RealType; 038 import visad.RealTupleType; 039 import visad.SetType; 040 import visad.Linear2DSet; 041 import visad.Unit; 042 import visad.BaseUnit; 043 import visad.OffsetUnit; 044 import visad.FunctionType; 045 import visad.VisADException; 046 import visad.data.units.Parser; 047 import java.rmi.RemoteException; 048 049 import java.util.Hashtable; 050 import java.util.HashMap; 051 import java.util.StringTokenizer; 052 053 import java.io.BufferedReader; 054 import java.io.FileInputStream; 055 import java.io.IOException; 056 import java.io.InputStream; 057 import java.io.InputStreamReader; 058 059 060 public class Calipso2D extends ProfileAlongTrack { 061 062 double start_time; 063 064 public Calipso2D() { 065 } 066 067 public Calipso2D(MultiDimensionReader reader, HashMap metadata, boolean isVertTypeAlt) { 068 super(reader, metadata, isVertTypeAlt); 069 } 070 071 public Calipso2D(MultiDimensionReader reader, HashMap metadata) { 072 super(reader, metadata); 073 HashMap table = ProfileAlongTrack.getEmptyMetadataTable(); 074 table.put(ProfileAlongTrack.array_name, "Surface_Elevation"); 075 } 076 077 public float[] getVertBinAltitude() throws Exception { 078 String propertyFileName = null; 079 float[] altitude = new float[VertLen]; 080 int line_cnt = 0; 081 try { 082 propertyFileName = (String) metadata.get(ancillary_file_name); 083 InputStream ios = getClass().getResourceAsStream(propertyFileName); 084 BufferedReader ancillaryReader = new BufferedReader(new InputStreamReader(ios)); 085 086 while (true) { 087 String line = ancillaryReader.readLine(); 088 if (line == null) break; 089 if (line.startsWith("!")) continue; 090 StringTokenizer strTok = new StringTokenizer(line); 091 String[] tokens = new String[strTok.countTokens()]; 092 int tokCnt = 0; 093 while (strTok.hasMoreElements()) { 094 tokens[tokCnt++] = strTok.nextToken(); 095 } 096 altitude[line_cnt] = (Float.valueOf(tokens[0]))*1000f; 097 line_cnt++; 098 } 099 ios.close(); 100 } 101 catch (Exception e) { 102 System.out.println("fail on ancillary file read: "+propertyFileName); 103 } 104 return altitude; 105 } 106 107 public float[] getTrackTimes() throws Exception { 108 int[] start = new int[] {0,0}; 109 int[] count = new int[] {TrackLen/10, 1}; 110 int[] stride = new int[] {10,1}; 111 double[] times = reader.getDoubleArray((String)metadata.get(profileTime_name), start, count, stride); 112 start_time = times[0]; 113 double time_inc = (times[times.length-1] - times[0])/times.length; 114 float[] new_times = new float[TrackLen]; 115 for (int t=0; t<TrackLen;t++) { 116 new_times[t] = (float) times[0] + (float)(t*time_inc); 117 } 118 return new_times; 119 } 120 121 public float[] getTrackLongitude() throws Exception { 122 int[] start = new int[] {0,0}; 123 int[] count = new int[] {TrackLen, 1}; 124 int[] stride = new int[] {1,1}; 125 float[] vals = reader.getFloatArray((String)metadata.get(longitude_name), start, count, stride); 126 return vals; 127 } 128 129 public float[] getTrackLatitude() throws Exception { 130 int[] start = new int[] {0,0}; 131 int[] count = new int[] {TrackLen, 1}; 132 int[] stride = new int[] {1,1}; 133 float[] vals = reader.getFloatArray((String)metadata.get(latitude_name), start, count, stride); 134 return vals; 135 } 136 137 public RealType makeVertLocType() throws Exception { 138 return RealType.Altitude; 139 } 140 141 public RealType makeTrackTimeType() throws Exception { 142 OffsetUnit unit = (OffsetUnit) Parser.parse("seconds since 1993-01-01 00:00:00Z"); 143 OffsetUnit new_unit = new OffsetUnit(start_time, unit); 144 RealType timeType = RealType.getRealType("Track_Time", new_unit); 145 return timeType; 146 } 147 148 public FlatField getData(Object subset) throws Exception { 149 FlatField field = super.getData(subset); 150 return field; 151 } 152 }