Giter Site home page Giter Site logo

jpjones76 / seisio.jl Goto Github PK

View Code? Open in Web Editor NEW
47.0 14.0 21.0 206.03 MB

Julia language support for geophysical time series data

Home Page: http://seisio.readthedocs.org

License: Other

Julia 94.34% Jupyter Notebook 5.66%
seismology geophysics time-series sac iris seed seedlink fdsn fdsnws fdsn-ws

seisio.jl's People

Contributors

jpjones76 avatar juliatagbot avatar tclements avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

seisio.jl's Issues

Bump compat for Blosc for "0.5.1, 0.6, 0.7"

This is related to #49 - can we bump compatibility for Blosc.jl to "0.5.1, 0.6, 0.7"? I'm having trouble bundling SeisIO with the new AWS.jl in a package due to SeisIO fixed on Blosc v0.5.1

Short circuit for reading mseed with many gaps

This is more of a discussion on mseed than an issue.

I have some mseed files with > 10,000 gaps in a dataset of ~3 million files. read_data takes about 20 seconds on the files with 10,000+ gaps each. This is expected and totally fine but I'd like to avoid reading files such as this in the future when I process the rest of the dataset. I can't determine which files are bad a priori.

I'm looking for a way to get a rough estimate of the number of gaps in a file. Does this still require reading every blockette? Looking through parserec!, I'm not sure where to begin.

My current solution is to implement something like discussed here JuliaLang/julia#36217 on top of read_data.

get_data fails due to unsafe_copyto! type mismatch

I'm doing a sizeable download (500+ stations, list attached) using get_data.

I'm using SeisIO v1.0.0 and Julia 1.4, this is also fails on master. Code to reproduce:

using SeisIO, Dates, DelimitedFiles
stationlist = readdlm("stationlist.txt",String)[:]
startdate = DateTime(2019,1,1)
enddate = DateTime(2019,1,4)
get_data("FDSN",stationlist,s=startdate,t=enddate+Day(1),w=true,v=2)

This fails due to unsage_copyto! trying to copy Float32 data to a Float64 array. Looks like x is a Float64 array while getfield(BUF, :x) is a Float32 array at line 265 in 2_parserec.jl.

ERROR: MethodError: no method matching unsafe_copyto!(::Array{Float64,1}, ::Int64, ::Array{Float32,1}, ::Int64, ::Int64)
Closest candidates are:
  unsafe_copyto!(::Array{T,N} where N, ::Any, ::Array{T,N} where N, ::Any, ::Any) where T at array.jl:263
  unsafe_copyto!(::BitArray, ::Integer, ::Union{BitArray, Array}, ::Integer, ::Integer) at bitarray.jl:452
  unsafe_copyto!(::CuArrays.CuArray{T,N,P} where P where N, ::Any, ::Array{T,N} where N, ::Any, ::Any) where T at /home/timclements/.julia/packages/CuArrays/4Q1BY/src/array.jl:300
  ...
Stacktrace:
 [1] parserec!(::SeisData, ::SeisIO.SeisIOBuf, ::IOStream, ::Int64, ::Int64, ::Bool, ::Int64) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Submodules/SEED/2_parserec.jl:265
 [2] parsemseed!(::SeisData, ::IOStream, ::Int64, ::Int64, ::Bool, ::Int64) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Submodules/SEED/readmseed.jl:11
 [3] FDSNget!(::SeisData, ::Array{String,2}; autoname::Bool, fmt::String, msr::Bool, nd::Int64, opts::String, rad::Array{Float64,1}, reg::Array{Float64,1}, s::DateTime, si::Bool, src::String, t::DateTime, to::Int64, v::Int64, w::Bool, xf::String, y::Bool) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Web/FDSN.jl:260
 [4] get_data(::String, ::Array{String,1}; autoname::Bool, demean::Bool, detrend::Bool, fmt::String, msr::Bool, nd::Int64, opts::String, rad::Array{Float64,1}, reg::Array{Float64,1}, prune::Bool, rr::Bool, s::DateTime, si::Bool, src::String, taper::Bool, t::DateTime, to::Int64, ungap::Bool, unscale::Bool, v::Int64, w::Bool, xf::String, y::Bool) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Wrappers/get_data.jl:60
 [5] top-level scope at none:0

I don't know which station this is failing for.

stationlist.txt

Bump HDF5.jl to 0.13+

Just out of curiosity, should we update the Compat for HDF5 using a higher version? For what I have known, there is one change since 0.13.0 that when indexing HDF5Dataset, the singleton dimension is automatically dropped, i.e d[:,:,1] where d <: HDF5Dataset, whereas previously not. Thanks for such great package!

Future ASDF expansion

Hi everyone,

I'd like to make this the new home of our (previous email) discussions on ASDF support.

Current status

  • SeisIO.SeisHDF has ASDF read/write support
  • Read support exists for Waveforms (including StationXML) and QuakeML via read_hdf5
  • Write support exists for Waveforms (including StationXML) and QuakeML via write_hdf5
  • Miscellaneous functions in SeisHDF allow finer control over read, write, and scan

In progress

  • Method extension to SeisNoise.jl
  • AuxiliaryData
    • Planned for SeisNoise.jl
    • General extension is not possible in SeisIO except with a thin wrapper to test for existence and prepend "AuxiliaryData/" to a path string
  • Provenance
    • I've had a rudimentary reader working for some time but can't push to GitHub without test data. No one -- even Lion Krischer, who created ASDF -- has been able to send me a test file that associates Provenance with Waveforms as described in the file format.
    • I tried testing Provenance with Lion's ASDF validator but the validator won't run. I emailed him about this last week. He seems very busy so a reply might take time.
    • Writer NYI

Proposed extensions

  • Cross-correlations in AuxiliaryData: @mdenolle has sent me specifications for implementing read/write
  • @tclements notes that support for AuxiliaryData can expand to other communities (SPECFEM, receiver function packages, geodesy).
  • @tclements has suggested making ASDF a separate module.

mseed parse error on download

When trying to download mseed data using get_data, SeisIO throws a MethodError.

I am using Julia 1.3 and SeisIO v1.0.0.

MWE:

using SeisIO, Dates
S = get_data("FDSN","IU.ANMO.00.LHZ",s="2019-02-14",t="2019-02-15")
ERROR: MethodError: no method matching *(::UInt32, ::String)
Closest candidates are:
  *(::Any, ::Any, ::Any, ::Any...) at operators.jl:529
  *(::Missing, ::AbstractString) at missing.jl:170
  *(::T, ::T) where T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8} at int.jl:54
  ...
Stacktrace:
 [1] *(::UInt32, ::String, ::UInt32) at ./operators.jl:529
 [2] blk_calib(::SeisData, ::Base.GenericIOBuffer{Array{UInt8,1}}, ::Int64, ::UInt16) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Submodules/SEED/1_mSEEDblk.jl:114
 [3] parserec!(::SeisData, ::SeisIO.SeisIOBuf, ::Base.GenericIOBuffer{Array{UInt8,1}}, ::Int64, ::Int64, ::Bool, ::Int64) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Submodules/SEED/2_parserec.jl:206
 [4] parsemseed!(::SeisData, ::Base.GenericIOBuffer{Array{UInt8,1}}, ::Int64, ::Int64, ::Bool, ::Int64) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Submodules/SEED/readmseed.jl:11
 [5] #FDSNget!#199(::Bool, ::String, ::Bool, ::Int64, ::String, ::Array{Float64,1}, ::Array{Float64,1}, ::String, ::Bool, ::String, ::String, ::Int64, ::Int64, ::Bool, ::String, ::Bool, ::typeof(SeisIO.FDSNget!), ::SeisData, ::Array{String,2}) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Web/FDSN.jl:260
 [6] (::SeisIO.var"#kw##FDSNget!")(::NamedTuple{(:autoname, :fmt, :msr, :nd, :opts, :rad, :reg, :s, :si, :src, :t, :to, :v, :w, :xf, :y),Tuple{Bool,String,Bool,Int64,String,Array{Float64,1},Array{Float64,1},String,Bool,String,String,Int64,Int64,Bool,String,Bool}}, ::typeof(SeisIO.FDSNget!), ::SeisData, ::Array{String,2}) at ./none:0
 [7] #get_data#230(::Bool, ::Bool, ::Bool, ::String, ::Bool, ::Int64, ::String, ::Array{Float64,1}, ::Array{Float64,1}, ::Bool, ::Bool, ::String, ::Bool, ::String, ::Bool, ::String, ::Int64, ::Bool, ::Bool, ::Int64, ::Bool, ::String, ::Bool, ::typeof(get_data), ::String, ::String) at /home/timclements/.julia/packages/SeisIO/pSAug/src/Wrappers/get_data.jl:60
 [8] (::SeisIO.var"#kw##get_data")(::NamedTuple{(:s, :t),Tuple{String,String}}, ::typeof(get_data), ::String, ::String) at ./none:0
 [9] top-level scope at none:0

It looks like IRIS is sending mseed that SeisIO is having trouble reading.

I'm able to read with Obspy, though there is definitely some corrupted data in this trace:

image

writesac() to support user-defined fname?

I am writing SeisChannel of cross-correlation results to sac. However, the id is not standard NET.STA.LOC.CHAN format. It includes two station information, e.g., TA.V04C..BHZ.TA.V05C..BHZ. The current fill_sac() generates file name based on the ID field and is not working correctly in my case. I think making writesac() to support more generic filenames or filenamebase should be useful.

Thanks,
Xiaotao

integrity check failed?

Hi jpjones76,

I am trying to download some TA stations but run into a warning saying integrity check failed.

For example, if I do
S1=get_data("FDSN","TA.061Z..LHZ",s="2012-08-20T10:50:00", t=4200, v=0, src="IRIS")
This is okay.

But if I do (change the starting time by 1 hour)
S2=get_data("FDSN","TA.061Z..LHZ",s="2012-08-20T11:50:00", t=4200, v=0, src="IRIS")
Then it says "RDMSEED: data integrity -- Steim-2 sequence #000015M integrity check failed, last_data=4.2158346e8, should be xn=-1.2375288e9" and the waveform doesn't look right.

Would you please help me sort it out?

Thanks a lot,
Zhitu Ma

Resampling gapless SeisChannel doesn't update `t`

On v1.0.0 resampling a gapless SeisChannel does not update the .t field. This does not affect SeisChannel with gaps or any SeisData.

