-
Notifications
You must be signed in to change notification settings - Fork 0
/
obs_csv_to_latex.py
215 lines (174 loc) · 7.17 KB
/
obs_csv_to_latex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# imports
import numpy as np
import pandas as pd
import os, sys, pdb, pytz
import matplotlib.pyplot as plt
import astropy.units as u
from astropy.table import Table, Column, MaskedColumn
import cdspyreadme
# function to fix the arrays that were written as strings
def string_to_array(string_data):
cleaned_data = string_data.strip('[]\n').split()
return np.array([float(value) for value in cleaned_data])
# file for reading csv
def read_csv(datfile):
# set names of columns to fix
cols_to_fix = ['ra_trans', 'dec_trans', 'sep_trans', \
'maxdrift_trans', 'ra_rec', 'dec_rec', \
'sep_rec', 'maxdrift_rec']
# read the data
df = pd.read_csv(datfile)
# turn long strings back into arrays
for col_name in cols_to_fix:
arr = []
for i in range(len(df)):
arr.append(string_to_array(df.loc[i,col_name]))
df[col_name] = arr
return df
# get the file
datdir = os.path.realpath(__file__ + "/../data/") + "/"
datfile = datdir + "fortuitous.csv"
texfile = datdir + "table.tex"
assert os.path.isfile(datfile)
# set distances
dists = [*range(550,1000,50), *range(1000,27600, 500)] * u.au
# read it in
df = read_csv(datfile)
df = df.drop_duplicates("gaia_source_id")
df_new = pd.DataFrame(columns=df.columns)
# subset the rows and columns to write
cols_to_alter = ["ra_trans", "dec_trans", "maxdrift_trans", "ra_rec", "dec_rec", "maxdrift_rec"]
for i in range(np.max([15, len(df_new)])):
# do intense table surgery
num_rows = 2
k = [0, len(dists)-1]
df_temp = pd.concat([df.iloc[i:i+1, :]]*num_rows, ignore_index=True)
for i in range(len(df_temp)):
if i == 0:
for c in cols_to_alter:
df_temp.loc[i, c] = df_temp.loc[i, c][k[i]]
else:
for c in df_temp.columns:
if c in cols_to_alter:
df_temp.loc[i, c] = df_temp.loc[i, c][k[i]]
else:
df_temp.loc[i, c] = " "
if i == 0:
df_new = pd.concat([df_temp, df_new], ignore_index=True)
else:
df_new = pd.concat([df_new, df_temp], ignore_index=True)
# get columns to write and write it
cols_to_write = ["gaia_source_id", "btl_index", "target", "ra_obs",
"dec_obs", "obs_band", "ra_trans",
"dec_trans", "maxdrift_trans"]
df_new.to_latex(buf=texfile, columns=cols_to_write, na_rep="-", index=False)
# now get the FULL machine-readable table
df = read_csv(datfile)
df_new = pd.DataFrame(columns=df.columns)
# subset the rows and columns to write
for i in range(len(df)):
# do intense table surgery
num_rows = len(dists)
k = np.arange(len(dists))
df_temp = pd.concat([df.iloc[i:i+1, :]]*num_rows, ignore_index=True)
cols_to_alter = ["ra_trans", "dec_trans", "sep_trans", "maxdrift_trans", "ra_rec", "dec_rec", "sep_rec", "maxdrift_rec"]
for i in range(len(df_temp)):
for c in cols_to_alter:
df_temp.loc[i, c] = df_temp.loc[i, c][k[i]]
if i == 0:
df_new = pd.concat([df_temp, df_new], ignore_index=True)
else:
df_new = pd.concat([df_new, df_temp], ignore_index=True)
# get it as an astropy table
t1 = Table.from_pandas(df_new)
t2 = Table()
# change dataypes
t2["Gaia"] = t1["gaia_source_id"].astype('i8')
t2["Distance"] = t1["gaia_dist"].astype('f8')
t2["BTLIndex"] = t1["btl_index"].astype('i8')
t2["Target"] = t1["target"]
t2["url"] = t1["url"]
t2["RAObs"] = np.round(t1["ra_obs"].astype('f8'), decimals=6)
t2["DEObs"] = np.round(t1["dec_obs"].astype('f8'), decimals=6)
t2["ObsTime"] = t1["obs_time"]
t2["ObsBand"] = t1["obs_band"]
t2["RATrans"] = np.round(t1["ra_trans"].astype('f8'), decimals=6)
t2["DETrans"] = np.round(t1["dec_trans"].astype('f8'), decimals=6)
t2["SepTrans"] = np.round(t1["sep_trans"].astype('f8'), decimals=6)
t2["MaxDriftTr"] = np.round(t1["maxdrift_trans"].astype('f8'), decimals=6)
t2["RARec"] = np.round(t1["ra_rec"].astype('f8'), decimals=6)
t2["DERec"] = np.round(t1["dec_rec"].astype('f8'), decimals=6)
t2["SepRec"] = np.round(t1["sep_rec"].astype('f8'), decimals=6)
t2["MaxDriftRec"] = np.round(t1["maxdrift_rec"].astype('f8'), decimals=6)
t2["ProbeDist"] = np.tile(dists.value, int(len(t2)/len(dists)))
# set units
t2["Gaia"].unit = None
t2["Distance"].unit = u.pc
t2["BTLIndex"].unit = None
t2["Target"].unit = None
t2["url"].unit = None
t2["RAObs"].unit = u.deg
t2["DEObs"].unit = u.deg
t2["ObsTime"].unit = None
t2["ObsBand"].unit = None
t2["RATrans"].unit = u.deg
t2["DETrans"].unit = u.deg
t2["SepTrans"].unit = u.deg
t2["MaxDriftTr"].unit = u.Hz / u.s
t2["RARec"].unit = u.deg
t2["DERec"].unit = u.deg
t2["SepRec"].unit = u.deg
t2["MaxDriftRec"].unit = u.Hz / u.s
t2["ProbeDist"].unit = u.AU
# add to tablemaker
tablemaker = cdspyreadme.CDSTablesMaker()
# set the readme
tablemaker.title = "Fortuitous Observations of Potential Stellar Relay Probe Positions with GBT"
tablemaker.author = 'Palumbo M.L.'
tablemaker.authors = 'Wright J.T., Huston M.J.'
tablemaker.date = "2023"
tablemaker.table = "Table of GBT observations that fall near the antipodes of stars within 100 pc"
# add the data
table = tablemaker.addTable(t2, name="datafile1.txt")
# set column descriptions
column = table.get_column("Gaia")
column.description="Source ID from Gaia DR3 Catalog"
column = table.get_column("Distance")
column.description="Gaia gspphot distance"
column = table.get_column("BTLIndex")
column.description="Database index of Breakthrough Listen observation"
column = table.get_column("Target")
column.description="Target of Breakthrough Listen observation"
column = table.get_column("url")
column.description="URL for Breakthrough Listen data download"
column = table.get_column("RAObs")
column.description="RA in ICRS of the Breakthrough Listen observation"
column = table.get_column("DEObs")
column.description="Dec in ICRS of the Breakthrough Listen observation"
column = table.get_column("ObsTime")
column.description="ISO 8601 compliant date format of Breakthrough Listen observation; timezone is UTC"
column = table.get_column("ObsBand")
column.description="Band of the GBT observation"
column = table.get_column("RATrans")
column.description="List of RAs along transmitting probe focal line in ICRS"
column = table.get_column("DETrans")
column.description="List of Decs along transmitting probe focal line in ICRS"
column = table.get_column("SepTrans")
column.description="List of angular separations of transmitting probes from observation pointing"
column = table.get_column("MaxDriftTr")
column.description="List of drift rates of transmitting probes"
column = table.get_column("RARec")
column.description="List of RAs along receiving probe focal line in ICRS"
column = table.get_column("DERec")
column.description="List of Decs along receiving probe focal line in ICRS"
column = table.get_column("SepRec")
column.description="List of angular separations of receiving probes from observation pointing"
column = table.get_column("MaxDriftRec")
column.description="List of drift rates of receiving probes"
column = table.get_column("ProbeDist")
column.description="List of probe distances that coordinates and drift rates were calculated for"
# write it out
tablemaker.toMRT()
# pdb.set_trace()
# from astropy.io import ascii
# data = ascii.read("tab1.txt", format="mrt")