fosanalysis
A framework to evaluate distributed fiber optic sensor data
Loading...
Searching...
No Matches
generatedemofile.py
Go to the documentation of this file.
2r"""
3This script generates the `demofile` for [Getting Started](doc/GettingStarted.md).
4The demofile simulates a real file exported by the ODiSI Software by Luna Inc.
5\author Bertram Richter
6\date 2022
7"""
8
9import datetime
10import numpy as np
11import os
12import scipy.stats
13
15 r"""
16 Prints the header file
17 """
18 file_contents = []
19 file_contents
20
21 return file_contents
22
23def generate_x(start, end, gage_length):
24 return np.round(np.arange(start, end, gage_length), 5)
25
26def generate_data(x_axis, rng, noise_gain):
27 r"""
28 Generates the body data.
29 """
30 y_base = np.zeros(x_axis.shape)
31 nan_array = np.full(x_axis.shape, np.nan)
32 min_noise_ratio = 0.9
33 max_noise_ratio = 1.0
34
35 # Peaks: location, height, width
36 peaks = [
37 (3.20, 500, .04),
38 (3.40, 1200, .02),
39 (3.55, 4050, .03),
40 (3.68, 5000, .015),
41 (3.72, 5500, .015),
42 (3.80, 1200, .014),
43 (3.95, 5800, .03),
44 (4.10, 7150, .015),
45 (4.28, 6050, .012),
46 (4.50, 3000, .02),
47 (4.65, 2200, .01),
48 (4.80, 500, .01),
49 ]
50 for loc, h, w in peaks:
51 peak = scipy.stats.norm.pdf(x_axis, loc, w)
52 y_base = y_base + peak * h /max(peak)
53
54 # Add noise
55 noise = rng.normal(0, noise_gain, *(x_axis.shape))
56 # Round an convert to integers
57 y_data = y_base + noise
58 y_data = y_data.astype(np.int32)
59 # Insert NaN at random positions
60 nans_decision = np.random.random(x_axis.shape) > 0.1
61 y_data = np.where(nans_decision, y_data, nan_array)
62 return y_data
63
64def main():
65 r"""
66 Runs the script and generate demo file.
67 """
68 file = "data/demofile.tsv"
69 if not os.path.exists(os.path.dirname(file)):
70 os.makedirs(os.path.dirname(file))
71 # Start position in m
72 start = 0.08
73 # End position in m
74 end = 5.07925
75 # Distance between consecutive gages in m
76 gage_length = 1.3 / 1000
77 # Timestamp of the first reading
78 start_time = datetime.datetime.now()
79 # Measurement refresh rate in Hz
80 frequency = 1.5625
81 # Time increment between readings
82 dt = datetime.timedelta(seconds=1/frequency)
83 # Duration of the measurement
84 duration = datetime.timedelta(seconds=10)
85 # Standard deviation of noise
86 noise_gain = 10
87 # Random number generator for reproducible data
88 rng = np.random.default_rng(seed=0)
89 with open(file, "w", encoding="utf-8") as f:
90 f.write("Test name: Getting Started" + "\n")
91 f.write("Notes: Generated demo file for getting started with fosanalysis" + "\n")
92 f.write("Product: ODiSI 6102" + "\n")
93 f.write("Date: {}".format(start_time.isoformat(sep=" ")) + "\n")
94 f.write("Timezone: UTC+0" + "\n")
95 f.write("File Type: ODiSI 6xxx Data File" + "\n")
96 f.write("File Version: 7" + "\n")
97 f.write("System Serial Number: 123456789" + "\n")
98 f.write("Software Version: 2.1.0" + "\n")
99 f.write("Hardware Version: 1" + "\n")
100 f.write("Firmware Version: 1.6.6 (08/18/2020)" + "\n")
101 f.write("FPGA Version: v7.3.1-15016 (08/14/2020)" + "\n")
102 f.write("Measurement Rate Per Channel: {} Hz".format(frequency) + "\n")
103 f.write("Gage Pitch (mm): {}".format(gage_length*1000) + "\n")
104 f.write("Standoff Cable Length (m): 50" + "\n")
105 f.write("Temperature offset: 0.0" + "\n")
106 f.write("Performance Mode: Full Optimization" + "\n")
107 f.write("Spatial Average Window Size (gages): 0" + "\n")
108 f.write("Temporal Average Window Size (gages): 0" + "\n")
109 f.write("Channel: 1" + "\n")
110 f.write("Sensor Name: GettingStartedSensor" + "\n")
111 f.write("Sensor Serial Number: FS2022CUSTOM_ 123456789_123456789" + "\n")
112 f.write("Sensor Part Number: CUSTOMER_GENERATED" + "\n")
113 f.write("Sensor Type: Strain" + "\n")
114 f.write("Units: microstrain" + "\n")
115 f.write("x-axis units: m" + "\n")
116 f.write("Length (m): {}".format(end) + "\n")
117 f.write("Patch cord length (m): 0" + "\n")
118 f.write("Key name: " + "\n")
119 f.write("Tare name: " + "\n")
120 f.write("----------------------------------------" + "\n")
121 x_axis = generate_x(start, end, gage_length)
122 print("x-axis", "", "", *x_axis, sep="\t", end="\n", file=f)
123 # Strain data
124 step = 0
125 timestamp = start_time
126 while dt * step <= duration:
127 reading = generate_data(x_axis, rng, noise_gain)
128 timestamp = start_time + dt * step
129 print("{}".format(timestamp.isoformat(sep=" ")), "measurement", "strain", *reading, sep="\t", end="\n", file=f)
130 step += 1
131
132if __name__ == "__main__":
133 main()
main()
Runs the script and generate demo file.
generate_x(start, end, gage_length)
generate_data(x_axis, rng, noise_gain)
Generates the body data.
generate_header()
Prints the header file.