42
42
43
43
"""
44
44
new_signal_table(args...)::OrderedDict{String,Any}
45
-
45
+
46
46
Returns a new signal table, that is `OrderedDict{String,Any}("_class" => :SignalTable, args...)`
47
47
"""
48
48
new_signal_table (args... ) = OrderedDict {String,Any} (" _class" => :SignalTable , args... )
@@ -106,7 +106,7 @@ function showMapValue(iostr,mapValue)::Nothing
106
106
for (key,val) in mapValue
107
107
if key in doNotShowAttributes
108
108
continue
109
- end
109
+ end
110
110
if first
111
111
first = false
112
112
else
@@ -295,7 +295,7 @@ function eltypeOrTypeWithMeasurements(obj)
295
295
btype = typeof(obj1.val)
296
296
else
297
297
btype = eltypeOrType(obj)
298
- end
298
+ end
299
299
end
300
300
else
301
301
btype = eltypeOrType(obj)
@@ -315,7 +315,7 @@ function eltypeOrTypeWithMeasurements(obj)
315
315
btype = typeof(obj1.val)
316
316
else
317
317
btype = eltypeOrType(obj)
318
- end
318
+ end
319
319
end
320
320
else
321
321
btype = eltypeOrType(obj)
@@ -336,7 +336,7 @@ function eltypeOrTypeWithMeasurements(obj)
336
336
btype = typeof (obj1. val)
337
337
else
338
338
btype = eltypeOrType (obj)
339
- end
339
+ end
340
340
return btype
341
341
end
342
342
@@ -362,7 +362,7 @@ function getValuesFromPar(signal, len::Int)
362
362
end
363
363
return nothing
364
364
end
365
-
365
+
366
366
367
367
"""
368
368
signal = getFlattenedSignal(signalTable, name;
371
371
targetFloat = Float64)
372
372
373
373
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]`.
375
375
A flattened signal can be, for example, used for traditional plot functions or for traditional tables.
376
376
377
377
`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].
396
396
function getFlattenedSignal (signalTable, name:: String ;
397
397
missingToNaN = true ,
398
398
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
402
402
ni = length (independentSignalsSize)
403
403
@info " getFlattenedSignal(.., \" $name \" ) supported for one independent signal,\n but number of independent signals = $(ni) ! Signal is ignored."
404
404
return nothing
405
- end
405
+ end
406
406
lenx = independentSignalsSize[1 ]
407
407
sigPresent = false
408
408
if hasSignal (signalTable,name)
409
409
# name is a signal name without range
410
- signal = getSignal (signalTable,name)
410
+ signal = getSignal (signalTable,name)
411
411
if isVar (signal) && haskey (signal, :values )
412
412
sigValues = signal[:values ]
413
413
elseif isPar (signal) && haskey (signal, :value )
@@ -416,7 +416,7 @@ function getFlattenedSignal(signalTable, name::String;
416
416
@goto ERROR
417
417
end
418
418
else
419
- @goto ERROR
419
+ @goto ERROR
420
420
end
421
421
dims = size (sigValues)
422
422
if dims[1 ] > 0
@@ -438,7 +438,7 @@ function getFlattenedSignal(signalTable, name::String;
438
438
nScalarSignals = prod (i for i in varDims)
439
439
end
440
440
end
441
-
441
+
442
442
else
443
443
# Handle signal arrays, such as a.b.c[3] or a.b.c[2:3, 1:5, 3]
444
444
if name[end ] == ' ]'
@@ -456,7 +456,7 @@ function getFlattenedSignal(signalTable, name::String;
456
456
@goto ERROR
457
457
end
458
458
else
459
- @goto ERROR
459
+ @goto ERROR
460
460
end
461
461
dims = size (sigValues)
462
462
@@ -488,21 +488,21 @@ function getFlattenedSignal(signalTable, name::String;
488
488
if ! sigPresent
489
489
@goto ERROR
490
490
end
491
-
491
+
492
492
# Transform sigValues
493
493
sigElType = eltype (sigValues)
494
494
eltypeOrType2 = eltypeOrTypeWithMeasurements (sigValues)
495
495
hasMissing = isa (missing , sigElType)
496
496
497
- if (! isnothing (targetInt) && eltypeOrType2 == targetInt ||
497
+ if (! isnothing (targetInt) && eltypeOrType2 == targetInt ||
498
498
! isnothing (targetFloat) && eltypeOrType2 == targetFloat) &&
499
- ! (missingToNaN && hasMissing)
499
+ ! (missingToNaN && hasMissing)
500
500
# Signal need not be converted - do nothing
501
501
502
502
elseif hasMissing && missingToNaN && ! isnothing (targetFloat)
503
503
# sig contains missing or nothing - convert to targetFloat and replace missing by NaN
504
504
sigNaN = convert (targetFloat, NaN )
505
- sigValues2 = Array {targetFloat, ndims(sigValues)} (undef, size (sigValues))
505
+ sigValues2 = Array {targetFloat, ndims(sigValues)} (undef, size (sigValues))
506
506
try
507
507
for i = 1 : length (sigValues)
508
508
sigValues2[i] = ismissing (sigValues[i]) ? sigNaN : convert (targetFloat, sigValues[i])
@@ -513,7 +513,7 @@ function getFlattenedSignal(signalTable, name::String;
513
513
return nothing
514
514
end
515
515
sigValues = sigValues2
516
-
516
+
517
517
elseif ! hasMissing && sigElType <: Integer && ! isnothing (targetInt)
518
518
# Transform to targetInt
519
519
sigValues2 = Array {targetInt, ndims(sigValues)} (undef, size (sigValues))
@@ -529,7 +529,7 @@ function getFlattenedSignal(signalTable, name::String;
529
529
sigValues2[i] = convert (targetFloat, sigValues[i])
530
530
end
531
531
sigValues = sigValues2
532
-
532
+
533
533
else
534
534
@goto ERROR
535
535
end
@@ -555,7 +555,7 @@ function getFlattenedSignal(signalTable, name::String;
555
555
for j2 in 1 : div (nScalarSignals, sizeLength[1 ])
556
556
for j3 in arrayIndices[1 ]
557
557
legend[i] *= string (j3)
558
- push! (legendIndices[i], j3)
558
+ push! (legendIndices[i], j3)
559
559
# println("i = $i, j2 = $j2, j3 = $j3, legend[$i] = ", legend[i], ", legendIndices[$i] = ", legendIndices[i])
560
560
i += 1
561
561
end
@@ -601,7 +601,7 @@ function signalValuesForLinePlots(sigTable, name)
601
601
end
602
602
sig = signal[:flattenedValues ]
603
603
sigLegend = signal[:legend ]
604
- variability = get (signal, :variability , " " )
604
+ variability = get (signal, :variability , " " )
605
605
if variability == " independent"
606
606
sigKind = Independent
607
607
elseif variability == " clocked" || variability == " clock" || variability == " trigger" || get (signal, " interpolation" , " " ) == " none"
@@ -630,18 +630,18 @@ function getPlotSignal(sigTable, ysigName::AbstractString; xsigName=nothing)
630
630
(xsig, xsigLegend, xsigKind) = signalValuesForLinePlots (sigTable, xsigName2)
631
631
if isnothing (xsig)
632
632
@goto ERROR
633
- end
633
+ end
634
634
635
635
# Check x-axis signal
636
636
if ndims (xsig) != 1
637
637
@info " \" $xsigName \" does not characterize a scalar variable as needed for the x-axis."
638
638
@goto ERROR
639
- # elseif !(typeof(xsigValue) <: Real ||
639
+ # elseif !(typeof(xsigValue) <: Real ||
640
640
# typeof(xsigValue) <: Measurements.Measurement ||
641
641
# typeof(xsigValue) <: MonteCarloMeasurements.StaticParticles ||
642
642
# typeof(xsigValue) <: MonteCarloMeasurements.Particles )
643
643
# @info "\"$xsigName\" is of type " * string(typeof(xsigValue)) * " which is not supported for the x-axis."
644
- # @goto ERROR
644
+ # @goto ERROR
645
645
end
646
646
647
647
return (xsig, xsigLegend[1 ], ysig, ysigLegend, ysigKind)
@@ -685,7 +685,7 @@ Encodes a SignalTable suitable to convert to JSON format.
685
685
If a keyword signalNames with a vector of strings is provided, then only
686
686
the corresponding signals are encoded.
687
687
"""
688
- function encodeSignalTable (signalTable; signalNames= nothing )
688
+ function encodeSignalTable (signalTable; signalNames= nothing , log = false )
689
689
if isSignalTable (signalTable)
690
690
jdict = OrderedDict {String,Any} (" _class" => " SignalTable" ,
691
691
" _classVersion" => version_SignalTable_JSON)
@@ -699,7 +699,7 @@ function encodeSignalTable(signalTable; signalNames=nothing)
699
699
delete! (signal, :values )
700
700
delete! (signal, :value )
701
701
end
702
- encodedSignal = encodeSignalTableElement (name, signal)
702
+ encodedSignal = encodeSignalTableElement (name, signal, log = log )
703
703
if ! isnothing (encodedSignal)
704
704
jdict[name] = encodedSignal
705
705
end
@@ -712,78 +712,89 @@ end
712
712
713
713
714
714
"""
715
- jsigDict = encodeSignalTableElement(path, signalTableElement)
715
+ jsigDict = encodeSignalTableElement(path, signalTableElement; log=false )
716
716
717
717
Encodes a signal table element suitable to convert to JSON format.
718
718
"""
719
- function encodeSignalTableElement (path, element)
719
+ function encodeSignalTableElement (path, element; log = false )
720
720
if isSignal (element)
721
721
if isVar (element)
722
722
jdict = OrderedDict {String,Any} (" _class" => " Var" )
723
723
elseif isPar (element)
724
724
jdict = OrderedDict {String,Any} (" _class" => " Par" )
725
725
else
726
- jdict = OrderedDict {String,Any} (" _class" => " Map" )
726
+ jdict = OrderedDict {String,Any} (" _class" => " Map" )
727
727
end
728
- available = true
728
+ available = false
729
729
for (key,val) in element
730
730
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
735
734
jdict[string (key)] = encodedSignal
736
- end
735
+ end
737
736
end
738
737
end
739
738
if available
740
739
return jdict
741
740
else
742
741
return nothing
743
742
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
756
756
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
764
774
end
765
- return jdict
766
775
767
776
elseif string (typeof (element)) in TypesWithoutEncoding
768
777
return element
769
778
770
779
elseif typeof (element) <: Number
771
- elunit = unitAsParseableString (element)
780
+ elunit = unitAsParseableString (element)
772
781
if elunit == " "
773
- jdict = OrderedDict {String,Any} (" _class" => " Number" ,
774
- " type" => typeof (element),
782
+ jdict = OrderedDict {String,Any} (" _class" => " Number" ,
783
+ " type" => typeof (element),
775
784
" value" => element)
776
785
else
777
786
element = ustrip .(element)
778
- jdict = OrderedDict {String,Any} (" _class" => " Number" ,
787
+ jdict = OrderedDict {String,Any} (" _class" => " Number" ,
779
788
" unit" => elunit,
780
- " type" => typeof (element),
781
- " value" => element)
789
+ " type" => typeof (element),
790
+ " value" => element)
782
791
end
783
792
return jdict
784
-
793
+
785
794
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
787
798
return nothing
788
799
end
789
800
end
@@ -797,15 +808,15 @@ Returns a JSON string representation of signalTable
797
808
If keyword signalNames with a Vector of strings is provided, then a
798
809
signal table with the corresponding signals are returned as JSON string.
799
810
"""
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 )
802
813
return JSON. json (jsignalTable)
803
814
end
804
815
805
816
806
817
"""
807
818
writeSignalTable(filename::String, signalTable; signalNames=nothing, indent=nothing, log=false)
808
-
819
+
809
820
Write signalTable in JSON format on file `filename`.
810
821
811
822
If keyword signalNames with a Vector of strings is provided, then a
@@ -818,7 +829,7 @@ function writeSignalTable(filename::String, signalTable; signalNames = nothing,
818
829
if log
819
830
println (" Write signalTable in JSON format on file \" $file \" " )
820
831
end
821
- jsignalTable = encodeSignalTable (signalTable; signalNames= signalNames)
832
+ jsignalTable = encodeSignalTable (signalTable; signalNames= signalNames, log = log )
822
833
open (file, " w" ) do io
823
834
JSON. print (io, jsignalTable, indent)
824
835
end
0 commit comments