4 __version__ =
'2.8.0_2023-08-09'
6 __dtypes__ = [
'',
'',
'_DARK',
'_SOL',
'_SPCA',
'_LIN',
'_LUN',
'_DIAG',
'_STAT',
7 '_SPEC',
'',
'_SNAP-X',
'_SNAP-I',
'',
'_LUN-ST',
'_RAW']
10 from l0info_utils
import read_packet, read_apid, get_anc_packet_time, is_bad_packet
14 CRC_TABLE = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,
15 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,
16 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,
17 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
18 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,
19 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
20 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,
21 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
22 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,
23 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,
24 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,
25 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
26 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,
27 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,
28 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,
29 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
30 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,
31 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
32 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,
33 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
34 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,
35 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,
36 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,
37 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
38 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,
39 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,
40 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,
41 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
42 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,
43 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
44 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,
45 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
46 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,
47 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,
48 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,
49 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
50 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,
51 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,
52 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,
53 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
54 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,
55 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
56 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
60 science_oci_format_header = 0x2bc
67 CRC_BUFFER: list[int] = [ 0x34,0x02]
70 CRC_BUFFER += data[:length]
71 size = (length + 2) // 4
73 crcA = CRC_TABLE[((crcA >> 8) ^ CRC_BUFFER[4 * i + 0])
75 crcA = crcA & shift_bit
76 crcA = CRC_TABLE[((crcA >> 8) ^ CRC_BUFFER[4 * i + 1])
78 crcA = crcA & shift_bit
79 crcB = CRC_TABLE[((crcB >> 8) ^ CRC_BUFFER[4 * i + 2])
81 crcB = crcB & shift_bit
82 crcB = CRC_TABLE[((crcB >> 8) ^ CRC_BUFFER[4 * i + 3])
84 crcB = crcB & shift_bit
85 return (crcA << 16) | crcB
111 itable = np.zeros(10, dtype={
'names':(
'dtype',
'iagg',
'lines'),
'formats':(
'i4',
'i4',
'i4')})
120 for i
in range(0,10):
121 itable[
'dtype'][i] = apacket[ioff+3]%16
122 itable[
'iagg'][i] = apacket[ioff+2]%4
123 itable[
'lines'][i] = apacket[ioff]*256 + apacket[ioff+1]
125 if ((itable[
'dtype'][i] > 0)
and (itable[
'dtype'][i] <= 12)
and (itable[
'dtype'][i] != 10)):
126 if (itable[
'dtype'][i] == 2):
127 ndc = ndc + itable[
'lines'][i]/nagg[itable[
'iagg'][i]]
128 nds = nds + itable[
'lines'][i]/8
129 ncp = ncp + itable[
'lines'][i]/nagg[itable[
'iagg'][i]]
130 nsp = nsp + itable[
'lines'][i]/8
143 btap = apacket[ioff+2]*256 + apacket[ioff+3]
144 rtap = apacket[ioff]*256 + apacket[ioff+1]
149 bagg = int.from_bytes(apacket[ioff+8:ioff+12],
'big')
150 ragg = int.from_bytes(apacket[ioff+4:ioff+8],
'big')
162 for i
in range(15,-1,-1):
163 btaps[i] = np.bitwise_and(btap, ken)/ken
165 baggs[i] = nagg[
int(np.bitwise_and(bagg, kag)/lag)]
166 nbb = nbb + 32/baggs[i]
168 rtaps[i] = np.bitwise_and(rtap, ken)/ken
170 raggs[i] = nagg[
int(np.bitwise_and(ragg, kag)/lag)]
171 nrb = nrb + 32/raggs[i]
177 return ncp,nbb,nrb,nsp,ndc,nds,btaps,rtaps,itable,baggs,raggs
198 if apacket[ioff:ioff+ilen] != apacket0[ioff:ioff+ilen]:
200 strmsg +=
"\nSpatial table change at %s" % c_time.strftime(
'%Y-%m-%dT%H:%M:%S.%f')
206 if apacket[joff:joff+jlen] != apacket0[joff:joff+jlen]:
208 strmsg +=
"\nSpectral table change at %s" % c_time.strftime(
'%Y-%m-%dT%H:%M:%S.%f')
211 return anc_compare, strmsg
216 if (apid < 550)
or (apid > 749):
217 print(
"Invalid packet header at byte %d."%fh.tell())
228 if (apid != 636):
return -1
230 dtypes = np.zeros(10)-1
232 for i
in range(0,10):
233 dtypes[i] = fpacket[ioff+3] % 16
235 kd = np.argwhere((dtypes != 2) & (dtypes != 10))
236 dtype = np.max(dtypes[kd])
243 print(
"Running l0info_oci (version: %s) \n" % __version__)
251 print(
"Reading OCI science data file.")
265 print(
"CRC checksum will be perfomed for each science packet")
266 while (apid != 636)
and (packetLength > 7):
273 if fpacket
and crcSumCheck:
274 phead_format = int.from_bytes(fpacket[:2],
"big")
275 if phead_format == science_oci_format_header:
276 dataCompute =
list(fpacket[0:-CRC_LENGTH])
278 crcExpected = int.from_bytes(fpacket[-CRC_LENGTH:],
"big")
279 if crcExpected != crcCalcs:
280 print(f
"Error : CRC checksum failed! Expected {hex(crcExpected)}, calculated {hex(crcCalcs)} for packet with apid {apid}")
286 print(
"CRC check finished.")
290 print(
'No stored science packets found in file.')
299 while (ccsec < 1900000000)
and (packetLength>7):
305 ccsec = int.from_bytes(fpacket[6:10],
'big')
311 str_stime = stime.strftime(
'%Y-%m-%dT%H:%M:%S.%f')
316 while fpacket
and (packetLength>7):
324 if (apid == 705)
and (
not firstraw):
328 if (apid >= 550)
and (apid < 750)
and (apid!=705): mpacket = fpacket
331 print(
"start_time=%s" % str_stime)
335 output.write(
"datatype=OCI\n")
336 print(
"No packets with valid time tags in file.")
342 if (dtype<1)
or (dtype>12):
343 print(
"Invalid data type %d."%dtype)
349 str_stime = stime.strftime(
'%Y-%m-%dT%H:%M:%S.%f')
350 print(
"start_time=%s" % str_stime)
359 nagg = np.array([1,2,4,8])
360 spnp = int.from_bytes(apacket[24:28],
'big')
366 spnum = int.from_bytes(apacket[24:28],
'big')
368 if ((spnum-spnp) > 10):
369 tmpstr +=
"\nSpin number gap: %d, %d" % (spnp, spnum)
372 tmpstr +=
"\n\nInstrument configuration change at spin %d, %s" % (spnum,etime)
373 ncp,nbb,nrb,nsp,ndc,nds,btaps,rtaps,itable,baggs,raggs =
get_band_dims(apacket)
374 iz = np.where((itable[
'dtype'] != 0) & (itable[
'dtype'] != 10))[0]
375 tmpstr +=
"\nData Type %s" %
str(itable[
'dtype'][iz])
376 iagg = nagg[itable[
'iagg'][iz]]
377 tmpstr +=
"\nNumber of pixels %s" %
str(itable[
'lines'][iz]/iagg)
378 tmpstr +=
"\nAggregation %s" %
str(iagg)
379 tmpstr +=
"\nBlue bands: %d Red bands: %d" %(nbb, nrb)
380 tmpstr +=
"\nBlue aggregation per tap: %s" %
str(baggs)
381 tmpstr +=
"\nRed aggregation per tap: %s\n" %
str(raggs)
387 while (apid != 636)
and (packetLength>0):
393 if fpacket: epacket = fpacket
400 str_etime = etime.strftime(
'%Y-%m-%dT%H:%M:%S.%f')
401 print(
"stop_time=%s" % str_etime)
406 datatype_name =
'OCI' + __dtypes__[dtype]
407 if datatype_name==
"OCI_LUN-ST":
408 print(
"Unexpected datatype [%s] is detected." % datatype_name)
411 print(
"OCI data type name reading error.")
414 if datatype_name==
'':
415 datatype_name =
'OCI'
417 print(
"datatype=%s" % datatype_name)
419 output.write(
"datatype=%s\n" % datatype_name)
421 output.write(
"start_time=%s\n" % str_stime)
423 output.write(
"stop_time=%s\n" % str_etime)