Skip to content

_examples/Science.tl

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
#   Copyright (c) 2024 MBARI
#   MBARI Proprietary Information. Confidential. All Rights Reserved
#   Unauthorized copying or distribution of this file via any medium is strictly
#   prohibited.
#
#   WARNING - This file contains information whose export is restricted by the
#   Export Administration Act of 1979 (Title 50, U.S.C., App. 2401 et seq.), as
#   amended. Violations of these export laws are subject to severe civil and/or
#   criminal penalties.

#
# 2021-06-10: Updated via auto-translation from current XML plus, again, a
# manual fix to indicate some execution mode to the `aggregate OceanCurrent`.
#
aggregate Science {
  arguments {
    PeakDetectChlActive = false
      """
      Turns on peak detection of Cholorphyll.
      """

    TimeWindowPeakReport = NaN minute
      """
      If greater than zero, report a peak every window. If NaN or zero, this
      variable is ignored.
      """

    HighestChlPeakReportActive = false
      """
      Turns on reporting of the highest peak value of chlorophyll on yo-yo
      profiles in a horizontal sliding window (of length
      numProfilesSlidingwindow)
      """

    HighestSaltPeakReportActive = false
      """
      Turns on reporting of the highest peak value of salinity on yo-yo
      profiles in a horizontal sliding window (of length
      numProfilesSlidingwindow)
      """

    HighestOilPeakReportActive = false
      """
      Turns on reporting of the highest peak value of oil on yo-yo profiles in
      a horizontal sliding window (of length numProfilesSlidingwindow)
      """

    PatchTracking = false
      """
      If tracking a patch
      """

    FilterWidthHorizontal = 3 count
      """
      Width of boxcar filter applied to yoyo-wise chl peaks to pick out the
      highest peak.
      """

    NumProfilesSlidingwindow = 100 count
      """
      Length of horizontal sliding window. The highest yoyo-wise chl peak
      (after low-pass filtering by a filter of length FilterWidthHorizontal)
      within this window.
      """

    OffPeakFractionHorizontal = 80 percent
      """
      When filtered horizontal value is this fraction of the peak, consider it
      outside the patch.
      """

    PeakDetectNO3Active = false
      """
      Turns on peak detection of Nitrate (and turns on ISUS).
      """

    PeakDetectOilActive = false
      """
      Turns on peak detection of Dissolved Oil.
      """

    PeakDetectFDOMActive = false
      """
      Turns on peak detection of
      concentration_of_colored_dissolved_organic_matter_in_sea_water from FDOM
      sensor.
      """

    PeakDetectSalinityActive = false
      """
      Turns on peak detection of salinity.
      """

    UpwardDerivativeOfTemperatureActive = false
      """
      Turns on seawater temperature derivative.
      """

    EnabledAanderaaO2 = Science:Aanderaa_O2.loadAtStartup
      """
      Automatically set to True if the Aanderaa O2 sensor is installed. Set to
      false to disable reading Aandera O2.
      """

    EnabledNeilBrown = Science:CTD_NeilBrown.loadAtStartup
      """
      Automatically set to true if the Neil Brown CTD is enabled. Set to false
      to disable reading from the Neil Brown.
      """

    EnabledSeabird = Science:CTD_Seabird.loadAtStartup
      """
      Automatically set to true if the CTD is enabled. Set to false to disable
      reading from the CTD.
      """

    EnabledWetLabsBB2FL = Science:WetLabsBB2FL.loadAtStartup
      """
      Automatically set to true if the the WetLabs BB2FL is enabled. Set to
      false to disable the WetLabs BB2FL.
      """

    EnabledWetLabsSeaOWL_UV_A = Science:WetLabsSeaOWL_UV_A.loadAtStartup
      """
      Automatically set to true if the the WetLabs SeaOWL UV-A is enabled. Set
      to false to disable the WetLabs SeaOWL UV-A.
      """

    EnabledWetLabsUBAT = Science:WetLabsUBAT.loadAtStartup
      """
      Automatically set to true if the the WetLabs UBAT is enabled. Set to
      false to disable the WetLabs UBAT.
      """

    LowPassWindowLength = 20 count
      """
      Low-pass window length (based on depth sensor sampling interval 0.4
      second) for low-pass filtering.
      """

    MedianFilterLen = 5 count
      """
      Median filter length (only for chlorophyll fluorescence which tends to
      have spikes)
      """

    PeakShallowBound = NaN meter
      """
      Shallow depth bound for detecting any peak on each descent or ascent
      profile.
      """

    PeakDeepBound = NaN meter
      """
      Deep depth bound for detecting any peak on each descent or ascent
      profile.
      """

    DepChangeThreshForAttitudeFlip = 2.0 meter
      """
      Depth change threshold for determining vehicle attitude flip.
      """
  }

  output {
    PeakChl = 0 microgram_per_liter

    PeakChlDepth = 0 meter

    PeakChlTemperature = 0 celsius

    PeakChlLatitude = NaN degree

    PeakChlLongitude = NaN degree

    PeakNO3 = 0 micromole_per_liter

    PeakNO3Depth = 0 meter

    PeakNO3Latitude = NaN degree

    PeakNO3Longitude = NaN degree

    PeakOil = 0 kilogram_per_cubic_meter

    PeakOilDepth = 0 meter

    PeakOilLatitude = NaN degree

    PeakOilLongitude = NaN degree

    PeakFDOM = 0 part_per_billion

    PeakFDOMDepth = 0 meter

    PeakFDOMTemperature = NaN celsius

    PeakFDOMLatitude = NaN degree

    PeakFDOMLongitude = NaN degree

    PeakSalt = 0 psu

    PeakSaltDepth = 0 meter

    PeakSaltTemperature = 0 celsius

    PeakSaltLatitude = NaN degree

    PeakSaltLongitude = NaN degree

    PatchChl = 0 microgram_per_liter

    PatchChlDepth = 0 meter

    PatchChlLatitude = NaN degree

    PatchChlLongitude = NaN degree

    PatchChlDistance = NaN meter

    PatchSalt = 0 psu

    PatchSaltDepth = 0 meter

    PatchSaltLatitude = NaN degree

    PatchSaltLongitude = NaN degree

    PatchSaltDistance = NaN meter

    PatchOil = 0 psu

    PatchOilDepth = 0 meter

    PatchOilLatitude = NaN degree

    PatchOilLongitude = NaN degree

    PatchOilDistance = NaN meter
  }

  run in parallel

  readData strategy="MinError" {
    while ( EnabledAanderaaO2 )

    Universal:mass_concentration_of_oxygen_in_sea_water
  }

  readData strategy="MinError" {
    while (
      EnabledNeilBrown
      or EnabledSeabird
    )

    Universal:sea_water_temperature
    Universal:sea_water_salinity
  }

  readData strategy="MinError" {
    while ( EnabledSeabird )

    Science:CTD_Seabird.sea_water_temperature
    Science:CTD_Seabird.sea_water_salinity
  }

  readData strategy="MinError" {
    while (
      EnabledNeilBrown
      or EnabledSeabird
      and UpwardDerivativeOfTemperatureActive
    )

    Universal:upward_derivative_of_sea_water_temperature
  }

  readData strategy="MinError" {
    while (
      EnabledWetLabsBB2FL
      or PeakDetectChlActive
    )

    Universal:mass_concentration_of_chlorophyll_in_sea_water
  }

  readData strategy="MinError" {
    while ( EnabledWetLabsUBAT )

    Science:WetLabsUBAT.average_bioluminescence
  }

  readData id="Read_Oil" strategy="MinError" {
    while (
      EnabledWetLabsSeaOWL_UV_A
      or PeakDetectOilActive
    )

    Universal:mass_concentration_of_petroleum_hydrocarbons_in_sea_water
  }

  aggregate OceanCurrent {
    run in parallel

    behavior Estimation:CurrentEstimator {
      run in parallel
    }
  }

  aggregate PeakDetectChl {
    run while ( PeakDetectChlActive )

    behavior Trigger:PeakDetectVsDepth {
      run in sequence

      set detect = Universal:mass_concentration_of_chlorophyll_in_sea_water
      set timeWindowPeakReport = TimeWindowPeakReport
      set windowLength = LowPassWindowLength
      set medianFilterLength = MedianFilterLen
      set shallowBound = PeakShallowBound
      set deepBound = PeakDeepBound
      set depthChangeThresh = DepChangeThreshForAttitudeFlip
      outputArg PeakChl = peakDetect
      outputArg PeakChlDepth = peakDepth
      outputArg PeakChlTemperature = peakTemperature
      outputArg PeakChlLatitude = peakLatitude
      outputArg PeakChlLongitude = peakLongitude
    }

    # debug
    #         <Syslog Severity="Important">PeakChl, PeakChlLatitude, PeakChlLongitude = <Arg Name="PeakChl"/><Units:microgram_per_liter/>, <Arg Name="PeakChlLatitude"/><Units:degree/>, <Arg Name="PeakChlLongitude"/><Units:degree/></Syslog>

    sendData service=express (
      PeakChl,
      PeakChlDepth
    )
  }

  aggregate HighestChlPeakReport {
    run while ( HighestChlPeakReportActive )

    behavior Trigger:PeakDetectHorizontal {
      run in sequence

      set detectFrom = PeakChl
      set depthFrom = PeakChlDepth
      set latitudeFrom = PeakChlLatitude
      set longitudeFrom = PeakChlLongitude
      set patchTracking = PatchTracking
      set filterWidth = FilterWidthHorizontal
      set numProfilesSlidingwindow = NumProfilesSlidingwindow
      set offPeakFraction = OffPeakFractionHorizontal
      outputArg PatchChl = peakDetect
      outputArg PatchChlDepth = peakDepth
      outputArg PatchChlLatitude = peakLatitude
      outputArg PatchChlLongitude = peakLongitude
      outputArg PatchChlDistance = peakDistance
    }
  }

  aggregate PeakDetectNO3 {
    run while ( PeakDetectNO3Active )

    behavior Trigger:PeakDetectVsDepth {
      run in sequence

      set detect = Universal:mole_concentration_of_nitrate_in_sea_water
      set timeWindowPeakReport = TimeWindowPeakReport
      set windowLength = LowPassWindowLength
      set shallowBound = PeakShallowBound
      set deepBound = PeakDeepBound
      outputArg PeakNO3 = peakDetect
      outputArg PeakNO3Depth = peakDepth
      outputArg PeakNO3Latitude = peakLatitude
      outputArg PeakNO3Longitude = peakLongitude
    }

    sendData service=express (
      PeakNO3,
      PeakNO3Depth
    )
  }

  aggregate PeakDetectOil {
    run while ( PeakDetectOilActive )

    behavior Trigger:PeakDetectVsDepth {
      run in sequence

      set detect = Universal:mass_concentration_of_petroleum_hydrocarbons_in_sea_water
      set timeWindowPeakReport = TimeWindowPeakReport
      set windowLength = LowPassWindowLength
      set shallowBound = PeakShallowBound
      set deepBound = PeakDeepBound
      outputArg PeakOil = peakDetect
      outputArg PeakOilDepth = peakDepth
      outputArg PeakOilLatitude = peakLatitude
      outputArg PeakOilLongitude = peakLongitude
    }

    # debug
    #         <Syslog Severity="Important">PeakOil, PeakOilDepth, PeakOilTemperature, PeakOilLatitude, PeakOilLongitude = <Arg Name="PeakOil"/><Units:kilogram_per_cubic_meter/>, <Arg Name="PeakOilDepth"/><Units:meter/>, <Arg Name="PeakOilTemperature"/><Units:celsius/>, <Arg Name="PeakOilLatitude"/><Units:degree/>, <Arg Name="PeakOilLongitude"/><Units:degree/></Syslog>

    sendData service=express (
      PeakOil,
      PeakOilDepth
    )
  }

  aggregate HighestOilPeakReport {
    run while ( HighestOilPeakReportActive )

    behavior Trigger:PeakDetectHorizontal {
      run in sequence

      set detectFrom = PeakOil
      set depthFrom = PeakOilDepth
      set latitudeFrom = PeakOilLatitude
      set longitudeFrom = PeakOilLongitude
      set patchTracking = PatchTracking
      set filterWidth = FilterWidthHorizontal
      set numProfilesSlidingwindow = NumProfilesSlidingwindow
      set offPeakFraction = OffPeakFractionHorizontal
      outputArg PatchOil = peakDetect
      outputArg PatchOilDepth = peakDepth
      outputArg PatchOilLatitude = peakLatitude
      outputArg PatchOilLongitude = peakLongitude
      outputArg PatchOilDistance = peakDistance
    }
  }

  aggregate PeakDetectFDOM {
    run while ( PeakDetectFDOMActive )

    behavior Trigger:PeakDetectVsDepth {
      run in sequence

      set detect = Universal:concentration_of_colored_dissolved_organic_matter_in_sea_water
      set timeWindowPeakReport = TimeWindowPeakReport
      set windowLength = LowPassWindowLength
      set shallowBound = PeakShallowBound
      set deepBound = PeakDeepBound
      outputArg PeakFDOM = peakDetect
      outputArg PeakFDOMDepth = peakDepth
      outputArg PeakFDOMTemperature = peakTemperature
      outputArg PeakFDOMLatitude = peakLatitude
      outputArg PeakFDOMLongitude = peakLongitude
    }

    sendData service=express (
      PeakFDOM,
      PeakFDOMDepth
    )
  }

  aggregate PeakDetectSalinity {
    run while ( PeakDetectSalinityActive )

    behavior Trigger:PeakDetectVsDepth {
      run in sequence

      set detect = Universal:sea_water_salinity
      set timeWindowPeakReport = TimeWindowPeakReport
      set windowLength = LowPassWindowLength
      set medianFilterLength = MedianFilterLen
      set shallowBound = PeakShallowBound
      set deepBound = PeakDeepBound
      set depthChangeThresh = DepChangeThreshForAttitudeFlip
      outputArg PeakSalt = peakDetect
      outputArg PeakSaltDepth = peakDepth
      outputArg PeakSaltTemperature = peakTemperature
      outputArg PeakSaltLatitude = peakLatitude
      outputArg PeakSaltLongitude = peakLongitude
    }

    # debug
    #         <Syslog Severity="Important">PeakSalt, PeakSaltDepth, PeakSaltTemperature, PeakSaltLatitude, PeakSaltLongitude = <Arg Name="PeakSalt"/><Units:psu/>, <Arg Name="PeakSaltDepth"/><Units:meter/>, <Arg Name="PeakSaltTemperature"/><Units:celsius/>, <Arg Name="PeakSaltLatitude"/><Units:degree/>, <Arg Name="PeakSaltLongitude"/><Units:degree/></Syslog>

    sendData service=express (
      PeakSalt,
      PeakSaltDepth
    )
  }

  aggregate HighestSaltPeakReport {
    run while ( HighestSaltPeakReportActive )

    behavior Trigger:PeakDetectHorizontal {
      run in sequence

      set detectFrom = PeakSalt
      set depthFrom = PeakSaltDepth
      set latitudeFrom = PeakSaltLatitude
      set longitudeFrom = PeakSaltLongitude
      set patchTracking = PatchTracking
      set filterWidth = FilterWidthHorizontal
      set numProfilesSlidingwindow = NumProfilesSlidingwindow
      set offPeakFraction = OffPeakFractionHorizontal
      outputArg PatchSalt = peakDetect
      outputArg PatchSaltDepth = peakDepth
      outputArg PatchSaltLatitude = peakLatitude
      outputArg PatchSaltLongitude = peakLongitude
      outputArg PatchSaltDistance = peakDistance
    }
  }
}