001 package util; 002 003 import java.text.DecimalFormat; 004 import org.eso.fits.*; 005 import java.lang.*; 006 import java.util.*; 007 import java.io.*; 008 009 import javax.swing.*; 010 import ui.recognizer.PlotFileFilter; 011 012 /** Convert FITS from 2dfGRS format to one or more text files 013 * @version 1.0 Oct 8 2003 014 * @author John Talbot 015 */ 016 public class ConvertFits2df { 017 /** Static method for converting FITS to text files. 018 * 019 * @param argv array of arguments i.e. FITS files 020 */ 021 public static void main(String[] argv) { 022 023 if (argv.length < 1) { 024 javax.swing.filechooser.FileFilter filter = new PlotFileFilter("FITS Files", new String[] {"fits", "fit"}); 025 026 JFileChooser loadFileChooser = new JFileChooser(); 027 loadFileChooser.setDialogTitle("Convert FITS files or directory"); 028 loadFileChooser.setCurrentDirectory(new File(".")); 029 loadFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 030 loadFileChooser.addChoosableFileFilter(filter); 031 loadFileChooser.setFileFilter(filter); 032 033 JFrame f = new JFrame("Convert FITS files or directory"); 034 035 f.setSize(300, 150); 036 f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 037 f.pack(); 038 f.setVisible(true); 039 040 File file = null; 041 if (loadFileChooser.showOpenDialog(f) == JFileChooser.APPROVE_OPTION) { // BUG: 'up' icon in file chooser is disabled 042 file = loadFileChooser.getSelectedFile(); 043 } 044 convertFiles(file); 045 } else { 046 for (int na = 0; na < argv.length; na++) { 047 convertFiles(new File(argv[na])); 048 } 049 } 050 //TODO: handle command line arguments for (int na=0; na<argv.length; na++) { 051 System.exit(0); 052 } 053 054 // Handle recursive directories 055 public static void convertFiles(File aFile) { 056 if (aFile == null) 057 return; 058 else if (aFile.isDirectory()) { // if File is a directory then process all files in that directory 059 System.out.println("Dir : " + aFile); 060 File[] files = aFile.listFiles(); 061 for (int i = 0 ; i < files.length; i++) { 062 convertFiles(files[i]); 063 } 064 } else { 065 convertFile(aFile); 066 } 067 } 068 069 public static void convertFile(File aFile) { 070 System.out.println("Processing " + aFile); 071 DecimalFormat xFormatter = new DecimalFormat("0.000"); 072 DecimalFormat yFormatter = new DecimalFormat("0.000000"); 073 FitsFile file = null; 074 try { 075 file = new FitsFile(aFile); 076 String name = aFile.getName(); 077 int noHDU = file.getNoHDUnits(); 078 for (int i=0; i<noHDU; i++) { 079 FitsHDUnit hdu = file.getHDUnit(i); 080 FitsHeader hdr = hdu.getHeader(); 081 int noKw = hdr.getNoKeywords(); 082 int type = hdr.getType(); 083 int size = (int) hdr.getDataSize(); 084 //System.out.println("Header name " + hdr.getName()); 085 if ( hdr.getName().equals("SPECTRUM")) { 086 String fileName = name.split("\\.")[0] + "-" + i + ".txt"; 087 FileWriter writer = new FileWriter(fileName); 088 System.out.println("Created spectra " + fileName); 089 Enumeration enumeration = hdr.getKeywords(); 090 while (enumeration.hasMoreElements()) { 091 FitsKeyword kw = (FitsKeyword) enumeration.nextElement(); 092 writer.write("#" + kw.getName()); 093 switch (kw.getType()) { 094 case FitsKeyword.COMMENT: 095 writer.write("(C) " + kw.getComment()); 096 break; 097 case FitsKeyword.STRING: 098 writer.write("(S)= '" + kw.getString() + "'"); 099 break; 100 case FitsKeyword.BOOLEAN: 101 writer.write("(B)= " + kw.getBool()); 102 break; 103 case FitsKeyword.INTEGER: 104 writer.write("(I)= " + kw.getInt()); 105 break; 106 case FitsKeyword.REAL: 107 writer.write("(R)= " + kw.getReal()); 108 break; 109 case FitsKeyword.DATE: 110 writer.write("(D)= " + kw.getString()); 111 break; 112 default: 113 } 114 if (0<kw.getComment().length() && (kw.getType()!=FitsKeyword.COMMENT)) { 115 writer.write(" / " + kw.getComment()); 116 } 117 writer.write("\n"); 118 } 119 if (type == Fits.IMAGE) { 120 FitsMatrix dm = (FitsMatrix) hdu.getData(); 121 int naxis[] = dm.getNaxis(); 122 double crval[] = dm.getCrval(); 123 double crpix[] = dm.getCrpix(); 124 double cdelt[] = dm.getCdelt(); 125 int nv, off, npix; 126 int nval = dm.getNoValues(); 127 if (0<nval) { 128 int ncol = naxis[0]; 129 int nrow = nval/ncol; 130 float data[] = new float[ncol]; 131 double val; 132 off = nv = npix = 0; 133 nrow = 1; // Only get first row 134 for (int nr=0; nr<nrow; nr++) { 135 try { 136 dm.getFloatValues(off, ncol, data); 137 double deltaWavelength = cdelt[0]; 138 double wavelength = crval[0] - (crpix[0]-1)*deltaWavelength; 139 StringBuffer s; 140 for (int n = 0; n<ncol; n++) { 141 val = data[n]; 142 s = new StringBuffer(xFormatter.format(wavelength)); 143 s.append(" "); 144 if (val < -2e30 ) val = 0.0; 145 String y = yFormatter.format(val); 146 //if (y.length() != 8) { 147 // s.append("0.000000"); 148 //} else { 149 // 150 //} 151 s.append(y); 152 s.append("\n"); 153 writer.write(s.toString()); 154 wavelength += deltaWavelength; 155 npix++; 156 } 157 } catch (FitsException e) { 158 } 159 off += ncol; 160 } 161 } 162 } 163 if (writer != null) writer.close(); 164 } 165 } 166 if (file != null) file.closeFile(); 167 } catch (FitsException e) { 168 System.out.println("Error: is not a FITS file >" + aFile + "<"); 169 return; 170 } catch (IOException e) { 171 System.out.println("Error: cannot open file >" + aFile + "<"); 172 return; 173 } 174 } 175 }