Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.botts.impl.system.lane;

import net.opengis.swe.v20.DataBlock;
import net.opengis.swe.v20.DataComponent;
import net.opengis.swe.v20.DataEncoding;
import org.sensorhub.api.data.DataEvent;
import org.sensorhub.impl.sensor.VarRateSensorOutput;
import org.sensorhub.impl.utils.rad.RADHelper;
import org.sensorhub.impl.utils.rad.model.WebIdAnalysis;
import org.vast.data.TextEncodingImpl;

public class WebIdOutput extends VarRateSensorOutput<LaneSystem> {

public static final String NAME = "webIdAnalysis";

DataComponent recordStruct;
DataEncoding recordEncoding;

public WebIdOutput(LaneSystem parentSensor) {
super(NAME, parentSensor, 0);

recordStruct = new RADHelper().createWebIdRecord();
recordEncoding = new TextEncodingImpl();
}

public void publishData(WebIdAnalysis analysis) {
DataBlock dataBlock = WebIdAnalysis.fromWebIdAnalysis(analysis);
eventHandler.publish(new DataEvent(analysis.getSampleTime().toEpochMilli(), WebIdOutput.this, dataBlock));
}

@Override
public DataComponent getRecordDescription() {
return recordStruct;
}

@Override
public DataEncoding getRecommendedEncoding() {
return recordEncoding;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,32 @@ public Text createVideoPath() {
.build();
}

public Count createWebIdObsIdsCount() {
return createCount()
.label("Web ID Obs IDs Count")
.name("webIdObsIdsCount")
.description("Count of the number of web ID observations associated with this occupancy")
.definition(getRadUri("WebIdObsIdsCount"))
.id("webIdObsIdsCount")
.build();
}

public DataArray createWebIdObsIdsArray(){
return createArray()
.name("webIdObsIds")
.label("Web ID Obs IDs")
.description("List of web ID observation IDs associated with this occupancy")
.definition(getRadUri("WebIdObsIdsArray"))
.withVariableSize("webIdObsIdsCount")
.withElement("webIdObsId", createText()
.name("webIdObsId")
.label("Web ID Obs ID")
.description("ID of the Web ID Observation")
.definition(getRadUri("WebIdObsId"))
.build())
.build();
}

public Quantity createBackgroundSigma(){
return createQuantity()
.name("backgroundSigma")
Expand Down Expand Up @@ -1174,4 +1200,91 @@ public DataRecord createCountStatistics() {
.build();
}

// Web ID

public DataRecord createWebIdRecord() {
return createRecord()
.name("webIdAnalysis")
.label("Web ID Analysis")
.definition(getRadUri("WebIDAnalysis"))
.addField("sampleTime", createTime()
.asPhenomenonTimeIsoUTC()
.label("Sample Time")
.definition(SWEHelper.getPropertyUri("SampleTime"))
.build())
.addField("occupancyObsId", createText()
.label("Occupancy Observation ID")
.definition(SWEHelper.getPropertyUri("OccupancyObsID"))
.build())
.addField("isotopesCount", createCount()
.label("Isotopes Count")
.id("isotopesCount")
.definition(SWEHelper.getPropertyUri("IsotopesCount"))
.build())
.addField("isotopes", createArray()
.withVariableSize("isotopesCount")
.definition(SWEHelper.getPropertyUri("Isotopes"))
.withElement("isotope", createRecord()
.addField("name", createText()
.label("Isotope Name")
.definition(SWEHelper.getPropertyUri("IsotopeName"))
.build())
.addField("type", createText()
.label("Isotope Type")
.definition(SWEHelper.getPropertyUri("IsotopeType"))
.build())
.addField("confidence", createQuantity()
.label("Confidence")
.definition(SWEHelper.getPropertyUri("Confidence"))
.build())
.addField("confidenceStr", createText()
.label("Confidence String")
.definition(SWEHelper.getPropertyUri("ConfidenceString"))
.build())
.addField("countRate", createQuantity()
.label("Count Rate")
.definition(SWEHelper.getPropertyUri("CountRate"))
.build())
.build())
.build())
.addField("analysisWarningsCount", createCount()
.label("Analysis Warnings Count")
.id("analysisWarningsCount")
.definition(SWEHelper.getPropertyUri("AnalysisWarningsCount"))
.build())
.addField("analysisWarnings", createArray()
.withVariableSize("analysisWarningsCount")
.definition(SWEHelper.getPropertyUri("AnalysisWarnings"))
.withElement("warning", createText()
.label("Warning")
.definition(SWEHelper.getPropertyUri("Warning"))
.build())
.build())
.addField("estimatedDose", createQuantity()
.label("Estimated Dose")
.definition(SWEHelper.getPropertyUri("EstimatedDose"))
.build())
.addField("chi2", createQuantity()
.label("Chi Squared")
.definition(SWEHelper.getPropertyUri("ChiSquared"))
.build())
.addField("analysisError", createCount()
.label("Analysis Error")
.definition(SWEHelper.getPropertyUri("AnalysisError"))
.build())
.addField("errorMessage", createText()
.label("Error Message")
.definition(SWEHelper.getPropertyUri("ErrorMessage"))
.build())
.addField("drf", createText()
.label("Detector Response Function")
.definition(SWEHelper.getPropertyUri("DRF"))
.build())
.addField("isotopeString", createText()
.label("Isotope String")
.definition(SWEHelper.getPropertyUri("IsotopeString"))
.build())
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package org.sensorhub.impl.utils.rad.model;

public class IsotopeAnalysis {

private String name;
private String type;
private float confidence;
private String confidenceStr;
private float countRate;

public String getName() {
return name;
}

public String getType() {
return type;
}

public float getConfidence() {
return confidence;
}

public String getConfidenceStr() {
return confidenceStr;
}

public float getCountRate() {
return countRate;
}

private IsotopeAnalysis() {}

public static class Builder {

private final IsotopeAnalysis instance;

public Builder() {
this.instance = new IsotopeAnalysis();
}

public IsotopeAnalysis.Builder name(String name) {
this.instance.name = name;
return IsotopeAnalysis.Builder.this;
}

public IsotopeAnalysis.Builder type(String type) {
this.instance.type = type;
return IsotopeAnalysis.Builder.this;
}

public IsotopeAnalysis.Builder confidence(float confidence) {
this.instance.confidence = confidence;
return IsotopeAnalysis.Builder.this;
}

public IsotopeAnalysis.Builder confidenceStr(String confidenceStr) {
this.instance.confidenceStr = confidenceStr;
return IsotopeAnalysis.Builder.this;
}

public IsotopeAnalysis.Builder countRate(float countRate) {
this.instance.countRate = countRate;
return IsotopeAnalysis.Builder.this;
}

public IsotopeAnalysis build() {
return this.instance;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class Occupancy {
private int maxNeutronCount;
private List<String> adjudicatedIds = new ArrayList<>();
private List<String> videoPaths = new ArrayList<>();
private List<String> webIdObsIds = new ArrayList<>();

public int getOccupancyCount() {
return occupancyCount;
Expand Down Expand Up @@ -64,6 +65,10 @@ public List<String> getVideoPaths() {
return videoPaths;
}

public List<String> getWebIdObsIds() {
return webIdObsIds;
}

public double getSamplingTime() {
return samplingTime;
}
Expand Down Expand Up @@ -131,6 +136,11 @@ public Builder videoPaths(List<String> videoPaths) {
return this;
}

public Builder webIdObsIds(List<String> webIdObsIds) {
instance.webIdObsIds = webIdObsIds;
return this;
}

public Occupancy build() {
return instance;
}
Expand All @@ -145,8 +155,12 @@ public void addVideoPath(String videoPath) {
this.videoPaths.add(videoPath);
}

public void addWebIdObsId(String webIdObsId) {
this.webIdObsIds.add(webIdObsId);
}

public static DataBlock fromOccupancy(Occupancy occupancy) {
OccupancyOutput output = new OccupancyOutput(new SensorSystem());
OccupancyOutput<?> output = new OccupancyOutput<>(new SensorSystem());
DataComponent resultStructure = output.getRecordDescription();
DataBlock dataBlock = resultStructure.createDataBlock();
dataBlock.updateAtomCount();
Expand Down Expand Up @@ -192,6 +206,20 @@ public static DataBlock fromOccupancy(Occupancy occupancy) {
}
}

int webIdObsIdsCount = occupancy.getWebIdObsIds().size();
dataBlock.setDoubleValue(index++, webIdObsIdsCount);

var webIdObsIdsArray = ((DataArrayImpl) resultStructure.getComponent("webIdObsIds"));

if (webIdObsIdsCount > 0) {
webIdObsIdsArray.updateSize();
dataBlock.updateAtomCount();

for (int i = 0; i < occupancy.getWebIdObsIds().size(); i++) {
dataBlock.setStringValue(index++, occupancy.getWebIdObsIds().get(i));
}
}

return dataBlock;
}

Expand Down Expand Up @@ -219,6 +247,15 @@ public static Occupancy toOccupancy(DataBlock dataBlock) {
for (int i = 0; i < videoPathCount; i++)
videoPaths.add(dataBlock.getStringValue(index++));

List<String> webIdObsIds = new ArrayList<>();
try {
var webIdObsIdsCount = dataBlock.getIntValue(index++);
for (int i = 0; i < webIdObsIdsCount; i++)
webIdObsIds.add(dataBlock.getStringValue(index++));
} catch (Exception ignored) {
// backwards compatibility: old observations may not have webIdObsIds fields
}

return new Builder()
.samplingTime(samplingTime)
.occupancyCount(occupancyCount)
Expand All @@ -231,6 +268,7 @@ public static Occupancy toOccupancy(DataBlock dataBlock) {
.neutronAlarm(neutronAlarm)
.adjudicatedIds(cmdIds)
.videoPaths(videoPaths)
.webIdObsIds(webIdObsIds)
.build();
}
}
Loading