-->

Etiquetas

The color of celestial objects: part I

The color of celestial objects: part I

Author: Eduardo Martín Calleja

In this post I'll start a series of several articles on the subject of the color of celestial bodies. This first post will be mainly theoretical. In subsequent entries I will address the making of color-color diagrams based on real data obtained from different catalogs

Imports and references

You can read an interesting introduction to the subject in: Photometry and Color-Magnitude and Color-Color plots

In [1]:
%matplotlib inline

from __future__ import division

import quantities as pq
import numpy as np
import matplotlib.pyplot as plt

# This IPython magic generates a table with version information
#https://github.com/jrjohansson/version_information
%load_ext version_information
%version_information numpy, matplotlib, quantities
Out[1]:
SoftwareVersion
Python2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
IPython2.3.1
OSLinux 3.13.0 45 generic x86_64 with debian jessie sid
numpy1.9.1
matplotlib1.4.2
quantities0.10.1
Mon Feb 23 17:50:35 2015 CET

Apparent magnitude

A celestial body of apparent magnitude 1 is by definition 100 times brighter than one of magnitude 6.

Therefore, assigning provisionally an apparent brightness of one unit to any magnitude 6 object:

\[ \begin{array}{l|c|c|c|c|c|c} \text{Magnitud} & 1 & 2 & 3 & 4 & 5 & 6 \\\\ \hline \\\\ \text{apparent brightness} & k^5 = 100 & k^4 & k^3 & k^2& k & 1 \\\\ \end{array} \]

So the ratio \(k\) between an apparent magnitude of value m and an apparent magnitude of value m + 1 will be:

\[k = 100^{\frac{1}{5}}\]

In [2]:
k = 100**(1./5)
print k
2.51188643151

Actually, the magnitude defining strictly the brightness of a body that is perceived by an observer is the radiant flux, defined as the amount of energy per unit of time, which is received in a given range of wavelengths, within an area oriented perpendicular to the path of light. It is measured in watts per square meter.

Let's denote by \(F\) the radiant flux received from a body, and be \(F_{Vega}\) the radiant flux of the star Vega, which is taken as the magnitude 0 reference at all wavelengths. Then we have:

\[ \begin{array}{l|c|c|c|c|c} \text{Magnitude} & 0 & 1 & 2 & \cdots & m \\\\ \hline \\\\ \text{Radiant flux} & F_{Vega} & \frac{1}{k} F_{Vega} & \frac{1}{k^2} F_{Vega} & \cdots & F = \frac{1}{k^m} F_{Vega} \\\\ \end{array} \]

If we now consider two objects of apparent magnitudes \(m_1\) and \(m_2\), and corresponding radiant fluxes \(F_1\) and \(F_2\), expressed both in terms of \(F_ {Vega}\), dividing both terms and simplifying gives the relationship that follows:

\[\frac{F_2}{F_1} = k^{m_1 - m_2}\]

And replacing \(k\) by its value, we come to the following fundamental formula:

\[\frac{F_2}{F_1} = 100^\frac{m_1 - m_2}{5}\]

Another very common way of expressing the relationship between apparent magnitudes and radiant fluxes is taking logarithms in the above expression, comming to:

\[\boxed{ m_1 - m_2 = -2.5 \: log_{10} \left( \frac{F_1}{F_2} \right) }\]

Absolute magnitudes

Logically, the apparent magnitude of an object depends on both its intrinsic luminosity and the distance separating it from us. Therefore we shall define an absolute magnitude which gives us an idea of the amount of energy emitted by the object, regardless of the distance at which it is located.

Previously, we need to clarify the concept of Luminosity \(L\) of an object, which is defined as the total amount of energy emitted by the object in a second. This magnitude \(L\) has a relationship with the radiant flux \(F\), since if we assume that the object is at a distance \(d\) from us, the total energy radiated per second will be distributed on a spherical surface of area \(4 \pi d^2\), so that the energy that we receive per unit area in one second will be:

\[F = \frac{L}{4 \pi d^2}\]

(Actually the above expression is only an approximation, since a part of the radiated light energy is absorbed or scattered to a greater or lesser extent by dust and gas in the interstellar medium).

We now define the absolute magnitude \(M\) of an object as the relative magnitude the object would have if it was at a distance of 10 parsecs (10 pc).

Based on the above formulas, we'll derive now an expression for the difference \(m-M\) between the apparent magnitude and the absolute magnitude of an object. Denote by \(F\) the radiant flux actually measured, and by \(F_ {10}\) the radiant flux that we would measure if the object was located at 10 pc from us.

That is usually written as:

\[ \boxed{ m-M = 5 \: log_{10} \left( \frac{d}{10} \right) } \]

Where the distance \(d\) will be given in parsec.

