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 package edu.wisc.ssec.mcidasv.data;
029
030 import java.io.BufferedReader;
031 import java.io.File;
032 import java.io.FileReader;
033 import java.util.ArrayList;
034 import java.util.Hashtable;
035 import java.util.List;
036
037 public class AxformInfo extends HeaderInfo {
038
039 /** The url */
040 private String dataFile = "";
041 private boolean isAxform = false;
042
043 /**
044 * Ctor for xml encoding
045 */
046 public AxformInfo() {}
047
048 /**
049 * CTOR
050 *
051 * @param filename The filename
052 */
053 public AxformInfo(File thisFile) {
054 this(thisFile.getAbsolutePath());
055 }
056
057 /**
058 * CTOR
059 *
060 * @param filename The filename
061 */
062 public AxformInfo(String filename) {
063 super(filename);
064 }
065
066 /**
067 * Is the file an AXFORM header file?
068 */
069 public boolean isAxformInfoHeader() {
070 parseHeader();
071 return isAxform;
072 }
073
074 /**
075 * Which band/file is latitude?
076 */
077 public int getLatBandNum() {
078 return 1;
079 }
080 public String getLatBandFile() {
081 parseHeader();
082 List bandFiles = (List)getParameter(NAVFILES, new ArrayList());
083 if (bandFiles.size()!=2) return "";
084 return (String)(bandFiles.get(0));
085 }
086
087 /**
088 * Which band/file is longitude?
089 */
090 public int getLonBandNum() {
091 return 1;
092 }
093 public String getLonBandFile() {
094 parseHeader();
095 List bandFiles = (List)getParameter(NAVFILES, new ArrayList());
096 if (bandFiles.size()!=2) return "";
097 return (String)(bandFiles.get(1));
098 }
099
100 /**
101 * Parse a potential AXFORM header file
102 */
103 protected void parseHeader() {
104 if (haveParsed()) return;
105 if (!doesExist()) {
106 isAxform = false;
107 return;
108 }
109
110 try {
111 BufferedReader br = new BufferedReader(new FileReader(getFilename()));
112 int lineNum = 0;
113 String line;
114 String description = "";
115 boolean gotFiles = false;
116
117 List bandNames = new ArrayList();
118 List bandFiles = new ArrayList();
119
120 String latFile = "";
121 String lonFile = "";
122 File thisFile = new File(getFilename());
123 String parent = thisFile.getParent();
124 if (parent==null) parent=".";
125
126 while ((line = br.readLine()) != null) {
127 lineNum++;
128 if (line.trim().equals("Space Science & Engineering Center")) {
129 isAxform = true;
130 continue;
131 }
132 if (!isAxform) break;
133
134 if (line.length() < 80) {
135 if (lineNum > 15) gotFiles = true;
136 continue;
137 }
138
139 // Process the description from lines 5 and 6
140 if (lineNum==5) {
141 description += line.substring(13, 41).trim();
142 }
143 else if (lineNum==6) {
144 description += " " + line.substring(14, 23).trim() +" " + line.substring(59, 71).trim();
145 setParameter(DESCRIPTION, description);
146 }
147
148 // Process the file list starting at line 15
149 else if (lineNum>=15 && !gotFiles) {
150 String parameter = line.substring(0, 13).trim();
151 if (parameter.equals("Header")) {
152 isAxform = true;
153 }
154 else if (parameter.equals("Latitude")) {
155 latFile = parent + "/" + line.substring(66).trim();
156 }
157 else if (parameter.equals("Longitude")) {
158 lonFile = parent + "/" + line.substring(66).trim();
159 }
160 else {
161 setParameter(LINES, Integer.parseInt(line.substring(24, 31).trim()));
162 setParameter(ELEMENTS, Integer.parseInt(line.substring(32, 40).trim()));
163 setParameter(UNIT, parameter);
164 String band = line.substring(19, 23).trim();
165 String format = line.substring(41, 59).trim();
166 System.out.println("looking at format line: " + format);
167 if (format.indexOf("ASCII") >= 0) {
168 setParameter(DATATYPE, kFormatASCII);
169 }
170 else if (format.indexOf("8 bit") >= 0) {
171 setParameter(DATATYPE, kFormat1ByteUInt);
172 }
173 else if (format.indexOf("16 bit") >= 0) {
174 setParameter(DATATYPE, kFormat2ByteSInt);
175 }
176 else if (format.indexOf("32 bit") >= 0) {
177 setParameter(DATATYPE, kFormat4ByteSInt);
178 }
179 String filename = line.substring(66).trim();
180 filename = parent + "/" + filename;
181 bandFiles.add(filename);
182 bandNames.add("Band " + band);
183 }
184 }
185
186 // Look for the missing value, bail when you find it
187 else if (gotFiles) {
188 if (line.indexOf("Navigation files missing data value") >= 0) {
189 setParameter(MISSINGVALUE, Float.parseFloat(line.substring(44, 80).trim()));
190 break;
191 }
192 }
193
194 setParameter(BANDNAMES, bandNames);
195 setParameter(BANDFILES, bandFiles);
196
197 List latlonFiles = new ArrayList();
198 latlonFiles.add(latFile);
199 latlonFiles.add(lonFile);
200 setParameter(NAVFILES, latlonFiles);
201
202 }
203 br.close();
204 }
205 catch (Exception e) {
206 e.printStackTrace();
207 }
208
209 }
210
211 }