1 // stellarclass.h
2 //
3 // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
9
10 #ifndef _STELLARCLASS_H_
11 #define _STELLARCLASS_H_
12
13 #include <iostream>
14 #include <string>
15 #include <celutil/basictypes.h>
16 #include <celutil/color.h>
17
18
19 class StellarClass
20 {
21 public:
22 enum StarType
23 {
24 NormalStar = 0,
25 WhiteDwarf = 1,
26 NeutronStar = 2,
27 BlackHole = 3,
28 };
29
30 enum SpectralClass
31 {
32 Spectral_O = 0,
33 Spectral_B = 1,
34 Spectral_A = 2,
35 Spectral_F = 3,
36 Spectral_G = 4,
37 Spectral_K = 5,
38 Spectral_M = 6,
39 Spectral_R = 7, // superceded by class C
40 Spectral_S = 8,
41 Spectral_N = 9, // superceded by class C
42 Spectral_WC = 10,
43 Spectral_WN = 11,
44 Spectral_Unknown = 12,
45 Spectral_L = 13,
46 Spectral_T = 14,
47 Spectral_C = 15,
48 Spectral_DA = 16, // white dwarf A (Balmer lines, no He I or metals)
49 Spectral_DB = 17, // white dwarf B (He I lines, no H or metals)
50 Spectral_DC = 18, // white dwarf C, continuous spectrum
51 Spectral_DO = 19, // white dwarf O, He II strong, He I or H
52 Spectral_DQ = 20, // white dwarf Q, carbon features
53 Spectral_DZ = 21, // white dwarf Z, metal lines only, no H or He
54 Spectral_D = 22, // generic white dwarf, no additional data
55 Spectral_DX = 23,
56 Spectral_Count = 24,
57 };
58
59 enum
60 {
61 FirstWDClass = 16,
62 WDClassCount = 8,
63 SubclassCount = 11,
64 NormalClassCount = 16,
65 };
66
67 enum LuminosityClass
68 {
69 Lum_Ia0 = 0,
70 Lum_Ia = 1,
71 Lum_Ib = 2,
72 Lum_II = 3,
73 Lum_III = 4,
74 Lum_IV = 5,
75 Lum_V = 6,
76 Lum_VI = 7,
77 Lum_Unknown = 8,
78 Lum_Count = 9,
79 };
80
81 enum
82 {
83 Subclass_Unknown = 10
84 };
85
86 inline StellarClass();
87 inline StellarClass(StarType,
88 SpectralClass,
89 unsigned int,
90 LuminosityClass);
91
92 inline StarType getStarType() const;
93 inline SpectralClass getSpectralClass() const;
94 inline unsigned int getSubclass() const;
95 inline LuminosityClass getLuminosityClass() const;
96
97 Color getApparentColor() const;
98 Color getApparentColor(StellarClass::SpectralClass sc) const;
99
100 char* str(char* buf, unsigned int buflen) const;
101 std::string str() const;
102
103 static StellarClass parse(const std::string&);
104
105 friend bool operator<(const StellarClass& sc0, const StellarClass& sc1);
106
107 uint16 pack() const;
108 bool unpack(uint16);
109
110 private:
111 StarType starType;
112 SpectralClass specClass;
113 LuminosityClass lumClass;
114 unsigned int subclass;
115 };
116
117
118 std::ostream& operator<<(std::ostream& s, const StellarClass& sc);
119
120 // A rough ordering of stellar classes, from 'early' to 'late' . . .
121 // Useful for organizing a list of stars by spectral class.
122 bool operator<(const StellarClass& sc0, const StellarClass& sc1);
123
StellarClass(StarType t,SpectralClass sc,unsigned int ssub,LuminosityClass lum)124 StellarClass::StellarClass(StarType t,
125 SpectralClass sc,
126 unsigned int ssub,
127 LuminosityClass lum) :
128 starType(t),
129 specClass(sc),
130 lumClass(lum),
131 subclass(ssub)
132 {
133 }
134
StellarClass()135 StellarClass::StellarClass() :
136 starType(NormalStar),
137 specClass(Spectral_Unknown),
138 lumClass(Lum_Unknown),
139 subclass(Subclass_Unknown)
140 {
141
142 }
143
getStarType()144 StellarClass::StarType StellarClass::getStarType() const
145 {
146 return starType;
147 }
148
getSpectralClass()149 StellarClass::SpectralClass StellarClass::getSpectralClass() const
150 {
151 return specClass;
152 }
153
getSubclass()154 unsigned int StellarClass::getSubclass() const
155 {
156 return subclass;
157 }
158
getLuminosityClass()159 StellarClass::LuminosityClass StellarClass::getLuminosityClass() const
160 {
161 return lumClass;
162 }
163
164 #endif // _STELLARCLASS_H_
165