forked from Keysight/Jlsca
-
Notifications
You must be signed in to change notification settings - Fork 0
/
trs-splitbinary.jl
179 lines (142 loc) · 6.09 KB
/
trs-splitbinary.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# This file is part of Jlsca, license is GPLv3, see https://www.gnu.org/licenses/gpl-3.0.en.html
#
# Author: Cees-Bart Breunesse
export SplitBinary
# split binary has the data and samples in 2 different files, similar to how Daredevil reads its data and samples. Since there is not metadata in these files, the meta data is encoded in and read from the file names.
type SplitBinary <: Trace
numberOfTraces::Int
dataSpace::Int
sampleType::Type
numberOfSamplesPerTrace::Int
samplesFileDescriptor
dataFileDescriptor
passes
dataPasses
postProcInstance
bgtask
tracesReturned
samplesPosition
dataPosition
function SplitBinary(dataFn, samplesFn)
(sampleSpace, sampleType, numberOfTracesSamples) = parseFilename(samplesFn)
(dataSpace, dataType, numberOfTracesData) = parseFilename(dataFn)
if isnull(sampleSpace) && isnull(numberOfTracesSamples) == nothing
throw(ErrorException(@sprintf("Need either number of samples or number of traces in file name %s", samplesFn)))
end
if isnull(dataSpace) && isnull(numberOfTracesData)
throw(ErrorException(@sprintf("Need either number of data samples or number of traces in file name %s", dataFn)))
end
samplesFileDescriptor = open(samplesFn, "r")
bytesInSamplesFile = stat(samplesFileDescriptor).size
close(samplesFileDescriptor)
dataFileDescriptor = open(dataFn, "r")
bytesInDataFile = stat(dataFileDescriptor).size
close(dataFileDescriptor)
if dataType != UInt8
throw(ErrorException("Only UInt8 support for data"))
end
if !isnull(sampleSpace) && !isnull(numberOfTracesSamples)
(bytesInSamplesFile >= get(sampleSpace) * sizeof(sampleType)) || throw(ErrorException("Sample file too small"))
end
if isnull(sampleSpace)
sampleSpace = Nullable(div(div(bytesInSamplesFile, get(numberOfTracesSamples)), sizeof(sampleType)))
end
if isnull(numberOfTracesSamples)
numberOfTracesSamples = Nullable(div(bytesInSamplesFile, get(sampleSpace) * sizeof(sampleType)))
end
if isnull(dataSpace)
dataSpace = Nullable(div(div(bytesInDataFile, get(numberOfTracesData)), sizeof(dataType)))
end
if isnull(numberOfTracesData)
numberOfTracesData = Nullable(div(div(bytesInDataFile, get(dataSpace)), sizeof(dataType)))
end
if get(numberOfTracesSamples) != get(numberOfTracesData)
throw(ErrorException(@sprintf("Different #traces in samples %d versus data %d", get(numberOfTracesSamples), get(numberOfTracesData))))
end
SplitBinary(dataFn, get(dataSpace), samplesFn::String, get(sampleSpace), sampleType, get(numberOfTracesSamples))
end
function SplitBinary(dataFname::String, dataSpace::Int, samplesFn::String, numberOfSamplesPerTrace, sampleType, nrtraces, write::Bool=false)
samplesFileDescriptor = open(samplesFn, write ? "w+" : "r")
dataFileDescriptor = open(dataFname, write ? "w+" :"r")
new(nrtraces, dataSpace, sampleType, numberOfSamplesPerTrace, samplesFileDescriptor, dataFileDescriptor, [], [], Union, Union, 0, 0, 0)
end
end
pipe(trs::SplitBinary) = false
length(trs::SplitBinary) = trs.numberOfTraces
function readData(trs::SplitBinary, idx)
if trs.dataPosition != (idx-1) * trs.dataSpace
seek(trs.dataFileDescriptor, (idx-1) * trs.dataSpace)
end
trs.dataPosition += trs.dataSpace
return read(trs.dataFileDescriptor, trs.dataSpace)
end
function writeData(trs::SplitBinary, idx, data::Vector{UInt8})
trs.dataSpace == length(data) || throw(ErrorException(@sprintf("wrong data length %d, expecting %d", length(data), trs.dataSpace)))
if trs.dataPosition != (idx-1) * trs.dataSpace
seek(trs.dataFileDescriptor, (idx-1) * trs.dataSpace)
end
trs.dataPosition += trs.dataSpace
write(trs.dataFileDescriptor, data)
end
function readSamples(trs::SplitBinary, idx)
bytesinsamples = trs.numberOfSamplesPerTrace * sizeof(trs.sampleType)
position = (idx-1) * bytesinsamples
if trs.samplesPosition != position
seek(trs.samplesFileDescriptor, position)
end
trs.samplesPosition += bytesinsamples
samples = read(trs.samplesFileDescriptor, trs.sampleType, trs.numberOfSamplesPerTrace)
if trs.sampleType != UInt8
if ltoh(ENDIAN_BOM) != ENDIAN_BOM
samples = map(ltoh, samples)
end
end
return samples
end
function writeSamples(trs::SplitBinary, idx::Int, samples::Vector)
trs.numberOfSamplesPerTrace == length(samples) || throw(ErrorException(@sprintf("wrong samples length %d, expecting %d", length(samples), trs.numberOfSamplesPerTrace)))
trs.sampleType == eltype(samples) || throw(ErrorException(@sprintf("wrong samples type %s, expecting %s", eltype(samples), trs.sampleType)))
bytesinsamples = trs.numberOfSamplesPerTrace * sizeof(trs.sampleType)
position = (idx-1) * bytesinsamples
if trs.samplesPosition != position
seek(trs.samplesFileDescriptor, position)
end
trs.samplesPosition += bytesinsamples
if trs.sampleType != UInt8
if ltoh(ENDIAN_BOM) != ENDIAN_BOM
samples = map(htol, samples)
end
samples = reinterpret(UInt8, samples)
end
write(trs.samplesFileDescriptor, samples)
end
# parses #samples, type of samples, #traces from a file name (for example samples_Float64_64s_55t.bin, samples_Float64_64s.bin, samples_Float64_32t.bin)
function parseFilename(fname::String)
regex = r"(Int64|UInt64|Int32|UInt32|Float64|Float32|Int16|UInt16|Int8|UInt8)?(_[0-9]+s)?(_[0-9]+t)?\.bin"
m = match(regex, fname)
if m != nothing
myType_s,numberOfSamplesPerTrace_s,numberOfTraces_s = m.captures
if numberOfSamplesPerTrace_s != nothing
numberOfSamples = Nullable(parse(numberOfSamplesPerTrace_s[2:end-1]))
else
numberOfSamples = Nullable{Int}()
end
if numberOfTraces_s != nothing
numberOfTraces = Nullable(parse(numberOfTraces_s[2:end-1]))
else
numberOfTraces = Nullable{Int}()
end
if myType_s != nothing
myType = eval(parse(myType_s))
else
myType = UInt8
end
else
throw(ErrorException(@sprintf("File name %s doesn't match %s", fname, regex)))
end
return numberOfSamples,myType,numberOfTraces
end
function close(trs::SplitBinary)
close(trs.samplesFileDescriptor)
close(trs.dataFileDescriptor)
end