def stream_add_stats(data_stream,inv,evt,write_sac=False,rotate_in_obspy=False): for net in inv: for sta in net: str1=data_stream.select(network=net.code,station=sta.code) print(str(net.code),str(sta.code),len(str1)) if len(str1) == 0: continue # update in future to deal with multiple channel (total_number_of channels) if len(str1) % 3 !=0: print('Problem: missing components', str1); exit() for tr in str1: for chan in sta: if tr.stats.channel == chan.code and tr.stats.location == chan.location_code: break else: print('Problem finding channel in inventory',tr); exit() tr.stats.coordinates={'latitude':chan.latitude,'longitude':chan.longitude} (tr.stats.distance,tr.stats.azimuth,tr.stats.back_azimuth)=gps2dist_azimuth( chan.latitude, chan.longitude, evt.origins[0].latitude, evt.origins[0].longitude) if write_sac==True: sac= AttribDict() sac.kstnm=str(sta.code); sac.knetwk=str(net.code); sac.kcmpnm=str(chan.code) sac.khole=str(chan.location_code) sac.stla=chan.latitude; sac.stlo=chan.longitude; sac.stel=chan.elevation sac.evla=evt.origins[0].latitude; sac.evlo=evt.origins[0].longitude; sac.evdp=evt.origins[0].depth/1000. # in km sac.mag=evt.magnitudes[0].mag; time=evt.origins[0].time sac.nzyear, sac.nzjday, sac.nzhour, sac.nzmin, sac.nzsec, sac.nzmsec=time.year, time.julday, time.hour, time.minute, time.second, time.microsecond/1000 sac.o=0. sac.b=tr.stats.starttime-time # this is very important!! sac.kevnm=str(time) sac.cmpaz=chan.azimuth # dip is from horizontal downward; inc is from vertical downward sac.cmpinc=chan.dip+90 sac.gcarc = locations2degrees(evt.origins[0].latitude, evt.origins[0].longitude, chan.latitude, chan.longitude) sac.dist,sac.az,sac.baz= tr.stats.distance/1000,tr.stats.azimuth,tr.stats.back_azimuth tr.stats.sac=sac tr_name=sta.code+'.'+net.code+'.'+chan.location_code+'.'+chan.code+'.sac' tr.write(tr_name,format='SAC')
def txt2sac(txt,output_dir = os.getcwd()): ''' This function will convert txt file to SAC file''' with open(txt,encoding='iso-8859-9') as eqfile: if os.stat(txt).st_size == 0: print(txt + ' is empty') return head = [next(eqfile) for x in range(14)] head = [line.rstrip('\n') for line in head] hd = AttribDict() hd['sac'] = AttribDict() # Retrieve Event Information # Retrieve EventTime s = ''.join(i for i in head[2] if i.isdigit()) evtime = datetime.strptime(s, '%Y%m%d%H%M%S%f') # Retrieve EVLA, EVLO _,coors = head[3].split(':') # Remove space, N and E coors = coors.replace(' ','') coors = coors.replace('N','') coors = coors.replace('E','') evla,evlo = coors.split('-') hd['sac'].evla = float(evla.replace(',','.')); hd['sac'].evlo = float(evlo.replace(',','.')) # Retrieve EVDP _,depth = head[4].split(':') evdp = depth.replace(' ','') hd['sac'].evdp = float(evdp) # Retrieve MAG _,mags = head[5].split(':') # Check if multiple Magnitude types are associated with the earthquake if ',' in mags: mag,imagtyp = mag_seperator(mags) hd['sac'].imagtyp = imagtyp else: _, mag,imagtyp = mags.split(' ') hd['sac'].imagtyp = mag_type(imagtyp) hd['sac'].mag = float(mag.replace(',','.')) # Retrieve Station Information # Assign Network hd['network'] = 'TK' # Assing Location hd['location'] = 00 # Retrieve KSTNM _,stnm = head[6].split(':') kstnm = stnm.replace(' ','') hd['station'] = kstnm # Retrieve STLA, STLO _,coors = head[7].split(':') # Remove space, N and E coors = coors.replace(' ','') coors = coors.replace('N','') coors = coors.replace('E','') stla,stlo = coors.split('-') hd['sac'].stla = float(stla.replace(',','.')); hd['sac'].stlo = float(stlo.replace(',','.')) # Retrieve STEL _,el = head[8].split(':') stel = el.replace(' ','') hd['stel'] = float(stel.replace(',','.')) # Retrieve Record Information # Retrieve Recordtime s = ''.join(i for i in head[11] if i.isdigit()) starttime = datetime.strptime(s, '%d%m%Y%H%M%S%f') hd['starttime'] = UTCDateTime(starttime) hd['sac'].o = UTCDateTime(starttime) - UTCDateTime(evtime) # Retrieve NPTS _,nptss = head[12].split(':') npts = nptss.replace(' ','') hd['npts'] = int(npts) # Retrieve DELTA _,dt = head[13].split(':') delta = dt.replace(' ','') hd['delta'] = float(delta.replace(',','.')) hd['sampling_rate'] = 1/hd['delta'] hd['endtime'] = hd['starttime'] + hd['npts']*hd['delta'] hd['sac'].lcalda = 1; hd['sac'].lovrok = 1 eqfile.close() # Read Waveform with open(txt,encoding='iso-8859-9') as eqfile: wfs = eqfile.readlines()[18:] wfs = [line.rstrip('\n') for line in wfs] wfs = [line.split(' ') for line in wfs] wfs = [list(filter(None, line)) for line in wfs] e = []; n = []; z = []; for line in wfs: n.append(line[0]) e.append(line[1]) z.append(line[2]) #East tracee = Trace(np.asarray(e)) hd['channel'] = 'HGE' tracee.stats = hd st = Stream(traces=[tracee]) st.write(os.path.join(output_dir,st[0].id + '.SAC'), format='SAC') #North tracen = Trace(np.asarray(n)) hd['channel'] = 'HGN' tracen.stats = hd st = Stream(traces=[tracen]) st.write(os.path.join(output_dir,st[0].id + '.SAC'), format='SAC') #Vertical tracez = Trace(np.asarray(z)) hd['channel'] = 'HGZ' tracez.stats = hd st = Stream(traces=[tracez]) st.write(os.path.join(output_dir,st[0].id + '.SAC'), format='SAC') return