L1 Files: Reading and Examining the Data Products
Import Packages
[1]:
from astropy.time import Time
from astropy.table import Table
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from modules.Utils.kpf_parse import get_datecode
from kpfpipe.models.level1 import KPF1
%matplotlib inline
Define Directories and Filenames
One needs to have the L0 file KP.20221112.26598.92_L1.fits in the data/ directory of the folder from which this notebook is running. This file can be downloaded from Jump or shrek.caltech.edu. One can also modify the code below to work with other files or paths.
[2]:
data_dir = '/data/'
ObsID = 'KP.20240422.28832.89' # on-sky spectrum of TOI-1823 (PI: Howard data)
L1_file = data_dir + 'L1/' + get_datecode(ObsID) + '/' + ObsID + '_L1.fits'
Open File and Show Information
Note that there are exensions for:
Header keywords (PRIMARY) - all of the header keywords from the corrssponding L0 file plus ones created during DRP processin that produced the L1
The receipt detailing the DRP operations that produced this L1 file (RECEIPT)
A list of configuration variables that were set when the DRP produced this L1 file (CONFIG). This feature is not yet implemented.
Telemetry of the KPF instrument from the L0 file (TELEMETRY)
Extracted spectra from the green and red CCDs. There are 35 spectral orders on the green CCD (445-600 nm) and 32 spectral orders on the red CCD (600-870 nm). Each order has five orderlers derived from the three KPF fibers (SKY, SCI, CAL). Spatially, the orderlets are arrayed {SKY, SCI1, SCI2, SCI3, CAL} from bottom (lower cross dispersion wavelengths) to top on the CCDs. The extracted spectra are stored in units of photoelectrons, which is corrected for CCD gain and obeys Poisson statistics. The extracted sectra are organized as one-dimensional flux arrays of length 4080 for each of the 35 or 32 orders:
three orderlets from the SCI fiber (GREEN_SCI_FLUX1, GREEN_SCI_FLUX2, GREEN_SCI_FLUX3, RED_SCI_FLUX1, RED_SCI_FLUX2, RED_SCI_FLUX3),
one SKY fiber orderlet (GREEN_SKY_FLUX, RED_SKY_FLUX)
one CAL fiber orderlet (GREEN_CAL_FLUX, RED_CAL_FLUX) per spectral order.
Each extracted pixel has a corresponding variance (GREEN_SCI_VAR1, GREEN_SCI_VAR2, GREEN_SCI_VAR3, GREEN_SKY_VAR3, GREEN_CAL_VAR3, RED_SCI_VAR1, RED_SCI_VAR2, RED_SCI_VAR3, RED_SKY_VAR3, RED_CAL_VAR3) and wavelength (GREEN_SCI_WAV1, GREEN_SCI_WAV2, GREEN_SCI_WAV3, GREEN_SKY_WAV3, GREEN_CAL_WAV3, RED_SCI_WAV1, RED_SCI_WAV2, RED_SCI_WAV3, RED_SKY_VAR3, RED_CAL_VAR3).
Telluric models of the green and red spectra (GREEN_TELLURIC and RED_TELLURIC), which are currently not populated.
Sky models of the green and red spectra (GREEN_SKY and RED_SKY), which are currently not populated.
Extracted spectra of the science and sky traces (seven orders each) from the Ca H&K spectometer (CA_HK_SCI and CA_HK_SKY)
Wavelength solutions from the Ca H&K spectra (CA_HK_WAV and CA_HK_WAV)
[3]:
L1 = KPF1.from_fits(L1_file, data_type='KPF')
L1.info()
File name: KP.20240422.28832.89_L1.fits
|Header Name |# Cards
================================================================================
|PRIMARY | 581
|RECEIPT | 29
|CONFIG | 13
|TELEMETRY | 26
|GREEN_SCI_FLUX1 | 13
|GREEN_SCI_FLUX2 | 13
|GREEN_SCI_FLUX3 | 13
|GREEN_SKY_FLUX | 13
|GREEN_CAL_FLUX | 13
|GREEN_SCI_VAR1 | 8
|GREEN_SCI_VAR2 | 8
|GREEN_SCI_VAR3 | 8
|GREEN_SKY_VAR | 8
|GREEN_CAL_VAR | 8
|GREEN_SCI_WAVE1 | 8
|GREEN_SCI_WAVE2 | 8
|GREEN_SCI_WAVE3 | 8
|GREEN_SKY_WAVE | 8
|GREEN_CAL_WAVE | 8
|GREEN_TELLURIC | 9
|GREEN_SKY | 9
|RED_SCI_FLUX1 | 13
|RED_SCI_FLUX2 | 13
|RED_SCI_FLUX3 | 13
|RED_SKY_FLUX | 13
|RED_CAL_FLUX | 13
|RED_SCI_VAR1 | 8
|RED_SCI_VAR2 | 8
|RED_SCI_VAR3 | 8
|RED_SKY_VAR | 8
|RED_CAL_VAR | 8
|RED_SCI_WAVE1 | 8
|RED_SCI_WAVE2 | 8
|RED_SCI_WAVE3 | 8
|RED_SKY_WAVE | 8
|RED_CAL_WAVE | 8
|RED_TELLURIC | 9
|RED_SKY | 9
|CA_HK_SCI | 15
|CA_HK_SKY | 15
|CA_HK_SCI_WAVE | 8
|CA_HK_SKY_WAVE | 8
|BARY_CORR | 22
|Extension Name |Data Type |Data Dimension
================================================================================
|RECEIPT |table |19
|CONFIG |table |0
|TELEMETRY |table |131
|GREEN_SCI_FLUX1 |image |(35, 4080)
|GREEN_SCI_FLUX2 |image |(35, 4080)
|GREEN_SCI_FLUX3 |image |(35, 4080)
|GREEN_SKY_FLUX |image |(35, 4080)
|GREEN_CAL_FLUX |image |(35, 4080)
|GREEN_SCI_VAR1 |image |(35, 4080)
|GREEN_SCI_VAR2 |image |(35, 4080)
|GREEN_SCI_VAR3 |image |(35, 4080)
|GREEN_SKY_VAR |image |(35, 4080)
|GREEN_CAL_VAR |image |(35, 4080)
|GREEN_SCI_WAVE1 |image |(35, 4080)
|GREEN_SCI_WAVE2 |image |(35, 4080)
|GREEN_SCI_WAVE3 |image |(35, 4080)
|GREEN_SKY_WAVE |image |(35, 4080)
|GREEN_CAL_WAVE |image |(35, 4080)
|GREEN_TELLURIC |table |0
|GREEN_SKY |table |0
|RED_SCI_FLUX1 |image |(32, 4080)
|RED_SCI_FLUX2 |image |(32, 4080)
|RED_SCI_FLUX3 |image |(32, 4080)
|RED_SKY_FLUX |image |(32, 4080)
|RED_CAL_FLUX |image |(32, 4080)
|RED_SCI_VAR1 |image |(32, 4080)
|RED_SCI_VAR2 |image |(32, 4080)
|RED_SCI_VAR3 |image |(32, 4080)
|RED_SKY_VAR |image |(32, 4080)
|RED_CAL_VAR |image |(32, 4080)
|RED_SCI_WAVE1 |image |(32, 4080)
|RED_SCI_WAVE2 |image |(32, 4080)
|RED_SCI_WAVE3 |image |(32, 4080)
|RED_SKY_WAVE |image |(32, 4080)
|RED_CAL_WAVE |image |(32, 4080)
|RED_TELLURIC |table |0
|RED_SKY |table |0
|CA_HK_SCI |image |(6, 1024)
|CA_HK_SKY |image |(6, 1024)
|CA_HK_SCI_WAVE |image |(6, 1024)
|CA_HK_SKY_WAVE |image |(6, 1024)
|BARY_CORR |table |67
Receipt
The receipt is a FITS binary table that is converted below to a Pandas dataframe. The receipt contains a time-ordered list of DRP modules and associated parameteres that were used to produce the L1 file as well as other related information
[4]:
df_receipt = Table.read(L1_file, format='fits',hdu='RECEIPT').to_pandas()
num_columns = ['Module_Level']
for column in df_receipt:
df_receipt[column] = df_receipt[column].str.decode('utf-8')
if column in num_columns:
df_receipt[column] = pd.to_numeric(df_receipt[column], downcast="float")
else:
df_receipt[column] = df_receipt[column].astype(str)
df_receipt
[4]:
| Time | Code_Release | Branch_Name | Commit_Hash | Chip | Module_Name | Module_Level | Module_Path | Module_Param | Status | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2024-04-22T08:18:32.435194 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | SpectralExtraction | 1.0 | modules.spectral_extraction.src.spectral_extra... | orderlets=GREEN_SKY_FLUX GREEN_SCI_FLUX1 GREEN... | PASS |
| 1 | 2024-04-22T08:22:31.818630 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | SpectralExtraction | 1.0 | modules.spectral_extraction.src.spectral_extra... | orderlets=RED_SKY_FLUX RED_SCI_FLUX1 RED_SCI_F... | PASS |
| 2 | 2024-04-22T08:22:37.033083 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | from_fits | 1.0 | kpfpipe.models.level1 | md5_sum=448cb5b1f8ddc2d6f22845f122cd550a | PASS |
| 3 | 2024-04-22T08:22:39.596881 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 4 | 2024-04-22T08:22:40.779304 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 5 | 2024-04-22T08:22:41.916799 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 6 | 2024-04-22T08:22:43.097687 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 7 | 2024-04-22T08:22:44.278306 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 8 | 2024-04-22T08:22:46.859432 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 9 | 2024-04-22T08:22:48.033547 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 10 | 2024-04-22T08:22:49.190422 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 11 | 2024-04-22T08:22:50.363547 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 12 | 2024-04-22T08:22:51.518629 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | ExtCopy | 1.0 | modules.Utils.data_handler | extension copy from kpf_20230531_master_WLS_au... | PASS |
| 13 | 2024-04-22T08:22:58.416717 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | from_fits | 1.0 | kpfpipe.models.level1 | md5_sum=6b295a195db95a5584797b3f9f8e37d8 | PASS |
| 14 | 2024-04-22T08:24:37.005332 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | BaryCorrTable | 1.0 | modules.spectral_extraction.src.bary_corr | bary correction table from 0 to 34 is computed | PASS |
| 15 | 2024-04-22T08:26:07.251465 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | BaryCorrTable | 1.0 | modules.spectral_extraction.src.bary_corr | bary correction table from 35 to 66 is computed | PASS |
| 16 | 2024-04-22T08:26:13.078972 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | from_fits | 1.0 | kpfpipe.models.level1 | md5_sum=15ba47db9d967d67709c43ad09334d7b | PASS |
| 17 | 2024-04-22T08:26:14.257023 | v2.6.1 | master | 85b3008393fd678380a3a844898b2969929efc7f | all | CaHkExtraction | 1.0 | modules.ca_hk.src.ca_hk_extraction | CA_HK extraction to extensions CA_HK_SCI CA_HK... | PASS |
Extracted Spectra
We will start by plotting spectra from the SCI2 trace on both CCDs
[5]:
GREEN_SCI_WAVE1 = np.array(L1['GREEN_SCI_WAVE1'].data)
GREEN_SCI_WAVE2 = np.array(L1['GREEN_SCI_WAVE2'].data)
GREEN_SCI_WAVE3 = np.array(L1['GREEN_SCI_WAVE3'].data)
GREEN_SKY_WAVE = np.array(L1['GREEN_SKY_WAVE'].data)
GREEN_SCI_FLUX1 = np.array(L1['GREEN_SCI_FLUX1'].data)
GREEN_SCI_FLUX2 = np.array(L1['GREEN_SCI_FLUX2'].data)
GREEN_SCI_FLUX3 = np.array(L1['GREEN_SCI_FLUX3'].data)
GREEN_SKY_VAR = np.array(L1['GREEN_SKY_VAR'].data)
GREEN_SCI_VAR1 = np.array(L1['GREEN_SCI_VAR1'].data)
GREEN_SCI_VAR2 = np.array(L1['GREEN_SCI_VAR2'].data)
GREEN_SCI_VAR3 = np.array(L1['GREEN_SCI_VAR3'].data)
GREEN_SKY_VAR = np.array(L1['GREEN_SKY_VAR'].data)
RED_SCI_WAVE1 = np.array(L1['RED_SCI_WAVE1'].data)
RED_SCI_WAVE2 = np.array(L1['RED_SCI_WAVE2'].data)
RED_SCI_WAVE3 = np.array(L1['RED_SCI_WAVE3'].data)
RED_SKY_WAVE = np.array(L1['RED_SKY_WAVE'].data)
RED_SCI_FLUX1 = np.array(L1['RED_SCI_FLUX1'].data)
RED_SCI_FLUX2 = np.array(L1['RED_SCI_FLUX2'].data)
RED_SCI_FLUX3 = np.array(L1['RED_SCI_FLUX3'].data)
RED_SKY_FLUX = np.array(L1['RED_SKY_FLUX'].data)
RED_SKY_VAR = np.array(L1['RED_SKY_VAR'].data)
RED_SCI_VAR1 = np.array(L1['RED_SCI_VAR1'].data)
RED_SCI_VAR2 = np.array(L1['RED_SCI_VAR2'].data)
RED_SCI_VAR3 = np.array(L1['RED_SCI_VAR3'].data)
RED_SKY_VAR = np.array(L1['RED_SKY_VAR'].data)
plt.figure(figsize=(12, 6), tight_layout=True)
for o in range(35):
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_FLUX2[o,:], color='g')
for o in range(32):
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_FLUX2[o,:], color='r')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel('Photons', fontsize=14)
plt.xlim(4450,8700)
plt.ylim(0,np.percentile(RED_SCI_FLUX2[:,:],99)*1.1)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
Now we will plot just order 16 on the red CCD for the SCI2 trace.
[6]:
plt.figure(figsize=(12, 6), tight_layout=True)
o = 16
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_FLUX2[o,:], color='r')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel('Photons', fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
The SCI1, SCI2, and SCI3 have different amounts of flux because they come from different parts of the sliced octagonal SCI fiber.
[7]:
plt.figure(figsize=(12, 6), tight_layout=True)
o = 16
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_FLUX1[o,:]/GREEN_SCI_FLUX2[o,:], color='orange')
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_FLUX3[o,:]/GREEN_SCI_FLUX2[o,:], color='purple')
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_FLUX1[o,:]/GREEN_SCI_FLUX3[o,:], color='blue')
plt.legend(['SCI1/SCI2', 'SCI3/SCI2', 'SCI1/SCI3'], fontsize=14, loc='best')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel('Flux Ratio', fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
[8]:
plt.figure(figsize=(12, 6), tight_layout=True)
o = 30
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_FLUX1[o,:]/RED_SCI_FLUX2[o,:], color='orange')
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_FLUX3[o,:]/RED_SCI_FLUX2[o,:], color='purple')
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_FLUX1[o,:]/RED_SCI_FLUX3[o,:], color='blue')
plt.legend(['SCI1/SCI2', 'SCI3/SCI2', 'SCI1/SCI3'], fontsize=14, loc='best')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel('Flux Ratio', fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
The wavelength solutions for the different SCI orderlets are similar, but not identical.
[9]:
plt.figure(figsize=(12, 6), tight_layout=True)
o = 16
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_WAVE1[o,:] - RED_SCI_WAVE2[o,:], color='orange')
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_WAVE3[o,:] - RED_SCI_WAVE2[o,:], color='purple')
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_WAVE1[o,:] - RED_SCI_WAVE3[o,:], color='blue')
plt.legend(['SCI1 - SCI2', 'SCI3 - SCI2', 'SCI1 - SCI3'], fontsize=14, loc='best')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel(r'$\Delta$ Wavlength (Ang)', fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
The size of a pixel in Angstroms is:
[10]:
RED_SCI_WAVE1[o,1999] - RED_SCI_WAVE1[o,2000]
[10]:
0.02114812245235953
Zooming out and plotting the wavelength difference for all orders.
[11]:
plt.figure(figsize=(12, 6), tight_layout=True)
for o in range(35):
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_WAVE1[o,:] - GREEN_SCI_WAVE2[o,:], color='orange')
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_WAVE3[o,:] - GREEN_SCI_WAVE2[o,:], color='purple')
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_WAVE1[o,:] - GREEN_SCI_WAVE3[o,:], color='blue')
for o in range(32):
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_WAVE1[o,:] - RED_SCI_WAVE2[o,:], color='orange')
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_WAVE3[o,:] - RED_SCI_WAVE2[o,:], color='purple')
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_WAVE1[o,:] - RED_SCI_WAVE3[o,:], color='blue')
plt.legend(['SCI1 - SCI2', 'SCI3 - SCI2', 'SCI1 - SCI3'], fontsize=14, loc='best')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel(r'$\Delta$ Wavlength (Ang)', fontsize=14)
plt.xlim(4450,8700)
plt.ylim(-0.05,0.05)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
We can also plot the sky spectrum, which in the current case looks like mostly scattered light since there are no visible spectral lines.
[12]:
plt.figure(figsize=(12, 6), tight_layout=True)
o = 16
plt.plot(RED_SKY_WAVE[o,:], RED_SKY_FLUX[o,:], color='r')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel('Photons', fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
Variance allows us to compute the SNR of the spectrum. At the moment, only Poisson noise is included in the variance. Read noise and dark current are not. Here we will add the flux (and variance) from the three SCI orderlets. Let’s also plot the median SNR per order.
[13]:
GREEN_SCI_FLUX = GREEN_SCI_FLUX1 + GREEN_SCI_FLUX2 + GREEN_SCI_FLUX3
RED_SCI_FLUX = RED_SCI_FLUX1 + RED_SCI_FLUX2 + RED_SCI_FLUX3
GREEN_SCI_VAR = GREEN_SCI_VAR1 + GREEN_SCI_VAR2 + GREEN_SCI_VAR3
RED_SCI_VAR = RED_SCI_VAR1 + RED_SCI_VAR2 + RED_SCI_VAR3
plt.figure(figsize=(12, 6), tight_layout=True)
for o in range(35):
plt.plot(GREEN_SCI_WAVE2[o,:], GREEN_SCI_FLUX[o,:]/np.sqrt(GREEN_SCI_VAR[o,:]), color='g')
plt.plot(GREEN_SCI_WAVE2[o,2040], np.median(GREEN_SCI_FLUX[o,:]/np.sqrt(GREEN_SCI_VAR[o,:])), marker="s", color='darkgreen')
for o in range(32):
plt.plot(RED_SCI_WAVE2[o,:], RED_SCI_FLUX[o,:]/np.sqrt(RED_SCI_VAR[o,:]), color='r')
plt.plot(RED_SCI_WAVE2[o,2040], np.median(RED_SCI_FLUX[o,:]/np.sqrt(RED_SCI_VAR[o,:])), marker="s", color='darkred')
plt.xlabel('Wavelength (Ang)', fontsize=14)
plt.ylabel('Signal/Noise (SCI1 + SCI2 + SCI3)', fontsize=14)
plt.xlim(4450,8700)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:8: RuntimeWarning: invalid value encountered in true_divide
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:9: RuntimeWarning: invalid value encountered in true_divide
if __name__ == '__main__':
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:8: RuntimeWarning: invalid value encountered in true_divide
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:9: RuntimeWarning: invalid value encountered in true_divide
if __name__ == '__main__':
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:8: RuntimeWarning: invalid value encountered in true_divide
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:9: RuntimeWarning: invalid value encountered in true_divide
if __name__ == '__main__':