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
4 changes: 3 additions & 1 deletion docs/tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ DICTIONARY: External reference, such as the units name list
| | **`Channel Time Errors`** ||||
| 310 | Channel:startDate must be included and must occur before Channel:endDate if included.<details>Channel:startDate must be **INCLUDED AND** < Channel:endDate **IF INCLUDED**</details> |Error||[F1_310](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_310.xml), [F2_310](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F2_310.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
| 320 | If Channel:Code[2]==(H &#124; L &#124; M &#124; N) THEN Channel:Azimuth and Channel:Dip must be included. |Error|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_320](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_320.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
| 321 |If Channel:Code[2] == (H &#124; L &#124; M &#124; N) then Stage[1]:InputUnit must equal *m/s* AND Stage[Last]:OutputUnits must equal count*|WARNING|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_321](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_320.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
| 321 |If Channel:Code[2] == (H &#124; L) then Stage[1]:InputUnit must equal ?m/s AND Stage[Last]:OutputUnits must equal count?|WARNING|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_321](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resource/F1_321.xml)[F2_321](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F2_321.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
| 322 |If Channel:Code[2] == (N) then Stage[1]:InputUnit must equal ?m/s**2 AND Stage[Last]:OutputUnits must equal count?|WARNING|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_322](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resource/F1_322.xml)[F2_322](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F2_322.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
||||||
| | **`Channel Orientation Errors`** ||||
| 332 |If Channel:Code[LAST]==N then Channel:Azimuth must be assigned (>=355.0 or <=5.0) or (>=175.0 and <=185.0) and Channel:Dip must be assigned (>=-5 AND <=5.0). |Warning|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_332.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml), [P1_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P1_332.xml), [P2_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P2_332.xml), [P3_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P3_332.xml), [P4_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P4_332.xml)|
Expand All @@ -81,6 +82,7 @@ DICTIONARY: External reference, such as the units name list
| 404 | If Stage[N]:PolesZeros:PzTransferFunctionType:Digital or Stage[N]:FIR or Stage[N]:Coefficients:CfTransferFunctionType:DIGITAL are included then Stage[N] must include Stage[N]:Decimation and Stage[N]:StageGain elements.|Error|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_404](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_404.xml), [F2_404](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F2_404.xml), [F3_404](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F3_404.xml), [F4_404](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F4_404.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml), [P1_404](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P1_404.xml)|
| 405 | Stage:ResponseList cannot be the only stage included in a response.<details>**IF** Stage[1] == Stage:ResponseList **THEN LENGTH**(Stage)>1 **AND** Stage[N] != Stage:ResponseList must be **INCLUDED**</details>|Error|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_405](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_405.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml), [P1_405](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P1_405.xml)|
| 406 | Stage[LAST]::OutputUnits:Name must be assigned count.<details> Stage[LAST]::OutputUnits:Name must be **ASSIGNED** count.</details> |Error|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_406](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_406.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
| 407 | (InstrumentSensitivity:InputUnits:Name must equal Stage[1]:InputUnits:Name and InstrumentSensitivity:OutputUnits:Name must equal Stage[last]:OutputUnits:Name) or (InstrumentPolynomial:InputUnits:Name must equal Stage[1]:InputUnits:Name and InstrumentPolynomial:OutputUnits:Name must equal Stage[last]:OutputUnits:Name)</details> |Error|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_407](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_407.xml)[F2_407](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F2_407.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
||||||
| | **`ResponseType and StageGain Errors`** ||||
| 410 | If InstrumentSensitivity is included then InstrumentSensitivity:Value must be assigned a double > 0.0.<details>**IF** InstrumentSensitivity is **INCLUDED THEN** InstrumentSensitivity:Value must be **INCLUDED AND ASSIGNED** > 0.0</details>|Error|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [R1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#response)|[F1_410](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_410.xml), [F2_410](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F2_410.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)|
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/edu/iris/dmc/station/RuleEngineRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import edu.iris.dmc.station.conditions.InstrumentCodeUnitsCondition;
import edu.iris.dmc.station.conditions.InstrumentCodeUnitsConditionN;
import edu.iris.dmc.station.conditions.InstrumentSensitivityCondition;
import edu.iris.dmc.station.conditions.InstrumentUnitsStageCondition;
import edu.iris.dmc.station.conditions.LastStageUnitCondition;
import edu.iris.dmc.station.conditions.LocationCodeCondition;
import edu.iris.dmc.station.conditions.MissingDecimationCondition;
Expand Down Expand Up @@ -238,6 +239,11 @@ private void defaultResponseRules(Set<Integer> s) {
"Stage[LAST]::OutputUnits:Name must be assigned count(s)",
restrictions), Response.class);
}
if (!s.contains(407)) {
add(407, new InstrumentUnitsStageCondition(true,
"InstrumentSensitivity:InputUnits:Name must equal Stage[1]:InputUnits:Name AND InstrumentSensitivity:OutputUnits:Name must equal Stage[last]:OutputUnits:Name OR InstrumentPolynomial:InputUnits:Name must equal Stage[1]:InputUnits:Name AND InstrumentPolynomial:OutputUnits:Name must equal Stage[last]:OutputUnits:Name",
restrictions), Response.class);
}
if (!s.contains(410)) {
add(410, new EmptySensitivityCondition(true, "If InstrumentSensitivity is included then InstrumentSensitivity:Value must be assigned a double > 0.0 ",
new ChannelCodeRestriction(), new ChannelTypeRestriction(), new ResponsePolynomialRestriction()),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
package edu.iris.dmc.station.conditions;

import edu.iris.dmc.fdsn.station.model.Channel;
import edu.iris.dmc.fdsn.station.model.Network;
import edu.iris.dmc.fdsn.station.model.Response;
import edu.iris.dmc.fdsn.station.model.ResponseStage;
import edu.iris.dmc.fdsn.station.model.Station;
import edu.iris.dmc.station.exceptions.StationxmlException;
import edu.iris.dmc.station.restrictions.Restriction;
import edu.iris.dmc.station.rules.Message;
import edu.iris.dmc.station.rules.NestedMessage;
import edu.iris.dmc.station.rules.Result;

public class InstrumentUnitsStageCondition extends ChannelRestrictedCondition {
private Restriction[] restrictions;

public InstrumentUnitsStageCondition(boolean required, String description, Restriction[] restrictions) {
super(required, description);
this.restrictions = restrictions;
}

@Override
public Message evaluate(Network network) {
throw new IllegalArgumentException("Not supported!");
}

@Override
public Message evaluate(Station station) {
throw new IllegalArgumentException("Not supported!");
}

@Override
public Message evaluate(Channel channel) {
if (channel == null) {
return Result.success();
}
return this.evaluate(channel, channel.getResponse());
}

@Override
public Message evaluate(Channel channel, Response response) {
if (isRestricted(channel)) {
return Result.success();
}
if (this.required) {
if (response == null) {
return Result.error("expected response but was null");
}
}
NestedMessage nestedMessage = new NestedMessage();
boolean returnmessage = false;
String inputUnit ="";
String code = channel.getCode();
try {
if(channel.getResponse().getStage().size()==0) {
throw new StationxmlException("Response is missing from input StationXML");
}
ResponseStage stage1 = channel.getResponse().getStage().get(0);
if(stage1.getCoefficients() != null) {
inputUnit = stage1.getCoefficients().getInputUnits().getName();
}else if(stage1.getPolesZeros() != null){
inputUnit = stage1.getPolesZeros().getInputUnits().getName();
}else if(stage1.getResponseList() != null){
inputUnit = stage1.getResponseList().getInputUnits().getName();
}else if(stage1.getFIR()!=null) {
inputUnit = stage1.getFIR().getInputUnits().getName();
}else if(stage1.getPolynomial()!= null){
inputUnit = stage1.getPolynomial().getInputUnits().getName();
}else {
return Result.success();
}
for (Restriction r : this.restrictions) {
if (r.qualifies(channel)) {
return Result.success();
}
}
int lastindex = channel.getResponse().getStage().size()-1;
ResponseStage stagelast = channel.getResponse().getStage().get(lastindex);
String outputUnit ="";
if(stagelast.getCoefficients() != null) {
outputUnit = stagelast.getCoefficients().getOutputUnits().getName();
}else if(stagelast.getPolesZeros() != null){
outputUnit = stagelast.getPolesZeros().getOutputUnits().getName();
}else if(stagelast.getResponseList() != null){
outputUnit = stagelast.getResponseList().getOutputUnits().getName();
}else if(stagelast.getFIR()!=null) {
outputUnit = stagelast.getFIR().getOutputUnits().getName();
}else if(stagelast.getPolynomial()!= null){
outputUnit = stagelast.getPolynomial().getOutputUnits().getName();
}else {
return Result.success();
}


if (channel.getResponse().getInstrumentSensitivity() != null) {
String instrumentInputUnit = channel.getResponse().
getInstrumentSensitivity().getInputUnits().getName();
String instrumentOutputUnit = channel.getResponse().
getInstrumentSensitivity().getOutputUnits().getName();
if(!inputUnit.equalsIgnoreCase(instrumentInputUnit)){
nestedMessage.add(Result.error("InsturmentSensitivity input "
+ "units "+ instrumentInputUnit+" must equal Stage[01] input "
+ "units "+ inputUnit));
returnmessage=true;
}
if(!outputUnit.equalsIgnoreCase(instrumentOutputUnit)){
if (lastindex+1 < 10 ) {
nestedMessage.add(Result.error("InsturmentSensitivity output "
+ "units "+ instrumentOutputUnit+" must equal Stage["
+String.format("%02d",(lastindex+1))+"] output units "+ outputUnit));
returnmessage=true;
}else {
nestedMessage.add(Result.error("InsturmentSensitivity output "
+ "units "+ instrumentOutputUnit+" must equal Stage["
+(lastindex+1)+"] output units "+ outputUnit));
returnmessage=true;
}
}

}else{
String instrumentInputUnit = channel.getResponse().
getInstrumentPolynomial().getInputUnits().getName();
String instrumentOutputUnit = channel.getResponse().
getInstrumentPolynomial().getOutputUnits().getName();
if(!inputUnit.equalsIgnoreCase(instrumentInputUnit)){
nestedMessage.add(Result.error("InsturmentPolynomial input "
+ "units "+ instrumentInputUnit+" must equal Stage[01] input "
+ "units "+ inputUnit));
returnmessage=true;
}
if(!outputUnit.equalsIgnoreCase(instrumentOutputUnit)){
if (lastindex+1 < 10 ) {
nestedMessage.add(Result.error("InsturmentPolynomial output "
+ "units "+ instrumentOutputUnit+" must equal Stage["
+String.format("%02d",(lastindex+1))+"] output units "+ outputUnit));
returnmessage=true;
}else {
nestedMessage.add(Result.error("InsturmentPolynomial output "
+ "units "+ instrumentOutputUnit+" must equal Stage["
+(lastindex+1)+"] output units "+ outputUnit));
returnmessage=true;
}
}

}


}catch(Exception e) {

}
if(returnmessage==true) {
return nestedMessage;
}else {
return Result.success();
}
}

}


Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package edu.iris.dmc.station.conditions;

import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.InputStream;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import edu.iris.dmc.DocumentMarshaller;
import edu.iris.dmc.fdsn.station.model.Channel;
import edu.iris.dmc.fdsn.station.model.FDSNStationXML;
import edu.iris.dmc.fdsn.station.model.Network;
import edu.iris.dmc.fdsn.station.model.Station;
import edu.iris.dmc.station.RuleEngineServiceTest;
import edu.iris.dmc.station.restrictions.ChannelCodeRestriction;
import edu.iris.dmc.station.restrictions.ChannelTypeRestriction;
import edu.iris.dmc.station.restrictions.Restriction;
import edu.iris.dmc.station.rules.Message;
import edu.iris.dmc.station.rules.NestedMessage;

public class Condition407Test {

private FDSNStationXML theDocument;

@BeforeEach
public void init() throws Exception {

}

@Test
public void sensitivityfail() throws Exception {
try (InputStream is = RuleEngineServiceTest.class.getClassLoader().getResourceAsStream("F1_407.xml")) {
theDocument = DocumentMarshaller.unmarshal(is);

Network n = theDocument.getNetwork().get(0);
Station s = n.getStations().get(0);
Channel c = s.getChannels().get(0);
Restriction[] restrictions = new Restriction[] { new ChannelCodeRestriction(), new ChannelTypeRestriction() };

InstrumentUnitsStageCondition condition = new InstrumentUnitsStageCondition(true, "", restrictions);
Message result = condition.evaluate(c);
NestedMessage nestedMessage=(NestedMessage)result;

assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("InsturmentSensitivity input units Kg/s must equal Stage[01] input units m/s**2"));
assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("InsturmentSensitivity output units COUNTS must equal Stage[12] output units m/s"));

}

}

@Test
public void polynomialfail() throws Exception {
try (InputStream is = RuleEngineServiceTest.class.getClassLoader().getResourceAsStream("F2_407.xml")) {
theDocument = DocumentMarshaller.unmarshal(is);

Network n = theDocument.getNetwork().get(0);
Station s = n.getStations().get(0);
Channel c = s.getChannels().get(0);
Restriction[] restrictions = new Restriction[] { new ChannelCodeRestriction(), new ChannelTypeRestriction() };

InstrumentUnitsStageCondition condition = new InstrumentUnitsStageCondition(true, "", restrictions);
Message result = condition.evaluate(c);
NestedMessage nestedMessage=(NestedMessage)result;

assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("InsturmentPolynomial input units CELSIUS must equal Stage[01] input units VOLT" +
""));

}

}

@Test
public void pass() throws Exception {
try (InputStream is = RuleEngineServiceTest.class.getClassLoader().getResourceAsStream("pass.xml")) {
theDocument = DocumentMarshaller.unmarshal(is);

Network n = theDocument.getNetwork().get(0);
Station s = n.getStations().get(0);
Channel c = s.getChannels().get(0);
Restriction[] restrictions = new Restriction[] { new ChannelCodeRestriction(), new ChannelTypeRestriction() };


InstrumentUnitsStageCondition condition = new InstrumentUnitsStageCondition(true, "", restrictions);

Message result = condition.evaluate(c);
assertTrue(result instanceof edu.iris.dmc.station.rules.Success);
}

}
}

Loading