Skip to content

Commit 4f3197d

Browse files
committed
writeSignalTable(..) improved
1 parent ddfa490 commit 4f3197d

File tree

4 files changed

+89
-72
lines changed

4 files changed

+89
-72
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "SignalTables"
22
uuid = "3201582d-3078-4276-ba5d-0a1254d79d7c"
33
authors = ["Martin.Otter@dlr.de <Martin.Otter@dlr.de>"]
4-
version = "0.4.0"
4+
version = "0.4.1"
55

66
[deps]
77
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"

docs/src/index.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,12 @@ are different to the Python 2.x version.
188188

189189
## Release Notes
190190

191+
### Version 0.4.1
192+
193+
- writeSignalTable(..., log=false):
194+
- Info messages about not written elements only printed if log=true.
195+
- Some issues corrected when writing signals.
196+
191197
### Version 0.4.0
192198

193199
- New signal-type Map added (additionally to Var und Par signals) with two new functions Map(..), isMap(..).

src/SignalTableFunctions.jl

Lines changed: 80 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ end
4242

4343
"""
4444
new_signal_table(args...)::OrderedDict{String,Any}
45-
45+
4646
Returns a new signal table, that is `OrderedDict{String,Any}("_class" => :SignalTable, args...)`
4747
"""
4848
new_signal_table(args...) = OrderedDict{String,Any}("_class" => :SignalTable, args...)
@@ -106,7 +106,7 @@ function showMapValue(iostr,mapValue)::Nothing
106106
for (key,val) in mapValue
107107
if key in doNotShowAttributes
108108
continue
109-
end
109+
end
110110
if first
111111
first = false
112112
else
@@ -295,7 +295,7 @@ function eltypeOrTypeWithMeasurements(obj)
295295
btype = typeof(obj1.val)
296296
else
297297
btype = eltypeOrType(obj)
298-
end
298+
end
299299
end
300300
else
301301
btype = eltypeOrType(obj)
@@ -315,7 +315,7 @@ function eltypeOrTypeWithMeasurements(obj)
315315
btype = typeof(obj1.val)
316316
else
317317
btype = eltypeOrType(obj)
318-
end
318+
end
319319
end
320320
else
321321
btype = eltypeOrType(obj)
@@ -336,7 +336,7 @@ function eltypeOrTypeWithMeasurements(obj)
336336
btype = typeof(obj1.val)
337337
else
338338
btype = eltypeOrType(obj)
339-
end
339+
end
340340
return btype
341341
end
342342

@@ -362,7 +362,7 @@ function getValuesFromPar(signal, len::Int)
362362
end
363363
return nothing
364364
end
365-
365+
366366

