diff --git a/fixhdr/LibTrace.py b/fixhdr/LibTrace.py index 39e6b3064b3f4767ebb6d5a2ae889f77a87fc738..eebf3dbde0aa6a7350f17e9fe6b68c70ae8e5a49 100755 --- a/fixhdr/LibTrace.py +++ b/fixhdr/LibTrace.py @@ -114,11 +114,19 @@ # # 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) import os, string, sys, struct, time SPACE = " " -#VERSION = "2008.204" +#VERSION = "2019.025" class futils: """ @@ -307,7 +315,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 \ @@ -503,59 +511,61 @@ class Mseed(futils): Requires four tuples (see self.fixedhdr) """ - #try: - self.infileseek(seekval) - fmtorderstr=self.setEndian(endianess) - #station info - #left justify values - #fmtstr0 = fmtorderstr + "6scc5s2s3s2s" - - SeqNum = self.Pad(hdrlist[0][0], 6) #SeqNum - DQual = hdrlist[0][1] #DataQual - Res = hdrlist[0][2] #Reserved - Stat = self.Pad(hdrlist[0][3], 5).encode() #Stat - Loc = self.Pad(hdrlist[0][4], 2).encode() #Loc - Chan = self.Pad(hdrlist[0][5], 3).encode() #Chan - Net = self.Pad(hdrlist[0][6], 2).encode() #Net - - #time info - #fmtstr1 = fmtorderstr + "HHBBBBH" - (Year, Day, Hour, Min, Sec, junk, Micro)=hdrlist[1] - Micro=int(Micro) - - #sample info - #fmtstr2 = fmtorderstr + "Hhh" - (NumSamp, SampFact, SampMult) = hdrlist[2] - - #misc info - #fmtstr3 = fmtorderstr + "BBBBlHH" - (actFlags, ioFlags, dqFlags, numblk, timecor, offsetData, - offsetBlktt)=hdrlist[3] - #convert flag string to integer - actFlags = self.FlagStrtoInt(actFlags) - ioFlags = self.FlagStrtoInt(ioFlags) - dqFlags = self.FlagStrtoInt(dqFlags) - print("SeqNum, DQual, Res, Stat, Loc, Chan, Net,Year, Day, Hour, Min, Sec, junk, Micro,NumSamp, SampFact, SampMult,actFlags, ioFlags, dqFlags,numblk, timecor, offsetData, offsetBlktt:", - SeqNum, DQual, Res, Stat, Loc, Chan, Net, - Year, Day, Hour, Min, Sec, junk, Micro, - NumSamp, SampFact, SampMult,actFlags, ioFlags, dqFlags, - numblk, timecor, offsetData, offsetBlktt) - #pack fields - fmtstr = fmtorderstr + "6scc5s2s3s2sHHBBBBHHhhBBBBlHH" - print("fmtstr") - pack_hdr = self.spack( - fmtstr,SeqNum, DQual, Res, Stat, Loc, Chan, Net, - Year, Day, Hour, Min, Sec, junk, Micro, - NumSamp, SampFact, SampMult,actFlags, ioFlags, dqFlags, - numblk, timecor, offsetData, offsetBlktt) - - #write header - self.infilewrite(pack_hdr) - - return 48 - #except Exception as e: - #print("error writing fixed header") - #return 0 + try: + self.infileseek(seekval) + fmtorderstr=self.setEndian(endianess) + #station info + #left justify values + #fmtstr0 = fmtorderstr + "6scc5s2s3s2s" + + SeqNum = self.Pad(hdrlist[0][0], 6) #SeqNum + DQual = hdrlist[0][1] #DataQual + Res = hdrlist[0][2] #Reserved + try: + Stat = self.Pad(hdrlist[0][3], 5).encode() #Stat + Loc = self.Pad(hdrlist[0][4], 2).encode() #Loc + Chan = self.Pad(hdrlist[0][5], 3).encode() #Chan + Net = self.Pad(hdrlist[0][6], 2).encode() #Net + except AttributeError: + Stat = self.Pad(hdrlist[0][3], 5) #Stat + Loc = self.Pad(hdrlist[0][4], 2) #Loc + Chan = self.Pad(hdrlist[0][5], 3) #Chan + Net = self.Pad(hdrlist[0][6], 2) #Net + + #time info + #fmtstr1 = fmtorderstr + "HHBBBBH" + (Year, Day, Hour, Min, Sec, junk, Micro)=hdrlist[1] + Micro=int(Micro) + + #sample info + #fmtstr2 = fmtorderstr + "Hhh" + (NumSamp, SampFact, SampMult) = hdrlist[2] + + #misc info + #fmtstr3 = fmtorderstr + "BBBBlHH" + (actFlags, ioFlags, dqFlags, numblk, timecor, offsetData, + offsetBlktt)=hdrlist[3] + #convert flag string to integer + actFlags = self.FlagStrtoInt(actFlags) + ioFlags = self.FlagStrtoInt(ioFlags) + dqFlags = self.FlagStrtoInt(dqFlags) + + #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, ioFlags, dqFlags, + numblk, timecor, offsetData, offsetBlktt) + + #write header + self.infilewrite(pack_hdr) + + return 48 + except Exception as e: + print("error writing fixed header") + return 0 ######################################################### def GetBlk(self, blknum, seekval=0): @@ -563,7 +573,9 @@ class Mseed(futils): if not blknum in ValidBlk: return 0 else: - callcmd = "blk=self.blk" + str(blknum) + "(" + str(seekval) + ")" + callcmd = "global blk; blk=self.blk%s(%s)" \ + % (str(blknum), str(seekval)) + exec(callcmd) return blk ######################################################### @@ -575,8 +587,10 @@ class Mseed(futils): if not blknum in ValidBlk: return 0 else: - callcmd = "bytes_written=self.Writeblk" + str(blknum) + \ - "(indata" + "," + str(seekval) + ", endian)" + callcmd = "global bytes_written; "\ + "bytes_written=self.Writeblk%s(indata, %s, endian)"\ + % (str(blknum), str(seekval)) + exec(callcmd) return bytes_written ######################################################### @@ -594,9 +608,9 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHfb3B" - blk=self.sunpack(fmtstr, self.infileread(12)) + blk = self.sunpack(fmtstr, self.infileread(12)) scrblk = self.UbytetoStr(blk, 3) - blk=scrblk + blk = scrblk return blk ######################################################### @@ -611,8 +625,10 @@ class Mseed(futils): fmtorderstr=self.setEndian(endianess) 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) + flags = self.FlagStrtoInt(flags) + + pack_blk = self.spack(fmtstr, blkette, nextblk, actrate, flags, + res0, res1, res2) self.infilewrite(pack_blk) return 12 except Exception as e: @@ -639,11 +655,11 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHfffBB" - blk1=self.sunpack(fmtstr, self.infileread(18)) + blk1 = self.sunpack(fmtstr, self.infileread(18)) fmtstr = self.fmt_order + "HHBBBBH" - timeblk=self.sunpack(fmtstr, self.infileread(10)) + timeblk = self.sunpack(fmtstr, self.infileread(10)) fmtstr = self.fmt_order + "24s" - blk2=self.sunpack(fmtstr, self.infileread(24)) + blk2 = self.sunpack(fmtstr, self.infileread(24)) # incorporate timeblk tuple into blk list tmpblk = list(blk1) @@ -668,11 +684,14 @@ class Mseed(futils): fmtorderstr=self.setEndian(endianess) fmtstr = fmtorderstr + "HHfffBBHHBBBBH24s" - (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) + (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) + self.infilewrite(pack_blk) return 52 @@ -688,8 +707,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) @@ -703,11 +722,11 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHfffBB" - blk1=self.sunpack(fmtstr, self.infileread(18)) + blk1 = self.sunpack(fmtstr, self.infileread(18)) fmtstr = self.fmt_order + "HHBBBBH" - timeblk=self.sunpack(fmtstr, self.infileread(10)) + timeblk = self.sunpack(fmtstr, self.infileread(10)) fmtstr = self.fmt_order + "6BBB24s" - blk2=self.sunpack(fmtstr, self.infileread(32)) + blk2 = self.sunpack(fmtstr, self.infileread(32)) # incorporate timeblk tuple into blk list tmpblk = list(blk1) @@ -723,21 +742,27 @@ 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: self.infileseek(seekval) - fmtorderstr=self.setEndian(endianess) + 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 - 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) + + (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 @@ -771,9 +796,9 @@ class Mseed(futils): fmtstr = self.fmt_order + "HH" blk1=self.sunpack(fmtstr, self.infileread(4)) fmtstr = self.fmt_order + "HHBBBBH" - timeblk=self.sunpack(fmtstr, self.infileread(10)) + timeblk = self.sunpack(fmtstr, self.infileread(10)) fmtstr = self.fmt_order + "BBIIf3sBI12s12s" - blk2=self.sunpack(fmtstr, self.infileread(46)) + blk2 = self.sunpack(fmtstr, self.infileread(46)) # incorporate timeblk tuple into blk list tmpblk = list(blk1) @@ -789,7 +814,7 @@ class Mseed(futils): """ writes Step Calibration Blockette 300 (60 bytes) requires tuples inblk - inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, \ + inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, numst, flags, dur, interv, amp, chan, res, ref, couple, rolloff) """ @@ -798,11 +823,17 @@ 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 - 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) + (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) + self.infilewrite(pack_blk) return 60 @@ -834,11 +865,11 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HH" - blk1=self.sunpack(fmtstr, self.infileread(4)) + blk1 = self.sunpack(fmtstr, self.infileread(4)) fmtstr = self.fmt_order + "HHBBBBH" - timeblk=self.sunpack(fmtstr, self.infileread(10)) + timeblk = self.sunpack(fmtstr, self.infileread(10)) fmtstr = self.fmt_order + "BBIff3sBI12s12s" - blk2=self.sunpack(fmtstr, self.infileread(46)) + blk2 = self.sunpack(fmtstr, self.infileread(46)) # incorporate timeblk tuple into blk list tmpblk = list(blk1) @@ -854,7 +885,7 @@ class Mseed(futils): """ writes Sine Calibration Blockette 310 (60 bytes) requires tuples inblk - inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, \ + inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, res, flags, dura,per,ampsig,chan, res2,refamp,coup,rolloff) """ @@ -863,11 +894,16 @@ class Mseed(futils): fmtorderstr=self.setEndian(endianess) fmtstr = fmtorderstr + "HHHHBBBBHBBIff3sBI12s12s" - (blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, \ - 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) + (blkette, nextblk, (Year, Day, Hour, Min, Sec, junk, Micro), + 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 @@ -898,11 +934,11 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HH" - blk1=self.sunpack(fmtstr, self.infileread(4)) + blk1 = self.sunpack(fmtstr, self.infileread(4)) fmtstr = self.fmt_order + "HHBBBBH" - timeblk=self.sunpack(fmtstr, self.infileread(10)) + timeblk = self.sunpack(fmtstr, self.infileread(10)) fmtstr = self.fmt_order + "BBIf3sBI12s12s8s" - blk2=self.sunpack(fmtstr, self.infileread(50)) + blk2 = self.sunpack(fmtstr, self.infileread(50)) # incorporate timeblk tuple into blk list tmpblk = list(blk1) @@ -918,7 +954,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, \ + inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, res, flags, dura,ptop,chan, res2,refamp,coup,rolloff,noise) """ @@ -927,11 +963,17 @@ 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,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) + (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 @@ -958,11 +1000,11 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HH" - blk1=self.sunpack(fmtstr, self.infileread(4)) + blk1 = self.sunpack(fmtstr, self.infileread(4)) fmtstr = self.fmt_order + "HHBBBBH" - timeblk=self.sunpack(fmtstr, self.infileread(10)) + timeblk = self.sunpack(fmtstr, self.infileread(10)) fmtstr = self.fmt_order + "BBIf3sB" - blk2=self.sunpack(fmtstr, self.infileread(14)) + blk2 = self.sunpack(fmtstr, self.infileread(14)) # incorporate timeblk tuple into blk list tmpblk = list(blk1) @@ -978,7 +1020,7 @@ class Mseed(futils): """ writes Generic Calibraton Blockette 390 (28 bytes) requires tuples inblk - inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, \ + inblk=(blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, res, flags, dura,amp,chan, res2) """ @@ -987,11 +1029,15 @@ 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 - flags=self.FlagStrtoInt(flags) - pack_blk=self.spack(fmtstr, blkette, nextblk, Year, Day, Hour, Min, Sec, junk, Micro, \ - res, flags, dura,amp,chan, res2) + (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) + self.infilewrite(pack_blk) return 28 @@ -1013,7 +1059,7 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHHHBBBBH2s" - blk=self.sunpack(fmtstr, self.infileread(16)) + blk = self.sunpack(fmtstr, self.infileread(16)) return list(blk) ######################################################### @@ -1029,8 +1075,13 @@ class Mseed(futils): fmtorderstr=self.setEndian(endianess) fmtstr = fmtorderstr + "HHHHBBBBH2s" - (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) + (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 @@ -1067,11 +1118,14 @@ class Mseed(futils): try: self.infileseek(seekval) - fmtorderstr=self.setEndian(endianess) + fmtorderstr = self.setEndian(endianess) fmtstr = fmtorderstr + "HHffH2B" - (blkette, nextblk, baz,bslw,bconf,res0,res1)=inblk - pack_blk=self.spack(fmtstr, blkette, nextblk, baz,bslw,bconf,res0,res1) + (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 @@ -1108,8 +1162,10 @@ class Mseed(futils): fmtorderstr=self.setEndian(endianess) fmtstr = fmtorderstr + "HHH" - (blkette, nextblk, delay)=inblk - pack_blk=self.spack(fmtstr, blkette, nextblk, delay) + (blkette, nextblk, delay) = inblk + + pack_blk = self.spack(fmtstr, blkette, nextblk, delay) + self.infilewrite(pack_blk) return 6 @@ -1137,9 +1193,9 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHf" - blk1=self.sunpack(fmtstr, self.infileread(8)) + blk1 = self.sunpack(fmtstr, self.infileread(8)) fmtstr = self.fmt_order + "HHBBBBH" - timeblk=self.sunpack(fmtstr,self.infileread(10)) + timeblk = self.sunpack(fmtstr,self.infileread(10)) fmtstr = self.fmt_order + "BBI16s32s128s" blk2=self.sunpack(fmtstr, self.infileread(182)) @@ -1155,8 +1211,8 @@ class Mseed(futils): """ writes Timing Blockette 500 (200 bytes) requires tuples inblk - inblk=(blkette, nextblk, vcocorr,Year, Day, Hour, Min, Sec, junk, Micro, Micro2, \ - qual,cnt,type,mod,stat) + inblk=(blkette, nextblk, vcocorr,Year, Day, Hour, Min, Sec, junk, + Micro, Micro2, qual,cnt,type,mod,stat) """ try: @@ -1164,10 +1220,15 @@ 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 @@ -1182,8 +1243,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) @@ -1191,7 +1252,8 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHbBBB" - blk=self.sunpack(fmtstr, self.infileread(8)) + + blk = self.sunpack(fmtstr, self.infileread(8)) return list(blk) ######################################################### @@ -1204,11 +1266,14 @@ class Mseed(futils): try: self.infileseek(seekval) - fmtorderstr=self.setEndian(endianess) + fmtorderstr = self.setEndian(endianess) fmtstr = fmtorderstr + "HHbBBB" - (blkette, nextblk, fmt,order,length,res)=inblk - pack_blk=self.spack(fmtstr, blkette, nextblk, fmt,order,length,res) + (blkette, nextblk, fmt,order,length,res) = inblk + + pack_blk = self.spack( + fmtstr, blkette, nextblk, fmt,order,length,res) + self.infilewrite(pack_blk) return 8 @@ -1223,8 +1288,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) @@ -1232,7 +1297,7 @@ class Mseed(futils): """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHBBBB" - blk=self.sunpack(fmtstr, self.infileread(8)) + blk = self.sunpack(fmtstr, self.infileread(8)) return list(blk) ######################################################### def Writeblk1001(self, inblk, seekval=0, endianess=""): @@ -1247,8 +1312,11 @@ class Mseed(futils): fmtorderstr=self.setEndian(endianess) fmtstr = fmtorderstr + "HHBBBB" - (blkette, nextblk, tqual,micro,res,fcnt)=inblk - pack_blk=self.spack(fmtstr, blkette, nextblk, tqual,micro,res,fcnt) + (blkette, nextblk, tqual, micro, res, fcnt) = inblk + + pack_blk = self.spack( + fmtstr, blkette, nextblk, tqual, micro, res, fcnt) + self.infilewrite(pack_blk) return 8 @@ -1261,50 +1329,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. - 0 = record oriented. - 1 = stream oriented. - [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. - 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. - 00 = opaque record identified by record number is completely contained in - this opaque blockette. - 01 = first opaque blockette for record spanning multiple blockettes. - 11 = continuation blockette 2...N-1 of record spanning N blockettes. - 10 = final blockette for record spanning N blockettes. - [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) + 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. + 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. + 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. + 00 = opaque record identified by record number is completely + contained in this opaque blockette. + 01 = first opaque blockette for record spanning multiple + blockettes. + 11 = continuation blockette 2...N-1 of record spanning N + blockettes. + 10 = final blockette for record spanning N blockettes. + [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) """ self.infileseek(seekval) fmtstr = self.fmt_order + "HHHHIBBB" @@ -1314,15 +1385,15 @@ class Mseed(futils): blk=tmpblk #recast blk as list #Now decipher Opaque Header - charlist=[] - char="" + charlist = [] + char = "" length_data_string = 0 NumOpaqueHeaders=int(blk[7]) fmtstr = self.fmt_order + "s" for i in range(NumOpaqueHeaders): - tmpchar="" + tmpchar = "" while tmpchar != "~": - tupchar=self.sunpack(fmtstr, self.infileread(1)) + tupchar = self.sunpack(fmtstr, self.infileread(1)) tmpchar = str(tupchar[0]) if tmpchar != "~": char = char + tmpchar @@ -1365,12 +1436,12 @@ class Mseed(futils): """ converts Flag String to Integer """ - flagint=0 - n=len(flagstr) - 1 + flagint = 0 + n = len(flagstr) - 1 for a in flagstr: if int(a): flagint = flagint + 2**n - n-=1 + n -= 1 return flagint ######################################################### @@ -1383,8 +1454,8 @@ class Mseed(futils): if varlength == num: return var elif varlength < num: - pad=num-varlength - newvar= var + SPACE*pad + pad = num-varlength + newvar = var + SPACE*pad return newvar @@ -1393,14 +1464,15 @@ class Mseed(futils): ######################################################### class Segy(futils): def __init__(self, infile): - self.type=self.serial=self.chan=self.time=self.rate=None + self.type = self.serial = self.chan = self.time = self.rate = None futils.__init__(self,infile) # self.byteorder: byte order of input file. # "big" # "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 @@ -1456,25 +1528,25 @@ class Segy(futils): fmtstr = self.fmt_order + "L" # chan = struct.unpack(fmtstr, self.infile.read(4))[0] # print chan - chan=struct.unpack(fmtstr, SH[12:16])[0] + chan = struct.unpack(fmtstr, SH[12:16])[0] # self.infile.seek(156) # timeblock=self.infile.read(10) fmtstr = self.fmt_order + "HHHHH" # (year,day,hour,min,sec)=struct.unpack(fmtstr, timeblock) - (year,day,hour,min,sec)=struct.unpack(fmtstr, SH[156:166]) + (year, day, hour, min, sec) = struct.unpack(fmtstr, SH[156:166]) # self.infile.seek(200) fmtstr = self.fmt_order + "L" # samp=struct.unpack(fmtstr, self.infile.read(4))[0] # print samp - samp=struct.unpack(fmtstr, SH[200:204])[0] + samp = struct.unpack(fmtstr, SH[200:204])[0] rate = int(1/(samp/1e6)) # self.infile.seek(224) fmtstr = self.fmt_order + "H" # serial = struct.unpack(fmtstr, self.infile.read(2))[0] - serial=struct.unpack(fmtstr, SH[224:226])[0] + serial = struct.unpack(fmtstr, SH[224:226])[0] return serial, chan, rate, year, day, hour, min, sec @@ -1555,12 +1627,12 @@ if __name__ == "__main__" : def GetTrace(DataDir) : global filecnt stack = [] - rwError=0 + rwError = 0 for k in range(len(DataDir)) : stack.append(DataDir[k]) files = [] file_list = {} - errcnt=0 + errcnt = 0 while stack : directory = stack.pop() if not os.path.isdir(directory): @@ -1582,7 +1654,9 @@ if __name__ == "__main__" : (type, serial, chan, time, rate) = newfile.idhdr() 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 as e: rwError+=1 @@ -1593,14 +1667,15 @@ if __name__ == "__main__" : if newfile.isMseed(): try: #simple test to determine if correct size file - filesize=newfile.filesize - blksize=newfile.blksize - (numblocks, odd_size)=divmod(filesize, blksize) + filesize = newfile.filesize + blksize = newfile.blksize + (numblocks, odd_size) = \ + divmod(filesize, blksize) if odd_size: - rwError+=1 + rwError += 1 continue except Exception as e: - rwError+=1 + rwError += 1 continue type = newfile.type @@ -1612,13 +1687,17 @@ if __name__ == "__main__" : 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 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) or \ + (os.path.islink(fullname) \ + and not os.path.isfile(fullname)): stack.append(fullname) return file_list, rwError @@ -1637,7 +1716,7 @@ if __name__ == "__main__" : # Dirs.append(",") Dirs.append(".") # Dirs.append("/Users/bruce/data/uniq") - (file_list,rwError) = GetTrace(Dirs) + (file_list,rwError) = GetTrace(Dirs) for file in file_list : file_type = file_list[file][0] if file_type == "segy" : diff --git a/fixhdr/fixhdr.py b/fixhdr/fixhdr.py index 157ddc2d0d9e4b5471a3a392aaf4ea98625ecf93..437db442b27264d88c47d144a590012f2e7756c4 100755 --- a/fixhdr/fixhdr.py +++ b/fixhdr/fixhdr.py @@ -245,8 +245,15 @@ # author: Derick Hess # Updated cookiecutter version, added call to main(), etc. -# VERSION = "2018.176" -VERSION = "Py3 version" +################################################################ +# +# modification +# version: 2019.025 +# author: Lan Dam +# convert to py3 +# bug fix: In GetStartEnd when no "Stat:Loc:Net" selected (timeid="") + +VERSION = "2019.025" import os, sys, string, time import Pmw @@ -1629,18 +1636,18 @@ class MainWindow: except StopIteration: break #for subkey in self.UpdateHdrDict[key].keys() : - value=self.UpdateHdrDict[key][subkey] + value = self.UpdateHdrDict[key][subkey] if subkey == "Station_Name": - Stat=value + Stat = value self.SetHdrDict[key][subkey]=1 if subkey == "Channel": - Chan=value + Chan = value self.SetHdrDict[key][subkey]=1 if subkey == "Location_Code": - Loc=value + Loc = value self.SetHdrDict[key][subkey]=1 if subkey == "Network_Code": - Net=value + Net = value self.SetHdrDict[key][subkey]=1 ifilelist=(ifile for ifile in self.TraceDict[key]) #for infile in self.TraceDict[key] : @@ -2022,7 +2029,8 @@ class MainWindow: err_cnt = 0 skip_cnt = 0 - for key in self.UpdateTimeDict: + UpdateTimeDictKeys = list(self.UpdateTimeDict.keys()) + for key in UpdateTimeDictKeys: if key not in self.TraceTimeDict: continue #capture cancel @@ -2273,13 +2281,13 @@ class MainWindow: # more test just incase, this will fail if headers have been # change w/o updating the db (SeqNum, DHQual, res, Stat, Loc, Chan, Net)=hdrs[0] - Stat = Stat.strip().decode() + Stat = Stat.strip() if self.WildLoc.get(): Loc = "*" else: - Loc = Loc.strip().decode() - Net = Net.strip().decode() - key = Stat + ":" + Loc + ":" + Net + Loc = Loc.strip() + Net = Net.strip() + key = Stat.decode() + ":" + Loc.decode() + ":" + Net.decode() if key != self.TimeShiftName.get(): blk_err += 1 n += 1 @@ -2294,7 +2302,7 @@ class MainWindow: if startEpoch <= blkEpoch and blkEpoch <= endEpoch: pass else: - n+=1 + n += 1 continue oldshift = hdrs[3][4] * 0.0001 @@ -2305,14 +2313,14 @@ class MainWindow: # if an old shift exists and is applied if shift_applied and oldshift: blkEpoch = blkEpoch + self.TSShift.get() - oldshift - newshift=self.TSShift.get() + newshift = self.TSShift.get() # if an old shift shift exists and is not applied elif not shift_applied and oldshift: blkEpoch = blkEpoch + self.TSShift.get() newshift = self.TSShift.get() else: blkEpoch = blkEpoch + self.TSShift.get() - newshift=self.TSShift.get() + newshift = self.TSShift.get() else: # if type=add (i.e. 0), apply new shift to Epoch # shift value in header equals old + new shift @@ -2510,6 +2518,9 @@ class MainWindow: """ # self.WildButton.configure(state="disabled") timeid = self.TimeShiftName.get() + if not timeid: + self.addTextInfoBar("No Sta:Loc:Net selected", 'orange') + return # don't spend time here if time is already calculated # and Traces loaded @@ -2532,11 +2543,11 @@ class MainWindow: if keystat == stat and keynet == net and \ (keyloc == loc or keyloc == "*"): for infile in self.TraceDict[key] : - cnt+=1 + cnt += 1 if mod(cnt, 10): pass else: - textstr="Key: " + timeid + " Examining Trace: " + textstr = "Key: " + timeid + " Examining Trace: " self.wait(textstr, cnt) # at this point all files in TraceDict should be mseed @@ -2764,15 +2775,15 @@ class MainWindow: msfile=Mseed(ifile) #local variables' - fixedhdr=msfile.fixedhdr - WriteFixedHdr=msfile.WriteFixedHdr - typenxt=msfile.typenxt - GetBlk=msfile.GetBlk - PutBlk=msfile.PutBlk - - filesize=msfile.filesize - blksize=msfile.blksize - (numblocks, odd_size)=divmod(filesize, blksize) + fixedhdr = msfile.fixedhdr + WriteFixedHdr = msfile.WriteFixedHdr + typenxt = msfile.typenxt + GetBlk = msfile.GetBlk + PutBlk = msfile.PutBlk + + filesize = msfile.filesize + blksize = msfile.blksize + (numblocks, odd_size) = divmod(filesize, blksize) outlist.append(ifile) blk_err=0 @@ -2788,7 +2799,7 @@ class MainWindow: # block n while b < numblk: seekval = (n*blksize)+addseek - (blktype, next)=typenxt(seekval) + (blktype, next) = typenxt(seekval) blklist = GetBlk(blktype, seekval) if not blklist: # if blockette error encountered bail and undo endian @@ -3006,9 +3017,10 @@ class MainWindow: if c : self.TimeCorListText.insert("end", """%s\n""" % key, "odd") - addtext = 4*SPACE + "Block Start Time" + 6*SPACE + "Cor(s)" + \ - 8*SPACE + "Status" + 14*SPACE + "Timing Questionable" - self.TimeCorListText.insert("end", """%s\n""" % addtext, "odd") + addtext = 4*SPACE + "Block Start Time" + 6*SPACE + "Cor(s)" \ + + 8*SPACE + "Status" + 14*SPACE + "Timing Questionable" + self.TimeCorListText.insert( + "end", """%s\n""" % addtext, "odd") for tup in TimeDict[key]: addtext = 4*SPACE + str(tup[0]) splen = 26 - len(addtext) @@ -3022,8 +3034,8 @@ class MainWindow: c = 0 else : self.TimeCorListText.insert("end", """%s\n""" % key) - addtext = 4*SPACE + "Block Start Time" + 6*SPACE + "Cor(s)" + \ - 8*SPACE + "Status" + 14*SPACE + "Timing Questionable" + addtext = 4*SPACE + "Block Start Time" + 6*SPACE + "Cor(s)" \ + + 8*SPACE + "Status" + 14*SPACE + "Timing Questionable" self.TimeCorListText.insert("end", """%s\n""" % addtext) for tup in TimeDict[key]: addtext = 4*SPACE + str(tup[0]) @@ -3085,7 +3097,7 @@ class MainWindow: hdrs[3] # has time correction been applied if int(act[6]): - corr="applied" + corr = "applied" else: corr="not applied" # is timing questionable flag set @@ -3124,8 +3136,6 @@ class MainWindow: newvar = "0"*pad + var return newvar - - ######################################################### def DumpUpdateDicts(self, type=""): """ @@ -3738,7 +3748,7 @@ command= Command(self.KillCancelTL, runvar) #make sure current entries are included self.UpdateHdr(self.StationName.get()) if self.UpdateHdrDict or self.UpdateTimeDict: - outfile=open(file.get(), "w") + outfile = open(file.get(), "w") if self.UpdateHdrDict: outfile.write("%s\n" % "# Header Changes") outfile.write( @@ -3860,7 +3870,7 @@ command= Command(self.KillCancelTL, runvar) #err = "You must build a Trace db before loading template" #self.addTextInfoBar(err, 'red') #return - selection = tkFileDialog.askopenfilename\ + selection = askopenfilename\ (filetypes = [("All", "*")]) if selection: try: