Chandra X-Ray Observatory

2014 ACA Statistics Analysis
Preliminary Data Exploration


In [2]:
import numpy as np
import astropy
import functions as f
import matplotlib.pyplot as plt

from numpy import genfromtxt
from astropy.time import Time

%matplotlib inline

Data loading and creating new variables not included in the dataset

  • Original Columns:
    • obsid: observation id
    • obi: observation internal number
    • tstart: observation (obspar) tstart (Chandra seconds)
    • tstop: observation stop (Chandra seconds)
    • slot: ACA readout slot id
    • idx: star catalog index id
    • cat_pos: position in uploaded star catalog
    • type: star catalog type (BOT or ACQ)
    • agasc_id: AGASC (catalog) id
    • obc_id: acquisition success indicator ('ID' or 'NOID')
    • yang: commanded y-angle position for center of readout window
    • zang: commanded z-angle position for center of readout window
    • mag: catalog MAG_ACA of acquisition star
    • color: catalog COLOR1 of acquisition star
    • halfw: acquisition search box half width
    • mag_obs: observed magnitude of star
    • yang_obs: observed y-angle position of centriod of star
    • zang_obs: observed z-angle position of centroid of star
    • y_offset: mean y offset of all of the other acquired stars
    • z_offset: mean z offset of all of the other acquired stars
    • d_mag: observed mag - catalog mag
    • d_yang: observed y-angle - (catalog y + y-offset)
    • d_zang: observed z-angle - (catalog z + z-offset)
    • revision: acq stats processing software revision
    • warm_pix: estimated CCD warm fraction from dark model
    • red_spoiler: starcheck spoiler with mag difference > -0.2
    • yellow_spoiler: starcheck spoiler with mag difference > -1.0 and < -0.2
    • bad_pixel: known bad pixel in search box
    • common_column: star is marked as in common column
    • known_bad_star: acquisition star has already had multiple failures
  • Columns added:
    • tstart_jyear: Julian Year of the observation
    • tstart_quarter: Quarter that the observation occurs. Uses a function 'quarter_bin' that bins the quarters based on the day of year.
    • mag_floor: Floor of the Star Magnitude.
    • year: year that observation occurred. Calculated by taking the floor of the Julian Year.
  • Notes:
    • f.add_column was stolen from the astropy library... oops

In [3]:
#Loading data from file
acq_data = np.load('data/acq_table.npy')

#Adding fields required for analysis
acq_data = f.add_column(acq_data, 'tstart_jyear' , np.zeros(len(acq_data)))
acq_data = f.add_column(acq_data, 'tstart_quarter' , np.zeros(len(acq_data)))
acq_data = f.add_column(acq_data, 'mag_floor' , np.zeros(len(acq_data)))
acq_data = f.add_column(acq_data, 'year' , np.zeros(len(acq_data)))
acq_data['tstart_jyear'] = Time(acq_data['tstart'], format='cxcsec').jyear
acq_data['year'] = np.floor(acq_data.tstart_jyear)
acq_data['mag_floor'] = np.floor(acq_data['mag'])
# acq_data['tstart_quarter'] = f.quarter_bin(acq['tstart_jyear'])

for acq in acq_data:
    acq.tstart_quarter = f.quarter_bin(acq.tstart_jyear)

Misc. Subsetting of Data


In [4]:
#Subsetting the data by the floor of star magnitude
mag8 = f.smlset(acq_data, 'mag_floor', 8.0)
mag9 = f.smlset(acq_data, 'mag_floor', 9.0)
mag10 = f.smlset(acq_data, 'mag_floor', 10.0)

#Subsetting the data by acquisition type, NOID is failed
obs_failed = f.smlset(acq_data, 'obc_id', "NOID")
obs_acq = f.smlset(acq_data, 'obc_id', "ID")

#Subsetting the data by acquisition type & floor of star magnitude
failed9s = f.smlset(mag9, 'obc_id', "NOID")
acqrd9s = f.smlset(mag9, 'obc_id', "ID")
failed10s = f.smlset(mag10, 'obc_id', "NOID")
acqrd10s = f.smlset(mag10, 'obc_id', "ID")

#Creating dark current vals from custom function... Not useful
darkvals = genfromtxt('data/N100.csv', dtype=None, delimiter='\t', names=True)
t = Time(darkvals['Date_YearDOY'])

Subsetting and binning by Quarter


In [18]:
def fails_by_quarter(arr):
    quarters = np.unique(arr['tstart_quarter'])
    obs_counts = []
    failure_counts = []
    warm_pix_avgs = []
    for q in quarters:
        obs_inquarter = f.smlset(arr, 'tstart_quarter', q)
        failures = len(f.smlset(obs_inquarter, 'obc_id', 'NOID'))
        warm_pix = np.mean(obs_inquarter['warm_pix'])
        counts = len(obs_inquarter)
        failure_counts.append(float(failures))
        warm_pix_avgs.append(float(warm_pix))
        obs_counts.append(float(counts))
    failure_rate = np.array(failure_counts) / np.array(obs_counts)
    return [quarters, failure_rate, warm_pix_avgs]

In [19]:
mag8_byquarter = fails_by_quarter(mag8)
mag9_byquarter = fails_by_quarter(mag9)
mag10_byquarter = fails_by_quarter(mag10)

Plotting Acquistion Failure by Quarter as binned by Star Magnitude over the available time period.


In [42]:
def plot_failures(out, title_name, fname):
    F, ax1 = plt.subplots()
    ax1.plot(out[0],out[1], marker='o', linestyle="")
    ax1.set_xlabel('Quarter')
    ax1.set_ylabel('Acq Fail Rate (%)')
    ax1.set_title(title_name)
    
    ax2 = ax1.twinx()
    ax2.plot(out[0],out[2], marker='', linestyle="-",color="r")
    ax2.set_ylabel('N100 Warm Pixel CCD Fraction', color="r")

    F.set_size_inches(8,4)
    F.savefig(fname, type='pdf')
    plt.show()

In [39]:
plot_failures(mag8_byquarter, 'Magnitude 8 Stars', 'plots/mag8_byquarter.pdf')



In [43]:
plot_failures(mag9_byquarter, '9th Magnitude Stars', 'plots/mag9_byquarter.pdf')



In [44]:
plot_failures(mag10_byquarter, '10th Magnitude Stars',  'plots/mag10_byquarter.pdf')


Plotting Warm Pixel Fraction using data from model


In [10]:
def plot_warmpix_fromfile(subset, fname):
    F = plt.figure()
    plt.plot(subset.tstart_jyear,subset.warm_pix, marker='o', linestyle="")
    plt.xlabel('Time')
    plt.ylabel('Warm Pixel Fraction (%)')
    F.set_size_inches(10,5)
    plt.show()

In [11]:
plot_warmpix_fromfile(subset_mag9, 'plots/subsetmag9.pdf')



In [12]:
plot_warmpix_fromfile(subset_mag10, 'plots/subsetmag10.pdf')


Two Dimensional Plot of Failed Acquistion (Successful Acquisition)

Attempting to assess spatial dependence of failures, and possible unattempted aquisition areas.


In [13]:
def plot_failedheat(subset, fname):
    F = plt.figure()
    heatmap, xedges, yedges = np.histogram2d(subset.yang,subset.zang, bins=100)
    extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
    plt.imshow(heatmap, extent=extent)
    plt.colorbar()
    plt.show()
    print "Plot: {0}... complete".format(fname)

In [14]:
plot_failedheat(obs_failed, 'plots/failedheat.pdf')


Plot: plots/failedheat.pdf... complete

In [15]:
plot_failedheat(obs_acq, 'plots/acqheat.pdf')


Plot: plots/acqheat.pdf... complete

In [4]:
f.smlset(acq_data, 'mag_floor', 10.0)


Out[4]:
array([  3.86827220e+08,   3.86827220e+08,   3.86639029e+08, ...,
         5.19000549e+08,   5.19000549e+08,   5.19000549e+08])