367367
"""
368368
signal = getFlattenedSignal(signalTable, name;
@@ -371,7 +371,7 @@ end
371371
targetFloat = Float64)
372372
373373
Returns a copy of a signal where the *flattened* and *converted* values (e.g.: missing -> NaN)
374-
are stored as `signal[:flattenedValues]` and the legend as `signal[:legend]`.
374+
are stored as `signal[:flattenedValues]` and the legend as `signal[:legend]`.
375375
A flattened signal can be, for example, used for traditional plot functions or for traditional tables.
376376
377377
`signal[:flattenedValues]` is a reshape of values into a vector or a matrix with optionally the following transformations:
@@ -396,18 +396,18 @@ so signal[:flattenedValues] = signal[:values].
396396
function getFlattenedSignal(signalTable, name::String;
397397
missingToNaN = true,
398398
targetInt = Int,
399-
targetFloat = Float64)
400-
independentSignalsSize = getIndependentSignalsSize(signalTable)
401-
if length(independentSignalsSize) != 1
399+
targetFloat = Float64)
400+
independentSignalsSize = getIndependentSignalsSize(signalTable)
401+
if length(independentSignalsSize) != 1
402402
ni = length(independentSignalsSize)
403403
@info "getFlattenedSignal(.., \"$name\") supported for one independent signal,\nbut number of independent signals = $(ni)! Signal is ignored."
404404
return nothing
405-
end
405+
end
406406
lenx = independentSignalsSize[1]
407407
sigPresent = false
408408
if hasSignal(signalTable,name)
409409
# name is a signal name without range
410-
signal = getSignal(signalTable,name)
410+
signal = getSignal(signalTable,name)
411411
if isVar(signal) && haskey(signal, :values)
412412
sigValues = signal[:values]
413413
elseif isPar(signal) && haskey(signal, :value)
@@ -416,7 +416,7 @@ function getFlattenedSignal(signalTable, name::String;
416416
@goto ERROR
417417
end
418418
else
419-
@goto ERROR
419+
@goto ERROR
420420
end
421421
dims = size(sigValues)
422422
if dims[1] > 0
@@ -438,7 +438,7 @@ function getFlattenedSignal(signalTable, name::String;
438438
nScalarSignals = prod(i for i in varDims)
439439
end
440440
end
441-
441+
442442
else
443443
# Handle signal arrays, such as a.b.c[3] or a.b.c[2:3, 1:5, 3]
444444
if name[end] == ']'
@@ -456,7 +456,7 @@ function getFlattenedSignal(signalTable, name::String;
456456
@goto ERROR
457457
end
458458
else
459-
@goto ERROR
459+
@goto ERROR
460460
end
461461
dims = size(sigValues)
462462

@@ -488,21 +488,21 @@ function getFlattenedSignal(signalTable, name::String;
488488
if !sigPresent
489489
@goto ERROR
490490
end
491-
491+
492492
# Transform sigValues
493493
sigElType = eltype(sigValues)
494494
eltypeOrType2 = eltypeOrTypeWithMeasurements(sigValues)
495495
hasMissing = isa(missing, sigElType)
496496

497-
if (!isnothing(targetInt) && eltypeOrType2 == targetInt ||
497+
if (!isnothing(targetInt) && eltypeOrType2 == targetInt ||
498498
!isnothing(targetFloat) && eltypeOrType2 == targetFloat) &&
499-
!(missingToNaN && hasMissing)
499+
!(missingToNaN && hasMissing)
500500
# Signal need not be converted - do nothing
501501

502502
elseif hasMissing && missingToNaN && !isnothing(targetFloat)
503503
# sig contains missing or nothing - convert to targetFloat and replace missing by NaN
504504
sigNaN = convert(targetFloat, NaN)
505-
sigValues2 = Array{targetFloat, ndims(sigValues)}(undef, size(sigValues))
505+
sigValues2 = Array{targetFloat, ndims(sigValues)}(undef, size(sigValues))
506506
try
507507
for i = 1:length(sigValues)
508508
sigValues2[i] = ismissing(sigValues[i]) ? sigNaN : convert(targetFloat, sigValues[i])
@@ -513,7 +513,7 @@ function getFlattenedSignal(signalTable, name::String;
513513
return nothing
514514
end
515515
sigValues = sigValues2
516-
516+
517517
elseif !hasMissing && sigElType <: Integer && !isnothing(targetInt)
518518
# Transform to targetInt
519519
sigValues2 = Array{targetInt, ndims(sigValues)}(undef, size(sigValues))
@@ -529,7 +529,7 @@ function getFlattenedSignal(signalTable, name::String;
529529
sigValues2[i] = convert(targetFloat, sigValues[i])
530530
end
531531
sigValues = sigValues2
532-
532+
533533
else
534534
@goto ERROR
535535
end
@@ -555,7 +555,7 @@ function getFlattenedSignal(signalTable, name::String;
555555
for j2 in 1:div(nScalarSignals, sizeLength[1])
556556
for j3 in arrayIndices[1]
557557
legend[i] *= string(j3)
558-
push!(legendIndices[i], j3)
558+
push!(legendIndices[i], j3)
559559
# println("i = $i, j2 = $j2, j3 = $j3, legend[$i] = ", legend[i], ", legendIndices[$i] = ", legendIndices[i])
560560
i += 1
561561
end
@@ -601,7 +601,7 @@ function signalValuesForLinePlots(sigTable, name)
601601
end
602602
sig = signal[:flattenedValues]
603603
sigLegend = signal[:legend]
604-
variability = get(signal, :variability, "")
604+
variability = get(signal, :variability, "")
605605
if variability == "independent"
606606
sigKind = Independent
607607
elseif variability == "clocked" || variability == "clock" || variability == "trigger" || get(signal, "interpolation", "") == "none"
@@ -630,18 +630,18 @@ function getPlotSignal(sigTable, ysigName::AbstractString; xsigName=nothing)
630630
(xsig, xsigLegend, xsigKind) = signalValuesForLinePlots(sigTable, xsigName2)
631631
if isnothing(xsig)
632632
@goto ERROR
633-
end
633+
end
634634

635635
# Check x-axis signal
636636
if ndims(xsig) != 1
637637
@info "\"$xsigName\" does not characterize a scalar variable as needed for the x-axis."
638638
@goto ERROR
639-
#elseif !(typeof(xsigValue) <: Real ||
639+
#elseif !(typeof(xsigValue) <: Real ||
640640
# typeof(xsigValue) <: Measurements.Measurement ||
641641
# typeof(xsigValue) <: MonteCarloMeasurements.StaticParticles ||
642642
# typeof(xsigValue) <: MonteCarloMeasurements.Particles )
643643
# @info "\"$xsigName\" is of type " * string(typeof(xsigValue)) * " which is not supported for the x-axis."
644-
# @goto ERROR
644+
# @goto ERROR
645645
end
646646

647647
return (xsig, xsigLegend[1], ysig, ysigLegend, ysigKind)
@@ -685,7 +685,7 @@ Encodes a SignalTable suitable to convert to JSON format.
685685
If a keyword signalNames with a vector of strings is provided, then only
686686
the corresponding signals are encoded.
687687
"""
688-
function encodeSignalTable(signalTable; signalNames=nothing)
688+
function encodeSignalTable(signalTable; signalNames=nothing, log=false)
689689
if isSignalTable(signalTable)
690690
jdict = OrderedDict{String,Any}("_class" => "SignalTable",
691691
"_classVersion" => version_SignalTable_JSON)
@@ -699,7 +699,7 @@ function encodeSignalTable(signalTable; signalNames=nothing)
699699
delete!(signal, :values)
700700
delete!(signal, :value)
701701
end
702-
encodedSignal = encodeSignalTableElement(name, signal)
702+
encodedSignal = encodeSignalTableElement(name, signal, log=log)
703703
if !isnothing(encodedSignal)
704704
jdict[name] = encodedSignal
705705
end
@@ -712,78 +712,89 @@ end
712712

