Skip to content

Instantly share code, notes, and snippets.

@boyank
Last active March 19, 2021 05:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save boyank/d9640e9c4dc3877012b8fb4dc9f6c053 to your computer and use it in GitHub Desktop.
Save boyank/d9640e9c4dc3877012b8fb4dc9f6c053 to your computer and use it in GitHub Desktop.
Example of reading NASA JUNO JADE CALIBRATED SCIENCE DATA
"""Example of reading NASA JUNO JADE CALIBRATED SCIENCE DATA
https://pds-ppi.igpp.ucla.edu/search/view/?f=yes&id=pds://PPI/JNO-J_SW-JAD-3-CALIBRATED-V1.0/DATA/2018/2018091/ELECTRONS/JAD_L30_LRS_ELC_ANY_CNT_2018091_V03&o=1
https://stackoverflow.com/a/66687113/4046632
"""
import struct
from functools import reduce
from operator import mul
from collections import namedtuple
__author__ = "Boyan Kolev, https://stackoverflow.com/users/4046632/buran"
with open('JAD_L30_LRS_ELC_ANY_CNT_2018091_V03.LBL') as f:
rjws = [line.strip('\n/* ') for line in f if line.startswith('/* RJW')]
# create the format string for struct
rjws = rjws[2:] # exclude first 2 RJW comments related to file itself
names = []
FMT = '='
print(f'Number of objects: {len(rjws)}')
for idx, rjw in enumerate(rjws):
_, name, fmt, num_dim, *dims = rjw.split(', ')
fstr = f'{reduce(mul, map(int, dims))}{fmt}'
FMT = f'{FMT} {fstr}'
names.append(name)
print(f'{idx}:{name}, {fstr}')
FMT = FMT.replace('c', 's') # for conveninece treat 21c as s char[]
print(f"Format string: {repr(FMT)}")
# parse DAT file
s = struct.Struct(FMT)
print(f'Struct size:{s.size}')
with open('JAD_L30_LRS_ELC_ANY_CNT_2018091_V03.DAT', 'rb') as f:
n = 0
while True: # in python3.8+ this loop can be simplified with walrus operator
chunk = f.read(s.size)
if not chunk:
break
data = s.unpack_from(chunk)
# process data further, e.g. split data in 2D containers where appropriate
n += 1
print(f'Number of records: {n}')
# make a named tuple to represent first 10 fields
# for nice display. This basic use of namedtuple works only
# for first 23 objects, which have single item.
num_fields = 10
Record = namedtuple('Record', names[:num_fields])
record = Record(*data[:num_fields])
print('\n----------------------\n')
print(f'First {num_fields} fields of the last record.')
print(record)
@boyank
Copy link
Author

boyank commented Mar 18, 2021

Sample output


Number of objects: 49
0:DIM0_UTC, 21c
1:PACKETID, 1B
2:DIM0_UTC_UPPER, 21c
3:PACKET_MODE, 1b
4:DIM0_UTC_LOWER, 21c
5:PACKET_SPECIES, 1b
6:ACCUMULATION_TIME, 1H
7:DATA_UNITS, 1B
8:SOURCE_BACKGROUND, 1B
9:SOURCE_DEAD_TIME, 1B
10:SOURCE_MAG, 1B
11:SOURCE_JADE_METAKERNEL, 1h
12:SOURCE_JADE_CALIB, 1h
13:FSW_VERSION, 1f
14:SC_POS_R, 1f
15:SC_POS_R_UPPER, 1f
16:SC_POS_R_LOWER, 1f
17:SC_POS_LAT, 1f
18:SC_POS_LAT_UPPER, 1f
19:SC_POS_LAT_LOWER, 1f
20:SC_POS_LOCAL_TIME, 1f
21:SC_POS_LOCAL_TIME_UPPER, 1f
22:SC_POS_LOCAL_TIME_LOWER, 1f
23:SC_POS_JUPITER_J2000XYZ, 3f
24:SC_VEL_JUPITER_J2000XYZ, 3f
25:SC_VEL_ANGULAR_J2000XYZ, 3f
26:SC_SPIN_PERIOD, 1f
27:DESPUN_SC_TO_J2000, 9f
28:J2000_TO_JSSXYZ, 9f
29:J2000_TO_JSSRTP, 9f
30:MCP_VOLTAGE, 1f
31:ISSUES, 1I
32:TIMESTAMP_WHOLE, 1I
33:TIMESTAMP_SUB, 1H
34:DATA, 3072f
35:DATA_SIGMA, 3072f
36:BACKGROUND, 3072f
37:BACKGROUND_SIGMA, 3072f
38:DIM1_E, 3072f
39:DIM1_E_UPPER, 3072f
40:DIM1_E_LOWER, 3072f
41:DIM2_ELEVATION, 3072f
42:DIM2_ELEVATION_UPPER, 3072f
43:DIM2_ELEVATION_LOWER, 3072f
44:DIM2_AZIMUTH_DESPUN, 3072f
45:DIM2_AZIMUTH_DESPUN_UPPER, 3072f
46:DIM2_AZIMUTH_DESPUN_LOWER, 3072f
47:MAG_VECTOR, 3f
48:ESENSOR, 1H
Format string: '= 21s 1B 21s 1b 21s 1b 1H 1B 1B 1B 1B 1h 1h 1f 1f 1f 1f 1f 1f 1f 1f 1f 1f 3f 3f 3f 1f 9f 9f 9f 1f 1I 1I 1H 3072f 3072f 3072f 3072f 3072f 3072f 3072f 3072f 3072f 3072f 3072f 3072f 3072f 3f 1H'
Struct size:160036
Number of records: 1101

----------------------

First 10 fields of the last record.
Record(DIM0_UTC=b'2018-091T23:56:08.925', PACKETID=106, DIM0_UTC_UPPER=b'2018-092T00:01:08.925', PACKET_MODE=1, DIM0_UTC_LOWER=b'2018-091T23:51:08.925', PACKET_SPECIES=-1, ACCUMULATION_TIME=600, DATA_UNITS=2, SOURCE_BACKGROUND=3, SOURCE_DEAD_TIME=0)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment