Skip to content

Commit

Permalink
Fix of ModiaSim#6, minor improvement JSON generation.
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinOtter committed Sep 18, 2022
1 parent 502344d commit 0b0ed31
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 55 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "SignalTables"
uuid = "3201582d-3078-4276-ba5d-0a1254d79d7c"
authors = ["[email protected] <[email protected]>"]
version = "0.4.1"
version = "0.4.2"

[deps]
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Expand Down
7 changes: 7 additions & 0 deletions docs/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,13 @@ are different to the Python 2.x version.

## Release Notes

### Version 0.4.2

- Fix issue [#6](https://github.com/ModiaSim/SignalTables.jl/issues/6):
signalTableToDataFrame(..) is now working if the first signal is not a Var(..).

- Minor improvement in JSON generation.

### Version 0.4.1

- getSignalNames(signalTable; getVar=true, getPar=true, getMap=true): New keyword arguments
Expand Down
70 changes: 35 additions & 35 deletions src/ExampleSignalTables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

"""
getSignalTableExample(signalTableName::String; logTitle=true, logShowInfo=true)
Return an example signal table.
"""
function getSignalTableExample(signalTableName::String; logTitle=true, logShowInfo=true)::SignalTable
Expand All @@ -15,18 +15,18 @@ if logTitle
end

if signalTableName == "OneScalarSignal"

t = range(0.0, stop=10.0, length=100)

sigTable = SignalTable(
"time" => Var(values = t, independent=true),
"phi" => Var(values = sin.(t))
)

elseif signalTableName == "OneScalarSignalWithUnit"

t = range(0.0, stop=10.0, length=100)

sigTable = SignalTable(
"time" => Var(values = t, unit="s", independent=true),
"phi" => Var(values = sin.(t), unit="rad")
Expand All @@ -40,46 +40,46 @@ elseif signalTableName == "OneVectorSignalWithUnit"
"r" => Var(values = [0.4*cos.(t) 0.5*sin.(t) 0.3*cos.(t)], unit="m"),
)

elseif signalTableName == "OneMatrixSignal"
elseif signalTableName == "OneMatrixSignal"

t = range(0.0, stop=1.0, length=10)

offset = Float64[11 12 13;
21 22 23]
matrix = Array{Float64,3}(undef,length(t),2,3)
for i = 1:length(t), j = 1:2, k=1:3
matrix[i,j,k] = offset[j,k] + 0.3*sin(t[i])
end
sigTable = SignalTable(

sigTable = SignalTable(
"time" => Var(values = t, independent=true),
"matrix" => Var(values = matrix)
)
elseif signalTableName == "OneMatrixSignalWithMatrixUnits"

elseif signalTableName == "OneMatrixSignalWithMatrixUnits"

t = range(0.0, stop=1.0, length=10)

offset = Float64[11 12 13;
21 22 23]
matrix = Array{Float64,3}(undef,length(t),2,3)
for i = 1:length(t), j = 1:2, k=1:3
matrix[i,j,k] = offset[j,k] + 0.3*sin(t[i])
end
sigTable = SignalTable(

sigTable = SignalTable(
"time" => Var(values = t, unit="s", independent=true),
"matrix" => Var(values = matrix, unit=["m" "m/s" "m/s^2";
"rad" "rad/s" "rad/s^2"])
)

elseif signalTableName == "ConstantSignals"

t = range(0.0, stop=1.0, length=5)

matrix = Float64[11 12 13;
21 22 23]

sigTable = SignalTable(
"time" => Var(values = t, unit="s", independent=true),
"phi_max" => Par(value = 1.1f0, unit="rad"),
Expand All @@ -97,35 +97,36 @@ elseif signalTableName == "MissingValues"
time1 = 0.0 : 0.1 : 3.0
time2 = 3.0 : 0.1 : 11.0
time3 = 11.0 : 0.1 : 15
t = vcat(time1,time2,time3)
t = vcat(time1,time2,time3)
sigC = vcat(fill(missing,length(time1)), 0.6*cos.(time2.+0.5), fill(missing,length(time3)))

function sigD(t, time1, time2)
sig = Vector{Union{Missing,Float64}}(undef, length(t))

j = 1
for i = length(time1)+1:length(time1)+length(time2)
if j == 1
if j == 1
sig[i] = 0.5*cos(t[i])
end
j = j > 3 ? 1 : j+1
end
return sig
end

sigTable = SignalTable(
"time" => Var(values=t, unit="s", independent=true),
"load.r" => Var(values=0.4*[sin.(t) cos.(t) sin.(t)], unit="m"),
"load.r" => Var(values=0.4*[sin.(t) cos.(t) sin.(t)], unit="m"),
"sigA" => Var(values=0.5*sin.(t), unit="m"),
"sigB" => Var(values=1.1*sin.(t), unit="m/s"),
"sigC" => Var(values=sigC, unit="N*m"),
"sigD" => Var(values=sigD(t, time1, time2), unit="rad/s", variability="clocked", info="Motor angular velocity")
)
"sigD" => Var(values=sigD(t, time1, time2), unit="rad/s", variability="clocked", info="Motor angular velocity")
)

elseif signalTableName == "VariousTypes"

t = 0.0:0.1:0.5
sigTable = SignalTable(
"_attributes" => Map(experiment=Map(stoptime=0.5, interval=0.01)),
"time" => Var(values= t, unit="s", independent=true),
"load.r" => Var(values= [sin.(t) cos.(t) sin.(t)], unit="m"),
"motor.angle" => Var(values= sin.(t), unit="rad", state=true, der="motor.w"),
Expand All @@ -135,17 +136,16 @@ elseif signalTableName == "VariousTypes"
"wm" => Var(alias = "motor.w"),
"ref.clock" => Var(values= [true, missing, missing, true, missing, missing],
variability="clock"),

"motor.w_c" => Var(values= [0.6, missing, missing, 0.8, missing, missing],
variability="clocked", clock="ref.clock"),

"motor.inertia" => Par(value = 0.02f0, unit="kg*m/s^2"),
"motor.data" => Par(value = "resources/motorMap.json"),
"attributes" => Map(experiment=Map(stoptime=0.5, interval=0.01))
"motor.data" => Par(value = "resources/motorMap.json")
)

else
error("getSignalTableExample(\"$signalTableName\"): unknown name.")
error("getSignalTableExample(\"$signalTableName\"): unknown name.")
end

if logShowInfo
Expand Down
19 changes: 14 additions & 5 deletions src/SignalTableFunctions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -754,11 +754,20 @@ function encodeSignalTableElement(path, element; log=false)
else
elunit = unitAsParseableString(element)
if elunit == ""
jdict = OrderedDict{String,Any}("_class" => "Array",
"eltype" => replace(string(eltype(element)), " " => ""),
"size" => Int[i for i in size(element)],
"layout" => "column-major",
"values" => reshape(element, length(element)))
if ndims(element) == 1
jdict = OrderedDict{String,Any}("_class" => "Array",
"eltype" => replace(string(eltype(element)), " " => ""),
"size" => Int[i for i in size(element)],
"values" => element
)
else
jdict = OrderedDict{String,Any}("_class" => "Array",
"eltype" => replace(string(eltype(element)), " " => ""),
"size" => Int[i for i in size(element)],
"layout" => "column-major",
"values" => reshape(element, length(element))
)
end
else
element = ustrip.(element)
jdict = OrderedDict{String,Any}("_class" => "Array",
Expand Down
18 changes: 6 additions & 12 deletions src/SignalTableInterface_DataFrames.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,17 @@ hasSignal( obj::DataFrames.DataFrame, name::String) = haskey(obj, name)
Returns a signal table as [DataFrame](https://github.com/JuliaData/DataFrames.jl) object.
"""
function signalTableToDataFrame(sigTable)::DataFrames.DataFrame
names = getSignalNames(sigTable)
names = getSignalNames(sigTable; getPar=false, getMap=false)
name = names[1]
df = DataFrames.DataFrame(name = getSignal(sigTable,name)[:values])
for i in 2:length(names)
name = names[i]
sig = getSignal(sigTable,name)
if isVar(sig)
sigValues = sig[:values]
if typeof(sigValues) <: AbstractVector
df[!,name] = sig[:values]
else
@info "$name::$(typeof(sigValues)) is ignored, because no Vector"
end
elseif isPar(sig)
@info "$name is ignored, because Par(..) signal."
else
@info "$name::$(typeof(sig)) is ignored, because no Var(..) signal"
sigValues = sig[:values]
if typeof(sigValues) <: AbstractVector
df[!,name] = sig[:values]
else
@info "$name::$(typeof(sigValues)) is ignored, because no Vector"
end
end
return df
Expand Down
4 changes: 2 additions & 2 deletions src/SignalTables.jl
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
module SignalTables

const path = dirname(dirname(@__FILE__))
const version = "0.4.1"
const version_SignalTable_JSON = "0.4.1" # version tag to be stored in JSON files
const version = "0.4.2"
const version_SignalTable_JSON = "0.4.2" # version tag to be stored in JSON files

using OrderedCollections
using Unitful
Expand Down
21 changes: 21 additions & 0 deletions test/SignalTableFunctions/test_json.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,25 @@ signalTable1 = SignalTable(

writeSignalTable("test_json_signalTable1.json", signalTable1, log=true, indent=2)


t = 0.0:0.1:10.0
tc = [rem(i,5) == 0 ? div(i,5)+1 : missing for i in 0:length(t)-1]
sigTable2 = SignalTable(
"_attributes" => Map(experiment=Map(stopTime=10.0, interval=0.1)),
"time" => Var(values = t, unit="s", independent=true),
"motor.angle" => Var(values = sin.(t), unit="rad", der="motor.w"),
"motor.w" => Var(values = cos.(t), unit="rad/s"),
"motor.w_ref" => Var(values = 0.9*cos.(t), unit="rad/s"),
"baseClock" => Var(values = tc, variability="clock"),
"motor.w_c" => Var(values = 1.2*cos.((tc.-1)/2), unit="rad/s",
variability="clocked", clock="baseClock"),
"motor.file" => Par(value = "motormap.json",
info = "File name of motor characteristics")
)
showInfo(sigTable2)
@usingPlotPackage
plot(sigTable2, ("motor.w", "motor.w_c"), figure=2)
plot(sigTable2, "motor.w_c", xAxis="baseClock", figure=3)
writeSignalTable("sigTable2.json", sigTable2, log=true, indent=2)

end

0 comments on commit 0b0ed31

Please sign in to comment.