#!/usr/bin/env python3 # # Aaron LI # Created: 2016-06-24 # Updated: 2016-06-29 # # Change logs: # 2016-06-29: # * Update "plot()" to support electron number density profile # 2016-06-28: # * Implement plot function # * Adjust integration tolerances and progress report # * Fit smoothing splines to profiles using R `mgcv::gam()` # 2016-06-27: # * Implement potential profile calculation: # methods 'calc_density_total()' and 'calc_potential()' # 2016-06-26: # * Add document on gravitational potential calculation # 2016-06-25: # * Rename method 'interpolate()' to 'fit_spline()' # * Use 'InterpolatedUnivariateSpline' instead of 'interp1d' # * Implement 'calc_mass_total()' # * Update documentation # 2016-06-24: # * Update method 'gen_radius()' # """ Calculate the (gas and gravitational) mass profile and gravitational potential profile from the electron number density profile, under the assumption of hydrostatic equilibrium. The electron density profile and temperature profile are required. Assuming that the gas is in hydrostatic equilibrium with the gravitational potential and a spherically-symmetric distribution of the gas, we can write the hydrostatic equilibrium equation (HEE) of the ICM as (ref.[1], eq.(6)): derivative(P_gas, r) / rho_gas = - derivative(phi, r) = - G M_tot( R, i.e., outside the shell) The total gravitational potential may be considered to be the sum of the potentials of spherical shells of mass dM(r) = 4 * pi * rho(r) * r^2 dr, so we may calculate the gravitational potential at 'R' generated by an arbitrary spherically symmetric density distribution 'rho(r)' by adding the contributions to the potential produced by shells (1) with r < R, and (2) with r > R. In this way, we obtain phi(R) = - (G/R) * \int_0^R dM(r) - G * \int_R^{\inf} dM(r)/r = - 4*pi*G * ((1/R) * \int_0^R r^2 * rho(r) dr + \int_R^{\inf} r * rho(r) dr) ------------------------------------------------------------ References: [1] Ettori et al., 2013, Space Science Review, 177, 119-154 [2] Walker et al., 2012, MNRAS, 422, 3503 [3] Tremaine & Binney, Galactic Dynamics, 2nd edition, 2008 Sample configuration file: ------------------------------------------------------------ ## Configuration for `calc_mass_potential.py` ## Date: 2016-06-28 # redshift used for pixel to distance conversion redshift = # electron density profile ne_profile = ne_profile.txt # cooling function profile cf_profile = coolfunc_profile.txt # unit of the CF profile radius (default: pixel) cf_unit = "pixel" # temperature profile t_profile = t_profile.txt # unit of the T profile radius (default: pixel) t_unit = "pixel" # number of data points for the output profiles (interpolation) num_dp = 1000 # output gas mass profile m_gas_profile = mass_gas_profile.txt m_gas_profile_image = mass_gas_profile.png # output total (gravitational) mass profile m_total_profile = mass_total_profile.txt m_total_profile_image = mass_total_profile.png # output total mass density profile rho_total_profile = rho_total_profile.txt rho_total_profile_image = rho_total_profile.png # output gravitational potential profile potential_profile = potential_profile.txt potential_profile_image = potential_profile.png ------------------------------------------------------------ """ import argparse import numpy as np import astropy.units as au import astropy.constants as ac import scipy.integrate as integrate from scipy.misc import derivative from configobj import ConfigObj import matplotlib.pyplot as plt from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas from matplotlib.figure import Figure import rpy2.robjects as ro from rpy2.robjects.packages import importr from astro_params import AstroParams, ChandraPixel from projection import Projection plt.style.use("ggplot") class DensityProfile: """ Utilize the 3D (electron number or gas mass) density profile to calculate the following quantities: * 2D projected surface brightness (requires cooling function profile) * gas mass profile (integrated, M_gas(