more apps
This commit is contained in:
29
monthplan/management/commands/00_load_surveypath.py
Normal file
29
monthplan/management/commands/00_load_surveypath.py
Normal file
@@ -0,0 +1,29 @@
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from django.contrib.auth.models import User
|
||||
from django.core import mail
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.html import strip_tags
|
||||
from django.core.mail import send_mail
|
||||
|
||||
import time
|
||||
import re
|
||||
import glob
|
||||
import logging
|
||||
|
||||
from monthplan.utils import load_surveypath_data
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Initiates data base'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
|
||||
logging.getLogger().setLevel(logging.INFO)
|
||||
|
||||
path = "/export/django/srg/data/npol/DMV/ARJ-SCAN/20??????_??????_???????????.iki"
|
||||
ikifiles = []
|
||||
for file in glob.glob(path):
|
||||
ikifiles.append(file)
|
||||
|
||||
for file in ikifiles:
|
||||
load_surveypath_data(file,100,notify=True)
|
76
monthplan/management/commands/00_watchdog.py
Normal file
76
monthplan/management/commands/00_watchdog.py
Normal file
@@ -0,0 +1,76 @@
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from django.contrib.auth.models import User
|
||||
from django.core import mail
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.html import strip_tags
|
||||
from django.core.mail import send_mail
|
||||
|
||||
import time
|
||||
from watchdog.observers import Observer
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
from watchdog.events import PatternMatchingEventHandler
|
||||
|
||||
class MyHandler(PatternMatchingEventHandler):
|
||||
patterns = ["*gyro.fits",]
|
||||
|
||||
def process(self, event):
|
||||
"""
|
||||
event.event_type
|
||||
'modified' | 'created' | 'moved' | 'deleted'
|
||||
event.is_directory
|
||||
True | False
|
||||
event.src_path
|
||||
path/to/observed/file
|
||||
"""
|
||||
# the file will be processed there
|
||||
|
||||
|
||||
if not event.event_type == 'created':
|
||||
return
|
||||
|
||||
print("Reading {} ty[e: {}".format(event.src_path, event.event_type))
|
||||
|
||||
#if not 'L1b' in event.src_path:
|
||||
# return
|
||||
|
||||
users = User.objects.filter(groups__name='srg-artxc-survey')
|
||||
to_emails=[]
|
||||
for user in users:
|
||||
to_emails.append(user.email)
|
||||
|
||||
print (event.src_path, event.event_type) # print now only for degug
|
||||
|
||||
count=1
|
||||
subject = "New SRG data"
|
||||
html_message = render_to_string('monthplan/data_loaded_email.html', {'event':event, 'count':count})
|
||||
plain_message = strip_tags(html_message)
|
||||
from_email = 'Roman Krivonos <krivonos@cosmos.ru>'
|
||||
|
||||
mail.send_mail(subject, plain_message, from_email, ['krivonos@cosmos.ru','kate@cosmos.ru',], html_message=html_message)
|
||||
|
||||
def on_modified(self, event):
|
||||
self.process(event)
|
||||
|
||||
def on_created(self, event):
|
||||
self.process(event)
|
||||
|
||||
class EventHandler(FileSystemEventHandler):
|
||||
def on_created(self, event):
|
||||
print (event)
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Initiates data base'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
|
||||
|
||||
path = "/srg/work/oper/data/2020/"
|
||||
observer = Observer()
|
||||
observer.schedule(MyHandler(), path, recursive=True)
|
||||
observer.start()
|
||||
try:
|
||||
while True:
|
||||
time.sleep(10)
|
||||
except KeyboardInterrupt:
|
||||
observer.stop()
|
||||
observer.join()
|
19
monthplan/management/commands/01_init_monthplan.py
Normal file
19
monthplan/management/commands/01_init_monthplan.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
|
||||
from datetime import date
|
||||
from logbook.models import LogBookDay
|
||||
from plan.models import INPUT_DATA_DIR
|
||||
from plan.models import LaunchDate
|
||||
import datetime
|
||||
from django.utils import timezone
|
||||
import astropy
|
||||
import pandas as pd
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Initiates data dase'
|
||||
|
||||
# def add_arguments(self, parser):
|
||||
# parser.add_argument('poll_id', nargs='+', type=int)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
self.stdout.write(self.style.SUCCESS('Successfully initiated "%s"' % 100))
|
123
monthplan/management/commands/02_load_monthplan.py
Normal file
123
monthplan/management/commands/02_load_monthplan.py
Normal file
@@ -0,0 +1,123 @@
|
||||
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
|
||||
from monthplan.utils import load_monthplan_fits, load_monthplan_dir
|
||||
|
||||
from astropy.io import fits
|
||||
|
||||
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 math
|
||||
|
||||
def load_data(file):
|
||||
print('Load data (dummy)')
|
||||
fitsfile=INPUT_DATA_DIR+'/'+file
|
||||
table = Table.read(fitsfile)
|
||||
df = table.to_pandas()
|
||||
print("Column headings:")
|
||||
print(df.columns.str.encode('utf-8'))
|
||||
hdul = fits.open(fitsfile)
|
||||
hdul.info()
|
||||
head=Head()
|
||||
head.start=hdul[1].header['START']
|
||||
head.stop=hdul[1].header['STOP']
|
||||
head.gentime=hdul[1].header['GENTIME']
|
||||
head.version=hdul[1].header['VERSION']
|
||||
head.author=hdul[1].header['AUTHOR']
|
||||
head.file=file
|
||||
head.nrows=df.shape[0]
|
||||
head.save()
|
||||
for i in df.index:
|
||||
row=(i+1)
|
||||
if(df['TYPE'][i].decode().strip() == 'SEANCE'):
|
||||
print('SEA')
|
||||
print(df['START'][i].decode().strip())
|
||||
seance=Seance(head=head, row=row)
|
||||
seance.start=df['START'][i].decode().strip()
|
||||
seance.stop=df['STOP'][i].decode().strip()
|
||||
seance.stations=df['STATIONS'][i].decode().strip()
|
||||
seance.guid=df['GUID'][i].decode().strip()
|
||||
seance.save()
|
||||
if(df['TYPE'][i].decode().strip() == 'OBSERVATION'):
|
||||
obs=Observation(head=head, row=row)
|
||||
obs.start=df['START'][i].decode().strip()
|
||||
obs.stop=df['STOP'][i].decode().strip()
|
||||
obs.target=df['TARGET'][i].decode().strip()
|
||||
obs.experiment=df['EXPERIMENT'][i].decode().strip()
|
||||
obs.ra=df['RA'][i]
|
||||
obs.dec=df['DEC'][i]
|
||||
obs.ra=df['RA'][i]
|
||||
obs.roll_angle=df['ROLL_ANGLE'][i]
|
||||
obs.sun_xoz_angle=df['SUN_XOZ_ANGLE'][i]
|
||||
obs.guid=df['GUID'][i].decode().strip()
|
||||
obs.save()
|
||||
if(df['TYPE'][i].decode().strip() == 'CORRECTION'):
|
||||
cor=Correction(head=head, row=row)
|
||||
cor.start=df['START'][i].decode().strip()
|
||||
cor.stop=df['STOP'][i].decode().strip()
|
||||
cor.impstart=df['IMPSTART'][i].decode().strip()
|
||||
cor.guid=df['GUID'][i].decode().strip()
|
||||
cor.save()
|
||||
if(df['TYPE'][i].decode().strip() == 'SCAN'):
|
||||
print('SCAN')
|
||||
scan=Scan(head=head, row=row)
|
||||
scan.start=df['START'][i].decode().strip()
|
||||
scan.stop=df['STOP'][i].decode().strip()
|
||||
scan.target=df['TARGET'][i].decode().strip()
|
||||
scan.experiment=df['EXPERIMENT'][i].decode().strip()
|
||||
scan.ra=df['RA'][i]
|
||||
scan.dec=df['DEC'][i]
|
||||
scan.roll_angle=df['ROLL_ANGLE'][i]
|
||||
scan.sun_xoz_angle=df['SUN_XOZ_ANGLE'][i]
|
||||
scan.template=int(df['TEMPLATE'][i].decode().strip())
|
||||
scan.guid=df['GUID'][i].decode().strip()
|
||||
scan.save()
|
||||
if(df['TYPE'][i].decode().strip() == 'SURVEY'):
|
||||
sur=Scan(head=head, row=row)
|
||||
sur.start=df['START'][i].decode().strip()
|
||||
sur.stop=df['STOP'][i].decode().strip()
|
||||
sur.target=df['TARGET'][i].decode().strip()
|
||||
sur.experiment=df['EXPERIMENT'][i].decode().strip()
|
||||
sur.ra_p=df['RA_P'][i]
|
||||
sur.dec_p=df['DEC_P'][i]
|
||||
sur.ra_z0=df['RA_Z0'][i]
|
||||
sur.dec_z0=df['DEC_Z0'][i]
|
||||
sur.ra_zk=df['RA_ZK'][i]
|
||||
sur.dec_zk=df['DEC_ZK'][i]
|
||||
sur.z_speed=df['Z_SPEED'][i]
|
||||
sur.guid=df['GUID'][i].decode().strip()
|
||||
sur.save()
|
||||
#myplan = LogBookPlan(daynumber=myday.daynumber, description=df['plan'][i], date=df['date'][i])
|
||||
#myplan.save()
|
||||
#myday.plan.add(myplan)
|
||||
#myday.save()
|
||||
print(df['TYPE'][i])
|
||||
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('RG_MonthPlan_2019-07_v08.fits')
|
||||
#load_data('RG_MonthPlan_2019-08_v14.fits')
|
||||
#load_monthplan_fits('/export/django/srg/data/npol/fits/RG_MonthPlan_2020-06_v07.fits')
|
||||
load_monthplan_dir('/export/django/srg/data/npol/fits')
|
||||
self.stdout.write(self.style.SUCCESS("Done"))
|
127
monthplan/management/commands/03_load_flightplan.py
Normal file
127
monthplan/management/commands/03_load_flightplan.py
Normal file
@@ -0,0 +1,127 @@
|
||||
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
|
||||
|
||||
from astropy.io import fits
|
||||
|
||||
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 math
|
||||
|
||||
import astropy.units as u
|
||||
from astropy.time.formats import erfa
|
||||
from astropy.time import Time, TimeDelta, TimezoneInfo, TimeFromEpoch
|
||||
from datetime import datetime
|
||||
|
||||
MJDREF = 51543.875
|
||||
TZ_UTC = TimezoneInfo(utc_offset=0*u.hour)
|
||||
TZ_MSK = TimezoneInfo(utc_offset=3*u.hour)
|
||||
|
||||
# 2019-08-01T02:28:00+03:00
|
||||
TIMESTR_FORMAT = '%Y-%m-%dT%H:%M:%S+03:00'
|
||||
|
||||
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')
|
||||
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)
|
||||
|
||||
def print_pz_dt_sec(dtstr):
|
||||
dt = str2date(dtstr, tzone=TZ_UTC)
|
||||
ts = date2mission(dt)
|
||||
print(dt, '-->', ts)
|
||||
|
||||
def load_data(file):
|
||||
print('Load data (dummy)')
|
||||
fitsfile=INPUT_DATA_DIR+'/'+file
|
||||
table = Table.read(fitsfile)
|
||||
df = table.to_pandas()
|
||||
print("Column headings:")
|
||||
print(df.columns.str.encode('utf-8'))
|
||||
hdul = fits.open(fitsfile)
|
||||
hdul.info()
|
||||
for i in df.index:
|
||||
dtstr=df['START'][i].decode().strip()
|
||||
dt = str2date(dtstr, tzone=TZ_MSK)
|
||||
start_ts = date2mission(dt)
|
||||
|
||||
dtstr=df['STOP'][i].decode().strip()
|
||||
dt = str2date(dtstr, tzone=TZ_MSK)
|
||||
stop_ts = date2mission(dt)
|
||||
#print(dt, '-->', ts)
|
||||
|
||||
obs=FlightPlan()
|
||||
obs.start=df['START'][i].decode().strip()
|
||||
obs.stop=df['STOP'][i].decode().strip()
|
||||
obs.experiment=df['EXPERIMENT'][i].decode().strip()
|
||||
obs.ra=df['RA'][i]
|
||||
obs.dec=df['DEC'][i]
|
||||
obs.q1=df['Q1'][i]
|
||||
obs.q2=df['Q2'][i]
|
||||
obs.q3=df['Q3'][i]
|
||||
obs.q4=df['Q4'][i]
|
||||
obs.start_npol = df['START_NPOL'][i].decode().strip()
|
||||
obs.stop_npol = df['STOP_NPOL'][i].decode().strip()
|
||||
obs.load_stamp = df['LOAD_STAMP'][i].decode().strip()
|
||||
obs.mjd_start = df['MJD_START'][i]
|
||||
obs.mjd_stop = df['MJD_STOP'][i]
|
||||
obs.obt_start = start_ts # df['OBT_START'][i]
|
||||
obs.obt_stop = stop_ts # df['OBT_STOP'][i]
|
||||
obs.save()
|
||||
print(df['EXPERIMENT'][i])
|
||||
pass
|
||||
|
||||
def validate_flightplan():
|
||||
list = FlightPlan.objects.all()
|
||||
for pz in list:
|
||||
if (pz.experiment == '00000000000' and pz.valid == True):
|
||||
pz.valid = False
|
||||
pz.save()
|
||||
continue
|
||||
first = FlightPlan.objects.filter(experiment__exact=pz.experiment).order_by("-load_stamp")[0]
|
||||
first.valid = True
|
||||
first.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):
|
||||
pz = FlightPlan.objects.all()
|
||||
pz.delete()
|
||||
load_data('pz.fits')
|
||||
validate_flightplan()
|
126
monthplan/management/commands/04_load_datadump.py
Normal file
126
monthplan/management/commands/04_load_datadump.py
Normal file
@@ -0,0 +1,126 @@
|
||||
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
|
||||
|
||||
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
|
||||
import math
|
||||
|
||||
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')
|
||||
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)
|
||||
|
||||
|
||||
def print_pz_dt_sec(dtstr):
|
||||
dt = str2date(dtstr, tzone=TZ_UTC)
|
||||
ts = date2mission(dt)
|
||||
|
||||
print(dt, '-->', ts)
|
||||
|
||||
|
||||
def load_data(file):
|
||||
print('Load data (dummy)')
|
||||
csvfile=INPUT_DATA_DIR+'/'+file
|
||||
df = pd.read_csv(csvfile,names=['name', 'path', 'filename', 'tstart','tstop'])
|
||||
print(df)
|
||||
for i in df.index:
|
||||
dd = DataDump()
|
||||
dd.start=mission2date(int(df['tstart'][i]), TZ_MSK)
|
||||
dd.stop=mission2date(int(df['tstop'][i]), TZ_MSK)
|
||||
dd.tstart=int(df['tstart'][i])
|
||||
dd.tstop=int(df['tstop'][i])
|
||||
dd.name=df['name'][i]
|
||||
dd.filename=df['filename'][i]
|
||||
dd.path=df['path'][i]
|
||||
dd.save()
|
||||
observations = Observation.objects.filter(Q(start__gte=dd.start) & Q(start__lte=dd.stop))
|
||||
scans = Scan.objects.filter(Q(start__gte=dd.start) & Q(start__lte=dd.stop))
|
||||
for observation in observations:
|
||||
dd.observations.add(observation)
|
||||
for scan in scans:
|
||||
dd.scans.add(scan)
|
||||
observations = Observation.objects.filter(Q(stop__gte=dd.start) & Q(stop__lte=dd.stop))
|
||||
scans = Scan.objects.filter(Q(stop__gte=dd.start) & Q(stop__lte=dd.stop))
|
||||
for observation in observations:
|
||||
dd.observations.add(observation)
|
||||
for scan in scans:
|
||||
dd.scans.add(scan)
|
||||
dd.save()
|
||||
print(mission2date(int(df['tstart'][i]), TZ_MSK))
|
||||
print(df['name'][i])
|
||||
pass
|
||||
|
||||
def validate_flightplan():
|
||||
list = FlightPlan.objects.all()
|
||||
for pz in list:
|
||||
if (pz.experiment == '00000000000' and pz.valid == True):
|
||||
pz.valid = False
|
||||
pz.save()
|
||||
continue
|
||||
first = FlightPlan.objects.filter(experiment__exact=pz.experiment).order_by("-load_stamp")[0]
|
||||
first.valid = True
|
||||
first.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):
|
||||
dds = DataDump.objects.all()
|
||||
dds.delete()
|
||||
load_data('read_seance.csv')
|
||||
print_pz_dt_sec('2019-08-21 22:00:00')
|
||||
print_pz_dt_sec('2019-08-21 23:00:00')
|
||||
|
||||
#validate_flightplan()
|
239
monthplan/management/commands/05_load_survey_track.py
Normal file
239
monthplan/management/commands/05_load_survey_track.py
Normal file
@@ -0,0 +1,239 @@
|
||||
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)
|
||||
|
||||
|
181
monthplan/management/commands/05_load_survey_track.py.bak
Normal file
181
monthplan/management/commands/05_load_survey_track.py.bak
Normal file
@@ -0,0 +1,181 @@
|
||||
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 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):
|
||||
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 (dummy)')
|
||||
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+'/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=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()
|
||||
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('kvater22_23-09.rez','10000000100',50)
|
||||
load_data('kvater23_24-09.rez','10000000200',50)
|
||||
|
||||
load_data('kvater14-11_13_35_00.rez','10000100100',50)
|
||||
load_data('kvater15-11_14_35_00.rez','10000100200',50)
|
||||
|
||||
|
||||
load_data('20191203_150000_10000200100.iki','10000200100',50)
|
||||
load_data('20191208_170000_10000300100.iki','10000300100',50)
|
||||
load_data('20191210_223000_10000400100.iki','10000400100',50)
|
||||
load_data('20191212_003000_11000000100.iki','11000000100',50)
|
||||
return
|
||||
|
||||
#
|
||||
# Experiments:
|
||||
#
|
||||
|
||||
# .407947163597554
|
||||
# .826585167542578 ! 327.89199999
|
||||
# -.077996859000543 ! -34.35000000
|
||||
# -.379805953741339 ! .000
|
||||
print('327.89199999 -34.35000000')
|
||||
arr=[.826585167542578, -.077996859000543, -.379805953741339, .407947163597554]
|
||||
#qfin = Rotation.from_quat(arr)
|
||||
#qfin = Rotation.from_quat([0, 0, np.sin(np.pi/4), np.cos(np.pi/4)])
|
||||
#print(qfin.as_euler('zyx', degrees=True))
|
||||
#qadd=Rotation([0, 0, 0, 1])
|
||||
#qfin=Rotation(arr)
|
||||
#a = quat_to_pol_and_roll(qfin)
|
||||
#print(a)
|
||||
#print_obsplan_dt_sec('2019.10.16 10:42:04')
|
||||
|
||||
#print_obsplan_dt_sec('2019.10.17 00:47:42')
|
||||
# # print_pz_dt_sec('2019.08.21 23:00:00')
|
||||
|
||||
print('***')
|
||||
quat = Quat(attitude=arr)
|
||||
print(quat.ra, quat.dec, quat.roll)
|
||||
|
||||
#validate_flightplan()
|
280
monthplan/management/commands/06_load_scan_track.py
Normal file
280
monthplan/management/commands/06_load_scan_track.py
Normal file
@@ -0,0 +1,280 @@
|
||||
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)
|
36
monthplan/management/commands/init_survey_healpix_plates.py
Normal file
36
monthplan/management/commands/init_survey_healpix_plates.py
Normal file
@@ -0,0 +1,36 @@
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from monthplan.models import SurveyHealpixPlate, NSIDE_PLATES, ORDER
|
||||
|
||||
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
|
||||
|
||||
|
||||
def init_healpix_plates(nside, order):
|
||||
hp = HEALPix(nside=nside, order=order, frame=FK5())
|
||||
print("Make Healpix Plates",hp.npix,hp.pixel_area.value,hp.pixel_resolution.value)
|
||||
|
||||
try:
|
||||
print('Delete existing Healpix Plates')
|
||||
plates = SurveyHealpixPlate.objects.all()
|
||||
plates.delete()
|
||||
except:
|
||||
print('Abort')
|
||||
exit()
|
||||
for heal in range(hp.npix):
|
||||
sc = hp.healpix_to_skycoord(heal)
|
||||
plate = SurveyHealpixPlate(healpix=heal, ra=float(sc.ra.degree), dec=float(sc.dec.degree))
|
||||
plate.save()
|
||||
pass
|
||||
|
||||
class Command(BaseCommand):
|
||||
|
||||
def handle(self, *args, **options):
|
||||
init_healpix_plates(NSIDE_PLATES, ORDER)
|
||||
|
||||
|
||||
|
||||
|
@@ -0,0 +1,46 @@
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from monthplan.models import SurveyHealpixPlate, SurveyHealpixSubPlate, NSIDE_PLATES, NSIDE_SUBPLATES, ORDER
|
||||
|
||||
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
|
||||
|
||||
|
||||
def init_healpix_sub_plates(nside_plates, nside_subplates, order):
|
||||
hp_plates = HEALPix(nside=nside_plates, order=order, frame=FK5())
|
||||
hp_subplates = HEALPix(nside=nside_subplates, order=order, frame=FK5())
|
||||
|
||||
print("Make Healpix Plates",hp_plates.npix,hp_plates.pixel_area.value,hp_plates.pixel_resolution.value)
|
||||
print("Make Healpix SubPlates",hp_subplates.npix,hp_subplates.pixel_area.value,hp_subplates.pixel_resolution.value)
|
||||
try:
|
||||
print('Delete existing Healpix Plates')
|
||||
subplates = SurveyHealpixSubPlate.objects.all()
|
||||
subplates.delete()
|
||||
except:
|
||||
print('Abort')
|
||||
exit()
|
||||
|
||||
for heal in range(hp_subplates.npix):
|
||||
sc = hp_subplates.healpix_to_skycoord(heal)
|
||||
crd = SkyCoord(float(sc.ra.degree), float(sc.dec.degree), frame="fk5", unit="deg")
|
||||
heal = hp_plates.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')
|
||||
return
|
||||
subplate = SurveyHealpixSubPlate(healpix=heal, ra=float(sc.ra.degree), dec=float(sc.dec.degree), plate=plate)
|
||||
subplate.save()
|
||||
pass
|
||||
|
||||
class Command(BaseCommand):
|
||||
|
||||
def handle(self, *args, **options):
|
||||
init_healpix_sub_plates(NSIDE_PLATES, NSIDE_SUBPLATES, ORDER)
|
||||
|
||||
|
||||
|
||||
|
54
monthplan/management/commands/mark_survey_healpix_plates.py
Normal file
54
monthplan/management/commands/mark_survey_healpix_plates.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from monthplan.models import SurveyHealpixPlate, NSIDE_PLATES, ORDER, MAPS_DIR, Survey, SurveyPath
|
||||
|
||||
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
|
||||
|
||||
import numpy as np
|
||||
|
||||
from srglib.utils import slerp, quat_to_pol_and_roll
|
||||
import math
|
||||
from Quaternion import Quat
|
||||
|
||||
class Command(BaseCommand):
|
||||
|
||||
|
||||
def handle(self, *args, **options):
|
||||
tolerance = 10.0
|
||||
hp = HEALPix(nside=NSIDE_PLATES, order=ORDER, frame=FK5())
|
||||
surveys=Survey.objects.all()
|
||||
for survey in surveys:
|
||||
print(survey.experiment)
|
||||
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()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
91
monthplan/management/commands/real_time_track.py
Normal file
91
monthplan/management/commands/real_time_track.py
Normal file
@@ -0,0 +1,91 @@
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from datetime import datetime as dt
|
||||
|
||||
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 srglib.utils import make_source_name
|
||||
|
||||
from monthplan.models import Head, Observation, Seance, Correction, Scan, Survey, FlightPlan
|
||||
|
||||
from astropy.io import fits
|
||||
|
||||
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 math
|
||||
|
||||
from django.db.models import Q
|
||||
|
||||
def find_closest(now, closest_greater_qs, closest_less_qs):
|
||||
try:
|
||||
try:
|
||||
closest_greater = closest_greater_qs[0]
|
||||
except IndexError:
|
||||
closest = closest_less_qs[0]
|
||||
|
||||
try:
|
||||
closest_less = closest_less_qs[0]
|
||||
except IndexError:
|
||||
closest = closest_greater_qs[0]
|
||||
except IndexError:
|
||||
raise self.model.DoesNotExist("There is no closest object"
|
||||
" because there are no objects.")
|
||||
if closest_greater.dtime - now > now - closest_less.dtime:
|
||||
closest = closest_less
|
||||
else:
|
||||
closest = closest_greater
|
||||
return closest.ra, closest.dec
|
||||
|
||||
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):
|
||||
name = make_source_name('SRG A',0.87,45.0)
|
||||
print(name)
|
||||
return
|
||||
now = timezone.localtime(timezone.now())
|
||||
print(now)
|
||||
ra='n/a'
|
||||
dec='n/a'
|
||||
request_path='load'
|
||||
try:
|
||||
surveys = Survey.objects.filter(Q(start__lte=now) & Q(stop__gte=now))
|
||||
# take first element only:
|
||||
for survey in surveys:
|
||||
print(survey.ra_p)
|
||||
target = survey.target
|
||||
obsid = survey.experiment
|
||||
url = survey.get_absolute_url()
|
||||
ra="%.4f" % survey.ra_p
|
||||
dec="%.4f" % survey.dec_p
|
||||
mode='Survey'
|
||||
if request_path == "load":
|
||||
path=list(survey.surveypath_set.all().values('ra', 'dec'))[::500]
|
||||
|
||||
closest_greater_qs = survey.surveypath_set.filter(dtime__gt=now).order_by('dtime')
|
||||
closest_less_qs = survey.surveypath_set.filter(dtime__lt=now).order_by('-dtime')
|
||||
closest_ra, closest_dec = find_closest(now, closest_greater_qs, closest_less_qs)
|
||||
ra="%.4f" % closest_ra
|
||||
dec="%.4f" % closest_dec
|
||||
print("*** closest found ***")
|
||||
break
|
||||
except NameError as error:
|
||||
print('pass',error)
|
||||
pass
|
||||
|
||||
print(ra, dec)
|
34
monthplan/management/commands/show_user_emails.py
Normal file
34
monthplan/management/commands/show_user_emails.py
Normal file
@@ -0,0 +1,34 @@
|
||||
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 django.contrib.auth.models import User
|
||||
|
||||
from monthplan.models import Head, Observation, Seance, Correction, Scan, Survey, FlightPlan
|
||||
|
||||
from astropy.io import fits
|
||||
|
||||
import datetime
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
|
||||
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):
|
||||
user = User.objects.get(id=2)
|
||||
user_email = user.email
|
||||
print(user_email)
|
||||
emails = []
|
||||
users = User.objects.all()
|
||||
for user in users:
|
||||
emails.append(user.email)
|
||||
print(emails)
|
||||
|
Reference in New Issue
Block a user