diff --git a/ckMseed/LibTrace.py b/ckMseed/LibTrace.py index 16a3a2089295b0d604f1532f557cfa70838cde43..bfb488364873d129047e18f0deeb8d44aa174a5a 100644 --- a/ckMseed/LibTrace.py +++ b/ckMseed/LibTrace.py @@ -4,36 +4,36 @@ # LibTrace # # classes for Segy & Mseed -# identify file types -# read mseed headers +# identify file types +# read mseed headers # # author: bcb -# + # Notes 2004.101 -# + # SEED # build a writer -# + # SEGY # SEGY needs to be expanded # build a writer -# + ########################## # 2004.141 # Modification # Author: bcb # # MSEED -# created UbytetoStr to decompose Ubyte to bit fields -# modified blks 200, 201, 300, 310, 320, 390 and fixhdr to utilize -# +# created UbytetoStr to decompose Ubyte to bit fields +# modified blks 200, 201, 300, 310, 320, 390 and fixhdr to utilize + ########################## # 2004.295 # Modification # Author: bcb # # corrected bug in mseed.calcrate -# + ########################## # 2005.026 # Modification @@ -44,7 +44,7 @@ # as a tuple within the blk list # changed unpack formats to use native byte order with standard size & # alignment -# + ########################## # 2005.035 # Modification @@ -53,10 +53,9 @@ # added check for endianess in Mseed & Segy classes, self.ByteOrder # changed all unpack formats to reflect above change in Mseed & Segy classes # NOTE: for mseed it is possible to have mixed endianess (e.g. little-endian -# headers and big-endian data). At this time, this library does not -# handle data and makes the determination of endianess based soley on -# the header. -# +# headers and big-endian data). At this time, this library does not handle data +# and makes the determination of endianess based soley on the header. + ########################## # 2005.138 # Modification @@ -66,7 +65,6 @@ # Mseed.Pad, Mseed.FlagStrtoInt, Mseed.WriteFixedHdr and all of # Mseed.Writeblk??? # fixed improper casting of Time Correction in Mseed.fixedhdr to signed long -# ########################## # 2006.179 # bug fix @@ -74,7 +72,6 @@ # # text for little endian in class Segy:ByteOrder had an error such that # little endian files would never be found -# ########################## # 2006.271 # bug fix @@ -82,7 +79,6 @@ # # index error in Mseed:tracelength that caused trace length calculation # to be 1 sample too long. -# ########################## # 2006.335 # bug fix @@ -92,7 +88,6 @@ # fixed oversight in handling flags in blk100 reads (forgot to # implement UbyteToStr # fixed improper handling of res fields in blk100, blk201 and blk400 -# ########################## # 2007.342 # cleanup @@ -100,14 +95,12 @@ # # Re-organized WriteFixedHdr to pack all packets prior to any writes. Avoids # partially written fixed header -# ########################## # 2008.038 # # Author: bcb # # added GetBlk, PutBlk -# ########################## # 2008.179 # @@ -116,7 +109,6 @@ # minimized file reads # introduced FixedHeader class # maintained old functionality for now. -# ########################## # 2008.204 # @@ -124,39 +116,24 @@ # # corrected typo from DHQaul to DHQual # added local variables to class Mseed +################################################################ # -########################## # modification # version: 2019.025 # author: Lan Dam # convert to py3 # Bug fix: In Writeblk200/201/300/310/320/390/395/500 when unpack inblk to # variables with time (Year, Day, Hour, Min, Sec, junk, Micro) -# -########################## -# modification -# version: 2020.211 -# author: Maeva Pourpoint -# -# Fixed issue with exec and variable scope (see GetBlk() and PutBlk()) -# -########################## -# modification -# version: 2022.1.0.0 -# author: Omid Hosseini -# -# Change the versioning scheme -# -########################## import os -import string import struct import sys import time SPACE = " " +# VERSION = "2019.025" + class futils: """ @@ -224,15 +201,9 @@ class Mseed(futils): if odd_size: pass # starttime of trace - # self.time = string.join(list(map(str, (self.FH.Year, - # self.FH.Day, - # self.FH.Hour, - # self.FH.Min, - # self.FH.Sec))), ":") - templist = list(map(str, (self.FH.Year, self.FH.Day, - self.FH.Hour, self.FH.Min, - self.FH.Sec))) - self.time = ":".join(templist) + self.time = ":".join(map(str, (self.FH.Year, self.FH.Day, + self.FH.Hour, self.FH.Min, + self.FH.Sec))) except Exception: pass @@ -309,12 +280,8 @@ class Mseed(futils): """ try: hdrs = self.fixedhdr(seekval) - # time = string.join(list(map(str, (self.FH.Year, self.FH.Day, - # self.FH.Hour,self.FH.Min, - # self.FH.Sec))), ":") - templist = list(map(str, (self.FH.Year, self.FH.Day, self.FH.Hour, + time = ":".join(map(str, (self.FH.Year, self.FH.Day, self.FH.Hour, self.FH.Min, self.FH.Sec))) - time = ":".join(templist) return time except Exception: pass @@ -328,6 +295,7 @@ class Mseed(futils): """ try: hdrs = self.fixedhdr(seekval) + return (self.FH.Stat, self.FH.Chan, self.FH.Loc, self.FH.Net, self.rate, self.FH.Year, self.FH.Day, self.FH.Hour, self.FH.Min, self.FH.Sec, self.FH.Micro) @@ -363,7 +331,6 @@ class Mseed(futils): else: rate = sampFact return rate - ######################################################### def ByteOrder(self, seekval=20): @@ -380,7 +347,7 @@ class Mseed(futils): # timeblock=self.TraceBuffer[seekval:seekval+10] # assume big endian - (Year, Day, Hour, Min, Sec, junk, Micro) =\ + (Year, Day, Hour, Min, Sec, junk, Micro) = \ self.sunpack('>HHBBBBH', timeblock) # test if big endian read makes sense if 1950 <= Year <= 2050 and \ @@ -476,25 +443,25 @@ class Mseed(futils): # for blockette descriptions below # from SEED manual # -# Field nbits Description -# UBYTE 8 Unsigned quantity -# BYTE 8 Two's complement signed quantity -# UWORD 16 Unsigned quantity -# WORD 16 Two's complement signed quantity -# ULONG 32 Unsigned quantity -# LONG 32 Two's complement signed quantity -# CHAR*n n*8 n characters, each 8 bit and each with -# a 7-bit ASCII character (high bit always 0) -# FLOAT 32 IEEE Floating point number +# Field nbits Description +# UBYTE 8 Unsigned quantity +# BYTE 8 Two's complement signed quantity +# UWORD 16 Unsigned quantity +# WORD 16 Two's complement signed quantity +# ULONG 32 Unsigned quantity +# LONG 32 Two's complement signed quantity +# CHAR*n n*8 n characters, each 8 bit and each with +# a 7-bit ASCII character (high bit always 0) +# FLOAT 32 IEEE Floating point number # # BTIME -# UWORD 16 Year (e.g. 1987) -# UWORD 16 J-Day -# UBYTE 8 Hours of day (0-23) -# UBYTE 8 Minutes of hour (0-59) -# UBYTE 8 Seconds of minute (0-59, 60 for leap seconds) -# UBYTE 8 Unused for data (required for alignment)( -# UWORD 16 .0001 seconds (0-9999) +# UWORD 16 Year (e.g. 1987) +# UWORD 16 J-Day +# UBYTE 8 Hours of day (0-23) +# UBYTE 8 Minutes of hour (0-59) +# UBYTE 8 Seconds of minute (0-59, 60 for leap seconds) +# UBYTE 8 Unused for data (required for alignment)( +# UWORD 16 .0001 seconds (0-9999) ######################################################### def fixedhdr(self, seekval=0): @@ -531,10 +498,10 @@ class Mseed(futils): Offset to beginning of next blockette (UWORD, 2) """ # local variable -# self.sunpack=self.sunpack + # self.sunpack=self.sunpack try: del self.FH - except Exception: + except Exception as e: pass self.FH = FixedHeader() try: @@ -560,10 +527,10 @@ class Mseed(futils): self.FH.miscblk = self.UbytetoStr(tmpblk, i) tmpblk = self.FH.miscblk # recast tmpblk as list - (self.FH.Serial, self.FH.DHQual, res, self.FH.Stat, self.FH.Loc, self.FH.Chan, self.FH.Net)\ - = self.FH.textblk # noqa: E501 - (self.FH.Year, self.FH.Day, self.FH.Hour, self.FH.Min, self.FH.Sec, junk, self.FH.Micro)\ - = self.FH.timeblk # noqa: E501 + (self.FH.Serial, self.FH.DHQual, res, self.FH.Stat, self.FH.Loc, + self.FH.Chan, self.FH.Net) = self.FH.textblk + (self.FH.Year, self.FH.Day, self.FH.Hour, self.FH.Min, + self.FH.Sec, junk, self.FH.Micro) = self.FH.timeblk (self.FH.NumSamp, self.FH.SampFact, self.FH.SampMult)\ = self.FH.sampblk self.rate = self.calcrate() @@ -571,6 +538,7 @@ class Mseed(futils): return (self.FH.textblk, self.FH.timeblk, self.FH.sampblk, self.FH.miscblk) # return textblk,timeblk,sampblk,miscblk + except Exception: print("error reading fixed header") pass @@ -618,8 +586,8 @@ class Mseed(futils): # misc info # fmtstr3 = fmtorderstr + "BBBBlHH" - (actFlags, ioFlags, dqFlags, numblk, timecor, - offsetData, offsetBlktt) = hdrlist[3] + (actFlags, ioFlags, dqFlags, numblk, timecor, offsetData, + offsetBlktt) = hdrlist[3] # convert flag string to integer actFlags = self.FlagStrtoInt(actFlags) ioFlags = self.FlagStrtoInt(ioFlags) @@ -627,6 +595,7 @@ class Mseed(futils): # pack fields fmtstr = fmtorderstr + "6scc5s2s3s2sHHBBBBHHhhBBBBlHH" + pack_hdr = self.spack(fmtstr, SeqNum, DQual, Res, Stat, Loc, Chan, Net, Year, Day, Hour, Min, Sec, junk, Micro, NumSamp, SampFact, SampMult, actFlags, @@ -649,9 +618,10 @@ class Mseed(futils): if blknum not in ValidBlk: return 0 else: - blk = locals() - callcmd = "blk=self.blk" + str(blknum) + "(" + str(seekval) + ")" - exec(callcmd, {}, blk) + callcmd = "global blk; blk=self.blk%s(%s)" \ + % (str(blknum), str(seekval)) + + exec(callcmd) return blk ######################################################### @@ -665,10 +635,11 @@ class Mseed(futils): if blknum not in ValidBlk: return 0 else: - bytes_written = locals() - callcmd = "bytes_written=self.Writeblk" + \ - str(blknum) + "(indata" + "," + str(seekval) + ", endian)" - exec(callcmd, {}, bytes_written) + callcmd = "global bytes_written; "\ + "bytes_written=self.Writeblk%s(indata, %s, endian)"\ + % (str(blknum), str(seekval)) + + exec(callcmd) return bytes_written ######################################################### @@ -693,12 +664,11 @@ class Mseed(futils): return blk ######################################################### - def Writeblk100(self, inblk, seekval=0, endianess=""): """ writes Sample Rate Blockette 100 (12 bytes) requires tuple inblk=(blkette, nextblk, actrate, flags, res0, res1, - res2) + res2) """ try: @@ -707,8 +677,9 @@ class Mseed(futils): fmtstr = fmtorderstr + "HHfb3B" (blkette, nextblk, actrate, flags, res0, res1, res2) = inblk flags = self.FlagStrtoInt(flags) - pack_blk = self.spack(fmtstr, blkette, nextblk, - actrate, flags, res0, res1, res2) + + pack_blk = self.spack(fmtstr, blkette, nextblk, actrate, flags, + res0, res1, res2) self.infilewrite(pack_blk) return 12 except Exception: @@ -756,8 +727,8 @@ class Mseed(futils): """ writes Generic Event Detection Blockette 200 (52 bytes) requires tuple inblk - inblk=(blkette, nextblk, amp, period, bg, flags, Year, Day, Hour, Min, - Sec, junk, Micro, charstr) + inblk=(blkette, nextblk, amp, period, bg, flags, + Year, Day, Hour, Min, Sec, junk, Micro, charstr) """ try: @@ -768,11 +739,14 @@ class Mseed(futils): (blkette, nextblk, amp, period, bg, flags, (Year, Day, Hour, Min, Sec, junk, Micro), charstr) = inblk flags = FlagsStrtoInt(flags) - pack_blk = self.spack(fmtstr, blkette, nextblk, amp, period, bg, - flags, Year, Day, Hour, Min, Sec, junk, - Micro, charstr) + + pack_blk = self.spack( + fmtstr, blkette, nextblk, amp, period, bg, flags, + Year, Day, Hour, Min, Sec, junk, Micro, charstr) + self.infilewrite(pack_blk) return 52 + except Exception: print("error writing blockette 200") return 0 @@ -785,8 +759,8 @@ class Mseed(futils): Returns tuple blk Blockette type (UWORD, 2) - Next blockette's byte offset relative to fixed section of header - (UWORD, 2) + Next blockette's byte offset relative to fixed section of + header (UWORD, 2) Signal amplitude (FLOAT, 4) Signal period (FLOAT,4) Background estimate (FLOAT,4) @@ -821,9 +795,9 @@ class Mseed(futils): """ writes Murdock Event Detection Blockette 201 (60 bytes) requires tuple inblk - inblk=(blkette, nextblk, amp, period, bg, flags, res, Year, Day, Hour, - Min, Sec, junk, Micro, SN0, SN1, SN2, SN3, SN4, SN5, loop, algo, - Name) + inblk=(blkette, nextblk, amp, period, bg, flags, res, + Year, Day, Hour, Min, Sec, junk, Micro, + SN0, SN1, SN2, SN3, SN4, SN5, loop, algo, Name) """ try: @@ -831,16 +805,20 @@ class Mseed(futils): fmtorderstr = self.setEndian(endianess) fmtstr = fmtorderstr + "HHfffBBHHBBBBH6BBB24s" - (blkette, nextblk, amp, period, bg, flags, res, (Year, Day, Hour, - Min, Sec, junk, Micro), SN0, SN1, SN2, SN3, SN4, SN5, loop, algo, - Name) = inblk + (blkette, nextblk, amp, period, bg, flags, res, + (Year, Day, Hour, Min, Sec, junk, Micro), + SN0, SN1, SN2, SN3, SN4, SN5, loop, algo, Name) = inblk + flags = self.FlagStrtoInt(flags) + pack_blk = self.spack(fmtstr, blkette, nextblk, amp, period, bg, flags, res, Year, Day, Hour, Min, Sec, junk, Micro, SN0, SN1, SN2, SN3, SN4, SN5, loop, algo, Name) + self.infilewrite(pack_blk) return 60 + except Exception: print("error writing blockette 201") return 0 @@ -891,7 +869,7 @@ class Mseed(futils): writes Step Calibration Blockette 300 (60 bytes) requires tuples inblk inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, - numst, flags, dur, interv, amp, chan, res, ref, couple, rolloff) + numst, flags, dur, interv, amp, chan, res, ref, couple, rolloff) """ try: @@ -899,15 +877,20 @@ class Mseed(futils): fmtorderstr = self.setEndian(endianess) fmtstr = fmtorderstr + "HHHHBBBBHBBIIf3sBI12s12s" - (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), numst, - flags, dur, interv, amp, chan, res, ref, couple, - rolloff) = inblk + (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), + numst, flags, dur, interv, amp, chan, res, ref, + couple, rolloff) = inblk flags = self.FlagStrtoInt(flags) - pack_blk = self.spack(fmtstr, blkette, nextblk, Year, Day, Hour, - Min, Sec, junk, Micro, numst, flags, dur, - interv, amp, chan, res, ref, couple, rolloff) + + pack_blk = self.spack( + fmtstr, blkette, nextblk, + Year, Day, Hour, Min, Sec, junk, Micro, + numst, flags, dur, interv, amp, chan, + res, ref, couple, rolloff) + self.infilewrite(pack_blk) return 60 + except Exception: print("error writing blockette 300") return 0 @@ -957,8 +940,8 @@ class Mseed(futils): """ writes Sine Calibration Blockette 310 (60 bytes) requires tuples inblk - inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, res, - flags, dura,per,ampsig,chan, res2,refamp,coup,rolloff) + inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, + res, flags, dura,per,ampsig,chan, res2,refamp,coup,rolloff) """ try: @@ -967,14 +950,17 @@ class Mseed(futils): fmtstr = fmtorderstr + "HHHHBBBBHBBIff3sBI12s12s" (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), - res, flags, dura, per, ampsig, chan, res2, refamp, coup, - rolloff) = inblk + res, flags, dura, per, ampsig, chan, res2, + refamp, coup, rolloff) = inblk flags = self.FlagStrtoInt(flags) + pack_blk = self.spack(fmtstr, blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, res, flags, dura, per, ampsig, chan, res2, refamp, coup, rolloff) + self.infilewrite(pack_blk) return 60 + except Exception: print("error writing blockette 310") return 0 @@ -1025,7 +1011,7 @@ class Mseed(futils): writes Pseudo-random Calibraton Blockette 320 (64 bytes) requires tuples inblk inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, - res, flags, dura,ptop,chan, res2,refamp,coup,rolloff,noise) + res, flags, dura,ptop,chan, res2,refamp,coup,rolloff,noise) """ try: @@ -1033,16 +1019,19 @@ class Mseed(futils): fmtorderstr = self.setEndian(endianess) fmtstr = fmtorderstr + "HHHHBBBBHBBIf3sBI12s12s8s" - (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), - res, flags, dura, ptop, chan, res2, refamp, coup, rolloff, + (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), res, + flags, dura, ptop, chan, res2, refamp, coup, rolloff, noise) = inblk + flags = self.FlagStrtoInt(flags) pack_blk = self.spack(fmtstr, blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, res, flags, dura, ptop, chan, res2, refamp, coup, rolloff, noise) + self.infilewrite(pack_blk) return 64 + except Exception: print("error writing blockette 320") return 0 @@ -1097,14 +1086,18 @@ class Mseed(futils): fmtorderstr = self.setEndian(endianess) fmtstr = fmtorderstr + "HHHHBBBBHBBIf3sB" - (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), res, - flags, dura, amp, chan, res2) = inblk + (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), + res, flags, dura, amp, chan, res2) = inblk flags = self.FlagStrtoInt(flags) - pack_blk = self.spack(fmtstr, blkette, nextblk, Year, Day, Hour, - Min, Sec, junk, Micro, res, flags, dura, - amp, chan, res2) + + pack_blk = self.spack( + fmtstr, blkette, nextblk, + Year, Day, Hour, Min, Sec, junk, Micro, + res, flags, dura, amp, chan, res2) + self.infilewrite(pack_blk) return 28 + except Exception: print("error writing blockette 390") return 0 @@ -1143,10 +1136,13 @@ class Mseed(futils): (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), res) = inblk + pack_blk = self.spack(fmtstr, blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, res) + self.infilewrite(pack_blk) return 16 + except Exception: print("error writing blockette 395") return 0 @@ -1186,10 +1182,13 @@ class Mseed(futils): fmtstr = fmtorderstr + "HHffH2B" (blkette, nextblk, baz, bslw, bconf, res0, res1) = inblk + pack_blk = self.spack(fmtstr, blkette, nextblk, baz, bslw, bconf, res0, res1) + self.infilewrite(pack_blk) return 16 + except Exception: print("error writing blockette 400") return 0 @@ -1226,9 +1225,12 @@ class Mseed(futils): fmtstr = fmtorderstr + "HHH" (blkette, nextblk, delay) = inblk + pack_blk = self.spack(fmtstr, blkette, nextblk, delay) + self.infilewrite(pack_blk) return 6 + except Exception: print("error writing blockette 405") return 0 @@ -1282,13 +1284,18 @@ class Mseed(futils): fmtorderstr = self.setEndian(endianess) fmtstr = fmtorderstr + "HHfHHBBBBHBBI16s32s128s" - (blkette, nextblk, vcocorr, (Year, Day, Hour, Min, Sec, junk, - Micro), Micro2, qual, cnt, type, mod, stat) = inblk - pack_blk = self.spack(fmtstr, blkette, nextblk, vcocorr, Year, Day, - Hour, Min, Sec, junk, Micro, Micro2, qual, - cnt, type, mod, stat) + (blkette, nextblk, vcocorr, + (Year, Day, Hour, Min, Sec, junk, Micro), Micro2, + qual, cnt, type, mod, stat) = inblk + + pack_blk = self.spack( + fmtstr, blkette, nextblk, vcocorr, + Year, Day, Hour, Min, Sec, junk, Micro, Micro2, + qual, cnt, type, mod, stat) + self.infilewrite(pack_blk) return 200 + except Exception: print("error writing blockette 500") return 0 @@ -1301,8 +1308,8 @@ class Mseed(futils): Returns tuple blk Blockette type (UWORD, 2) - Next blockette's byte offset relative to fixed section of header - (UWORD, 2) + Next blockette's byte offset relative to fixed section of + header (UWORD, 2) Encoding Format (BYTE, 1) Word Order (UBYTE, 1) Data Record Length (UBYTE, 1) @@ -1310,6 +1317,7 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHbBBB" + blk = self.sunpack(fmtstr, self.infileread(8)) return list(blk) @@ -1328,10 +1336,13 @@ class Mseed(futils): fmtstr = fmtorderstr + "HHbBBB" (blkette, nextblk, fmt, order, length, res) = inblk - pack_blk = self.spack(fmtstr, blkette, nextblk, fmt, order, - length, res) + + pack_blk = self.spack( + fmtstr, blkette, nextblk, fmt, order, length, res) + self.infilewrite(pack_blk) return 8 + except Exception: print("error writing blockette 1000") return 0 @@ -1344,8 +1355,8 @@ class Mseed(futils): Returns tuple blk Blockette type (UWORD, 2) - Next blockette's byte offset relative to fixed section of header - (UWORD, 2) + Next blockette's byte offset relative to fixed section of + header (UWORD, 2) Timing Quality (UBYTE, 1) microsec (UBYTE, 1) Reserved (UBYTE, 1) @@ -1371,10 +1382,13 @@ class Mseed(futils): fmtstr = fmtorderstr + "HHBBBB" (blkette, nextblk, tqual, micro, res, fcnt) = inblk - pack_blk = self.spack(fmtstr, blkette, nextblk, - tqual, micro, res, fcnt) + + pack_blk = self.spack(fmtstr, blkette, nextblk, tqual, micro, + res, fcnt) + self.infilewrite(pack_blk) return 8 + except Exception: print("error writing blockette 1001") return 0 @@ -1385,52 +1399,53 @@ class Mseed(futils): """ Variable Length Opaque Data Blockette Returns two tuples - blk, opaque - Blockette type (UWORD, 2) - Next blockette's byte offset relative to fixed section of header. - Use 0 if no more blockettes will follow. (UWORD, 2) - Total Blockette length kin Bytes (UWORD, 2) - Offset to Opaque Data (UWORD, 2) - Record number (ULONG, 4) - Data Word order (UBYTE, 1) - 0 = little endian (VAX or 80x86 byte order). - 1 = big endian (68000 or SPARC byte order). - Opaque Data flags (UBYTE, 1) - [bit 0] Opaque blockette orientation. + blk, opaque + Blockette type (UWORD, 2) + Next blockette's byte offset relative to fixed section of header. + Use 0 if no more blockettes will follow.(UWORD, 2) + Total Blockette length kin Bytes (UWORD, 2) + Offset to Opaque Data (UWORD, 2) + Record number (ULONG, 4) + Data Word order (UBYTE, 1) + 0 = little endian (VAX or 80x86 byte order). + 1 = big endian (68000 or SPARC byte order). + Opaque Data flags (UBYTE, 1) + [bit 0] Opaque blockette orientation. 0 = record oriented. 1 = stream oriented. - [bit 1] Packaging bit. + [bit 1] Packaging bit. 0 = Blockette 2000s from multiple SEED data records with - different timetags may be packaged into a single SEED data - record. The exact original timetag in each SEED Fixed Data - Header is not required for each blockette 2000. + different timetags may be packaged into a single SEED data + record. The exact original timetag in each SEED Fixed Data + Header is not required for each blockette 2000. 1= Blockette 2000s from multiple SEED data records with - differing timetags may NOT be repackaged into a single SEED - data record. Set this bit if the timetag in the SEED Fixed - Data Header is required to properly interpret the opaque data. - [bits 2-3] Opaque blockette fragmentation flags. + differing timetags may NOT be repackaged into a single SEED + data record. Set this bit if the timetag in the SEED Fixed + Data Header is required to properly interpret the opaque + data. + [bits 2-3] Opaque blockette fragmentation flags. 00 = opaque record identified by record number is completely - contained in this opaque blockette. + contained in this opaque blockette. 01 = first opaque blockette for record spanning multiple - blockettes. + blockettes. 11 = continuation blockette 2...N-1 of record spanning N - blockettes. + blockettes. 10 = final blockette for record spanning N blockettes. - [bits 4-5] File blockette information. + [bits 4-5] File blockette information. 00 = not file oriented. 01 = first blockette of file. 10 = continuation of file. 11 = last blockette of file. - Number of Opaque Header fields (UBYTE, 1) - Opaque Data Header fields (VAR) - a Record type - b Vendor type - c Model type - d Software - e Firmware - Opaque Data Opaque - bytes of opaque data. Total length of opaque data - in bytes is blockette_length-15-length (opaque_data_header_string) - (Opaque) + Number of Opaque Header fields (UBYTE, 1) + Opaque Data Header fields (VAR) + a Record type + b Vendor type + c Model type + d Software + e Firmware + Opaque Data Opaque - bytes of opaque data. Total length of opaque + data in bytes is blockette_length-15-length + (opaque_data_header_string) (Opaque) """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHHHIBBB" @@ -1459,9 +1474,7 @@ class Mseed(futils): # rdbyte = int(tmpblk[2]) - 15 - length_data_string # fmt = "=%ds" % rdbyte # opaque=self.sunpack(fmt, self.infileread(rdbyte)) - # # print(opaque) - # return blk ######################################################### @@ -1530,8 +1543,8 @@ class Segy(futils): # "little" # or "unknown" self.byteorder = self.ByteOrder() - # self.fmt_order: companion to self.byteorder. Format string for - # stuct.pack + # self.fmt_order: companion to self.byteorder. + # Format string for struct.pack # ">" big endian # "<" little endian @@ -1549,8 +1562,8 @@ class Segy(futils): (Sserial, Schan, Srate, Syear, Sday, Shour, Smin, Ssec) = self.idread() # we have already tested for a valid time in self.ByteOrder, this test # is to ensure that we were able to read a complete idhdr header - if (Sserial == Schan == Srate == Syear == Sday == Shour == - Smin == Ssec is None): + if Sserial == Schan == Srate == Syear == Sday == Shour == \ + Smin == Ssec is None: return 0 # if we're this far it must be segy self.type = "segy" @@ -1558,10 +1571,7 @@ class Segy(futils): self.serial = Sserial else: self.serial = self.to_hex(Sserial) - # self.time = string.join(list(map(str, (Syear, Sday, Shour, Smin, - # Ssec))), ":") - templist = list(map(str, (Syear, Sday, Shour, Smin, Ssec))) - self.time = ":".join(templist) + self.time = ":".join(map(str, (Syear, Sday, Shour, Smin, Ssec))) self.chan = Schan self.rate = Srate return 1 @@ -1623,6 +1633,7 @@ class Segy(futils): return None, None, None, None, None, None, None, None ######################################################### + def ByteOrder(self, seekval=156): """ read file as if it is segy just pulling time info @@ -1639,8 +1650,11 @@ class Segy(futils): (Year, Day, Hour, Min, Sec) =\ struct.unpack('>HHHHH', timeblock) # test if big endian read makes sense - if (1950 <= Year <= 2050 and 1 <= Day <= 366 and - 0 <= Hour <= 23 and 0 <= Min <= 59 and 0 <= Sec <= 59): + if 1950 <= Year <= 2050 and \ + 1 <= Day <= 366 and \ + 0 <= Hour <= 23 and \ + 0 <= Min <= 59 and \ + 0 <= Sec <= 59: Order = "big" self.fmt_order = ">" else: @@ -1648,8 +1662,11 @@ class Segy(futils): (Year, Day, Hour, Min, Sec) =\ struct.unpack('<HHHHH', timeblock) # test if little endian read makes sense - if (1950 <= Year <= 2050 and 1 <= Day <= 366 and - 0 <= Hour <= 23 and 0 <= Min <= 59 and 0 <= Sec <= 59): + if 1950 <= Year <= 2050 and \ + 1 <= Day <= 366 and \ + 0 <= Hour <= 23 and \ + 0 <= Min <= 59 and \ + 0 <= Sec <= 59: Order = "little" self.fmt_order = "<" except Exception: @@ -1670,7 +1687,7 @@ class Segy(futils): input_length = len(hexnum) for i in range(input_length): for index in range(len(HEXCHAR)): - if string.upper(hexnum[i]) == HEXCHAR[index]: + if hexnum[i].upper() == HEXCHAR[index]: retval = retval + index * (16**(input_length - (1 + i))) return retval @@ -1690,7 +1707,7 @@ class Segy(futils): ######################################################### if __name__ == "__main__": - VERSION = "2022.1.0.0" + VERSION = "2008.204" filecnt = 0 # based on traverse routine in "python standard library", Lundh pg 34 @@ -1706,8 +1723,8 @@ if __name__ == "__main__": while stack: directory = stack.pop() if not os.path.isdir(directory): - print("\n***WARNING*** Directory \"%s\" not found.\n" % - directory) + print("\n***WARNING*** Directory \"%s\" not found.\n" + % directory) continue # else : for file in os.listdir(directory): @@ -1740,34 +1757,34 @@ if __name__ == "__main__": # file filesize = newfile.filesize blksize = newfile.blksize - (numblocks, odd_size) = divmod( - filesize, blksize) + (numblocks, odd_size) = \ + divmod(filesize, blksize) if odd_size: rwError += 1 continue - except Exception: + except Exception as e: rwError += 1 continue type = newfile.type - serial = string.strip(newfile.FH.Stat) - chan = string.strip(newfile.FH.Chan) - loc = string.strip(newfile.FH.Loc) - net = string.strip(newfile.FH.Net) + serial = newfile.FH.Stat.strip() + chan = newfile.FH.Chan.strip() + loc = newfile.FH.Loc.strip() + net = newfile.FH.Net.strip() time = newfile.time rate = newfile.rate length = newfile.tracelength() # length = "NULL" - file_list[fullname] = (type, serial, chan, - time, rate, length, - newfile.ByteOrder()) + file_list[fullname] = ( + type, serial, chan, time, rate, length, + newfile.ByteOrder()) newfile.close() - except Exception: + except Exception as e: rwError += 1 pass - # if os.path.isdir(fullname) and not os.path.islink(fullname) : - if (os.path.isdir(fullname) or (os.path.islink(fullname) and - not os.path.isfile(fullname))): + # if os.path.isdir(fullname) and not os.path.islink(fullname): + if os.path.isdir(fullname) or (os.path.islink(fullname) and + not os.path.isfile(fullname)): stack.append(fullname) return file_list, rwError @@ -1787,7 +1804,7 @@ if __name__ == "__main__": Dirs.append(".") # Dirs.append("/Users/bruce/data/uniq") (file_list, rwError) = GetTrace(Dirs) - for file in list(file_list.keys()): + for file in file_list: file_type = file_list[file][0] if file_type == "segy": segynum += 1 @@ -1796,17 +1813,18 @@ if __name__ == "__main__": # file_list[file][3], file_list[file][4], file_list[file][5], # file_list[file][6]) elif file_type == "mseed": - # if file_type == "mseed": + # if file_type == "mseed" : mseednum += 1 # print("\n MSEED \n") # print("mseed: ", file_list[file][1], file_list[file][2], # file_list[file][3], file_list[file][4], file_list[file][5], # file_list[file][6]) + # else : - # unknownnum += 1 - # print("\n Format Not Recognized \n") + # unknownnum += 1 + # print("\n Format Not Recognized \n") print("\nTotal Files Found = %i " % filecnt) - print("SEGY Files Processed = %i \nMSEED Files Processed = %i" % - (segynum, mseednum)) + print("SEGY Files Processed = %i \nMSEED Files Processed = %i" + % (segynum, mseednum)) print("Total RWErrors = %i " % rwError) print("Total Files Identified = %i" % len(file_list))