This simple expression allows to calculate the absolute magnitude from the apparent magnitude or vice versa, but the distance between us and the object is quite naturally part of the equation. In fact, if we know the value of \(m-M\) we will be able to know also the distance \(d\). Therefore, the magnitude \(m-M\) can be seen as a way of expressing the distance that separates us from the object in a logarithmic scale, and for this reason it is known as the distance modulus

Example: the star Vega is located at a distance of 8.1 pc. What is its absolute magnitude?

In [3]:
m = 0 # Vega is the reference for the apparent magnitude 0

M = -5 * np.log10(8.1 / 10)
print "M(Vega) = %.2f" %M
print "distance modulus of Vega: %.2f" %(-M)
M(Vega) = 0.46
distance modulus of Vega: -0.46

Apparent magnitudes in a system of color filters

In practice, the apparent magnitude of an object can be measured considering the radiation received at all wavelengths, in which case it is called bolometric magnitude, or the light passing through different color filters. A system of filters used routinely for this purpose is called the UBV photometric system, or Johnson photometric system, which consists of three filters with the following features:

\[ \begin{array}{|l|c|c|} \text{Filtro} & \lambda \: \text{(Angstroms)} & \Delta \lambda \: \text{(Bandwidth)}\\\\ \hline \\\\ \text{Ultraviolet (u)} & 3650 & 680 \\\\ \text{Blue (b)} & 4400 & 980 \\\\ \text{Visible (v)} & 5500 & 890 \\\\ \end{array} \]

The filter u allows light through in the ultraviolet region, the filter b in the blue region, and the filter v in the green region.

The apparent magnitudes measured with these filters are represented by the initials \(U, B, V\) (Note that, even for apparent magnitudes, in this case capital letters are used).

Color indexes

The apparent magnitude of a body, taken in isolation, is not a good indicator of the properties of that object. Let's imagine we want to learn something about the color of the light emitted by a star and, by making it go through a blue filter we measure a weak apparent magnitude (i.e. , a value of m high). We cannot know whether this is due to the fact that the star radiates little energy in that range of wavelengths or it is merely a very distant star. In short, to know the color of a star we must compare its apparent magnitude measured through at least two filters.

Is for this reason that the color indexes are defined as the difference between two apparent magnitudes with two different filters. Thus, for example, in the UBV photometric system we have two color indexes:

  • Color index \(U-B\) : Difference between ultraviolet and blue apparent magnitudes
  • Color index \(B-V\) : Difference between the blue and visible apparent magnitudes

Note that, according to the above definition of "distance modulus", the relationship between apparent and absolute magnitudes can be written as:

\[ m = M + \mu \]

Being \(\mu\) the distance modulus of the object. Therefore:

color index = \(m_1 - m_2 = M_1 - M_2 \)

That is, a color index is independent of the distance at which the object is located!

Relationship between temperature and color index

One reason that color indices of astronomical objects are so important is because of its close relationship with the surface temperature of the object.

The stars radiate according to a spectrum which in a first approximation is close to the spectrum of black body radiation, which depends solely on temperature. In an earlier post I showed how to use the Plank function to calculate the radiation emitted by a black body at each wavelength for a given temperature. We will come back to use this function:

In [4]:
def B(wl,T):
    '''wl is an array of wavelengths with units of length
    T is a temperature in Kelvin
    the result is an array of spectral radiances
    with units W/(m**2 * nm * sr)
    '''
    I = 2 * pq.constants.h * (pq.c)**2 / wl**5 *  \
        1 / (np.exp((pq.constants.h*pq.c \
        / (wl*pq.constants.k*T)).simplified)-1)
    return I.rescale(pq.watt/(pq.m**2 * pq.nm *pq.sr))

Now I will show which would be the color index variation as a function of temperature, assuming that the stars were perfect black bodies (wich is which is not exactly the case). To this I will follow the approach to calculating color indices from Plank function set forth in the book An Introduction to Modern Astrophysics from Bradley W. Carroll and Dale A. Ostlie, section 3.6. It consists in using the following approximations:

\[ U-B = -2.5 \: log_{10} \left( \frac{B(\lambda_u, T) \: \Delta \lambda_u}{B(\lambda_b, T) \: \Delta \lambda_b} \right) + C_{U-B} \]

\[ B-V = -2.5 \: log_{10} \left( \frac{B(\lambda_b, T) \: \Delta \lambda_b}{B(\lambda_v, T) \: \Delta \lambda_v} \right) + C_{B-V} \]

That is to say, in the previously viewed expression between magnitudes and radiant flows, we replace each radiant flow by the product of the spectral radiance given by the function of Plank for the central wavelength of each filter, multiplied by the effective bandwidth of such a filter, and adding a adjustment constant .

The adjustment constants \(C_{U-B}\) y \(C_{B-V}\) will be determined using certain values of T and the color indexes that are used to calibrate the filters. In this wikipedia article there is a table with these values. We will use in particular that for a temperature T = 42000K we should obtain values of the color indices UB = -1.19, BV = -0.33

