|
1
|
|
|
# -*- coding: utf-8 -*- |
|
2
|
|
|
|
|
3
|
|
|
|
|
4
|
|
|
'''Executed when aacgm2 is invoked with python -m aacgm2''' |
|
5
|
|
|
|
|
6
|
|
|
from __future__ import division, print_function, absolute_import |
|
7
|
|
|
|
|
8
|
|
|
import sys |
|
9
|
|
|
import argparse |
|
10
|
|
|
import datetime as dt |
|
11
|
|
|
|
|
12
|
|
|
import numpy as np |
|
13
|
|
|
|
|
14
|
|
|
import aacgm2 as aacgmv2 |
|
15
|
|
|
|
|
16
|
|
|
try: |
|
17
|
|
|
# Python 3 |
|
18
|
|
|
STDIN = sys.stdin.buffer |
|
19
|
|
|
STDOUT = sys.stdout.buffer |
|
20
|
|
|
except AttributeError: |
|
21
|
|
|
# Python 2 |
|
22
|
|
|
STDIN = sys.stdin |
|
23
|
|
|
STDOUT = sys.stdout |
|
24
|
|
|
|
|
25
|
|
|
|
|
26
|
|
|
def main(): |
|
27
|
|
|
'''Entry point for the script''' |
|
28
|
|
|
|
|
29
|
|
|
parser = argparse.ArgumentParser(description='Converts between geographical coordinates, AACGM-v2, and MLT') |
|
30
|
|
|
|
|
31
|
|
|
subparsers = parser.add_subparsers(title='Subcommands', prog='aacgmv2', dest='subcommand', |
|
32
|
|
|
description='for help, run %(prog)s SUBCOMMAND -h') |
|
33
|
|
|
subparsers.required = True |
|
34
|
|
|
parser_convert = subparsers.add_parser('convert', help=('convert to/from geomagnetic coordinates. Input file must ' |
|
35
|
|
|
'have lines of the form "LAT LON ALT".')) |
|
36
|
|
|
parser_convert_mlt = subparsers.add_parser('convert_mlt', help=('convert between magnetic local time (MLT) and ' |
|
37
|
|
|
'AACGM-v2 longitude. Input file must have a single ' |
|
38
|
|
|
'number on each line.')) |
|
39
|
|
|
|
|
40
|
|
|
for p in [parser_convert, parser_convert_mlt]: |
|
41
|
|
|
p.add_argument('-i', '--input', dest='file_in', metavar='FILE_IN', type=argparse.FileType('r'), |
|
42
|
|
|
default=STDIN, help='input file (stdin if none specified)') |
|
43
|
|
|
p.add_argument('-o', '--output', dest='file_out', metavar='FILE_OUT', type=argparse.FileType('wb'), |
|
44
|
|
|
default=STDOUT, help='output file (stdout if none specified)') |
|
45
|
|
|
|
|
46
|
|
|
parser_convert.add_argument('-d', '--date', dest='date', metavar='YYYYMMDD', |
|
47
|
|
|
help='date for magnetic field model (1900-2020, default: today)') |
|
48
|
|
|
parser_convert.add_argument('-v', '--a2g', dest='a2g', action='store_true', default=False, |
|
49
|
|
|
help='invert - convert AACGM to geographic instead of geographic to AACGM') |
|
50
|
|
|
parser_convert.add_argument('-t', '--trace', dest='trace', action='store_true', default=False, |
|
51
|
|
|
help='use field-line tracing instead of coefficients') |
|
52
|
|
|
parser_convert.add_argument('-a', '--allowtrace', dest='allowtrace', action='store_true', default=False, |
|
53
|
|
|
help='automatically use field-line tracing above 2000 km') |
|
54
|
|
|
parser_convert.add_argument('-b', '--badidea', dest='badidea', action='store_true', default=False, |
|
55
|
|
|
help='allow use of coefficients above 2000 km (bad idea!)') |
|
56
|
|
|
parser_convert.add_argument('-g', '--geocentric', dest='geocentric', action='store_true', default=False, |
|
57
|
|
|
help='assume inputs are geocentric with Earth radius 6371.2 km') |
|
58
|
|
|
|
|
59
|
|
|
parser_convert_mlt.add_argument('datetime', metavar='YYYYMMDDHHMMSS', help='date and time for conversion') |
|
60
|
|
|
parser_convert_mlt.add_argument('-v', '--m2a', dest='m2a', action='store_true', default=False, |
|
61
|
|
|
help='invert - convert MLT to AACGM longitude instead of AACGM longitude to MLT') |
|
62
|
|
|
|
|
63
|
|
|
args = parser.parse_args() |
|
64
|
|
|
|
|
65
|
|
|
array = np.loadtxt(args.file_in, ndmin=2) |
|
66
|
|
|
|
|
67
|
|
|
if args.subcommand == 'convert': |
|
68
|
|
|
date = dt.date.today() if args.date is None else dt.datetime.strptime(args.date, '%Y%m%d') |
|
69
|
|
|
lats, lons, alts = aacgmv2.convert(array[:, 0], array[:, 1], array[:, 2], date=date, a2g=args.a2g, trace=args.trace, |
|
70
|
|
|
allowtrace=args.allowtrace, badidea=args.badidea, geocentric=args.geocentric) |
|
71
|
|
|
with args.file_out as f: |
|
72
|
|
|
np.savetxt(f, np.column_stack((lats, lons, alts)), fmt='%.8f') |
|
73
|
|
|
elif args.subcommand == 'convert_mlt': |
|
74
|
|
|
datetime = dt.datetime.strptime(args.datetime, '%Y%m%d%H%M%S') |
|
75
|
|
|
out = aacgmv2.convert_mlt(array, datetime, m2a=args.m2a) |
|
76
|
|
|
with args.file_out as f: |
|
77
|
|
|
np.savetxt(f, out, fmt='%.8f') |
|
78
|
|
|
|
|
79
|
|
|
|
|
80
|
|
|
if __name__ == '__main__': |
|
81
|
|
|
sys.exit(main()) |
|
82
|
|
|
|