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 to text file
013     *  @version 1.0 2003-06-27
014     *  @author  John Talbot
015     */
016    public class ConvertFitsELODIE {
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    
045              if (file == null) System.exit(0);
046              if (file.isDirectory()) {  // if File is a directory then process all files in that directory
047                File[] files = file.listFiles();
048                for (int i = 0 ; i < files.length; i++)
049                  convertFile(files[i]);
050    
051              } else {
052                convertFile(file);
053              }
054            }
055            //TODO: handle command line arguments for (int na=0; na<argv.length; na++) {
056            System.exit(0);
057        }
058    
059      public static void convertFile(File aFile) {
060        DecimalFormat xFormatter = new DecimalFormat("0.0");
061        DecimalFormat yFormatter = new DecimalFormat("0.000000");
062        FitsFile file = null;
063        try {
064          file = new FitsFile(aFile);
065          String name = aFile.getName();
066          System.out.println(name);
067          FileWriter writer = new FileWriter(name.split("\\.")[0] + ".txt");
068          int noHDU = file.getNoHDUnits();
069          for (int i=0; i<noHDU; i++) {
070            FitsHDUnit hdu = file.getHDUnit(i);
071            FitsHeader hdr = hdu.getHeader();
072            int noKw = hdr.getNoKeywords();
073            int type = hdr.getType();
074            int size = (int) hdr.getDataSize();
075    
076            if ( hdr.getName().equals("INTENSITY")) {
077              Enumeration enumeration = hdr.getKeywords();
078              while (enumeration.hasMoreElements()) {
079                FitsKeyword kw = (FitsKeyword) enumeration.nextElement();
080                writer.write("#" + kw.getName());
081                switch (kw.getType()) {
082                case FitsKeyword.COMMENT:
083                  writer.write("(C) " + kw.getComment());
084                  break;
085                case FitsKeyword.STRING:
086                  writer.write("(S)= '" + kw.getString() + "'");
087                  break;
088                case FitsKeyword.BOOLEAN:
089                  writer.write("(B)= " + kw.getBool());
090                  break;
091                case FitsKeyword.INTEGER:
092                  writer.write("(I)= " + kw.getInt());
093                  break;
094                case FitsKeyword.REAL:
095                  writer.write("(R)= " + kw.getReal());
096                  break;
097                case FitsKeyword.DATE:
098                  writer.write("(D)= " + kw.getString());
099                  break;
100                default:
101                }
102                if (0<kw.getComment().length() && (kw.getType()!=FitsKeyword.COMMENT)) {
103                  writer.write(" / " + kw.getComment());
104                }
105                writer.write("\n");
106              }
107              if (type == Fits.IMAGE) {
108                FitsMatrix dm = (FitsMatrix) hdu.getData();
109                int naxis[] = dm.getNaxis();
110                double crval[] = dm.getCrval();
111                double crpix[] = dm.getCrpix();
112                double cdelt[] = dm.getCdelt();
113                int nv, off, npix;
114                int nval = dm.getNoValues();
115                if (0<nval) {
116                  int ncol = naxis[0];
117                  int nrow = nval/ncol;
118                  float data[] = new float[ncol];
119                  double val;
120                  off = nv = npix = 0;
121    
122                  for (int nr=0; nr<nrow; nr++) {
123                    try {
124                      dm.getFloatValues(off, ncol, data);
125                      double wavelength = crval[0];
126                      double deltaWavelength = cdelt[0];
127                      StringBuffer s;
128                      for (int n = 0; n<ncol; n++) {
129                        val = data[n];
130                        s = new StringBuffer(xFormatter.format(wavelength));
131                        s.append(" ");
132                        String y = yFormatter.format(val);
133                        if (y.length() != 8) {
134                          s.append("0.000000");
135                        } else {
136                          s.append(y);
137                        }
138                        s.append("\n");
139                        writer.write(s.toString());
140                        wavelength += deltaWavelength;
141                        npix++;
142                      }
143                    } catch (FitsException e) {
144                    }
145                    off += ncol;
146                  }
147                }
148              }
149            }
150          }
151          if (file != null) file.closeFile();
152          if (writer != null) writer.close();
153        } catch (FitsException e) {
154          System.out.println("Error: is not a FITS file >" + aFile + "<");
155          return;
156        } catch (IOException e) {
157          System.out.println("Error: cannot open file >" + aFile + "<");
158          return;
159        }
160      }
161    }