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 }