713713

714714
"""
715-
jsigDict = encodeSignalTableElement(path, signalTableElement)
715+
jsigDict = encodeSignalTableElement(path, signalTableElement; log=false)
716716
717717
Encodes a signal table element suitable to convert to JSON format.
718718
"""
719-
function encodeSignalTableElement(path, element)
719+
function encodeSignalTableElement(path, element; log=false)
720720
if isSignal(element)
721721
if isVar(element)
722722
jdict = OrderedDict{String,Any}("_class" => "Var")
723723
elseif isPar(element)
724724
jdict = OrderedDict{String,Any}("_class" => "Par")
725725
else
726-
jdict = OrderedDict{String,Any}("_class" => "Map")
726+
jdict = OrderedDict{String,Any}("_class" => "Map")
727727
end
728-
available = true
728+
available = false
729729
for (key,val) in element
730730
if key != ":_class"
731-
encodedSignal = encodeSignalTableElement(appendNames(path,key),val)
732-
if isnothing(encodedSignal)
733-
available = false
734-
else
731+
encodedSignal = encodeSignalTableElement(appendNames(path,key),val, log=log)
732+
if !isnothing(encodedSignal)
733+
available = true
735734
jdict[string(key)] = encodedSignal
736-
end
735+
end
737736
end
738737
end
739738
if available
740739
return jdict
741740
else
742741
return nothing
743742
end
744-
745-
elseif typeof(element) <: AbstractArray && (elementBaseType(eltype(element)) <: Number || elementBaseType(eltype(element)) <: String)
746-
if ndims(element) == 1 && string(eltype(element)) in TypesWithoutEncoding
747-
return element
748-
end
749-
elunit = unitAsParseableString(element)
750-
if elunit == ""
751-
jdict = OrderedDict{String,Any}("_class" => "Array",
752-
"eltype" => string(eltype(element)),
753-
"size" => Int[i for i in size(element)],
754-
"layout" => "column-major",
755-
"values" => reshape(element, length(element)))
743+
744+
# elseif typeof(element) <: AbstractArray && (elementBaseType(eltype(element)) <: Number || elementBaseType(eltype(element)) <: String)
745+
elseif typeof(element) <: AbstractArray
746+
if ndims(element) == 1
747+
eltypeElement = eltype(element)
748+
if string(eltypeElement) in TypesWithoutEncoding || eltypeElement <: AbstractArray && ndims(eltypeElement) == 1
749+
return element
750+
else
751+
if log
752+
@info "$path::$(typeof(element)) is ignored, because mapping to JSON not known"
753+
end
754+
return nothing
755+
end
756756
else
757-
element = ustrip.(element)
758-
jdict = OrderedDict{String,Any}("_class" => "Array",
759-
"unit" => elunit,
760-
"eltype" => string(eltype(element)),
761-
"size" => Int[i for i in size(element)],
762-
"layout" => "column-major",
763-
"values" => reshape(element, length(element)))
757+
elunit = unitAsParseableString(element)
758+
if elunit == ""
759+
jdict = OrderedDict{String,Any}("_class" => "Array",
760+
"eltype" => string(eltype(element)),
761+
"size" => Int[i for i in size(element)],
762+
"layout" => "column-major",
763+
"values" => reshape(element, length(element)))
764+
else
765+
element = ustrip.(element)
766+
jdict = OrderedDict{String,Any}("_class" => "Array",
767+
"unit" => elunit,
768+
"eltype" => string(eltype(element)),
769+
"size" => Int[i for i in size(element)],
770+
"layout" => "column-major",
771+
"values" => reshape(element, length(element)))
772+
end
773+
return jdict
764774
end
765-
return jdict
766775

