001 package util.sdss; 002 import java.io.*; 003 import java.util.*; 004 005 /** Extract quasars spectra and images from the SDSS DR1 using the preliminary 006 * identification flags. To restrict the results to quasars in final release catalog 007 * use the FinalQuasars filter which will read only quasars in the final quasar catalog. 008 * <ol> 009 * <li>Manually download SDSS from http://das.sdss.org/DR1/data/spectro/ss_tar_20/ </li> 010 * <li>Manually unzip as many as possible into a directory SDSS</li> 011 * <li>Manually Perform a recursive delete of spPlate-*.fits and plPlugMapM-*.par files</li> 012 * <li>Use this program to delete all spectra which don't have SPEC_QSO or SPEC_HIZ_QSO</li> 013 014 * Use the spDiag1d-MMMMM-FFFF.par file in each FFFF directory 015 */ 016 public class ExtractQuasars { 017 018 public static void main(String[] args) { 019 020 // read in FinalQuasar catalog 021 // TODO: 022 List quasars = null; 023 try { 024 quasars = Quasar.readQuasars(); 025 System.out.println(quasars.size() + " quasars read"); 026 } catch (IOException e) { 027 System.out.println("Can't read quasar catalog : " + e); 028 System.exit(0); 029 } 030 031 // create a map between plate and fiber number and quasar as a check 032 Map<Integer, Quasar> map = new HashMap<Integer, Quasar>(); 033 for (int i = 0; i < quasars.size(); i++) { 034 Quasar qso = (Quasar) quasars.get(i); 035 map.put(qso.getPrimaryKey(), qso); 036 } 037 038 File rootSDSSDir = new File("R:/SDSS"); 039 if (args.length > 0) rootSDSSDir = new File(args[0]); 040 041 File[] plate = rootSDSSDir.listFiles(); 042 for (int i = 0; i < plate.length; i++) { 043 //System.out.println(plate[i]); 044 int plateNum = Integer.parseInt(plate[i].getName()); 045 File[] files = plate[i].listFiles( 046 new FilenameFilter() { 047 public boolean accept(File dir, String name) { 048 return (name != null && name.indexOf(".par") > -1); 049 } 050 }); 051 File spSpec = new File(plate[i], "spSpec"); 052 File spAtlas = new File(plate[i], "spAtlas"); 053 054 if (files != null && files.length > 0) { 055 File parFile = files[0]; 056 int julianDate = Integer.parseInt(parFile.getName().split("-")[1]); 057 try { 058 FileReader reader = new FileReader(parFile); 059 BufferedReader in = new BufferedReader(reader); 060 String row = ""; 061 do { 062 row = in.readLine(); 063 if (row != null && row.indexOf("DIAG ") > -1) { 064 int rbrakett = row.indexOf("{"); 065 int fiber = Integer.parseInt(row.substring(5, rbrakett-1)); 066 if (row.indexOf("QSO") == -1) { // Not a quasar 067 068 File spectraFile = Quasar.getSpectraFile(plateNum, fiber, julianDate); 069 File imageFile = Quasar.getImageFile(plateNum, fiber, julianDate); 070 071 if (!map.containsKey(Quasar.getPrimaryKey(plateNum, fiber))) { 072 if (spectraFile.delete()) System.out.println("deleted " + spectraFile); 073 if (imageFile.delete()) System.out.println("deleted " + imageFile); 074 } else { 075 //getSpectraImage(plateNum, fiber, julianDate); 076 //System.out.println("KEEP -- In DR1 final release quasar catalog :" + map.get(code)); 077 } 078 } else { 079 //getSpectraImage(plateNum, fiber, julianDate); 080 } 081 } 082 } while (row != null); 083 reader.close(); 084 } catch (IOException e) { 085 System.out.println("Can't read par file : " + e); 086 System.exit(0); 087 } 088 } else { 089 continue; //FIXME: if there is no PAR file look inside FITS files for SPEC_CLN header 090 } 091 092 093 // file.delete() all files in 'spAtlas' and 'spSpec' directories which 094 // have a fiber number which does not have 'QSO' somewhere on the line 095 // in 'spDiag...par' file 096 097 // TODO: get file 098 099 // Delete spectra and images if FFFF-fiber not in Final Catalog 100 // and does not have SPEC_QSO,SPEC_HIZ_QSO. 101 } 102 } 103 104 public static void getSpectraImage(int aPlate, int aFiber, int aJulianDate) { 105 //Get GIFS from http://das.sdss.org/DR1/data/spectro/1d_20/0266/gif/ 106 java.net.URL gif = Quasar.getSpectraImageURL(aPlate, aFiber, aJulianDate); 107 System.out.println(gif); 108 // TODO: get 109 try { 110 InputStream in = gif.openStream(); 111 String fileName = Quasar.getSpectraImageFileName(aPlate, aFiber, aJulianDate); 112 FileOutputStream out = new FileOutputStream(fileName); 113 byte[] buffer = new byte[40000]; 114 while( true ) { 115 int bytesRead = in.read(buffer); 116 if (bytesRead == -1) { 117 break; 118 } else { 119 //System.out.println("first byte=" + buffer[0]); 120 out.write(buffer, 0, bytesRead); 121 } 122 } 123 out.close(); 124 in.close(); 125 } catch (IOException e ) { 126 System.err.println("Error downloading the GIF file " + e ); 127 } 128 129 } 130 131 }