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

281 lines
12 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, ScanPath
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
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):
#print(timestr)
if timestr.find('60') > 0:
timestr=timestr.replace('60', '00')
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
def load_data(file,obsid,nskip):
print('Load data for ',obsid)
try:
scan=Scan.objects.get(experiment__exact=obsid)
except:
print("This scan is not found ",obsid)
try:
scans=Scan.objects.filter(experiment__exact=obsid)
except:
print("Multiple scans were also not found ",obsid)
print('Remove some of the invalid scans below:')
for scan in scans:
print(scan.experiment,scan.start,scan.stop,scan.head)
return
# remove all attached ScanPath to this scan:
spath=scan.scanpath_set.all()
spath.delete()
csvfile=INPUT_DATA_DIR+'/ARJ-SCAN/'+file
df = pd.read_csv(csvfile,names=['date', 'time', 'q1', 'q2','q3','q4','dummy'], header=None, delim_whitespace=True, skipfooter=1, skiprows = lambda x: logic(x, nskip))
print(df)
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=ScanPath(scan=scan,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()
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):
# note: delete 00003017001 scan from August plan
"""
load_data('kvater01-09_02_15_00.rez','00003017001')
load_data('kvater01-09_10_17_58.rez','00003017002')
load_data('kvater01-10_01_40_00.rez','00003044001')
load_data('kvater02-09_02_40_00.rez','00003031001')
load_data('kvater02-09_10_42_58.rez','00003031002')
load_data('kvater02-10_01_10-00.rez','00003045001')
load_data('kvater03-09_04_06_00.rez','00003018001')
load_data('kvater03-09_11_22_58.rez','00003018002')
load_data('kvater03-11_05_25_50.rez','30000700100')
load_data('kvater04-09_04_06_00.rez','00003019001')
load_data('kvater04-09_11_22_58.rez','00003019002')
load_data('kvater04-11_07_05_52.rez','30000800100')
load_data('kvater05-09_04_06_00.rez','00003020001')
load_data('kvater05-09_11_22_58.rez','00003020002')
load_data('kvater05-11_08_45_54.rez','30000900100')
load_data('kvater06-09_04_06_00.rez','00003021001')
load_data('kvater06-09_11_22_58.rez','00003021002')
load_data('kvater06-11_10_25_56.rez','30001000100')
load_data('kvater07-09_04_06_00.rez','00003022001')
load_data('kvater07-09_11_22_58.rez','00003022002')
load_data('kvater08-09_01_40_00.rez','00003023001')
load_data('kvater08-10_19_11_10.rez','30000500100')
load_data('kvater09-09_01_40_00.rez','00003024001')
load_data('kvater09-10_12_20_02.rez','30000600100')
load_data('kvater10-09_01_30_00.rez','00003025001')
load_data('kvater11-09_01_40_00.rez','00003026001')
load_data('kvater12-09_04_06_00.rez','00003027001')
load_data('kvater12-09_11_22_58.rez','00003027002')
load_data('kvater13-09_04_06_00.rez','00003028001')
load_data('kvater13-09_11_22_58.rez','00003028002')
load_data('kvater13-10_08_59_10.rez','50000600100')
load_data('kvater13-10_23_48_18.rez','50000700100')
load_data('kvater14-08_12_50_00.rez','00003021001')
load_data('kvater14-09_04_06_00.rez','00003029001')
load_data('kvater14-09_11_22_58.rez','00003029002')
load_data('kvater15-09_03_03_20.rez','70004000100')
load_data('kvater15-10_19_52_56.rez','50000800100')
load_data('kvater16-10_10_42_04.rez','50000900100')
load_data('kvater17-08_02_00_00.rez','00003001001')
load_data('kvater17-08_11_01_00.rez','00003002001')
load_data('kvater17-08_22_10_00.rez','00003003001')
load_data('kvater17-09_04_06_00.rez','00003032001')
load_data('kvater17-09_11-22_58.rez','00003032002')
load_data('kvater18-08_03_58_19.rez','00003003002')
load_data('kvater18-08_09_46_38.rez','00003003003')
load_data('kvater18-08_22_10_00.rez','00003004001')
load_data('kvater18-09_04_06_00.rez','00003033001')
load_data('kvater18-09_11_22_58.rez','00003033002')
load_data('kvater18-10_03_16_32.rez','30001600100')
load_data('kvater19-08_01_38_28.rez','00003004002')
load_data('kvater19-08_05_06_56.rez','00003004003')
load_data('kvater19-08_08_35_24.rez','00003004004')
load_data('kvater19-08_12_03_52.rez','00003004005')
load_data('kvater19-08_22_10_00.rez','00003005001')
load_data('kvater19-09_01_40_00.rez','00003034001')
load_data('kvater20-08_01_29_18.rez','00003005002')
load_data('kvater20-08_06_48_36.rez','00003005003')
load_data('kvater20-08_11_07_54.rez','00003005004')
load_data('kvater20-08_22_10_00.rez','00003006001')
load_data('kvater20-09_01_40_00.rez','00003035001')
load_data('kvater20-09_06_18_00.rez','00003036001')
load_data('kvater20-09_10_56_00.rez','00003037001')
load_data('kvater21-08_02_29_18.rez','00003006002')
load_data('kvater21-08_06_48_36.rez','00003006003')
load_data('kvater21-08_11_07_54.rez','00003006004')
load_data('kvater21-09_01_27_00.rez','00003030001')
load_data('kvater21-09_08_43_58.rez','00003030002')
load_data('kvater22-08_22_10_00.rez','00003007001')
load_data('kvater23-08_01_38_28.rez','00003007002')
load_data('kvater23-08_05_06_56.rez','00003007003')
load_data('kvater23-08_08_35_24.rez','00003007004')
load_data('kvater23-08_12_03_52.rez','00003007005')
load_data('kvater23-08_22_10_00.rez','00003008001')
load_data('kvater24-08_02_47_38.rez','00003008002')
load_data('kvater24-08_07_25_16.rez','00003008003')
load_data('kvater24-08_12_02_54.rez','00003008004')
load_data('kvater24-08_22_10_00.rez','00003009001')
load_data('kvater24-09_03_30_00.rez','00003041001')
load_data('kvater24-09_11_07_09.rez','00003041001')
load_data('kvater24-09_13_05_00.rez','00003042001')
load_data('kvater24-09_15_02_09.rez','00003042002')
load_data('kvater25-08_02_47_38.rez','00003009002')
load_data('kvater25-08_07_25_16.rez','00003009003')
load_data('kvater25-08_12_02_54.rez','00003009004')
load_data('kvater25-08_22_10_00.rez','00003010001')
load_data('kvater25-09_01_40_00.rez','00003038001')
load_data('kvater26-08_02_47_38.rez','00003010002')
load_data('kvater26-08_12_02_54.rez','00003010004')
load_data('kvater26-08_23_40_00.rez','00003011001')
load_data('kvater26-09_01_40_00.rez','00003039001')
load_data('kvater26_08_07_25_16.rez','00003010003')
load_data('kvater27-08_04_17_38.rez','00003011002')
load_data('kvater27-08_08_55_16.rez','00003011003')
load_data('kvater27-08_13_32_54.rez','00003011004')
load_data('kvater27-08_23_40_00.rez','00003012001')
load_data('kvater27-09_01_40_00.rez','00003040001')
load_data('kvater28-08_04_17_38.rez','00003012002')
load_data('kvater28-08_08_55_16.rez','00003012003')
load_data('kvater28-08_13_32_54.rez','00003012004')
load_data('kvater28-08_23_40_00.rez','00003013001')
load_data('kvater28-09_01_40_00.rez','00003043001')
load_data('kvater29-08_04_17_38.rez','00003013002')
load_data('kvater29-08_08_55_16.rez','00003013003')
load_data('kvater30-08_02_40_00.rez','00003015001')
load_data('kvater30-08_10_42_58.rez','00003015002')
load_data('kvater31-08_02_40_00.rez','00003016001')
load_data('kvater31-08_10_42_58.rez','00003016002')
load_data('kvater12-11_03_04_38.rez','50001500100')
load_data('kvater12-11_21_50_31.rez','50001600100')
load_data('kvater13-11_11_06_34.rez','50001700100')
load_data('kvater14-11_00_22_37.rez','50001800100')
load_data('kvater16-11_07_42_50.rez','50001900100')
load_data('kvater16-11_16_47_48.rez','50002000100')
"""
"""
load_data('70019900100.iki','70019900100')
load_data('70020000100.iki','70020000100')
"""
load_data('70020100100.iki','70020100100',10)
load_data('20191204_041000_70020200100.iki','70020200100',10)
load_data('20191204_134001_50002600100.iki','50002600100',10)
load_data('20191205_005349_50002700100.iki','50002700100',10)
load_data('20191205_120737_50002800100.iki','50002800100',10)
load_data('20191205_232125_50002900100.iki','50002900100',10)
load_data('20191206_103513_50003000100.iki','50003000100',10)
load_data('20191207_071532_70020400100.iki','70020400100',10)
load_data('20191206_222021_70020300100.iki','70020300100',10)