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    }