001    /*
002     * @(#)ListFits.java   $Revision: 1.3 $ $Date: 2001/09/19 09:38:22 $
003     *
004     * Copyright (C) 1999 European Southern Observatory 
005     * License:  GNU General Public License version 2 or later
006     */
007    package org.eso.fits;
008    
009    import java.lang.*;
010    import java.util.*;
011    import java.io.*;
012    
013    /** ListFits class provides a static main method for listing a set
014     *  of FITS keywords in FITS files.
015     *  @version $Revision: 1.3 $ $Date: 2001/09/19 09:38:22 $
016     *  @author  P.Grosbol, DMD/ESO, <pgrosbol@eso.org>
017     */
018    public class ListFits{
019        /** Static main method for listing keywords of a set of FITS files.
020         *
021         *  @param argv   First argument is a list of FITS files or directories,
022         *                second argument is a comma separated list of FITS 
023         *                keywords to be listed.
024         */
025        public static void main(String[] argv) {
026            if (argv.length < 1) {
027                System.out.println("Error: must be called with one argument");
028                System.exit(1);
029            }
030    
031            // get list of files
032    
033            StringTokenizer files = new StringTokenizer(argv[0],",");
034    
035            // get list of keywords to list for each file
036    
037            String[] keys = new String[0];
038            if (argv.length > 1) {
039                StringTokenizer stok = new StringTokenizer(argv[1],",");
040                keys = new String[stok.countTokens()];
041                int no = 0;
042                while (stok.hasMoreTokens()) {
043                    keys[no++] = (stok.nextToken()).toUpperCase();
044                }
045                stok = null;
046            }
047    
048            // go through files one by one
049    
050            int nofiles = 0;
051            int nokwords = 0;
052            long time = System.currentTimeMillis();
053            while (files.hasMoreTokens()) {
054                String name = files.nextToken();
055                File file = new File(name);
056    
057                // if directory read all files in it
058    
059                String[] flist = new String[1];
060                if (file.isDirectory()) {
061                    flist = file.list();
062                } else {
063                    flist[0] = name;
064                }
065    
066                for (int i=0; i<flist.length; i++) {
067                    if (!FitsFile.isFitsFile(flist[i])) continue;
068    
069                    FitsFile ffile = null;              // open FITS file
070                    try {
071                        ffile = new FitsFile(flist[i]);
072                    } catch (Exception e) {
073                        continue;
074                    }
075    
076                    nofiles++;                         // get prime FITS header
077                    int noHDU = ffile.getNoHDUnits();
078                    FitsHDUnit hdu = ffile.getHDUnit(0);
079                    FitsHeader hdr = hdu.getHeader();
080                    nokwords += hdr.getNoKeywords();
081                    System.out.print(flist[i]);
082    
083                    // list specified keywords in the file
084    
085                    for (int n=0; n<keys.length; n++) {
086                        FitsKeyword kw = (FitsKeyword) hdr.getKeyword(keys[n]);
087                        if (kw == null) continue;
088                        switch (kw.getType()) {
089                        case FitsKeyword.STRING:
090                            System.out.print("   " + kw.getString());
091                            break;
092                        case FitsKeyword.BOOLEAN:
093                            System.out.print("   " + kw.getBool());
094                            break;
095                        case FitsKeyword.INTEGER:
096                            System.out.print("   " + kw.getInt());
097                            break;
098                        case FitsKeyword.REAL:
099                            System.out.print("   " + kw.getReal());
100                            break;
101                        case FitsKeyword.DATE:
102                            System.out.print("   " + kw.getString());
103                            break;
104                        default:
105                        }
106                    }
107                    System.out.print("\n");
108                }
109            }
110            if (0<nofiles) {
111                float dtime = (float) (0.001*(System.currentTimeMillis()-time));
112                float dtf = dtime/((float) nofiles);
113                float dtk = ((float) nokwords)/dtime;
114                System.out.println("  Time: " + dtf + " S/file, Rate: "
115                                   + dtk + " kw/S, Keywords: " + nokwords);
116            }
117            System.exit(0);
118        }
119    }