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