240 lines
8.6 KiB
Python
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)
|
|
|
|
|