001 package util;
002
003 import java.io.*;
004 import java.text.DecimalFormat;
005 import java.util.*;
006
007 /**
008 * A data container to hold the quasar instances from the Hewitt and Burbidge catalog
009 * 1993ApJS...87..451H
010 */
011 public class Quasar implements Star {
012 public static DecimalFormat zFormatter = new DecimalFormat("0.00");
013 public static int count = 0;
014 public static List<Line> allLines = new LinkedList<Line>(); // global line list for all quasars
015
016 public String name;
017 public String altid;
018 public String ra;
019 public String dec;
020 public String mag;
021 public String zem;
022 public boolean hasEmissionLines = false;
023 protected double zemValue = 0.0;
024 public String refs;
025
026 List<Line> emissionLines = new LinkedList<Line>();
027
028 public Quasar() {
029 count++;
030 }
031
032 public void addFirstRow(String aFirstRow) {
033 if (aFirstRow.length() < 73) {
034 hasEmissionLines = false;
035 return;
036 }
037 name = aFirstRow.substring(0, 8); // row 1 columns 1-9
038 altid = aFirstRow.substring(10, 20); // row 1 columns 11-21
039 ra = aFirstRow.substring(35, 46); // row 1 columns 36-47
040 mag = aFirstRow.substring(48, 66); // row 1 columns 49-67
041 refs = aFirstRow.substring(92); // row 1 columns 93-end of line
042 zem = aFirstRow.substring(66, 73); // row 1 columns 67-74
043 hasEmissionLines = (zem.trim().length() > 0);
044 // Convert zem to numeric value, ends with first non-numeric char or whitespace
045 if (hasEmissionLines) {
046 String zemTemp = zem.substring(1, 6); // row 1 (value is in col 68-73)
047 if (zemTemp.trim().length() == 0) {
048 hasEmissionLines = false;
049 return;
050 }
051 int parentheses = zemTemp.indexOf(")");
052 if (parentheses > -1) zemTemp = zemTemp.substring(0, parentheses);
053 zemValue = Double.parseDouble(zemTemp);
054 addEmissionLine(aFirstRow);
055 hasEmissionLines = (emissionLines.size() != 0);
056 }
057 }
058
059 public void addSecondRow(String aSecondRow) {
060 dec = aSecondRow.substring(34, 45); // row 2 columns 35-46
061 if (hasEmissionLines) addEmissionLine(aSecondRow);
062 }
063
064 public void addMoreRows(String anotherRow) {
065 if (hasEmissionLines) addEmissionLine(anotherRow);
066 }
067
068 public double getZem() {
069 return zemValue;
070 }
071 /** Precondition: must have read zem first
072 */
073 protected void addEmissionLine(String aRow) {
074 // Attempt to read emission line if they are tabulated]
075 if (aRow.length() < 80) return;
076 String wavelengthString = aRow.substring(80, 84).trim(); // columns 81-85
077 if (wavelengthString.length() > 0) {
078 double wavelength = Double.parseDouble(wavelengthString);
079 double observedWavelength = shift(wavelength);
080 Line line = new Line(this, observedWavelength);
081 getEmissionLines().add(line);
082 allLines.add(line);
083 }
084 }
085 /** Apply the cosmological redshift of this quasar to convert
086 * rest frame wavelength to the original observed frame wavedlength
087 */
088 protected double shift(double wavelength) {
089 return wavelength * ( 1.0 + getZem());
090 }
091
092 /** Format similar to Veron's one line per quasar table
093 */
094 public String toString() {
095 String lines = "";
096 String blank = " ";
097 // 13 entries: 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13 3057.13
098 if (hasEmissionLines) { // create a concatenated list of emission lines
099 for (Iterator x = getEmissionLines().iterator(); x.hasNext(); ) {
100 Line line = (Line) x.next();
101 String wavelengthString = zFormatter.format(line.getWavelength());
102 if (wavelengthString.length() == 7) wavelengthString = " " + wavelengthString;
103 lines += wavelengthString;
104 }
105 if (lines.length() > blank.length()) {
106 lines = lines.substring(0, blank.length());
107 } else {
108 lines = lines + blank.substring(0, blank.length()-lines.length());
109 }
110 } else {
111 lines = blank;
112 }
113 return name + zem + lines + " " + altid + " " + ra + " " + dec + " " + mag + " " + refs;
114 }
115
116 public List<Line> getEmissionLines() {
117 return emissionLines;
118 }
119
120 public List<Line> getAbsorptionLines() {
121 return null;
122 }
123 }
124
125