srg/monthplan/management/commands/05_load_survey_track.py
2024-04-26 12:43:00 +03:00

240 lines
8.6 KiB
Python

from django.core.management.base import BaseCommand, CommandError
from datetime import date
from django.utils import dateparse
from logbook.models import LogBookPlan, LogBookDay
from plan.models import INPUT_DATA_DIR
from plan.models import LaunchDate
from monthplan.models import Head, Observation, Seance, Correction, Scan, Survey, FlightPlan, DataDump, SurveyPath
from monthplan.models import SurveyHealpixPlate, NSIDE_PLATES, ORDER
from astropy.io import fits
from datetime import datetime
from django.utils import timezone
from astropy.io import fits
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
#import xlrd
from astropy.table import Table
import astropy.units as u
from astropy.time.formats import erfa
from astropy.time import Time, TimeDelta, TimezoneInfo, TimeFromEpoch
from django.db.models import Q
from math import pi, cos, sin
from Quaternion import Quat
from scipy.spatial.transform import Rotation, Slerp
import numpy as np
from srglib.utils import slerp, quat_to_pol_and_roll
import math
from Quaternion import Quat
from os import listdir
from astropy_healpix import HEALPix
from astropy import units as u
from astropy.coordinates import SkyCoord, RangeError
from astropy.coordinates import ICRS, Galactic, FK5
from astropy.coordinates import Angle
MJDREF = 51543.875
TZ_UTC = TimezoneInfo(utc_offset=0*u.hour)
TZ_MSK = TimezoneInfo(utc_offset=3*u.hour)
TIMESTR_FORMAT = '%Y.%m.%d %H:%M:%S'
def str2date(timestr, tzone):
time_raw = datetime.strptime(timestr, TIMESTR_FORMAT)
time_zoned = time_raw.replace(tzinfo=tzone)
return time_zoned
def date2mission(dtime):
mjdref = Time(MJDREF, format='mjd')
dtime = Time(dtime , format='datetime')
#print(dtime.mjd)
return (dtime - mjdref).sec
def mission2date(timesec, tzone):
mjdref = Time(MJDREF, format='mjd')
delta = TimeDelta(timesec, format='sec')
dtime = mjdref + delta + 3*u.hour
return dtime.to_datetime()
def print_obsplan_dt_sec(dtstr):
dt = str2date(dtstr, tzone=TZ_MSK)
ts = date2mission(dt)
print(dt, '-->', ts, ts/14400)
def print_pz_dt_sec(dtstr):
dt = str2date(dtstr, tzone=TZ_UTC)
ts = date2mission(dt)
print(dt, '-->', ts)
def quat_to_pol_and_roll(qfin):
"""
it is assumed that quaternion is acting on the sattelite coordinate system
in order to orient in in icrs coordinates
opaxis - define dirrection of the main axis (x axis [1, 0, 0] coinside with optical axis)
we assume that north is oriented along z coordinate, we also name this coordinate
north for detectors
"""
opaxis=[1, 0, 0]
north=[0, 0, 1]
opticaxis = qfin.apply(opaxis)
print(opticaxis)
dec = np.arctan(opticaxis[2]/np.sqrt(opticaxis[1]**2 + opticaxis[0]**2))
ra = np.arctan2(opticaxis[1], opticaxis[0])%(2.*pi)
print(ra/pi*180,dec/pi*180)
return
yzprojection = np.cross(opticaxis, north)
vort = np.cross(north, opaxis)
rollangle = np.arctan2(np.sum(yzprojection*qfin.apply(vort), axis=1),
np.sum(yzprojection*qfin.apply(north), axis=1))
print(ra, dec, rollangle)
return ra, dec, rollangle
def logic(index,nskip):
if index % nskip == 0:
return False
return True
"""
# Skip rows from based on condition like skip every 3rd line
usersDf = pd.read_csv('users.csv', skiprows= lambda x: logic(x) )
print('Contents of the Dataframe created by skipping every 3rd row from csv file ')
print(usersDf)
"""
def load_data(file,obsid,nskip):
print("Load data for %s" % file)
try:
survey=Survey.objects.get(experiment__exact=obsid)
except:
print("This survey is not found")
return
# remove all attached SurveyPath to this survey:
spath=survey.surveypath_set.all()
spath.delete()
csvfile=INPUT_DATA_DIR+'/'+file
df = pd.read_csv(csvfile,names=['date', 'time', 'q1', 'q2','q3','q4','dummy'], header=None, delim_whitespace=True, skipfooter=1, engine='python', skiprows = lambda x: logic(x, nskip))
tolerance = 10.0
hp = HEALPix(nside=NSIDE_PLATES, order=ORDER, frame=FK5())
for i in df.index:
dtstr="%s %s" % (df['date'][i], df['time'][i])
dt = str2date(dtstr, tzone=TZ_MSK)
ts = date2mission(dt)
eroday=ts/14400
dtime = Time(dt , format='datetime')
mjd=dtime.mjd
q1=df['q1'][i]
q2=df['q2'][i]
q3=df['q3'][i]
q4=df['q4'][i]
quat=Quat(attitude=[q2,q3,q4,q1])
sp=SurveyPath(survey=survey,dtime=dt,mjd=mjd,obt=ts,eroday=eroday,
q1=q1,q2=q2,q3=q3,q4=q4,ra=quat.ra,dec=quat.dec,roll=quat.roll)
sp.save()
print('Mark SurveyHealpixPlate')
surveypaths = survey.surveypath_set.all()
for i in range(len(surveypaths)-1):
delta=(surveypaths[i+1].dtime-surveypaths[i].dtime).total_seconds()
if(abs(int(delta)) > tolerance):
nstep = int(abs(delta) / tolerance)
delta_arr = np.linspace(0,1,nstep)
quat = slerp([surveypaths[i].q2, surveypaths[i].q3, surveypaths[i].q4, surveypaths[i].q1],
[surveypaths[i+1].q2, surveypaths[i+1].q3, surveypaths[i+1].q4, surveypaths[i+1].q1],
delta_arr)
for q in quat:
qfin=Quat(attitude=q)
crd = SkyCoord(qfin.ra, qfin.dec, frame="fk5", unit="deg")
heal = hp.skycoord_to_healpix(crd)
try:
plate = SurveyHealpixPlate.objects.get(healpix=heal)
except:
print('Error: SurveyHealpixPlate not found, run ./manage.py init_survey_healpix_plates first')
break
queryset = survey.surveyhealpixplate_set.all()
if not queryset.filter(pk=plate.pk).exists():
plate.survey.add(survey)
plate.save()
pass
class Command(BaseCommand):
help = 'Initiates data base'
# def add_arguments(self, parser):
# parser.add_argument('poll_id', nargs='+', type=int)
def handle(self, *args, **options):
"""
load_data('ARJ-SCAN/kvater22_23-09.rez','10000000100',100)
load_data('ARJ-SCAN/kvater23_24-09.rez','10000000200',100)
load_data('ARJ-SCAN/kvater14-11_13_35_00.rez','10000100100',100)
load_data('ARJ-SCAN/kvater15-11_14_35_00.rez','10000100200',100)
load_data('ARJ-SCAN/20191203_150000_10000200100.iki','10000200100',100)
load_data('ARJ-SCAN/20191208_170000_10000300100.iki','10000300100',100)
load_data('ARJ-SCAN/20191210_223000_10000400100.iki','10000400100',100)
load_data('ARJ-SCAN/20191212_003000_11000000100.iki','11000000100',100)
load_data('ARJ-SCAN/20191217_003000_11000000200.iki','11000000200',100)
load_data('ARJ-SCAN/20191222_003000_11000000300.iki','11000000300',100)
load_data('ARJ-SCAN/20191227_003000_11000000400.iki','11000000400',100)
load_data('ARJ-SCAN/20200101_003000_11000000500.iki','11000000500',100)
"""
""" Jan 2020 """
"""
load_data('ARJ-SCAN/20200102_163000_11000100100.iki','11000100100',1)
load_data('ARJ-SCAN/20200106_163000_11000100200.iki','11000100200',100)
load_data('ARJ-SCAN/20200110_163000_11000100300.iki','11000100300',100)
load_data('ARJ-SCAN/20200114_163000_11000100400.iki','11000100400',100)
load_data('ARJ-SCAN/20200118_163000_11000100500.iki','11000100500',100)
load_data('ARJ-SCAN/20200122_163000_11000100600.iki','11000100600',100)
load_data('ARJ-SCAN/20200126_163000_11000100700.iki','11000100700',100)
load_data('ARJ-SCAN/20200130_220000_11000200100.iki','11000200100',100)
"""
""" Feb 2020 """
#load_data('ARJ-SCAN/20200202_220000_11000300100.iki','11000300100',100)
#load_data('ARJ-SCAN/20200206_220000_11000300200.iki','11000300200',100)
#load_data('ARJ-SCAN/20200210_220000_11000300300.iki','11000300300',100)
#load_data('ARJ-SCAN/20200214_220000_11000400100.iki','11000400100',100)
load_data('ARJ-SCAN/20200218_220000_11000400200.iki','11000400200',100)
load_data('ARJ-SCAN/20200222_220000_11000400300.iki','11000400300',100)
load_data('ARJ-SCAN/20200226_220000_11000400400.iki','11000400400',100)
# invalid after eRosita reset
#load_data('ARJ-SCAN/20200214_220000_11000300400.iki','11000300400',100)
#load_data('ARJ-SCAN/20200218_220000_11000300500.iki','11000300500',100)
#load_data('ARJ-SCAN/20200222_220000_11000300600.iki','11000300600',100)
#load_data('ARJ-SCAN/20200226_220000_11000300700.iki','11000300700',100)