/
mmlibrary.py
179 lines (136 loc) · 5.57 KB
/
mmlibrary.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 24 13:22:26 2019
@author: Stefano Rinaldi (s.rinaldi9@studenti.unipi.it)
Il presente modulo è una raccolta di funzioni, in continuo aggiornamento,
pensate per il corso di Multimessenger Physics Laboratory.
La libreria è in continuo aggiornamento, di pari passo con l'avanzare del corso.
Il presente modulo è fornito "as it is", senza alcun tipo di supporto tecnico.
Gli autori declinano ogni responsabilità derivante dall'uso improprio del codice.
Sono richieste le seguenti librerie:
- astropy (http://www.astropy.org)
- pandas (https://pandas.pydata.org)
Contenuto della liberia:
- CLASS GWevent()
- GalInABox()
"""
import numpy as np
import pandas as pd
from astropy.table import Table
from numpy import empty, zeros
from astropy.coordinates import SkyCoord as sc
from astropy.coordinates import EarthLocation
from astropy.time import Time as tm
from astropy import units as u
from numpy import arccos, deg2rad, e, log10, pi, sqrt, tan
from astroquery.vizier import Vizier
class GWevent():
"""
__________________
Classe contenente informazioni su singola detection gravitazionale.
Attenzione: l'incertezza sulla posizione è contenuta in un oggetto SkyCoord.
self.err_coord è quindi da intendersi come un vettore di errori su self.coord
piuttosto che come una seconda posizione nel cielo.
==================
Richiesti:
# - Luminosity Distance (con incertezza)
# - coordinate RA-DEC (con incertezza e udm - per SkyCoord)
"""
def update_position(self):
skycoordinates = sc(self.ra, self.dec, unit=(self.u_ra, self.u_dec))
err = sc(self.dra, self.ddec, unit=(self.u_ra, self.u_dec))
self.coord = skycoordinates
self.err_coord = err
# Promemoria: questo non è proprio il modo giusto di usare SkyCoord ma serve
# per avere un convertitore rapido.
def __init__(self, **kwargs):
allowed_keys = set(['LD', 'dLD' , 'ra', 'dra', 'dec', 'ddec', 'u_ra', 'u_dec', 'name'])
self.__dict__.update((key, False) for key in allowed_keys)
self.__dict__.update((key, value) for key,value in kwargs.items() if key in allowed_keys)
self.update_position()
def GalInABox(ra, dec, ra_unit, dec_unit, catalog = 'GLADE', all = False):
"""
Dati gli intervalli RA e DEC (pensati come gli estremi di una forma qualunque),
la funzione restituisce un DataFrame contenente tutte le galassie contenute
in CATALOG entro il rettangolo definito dagli intervalli
Parameters
----------
ra, dec: list
Intervalli di coordinate angolari entro le quali è interamente contenuta
la regione desiderata
ra_unit, dec_unit: astropy.units.core.Unit
Unità di misura in cui sono espressi RA e DEC.
Default: deg
catalog: string, optional.
Catalogo dal quale estrarre i dati.
Default: GLADE2 (pensato per coll. LIGO-Virgo).
all: boolean, optional
Se all = True restituisce tutte le colonne scaricate dal catalogo.
Se all = False, solamente quelle corrispondenti a RA, DEC e z.
Returns
-------
df: Pandas DataFrame
DataFrame Pandas contenente gli oggetti selezionati dal catalogo.
"""
if all:
v = Vizier()
else:
v = Vizier(columns = ['RAJ2000', 'DEJ2000', 'z', 'Bmag'])
v.ROW_LIMIT=-1
ra = np.array(ra)
dec = np.array(dec)
center = sc(ra.mean(), dec.mean(), unit = (ra_unit, dec_unit))
width = (ra.max()-ra.min())/2.*ra_unit
height = (dec.max()-dec.min())/2.*dec_unit
table = v.query_region(center, width = width, height = height, catalog = catalog)
data = pd.DataFrame()
for tablei in table:
data = data.append(tablei.to_pandas(), ignore_index = True)
return data.dropna()
def Galaxies95(boundaries, u_ra = u.rad, u_dec = u.rad, catalog = 'GLADE'):
"""
Dato il contorno (al 95%?) della possibile regione di provenienza di una GW
restituisce tutte le galassie in un catalogo a scelta che si trovano all'interno
della suddetta regione.
NON ANCORA UTILIZZABILE!!!
Parameters
----------
boundaries: unknown.
Regione di cielo di forma qualunque proveniente dalla posterior su RA-DEC.
u_ra, u_dec: astropy.units.core.Unit, optional.
Unità di misura delle coordinate RA-DEC.
catalog: string, optional.
Catalogo dal quale estrarre i dati.
Default: GLADE2 (pensato per coll. LIGO-Virgo).
Returns
-------
df: Pandas DataFrame
DataFrame Pandas contenente gli oggetti selezionati dal catalogo.
"""
ra = [max(ra_boundaries), min(ra_boundaries)]
dec = [max(dec_boundaries), min(dec_boundaries)]
df_all = GalInABox(ra, dec, u_ra, u_dec, catalog)
# TODO: Scrivere una funzione che data la coppia ra-dec controlli che sia dentro la banana
clean_data = df_all[df_all[['RAJ2000', 'DEJ2000']].apply(check_in_95, args = (boundaries,)) == True]
return clean_data
def check_in_95(boundaries, RA, DEC):
"""
Completamente da scrivere: decidere se un punto è dentro o fuori BOUNDARIES
[problema: non so in che formato è BOUNDARIES]
Deve ritornare un Booleano.
Parameters
----------
boundaries: unknown
Regione di cielo di forma qualunque proveniente dalla posterior su RA-DEC.
RA, DEC: float
Coordinate della galassia (o dell'oggetto) di interesse.
Returns
-------
flag: boolean
True se l'oggetto è dentro la regione di cielo considerata, False altrimenti.
"""
if DEC > 1:
return True
else:
return False