4242
4343"""
4444 new_signal_table(args...)::OrderedDict{String,Any}
45-
45+
4646Returns a new signal table, that is `OrderedDict{String,Any}("_class" => :SignalTable, args...)`
4747"""
4848new_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
341341end
342342
@@ -362,7 +362,7 @@ function getValuesFromPar(signal, len::Int)
362362 end
363363 return nothing
364364end
365-
365+
366366
367367"""
368368 signal = getFlattenedSignal(signalTable, name;
371371 targetFloat = Float64)
372372
373373Returns 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]`.
375375A 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].
396396function 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,\n but 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.
685685If a keyword signalNames with a vector of strings is provided, then only
686686the 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
717717Encodes 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
789800end
@@ -797,15 +808,15 @@ Returns a JSON string representation of signalTable
797808If keyword signalNames with a Vector of strings is provided, then a
798809signal 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)
803814end
804815
805816
806817"""
807818 writeSignalTable(filename::String, signalTable; signalNames=nothing, indent=nothing, log=false)
808-
819+
809820Write signalTable in JSON format on file `filename`.
810821
811822If 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