In [5]:
#  Defining the UBV photometric system constants

lambda_u = 365 * pq.nm
delta_u = 68 * pq.nm
lambda_b = 440 * pq.nm
delta_b = 98 * pq.nm
lambda_v = 550 * pq.nm
delta_v = 89 * pq.nm
In [6]:
# Calculating Cu-b

T = 42000*pq.kelvin
F = B(lambda_u, T) * delta_u/(B(lambda_b, T)* delta_b)
Cub = -1.19 + 2.5 * np.log10(F)
print Cub
-0.874317278235 dimensionless

In [7]:
# Calculating Cb-v

F = B(lambda_b, T) * delta_b/(B(lambda_v, T)* delta_v)
Cbv = -0.33 + 2.5 * np.log10(F)
print Cbv
0.649368425063 dimensionless

Having determined the constants in the formula that approximates color indices from the black body temperature, we can define functions that will allow us to calculate these color indices for different temperatures.

In [8]:
def get_UB(T):
    F = B(lambda_u, T) * delta_u/(B(lambda_b, T)* delta_b)
    return -2.5 * np.log10(F) + Cub

def get_BV(T):
    F = B(lambda_b, T) * delta_b/(B(lambda_v, T)* delta_v)
    return -2.5 * np.log10(F) + Cbv

And finally I'll plot the curve relating the surface temperature of the object with its color index, assuming, let us have always present, that the object was a perfect black body. For real astronomical objects this curve is only an approximation that will allow a first estimate of its surface temperature as a function of color index.

Just to illustrate this last fact, I will represent on the same graph three-star with data of its effective surface temperature and color index

In [9]:
temp = np.arange(2500, 30000, 100)*pq.Kelvin
BmenosV = get_BV(temp)

fig, ax = plt.subplots(figsize=(10, 8))
ax.plot(BmenosV, temp, lw =2)
ax.grid()
ax.set_title("Relationship Color Index - Temperature \n \
     for a black body")
ax.title.set_fontsize(18)
ax.set_xlabel("Color Index B-V")
ax.xaxis.label.set_fontsize(15)
ax.set_ylabel("Surface Temperature in K")
ax.yaxis.label.set_fontsize(15)

# Draw three representative stars

T = np.array([3300, 5800, 22000])*pq.kelvin
BV = [1.85, 0.656, -0.21]
             
ax.scatter(BV[0],T[0], s=600, c='r', marker='*')
ax.scatter(BV[1],T[1], s=600, c='y', marker='*')
ax.scatter(BV[2],T[2], s=600, c='b', marker='*')

# Write down the names of the three stars

ax.annotate("Betelgeuse", xy=(BV[0],T[0]+1000*pq.kelvin), size=14)
ax.annotate("Sun", xy=(BV[1],T[1]+1000*pq.kelvin), size=14)
ax.annotate("Bellatrix", xy=(BV[2],T[2]+1000*pq.kelvin), size=14);

The figure above shows that the previous theoretical curve can provide in many cases a reasonable approximation to obtain the effective surface temperatures of the stars from its color index.

Color–color diagrams

Other diagrams that are often used are the color-color diagrams, in which each axis represents a different color index, for example: U-B over B-V. The fact is that most of the stars are located on a color-color graphic along a well-defined band called "stellar locus" These diagrams are useful for instance to detect atypical objects that in a color-color diagram are outside of the locus

Later, in other entries we will generate color-color diagrams with real data, but at this time we are going to ask what would be the aspect of the color-color diagram of an ideal black body. The answer is, as we shall see, that it would be a straight line! The stellar locus of color-color diagrams of real objects will be to some extent around this straight line

Another conclusion we can draw from the next graph is that hotter objects are located in the lower left corner of the graph, and the coldest at the opposite end.

In [10]:
temp = np.arange(2500,30000,100)*pq.kelvin
BmenosV = get_BV(temp)
UmenosB = get_UB(temp)

fig, ax = plt.subplots(figsize=(10, 8))
# add .magnitude to avoid matplotlib-quantities issue
ax.scatter(BmenosV.magnitude, UmenosB.magnitude)
ax.grid()
ax.set_title('Black body color-color diagram')
ax.title.set_fontsize(20)
ax.set_xlabel('B-V')
ax.xaxis.label.set_fontsize(15)
ax.set_ylabel('U-B')
ax.yaxis.label.set_fontsize(15)

temp = np.array([3000, 4000, 5000, 7500, 10000, 
                 20000, 30000])*pq.kelvin
BmenosV = get_BV(temp)
UmenosB = get_UB(temp)

ax.scatter(BmenosV.magnitude, UmenosB.magnitude, s=150., c='r')

for t in temp:
    ax.annotate("%d K" %t,xy=(get_BV(t).magnitude+0.1,
                              get_UB(t).magnitude-0.05))

No hay comentarios:

Publicar un comentario