767776
elseif string(typeof(element)) in TypesWithoutEncoding
768777
return element
769778

770779
elseif typeof(element) <: Number
771-
elunit = unitAsParseableString(element)
780+
elunit = unitAsParseableString(element)
772781
if elunit == ""
773-
jdict = OrderedDict{String,Any}("_class" => "Number",
774-
"type" => typeof(element),
782+
jdict = OrderedDict{String,Any}("_class" => "Number",
783+
"type" => typeof(element),
775784
"value" => element)
776785
else
777786
element = ustrip.(element)
778-
jdict = OrderedDict{String,Any}("_class" => "Number",
787+
jdict = OrderedDict{String,Any}("_class" => "Number",
779788
"unit" => elunit,
780-
"type" => typeof(element),
781-
"value" => element)
789+
"type" => typeof(element),
790+
"value" => element)
782791
end
783792
return jdict
784-
793+
785794
else
786-
@info "$path::$(typeof(element)) is ignored, because mapping to JSON not known"
795+
if log
796+
@info "$path::$(typeof(element)) is ignored, because mapping to JSON not known"
797+
end
787798
return nothing
788799
end
789800
end
@@ -797,15 +808,15 @@ Returns a JSON string representation of signalTable
797808
If keyword signalNames with a Vector of strings is provided, then a
798809
signal table with the corresponding signals are returned as JSON string.
799810
"""
800-
function signalTableToJSON(signalTable; signalNames = nothing)::String
801-
jsignalTable = encodeSignalTable(signalTable; signalNames=signalNames)
811+
function signalTableToJSON(signalTable; signalNames = nothing, log=false)::String
812+
jsignalTable = encodeSignalTable(signalTable; signalNames=signalNames, log=log)
802813
return JSON.json(jsignalTable)
803814
end
804815

805816

806817
"""
807818
writeSignalTable(filename::String, signalTable; signalNames=nothing, indent=nothing, log=false)
808-
819+
809820
Write signalTable in JSON format on file `filename`.
810821
811822
If keyword signalNames with a Vector of strings is provided, then a
@@ -818,7 +829,7 @@ function writeSignalTable(filename::String, signalTable; signalNames = nothing,
818829
if log
819830
println(" Write signalTable in JSON format on file \"$file\"")
820831
end
821-
jsignalTable = encodeSignalTable(signalTable; signalNames=signalNames)
832+
jsignalTable = encodeSignalTable(signalTable; signalNames=signalNames, log=log)
822833
open(file, "w") do io
823834
JSON.print(io, jsignalTable, indent)
824835
end

0 commit comments

Comments
 (0)