diff --git a/.gitignore b/.gitignore index e3201ad38..cffa5dfb6 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ Manifest.toml .ipynb_checkpoints *.ipynb .vscode* -*.gdml \ No newline at end of file +*.gdml +test/*h5 \ No newline at end of file diff --git a/test/IO.jl b/test/IO.jl deleted file mode 100644 index ac5832f31..000000000 --- a/test/IO.jl +++ /dev/null @@ -1,45 +0,0 @@ -using OrderedCollections -using LegendHDF5IO - -@testset "Read in different config file formats" begin - - # Create JSON file from YAML file - filename = SSD_examples[:InvertedCoax] - @test_nowarn SolidStateDetectors.yaml2json(filename) - - # Test read in using YAML, JSON and SigGen using Dict, OrderedDict and OrderedDict{String, Any} - for f in (filename, replace(filename, ".yaml" => ".json"), SSD_examples[:SigGen]) - @test isfile(f) - @testset "$(split(f, ".")[end])" begin - @test_nowarn SolidStateDetectors.parse_config_file(f) - @test_nowarn SolidStateDetectors.parse_config_file(f, dicttype = OrderedDict) - @test_nowarn SolidStateDetectors.parse_config_file(f, dicttype = OrderedDict{String, Any}) - end - end -end - -sim = Simulation(SSD_examples[:InvertedCoax]) - -@testset "Conversion Simulation <--> NamedTuple" begin - timed_calculate_electric_potential!(sim, verbose = false) - nt = NamedTuple(sim) - @test sim == Simulation(nt) - - timed_calculate_electric_field!(sim) - nt = NamedTuple(sim) - @test sim == Simulation(nt) - - timed_calculate_weighting_potential!(sim, 1, verbose = false) - nt = NamedTuple(sim) - @test sim == Simulation(nt) - - for i in findall(ismissing.(sim.weighting_potentials)) timed_calculate_weighting_potential!(sim, i, verbose = false) end - nt = NamedTuple(sim) - @test sim == Simulation(nt) -end - -@testset "Test LegendHDF5IO" begin - @test_nowarn ssd_write("legendhdf5io_test.lh5", sim) - @test_logs (:warn, "Destination `legendhdf5io_test.lh5` already exists. Overwriting...") ssd_write("legendhdf5io_test.lh5", sim) - @test sim == ssd_read("legendhdf5io_test.lh5", Simulation) -end \ No newline at end of file diff --git a/test/Project.toml b/test/Project.toml index 51c43169f..f041b1857 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,5 +1,7 @@ [deps] +ArraysOfArrays = "65a8f2f4-9b39-5baf-92e2-a9cc46fdf018" Geant4 = "559df036-b7a0-42fd-85df-7d5dd9d70f44" +LegendDataTypes = "99e09c13-5545-5ee2-bfa2-77f358fb75d8" LegendHDF5IO = "c9265ca6-b027-5446-b1a4-febfa8dd10b0" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" @@ -16,3 +18,4 @@ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [compat] LegendHDF5IO = "0.1" +LegendDataTypes = "0.1.3" diff --git a/test/runtests.jl b/test/runtests.jl index daae38bc1..bb3bc4dcb 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -248,33 +248,6 @@ end end -@timed_testset "Table Simulation" begin - sim = Simulation{T}(SSD_examples[:InvertedCoax]) - timed_simulate!(sim, convergence_limit = 1e-5, device_array_type = device_array_type, refinement_limits = [0.2, 0.1], verbose = false) - - evt_table = Table( - evtno = Int32[1], - detno = Int32[1], - thit = [T[0] * u"s"], - edep = [T[1] * u"eV"], - pos = [[SVector{3, T}.(0.01, 0.01, 0.01) * u"m"]] - ) - contact_charge_signals = timed_simulate_waveforms( - evt_table, - sim, - max_nsteps = 4000, - Δt = 1u"ns", - number_of_carriers = 20, - number_of_shells = 2, - verbose = false); - signalsum = T(0) - for i in 1:length(contact_charge_signals.waveform) - signalsum += abs(ustrip(contact_charge_signals.waveform[i].signal[end])) - end - signalsum *= inv(ustrip(SolidStateDetectors._convert_internal_energy_to_external_charge(sim.detector.semiconductor.material))) - @test isapprox( signalsum, T(2), atol = 5e-3 ) -end - @timed_testset "Isochrone" begin T = Float64 # to prevent rounding errors that might cause the final test to fail sim = Simulation{T}(SSD_examples[:IsochroneTest]) @@ -322,7 +295,7 @@ end end @timed_testset "IO" begin - include("IO.jl") + include("test_io.jl") end @timed_testset "Geant4 extension" begin diff --git a/test/test_io.jl b/test/test_io.jl new file mode 100644 index 000000000..10a1b9390 --- /dev/null +++ b/test/test_io.jl @@ -0,0 +1,112 @@ +# This file is a part of SolidStateDetectors.jl, licensed under the MIT License (MIT). + +using Test + +using SolidStateDetectors + +using ArraysOfArrays +using LegendHDF5IO +using OrderedCollections +using StaticArrays +using TypedTables +using Unitful + +include("test_utils.jl") + +@testset "Read in different config file formats" begin + + # Create JSON file from YAML file + filename = SSD_examples[:InvertedCoax] + @test_nowarn SolidStateDetectors.yaml2json(filename) + + # Test read in using YAML, JSON and SigGen using Dict, OrderedDict and OrderedDict{String, Any} + for f in (filename, replace(filename, ".yaml" => ".json"), SSD_examples[:SigGen]) + @test isfile(f) + @testset "$(split(f, ".")[end])" begin + @test_nowarn SolidStateDetectors.parse_config_file(f) + @test_nowarn SolidStateDetectors.parse_config_file(f, dicttype = OrderedDict) + @test_nowarn SolidStateDetectors.parse_config_file(f, dicttype = OrderedDict{String, Any}) + end + end +end + +sim = Simulation(SSD_examples[:InvertedCoax]) + +@testset "Conversion Simulation <--> NamedTuple" begin + timed_calculate_electric_potential!(sim, verbose = false) + nt = NamedTuple(sim) + @test sim == Simulation(nt) + + timed_calculate_electric_field!(sim) + nt = NamedTuple(sim) + @test sim == Simulation(nt) + + timed_calculate_weighting_potential!(sim, 1, verbose = false) + nt = NamedTuple(sim) + @test sim == Simulation(nt) + + for i in findall(ismissing.(sim.weighting_potentials)) timed_calculate_weighting_potential!(sim, i, verbose = false) end + nt = NamedTuple(sim) + @test sim == Simulation(nt) +end + +@testset "Test LegendHDF5IO" begin + @test_nowarn ssd_write("legendhdf5io_test.lh5", sim) + @test isfile("legendhdf5io_test.lh5") + @test_logs (:warn, "Destination `legendhdf5io_test.lh5` already exists. Overwriting...") ssd_write("legendhdf5io_test.lh5", sim) + @test sim == ssd_read("legendhdf5io_test.lh5", Simulation) + rm("legendhdf5io_test.lh5") +end + +@timed_testset "Table Simulation" begin + + T = Float32 + sim = Simulation{T}(SSD_examples[:InvertedCoax]) + timed_simulate!(sim, convergence_limit = 1e-5, device_array_type = device_array_type, refinement_limits = [0.2, 0.1], verbose = false) + + evt_table = Table( + evtno = Int32[1], + detno = Int32[1], + thit = VectorOfVectors([T[0] * u"s"]), + edep = VectorOfVectors([T[1] * u"eV"]), + pos = VectorOfVectors([[SVector{3, T}.(0.01, 0.01, 0.01) * u"m"]]) + ) + + contact_charge_signals = timed_simulate_waveforms( + evt_table, + sim, + max_nsteps = 4000, + Δt = 1u"ns", + number_of_carriers = 20, + number_of_shells = 2, + verbose = false); + + @timed_testset "Regular simulate_waveforms" begin + signalsum = T(0) + for i in 1:length(contact_charge_signals.waveform) + signalsum += abs(ustrip(contact_charge_signals.waveform[i].signal[end])) + end + signalsum *= inv(ustrip(SolidStateDetectors._convert_internal_energy_to_external_charge(sim.detector.semiconductor.material))) + @test isapprox( signalsum, T(2), atol = 5e-3 ) + end + + @timed_testset "LegendHDF5IO simulate_waveforms" begin + timed_simulate_waveforms( + evt_table, + sim, + ".", + chunk_n_physics_events = 1, + max_nsteps = 4000, + Δt = 1u"ns", + number_of_carriers = 20, + number_of_shells = 2, + verbose = false + ) + @info isfile("generated_waveforms_evts_1-1.h5") + @test contact_charge_signals == LegendHDF5IO.lh5open("generated_waveforms_evts_1-1.h5") do h5f + @test haskey(h5f, "generated_waveforms") + LegendHDF5IO.readdata(h5f.data_store, "generated_waveforms") + end + rm("generated_waveforms_evts_1-1.h5") + end +end \ No newline at end of file