def main(): print('QSSP input file is', sys.argv[1]) print('QSSP output file is', sys.argv[2]) qsspinput = sys.argv[1] qsspoutput = sys.argv[2] # read header info.s from QSSP input file deltat, spara, prfx, nr, rdepth, rpara, rnames = readinput(qsspinput) # read seismograms from QSSP output files seis = readoutput(qsspoutput) # read channel code and observable types chan, caz, cin, datatype = datatype_channel(prfx, qsspoutput) # write SAC files for each receiver/station for i in range(0, nr): # name for SAC file sacname = prfx.upper() + '.' + rnames[i].upper( ) + '.' + datatype + '.' + chan + '.SAC' header = {'iztype': 'io', 'o': 0, 'b': rpara[i,2], 'delta': deltat, \ 'kevnm': prfx, 'evla': spara[0], 'evlo': spara[1], 'evdp': spara[2],\ 'kstnm': rnames[i], 'kcmpnm': chan, 'cmpaz': caz, 'cmpinc': cin, \ 'stla': rpara[i,0], 'stlo': rpara[i,1], 'stdp': rdepth*1e3, \ 'lcalda': True} tr = SACTrace(data=seis[:, i], **header) tr.write(sacname) print('Create SAC file:', sacname)
def write_constant(self, out_sac_path='./'): """ Write constant component to SAC file. :param out_sac_path: Output path, defaults to './' :type out_sac_path: str, optional """ sac = SACTrace(data=self.harmonic_trans[0, :]) sac.b = self.tmin sac.delta = self.rfsta.sampling sac.user0 = 0.0 sac.user1 = self.rfsta.f0[0] sac.stla = self.rfsta.stla sac.stlo = self.rfsta.stlo sac.stel = self.rfsta.stel sac.write( join(out_sac_path, '{}_constant_R.sac'.format(self.rfsta.staname)))
def writesac(velfile,site,stalat,stalon,doy,year,samprate,event): a = numpy.loadtxt(velfile) tind = a[:,0] gtime = a[:,1] leapsec = gpsleapsec(gtime[0]) #Get the start time of the file in UTC date = datetime.datetime(int(year), 1, 1) + datetime.timedelta(int(doy) - 1) gpstime = (numpy.datetime64(date) - numpy.datetime64('1980-01-06T00:00:00'))/ numpy.timedelta64(1, 's') stime = (gtime[0]-leapsec)*numpy.timedelta64(1, 's')+ numpy.datetime64('1980-01-06T00:00:00') sitem = stime.item() print(sitem) styr = sitem.year stdy = sitem.day stmon = sitem.month sthr = sitem.hour stmin = sitem.minute stsec = sitem.second nv = a[:,2] ev = a[:,3] uv = a[:,4] print('Writing SAC file ' + 'output/' + site + '.LXN.sac') headN = {'kstnm': site, 'kcmpnm': 'LXN', 'stla': float(stalat),'stlo': float(stalon), 'nzyear': int(year), 'nzjday': int(doy), 'nzhour': int(sthr), 'nzmin': int(stmin), 'nzsec': int(stsec), 'nzmsec': int(0), 'delta': float(samprate)} sacn = SACTrace(data=nv, **headN) sacn.write('output/' + site.upper() + '.vel.n') print('Writing SAC file ' + 'output/' + site + '.LXE.sac') headE = {'kstnm': site, 'kcmpnm': 'LXE', 'stla': float(stalat),'stlo': float(stalon), 'nzyear': int(year), 'nzjday': int(doy), 'nzhour': int(sthr), 'nzmin': int(stmin), 'nzsec': int(stsec), 'nzmsec': int(0), 'delta': float(samprate)} sace = SACTrace(data=ev, **headE) sace.write('output/' + site.upper() + '.vel.e') print('Writing SAC file ' + 'output/' + site + '.LXZ.sac') headZ = {'kstnm': site, 'kcmpnm': 'LXZ', 'stla': float(stalat),'stlo': float(stalon), 'nzyear': int(year), 'nzjday': int(doy), 'nzhour': int(sthr), 'nzmin': int(stmin), 'nzsec': int(stsec), 'nzmsec': int(0), 'delta': float(samprate)} sacu = SACTrace(data=uv, **headZ) sacu.write('output/' + site.upper() + '.vel.u')
def csv2sac(infile, cconstant): # Channel = ["", "", "", ""] units = ['Counts ', 'Counts ', 'Counts ', 'Counts '] comment = ['Velocity', 'Velocity', 'Velocity', 'Velocity'] (header, stack) = load(infile) first_sample, medsps = timingvalidate(stack) if first_sample <> 0: print "\n\nA timing error exists in the 1st sample of the 1st record in this DAT series.\n" print "Remove the first DAT file in the folder and try again." sys.exit() # print "The first sample shows instantaneous sample rate of {} S/second.".format(medsps) # datetime = stack[0][13]+","+stack[0][14] # Frac_second = float(stack[0][17]) datetime = stack[0][15] + "," + stack[0][ 16] # New cs4 format the fields are offset by two more columns Frac_second = float(stack[0][17]) St_time = time.strptime(datetime, "%Y/%m/%d,%H:%M:%S") stdate = str(St_time.tm_year) + "_" + str(St_time.tm_mon) + "_" + str( St_time.tm_mday) stmin = str(St_time.tm_hour) + "_" + str(St_time.tm_min) + "_" + str( St_time.tm_sec) + "_" + str(int(Frac_second * 1000)) Filetime = stdate + "_" + stmin + "_" Station = cconstant[0] Network = cconstant[15] # File naming convention: YYYY.DDD.HH.MM.SS.SSS.NN.STATION.CHANNEL seedfil = infile[0:string.rfind( infile, '\\')] + "/" + Filetime + Network + "_" + Station sacfil = infile[0:string.rfind(infile, '.')] for i in range(0, 4): Channel[i] = cconstant[(2 * i) + 1] Samplecount = len(stack) print "Sample count stands at {} samples.".format(Samplecount) Delta = 1.0 / float(getsps(stack)) # Delta = 1/medsps print "Delta = {0:.8f}, Sample rate = {1:.8f}".format(Delta, 1 / Delta) # # stack[1] = channel 1 time history # . # # stack[4] = channel 4 time history # for i in range(0, 4): # Build each channel b = np.arange( len(stack), dtype=np.float32) # Establishes the size of the datastream for n in range(len(stack)): # Load the array with time-history data b[n] = np.float32( stack[n][i + 1]) # Convert the measurement from counts to volts. t = SACTrace(data=b) # set the SAC header values t.scale = 1.0 # Set the scale for each channel for use with DIMAS software t.delta = Delta t.nzyear = St_time.tm_year t.nzjday = St_time.tm_yday t.nzhour = St_time.tm_hour t.nzmin = St_time.tm_min t.nzsec = St_time.tm_sec t.nzmsec = int((Frac_second) * 1000) t.kstnm = Station t.kcmpnm = Channel[i] t.IDEP = 4 # 4 = units of velocity (in Volts) # Dependent variable choices: (1)unknown, (2)displacement(nm), # (3)velocity(nm/sec), (4)velocity(volts), # (5)nm/sec/sec t.kinst = comment[i - 1] # Instrument type t.knetwk = Network # Network designator t.kuser0 = units[ i - 1] # Place the system of units into the user text field 0 out = sacfil + "_{}.sac".format(Channel[i]) seed = seedfil + "_{}.mseed".format(Channel[i]) if Channel[ i] != "UNK": # We do not write streams in which the channel name is UNK with open(out, 'wb') as sacfile: t.write(sacfile) print " File successfully written: {0}".format(out) sacfile.close() st = read(out) st.write(seed, format="mseed") print " File successfully written: {0}".format(seed) # subprocess.call(["del",f],shell=True) # for i in range(0,1): # Build special channel for timing b = np.arange(len(stack), dtype=np.float32) # Establishes the size of the datastream for n in range(len(stack)): # Load the array with time-history data b[n] = np.float32(stack[n][13]) # Get the timing value. t = SACTrace(data=b) # set the SAC header values t.scale = 1.0 # Set the scale for each channel. This one is important to declare. t.delta = Delta t.nzyear = St_time.tm_year t.nzjday = St_time.tm_yday t.nzhour = St_time.tm_hour t.nzmin = St_time.tm_min t.nzsec = St_time.tm_sec t.nzmsec = int((Frac_second) * 1000) t.kstnm = Station t.kcmpnm = 'GPS' # This is a GPS timing signal. t.IDEP = 1 # 4 = units of velocity (in Volts) # Dependent variable choices: (1)unknown, (2)displacement(nm), # (3)velocity(nm/sec), (4)velocity(volts), # (5)nm/sec/sec t.kinst = 'GPS' # Instrument type t.knetwk = Network # Network designator t.kuser0 = 'digital' # Place the system of units into the user text field 0 out = sacfil + "_{}.sac".format('GPS') with open(out, 'wb') as sacfile: t.write(sacfile) # print " File successfully written: {}.sac".format(out) # print "Published sample rate in sac file = {}".format(t.stats.sampling_rate) sacfile.close()
def test_sac2asdf_script(tmpdir, capsys): tmpdir = tmpdir.strpath # Create some test data data_1 = np.arange(10, dtype=np.float32) header = { "kstnm": "ANMO", "knetwk": "IU", "kcmpnm": "BHZ", "stla": 40.5, "stlo": -108.23, "stel": 100.0, "stdp": 3.4, "evla": -15.123, "evlo": 123, "evdp": 50, "nzyear": 2012, "nzjday": 123, "nzhour": 13, "nzmin": 43, "nzsec": 17, "nzmsec": 100, "delta": 1.0 / 40, "o": -10.0, } sac = SACTrace(data=data_1, **header) sac.write(os.path.join(tmpdir, "a.sac")) data_2 = 2.0 * np.arange(10, dtype=np.float32) header = { "kstnm": "BBBB", "knetwk": "AA", "kcmpnm": "CCC", "stla": 40.5, "stlo": -108.23, "stel": 200.0, "stdp": 2.4, "evla": -14.123, "evlo": 125, "evdp": 30, "nzyear": 2013, "nzjday": 123, "nzhour": 13, "nzmin": 43, "nzsec": 17, "nzmsec": 100, "delta": 1.0 / 40, "o": 10.0, } sac = SACTrace(data=data_2, **header) sac.write(os.path.join(tmpdir, "b.sac")) output_file = os.path.join(tmpdir, "out.h5") assert not os.path.exists(output_file) sys_argv_backup = copy.copy(sys.argv) try: sys.argv = sys.argv[:1] sys.argv.append(tmpdir) sys.argv.append(output_file) sys.argv.append("random") sac2asdf.__main__() finally: # Restore to not mess with any of pytests logic. sys.argv = sys_argv_backup non_verbose_out, non_verbose_err = capsys.readouterr() assert not non_verbose_err assert os.path.exists(output_file) with pyasdf.ASDFDataSet(output_file, mode="r") as ds: # 2 Events. assert len(ds.events) == 2 # 2 Stations. assert len(ds.waveforms) == 2 events = ds.events # NOQA # Data should actually be fully identical np.testing.assert_equal(data_1, ds.waveforms.IU_ANMO.random[0].data) np.testing.assert_equal(data_2, ds.waveforms.AA_BBBB.random[0].data) assert ds.waveforms.IU_ANMO.random[0].id == "IU.ANMO..BHZ" assert ds.waveforms.AA_BBBB.random[0].id == "AA.BBBB..CCC" c = ds.waveforms.IU_ANMO.coordinates np.testing.assert_allclose( [c["latitude"], c["longitude"], c["elevation_in_m"]], [40.5, -108.23, 100.0], ) c = ds.waveforms.AA_BBBB.coordinates np.testing.assert_allclose( [c["latitude"], c["longitude"], c["elevation_in_m"]], [40.5, -108.23, 200.0], ) c = ds.waveforms.IU_ANMO.channel_coordinates["IU.ANMO..BHZ"][0] np.testing.assert_allclose( [ c["latitude"], c["longitude"], c["elevation_in_m"], c["local_depth_in_m"], ], [40.5, -108.23, 100.0, 3.4], ) c = ds.waveforms.AA_BBBB.channel_coordinates["AA.BBBB..CCC"][0] np.testing.assert_allclose( [ c["latitude"], c["longitude"], c["elevation_in_m"], c["local_depth_in_m"], ], [40.5, -108.23, 200.0, 2.4], ) # Events origin = (ds.waveforms.IU_ANMO.random[0].stats.asdf.event_ids[0]. get_referred_object().origins[0]) np.testing.assert_allclose( [origin.latitude, origin.longitude, origin.depth], [-15.123, 123.0, 50.0], ) assert (origin.time == obspy.UTCDateTime( year=2012, julday=123, hour=13, minute=43, second=17, microsecond=100000, ) - 10.0) origin = (ds.waveforms.AA_BBBB.random[0].stats.asdf.event_ids[0]. get_referred_object().origins[0]) np.testing.assert_allclose( [origin.latitude, origin.longitude, origin.depth], [-14.123, 125.0, 30.0], ) assert (origin.time == obspy.UTCDateTime( year=2013, julday=123, hour=13, minute=43, second=17, microsecond=100000, ) + 10.0) # Run once again in verbose mode but just test that the output is # actually more. os.remove(output_file) sys_argv_backup = copy.copy(sys.argv) try: sys.argv = sys.argv[:1] sys.argv.append("--verbose") sys.argv.append(tmpdir) sys.argv.append(output_file) sys.argv.append("random") sac2asdf.__main__() finally: # Restore to not mess with any of pytests logic. sys.argv = sys_argv_backup verbose_out, verbose_err = capsys.readouterr() assert not verbose_err assert len(verbose_out) > len(non_verbose_out)
def main(): # MAIN PROGRAM BODY # Parse the command line switches optioncount = len(sys.argv) SAC = False outputfile_defined = False filelist = [] dir="" extension = '.txt' if optioncount > 1: if optioncount == 4: if sys.argv[3] == '-s': SAC = True # print "SAC set to true." outfile = sys.argv[2] infile = sys.argv[1] filelist.append(infile) elif optioncount == 3: if "." in sys.argv[1]: infile = sys.argv[1] filelist.append(infile) outputfile_defined = True outfile = sys.argv[2] else: if len(sys.argv[2])==4 and "." in sys.argv[2]: # set a different extension extension = sys.argv[2] filelist = os.listdir(sys.argv[1]) dir=sys.argv[1] elif optioncount == 2: if "." in sys.argv[1]: infile = sys.argv[1] filelist.append(infile) else: dir = sys.argv[1] filelist = os.listdir(sys.argv[1]) for n in range(len(filelist)): if extension in filelist[n]: if len(filelist)>1: infile = dir+"/"+filelist[n] if string.find(infile,'.') > 0: outfile = infile[:string.find(infile,'.')]+'.sac' seedfile = infile[:string.find(infile,'.')]+'.mseed' else: outfile = infile +'.sac' seedfile = infile + '.mseed' PNE = load(infile) # PNE[0] is the header where: # PNE[0][0][1] = The comment descriptor of the data # PNE[0][1][1] = The station name # PNE[0][2][1] = Component axis(Z,N, or E) # PNE[0][4][1] = Start time # PNE[0][5][1] = Calibration factor # PNE[0][6][1] = Time correction in seconds Comment = PNE[0][0][1] Stname = PNE[0][1][1][:7] Component = PNE[0][2][1][:3] St_time = time.strptime(PNE[0][4][1][:-4],"%d_%b_%Y_%H:%M:%S") Frac_sec = int(PNE[0][4][1][21:]) CF = np.float32(PNE[0][5][1]) TC = PNE[0][6][1] # time correction Offset = float(PNE[1][0][0]) # # Delta is calculated from the offset time of last sample # minus offset of first sample / total number of samples. Delta = (float(PNE[1][len(PNE[1])-1][0])-Offset)/(len(PNE[1])-1) # Load Data array # Samples in file are multiplied by 10,000 to convert from # measurements of centimeters to microns, then it's divided by # the Amplification (conversion) factor, known as CF Data = [] for n in range (len(PNE[1])-1): Datum = np.float32(np.float32(PNE[1][n][1])*10000.0/CF) Data.append(Datum) b = np.arange(len(Data),dtype=np.float32) for n in range(len(Data)): # Load the array with time-history data b[n] = Data[n] t = SACTrace(data = b) # set the SAC header values t.scale = 1.0 # Set the scale for use with DIMAS software t.delta = Delta t.nzyear = St_time.tm_year t.nzjday = St_time.tm_yday t.nzhour = St_time.tm_hour t.nzmin = St_time.tm_min t.nzsec = St_time.tm_sec t.nzmsec = Frac_sec # int((Frac_second)*1000) t.kstnm = Stname[:7] t.kcmpnm = Component t.IDEP = 4 # 4 = units of velocity (in Volts) # Dependent variable choices: # (1)unknown, # (2)displacement(nm), # (3)velocity(nm/sec), # (4)velocity(volts), # (5)nm/sec/sec t.kinst = "Velocity" # Instrument type t.knetwk = "LM" # Network designator t.kuser0 = "Nanometr" # Place the system of units into the user text field 0 # t.WriteSacBinary(outfile) with open(outfile,'wb') as sacfile: t.write(sacfile) print " File successfully written: {0}".format(outfile) sacfile.close() st=read(outfile) st.write(seedfile,format="mseed") print " File successfully written: {0}".format(seedfile) print "File written to {}".format(outfile) else: print "Useage: PNE2SAC infile.txt (outfile.asc)" print "Or, PNE2SAC target_directory target_extension(like .txt)" print "No infile or directory specified." print len(sys.argv)
def csv2sac(infile,cconstant): # Channel = ["","","",""] units = ['Counts ','Counts ','Counts ','Counts '] comment = ['Velocity','Velocity','Velocity','Velocity'] (header,stack) = load(infile) first_sample,medsps = timingvalidate(stack) if first_sample <> 0: print "\n\nA timing error exists in the 1st sample of the 1st record in this DAT series.\n" print "Remove the first DAT file in the folder and try again." sys.exit() # print "The first sample shows instantaneous sample rate of {} S/second.".format(medsps) # datetime = stack[0][13]+","+stack[0][14] # Frac_second = float(stack[0][17]) datetime = stack[0][15]+","+stack[0][16] # New cs4 format the fields are offset by two more columns Frac_second = float(stack[0][17]) St_time = time.strptime(datetime,"%Y/%m/%d,%H:%M:%S") stdate = str(St_time.tm_year)+"_"+str(St_time.tm_mon)+"_"+str(St_time.tm_mday) stmin = str(St_time.tm_hour)+"_"+str(St_time.tm_min)+"_"+str(St_time.tm_sec)+"_"+str(int(Frac_second*1000)) Filetime = stdate+"_"+stmin+"_" Station = cconstant[0] Network = cconstant[15] # File naming convention: YYYY.DDD.HH.MM.SS.SSS.NN.STATION.CHANNEL seedfil = infile[0:string.rfind(infile,'\\')]+"/"+Filetime+Network+"_"+Station sacfil = infile[0:string.rfind(infile,'.')] for i in range(0,4): Channel[i]=cconstant[(2*i)+1] Samplecount = len(stack) print "Sample count stands at {} samples.".format(Samplecount) Delta = 1.0/float(getsps(stack)) # Delta = 1/medsps print "Delta = {0:.8f}, Sample rate = {1:.8f}".format(Delta,1/Delta) # # stack[1] = channel 1 time history # . # # stack[4] = channel 4 time history # for i in range(0,4): # Build each channel b = np.arange(len(stack),dtype=np.float32) # Establishes the size of the datastream for n in range(len(stack)): # Load the array with time-history data b[n] = np.float32(stack[n][i+1]) # Convert the measurement from counts to volts. t = SACTrace(data = b) # set the SAC header values t.scale=1.0 # Set the scale for each channel for use with DIMAS software t.delta=Delta t.nzyear=St_time.tm_year t.nzjday=St_time.tm_yday t.nzhour=St_time.tm_hour t.nzmin=St_time.tm_min t.nzsec=St_time.tm_sec t.nzmsec=int((Frac_second)*1000) t.kstnm=Station t.kcmpnm=Channel[i] t.IDEP=4 # 4 = units of velocity (in Volts) # Dependent variable choices: (1)unknown, (2)displacement(nm), # (3)velocity(nm/sec), (4)velocity(volts), # (5)nm/sec/sec t.kinst=comment[i-1] # Instrument type t.knetwk=Network # Network designator t.kuser0=units[i-1] # Place the system of units into the user text field 0 out = sacfil+"_{}.sac".format(Channel[i]) seed = seedfil+"_{}.mseed".format(Channel[i]) if Channel[i] !="UNK": # We do not write streams in which the channel name is UNK with open(out,'wb') as sacfile: t.write(sacfile) print " File successfully written: {0}".format(out) sacfile.close() st=read(out) st.write(seed,format="mseed") print " File successfully written: {0}".format(seed) # subprocess.call(["del",f],shell=True) # for i in range(0,1): # Build special channel for timing b = np.arange(len(stack),dtype=np.float32) # Establishes the size of the datastream for n in range(len(stack)): # Load the array with time-history data b[n] = np.float32(stack[n][13]) # Get the timing value. t = SACTrace(data = b) # set the SAC header values t.scale=1.0 # Set the scale for each channel. This one is important to declare. t.delta=Delta t.nzyear=St_time.tm_year t.nzjday=St_time.tm_yday t.nzhour=St_time.tm_hour t.nzmin=St_time.tm_min t.nzsec= St_time.tm_sec t.nzmsec= int((Frac_second)*1000) t.kstnm=Station t.kcmpnm='GPS' # This is a GPS timing signal. t.IDEP=1 # 4 = units of velocity (in Volts) # Dependent variable choices: (1)unknown, (2)displacement(nm), # (3)velocity(nm/sec), (4)velocity(volts), # (5)nm/sec/sec t.kinst='GPS' # Instrument type t.knetwk=Network # Network designator t.kuser0='digital' # Place the system of units into the user text field 0 out = sacfil+"_{}.sac".format('GPS') with open(out,'wb') as sacfile: t.write(sacfile) # print " File successfully written: {}.sac".format(out) # print "Published sample rate in sac file = {}".format(t.stats.sampling_rate) sacfile.close()
def test_sac2asdf_script(tmpdir, capsys): tmpdir = tmpdir.strpath # Create some test data data_1 = np.arange(10, dtype=np.float32) header = {'kstnm': 'ANMO', 'knetwk': 'IU', 'kcmpnm': 'BHZ', 'stla': 40.5, 'stlo': -108.23, 'stel': 100.0, 'stdp': 3.4, 'evla': -15.123, 'evlo': 123, 'evdp': 50, 'nzyear': 2012, 'nzjday': 123, 'nzhour': 13, 'nzmin': 43, 'nzsec': 17, 'nzmsec': 100, 'delta': 1.0 / 40, 'o': -10.0} sac = SACTrace(data=data_1, **header) sac.write(os.path.join(tmpdir, "a.sac")) data_2 = 2.0 * np.arange(10, dtype=np.float32) header = {'kstnm': 'BBBB', 'knetwk': 'AA', 'kcmpnm': 'CCC', 'stla': 40.5, 'stlo': -108.23, 'stel': 200.0, 'stdp': 2.4, 'evla': -14.123, 'evlo': 125, 'evdp': 30, 'nzyear': 2013, 'nzjday': 123, 'nzhour': 13, 'nzmin': 43, 'nzsec': 17, 'nzmsec': 100, 'delta': 1.0 / 40, 'o': 10.0} sac = SACTrace(data=data_2, **header) sac.write(os.path.join(tmpdir, "b.sac")) output_file = os.path.join(tmpdir, "out.h5") assert not os.path.exists(output_file) sys_argv_backup = copy.copy(sys.argv) try: sys.argv = sys.argv[:1] sys.argv.append(tmpdir) sys.argv.append(output_file) sys.argv.append("random") sac2asdf.__main__() finally: # Restore to not mess with any of pytests logic. sys.argv = sys_argv_backup non_verbose_out, non_verbose_err = capsys.readouterr() assert not non_verbose_err assert os.path.exists(output_file) with pyasdf.ASDFDataSet(output_file, mode="r") as ds: # 2 Events. assert len(ds.events) == 2 # 2 Stations. assert len(ds.waveforms) == 2 events = ds.events # flake8: noqa # Data should actually be fully identical np.testing.assert_equal( data_1, ds.waveforms.IU_ANMO.random[0].data) np.testing.assert_equal( data_2, ds.waveforms.AA_BBBB.random[0].data) assert ds.waveforms.IU_ANMO.random[0].id == "IU.ANMO..BHZ" assert ds.waveforms.AA_BBBB.random[0].id == "AA.BBBB..CCC" c = ds.waveforms.IU_ANMO.coordinates np.testing.assert_allclose( [c["latitude"], c["longitude"], c["elevation_in_m"]], [40.5, -108.23, 100.0]) c = ds.waveforms.AA_BBBB.coordinates np.testing.assert_allclose( [c["latitude"], c["longitude"], c["elevation_in_m"]], [40.5, -108.23, 200.0]) c = ds.waveforms.IU_ANMO.channel_coordinates["IU.ANMO..BHZ"][0] np.testing.assert_allclose( [c["latitude"], c["longitude"], c["elevation_in_m"], c["local_depth_in_m"]], [40.5, -108.23, 100.0, 3.4]) c = ds.waveforms.AA_BBBB.channel_coordinates["AA.BBBB..CCC"][0] np.testing.assert_allclose( [c["latitude"], c["longitude"], c["elevation_in_m"], c["local_depth_in_m"]], [40.5, -108.23, 200.0, 2.4]) # Events origin = ds.waveforms.IU_ANMO.random[ 0].stats.asdf.event_ids[0].get_referred_object().origins[0] np.testing.assert_allclose( [origin.latitude, origin.longitude, origin.depth], [-15.123, 123.0, 50.0]) assert origin.time == obspy.UTCDateTime( year=2012, julday=123, hour=13, minute=43, second=17, microsecond=100000) - 10.0 origin = ds.waveforms.AA_BBBB.random[ 0].stats.asdf.event_ids[0].get_referred_object().origins[0] np.testing.assert_allclose( [origin.latitude, origin.longitude, origin.depth], [-14.123, 125.0, 30.0]) assert origin.time == obspy.UTCDateTime( year=2013, julday=123, hour=13, minute=43, second=17, microsecond=100000) + 10.0 # Run once again in verbose mode but just test that the output is # actually more. os.remove(output_file) sys_argv_backup = copy.copy(sys.argv) try: sys.argv = sys.argv[:1] sys.argv.append("--verbose") sys.argv.append(tmpdir) sys.argv.append(output_file) sys.argv.append("random") sac2asdf.__main__() finally: # Restore to not mess with any of pytests logic. sys.argv = sys_argv_backup verbose_out, verbose_err = capsys.readouterr() assert not verbose_err assert len(verbose_out) > len(non_verbose_out)
def tosac(filename, outpath, parfile="None"): """ Convert to SAC format Parameters ---------- filename : string the filename of waveform data outpath : string the path name saving sac file, no back slash parfile : string input pararameter file for calculating response """ with open(filename, "r") as fp: lst = fp.readlines() row = lst[0].split() # print row npx = int(row[0]) ncomp = int(row[1]) try: os.makedirs(outpath) except: pass k = -1 for i in range(1, npx * ncomp * 2 + 1, 2): k += 1 stno = k / ncomp + 1 row = lst[i].split() # XS(JX) stlo = float(row[0]) stla = 0.0 az = float(row[1]) kcmpnm = row[2] delta = float(row[3]) npts = int(row[4]) # reduced slowness, unit is pr = float(row[5]) # reduced time, STMIN+PR*XS(JX), where STMIN is starting reduced time tcal = float(row[6]) # not clear what smp mean smp = float(row[7]) evla = 0.0 evlo = 0.0 # print stlo, az, kcmpnm, delta, npts, pr, tcal, smp row = lst[i + 1].split() data = np.array(row) data = data.astype(np.float32) if parfile == "None": evdp = -12345.0 else: with open(parfile, "r") as fp: parlst = fp.readlines() row = parlst[20].split()[0] evdp = float(row) knetwk = "S" kstnm = str(stno).zfill(3) header = { "kcmpnm": kcmpnm, "knetwk": knetwk, "kstnm": kstnm, "stlo": stlo, "stla": stla, "delta": delta, "npts": npts, "evlo": evlo, "evla": evla, "evdp": evdp } sac = SACTrace(data=data, **header) fn = outpath + "/" + ".".join([knetwk, kstnm, "", kcmpnm, "sac"]) # print fn sac.write(dest=fn)