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)