julia> using SeisIO 
julia> C = SeisIO.RandSeis.randSeisChannel(s=true,c=false)
SeisChannel with 845375 samples
    ID: 4W.JWYRE..ENB
  NAME: 9xqbdIB1VJEhVEGE2n9ULE2P5TYPCEyo
   LOC: [44.2781, -22.3721, 562.839, 38.9882, -33.4714, -65.6544]
    FS: 125.0
  GAIN: 480.947
  RESP: a0 1.0, f0 1.0, 4z, 4p
 UNITS: m/s2
   SRC: randSeisChannel(c=false, nx=0)
  MISC: 11 entries
 NOTES: 1 entries
     T: 2020-06-29T15:19:50 (7 gaps)        
     X: -8.422e-01                          
        -7.590e-01                          
            ...                             
        +4.012e-01                          
        (nx = 845375)     

julia> ungap!(C)
julia> Cnew = resample(C,10.)

# quick tests 
julia> Cnew.fs < C.fs
true

julia> length(Cnew.x) < length(C.x)
true 

julia> Cnew.t == C.t
true # should be false

A quick fix would be adding C.t[2,1] = length(C.x) after

if size(C.t,1) == 2
nx_in = length(C.x)
nx_out = ceil(Int, nx_in*rate)
nz_out = inputlength(ff, nx_out)
if nz_out > length(Z)
append!(Z, zeros(ty, nz_out-length(Z)))
end
copyto!(Z, 1, C.x, 1, nx_in)
if nz_out > nx_in
Z[nx_in+1:nz_out] = zeros(ty, nz_out-nx_in)
end
n_out = outputlength(ff, nz_out)
ybuf = view(Y, 1 : n_out)
ny = filt!(ybuf, ff, Z[1:nz_out])
copyto!(C.x, 1, Y, 1, ny)
deleteat!(C.x, ny+1:nx_in)

and adding a test with a gapless SeisChannel. Happy to submit a PR on this, if needed.

32-bit OS support

Great to see all the progress with SeisIO!

I was wondering—are 32-bit platforms supported by SeisIO? Or are they explicitly not supported?

I ask because I am experimenting with using SeisIO for IO, and I think that 32-bit Windows builds fail because integers literals are Int32s on that platform, and there are lots of cases where type signatures for methods are restricted to Int64s in SeisIO. As integer literals are Ints, they are different between 64- and 32-bit platforms.

The particular failure which stops the build is here:

