use of com.ibm.streamsx.health.ingest.types.model.Observation in project streamsx.health by IBMStreams.
the class VinesToObservationParser method mapWaveformMessage.
private void mapWaveformMessage(Vines v, VinesParserResult parserResult) {
// generate Patient ID
String patientId = "";
Patient patient = v.getData().getPatient();
if (patient != null) {
patientId = patient.get_id();
}
// generate device type (same for all observations)
Device device = new Device();
device.setId(getDeviceId(v));
long startTime = 0;
long period = 0;
try {
startTime = toEpoch(v.getData().getBody().getStartTime());
} catch (ParseException e) {
String msg = "Error parsing timestamp: error=" + e.getLocalizedMessage() + ", timestamp=" + v.getData().getBody().getStartTime();
logger.error(msg);
e.printStackTrace();
parserResult.addErrorMesage(msg);
}
Terms terms = v.getData().getBody().getTerms();
Channel channel = terms.getChannel(terms.getChannelNames().get(0));
ReadingSource readingSource = new ReadingSource();
readingSource.setSourceType(SOURCE_TYPE);
readingSource.setId(terms.getChannelNames().get(0));
readingSource.setDeviceId(getDeviceId(v));
// get the sample rate
ITerm iterm = channel.getTerm("MDC_ATTR_SAMP_RATE");
if (iterm instanceof Term) {
Term term = (Term) iterm;
// set the multiplier based on the UOM
// in order to convert the sample rate
// milliseconds
double dividend = 1;
if (term.getUOM().equals("MDC_DIM_SEC")) {
dividend = 1000;
}
ITermValue itv = term.getValue();
if (itv instanceof TermValueString) {
String value = ((TermValueString) itv).getValue();
if (NumberUtils.isNumber(value)) {
period = Math.round((dividend / Double.valueOf(value)));
}
}
}
// get the UOM
iterm = channel.getTerm("MDC_ATTR_SCALE_RANGE");
String uom = "";
if (iterm instanceof Term) {
Term term = (Term) iterm;
uom = term.getUOM();
}
// map waveform samples to observations
iterm = channel.getTerm("MDC_ATTR_WAV");
if (iterm instanceof TermArray) {
TermArray term = (TermArray) iterm;
for (ITermValue itv : term) {
if (itv instanceof TermValueMap) {
TermValueMap tvm = (TermValueMap) itv;
for (String waveName : tvm.keySet()) {
ITerm waveITerm = tvm.get(waveName);
if (waveITerm instanceof Term) {
Term waveTerm = (Term) waveITerm;
ITermValue waveTermValue = waveTerm.getValue();
if (waveTermValue instanceof TermValueString) {
String waveStr = ((TermValueString) waveTermValue).getValue();
List<Double> waveform = WaveformHelper.parseWaveform(waveStr);
for (int i = 0; i < waveform.size(); ++i) {
Reading reading = new Reading();
reading.setReadingType(getReadingType(waveName));
reading.setValue(waveform.get(i));
reading.setTimestamp(startTime + period * i);
reading.setUom(uom);
parserResult.addObservation(new Observation(device, patientId, readingSource, reading));
}
}
}
}
}
}
}
}
use of com.ibm.streamsx.health.ingest.types.model.Observation in project streamsx.health by IBMStreams.
the class VinesToObservationParser method mapVitalMessage.
private void mapVitalMessage(Vines v, VinesParserResult parserResult) {
// generate Patient ID
String patientId = "";
Patient patient = v.getData().getPatient();
if (patient != null) {
patientId = patient.getMRN();
}
// generate device type (same for all observations)
Device device = new Device();
device.setId(getDeviceId(v));
Terms terms = v.getData().getBody().getTerms();
for (String channelName : terms.getChannelNames()) {
Channel channel = terms.getChannel(channelName);
// generate ReadingSource
ReadingSource readingSource = new ReadingSource();
readingSource.setId(channelName);
readingSource.setSourceType(SOURCE_TYPE);
readingSource.setDeviceId(getDeviceId(v));
// iterate over all terms and generate Readings & Observations
for (String termName : channel.getTermNames()) {
ITerm term = channel.getTerm(termName);
if (term instanceof Term) {
Reading reading = new Reading();
Term t = (Term) term;
ITermValue itv = t.getValue();
if (itv instanceof TermValueString) {
String value = ((TermValueString) itv).getValue();
if (!NumberUtils.isNumber(value)) {
// skip term as there is no numeric value
continue;
}
String date = t.getDate();
long epochTime = 0l;
try {
epochTime = toEpoch(date);
} catch (ParseException e) {
String msg = "Error parsing timestamp: error=" + e.getLocalizedMessage() + ", timestamp=" + date;
logger.error(msg, e);
e.printStackTrace();
parserResult.addErrorMesage(msg);
}
reading.setValue(Double.valueOf(value));
reading.setUom(t.getUOM());
reading.setTimestamp(epochTime);
reading.setReadingType(getReadingType(termName));
parserResult.addObservation(new Observation(device, patientId, readingSource, reading));
}
} else {
// Array terms not expected in normal vines messages
String msg = "Error parsing Vines message: Array terms not expected in normal vines messages.";
logger.error(msg);
parserResult.addErrorMesage(msg);
}
}
}
}
use of com.ibm.streamsx.health.ingest.types.model.Observation in project streamsx.health by IBMStreams.
the class ResolverTests method setup.
@Before
public void setup() {
readingType = new ReadingType();
reading = new Reading();
reading.setReadingType(readingType);
obs = new Observation();
obs.setReading(reading);
}
use of com.ibm.streamsx.health.ingest.types.model.Observation in project streamsx.health by IBMStreams.
the class UOMConverterService method build.
public void build() {
/*
* You *MUST* register all available converters here. Otherwise,
* you will end up NoConverterFoundExceptions.
*/
ConverterFactory factory = new ConverterFactory();
factory.registerConverterClass(VoltageConverter.class);
factory.registerConverterClass(CelciusToFahrenheitConverter.class);
factory.registerConverterClass(FahrenheitToCelciusConverter.class);
factory.registerConverterClass(BPSToBPMConverter.class);
factory.registerConverterClass(BPMToBPSConverter.class);
/*
* Build topology
*/
TStream<Observation> obsStream = SubscribeConnector.subscribe(topo, this.subscribeTopic);
TStream<Observation> updateObsStream = obsStream.modify(new UnitConverter(factory, uomMapFile));
PublishConnector.publishObservation(updateObsStream, getPublishedTopic());
}
use of com.ibm.streamsx.health.ingest.types.model.Observation in project streamsx.health by IBMStreams.
the class HealthDataBeaconService method build.
public void build() {
TStream<Observation> ecgIStream = topo.periodicSource(new HealthcareDataGenerator(DEFAULT_PATIENT_ID, "src/main/resources/ecgI.csv", ReadingTypeCode.ECG_LEAD_I.getCode()), ECG_PERIOD, ECG_PERIOD_TIMEUNIT);
TStream<Observation> respStream = topo.periodicSource(new HealthcareDataGenerator(DEFAULT_PATIENT_ID, "src/main/resources/resp.csv", ReadingTypeCode.RESP_RATE.getCode()), RESP_PERIOD, RESP_PERIOD_TIMEUNIT);
TStream<Observation> abpDiasStream = topo.periodicSource(new ABPDiastolicDataGenerator(DEFAULT_PATIENT_ID), VITALS_PERIOD, VITALS_PERIOD_TIMEUNIT);
TStream<Observation> abpSysStream = topo.periodicSource(new ABPSystolicDataGenerator(DEFAULT_PATIENT_ID), VITALS_PERIOD, VITALS_PERIOD_TIMEUNIT);
TStream<Observation> hrStream = topo.periodicSource(new HeartRateDataGenerator(DEFAULT_PATIENT_ID), VITALS_PERIOD, VITALS_PERIOD_TIMEUNIT);
TStream<Observation> spo2Stream = topo.periodicSource(new SpO2DataGenerator(DEFAULT_PATIENT_ID), VITALS_PERIOD, VITALS_PERIOD_TIMEUNIT);
TStream<Observation> temperatureStream = topo.periodicSource(new TemperatureDataGenerator(DEFAULT_PATIENT_ID), VITALS_PERIOD, VITALS_PERIOD_TIMEUNIT);
Set<TStream<Observation>> observations = new HashSet<TStream<Observation>>();
observations.add(respStream);
observations.add(abpDiasStream);
observations.add(abpSysStream);
observations.add(hrStream);
observations.add(spo2Stream);
observations.add(temperatureStream);
TStream<Observation> allStreams = ecgIStream.union(observations);
TStream<Observation> multiplePatientStream = allStreams.multiTransform(new Multiplier(numPatientsSupplier, patientPrefixSupplier));
multiplePatientStream.print();
PublishConnector.publishObservation(multiplePatientStream, getPublishedTopic());
}
Aggregations