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)