srg/srgcat/models.py
2024-04-26 12:43:00 +03:00

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)