SLDefs(18000, # port::Int64

but I think that's just the first place where one of these is encountered.

If 32-bit Windows (and I presume Linux—I haven't tested that) is a target, then there may be quite a few places where either explicit conversion to Int64 from Int will be necessary when the methods are restricted, or signatures will need to be made less restrictive. The latter feels more Julian, but again you may have reasons to restrict types so strongly.

(Conversion to the correct type for typed fields of a (mutable) struct happens automatically by default, but I guess this is overridden for a reason in SeisIO since there are inner constructors which replace the default ones for SLDefs and FiltDefs.)

I haven't had any issues supporting 32-bit OSes before, so hopefully if this isn't something you planned to provide for, maybe it wouldn't be too big of an ask. Very happy to help.

Causal instrument response correction

I would like to implement the response deconvolution algorithm in this paper from Matt Haney et al. (2012) in BSSA. I was reading through the developer's guide on processing algorithms. This is a published algorithm and I will be translating directly from Matt's MATLAB code. This is an algorithm that ensures causality and has worked great for my purposes of signal correlations across a heterogeneous network of seismic stations. I am curious if this is of use for the SeisIO.jl package and if so, how should I go about adding this (keyword for "type" in remove_resp!). Should I add it to SeisIO.jl/src/Processing/Resp/0_resp_aux.jl?

resample! throws error when fs == S[1].fs

resample!(S::GphysData;chans::Union{Integer, UnitRange, Array{Int64,1}}=Int64[], fs::Float64=0.0) throws an error when the resampling frequency fs == minimum(S.fs[chans[S.fs[chans] .> 0.0]]). The default should probably be to return nothing as in resample!(C::GphysChannel, f0::Float64)

S = get_data("FDSN", "UW.LON..BHZ", src="IRIS",s="2019-01-01",t=600)
resample(S,fs=S[1].fs)
ERROR: frequencies must be less than the Nyquist frequency 1.0
Stacktrace:
 [1] normalize_freq at /home/timclements/.julia/packages/DSP/wwKNu/src/Filters/design.jl:241 [inlined]
 [2] #Lowpass#22 at /home/timclements/.julia/packages/DSP/wwKNu/src/Filters/design.jl:256 [inlined]
 [3] Type at /home/timclements/.julia/packages/DSP/wwKNu/src/Filters/design.jl:256 [inlined]
 [4] resample_filter(::Rational{Int64}, ::Float64, ::Int64) at /home/timclements/.julia/packages/DSP/wwKNu/src/Filters/design.jl:649
 [5] resample_filter at /home/timclements/.julia/packages/DSP/wwKNu/src/Filters/design.jl:630 [inlined]
 [6] mkresample(::Float32) at /home/timclements/.julia/packages/SeisIO/4Sap1/src/Processing/resample.jl:6
 [7] #resample!#158(::Array{Int64,1}, ::Float64, ::Function, ::SeisData) at /home/timclements/.julia/packages/SeisIO/4Sap1/src/Processing/resample.jl:61
 [8] #resample#159 at ./none:0 [inlined]
 [9] (::getfield(DSP.Filters, Symbol("#kw##resample")))(::NamedTuple{(:fs,),Tuple{Float64}}, ::typeof(resample), ::SeisData) at ./none:0
 [10] top-level scope at none:0

Avoid duplication in request body.

Hello jpjones,

I tried downloading data from New Zealand data server GEONET, and I found duplications in data query strings as below.


julia> get_data("FDSN", "NZ.NAAS.*.BN?", s="2016-05-20T01:14:25.07", t="2016-05-20T01:24:25.07", v=2, src="GEONET")
[ Info: 2019-06-10T22:12:23.160: Querying FDSN stations
Most compact request form = ["NZ" "NAAS" "*" "BN?" ""]
request url:http://service.geonet.org.nz/fdsnws/station/1/query
request body:
level=response
format=xml
 NZ NAAS * BN? 2016-05-20T01:14:25.07 2016-05-20T01:24:25.07

[ Info: 2019-06-10T22:12:24.644: Building list of channels
data query strings:
NZ NAAS 20 BN2
NZ NAAS 20 BN1
NZ NAAS 20 BNZ
NZ NAAS 20 BN2
NZ NAAS 20 BN1
NZ NAAS 20 BNZ
[ Info: 2019-06-10T22:12:24.652: Data query begins
request url: http://service.geonet.org.nz/fdsnws/dataselect/1/query
request body:
format=miniseed
NZ NAAS 20 BN2 2016-05-20T01:14:25.070000 2016-05-20T01:24:25.070000
NZ NAAS 20 BN1 2016-05-20T01:14:25.070000 2016-05-20T01:24:25.070000
NZ NAAS 20 BNZ 2016-05-20T01:14:25.070000 2016-05-20T01:24:25.070000
NZ NAAS 20 BN2 2016-05-20T01:14:25.070000 2016-05-20T01:24:25.070000
NZ NAAS 20 BN1 2016-05-20T01:14:25.070000 2016-05-20T01:24:25.070000
NZ NAAS 20 BNZ 2016-05-20T01:14:25.070000 2016-05-20T01:24:25.070000
NZ.NAAS.20.BN2: resized from length 0 to length 360000
NZ.NAAS.20.BN1: resized from length 0 to length 360000
NZ.NAAS.20.BNZ: resized from length 0 to length 360000
[ Info: 2019-06-10T22:12:37.211: Done FDSNget query.
[ Info: 2019-06-10T22:12:37.211: Removing empty channels.
SeisData with 3 channels (3 shown)
    ID: NZ.NAAS.20.BN2                     NZ.NAAS.20.BN1                     NZ.NAAS.20.BNZ
  NAME: Napier Airport                     Napier Airport                     Napier Airport
   LOC: -39.4687 N, 176.872 E, 2.0 m       -39.4687 N, 176.872 E, 2.0 m       -39.4687 N, 176.872 E, 2.0 m
    FS: 50.0                               50.0                               50.0
  GAIN: 1.01972e5                          1.01972e5                          1.01972e5
  RESP: c = 1.0, 0 zeros, 0 poles          c = 1.0, 0 zeros, 0 poles          c = 1.0, 0 zeros, 0 poles
 UNITS: m/s2                               m/s2                               m/s2
   SRC: http://service.geonet.org.nz/fdsn… http://service.geonet.org.nz/fdsn… http://service.geonet.org.nz/fdsn…
  MISC: 2 entries                          2 entries                          2 entries
 NOTES: 0 entries                          0 entries                          0 entries
     T: 2016-05-20T01:14:24.034 (0 gaps)   2016-05-20T01:14:20.871 (0 gaps)   2016-05-20T01:14:24.515 (0 gaps)
     X: -2.057e+03                         -2.413e+03                         -3.780e+02
        -2.057e+03                         -2.415e+03                         -3.710e+02
            ...                                ...                                ...
        -2.036e+03                         -2.375e+03                         -3.520e+02
        (nx = 61112)                       (nx = 60702)                       (nx = 60444)
     C: 0 open, 0 total

Julia>

I guess this is due to the duplication in StationXML downloaded from GEONET. This duplication causes an error when using lat-lon box request (due to limitation of request number of channels) as the number of request becomes much larger than actual number.

In addition, it sometimes causes an error as below:

┌ Warning: Error thrown:
│ URL: http://service.geonet.org.nz/fdsnws/dataselect/1/query
│ POST BODY:
│ format=miniseed
│ NZ CCCC 20 BN1 2018-05-20T00:42:04.570000 2018-05-20T00:52:04.570000
│ NZ CCCC 20 BN2 2018-05-20T00:42:04.570000 2018-05-20T00:52:04.570000
│ NZ CCCC 20 BNZ 2018-05-20T00:42:04.570000 2018-05-20T00:52:04.570000
│ NZ CCCC 20 BNZ 2018-05-20T00:42:04.570000 2018-05-20T00:52:04.570000
│ NZ CCCC 20 BN2 2018-05-20T00:42:04.570000 2018-05-20T00:52:04.570000
│ NZ CCCC 20 BN1 2018-05-20T00:42:04.570000 2018-05-20T00:52:04.570000
│
│ ERROR TYPE: HTTP.IOExtras.IOError
└ @ SeisIO ~/.julia/packages/SeisIO/mMCC6/src/Web/0_essentials.jl:58

So I would like to ask to modify get_data function to avoid this duplicated request.

Best,

Add SeisData into ASDF

Hello Josh,

Thank you for implementing write_hdf5() for output in ASDF format. I wonder if we could have an option to add SeisData into an existing ASDF file, like using fid = h5open(filename, "cw").

Cheers,
Kurama

read_data with mseed integrity check fails

Reading this mseed file prints integrity warnings:

RDMSEED: data integrity -- Steim-2 sequence #001194Q integrity check failed, last_data=2250.0, should be xn=2518.0

The file is written with Obspy. The first sample is the same with both readers:

SeisData with 1 channels (1 shown)
    ID: YA.SNE.00.HHZ                      
  NAME: YA.SNE.00.HHZ                      
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 100.0                              
  GAIN: 1.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC:                                    
  MISC: 0 entries                          
 NOTES: 0 entries                          
     T: 2009-12-28T10:56:04.968 (0 gaps)   
     X: +1.428e+04                         
        +1.420e+04                         
            ...                            
        -3.307e+03                         
        (nx = 4703504)                     
     C: 0 open, 0 total

S[1].x
4703504-element Array{Float32,1}:
 14278.0
 14199.0
 14089.0
       
 -3663.0
 -3450.0
 -3307.0
1 Trace(s) in Stream:
YA.SNE.00.HHZ | 2009-12-28T10:56:04.968300Z - 2009-12-28T23:59:59.998300Z | 100.0 Hz, 4703504 samples

st[0].data                                                                                                            
array([14278, 14426, 14453, ..., -3565, -3450, -3456], dtype=int32)

Converting the file to sac in obspy and then reading the sac file in SeisIO gives the same data as the mseed file read in obspy

S = read_data("/home/timclements/VOLC/SAC/YA.SNE.00.HHZ.2009-12-28.sac")
SeisData with 1 channels (1 shown)
    ID: YA.SNE..HHZ                        
  NAME:                                    
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 100.0                              
  GAIN: 1.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC: /home/timclements/VOLC/SAC/YA.SNE 
  MISC: 0 entries                          
 NOTES: 1 entries                          
     T: 2009-12-28T10:56:04.968 (0 gaps)   
     X: +1.428e+04                         
        +1.443e+04                         
            ...                            
        -3.456e+03                         
        (nx = 4703504)                     
     C: 0 open, 0 total

julia> S[1].x
4703504-element Array{Float32,1}:
 14278.0
 14426.0
 14453.0
       
 -3565.0
 -3450.0
 -3456.0

resample! errors on NodalData

Working on SeisIO#master with Julia 1.5.0, trying to resample some NodalData, which throws an error. Here is a MWE:

using SeisIO, SeisIO.Nodal 
ND = NodalData(rand(Float32,1000,10),Dict{String,Any}(),Int64[],0) # initialize from random matrix
ND.fs = ones(10) .* 1000. # set fs = 1000 Hz 
resample(ND,fs=200.) # resample to 200 Hz 
ERROR: MethodError: no method matching deleteat!(::SubArray{Float32,1,Array{Float32,2},Tuple{Base.Slice{Base.OneTo{Int64}},Int64},true}, ::UnitRange{Int64})
Closest candidates are:
  deleteat!(::SentinelArrays.MissingVector, ::Any) at /home/timclements/.julia/packages/SentinelArrays/Ubf17/src/missingvector.jl:51
  deleteat!(::BitArray{1}, ::UnitRange{Int64}) at bitarray.jl:942
  deleteat!(::BitArray{1}, ::Any) at bitarray.jl:966
  ...
Stacktrace:
 [1] cheap_resample!(::Array{Int64,2}, ::SubArray{Float32,1,Array{Float32,2},Tuple{Base.Slice{Base.OneTo{Int64}},Int64},true}, ::Float64, ::Float64) at /home/timclements/.julia/dev/SeisIO/src/Processing/resample.jl:31
 [2] resample!(::NodalData; chans::Array{Int64,1}, fs::Float64) at /home/timclements/.julia/dev/SeisIO/src/Processing/resample.jl:72
 [3] #resample#153 at /home/timclements/.julia/dev/SeisIO/src/Processing/resample.jl:99 [inlined]
 [4] top-level scope at REPL[38]:1

cheap_resample! is throwing an error when trying to delete a 1D view of a matrix.

I can write a new version of cheap_resample for 2D arrays. My solution is to overwrite the existing data column by column, then trim the excess rows in the case of downsampling (upsampling requires a vcat).

ungap! throws bounds error on mseed file with many negative time gaps

Originally posted by @tclements in #28 (comment)

One more particularly devious example. Here's an mseed file that has > 10 of negative time gaps. After merging, which works, ungap throws a bounds error.

S = read_data("mseed","CIRIO__BHE___2017101.mseed")
SeisData with 1 channels (1 shown)
    ID: CI.RIO..BHE                        
  NAME: CI.RIO..BHE                        
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 40.0                               
  GAIN: 1.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC:                                    
  MISC: 0 entries                          
 NOTES: 0 entries                          
     T: 2017-04-11T00:00:00.020 (14 gaps)  # note 14 gaps 
     X: -5.600e+01                         
        -6.530e+02                         
            ...                            
        -5.850e+02                         
        (nx = 3457836)                     
     C: 0 open, 0 total

S has 14 gaps. Then merge the seisdata

merge!(S)
S
SeisData with 1 channels (1 shown)
    ID: CI.RIO..BHE                        
  NAME: CI.RIO..BHE                        
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 40.0                               
  GAIN: 1.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC:                                    
  MISC: 0 entries                          
 NOTES: 1 entries                          
     T: 2017-04-11T00:00:00.020 (12 gaps)  # note 12 gaps 
     X: -5.600e+01                         
        -6.530e+02                         
            ...                            
        -5.850e+02                         
        (nx = 3456006)                     
     C: 0 open, 0 total

S now has 12 gaps. Now try to ungap

ungap!(S1)
ERROR: BoundsError

which throws a bounds error. For reference, obspy reads 15 overlapping traces but successfully merges and ungaps.

In [1]: import obspy                                                                                 

In [2]: st = obspy.read("CIRIO__BHE___2017101.ms")                                                   

In [3]: st                                                                                           
Out[3]: 
15 Trace(s) in Stream:
CI.RIO..BHE | 2017-04-11T00:00:00.019500Z - 2017-04-11T18:38:23.219500Z | 40.0 Hz, 2684129 samples
CI.RIO..BHE | 2017-04-11T18:38:18.095038Z - 2017-04-11T18:38:28.395038Z | 40.0 Hz, 413 samples
CI.RIO..BHE | 2017-04-11T18:38:23.245038Z - 2017-04-11T18:38:33.520038Z | 40.0 Hz, 412 samples
CI.RIO..BHE | 2017-04-11T18:38:28.420038Z - 2017-04-11T18:38:33.545038Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:33.544538Z - 2017-04-11T18:38:38.669538Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:33.570038Z - 2017-04-11T18:38:38.695038Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:38.694538Z - 2017-04-11T18:38:43.819538Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:38.720038Z - 2017-04-11T18:38:43.845038Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:43.844538Z - 2017-04-11T18:38:48.969538Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:43.870038Z - 2017-04-11T18:38:48.995038Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:48.994538Z - 2017-04-11T18:38:54.119538Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:49.020038Z - 2017-04-11T18:38:59.320038Z | 40.0 Hz, 413 samples
CI.RIO..BHE | 2017-04-11T18:38:54.594538Z - 2017-04-11T18:38:59.719538Z | 40.0 Hz, 206 samples
CI.RIO..BHE | 2017-04-11T18:38:59.345038Z - 2017-04-11T18:39:04.420038Z | 40.0 Hz, 204 samples
CI.RIO..BHE | 2017-04-11T18:38:59.744538Z - 2017-04-11T23:59:59.994538Z | 40.0 Hz, 770411 samples

In [4]: st.merge()                                                                                   
Out[4]: 
1 Trace(s) in Stream:
CI.RIO..BHE | 2017-04-11T00:00:00.019500Z - 2017-04-11T23:59:59.994500Z | 40.0 Hz, 3456000 samples

This seems like a pretty rare problem. This is the only day in 20 years of data for this one station I've had an issue with after the latest update.

merge! between SeisData, SeisChannel and SeisEvent, EventTraceData, EventChannel

Starting a discussion on merging SeisData and SeisChanel to SeisEvent, EventTraceData and EventChannel in the Quake module. For the dataset with which I'm working, EQMag, EQLoc and SeisPha are stored separately from the seismic traces.

The workflow I'm currently using for merging SeisEvent with phase, location, and magnitude information and trace data

  1. Populate an EQLoc
  2. Populate an EQMag
  3. Create an empty EventTraceData
  4. Fill EventTraceData with EventChannels
  5. Populate a SeisHdr with EQLoc and EQMag
  6. Populate a SeisSrc
  7. Populate SeisEvent with SeisHdr, SeisSrc and EventTraceData
  8. Read waveform data into SeisData
  9. Merge .x, .t, .fs, .gain channels in SeisChannel into SeisEvent.data.EventChannel

Conversion from SeisData to EventTraceData currently works

julia> EventTraceData(SeisData())
EventTraceData with 0 channels (0 shown)
...

but conversion from SeisChannel to EventChannel is not yet implemented.

julia> EventChannel(SeisChannel())
ERROR: MethodError: no method matching EventChannel(::SeisChannel)

It would be nice to have a merge! function for SeisChannel and EventChannel which checks if each data field for common channels is empty. e.g. the SeisChannel will have non-empty .fs,.t and .x fields and the EventChannel will have non-empty .loc, .baz, .dist and possible .loc.

merge! with SeisData and EventTraceData could work similarly.

I'm working on a solution right now but happy to discuss if these additions are helpful/needed.

Overwriting when reading StationXML

I'm using stationXML files that have ~20 years of data and over 100 channels for each station. The channel responses change throughout the years due to new instruments and/or changes in gain, etc.. It looks like stationXML.jl is overwriting with the latest channel information. This could lead to the wrong (latest) instrument response being removed from the data.

This is also printing thousands of lines to the terminal..

Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..ACE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..BHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..HNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCL: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LNZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..LOG: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..OCF: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCO: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VCQ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEA: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEC: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VEP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VFP: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHE: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHN: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VHZ: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VKI: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMU: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMV: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342
┌ Warning: Redundant channel CI.YUH2..VMW: overwriting with latest channel info.
└ @ SeisIO ~/.julia/packages/SeisIO/MktKb/src/Utils/stationXML.jl:342

Read SEGY into NodalData?

As of now, SeisIO reads SEGY files into SeisData. If the file format is non-standard, read_data returns a SeisData with a single SeisChannel with a gap between each channel.

DAS datasets are regularly saved in SEGY format. For instance, here is some DAS data stored as SEGY from the FORGE experiment. Reading this with SeisIO#dev

using SeisIO
read_data("segy","FORGE_78-32_iDASv3-P11_UTC190428134938.sgy")
SeisData with 1 channels (1 shown)
    ID: .0..YYY                            
  NAME: .0..YYY                            
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 2000.0                             
  GAIN: 0.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC: /home/timclements/Downloads/FORGE 
  MISC: 0 entries                          
 NOTES: 1 entries                          
     T: 2019-04-28T13:38:38 (1279 gaps)    
     X: +0.000e+00                         
        +0.000e+00                         
            ...                            
        -2.630e+03                         
        (nx = 38400000)                    
     C: 0 open, 0 total

returns one channel with 1279 gaps.

I see two options here:

  1. return a NodalData when reading SEGY files with read_data
  2. move SEGY reading to read_nodal only

I don't like Option 1 because then read_data has two possible outputs.

Option 2 seems better going forward but is a breaking change.

Expand NodalLoc to have x, y, & z positions

As of now, the NodalLoc has only an x position. For 2D and 3D nodal and DAS (horizontal + vertical) arrays, it would be helpful to have x, y, and z positions for 2D and 3D distance calculations. For instance, here is the geometry for the Brady Hot Springs geothermal DAS array:

image

Adding y and z to NodalLoc may add some overlap between NodalLoc and UTMLoc/XYLoc but NodalData already has fields for ox, oy and oz.

I can submit a very simple PR with tests on this.

Error in opening SeisData object after recent update of SeisIO

After updating SeisIO to the latest version (to use the functionality of removing responses), I can't open my old SeisData object stored in jld2 file. It seems there is some compatibility issue after the new update. Here are the errors:

`┌ Warning: saved type PZResp is missing field a0 in workspace type; reconstructing
└ @ JLD2 ~/.julia/packages/JLD2/KjBIK/src/data.jl:402

ERROR: MethodError: Cannot convert an object of type getfield(JLD2.ReconstructedTypes, Symbol("##PZResp#363")) to an object of type InstrumentResponse
Closest candidates are:
convert(::Type{T}, ::T) where T at essentials.jl:154

Stacktrace:
[1] jlconvert at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/data.jl:675 [inlined]
[2] macro expansion at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/dataio.jl:70 [inlined]
[3] macro expansion at ./simdloop.jl:73 [inlined]
[4] read_array!(::Array{InstrumentResponse,1}, ::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.ReadRepresentation{InstrumentResponse,JLD2.RelOffset}) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/dataio.jl:68
[5] read_array(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.ReadDataspace, ::JLD2.ReadRepresentation{InstrumentResponse,JLD2.RelOffset}, ::Int64, ::UInt16, ::JLD2.RelOffset, ::Array{JLD2.ReadAttribute,1}) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datasets.jl:323
[6] read_data(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.ReadRepresentation{Any,JLD2.RelOffset}, ::Array{JLD2.ReadAttribute,1}) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datasets.jl:198
[7] macro expansion at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datasets.jl:156 [inlined]
[8] macro expansion at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datatypes.jl:76 [inlined]
[9] read_data(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.ReadDataspace, ::UInt8, ::Int64, ::Int64, ::Int64, ::UInt16, ::JLD2.RelOffset, ::Array{JLD2.ReadAttribute,1}) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datasets.jl:152
[10] load_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.RelOffset) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datasets.jl:92
[11] jlconvert at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/data.jl:674 [inlined]
[12] macro expansion at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/data.jl:1285 [inlined]
[13] jlconvert(::JLD2.ReadRepresentation{SeisData,JLD2.OnDiskRepresentation{(0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104),Tuple{Int64,Array{String,1},Array{String,1},Array{InstrumentPosition,1},Array{Float64,1},Array{Float64,1},Array{InstrumentResponse,1},Array{String,1},Array{String,1},Array{Dict{String,Any},1},Array{Array{String,1},1},Array{Array{Int64,2},1},Array{Union{Array{Float32,1}, Array{Float64,1}},1},Array{Sockets.TCPSocket,1}},Tuple{Int64,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset}}()}, ::JLD2.JLDFile{JLD2.MmapIO}, ::Ptr{Nothing}, ::JLD2.RelOffset) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/data.jl:1232
[14] read_data(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.ReadRepresentation{SeisData,JLD2.OnDiskRepresentation{(0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104),Tuple{Int64,Array{String,1},Array{String,1},Array{InstrumentPosition,1},Array{Float64,1},Array{Float64,1},Array{InstrumentResponse,1},Array{String,1},Array{String,1},Array{Dict{String,Any},1},Array{Array{String,1},1},Array{Array{Int64,2},1},Array{Union{Array{Float32,1}, Array{Float64,1}},1},Array{Sockets.TCPSocket,1}},Tuple{Int64,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset}}()}, ::Array{JLD2.ReadAttribute,1}) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/dataio.jl:37
[15] read_data(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.ReadDataspace, ::UInt8, ::Int64, ::Int64, ::Int64, ::UInt16, ::JLD2.RelOffset, ::Array{JLD2.ReadAttribute,1}) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datasets.jl:149
[16] load_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.RelOffset) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/datasets.jl:92
[17] getindex(::JLD2.Group{JLD2.JLDFile{JLD2.MmapIO}}, ::String) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/groups.jl:108
[18] getindex(::JLD2.JLDFile{JLD2.MmapIO}, ::String) at /Users/xiaotaoyang/.julia/packages/JLD2/KjBIK/src/JLD2.jl:330
[19] top-level scope at none:0
`

You can recreate the errors with the following lines:

using SeisIO, JLD2
f=jldopen("cascadiaRMEQtestdatawithgap.jld2")
S=f["2011.314/7D.J34A..HHZ"]

Here I attached the data file for your test.
cascadiaRMEQtestdatawithgap.jld2.zip

Thanks,
Xiaotao

Differences in PZResp and MulitStageResponse

I don't think there is an error/bug anymore. Once I started looking at things correctly and paying a little more attention. Here is a minimum working example.

using SeisIO

S1 = get_data("FDSN", "TA.I02A..BHZ", src="IRIS", s=string("2007-04-16"), t=600, msr=true)
print(S1.resp[1].stage[1],"\n")

S2 = get_data("FDSN", "TA.I02A..BHZ", src="IRIS", s=string("2007-04-16"), t=600)
print(S2.resp)

Here is the output:

PZResp64 with fields:
a0: 3.48462e17
f0: 0.2
p: Complex{Float64}[-13300.0 + 0.0im, -10530.0 + 10050.0im, -10530.0 - 10050.0im, -520.3 + 0.0im, -374.8 + 0.0im, -97.34 + 400.7im, -97.34 - 400.7im, -15.64 + 0.0im, -0.037 + 0.037im, -0.037 - 0.037im, -255.1 + 0.0im]
z: Complex{Float64}[0.0 + 0.0im, 0.0 + 0.0im, -463.1 + 430.5im, -463.1 - 430.5im, -176.6 + 0.0im, -15.15 + 0.0im]

InstrumentResponse[PZResp with fields:
a0: 3.48462e17
f0: 0.2
p: Complex{Float32}[-13300.0f0 + 0.0f0im, -10530.0f0 + 10050.0f0im, -10530.0f0 - 10050.0f0im, -520.3f0 + 0.0f0im, -374.8f0 + 0.0f0im, -97.34f0 + 400.7f0im, -97.34f0 - 400.7f0im, -15.64f0 + 0.0f0im, -0.037f0 + 0.037f0im, -0.037f0 - 0.037f0im, -255.1f0 + 0.0f0im]
z: Complex{Float32}[0.0f0 + 0.0f0im, 0.0f0 + 0.0f0im, -463.1f0 + 430.5f0im, -463.1f0 - 430.5f0im, -176.6f0 + 0.0f0im, -15.15f0 + 0.0f0im]
]

The difference is that the MSR is a 64 bit float, while the normal PZResp is 32 bit. I see now after digging deeper into the first stage of the MSR that it even says it is PZResp64 and not a PZResp.

Sorry to bother you will this. Not sure if it causes problems down the line in SeisNoise though.

Merging SeisIO.jl and Seis.jl

Hello JP Jones.
We are a team trying to build similar tools for ambient noise correlation work. With Andy Nowacki (https://github.com/anowacki) we are trying to build a module that is similar to Obspy but for Julia. Both his Seis and SeisRequests and your SeisIO modules have functionalities that we are interested in, namely:

  • SeisRequests.jl can handle wildcards and removing instrumental response, has nice functionalities to download from multiple servers.
  • SeisIO has nice data structure, good downloading, and great read/writes of format.

Is there any chance we could chat with you about importing some of the functionality from your module into Seis.jl (https://github.com/anowacki/Seis.jl)? happy to make one module that accommodates all needs. We are also developing HDF5/ASDF formats.

Cheers,
Marine

readmseed can't handle blank space after SEED blockettes

(Continued from anowacki/Seis.jl#3.)

I get the following error when trying to read the sample miniSEED file distributed with PASSCAL's libmseed library:

julia> import Seis

julia> cd(dirname(pathof(Seis)))

julia> import SeisIO; SeisIO.readmseed("test/test_data/test.mseed")
[ Info: Recompiling stale cache file /Users/nowacki/.julia/compiled/v1.1/SeisIO/sUMCG.ji for SeisIO [e2f1b5a8-5fbb-5d5d-94aa-e39813b81559]
ERROR: No support for Blockette Type 0
Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] parserec!(::SeisIO.SeisData, ::IOStream, ::Int64) at /Users/nowacki/.julia/dev/SeisIO/src/Formats/mSEED.jl:233
 [3] parsemseed!(::SeisIO.SeisData, ::IOStream, ::Int64) at /Users/nowacki/.julia/dev/SeisIO/src/Formats/mSEED.jl:392
 [4] #readmseed#193(::Bool, ::Int64, ::Function, ::String) at /Users/nowacki/.julia/dev/SeisIO/src/Formats/mSEED.jl:437
 [5] readmseed(::String) at /Users/nowacki/.julia/dev/SeisIO/src/Formats/mSEED.jl:428
 [6] top-level scope at none:0

I am on commit 3b3a0ad, having deved SeisIO:

julia> cd(dirname(pathof(SeisIO)))

shell> git show
commit 3b3a0ad05383f4ba73b278054f1a48198936b549 (HEAD -> master, tag: v0.1.2, origin/master, cache/heads/master)
Author: Joshua Jones <--->
Date:   Wed Feb 13 02:31:42 2019 -0800

    update README.md

[...]

Julia info:

julia> versioninfo()
Julia Version 1.1.0
Commit 80516ca202 (2019-01-21 21:24 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin14.5.0)
  CPU: Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, ivybridge)
Environment:
  JULIA_EDITOR = mate -w

For reference, SAC and ObsPy read the file without any problem.

ungap! causes segmentation fault

This is a similar issue to #29. With this file, read_data and merge! work well

S = read_data("mseed","CIRIO__BHZ___2017261.ms")
SeisData with 1 channels (1 shown)
    ID: CI.RIO..BHZ                        
  NAME: CI.RIO..BHZ                        
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 40.0                               
  GAIN: 1.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC:                                    
  MISC: 0 entries                          
 NOTES: 0 entries                          
     T: 2017-09-18T00:00:00.020 (34 gaps)  
     X: -3.640e+02                         
        +3.700e+01                         
            ...                            
        +1.703e+03                         
        (nx = 3459296)                     
     C: 0 open, 0 total

merge!(S)
S
SeisData with 1 channels (1 shown)
    ID: CI.RIO..BHZ                        
  NAME: CI.RIO..BHZ                        
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 40.0                               
  GAIN: 1.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC:                                    
  MISC: 0 entries                          
 NOTES: 1 entries                          
     T: 2017-09-18T00:00:00.020 (4 gaps)   
     X: -3.640e+02                         
        +3.700e+01                         
            ...                            
        +1.703e+03                         
        (nx = 3455964)                     
     C: 0 open, 0 total

When calling ungap!(S) I get a segmenation fault

double free or corruption (!prev)

signal (6): Aborted
in expression starting at REPL[14]:1

Testing ungap!(S) on a different machine gives a different seg fault

malloc_consolidate(): invalid chunk size

signal (6): Aborted
in expression starting at REPL[18]:1

I believe the seg fault is happening in the resize! line at the end of gapfill!.

error in "mSEED.jl":428

The command "search" is no longer supported, and it returns error calling the function:
"mSEED.jl" at line 428.

This line has to be replaced with the following line:
(findfirst(isequal(read(fid, Char)), "DRMQ") > 0) || error("Scan failed due to invalid file type")

Move NodalData :data field to AbstractArray for GPU compatiblity

Thinking about our move to the GPU, the :data field of the NodalData struct will need to be of type AbstractArray{Float32, 2} to allow for transfer of data from CPU <-> GPU with Adapt.jl because:

julia> using CUDA

julia> CuArray <: AbstractArray
true

julia> CuArray <: Array
false

I think the :x field will work as is because FloatArray is Union{AbstractArray{Float32,1}, AbstractArray{Float64,1}} and views work the same on the CPU and GPU though using :x on the GPU will be quite inefficient:

julia> using CUDA, SeisIO

julia> mutable struct TEST
    x::Array{SeisIO.FloatArray,1}
end

julia> A = [CUDA.rand(3) for _ = 1:2]
2-element Array{CuArray{Float32,1},1}:
 Float32[0.95912075, 0.19107753, 0.60729915]
 Float32[0.81118095, 0.5209754, 0.29273564]

julia> t = TEST(A)
TEST(Union{AbstractArray{Float32,1}, AbstractArray{Float64,1}}[Float32[0.95912075, 0.19107753, 0.60729915], Float32[0.81118095, 0.5209754, 0.29273564]])

julia> t.x
2-element Array{Union{AbstractArray{Float32,1}, AbstractArray{Float64,1}},1}:
 Float32[0.95912075, 0.19107753, 0.60729915]
 Float32[0.81118095, 0.5209754, 0.29273564]

julia> t.x[1]
3-element CuArray{Float32,1}:
 0.95912075
 0.19107753
 0.60729915

FDSNEvq does not return catalogs

Hi,

I am trying to download the earthquake catalog from SoCal. Here is what i do:
using SeisIO.Quake
S = FDSNevq("2018-06-01",reg=[32.0,38.0,-120.0,-115.0,-50.0,50.0],mag=[2.0,8.0],evw=[0.,375243600.0],src="USGS")

It only returns one event (the same even for multiple arguments i entered):
(SeisHdr[ ID: quakeml
INT: 0
LOC: 33.4932 N, -116.49 E, 14.07 km
MAG: ml 2.01 (g 0.0°, n 73)
OT: 2018-06-02T20:45:04.18
SRC:
TYP: earthquake
MISC: 1 items
NOTES: 0 entries
], SeisSrc[m₀ = 0.0; S = Float64[]; NP = Array{Float64}(0,0); PAX = Array{Float64}(0,0)])
It also does not like the SCEDC server, although I know it is listed there:
julia> S = FDSNevq("2018-06-01",reg=[32.0,38.0,-120.0,-115.0,-50.0,50.0],mag=[2.0,8.0],evw=[0.,375243600.0],src="SCEDC")
┌ Warning: Request failed
│ FDSN event query:
│ RESPONSE = 500 (Internal Server Error)

│ HTTP response is in misc["data"]
└ @ SeisIO ~/.julia/packages/SeisIO/UXhdy/src/Web/0_essentials.jl:16
┌ Warning: Catalog only contains 0 events (original request was 1)
└ @ SeisIO.Quake ~/.julia/packages/SeisIO/UXhdy/src/Quake/Web/FDSN.jl:99
(SeisHdr[], SeisSrc[])

Possible performance improvement for t_expand and t_collapse

Running sync is a slight performance bottleneck. For instance read_data with 20 Hz data takes less than 1 ms and 6 MB

@btime S = read_data("sac",files[1])
  883.761 μs (107 allocations: 6.60 MiB)

while sync on the same file (after merging, ungapping) is more time and memory intensive

@btime sync(S,s=starttime,t=endtime)
  20.251 ms (261 allocations: 76.47 MiB)

Much of this time and memory is spent in t_expand and t_collapse

@btime t = SeisIO.t_expand(S.t[1], S.fs[1])  
4.852 ms (18 allocations: 26.37 MiB)

@btime SeisIO.t_collapse(t, S.fs[1])
  6.903 ms (48 allocations: 39.76 MiB)

For channels without gaps, it could be more efficient to use a range rather than array in t_expand

@btime t_range = range(S[i].t[1,2], stop= S[i].t[1,2] + dt * (S[i].t[2,1]-1),length=S[i].t[2,1])
  5.554 μs (66 allocations: 5.11 KiB)

Here's a check that the two methods return the same representation

dt = round(Int64, 1.0/(S[1].fs*μs))
t_range = range(S[i].t[1,2], stop= S[i].t[1,2] + dt * (S[i].t[2,1]-1),length=S[i].t[2,1])
t = SeisIO.t_expand(S.t[1], S.fs[1])
all(t .== t_range)
true

This change would give different types of output for data with and without gaps, though it looks like t_collapse is only used in sync.jl while t_expand is in sync.jl and SAC.jl (but the Float32.(μs*(t_expand(t, fs) .- ts)) line will create an Array if the input is a range or an array).

This could be a simple change with multiple-dispatch handling the discrepancy between the array and range. Thoughts?

issue reading an mseed file

Hi Josh,

I have an issue reading an mseed file. The file is located here.
A note that seems to matter: I wrote these files in obspy after reading a binary C++ format. When I print the trace in obspy, it returns correct values. Thus I do not have a problem reading it in obspyv1.1.1

Here is my attempt after 'using SeisIO'

(v1.2) pkg> st
Status ~/.julia/environments/v1.2/Project.toml
[1c724243] AWSS3 v0.6.8
[336ed68f] CSV v0.5.20
[a93c6f00] DataFrames v0.20.0
[5752ebe1] GMT v0.16.0
[91a5bcdd] Plots v0.29.1
[d330b81b] PyPlot v2.8.2
[b372bb87] SeisIO v1.0.0
[8cc7c3c0] SeisNoise v0.3.1 #master (https://github.com/tclements/SeisNoise.jl.git)

(v1.2) pkg> ^C

julia> S=read_data("miniseed","/Users/marinedenolle/NODES/continuous_waveforms/2018/2018_204/NO201__EHE__2018204.ms")
"/Users/marinedenolle/NODES/continuous_waveforms/2018/2018_204/NO201__EHE__2018204.ms"

julia> S[1].x
SeisData with 1 channels (1 shown)
ID: NO.201.--.EHE
NAME: NO.201.--.EHE
LOC: 0.0 N, 0.0 E, 0.0 m
FS: 100.0
GAIN: 1.0
RESP: a0 1.0, f0 1.0, 0z, 0p
UNITS:
SRC: /Users/marinedenolle/NODES/contin…
MISC: 0 entries
NOTES: 1 entries
T: 2018-07-23T00:00:00 (0 gaps)
X: +0.000e+00
+4.628e-41
...
+0.000e+00
(nx = 8640001)
C: 0 open, 0 total

julia> S[1].x[1]
8640001-element Array{Float32,1}:
0.0
4.6275e-41
0.0
4.6275e-41
-1.3954251e35
0.0
4.6096e-41
0.0
4.6096e-41
5.0639263e-12
1.720927e-30
4.6275e-41
...

Kurama Okubo tried it as well.

  1. read_data(“mseed”, filename); failed even if changing options for read_data()
    using obspy, st=read(filename); succeeded.
  2. convert using obspy from mseed to mseed: st=read(filename); st.write(“test.mseed”, format=“MSEED”), then reading “test.mseed” with SeisIO; failed
  3. convert using obspy from mseed to sac: st=read(filename); st.write(“test.sac”, format=“sac”), then reading “test.sac” with SeisIO; succeeded.
  4. convert again using obspy from sac to mseed: st=read(“test.sac”); st.write(“test2.mseed”, format=“mseed”), then reading “test2.mseed” with SeisIO; succeeded, but somehow reading speed is extremely slow.

Let me know if you have an idea on the bug.
Cheers,
Marine

S.loc = [-90.0, 0.0, 9300.0, 0.0, 0.0] got error

Hi Joshua,
Thanks for sharing the package. It is convenient.

But I got the following error following the tutorial:
MethodError: Cannot convert an object of type Array{Float64,1} to an object of type InstrumentPosition

Is there something missing.

I am using SeisIO 1.0 in Mac.

Regards,

Zhouchuan

writesac writes incorrect time

Here is a SeisData that starts at 00:48:59.84

S = read_data("sac",files[ii])
SeisData with 1 channels (1 shown)
    ID: BP.SCYB..BP1                       
  NAME:                                    
   LOC: 36.0094 N, -120.537 E, 695.0 m     
    FS: 20.0                               
  GAIN: 7.13026e10                         
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC: /home/timclements/BPtest/SAC/2004 
  MISC: 0 entries                          
 NOTES: 1 entries                          
     T: 2004-01-01T00:48:59.084 (0 gaps)   
     X: -5.628e+03                         
        -5.624e+03                         
            ...                            
        -5.404e+03                         
        (nx = 1209785)                     
     C: 0 open, 0 total

S[1].t
2×2 Array{Int64,2}:
       1  1072918139083600
 1209785                 0

If I then use writesac and read the new file, the new timing is off by a millisecond:

writesac(S)
Snew = read_data("sac","2004.001.00.48.59.084.BP.SCYB..BP1.R.SAC")
SeisData with 1 channels (1 shown)
    ID: BP.SCYB..BP1                       
  NAME:                                    
   LOC: 36.0094 N, -120.537 E, 695.0 m     
    FS: 20.0                               
  GAIN: 7.13026e10                         
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC: 2004.001.00.48.59.084.BP.SCYB..BP 
  MISC: 0 entries                          
 NOTES: 1 entries                          
     T: 2004-01-01T00:48:59.085 (0 gaps)   
     X: -5.628e+03                         
        -5.624e+03                         
            ...                            
        -5.404e+03                         
        (nx = 1209785)                     
     C: 0 open, 0 total
Snew[1].t
2×2 Array{Int64,2}:
       1  1072918139084600
 1209785                 0

The snippet string(u2d(ts*μs)) in the fill_sac function (line 47 of SAC.jl) rounds to the nearest millisecond. The regular expression then pulls the rounded millisecond value. In the above case, this leads to a 1 millisecond offset.

Getting the time using string leads to a problem when the channel (or a gap) starts at a time with less than 3 significant millisecond digits (e.g. 100 or 250 milliseconds). Here is an example where I change the start time to 48:59.1 :

S[1].t[1,2] = 1072918139100000 #round to nearest time on sampling rate (0.1s)
ts = S[1].t[1,2]
μs = 1e-6
split(string(u2d(ts*μs)), r"[\.\:T\-]") # from fill_sac
7-element Array{SubString{String},1}:
 "2004"
 "01"  
 "01"  
 "00"  
 "48"  
 "59"  
 "1" 

Note that the 7th element in the Array is 1 instead of 100.

If I now write the S with the starttime changed to 00:48:59.1, then read

Snew2 = read_data("sac","2004.001.00.48.59.001.BP.SCYB..BP1.R.SAC")
SeisData with 1 channels (1 shown)
    ID: BP.SCYB..BP1                       
  NAME:                                    
   LOC: 36.0094 N, -120.537 E, 695.0 m     
    FS: 20.0                               
  GAIN: 7.13026e10                         
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC: 2004.001.00.48.59.001.BP.SCYB..BP 
  MISC: 0 entries                          
 NOTES: 1 entries                          
     T: 2004-01-01T00:48:59.001 (0 gaps)   
     X: -5.628e+03                         
        -5.624e+03                         
            ...                            
        -5.404e+03                         
        (nx = 1209785)                     
     C: 0 open, 0 total

The new file starts at 00:48:59.001. I think the only change needed here is getting the floor of the milliseconds in the start time with something in fill_sac similar to tt[7] = Millisecond(u2d(floor(ts/1000)/1000)).value after line 49 in SAC.jl.

Parsing ASCII to an existing SeisData structure doesn't match on channel ID

Parsing ASCII data formats to an existing SeisData structure doesn't try to match channel ID when a new channel begins. Thus, a new new data segment is (wrongly) created for each channel in each file or stream.

Bugs Caused

get_data() errors when the following conditions are met:

  • format is ASCII (fmt in ["geocsv", "geocsv.tspair", "geocsv.slist"])
  • request is multi-day (t-s > Day(1))

Status

Fix planned for 0.5.0

MSEED from IRIS directly dumped to disk have strange amplitude

Hi! I recently noticed that when I ran the following command:

stream = get_data("IRIS", "CI.SVD..BHZ", s=DateTime("2007-01-01"), t=3600, w=true, v=1, rr=false, unscale=false)

The resulting stream has amplitudes in the range of 10^-6 rather than 10^3 or so as I would expect. Using the old fetchdata scripts (https://seiscode.iris.washington.edu/projects/ws-fetch-scripts/wiki) from IRIS returns miniseeds with correct amplitude so I am wondering if this issue can be fixed within SeisIO. Happy to provide more info, I am running SeisIO v1.1.0 on different ubuntu versions. Thanks for any help with the issue.

Parallel SeisIO: the shape of things to come

This Issue is a dedicated thread for discussing plans to parallelize parts of SeisIO for multiple CPU workers. GPU computing plans will be discussed in another thread (maybe much) later.

Existing

  • The SeedLink client already works in parallel (and has since its inception in 2016). It's a backgrounded process that uses @async. If I had any indication that anyone but me was using it, I'd modify it so that one could process channels as new data arrived without processing each channel twice; that would facilitate "streaming" work flows.

Ongoing/Planned

  • As mentioned in the paper, SeisDownload.jl by @kura-okubo is being incorporated into SeisIO core. This will affect get_data.

Possibilities

  • Parallel HDF read support: simple in concept. Add a Boolean flag to h5open and fork read to workers; spawn a SeisChannel on each CPU; process data on each CPU separately.
    • Requires a Boolean flag or separate read function; not everyone wants or benefits from this work flow.
    • Will require added code for parallel processing on multiple CPUs. See below!
    • Open question: how to optimize the tradeoff between transfer time among CPUs and processing time? Can we adaptively determine when this is advantageous? @tclements and @kura-okubo are working on similar computing problems already in their respective packages and a general solution for SeisIO would likely resemble theirs.
    • HDF5.jl doesn't support parallel write at present. This is no problem for me, but it's why I only mention read operations.
  • Fourier transforms
    • Setting threads or workers for FFTW improves FFT speed for long sequences but slows it for short ones. The crossover is the point at which transfer time between CPUs exceeds the single-CPU FFT speed (due to N log N scaling); an exact value depends on hardware configuration and number of channels.
    • Might be advantageous to do as @tclements does in SeisNoise.jl and adaptively break sequences into segments, but doing so in SeisIO core will mean splitting SeisData objects by channel and segment (as now), then further splitting and forking by subsegment. Is this a good idea? I honestly can't tell.
  • Parallel processing
    • Likely a significant speedup to parallelize and concatenate Fourier-based processing operations (bandpass, instrument response, etc.) so that computational costs of FFT and iFFT are only applied once each per segment.
    • This would change workflow for users, but might prove less heinous when one needs multiple FFT-based processing operations (e.g. instrument response, then filtering, then correlation).
  • Parallel read of legacy file formats designed to hold data from multiple channels (SEED, SUDS, UW) might lead to improvement but I haven't thought about this for non-HDF5 file formats. In particular, a parallel SEED reader/converter is something everyone would benefit from, at least in theory. In practice, I don't know if one can be written in an optimized way, because SEED volumes have no byte index to packets (a fundamental oversight on the part of SEED's creators).

Of Limited Use

  • Parallel read of single-channel, one-segment files (PASSCAL, SAC). I've tried this before: look for the batch_read function in my old commits. In Julia 0.5 it was a significant speedup. Once single-CPU file read became well-optimized, the speedup was <20%; but memory overhead can't be reduced below 100%.

Input Requested

  1. Am I missing anything that you think will benefit from parallelization? If so, what? Please tell me.
  2. Is there additional functionality that you'd like to see in SeisIO that you think would work better in parallel?

issue with get_data()

Hello jpjones76,

I found an error when using SeisIO.get_data. When downloading a specific channel, it returns unknown error message, which is not simply like 'no data found' or 'Document is empty'.
I would like to ask if this is an error associated with SeisIO or server error.

script

using SeisIO

get_data("FDSN", "TA.353A..LHZ", s="2012-08-20T12:00:00", t = t, src="IRIS", v=1) # this works
get_data("FDSN", "TA.355A..LHZ", s="2012-08-20T12:00:00", t = t, src="IRIS", v=1) # this does not work

error message

julia> get_data("FDSN", "TA.355A..LHZ", s="2012-08-20T12:00:00", t = t, src="IRIS", v=1)
[ Info: 2019-08-22T16:48:11.050: Querying FDSN stations
[ Info: 2019-08-22T16:48:11.357: Building list of channels
[ Info: 2019-08-22T16:48:11.361: Data query begins
ERROR: MethodError: no method matching read(::Base.GenericIOBuffer{Array{UInt8,1}}, ::Int64; all=false)
Closest candidates are:
read(::Base.GenericIOBuffer, ::Integer) at iobuffer.jl:461 got unsupported keyword argument "all"
read(::IO, ::Integer) at io.jl:827 got unsupported keyword argument "all"
read(::IOStream, ::Integer; all) at iostream.jl:512
...
Stacktrace:
[1] blk_201(::SeisData, ::Base.GenericIOBuffer{Array{UInt8,1}}, ::Int64) at ~/.julia/dev/SeisIO/src/Formats/SEED/1_mSEEDblk.jl:42
[2] parserec!(::SeisData, ::SeisIO.SeisIOBuf, ::Base.GenericIOBuffer{Array{UInt8,1}}, ::Int64, ::Int64, ::Int64) at ~/.julia/dev/SeisIO/src/Formats/SEED/2_parserec.jl:190
[3] parsemseed!(::SeisData, ::Base.GenericIOBuffer{Array{UInt8,1}}, ::Int64, ::Int64, ::Int64) at ~/.julia/dev/SeisIO/src/Formats/SEED/readmseed.jl:13
[4] #FDSNget!#172(::String, ::Int64, ::String, ::Array{Float64,1}, ::Array{Float64,1}, ::String, ::Bool, ::String, ::Int64, ::Int64, ::Int64, ::Bool, ::String, ::Bool, ::typeof(SeisIO.FDSNget!), ::SeisData, ::Array{String,2}) at ~/.julia/dev/SeisIO/src/Web/FDSN.jl:234
[5] (::getfield(SeisIO, Symbol("#kw##FDSNget!")))(::NamedTuple{(:fmt, :nd, :opts, :rad, :reg, :s, :si, :src, :t, :to, :v, :w, :xf, :y),Tuple{String,Int64,String,Array{Float64,1},Array{Float64,1},String,Bool,String,Int64,Int64,Int64,Bool,String,Bool}}, ::typeof(SeisIO.FDSNget!), ::SeisData, ::Array{String,2}) at ./none:0
[6] #get_data#203(::Bool, ::Bool, ::String, ::Int64, ::String, ::Array{Float64,1}, ::Array{Float64,1}, ::Bool, ::Bool, ::String, ::Bool, ::String, ::Bool, ::Int64, ::Int64, ::Bool, ::Bool, ::Int64, ::Bool, ::String, ::Bool, ::typeof(get_data), ::String, ::String) at ~/.julia/dev/SeisIO/src/Wrappers/get_data.jl:82
[7] (::getfield(SeisIO, Symbol("#kw##get_data")))(::NamedTuple{(:s, :t, :src, :v),Tuple{String,Int64,String,Int64}}, ::typeof(get_data), ::String, ::String) at ./none:0
[8] top-level scope at none:0

Best,
Kurama

Allow for upsampliing in resample!

resample!(S,fs=fs throws a BoundsError when trying to upsample data where fs > S.fs.

MWE:

using SeisIO 
S = SeisIO.RandSeis.randSeisData(3,nx=2^14)
SeisData with 3 channels (3 shown)
    ID: W7.IJVJP.M4.CH3                    0M.OVX..STZ                        3A.GCPM..MLE                       
  NAME: 3wVmTMZQ2g0Z6Ls4Axh2JlB4nuSbO7lU5 G103gKlj6wY2d1sQGYSprCrwLePPGzZWC 9LiHmHKS8LR8pe7pTHOE8pA0ZHvNFg     
   LOC: [-30.1085, 50.2216, 964.76, 67.77 [-15.6587, -85.0015, 480.462, 53. -29.9009 N, 131.203 E, 921.742 m   
    FS: 250.0                              62.5                               2.0                                
  GAIN: 4.01747e8                          7.19092e9                          9.03546e7                          
  RESP: a0 1.0, f0 1.0, 8z, 8p             a0 1.0, f0 1.0, 8z, 8p             a0 1.0, f0 1.0, 8z, 8p             
 UNITS: m/s                                m                                  m                                  
   SRC: randSeisChannel(c=false, nx=16384 randSeisChannel(c=false, nx=16384 randSeisChannel(c=false, nx=16384 
  MISC: 5 entries                          5 entries                          15 entries                         
 NOTES: 1 entries                          1 entries                          1 entries                          
     T: 2020-06-16T14:04:30 (5 gaps)       2020-06-16T14:04:30 (8 gaps)       2020-06-16T14:04:31 (7 gaps)       
     X: +1.194e+00                         +9.069e-01                         +2.358e+00                         
        +7.154e-01                         +1.946e+00                         -4.762e-01                         
            ...                                ...                                ...                            
        +3.401e-01                         -1.326e-01                         -3.853e-01                         
        (nx = 16384)                       (nx = 16384)                       (nx = 16384)  

resample(S,fs=100.)
ERROR: BoundsError: attempt to access 32770-element reinterpret(Float32, ::Array{Float64,1}) at index [1:819175]

DSP.jl's version of resample has no problem upsampling data where fs > S.fs.

resample(S[2].x,100. / S.fs[2])
26214-element Array{Float64,1}:
  0.9069498214529474
  1.716448479926333
  1.9163589276559438
  1.2573744598674774
  0.43120842346064603
  0.3527387116546516
  0.8284999681254623
  0.5564058433573061
 -0.8164715674304706
 -1.713997408026421
  
 -0.6770823868166385
  0.8964191087353106
  0.04654695052155877
 -1.4902814411925862
 -0.2151765050416976
  1.0116242219244012
 -0.34311131524348026
 -1.0160792803040768
  0.09180860342822253

I see that SeisIO's version of downsampling is much faster than DSP version:

using BenchmarkTools
# seisio resample
@benchmark resample(S[1],100.)
BenchmarkTools.Trial: 
  memory estimate:  527.19 KiB
  allocs estimate:  200
  --------------
  minimum time:     290.964 μs (0.00% GC)
  median time:      299.393 μs (0.00% GC)
  mean time:        327.932 μs (3.95% GC)
  maximum time:     2.741 ms (80.16% GC)
  --------------
  samples:          10000
  evals/sample:     1

# DSP resample
@benchmark resample(S[1].x,100. / S.fs[1])
BenchmarkTools.Trial: 
  memory estimate:  343.80 KiB
  allocs estimate:  62
  --------------
  minimum time:     1.484 ms (0.00% GC)
  median time:      1.556 ms (0.00% GC)
  mean time:        1.577 ms (0.50% GC)
  maximum time:     3.738 ms (50.90% GC)
  --------------
  samples:          3169
  evals/sample:     1

Does it make sense to call DSP.resample when S.fs > fs? Happy to submit a PR on this which calls out to DSP.resample when upscaling is needed.

Sample rate in mini-SEED Blockette 100

I have come across some miniseed data where I think the sampling interval may not be read correctly.

The following reproduces the issue:

julia> import SeisIO

julia> s = SeisIO.get_data("FDSN", "II.ALE.00.BH?", s="2001-01-13T17:33:29.58", t="2001-01-13T17:34:35.58")
SeisIO.SeisData with 3 channels (2 shown)
    ID: II.ALE.00.BHE                      II.ALE.00.BHN                      
  NAME: Alert, NU, Canada                  II.ALE.00.BHN                      
   LOC: 82.5033 N, -62.35 E, 60.0 m        0.0 N, 0.0 E, 0.0 m                
    FS: 20.0                               0.05                               
  GAIN: 5.43094e8                          1.0                                
  RESP: a0 1.0, f0 0.05, 5z, 12p           a0 1.0, f0 1.0, 0z, 0p             
 UNITS: m/s                                                                   
   SRC: http://service.iris.edu/fdsnws/da                                    
  MISC: 4 entries                          0 entries                          
 NOTES: 4 entries                          2 entries                          
     T: 2001-01-13T17:33:29 (0 gaps)       2001-01-13T17:33:29 (0 gaps)       
     X: -3.000e+01                         -7.630e+02                         
        -6.100e+01                         -7.400e+02                         
            ...                                ...                            
        -4.020e+02                         -8.120e+02                         
        (nx = 1319)                        (nx = 1319)                        
     C: 0 open, 0 total

julia> sio.fs
3-element Array{Float64,1}:
 20.0
  0.049999966621421206
  0.049999966621421206

All the channels should have the same sampling interval of 0.05 s (sampling rate 20 Hz), but for some reason the sampling interval for the BHN and BHZ components are given as 2 s (0.05 Hz). Obspy does not have the same issue as far as I can tell.

Let me know if I can help to diagnose the problem.

A zipped version of the file (directly obtained from IRIS via FDSN webservices) is attached.

mseed.zip

detrend! fails with NodalData

On the dev branch

(@v1.5) pkg> st
Status `~/.julia/environments/v1.5/Project.toml`
  [b372bb87] SeisIO v1.1.0 `https://github.com/jpjones76/SeisIO.jl.git#dev`

with the test TDMS data

julia> N = SeisIO.Nodal.read_nodal("Node1_UTC_20200307_170738.006.tdms")

detrend! fails

julia> detrend!(N)
ERROR: MethodError: no method matching dtr!(::SubArray{Float32,1,Array{Float32,2},Tuple{Base.Slice{Base.OneTo{Int64}},Int64},true}, ::Array{Int64,2}, ::Float64, ::Int64)
Closest candidates are:
  dtr!(::Array{T,1}, ::Array{Int64,2}, ::Float64, ::Int64) where T<:AbstractFloat at /home/timclements/.julia/packages/SeisIO/NGyBv/src/Processing/detrend.jl:74
Stacktrace:
 [1] detrend!(::SeisIO.Nodal.NodalData; chans::Array{Int64,1}, n::Int64) at /home/timclements/.julia/packages/SeisIO/NGyBv/src/Processing/detrend.jl:140
 [2] detrend!(::SeisIO.Nodal.NodalData) at /home/timclements/.julia/packages/SeisIO/NGyBv/src/Processing/detrend.jl:135
 [3] top-level scope at REPL[71]:1
 [4] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1088

I believe this is an issue with the definition of dtr!

Using the NodalData.x[i] syntax returns a SubArray type:

julia> typeof(N.x[1])
SubArray{Float32,1,Array{Float32,2},Tuple{Base.Slice{Base.OneTo{Int64}},Int64},true}

julia> isa(N.x[1],Array)
false

julia> isa(N.x[1],AbstractArray)
true

but dtr! only accepts Arrays. Changing dtr! to accept AbstractArray as function dtr!(x::AbstractArray{T,1}, ti::Array{Int64,2}, fs::Float64, n::Int64) where T <: AbstractFloat should fix this:

julia> detrend!(N)

works! Should be an easy change.

read_data: problem with negative time gaps in mini-SEED

I have set of somewhat corrupted day-long miniseed files (BH?) that have two channels each. The first channel is the first few seconds of the day (~100 samples). The second channel is the entire daylong trace (3456000 samples). So the first few seconds are repeated across the two channels. When using read_data, the first channel is included with the second channel giving a single channel of 3456080 samples.

S = read_data("mseed","CIRIO__BHZ___2012132.mseed")
SeisData with 1 channels (1 shown)
    ID: CI.RIO..BHZ                        
  NAME: CI.RIO..BHZ                        
   LOC: 0.0 N, 0.0 E, 0.0 m                
    FS: 40.0                               
  GAIN: 1.0                                
  RESP: a0 1.0, f0 1.0, 0z, 0p             
 UNITS:                                    
   SRC:                                    
  MISC: 0 entries                          
 NOTES: 0 entries                          
     T: 2012-05-11T00:00:00.020 (0 gaps)   
     X: -1.590e+03                         
        -2.958e+03                         
            ...                            
        -1.521e+03                         
        (nx = 3456080)                     
     C: 0 open, 0 total
all(S[1].x[1:80] .== S[1].x[81:160])
true

The first 80 samples are definitely repeated. I expect to get two channels when using get_data as Obspy.read gives:

import obspy 
obspy.read("CIRIO__BHZ__2012132.mseed")
2 Trace(s) in Stream:
CI.RIO..BHZ | 2012-05-11T00:00:00.019500Z - 2012-05-11T00:00:01.994500Z | 40.0 Hz, 80 samples
CI.RIO..BHZ | 2012-05-11T00:00:00.019500Z - 2012-05-11T23:59:59.994500Z | 40.0 Hz, 3456000 samples

I tried to change the nx_new KW to a smaller number but that didn't give me two channels. Here is a link to an example miniseed file.

Data request file naming

When get_data(.., w=true) is in write mode, if the source is "FDSN" the output file name is YYYY.JJJ.HH.MM.SS.000000.FDSNWS.IRIS.mseed whereas if the source is "IRIS" the output file name YYY.JJJ.HH.MM.SS.(NET).STA.LOC.CHAN.R.mseed. e.g.

S = get_data("FDSN", "UW.LON..BHZ", src="IRIS",s="2019-01-01",t=600,w=true) writes a file named 2019.1.00.00.00.000000.FDSNWS.IRIS.mseed

and

S = get_data("IRIS", "UW.LON..BHZ",s="2019-01-01",t=600,w=true) writes a file named 2019.1.00.00.00.UW.LON..BHZ.R.mseed.

This should be a simple fix to FDSNget!.

`get_data` using IRIS DMC PH5WS dataselect fails

I'm trying to download data from the IRIS DMC PH5WS dataselect Web Service (https://service.iris.edu/ph5ws/dataselect/1/).

(@v1.4) pkg> st
Status `~/.julia/environments/v1.4/Project.toml`
[b372bb87] SeisIO v1.0.0

Request data from PH5WS:

julia> S = get_data("FDSN","YW.1002..DPZ",s=s,t=t,src="http://service.iris.edu/ph5ws/",v=2)
[ Info: 2020-07-08T21:19:11 ¦ Querying FDSN stations
Most compact request form = ["YW" "1002" "" "DPZ" ""]
request url:http://service.iris.edu/ph5ws/station/1/query
request body: 
level=response
format=xml
 YW 1002 * DPZ 2016-06-23T00:00:00 2016-06-23T01:00:00

[ Info: 2020-07-08T21:19:17 ¦ Building list of channels
data query strings:
YW 1002 * DPZ
[ Info: 2020-07-08T21:19:17 ¦ Data query begins
request url: http://service.iris.edu/ph5ws/dataselect/1/query
request body: 
format=miniseed
YW 1002 * DPZ 2016-06-23T00:00:00.000000 2016-06-23T01:00:00.000000
┌ Warning: Request failed!
│ URL: http://service.iris.edu/ph5ws/dataselect/1/query
│ POST BODY: 
│ format=miniseed
│ YW 1002 * DPZ 2016-06-23T00:00:00.000000 2016-06-23T01:00:00.000000
│ 
│ RESPONSE: 400 (Bad Request)
└ @ SeisIO ~/.julia/packages/SeisIO/pSAug/src/Web/0_essentials.jl:44
parsable = false
[ Info: 2020-07-08T21:19:24: done FDSNget query.
[ Info: n_badreq = 1
[ Info: 2020-07-08T21:19:24 ¦ Can't prune empty channels; web request wasn't fully parsed.
SeisData with 2 channels (2 shown)
    ID: YW.1002..DPZ                       XX.FAIL..001                       
  NAME: Node at Wavefields Community Expe                                    
   LOC: 36.6223 N, -97.7398 E, 322.3 m     0.0 N, 0.0 E, 0.0 m                
    FS: 250.0                              0.0                                
  GAIN: 1.02964e9                          1.0                                
  RESP: a0 0.999813, f0 40.0, 2z, 2p       a0 1.0, f0 1.0, 0z, 0p             
 UNITS: m/s                                                                   
   SRC: http://service.iris.edu/ph5ws/dat                                    
  MISC: 4 entries                          3 entries                          
 NOTES: 3 entries                          3 entries                          
     T:                                                                       
     X: (empty)                            (empty)          

Station request works well. I believe dataselect is failing because a reqtype of [fdsn shot, receiver] is required in PH5 queries. For now, it seems adding reqtype=fdsn would allow for PH5 queries but shot and receiver queries might require some more work/different syntax.

Here is the working request url:
https://service.iris.edu/ph5ws/dataselect/1/query?reqtype=fdsn&format=mseed&net=YW&sta=1002&cha=DPZ&starttime=2016-06-23T00:00:00&endtime=2016-06-23T01:00:00&nodata=404

Parsing gaps correctly?

I'm working with gappy MSEED data and am unsure if something I'm seeing is expected behavior or not:

julia> st[1].t

21×2 Array{Int64,2}:
        1  1420070400000000
  4208601          13000000
  4557601           6000000
  4815601          19000000
  5036201          16000000
  5719401          12000000
  5812401          34000000
  5941001           4000000
  6007601           2000000
  8597801          23000000
  8598801          48000000
  8635601          48000000
  8717201          17000000
  8721201          15000000
  8732601           4000000
  9000801          13000000
  9254201          49000000
  9412001           4000000
  9555601          24000000
  9556201          58000000
 17198200                 0

Assuming I'm understanding the structure of this correctly, the first gap is 13 sec long. If I read the same file in Python:

st.print_gaps()
Source            Last Sample                 Next Sample                 Delta           Samples 
WR.PEC..EHZ       2015-01-01T05:50:41.995000Z 2015-01-01T05:50:56.000000Z 14.000000       2800    
WR.PEC..EHZ       2015-01-01T06:20:00.995000Z 2015-01-01T06:20:07.000000Z 6.000000        1200    
WR.PEC..EHZ       2015-01-01T06:41:36.995000Z 2015-01-01T06:41:56.000000Z 19.000000       3800    
WR.PEC..EHZ       2015-01-01T07:00:18.995000Z 2015-01-01T07:00:35.000000Z 16.000000       3200    
WR.PEC..EHZ       2015-01-01T07:57:30.995000Z 2015-01-01T07:57:43.000000Z 12.000000       2400    
WR.PEC..EHZ       2015-01-01T08:05:27.995000Z 2015-01-01T08:06:02.000000Z 34.000000       6800    
WR.PEC..EHZ       2015-01-01T08:16:44.995000Z 2015-01-01T08:16:49.000000Z 4.000000        800     
WR.PEC..EHZ       2015-01-01T08:22:21.995000Z 2015-01-01T08:22:24.000000Z 2.000000        400     
WR.PEC..EHZ       2015-01-01T11:58:14.995000Z 2015-01-01T11:58:38.000000Z 23.000000       4600    
WR.PEC..EHZ       2015-01-01T11:58:42.995000Z 2015-01-01T11:59:31.000000Z 48.000000       9600    
WR.PEC..EHZ       2015-01-01T12:02:34.995000Z 2015-01-01T12:03:23.000000Z 48.000000       9600    
WR.PEC..EHZ       2015-01-01T12:10:10.995000Z 2015-01-01T12:10:28.000000Z 17.000000       3400    
WR.PEC..EHZ       2015-01-01T12:10:47.995000Z 2015-01-01T12:11:03.000000Z 15.000000       3000    
WR.PEC..EHZ       2015-01-01T12:11:59.995000Z 2015-01-01T12:12:04.000000Z 4.000000        800     
WR.PEC..EHZ       2015-01-01T12:34:24.995000Z 2015-01-01T12:34:38.000000Z 13.000000       2600    
WR.PEC..EHZ       2015-01-01T12:55:44.995000Z 2015-01-01T12:56:34.000000Z 49.000000       9800    
WR.PEC..EHZ       2015-01-01T13:09:42.995000Z 2015-01-01T13:09:46.000000Z 3.000000        600     
WR.PEC..EHZ       2015-01-01T13:21:44.995000Z 2015-01-01T13:22:09.000000Z 24.000000       4800    
WR.PEC..EHZ       2015-01-01T13:22:11.995000Z 2015-01-01T13:23:10.000000Z 58.000000       11600   

The first gap in ObsPy is instead listed as 14 sec, but the rest match the SeisIO durations. Am I missing something here?
WR.PEC.EHZ.mseed.zip

SAC PZ difference: MATLAB IrisFetch.m vs. get_data()

As I am doing this instrument deconvolution code, I have ran into a small difference in behaviors and I would like to know if this is expected. Here is a minimum working example.

MATLAB: (using the latest IrisFetch.m and IRIS-WS.jar files)

javaaddpath("./IRIS-WS-2.0.19.jar");

tc1 = [2017, 7, 4, 11, 18, 0];
tc2 = [2017, 7, 4, 11, 20, 0];

dum = irisFetch.Traces('AV','CLES','--','BHZ',datestr(tc1,31),datestr(tc2,31),'includePZ');

dum.sacpz.zeros = 
   1.0e+03 *

  0.000000000000000 + 0.000000000000000i
  0.000000000000000 + 0.000000000000000i
  0.000000000000000 + 0.000000000000000i
 -0.392000000000000 + 0.000000000000000i
 -1.960000000000000 + 0.000000000000000i
 -1.490000000000000 + 1.740000000000000i
 -1.490000000000000 - 1.740000000000000i

dum.sacpz.poles =
   1.0e+04 *

 -0.000003691000000 + 0.000003702000000i
 -0.000003691000000 - 0.000003702000000i
 -0.034300000000000 + 0.000000000000000i
 -0.037000000000000 + 0.046700000000000i
 -0.037000000000000 - 0.046700000000000i
 -0.083600000000000 + 0.152200000000000i
 -0.083600000000000 - 0.152200000000000i
 -0.490000000000000 + 0.470000000000000i
 -0.490000000000000 - 0.470000000000000i
 -0.690000000000000 + 0.000000000000000i
 -1.500000000000000 + 0.000000000000000i

dum.sacpz.units =

    'M'

The unit indicate meters.

SeisIO.jl

S  = get_data("FDSN", "AV.CLES..BHZ", src="IRIS", s="2017-07-04T11:18:00", t="2017-07-04T11:20:00")

S[1].resp.z = 
6-element Array{Complex{Float32},1}:
     0.0f0 + 0.0f0im   
     0.0f0 + 0.0f0im   
  -392.0f0 + 0.0f0im   
 -1960.0f0 + 0.0f0im   
 -1490.0f0 + 1740.0f0im
 -1490.0f0 - 1740.0f0im

S[1].resp.p = 
11-element Array{Complex{Float32},1}:
 -0.03691f0 + 0.03702f0im
 -0.03691f0 - 0.03702f0im
   -343.0f0 + 0.0f0im    
   -370.0f0 + 467.0f0im  
   -370.0f0 - 467.0f0im  
   -836.0f0 + 1522.0f0im 
   -836.0f0 - 1522.0f0im 
  -4900.0f0 + 4700.0f0im 
  -4900.0f0 - 4700.0f0im 
  -6900.0f0 + 0.0f0im    
 -15000.0f0 + 0.0f0im   

S[1].units = 
"m/s"

So these two calls result in a different number of zeros, which can be related to the different units.

  1. I am curious if this is expected behavior for these two different functions? I thought they both used the same IRIS SACPZ web-request tool. I guess they don't. There is no keyword to change the IrisFetch.m behavior. Is there a keyword to change the get_data() behavior so it returns the zeros for units in meter?
  2. Do we want to add some functionality to this instrument deconvolution code for SeisIO.jl? Would it be useful to let the user request which units the data should be returned in (e.g. displacement [m], velocity [m/s], acceleration [m/s/s])? I see there is already the function convert_seis!. Should I just use the default units in the SACPZ for the instrument decon and then let the user use convert_seis!?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.