368 lines
15 KiB
Python
368 lines
15 KiB
Python
from django.db import models
|
|
from django.contrib.auth.models import User
|
|
from django.contrib.auth.models import Group
|
|
|
|
from heasarc.models import NSIDE_SOURCES, ORDER
|
|
from heasarc.models import HeasarcBase, HeasarcSwiftBAT105m, Heasarc4XMMDR9, HeasarcRASS2RXS, HeasarcIntRefCat
|
|
import os
|
|
import math
|
|
from astropy import units as u
|
|
from astropy.coordinates import SkyCoord
|
|
from astrobasis.models import Simbad
|
|
#from astrobasis.models import GAIADR2
|
|
from artsurvey.models import ArtSurveySource
|
|
|
|
#from srghub.models import Connection
|
|
|
|
# Create your models here.
|
|
|
|
#SKYMAP_DIR='/srg/work/oper/staff/kate/skymap'
|
|
SKYMAP_DIR='/data/kate/skymap'
|
|
|
|
class SkyMaps(models.Model):
|
|
""" SkyMaps eRosita plates """
|
|
SMAPNR = models.PositiveIntegerField(db_index=True, default=0)
|
|
RA_MIN = models.FloatField(default=0.0)
|
|
RA_MAX = models.FloatField(default=0.0)
|
|
DE_MIN = models.FloatField(default=0.0)
|
|
DE_MAX = models.FloatField(default=0.0)
|
|
RA_CEN = models.FloatField(default=0.0)
|
|
DE_CEN = models.FloatField(default=0.0)
|
|
ELON_CEN = models.FloatField(default=0.0)
|
|
ELAT_CEN = models.FloatField(default=0.0)
|
|
GLON_CEN = models.FloatField(default=0.0)
|
|
GLAT_CEN = models.FloatField(default=0.0)
|
|
X_MIN = models.FloatField(default=0.0)
|
|
Y_MIN = models.FloatField(default=0.0)
|
|
OWNER = models.PositiveIntegerField(default=0)
|
|
N_NBRS = models.PositiveIntegerField(default=0)
|
|
FIELD1 = models.PositiveIntegerField(default=0)
|
|
FIELD2 = models.PositiveIntegerField(default=0)
|
|
FIELD3 = models.PositiveIntegerField(default=0)
|
|
FIELD4 = models.PositiveIntegerField(default=0)
|
|
FIELD5 = models.PositiveIntegerField(default=0)
|
|
FIELD6 = models.PositiveIntegerField(default=0)
|
|
FIELD7 = models.PositiveIntegerField(default=0)
|
|
FIELD8 = models.PositiveIntegerField(default=0)
|
|
FIELD9 = models.PositiveIntegerField(default=0)
|
|
survey_healpix_plate = models.ManyToManyField('monthplan.SurveyHealpixPlate')
|
|
neighbours = models.ManyToManyField("self", blank=True)
|
|
def __str__(self):
|
|
return "%06d" % (self.SMAPNR)
|
|
def get_absolute_url(self):
|
|
return "/srgcat/%i/skymap" % (self.pk)
|
|
|
|
def get_absolute_path(self):
|
|
return "10.5.2.26:{}/{:06d}".format(SKYMAP_DIR, self.SMAPNR)
|
|
@property
|
|
def is_L3_valid(self):
|
|
return os.path.exists(self.get_absolute_path()+'/L3')
|
|
|
|
def get_neighbours(self):
|
|
return self.neighbours.order_by("DE_CEN")
|
|
|
|
|
|
class SrgDataDump(models.Model):
|
|
name = models.CharField(max_length=23)
|
|
date = models.DateTimeField()
|
|
start = models.DateTimeField(blank=True,null=True)
|
|
stop = models.DateTimeField(blank=True,null=True)
|
|
tstart = models.BigIntegerField(default=0)
|
|
tstop = models.BigIntegerField(default=0)
|
|
mjd_start = models.FloatField(default=0.0)
|
|
mjd_stop = models.FloatField(default=0.0)
|
|
skymap = models.ManyToManyField('SkyMaps', blank=True)
|
|
catalog_loaded = models.BooleanField(default=False)
|
|
gyro_loaded = models.BooleanField(default=False)
|
|
version = models.PositiveIntegerField(default=0)
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
""" Date and time of creation. Fully automatic. """
|
|
def __str__(self):
|
|
return self.name
|
|
def get_absolute_url(self):
|
|
"""Class method docstrings go here."""
|
|
return "/srgcat/%i/ddump" % (self.pk)
|
|
|
|
def get_update_catalog_url(self):
|
|
return "/srgcat/%i/ddump/update" % (self.pk)
|
|
|
|
def get_catalog_absolute_path(self):
|
|
return "{}/catalog/{}.fits".format(SKYMAP_DIR,self.name)
|
|
|
|
class ArtCat(models.Model):
|
|
""" ArtCat makes high-level description of ART-XC catalogue. """
|
|
name = models.CharField(max_length=120,blank=True, unique=True, default='')
|
|
e1 = models.FloatField(default=0)
|
|
e2 = models.FloatField(default=0)
|
|
def __str__(self):
|
|
return self.name
|
|
def get_absolute_url(self):
|
|
"""Class method docstrings go here."""
|
|
return "/srgcat/erosita/%i/list" % (self.pk)
|
|
def get_erosita_matched_url(self):
|
|
return "/srgcat/erosita/%i/matched" % (self.pk)
|
|
def get_erosita_nomatch_url(self):
|
|
return "/srgcat/erosita/%i/nomatch" % (self.pk)
|
|
|
|
class Gyro(models.Model):
|
|
dump = models.ForeignKey(SrgDataDump, null=True, on_delete=models.CASCADE)
|
|
healpix = models.BigIntegerField(db_index=True, default=0)
|
|
ra = models.FloatField(default=0.0)
|
|
""" RA """
|
|
dec = models.FloatField(default=0.0)
|
|
""" Dec """
|
|
q1 = models.FloatField(default=0.0)
|
|
""" Quat 1 """
|
|
q2 = models.FloatField(default=0.0)
|
|
""" Quat 2 """
|
|
q3 = models.FloatField(default=0.0)
|
|
""" Quat 3 """
|
|
q4 = models.FloatField(default=0.0)
|
|
""" Quat 4 """
|
|
mjd = models.FloatField(default=0.0)
|
|
""" MJD """
|
|
obt = models.FloatField(default=0.0)
|
|
def __str__(self):
|
|
return self.dump.name
|
|
|
|
class SkyMapSource(models.Model):
|
|
name_orig = models.CharField(max_length=22)
|
|
skymap = models.ForeignKey(SkyMaps, null=True, on_delete=models.CASCADE)
|
|
dump = models.ForeignKey(SrgDataDump, null=True, on_delete=models.CASCADE)
|
|
artsurvey_source = models.ForeignKey(ArtSurveySource, null=True, on_delete=models.SET_NULL)
|
|
catalog = models.ForeignKey(ArtCat, null=True, on_delete=models.CASCADE)
|
|
heasarc = models.ManyToManyField(HeasarcBase)
|
|
simbad = models.ManyToManyField(Simbad)
|
|
simbad_failed = models.BooleanField(default=False, null=True)
|
|
""" Simbad failed to respond """
|
|
simbad_notfound = models.BooleanField(default=False, null=True)
|
|
""" No astronomical object found """
|
|
#gaia = models.ManyToManyField(GAIADR2)
|
|
healpix = models.BigIntegerField(db_index=True, default=0)
|
|
healpix_plate = models.IntegerField(db_index=True, default=0)
|
|
new = models.BooleanField(default=False)
|
|
bad = models.BooleanField(default=False)
|
|
good = models.BooleanField(default=False)
|
|
""" New in this data dump """
|
|
ra = models.FloatField(default=0.0)
|
|
""" Right Ascension of the Source """
|
|
dec = models.FloatField(default=0.0)
|
|
""" Declination of the Source """
|
|
lii = models.FloatField(default=0.0)
|
|
""" Galactic Longitude """
|
|
bii = models.FloatField(default=0.0)
|
|
""" Galactic Latitude """
|
|
radec_error = models.FloatField(default=0.0)
|
|
""" Positional Uncertainty (arcsec)
|
|
|
|
Must be exactly radec_error to be consistent with EroTransSource and EroSurveySource
|
|
"""
|
|
name = models.CharField(max_length=36,blank=True, default='') # source name
|
|
x = models.FloatField(default=0.0)
|
|
y = models.FloatField(default=0.0)
|
|
|
|
cnts = models.FloatField(default=0.0)
|
|
cnts_err = models.FloatField(default=0.0,null=True)
|
|
cnts_bg = models.FloatField(default=0.0,null=True)
|
|
cnts_tot = models.FloatField(default=0.0,null=True)
|
|
exptime = models.FloatField(default=0.0,null=True)
|
|
rate = models.FloatField(default=0.0,null=True)
|
|
rate_err = models.FloatField(default=0.0,null=True)
|
|
flux = models.FloatField(default=0.0,null=True)
|
|
flux_err = models.FloatField(default=0.0,null=True)
|
|
""" obsolete """
|
|
fluxerr_lo = models.FloatField(default=0.0,null=True)
|
|
fluxerr_up = models.FloatField(default=0.0,null=True)
|
|
flux_uplim = models.FloatField(default=0.0,null=True)
|
|
"""
|
|
33 CNTS0 1E cnts
|
|
34 CNTS_ER0 1E cnts
|
|
35 CNTS_T0 1E cnts
|
|
36 CNTS_BG0 1E cnts
|
|
37 EXPTIME0 1E s
|
|
38 FLUX0 1E erg/s/cm^2
|
|
39 FLUX_ER0 1E erg/s/cm^2
|
|
"""
|
|
cnts0 = models.FloatField(default=0.0,null=True)
|
|
cnts_er0 = models.FloatField(default=0.0,null=True)
|
|
cnts_bg0 = models.FloatField(default=0.0,null=True)
|
|
cnts_t0 = models.FloatField(default=0.0,null=True)
|
|
exptime0 = models.FloatField(default=0.0,null=True)
|
|
flux0 = models.FloatField(default=0.0,null=True)
|
|
flux_er0 = models.FloatField(default=0.0,null=True)
|
|
|
|
cnts1 = models.FloatField(default=0.0,null=True)
|
|
cnts_er1 = models.FloatField(default=0.0,null=True)
|
|
cnts_bg1 = models.FloatField(default=0.0,null=True)
|
|
cnts_t1 = models.FloatField(default=0.0,null=True)
|
|
exptime1 = models.FloatField(default=0.0,null=True)
|
|
flux1 = models.FloatField(default=0.0,null=True)
|
|
flux_er1 = models.FloatField(default=0.0,null=True)
|
|
|
|
cnts2 = models.FloatField(default=0.0,null=True)
|
|
cnts_er2 = models.FloatField(default=0.0,null=True)
|
|
cnts_bg2 = models.FloatField(default=0.0,null=True)
|
|
cnts_t2 = models.FloatField(default=0.0,null=True)
|
|
exptime2 = models.FloatField(default=0.0,null=True)
|
|
flux2 = models.FloatField(default=0.0,null=True)
|
|
flux_er2 = models.FloatField(default=0.0,null=True)
|
|
|
|
cnts3 = models.FloatField(default=0.0,null=True)
|
|
cnts_er3 = models.FloatField(default=0.0,null=True)
|
|
cnts_bg3 = models.FloatField(default=0.0,null=True)
|
|
cnts_t3 = models.FloatField(default=0.0,null=True)
|
|
exptime3 = models.FloatField(default=0.0,null=True)
|
|
flux3 = models.FloatField(default=0.0,null=True)
|
|
flux_er3 = models.FloatField(default=0.0,null=True)
|
|
|
|
cnts4 = models.FloatField(default=0.0,null=True)
|
|
cnts_er4 = models.FloatField(default=0.0,null=True)
|
|
cnts_bg4 = models.FloatField(default=0.0,null=True)
|
|
cnts_t4 = models.FloatField(default=0.0,null=True)
|
|
exptime4 = models.FloatField(default=0.0,null=True)
|
|
flux4 = models.FloatField(default=0.0,null=True)
|
|
flux_er4 = models.FloatField(default=0.0,null=True)
|
|
|
|
sig = models.FloatField(default=0.0,null=True)
|
|
nfalse = models.FloatField(default=0.0,null=True)
|
|
detlike = models.FloatField(default=0.0,null=True)
|
|
ext = models.FloatField(default=0.0,null=True)
|
|
ext_id = models.CharField(max_length=100,blank=True, default='',null=True)
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
|
|
ml_sig = models.FloatField(default=0.0,null=True)
|
|
ml_detlike = models.FloatField(default=0.0,null=True)
|
|
ml_nfalse = models.FloatField(default=0.0,null=True)
|
|
ml_ra = models.FloatField(default=0.0,null=True)
|
|
ml_dec = models.FloatField(default=0.0,null=True)
|
|
ml_radec_err_90 = models.FloatField(default=0.0,null=True)
|
|
ml_radec_err_98 = models.FloatField(default=0.0,null=True)
|
|
ml_flux = models.FloatField(default=0.0,null=True)
|
|
ml_flux_err = models.FloatField(default=0.0,null=True)
|
|
ml_exp = models.FloatField(default=0.0,null=True)
|
|
|
|
""" Date and time of creation. Fully automatic. """
|
|
def __str__(self):
|
|
return self.name
|
|
def get_absolute_url(self):
|
|
return "/srgcat/%i/skymapsource" % (self.pk)
|
|
def get_new_artsurvey_url(self):
|
|
return "/artsurvey/%i/new" % (self.pk)
|
|
|
|
def get_last_data_dump(self):
|
|
dump = self.skymap.srgdatadump_set.latest(field_name='date')
|
|
return dump.date
|
|
|
|
def get_swiftbat_count(self):
|
|
swiftbat = HeasarcBase.objects.instance_of(HeasarcSwiftBAT105m).filter(healpix=self.healpix)
|
|
return swiftbat.count()
|
|
|
|
def get_4xmm_count(self):
|
|
return HeasarcBase.objects.instance_of(Heasarc4XMMDR9).filter(healpix=self.healpix).count()
|
|
|
|
def get_rosat_count(self):
|
|
return HeasarcBase.objects.instance_of(HeasarcRASS2RXS).filter(healpix=self.healpix).count()
|
|
|
|
def get_integral_count(self):
|
|
return HeasarcBase.objects.instance_of(HeasarcIntRefCat).filter(healpix=self.healpix).count()
|
|
|
|
def get_log10_nfalse(self):
|
|
log10 = -100.0
|
|
if(self.nfalse > 0.0):
|
|
log10 = math.log10(self.nfalse)
|
|
return log10
|
|
|
|
def get_erosita_ratio(self):
|
|
ratio=-1.0
|
|
if(hasattr(self, 'erositamatch')):
|
|
ratio = float(self.flux/self.erositamatch.flux)
|
|
return ratio
|
|
|
|
class eRositaMatch(models.Model):
|
|
source = models.OneToOneField(SkyMapSource, on_delete=models.CASCADE)
|
|
exp = models.FloatField(default=0.0)
|
|
sep = models.FloatField(default=0.0)
|
|
ra = models.FloatField(default=0.0)
|
|
dec = models.FloatField(default=0.0)
|
|
lkh = models.FloatField(default=0.0)
|
|
cts = models.FloatField(default=0.0)
|
|
flux = models.FloatField(default=0.0)
|
|
def __str__(self):
|
|
return self.source.name
|
|
|
|
|
|
class SelectAllskyMissed(models.Model):
|
|
dump = models.ForeignKey(SrgDataDump, on_delete=models.CASCADE)
|
|
source = models.ForeignKey(SkyMapSource, on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
class Selection(models.Model):
|
|
owner = models.ForeignKey(User, on_delete=models.CASCADE)
|
|
name = models.CharField(max_length=36,blank=False, default='')
|
|
slug = models.SlugField()
|
|
skymap_sources = models.ManyToManyField(SkyMapSource, blank=True)
|
|
public = models.BooleanField(default=True)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
def get_absolute_url(self):
|
|
return "/srgcat/%i/selection" % (self.pk)
|
|
def get_edit_url(self):
|
|
return "/srgcat/%i/selection/edit" % (self.pk)
|
|
def get_delete_url(self):
|
|
return "/srgcat/%i/selection/delete" % (self.pk)
|
|
def get_download_url(self):
|
|
return "/srgcat/%i/selection/download" % (self.pk)
|
|
|
|
def is_selected(self, skymapsource):
|
|
if self.skymap_sources.filter(pk=skymapsource.pk).exists():
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
class TrackStats(models.Model):
|
|
user = models.ForeignKey(User, related_name="trackstats", on_delete=models.CASCADE)
|
|
group = models.ForeignKey(Group, related_name="trackstats", null=True, blank=True, on_delete=models.SET_NULL)
|
|
ip_address = models.GenericIPAddressField()
|
|
url_name = models.CharField(max_length=50, blank=True, default='')
|
|
path_info = models.CharField(max_length=150, blank=True, default='')
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return self.url_name
|
|
|
|
class UserSessionParameters(models.Model):
|
|
owner = models.OneToOneField(User, related_name="session", on_delete=models.CASCADE)
|
|
sign_threshold = models.FloatField(default=0.0, blank=True, null=True)
|
|
target_ra = models.FloatField(default=0.0, blank=True, null=True)
|
|
target_dec = models.FloatField(default=0.0, blank=True, null=True)
|
|
|
|
class ArtSource(models.Model):
|
|
catalog = models.ForeignKey(ArtCat, on_delete=models.CASCADE)
|
|
heasarc = models.ManyToManyField(HeasarcBase)
|
|
|
|
healpix = models.BigIntegerField(db_index=True, default=0)
|
|
ra = models.FloatField(default=0.0)
|
|
""" Right Ascension of the Source """
|
|
dec = models.FloatField(default=0.0)
|
|
""" Declination of the Source """
|
|
lii = models.FloatField(default=0.0)
|
|
""" Galactic Longitude """
|
|
bii = models.FloatField(default=0.0)
|
|
""" Galactic Latitude """
|
|
radec_error = models.FloatField(default=0.0)
|
|
""" Positional Uncertainty (arcsec)
|
|
|
|
Must be exactly radec_error to be consistent with EroTransSource and EroSurveySource
|
|
"""
|
|
name = models.CharField(max_length=36,blank=True, default='') # source name
|
|
sign = models.FloatField(default=0.0)
|
|
rate = models.FloatField(default=0.0)
|
|
flux = models.FloatField(default=0.0)
|
|
def __str__(self):
|
|
return "%s" % (self.name)
|
|
def get_absolute_url(self):
|
|
return "/srgcat/%i/artsource" % (self.pk)
|
|
|