edfize 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +8 -0
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +5 -5
- data/bin/edfize +1 -1
- data/edfize.gemspec +14 -15
- data/lib/edfize.rb +12 -13
- data/lib/edfize/color.rb +100 -0
- data/lib/edfize/edf.rb +25 -25
- data/lib/edfize/signal.rb +12 -12
- data/lib/edfize/tests.rb +7 -6
- data/lib/edfize/tests/check_length.rb +1 -1
- data/lib/edfize/tests/check_reserved_area.rb +3 -3
- data/lib/edfize/tests/check_reserved_signal_areas.rb +3 -3
- data/lib/edfize/tests/check_valid_date.rb +4 -4
- data/lib/edfize/tests/runner.rb +2 -2
- data/lib/edfize/version.rb +2 -2
- metadata +10 -25
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 21f8f9617f5e6d1c818d67dda16fdb99b21c67e806f75c42370a3343677f4036
|
|
4
|
+
data.tar.gz: 1fd626022ab4a611ed4eb887ae49b95e3170b36fbe973667f15ab59ad09feef0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c6700a8b4d773ca43c77898eebd4af4e8f117f7c5a8db812b95fb0c99a0e9905c319e7c377c65e34e7e7786314cfa4afbd7ee74898991bb5656c70a47e3bec1b
|
|
7
|
+
data.tar.gz: e6e83fec87ff8a7eb2c317da7a5114fa9553261d8c4af298d651a75282f198a648534f66ffb060a10f7fe52296900de6d14d66b7a6465f9dfb6e1b11be001bd0
|
data/CHANGELOG.md
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# Edfize
|
|
2
2
|
|
|
3
|
-
[](https://gemnasium.com/sleepepi/edfize)
|
|
3
|
+
[](https://travis-ci.com/sleepepi/edfize)
|
|
5
4
|
[](https://codeclimate.com/github/sleepepi/edfize)
|
|
6
5
|
|
|
7
6
|
Ruby gem used to load, validate, and parse European Data Format files. Used for
|
|
8
|
-
batch testing EDFs for errors. Ruby 2.
|
|
7
|
+
batch testing EDFs for errors. Ruby 2.6+ compatible.
|
|
9
8
|
|
|
10
9
|
## Installation
|
|
11
10
|
|
|
@@ -69,10 +68,10 @@ start date of 1st Jan 1985.
|
|
|
69
68
|
# gem install edfize --no-document
|
|
70
69
|
# ruby rewrite_signal_date.rb
|
|
71
70
|
|
|
72
|
-
require
|
|
73
|
-
require
|
|
71
|
+
require "rubygems"
|
|
72
|
+
require "edfize"
|
|
74
73
|
|
|
75
|
-
CLIPPING_DATE =
|
|
74
|
+
CLIPPING_DATE = "01.01.85"
|
|
76
75
|
|
|
77
76
|
Edfize.edfs do |edf|
|
|
78
77
|
edf.update(start_date_of_recording: CLIPPING_DATE)
|
|
@@ -97,23 +96,23 @@ EDF signals into arrays for analysis.
|
|
|
97
96
|
# https://sleepdata.org/datasets/shhs/files/edfs/shhs1?f=shhs1-200001.edf
|
|
98
97
|
#
|
|
99
98
|
|
|
100
|
-
require
|
|
101
|
-
require
|
|
99
|
+
require "rubygems"
|
|
100
|
+
require "edfize"
|
|
102
101
|
|
|
103
102
|
# Loads the file and reads the EDF Header
|
|
104
|
-
edf = Edfize::Edf.new(
|
|
103
|
+
edf = Edfize::Edf.new("shhs1-200001.edf")
|
|
105
104
|
|
|
106
105
|
# Loads the data section of the EDF into Signal objects
|
|
107
106
|
edf.load_signals
|
|
108
107
|
|
|
109
108
|
# Print out information on the signals
|
|
110
|
-
puts "EDF #{edf.filename} contains the following #{edf.signals.count} signal#{
|
|
109
|
+
puts "EDF #{edf.filename} contains the following #{edf.signals.count} signal#{"s" unless edf.signals.count == 1}:\n\n"
|
|
111
110
|
|
|
112
111
|
edf.signals.each do |signal|
|
|
113
112
|
puts "Signal"
|
|
114
113
|
puts " Label : #{signal.label}"
|
|
115
114
|
puts " Samples Per Data Record : #{signal.samples_per_data_record}"
|
|
116
|
-
puts " First 10 Physical Values : #{(signal.physical_values[0..10] + [
|
|
115
|
+
puts " First 10 Physical Values : #{(signal.physical_values[0..10] + ["..."]).inspect}\n\n"
|
|
117
116
|
end
|
|
118
117
|
```
|
|
119
118
|
|
data/Rakefile
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "bundler/gem_tasks"
|
|
4
4
|
|
|
5
|
-
require
|
|
5
|
+
require "rake/testtask"
|
|
6
6
|
|
|
7
7
|
Rake::TestTask.new(:test) do |t|
|
|
8
|
-
t.libs <<
|
|
9
|
-
t.libs <<
|
|
10
|
-
t.pattern =
|
|
8
|
+
t.libs << "lib"
|
|
9
|
+
t.libs << "test"
|
|
10
|
+
t.pattern = "test/**/*_test.rb"
|
|
11
11
|
t.warning = false
|
|
12
12
|
t.verbose = false
|
|
13
13
|
end
|
data/bin/edfize
CHANGED
data/edfize.gemspec
CHANGED
|
@@ -8,27 +8,26 @@
|
|
|
8
8
|
# gem list -r edfize
|
|
9
9
|
# gem install edfize
|
|
10
10
|
|
|
11
|
-
lib = File.expand_path(
|
|
11
|
+
lib = File.expand_path("lib", __dir__)
|
|
12
12
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
13
|
-
require
|
|
13
|
+
require "edfize/version"
|
|
14
14
|
|
|
15
15
|
Gem::Specification.new do |spec|
|
|
16
|
-
spec.name =
|
|
16
|
+
spec.name = "edfize"
|
|
17
17
|
spec.version = Edfize::VERSION::STRING
|
|
18
|
-
spec.authors = [
|
|
19
|
-
spec.email = [
|
|
20
|
-
spec.summary =
|
|
21
|
-
spec.description =
|
|
22
|
-
Run `edfize` on command line to view full list of options.
|
|
23
|
-
spec.homepage =
|
|
24
|
-
spec.license =
|
|
18
|
+
spec.authors = ["Remo Mueller"]
|
|
19
|
+
spec.email = ["remosm@gmail.com"]
|
|
20
|
+
spec.summary = "Load, validate, and parse European Data Format files. Used for batch testing EDFs for errors."
|
|
21
|
+
spec.description = "Load, validate, and parse European Data Format files. Used for batch testing EDFs for errors. \
|
|
22
|
+
Run `edfize` on command line to view full list of options."
|
|
23
|
+
spec.homepage = "https://github.com/sleepepi/edfize"
|
|
24
|
+
spec.license = "MIT"
|
|
25
25
|
|
|
26
|
-
spec.files = Dir[
|
|
26
|
+
spec.files = Dir["{bin,lib}/**/*"] + %w(CHANGELOG.md LICENSE Rakefile README.md edfize.gemspec)
|
|
27
27
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
28
28
|
spec.test_files = spec.files.grep(%r{^(test)/})
|
|
29
|
-
spec.require_paths = [
|
|
29
|
+
spec.require_paths = ["lib"]
|
|
30
30
|
|
|
31
|
-
spec.add_dependency
|
|
32
|
-
spec.add_dependency
|
|
33
|
-
spec.add_dependency 'rake'
|
|
31
|
+
spec.add_dependency "bundler", ">= 1.3.0"
|
|
32
|
+
spec.add_dependency "rake"
|
|
34
33
|
end
|
data/lib/edfize.rb
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
|
|
7
|
-
require 'colorize'
|
|
3
|
+
require "edfize/edf"
|
|
4
|
+
require "edfize/tests"
|
|
5
|
+
require "edfize/version"
|
|
6
|
+
require "edfize/color"
|
|
8
7
|
|
|
9
8
|
# Loads EDFs, prints information, runs tests
|
|
10
9
|
module Edfize
|
|
11
10
|
def self.launch(argv)
|
|
12
11
|
case argv.first.to_s.scan(/\w/).first
|
|
13
|
-
when
|
|
12
|
+
when "v"
|
|
14
13
|
version
|
|
15
|
-
when
|
|
14
|
+
when "c", "t"
|
|
16
15
|
check(argv[1..-1])
|
|
17
|
-
when
|
|
16
|
+
when "r"
|
|
18
17
|
print_headers
|
|
19
18
|
else
|
|
20
19
|
help
|
|
@@ -22,10 +21,10 @@ module Edfize
|
|
|
22
21
|
end
|
|
23
22
|
|
|
24
23
|
def self.print_headers
|
|
25
|
-
puts
|
|
24
|
+
puts "----------------"
|
|
26
25
|
edfs.each do |edf|
|
|
27
26
|
edf.print_header
|
|
28
|
-
puts
|
|
27
|
+
puts "----------------"
|
|
29
28
|
end
|
|
30
29
|
end
|
|
31
30
|
|
|
@@ -39,7 +38,7 @@ module Edfize
|
|
|
39
38
|
test_count = 0
|
|
40
39
|
failure_count = 0
|
|
41
40
|
total_edfs = edf_paths.count
|
|
42
|
-
show_passing = argv.include?(
|
|
41
|
+
show_passing = argv.include?("--failing") ? false : true
|
|
43
42
|
puts "Started\n"
|
|
44
43
|
edfs.each do |edf|
|
|
45
44
|
runner = Edfize::Tests::Runner.new(edf, argv)
|
|
@@ -50,7 +49,7 @@ module Edfize
|
|
|
50
49
|
print "\rChecked EDF #{edf_count} of #{total_edfs}" unless show_passing || !runner.tests_failed.zero?
|
|
51
50
|
end
|
|
52
51
|
puts "\nFinished in #{Time.now - test_start_time}s"
|
|
53
|
-
puts "#{edf_count} EDF#{
|
|
52
|
+
puts "#{edf_count} EDF#{"s" unless edf_count == 1}, #{test_count} test#{"s" unless test_count == 1}, " + "#{failure_count} failure#{"s" unless failure_count == 1}".send(failure_count == 0 ? :green : :red)
|
|
54
53
|
end
|
|
55
54
|
|
|
56
55
|
def self.help
|
|
@@ -81,7 +80,7 @@ EOT
|
|
|
81
80
|
end
|
|
82
81
|
|
|
83
82
|
def self.edf_paths(recursive: true)
|
|
84
|
-
path = "#{
|
|
83
|
+
path = "#{"**/" if recursive}*.edf"
|
|
85
84
|
Dir.glob(path, File::FNM_CASEFOLD)
|
|
86
85
|
end
|
|
87
86
|
end
|
data/lib/edfize/color.rb
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Adds ANSI colors to string class.
|
|
4
|
+
class String
|
|
5
|
+
def black
|
|
6
|
+
"\e[30m#{self}\e[0m"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def red
|
|
10
|
+
"\e[31m#{self}\e[0m"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def green
|
|
14
|
+
"\e[32m#{self}\e[0m"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def brown
|
|
18
|
+
"\e[33m#{self}\e[0m"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def yellow
|
|
22
|
+
brown
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def blue
|
|
26
|
+
"\e[34m#{self}\e[0m"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def magenta
|
|
30
|
+
"\e[35m#{self}\e[0m"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def cyan
|
|
34
|
+
"\e[36m#{self}\e[0m"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def gray
|
|
38
|
+
"\e[37m#{self}\e[0m"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def white
|
|
42
|
+
"\e[39m#{bold}\e[0m"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def bg_black
|
|
46
|
+
"\e[40m#{self}\e[0m"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def bg_red
|
|
50
|
+
"\e[41m#{self}\e[0m"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def bg_green
|
|
54
|
+
"\e[42m#{self}\e[0m"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def bg_brown
|
|
58
|
+
"\e[43m#{self}\e[0m"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def bg_blue
|
|
62
|
+
"\e[44m#{self}\e[0m"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def bg_magenta
|
|
66
|
+
"\e[45m#{self}\e[0m"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def bg_cyan
|
|
70
|
+
"\e[46m#{self}\e[0m"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def bg_gray
|
|
74
|
+
"\e[47m#{self}\e[0m"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def bold
|
|
78
|
+
"\e[1m#{self}\e[22m"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def italic
|
|
82
|
+
"\e[3m#{self}\e[23m"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def underline
|
|
86
|
+
"\e[4m#{self}\e[24m"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def blink
|
|
90
|
+
"\e[5m#{self}\e[25m"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def reverse_color
|
|
94
|
+
"\e[7m#{self}\e[27m"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def colorless
|
|
98
|
+
gsub(/\e\[\d{1,2}m/, "")
|
|
99
|
+
end
|
|
100
|
+
end
|
data/lib/edfize/edf.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require "edfize/signal"
|
|
4
|
+
require "date"
|
|
5
5
|
|
|
6
6
|
module Edfize
|
|
7
7
|
# Class used to load and manipulate EDFs
|
|
@@ -24,16 +24,16 @@ module Edfize
|
|
|
24
24
|
attr_accessor :signals
|
|
25
25
|
|
|
26
26
|
HEADER_CONFIG = {
|
|
27
|
-
version: { size: 8, after_read: :to_i, name:
|
|
28
|
-
local_patient_identification: { size: 80, after_read: :strip, name:
|
|
29
|
-
local_recording_identification: { size: 80, after_read: :strip, name:
|
|
30
|
-
start_date_of_recording: { size: 8, name:
|
|
31
|
-
start_time_of_recording: { size: 8, name:
|
|
32
|
-
number_of_bytes_in_header: { size: 8, after_read: :to_i, name:
|
|
33
|
-
reserved: { size: 44, name:
|
|
34
|
-
number_of_data_records: { size: 8, after_read: :to_i, name:
|
|
35
|
-
duration_of_a_data_record: { size: 8, after_read: :to_i, name:
|
|
36
|
-
number_of_signals: { size: 4, after_read: :to_i, name:
|
|
27
|
+
version: { size: 8, after_read: :to_i, name: "Version" },
|
|
28
|
+
local_patient_identification: { size: 80, after_read: :strip, name: "Local Patient Identification" },
|
|
29
|
+
local_recording_identification: { size: 80, after_read: :strip, name: "Local Recording Identification" },
|
|
30
|
+
start_date_of_recording: { size: 8, name: "Start Date of Recording", description: "(dd.mm.yy)" },
|
|
31
|
+
start_time_of_recording: { size: 8, name: "Start Time of Recording", description: "(hh.mm.ss)"},
|
|
32
|
+
number_of_bytes_in_header: { size: 8, after_read: :to_i, name: "Number of Bytes in Header" },
|
|
33
|
+
reserved: { size: 44, name: "Reserved" },
|
|
34
|
+
number_of_data_records: { size: 8, after_read: :to_i, name: "Number of Data Records" },
|
|
35
|
+
duration_of_a_data_record: { size: 8, after_read: :to_i, name: "Duration of a Data Record", units: "second" },
|
|
36
|
+
number_of_signals: { size: 4, after_read: :to_i, name: "Number of Signals" }
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
HEADER_OFFSET = HEADER_CONFIG.collect{|k,h| h[:size]}.inject(:+)
|
|
@@ -97,17 +97,17 @@ module Edfize
|
|
|
97
97
|
|
|
98
98
|
def section_units(section)
|
|
99
99
|
units = HEADER_CONFIG[section][:units].to_s
|
|
100
|
-
if units ==
|
|
101
|
-
|
|
100
|
+
if units == ""
|
|
101
|
+
""
|
|
102
102
|
else
|
|
103
|
-
" #{units}" + (instance_variable_get("@#{section}") == 1 ?
|
|
103
|
+
" #{units}" + (instance_variable_get("@#{section}") == 1 ? "" : "s")
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
def section_description(section)
|
|
108
108
|
description = HEADER_CONFIG[section][:description].to_s
|
|
109
|
-
if description ==
|
|
110
|
-
|
|
109
|
+
if description == ""
|
|
110
|
+
""
|
|
111
111
|
else
|
|
112
112
|
" #{description}"
|
|
113
113
|
end
|
|
@@ -118,7 +118,7 @@ module Edfize
|
|
|
118
118
|
puts "Total File Size : #{edf_size} bytes"
|
|
119
119
|
puts "\nHeader Information"
|
|
120
120
|
HEADER_CONFIG.each do |section, hash|
|
|
121
|
-
puts "#{hash[:name]}#{
|
|
121
|
+
puts "#{hash[:name]}#{" "*(31 - hash[:name].size)}: " + section_value_to_string(section) + section_units(section) + section_description(section)
|
|
122
122
|
end
|
|
123
123
|
puts "\nSignal Information"
|
|
124
124
|
signals.each_with_index do |signal, index|
|
|
@@ -136,7 +136,7 @@ module Edfize
|
|
|
136
136
|
end
|
|
137
137
|
|
|
138
138
|
def start_date
|
|
139
|
-
(dd, mm, yy) = start_date_of_recording.split(
|
|
139
|
+
(dd, mm, yy) = start_date_of_recording.split(".")
|
|
140
140
|
dd = parse_integer(dd)
|
|
141
141
|
mm = parse_integer(mm)
|
|
142
142
|
yy = parse_integer(yy)
|
|
@@ -145,13 +145,13 @@ module Edfize
|
|
|
145
145
|
else
|
|
146
146
|
yy + 2000
|
|
147
147
|
end
|
|
148
|
-
Date.strptime("#{mm}/#{dd}/#{yyyy}",
|
|
148
|
+
Date.strptime("#{mm}/#{dd}/#{yyyy}", "%m/%d/%Y")
|
|
149
149
|
rescue
|
|
150
150
|
nil
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
def parse_integer(string)
|
|
154
|
-
Integer(format(
|
|
154
|
+
Integer(format("%g", string))
|
|
155
155
|
rescue
|
|
156
156
|
nil
|
|
157
157
|
end
|
|
@@ -181,7 +181,7 @@ module Edfize
|
|
|
181
181
|
|
|
182
182
|
def read_header_section(section)
|
|
183
183
|
result = IO.binread(@filename, HEADER_CONFIG[section][:size], compute_offset(section) )
|
|
184
|
-
result = result.to_s.send(HEADER_CONFIG[section][:after_read]) unless HEADER_CONFIG[section][:after_read].to_s ==
|
|
184
|
+
result = result.to_s.send(HEADER_CONFIG[section][:after_read]) unless HEADER_CONFIG[section][:after_read].to_s == ""
|
|
185
185
|
self.instance_variable_set("@#{section}", result)
|
|
186
186
|
end
|
|
187
187
|
|
|
@@ -230,7 +230,7 @@ module Edfize
|
|
|
230
230
|
(0..ns-1).to_a.each do |signal_number|
|
|
231
231
|
section_size = Signal::SIGNAL_CONFIG[section][:size]
|
|
232
232
|
result = IO.binread(@filename, section_size, offset+(signal_number*section_size))
|
|
233
|
-
result = result.to_s.send(Signal::SIGNAL_CONFIG[section][:after_read]) unless Signal::SIGNAL_CONFIG[section][:after_read].to_s ==
|
|
233
|
+
result = result.to_s.send(Signal::SIGNAL_CONFIG[section][:after_read]) unless Signal::SIGNAL_CONFIG[section][:after_read].to_s == ""
|
|
234
234
|
@signals[signal_number].send("#{section}=", result)
|
|
235
235
|
end
|
|
236
236
|
end
|
|
@@ -246,7 +246,7 @@ module Edfize
|
|
|
246
246
|
length_of_bytes_to_read = (data_records_to_retrieve+1) * size_of_data_record_in_bytes
|
|
247
247
|
epoch_offset_size = epoch_number * epoch_size * size_of_data_record_in_bytes # TODO: The size in bytes of an epoch
|
|
248
248
|
|
|
249
|
-
all_signal_data = (IO.binread(@filename, length_of_bytes_to_read, size_of_header + epoch_offset_size).unpack(
|
|
249
|
+
all_signal_data = (IO.binread(@filename, length_of_bytes_to_read, size_of_header + epoch_offset_size).unpack("s<*") rescue [])
|
|
250
250
|
load_signal_data(all_signal_data, data_records_to_retrieve+1)
|
|
251
251
|
end
|
|
252
252
|
|
|
@@ -254,7 +254,7 @@ module Edfize
|
|
|
254
254
|
# 16-bit signed integer in "Little Endian" format (least significant byte first)
|
|
255
255
|
# unpack: s< 16-bit signed, (little-endian) byte order
|
|
256
256
|
def load_digital_signals
|
|
257
|
-
all_signal_data = IO.binread(@filename, nil, size_of_header).unpack(
|
|
257
|
+
all_signal_data = IO.binread(@filename, nil, size_of_header).unpack("s<*")
|
|
258
258
|
load_signal_data(all_signal_data, @number_of_data_records)
|
|
259
259
|
end
|
|
260
260
|
|
data/lib/edfize/signal.rb
CHANGED
|
@@ -9,16 +9,16 @@ module Edfize
|
|
|
9
9
|
:reserved_area, :digital_values, :physical_values
|
|
10
10
|
|
|
11
11
|
SIGNAL_CONFIG = {
|
|
12
|
-
label: { size: 16, after_read: :strip, name:
|
|
13
|
-
transducer_type: { size: 80, after_read: :strip, name:
|
|
14
|
-
physical_dimension: { size: 8, after_read: :strip, name:
|
|
15
|
-
physical_minimum: { size: 8, after_read: :to_f, name:
|
|
16
|
-
physical_maximum: { size: 8, after_read: :to_f, name:
|
|
17
|
-
digital_minimum: { size: 8, after_read: :to_i, name:
|
|
18
|
-
digital_maximum: { size: 8, after_read: :to_i, name:
|
|
19
|
-
prefiltering: { size: 80, after_read: :strip, name:
|
|
20
|
-
samples_per_data_record: { size: 8, after_read: :to_i, name:
|
|
21
|
-
reserved_area: { size: 32, name:
|
|
12
|
+
label: { size: 16, after_read: :strip, name: "Label" },
|
|
13
|
+
transducer_type: { size: 80, after_read: :strip, name: "Transducer Type" },
|
|
14
|
+
physical_dimension: { size: 8, after_read: :strip, name: "Physical Dimension" },
|
|
15
|
+
physical_minimum: { size: 8, after_read: :to_f, name: "Physical Minimum" },
|
|
16
|
+
physical_maximum: { size: 8, after_read: :to_f, name: "Physical Maximum" },
|
|
17
|
+
digital_minimum: { size: 8, after_read: :to_i, name: "Digital Minimum" },
|
|
18
|
+
digital_maximum: { size: 8, after_read: :to_i, name: "Digital Maximum" },
|
|
19
|
+
prefiltering: { size: 80, after_read: :strip, name: "Prefiltering" },
|
|
20
|
+
samples_per_data_record: { size: 8, after_read: :to_i, name: "Samples Per Data Record" },
|
|
21
|
+
reserved_area: { size: 32, name: "Reserved Area" }
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
def initialize
|
|
@@ -35,13 +35,13 @@ module Edfize
|
|
|
35
35
|
|
|
36
36
|
def print_header
|
|
37
37
|
SIGNAL_CONFIG.each do |section, hash|
|
|
38
|
-
puts " #{hash[:name]}#{
|
|
38
|
+
puts " #{hash[:name]}#{" " * (29 - hash[:name].size)}: " + self.send(section).to_s
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
# Physical value (dimension PhysiDim) = (ASCIIvalue-DigiMin)*(PhysiMax-PhysiMin)/(DigiMax-DigiMin) + PhysiMin.
|
|
43
43
|
def calculate_physical_values!
|
|
44
|
-
@physical_values = @digital_values.collect{|sample| ((
|
|
44
|
+
@physical_values = @digital_values.collect{|sample| ((sample - @digital_minimum) * (@physical_maximum - @physical_minimum) / (@digital_maximum - @digital_minimum) + @physical_minimum rescue nil) }
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def samples
|
data/lib/edfize/tests.rb
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require
|
|
3
|
+
require "edfize/color"
|
|
4
|
+
require "edfize/tests/result"
|
|
5
|
+
require "edfize/tests/runner"
|
|
6
|
+
require "edfize/tests/check_length"
|
|
7
|
+
require "edfize/tests/check_reserved_area"
|
|
8
|
+
require "edfize/tests/check_reserved_signal_areas"
|
|
9
|
+
require "edfize/tests/check_valid_date"
|
|
9
10
|
|
|
10
11
|
module Edfize
|
|
11
12
|
module Tests
|
|
@@ -8,7 +8,7 @@ module Edfize
|
|
|
8
8
|
def test_expected_length(runner)
|
|
9
9
|
result = Result.new
|
|
10
10
|
result.passes = (runner.edf.expected_edf_size == runner.edf.edf_size)
|
|
11
|
-
result.pass_fail = " #{result.passes ?
|
|
11
|
+
result.pass_fail = " #{result.passes ? "PASS" : "FAIL"}".send(result.passes ? :green : :red) + " Expected File Size"
|
|
12
12
|
result.expected = " Expected : #{runner.edf.expected_edf_size} bytes"
|
|
13
13
|
result.actual = " Actual : #{runner.edf.edf_size} bytes"
|
|
14
14
|
result
|
|
@@ -6,9 +6,9 @@ module Edfize
|
|
|
6
6
|
module CheckReservedArea
|
|
7
7
|
def test_reserved_area_blank(runner)
|
|
8
8
|
result = Result.new
|
|
9
|
-
result.passes = (runner.edf.reserved ==
|
|
10
|
-
result.pass_fail = " #{result.passes ?
|
|
11
|
-
result.expected = " Expected : #{(
|
|
9
|
+
result.passes = (runner.edf.reserved == " " * Edf::RESERVED_SIZE)
|
|
10
|
+
result.pass_fail = " #{result.passes ? "PASS" : "FAIL"}".send(result.passes ? :green : :red) + " Reserved Area Blank"
|
|
11
|
+
result.expected = " Expected : #{(" " * Edf::RESERVED_SIZE).inspect}"
|
|
12
12
|
result.actual = " Actual : #{runner.edf.reserved.to_s.inspect}"
|
|
13
13
|
result
|
|
14
14
|
end
|
|
@@ -8,9 +8,9 @@ module Edfize
|
|
|
8
8
|
reserved_areas = runner.edf.signals.collect(&:reserved_area)
|
|
9
9
|
|
|
10
10
|
result = Result.new
|
|
11
|
-
result.passes = (reserved_areas.reject{|r| r.to_s.strip ==
|
|
12
|
-
result.pass_fail = " #{result.passes ?
|
|
13
|
-
result.expected = " Expected : #{[
|
|
11
|
+
result.passes = (reserved_areas.reject{|r| r.to_s.strip == ""}.count == 0)
|
|
12
|
+
result.pass_fail = " #{result.passes ? "PASS" : "FAIL"}".send(result.passes ? :green : :red) + " Signal Reserved Area Blank"
|
|
13
|
+
result.expected = " Expected : #{[""] * runner.edf.signals.count}"
|
|
14
14
|
result.actual = " Actual : #{reserved_areas}"
|
|
15
15
|
result
|
|
16
16
|
end
|
|
@@ -7,17 +7,17 @@ module Edfize
|
|
|
7
7
|
def test_valid_date(runner)
|
|
8
8
|
result = Result.new
|
|
9
9
|
result.passes = !runner.edf.start_date.nil?
|
|
10
|
-
result.pass_fail = pass_fail(result.passes,
|
|
11
|
-
result.expected =
|
|
10
|
+
result.pass_fail = pass_fail(result.passes, "Valid Date")
|
|
11
|
+
result.expected = " Expected : dd.mm.yy"
|
|
12
12
|
result.actual = " Actual : #{runner.edf.start_date_of_recording}"
|
|
13
13
|
result
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def pass_fail(passes, message)
|
|
17
17
|
if passes
|
|
18
|
-
|
|
18
|
+
" PASS".green + " #{message}"
|
|
19
19
|
else
|
|
20
|
-
|
|
20
|
+
" FAIL".red + " #{message}"
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
data/lib/edfize/tests/runner.rb
CHANGED
|
@@ -12,8 +12,8 @@ module Edfize
|
|
|
12
12
|
@tests_run = 0
|
|
13
13
|
@tests_failed = 0
|
|
14
14
|
@edf = edf
|
|
15
|
-
@verbose = argv.include?(
|
|
16
|
-
@show_passing = argv.include?(
|
|
15
|
+
@verbose = argv.include?("--quiet") ? false : true
|
|
16
|
+
@show_passing = argv.include?("--failing") ? false : true
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def run_tests
|
data/lib/edfize/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,43 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: edfize
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Remo Mueller
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-03-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '1.13'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '1.13'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: colorize
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - "~>"
|
|
17
|
+
- - ">="
|
|
32
18
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
19
|
+
version: 1.3.0
|
|
34
20
|
type: :runtime
|
|
35
21
|
prerelease: false
|
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
23
|
requirements:
|
|
38
|
-
- - "
|
|
24
|
+
- - ">="
|
|
39
25
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
26
|
+
version: 1.3.0
|
|
41
27
|
- !ruby/object:Gem::Dependency
|
|
42
28
|
name: rake
|
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -52,9 +38,8 @@ dependencies:
|
|
|
52
38
|
- - ">="
|
|
53
39
|
- !ruby/object:Gem::Version
|
|
54
40
|
version: '0'
|
|
55
|
-
description:
|
|
56
|
-
|
|
57
|
-
Run `edfize` on command line to view full list of options.
|
|
41
|
+
description: Load, validate, and parse European Data Format files. Used for batch
|
|
42
|
+
testing EDFs for errors. Run `edfize` on command line to view full list of options.
|
|
58
43
|
email:
|
|
59
44
|
- remosm@gmail.com
|
|
60
45
|
executables:
|
|
@@ -69,6 +54,7 @@ files:
|
|
|
69
54
|
- bin/edfize
|
|
70
55
|
- edfize.gemspec
|
|
71
56
|
- lib/edfize.rb
|
|
57
|
+
- lib/edfize/color.rb
|
|
72
58
|
- lib/edfize/edf.rb
|
|
73
59
|
- lib/edfize/signal.rb
|
|
74
60
|
- lib/edfize/tests.rb
|
|
@@ -98,8 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
98
84
|
- !ruby/object:Gem::Version
|
|
99
85
|
version: '0'
|
|
100
86
|
requirements: []
|
|
101
|
-
|
|
102
|
-
rubygems_version: 2.6.11
|
|
87
|
+
rubygems_version: 3.0.2
|
|
103
88
|
signing_key:
|
|
104
89
|
specification_version: 4
|
|
105
90
|
summary: Load, validate, and parse European Data Format files. Used for batch testing
|