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 }