001 package ui.recognizer; 002 003 import java.awt.*; 004 import java.io.*; 005 import java.net.*; 006 import java.util.StringTokenizer; 007 import java.text.DecimalFormat; 008 009 /** 010 * Convert the spectra line plot data extracted from a PostScript file extract to 011 * wavelength versus intensity plot using reference coordinates from tics on xy axes. 012 * This text-based class is designed to convert non-bitmapped ADS publications 013 * into spectra data. 014 * <ul> 015 * <li><b>INPUT</b>: A file containing the PostScript file extract and reference 016 * coordinates from tics on x-y axes 017 * <li><b>OUTPUT</b>: A spectra file containing wavelength vs. intensity plot 018 * </ul> 019 * The input file format : 020 * <pre> 021 * < directives > 022 * initialLowerLeft.x initialLowerLeft.y finalLowerLeft.x finalLowerLeft.y 023 * initialUpperRight.x initialUpperRight.y finalUpperRight.x finalUpperRight.y 024 * initial starting point (optinal for relative coordinates) 025 * x1 y1 026 * x2 y2 027 * ... 028 * </pre> 029 * 030 * The directives include : noskip, skip, landscape, relative, z 1.234 031 * 032 * @author by John Talbot 033 */ 034 public class PostScriptConverter { 035 public static void main(String[] args) { 036 037 String fileName; 038 if (args.length != 0) fileName = (String) args[0]; 039 else return; 040 041 BufferedReader in; 042 String line, intensities, name; 043 int lineNumber = 0; 044 045 boolean skip = false; 046 int skipedlines = 1; 047 boolean relative = false; 048 boolean landscape = false; 049 boolean redshift = false; 050 double z = 1.0; 051 052 boolean newFile = true; 053 054 DecimalFormat xFormatter = new DecimalFormat("0.00"); // Angstroms 055 DecimalFormat yFormatter = new DecimalFormat("0.#####E0"); 056 FileReader reader = null; 057 FileWriter writer = null; 058 FileOutputStream outFile; 059 060 try { 061 reader = new FileReader(fileName); 062 in = new BufferedReader(reader); 063 064 writer = new FileWriter(fileName + ".out"); 065 066 line = in.readLine(); 067 StringTokenizer st = new StringTokenizer(line); 068 while (st.hasMoreElements()) { 069 String command = st.nextToken(); 070 if (command.equals("skip") && !relative) { 071 skip = true; 072 skipedlines = Integer.parseInt(st.nextToken()); 073 } else if (command.equals("relative")) { 074 relative = true; 075 skip = false; 076 } else if (command.equals("landscape")) 077 landscape = true; 078 else if (command.equals("z")) { 079 redshift = true; 080 z = Double.parseDouble(st.nextToken()); 081 } 082 } 083 084 line = in.readLine(); 085 st = new StringTokenizer(line); 086 087 double x1 = Double.parseDouble(st.nextToken()); 088 double y1 = Double.parseDouble(st.nextToken()); 089 090 DataCoordinate finalLowerLeft = new DataCoordinate(Double.parseDouble(st.nextToken()), 091 Double.parseDouble(st.nextToken())); 092 line = in.readLine(); 093 st = new StringTokenizer(line); 094 095 double x2 = Double.parseDouble(st.nextToken()); 096 double y2 = Double.parseDouble(st.nextToken()); 097 098 DataCoordinate initialLowerLeft; 099 DataCoordinate initialUpperRight; 100 if (landscape) { 101 initialLowerLeft = new DataCoordinate(y1, x2); 102 initialUpperRight = new DataCoordinate(y2, x1); 103 } else { 104 initialLowerLeft = new DataCoordinate(x1, y1); 105 initialUpperRight = new DataCoordinate(x2, y2); 106 } 107 DataCoordinate finalUpperRight = new DataCoordinate(Double.parseDouble(st.nextToken()), 108 Double.parseDouble(st.nextToken())); 109 110 Scale scale = new Scale(initialLowerLeft, finalLowerLeft, initialUpperRight, finalUpperRight); 111 112 DataCoordinate initialCoordinate; 113 DataCoordinate finalCoordinate; 114 double lastx = 0.0; 115 double lasty = 0.0; 116 int linenum = 0; 117 do { 118 line = in.readLine(); 119 //System.out.print(line + " -> "); 120 121 if (line != null) { 122 if (linenum == 0) { 123 st = new StringTokenizer(line); 124 double x = Double.parseDouble(st.nextToken()); 125 double y = Double.parseDouble(st.nextToken()); 126 if (relative) { 127 x += lastx; 128 y += lasty; 129 } 130 if (landscape) { 131 initialCoordinate = new DataCoordinate(y, x); 132 } else { 133 initialCoordinate = new DataCoordinate(x, y); 134 } 135 finalCoordinate = scale.map(initialCoordinate); 136 137 if (redshift) { 138 finalCoordinate.setX(finalCoordinate.getX()*(z+1)); 139 } 140 String output = xFormatter.format(finalCoordinate.getX()) + " " + 141 yFormatter.format(finalCoordinate.getY()); 142 writer.write(output + "\n"); 143 //System.out.println(output); 144 if (skip) linenum++; 145 if (relative) { 146 lastx = x; 147 lasty = y; 148 } 149 } else { 150 //System.out.println("skipped"); 151 if (line == null) break; // stop reading file if end of file is reached 152 linenum++; 153 if (linenum == skipedlines) linenum = 0; 154 } 155 } 156 157 158 } while (line != null); 159 if (writer != null) writer.close(); 160 if (reader != null) reader.close(); 161 } catch (Exception e) { 162 System.out.println("Exception" + e); 163 e.printStackTrace(); 164 System.exit(0); 165 } finally { 166 /* 167 try { 168 if (writer != null) writer.close(); 169 if (reader != null) reader.close(); 170 } catch (Exception ex) { 171 System.out.println("Could not close reader or writer " + ex); 172 } 173 */ 174 } 175 176 } 177 }