Skip to content

Commit 08b39f9

Browse files
author
timronan
committed
Add rule 407 to address issue 117. Update documentation for rules 407, 321, 322.
1 parent 1d83eee commit 08b39f9

5 files changed

Lines changed: 289 additions & 1 deletion

File tree

docs/tests.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ DICTIONARY: External reference, such as the units name list
6666
| | **`Channel Time Errors`** ||||
6767
| 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)|
6868
| 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)|
69-
| 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)|
69+
| 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)|
70+
| 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)|
7071
||||||
7172
| | **`Channel Orientation Errors`** ||||
7273
| 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)|
@@ -81,6 +82,7 @@ DICTIONARY: External reference, such as the units name list
8182
| 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)|
8283
| 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)|
8384
| 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)|
85+
| 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)|
8486
||||||
8587
| | **`ResponseType and StageGain Errors`** ||||
8688
| 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)|

src/main/java/edu/iris/dmc/station/RuleEngineRegistry.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import edu.iris.dmc.station.conditions.FrequencyCondition;
3030
import edu.iris.dmc.station.conditions.InstrumentCodeUnitsCondition;
3131
import edu.iris.dmc.station.conditions.InstrumentSensitivityCondition;
32+
import edu.iris.dmc.station.conditions.InstrumentUnitsStageCondition;
3233
import edu.iris.dmc.station.conditions.LastStageUnitCondition;
3334
import edu.iris.dmc.station.conditions.LocationCodeCondition;
3435
import edu.iris.dmc.station.conditions.MissingDecimationCondition;
@@ -231,6 +232,11 @@ private void defaultResponseRules(Set<Integer> s) {
231232
"Stage[LAST]::OutputUnits:Name must be assigned count(s)",
232233
restrictions), Response.class);
233234
}
235+
if (!s.contains(407)) {
236+
add(407, new InstrumentUnitsStageCondition(true,
237+
"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",
238+
restrictions), Response.class);
239+
}
234240
if (!s.contains(410)) {
235241
add(410, new EmptySensitivityCondition(true, "If InstrumentSensitivity is included then InstrumentSensitivity:Value must be assigned a double > 0.0 ",
236242
new ChannelCodeRestriction(), new ChannelTypeRestriction(), new ResponsePolynomialRestriction()),
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package edu.iris.dmc.station.conditions;
2+
3+
import edu.iris.dmc.fdsn.station.model.Channel;
4+
import edu.iris.dmc.fdsn.station.model.Network;
5+
import edu.iris.dmc.fdsn.station.model.Response;
6+
import edu.iris.dmc.fdsn.station.model.ResponseStage;
7+
import edu.iris.dmc.fdsn.station.model.Station;
8+
import edu.iris.dmc.station.exceptions.StationxmlException;
9+
import edu.iris.dmc.station.restrictions.Restriction;
10+
import edu.iris.dmc.station.rules.Message;
11+
import edu.iris.dmc.station.rules.NestedMessage;
12+
import edu.iris.dmc.station.rules.Result;
13+
14+
public class InstrumentUnitsStageCondition extends ChannelRestrictedCondition {
15+
private Restriction[] restrictions;
16+
17+
public InstrumentUnitsStageCondition(boolean required, String description, Restriction[] restrictions) {
18+
super(required, description);
19+
this.restrictions = restrictions;
20+
}
21+
22+
@Override
23+
public Message evaluate(Network network) {
24+
throw new IllegalArgumentException("Not supported!");
25+
}
26+
27+
@Override
28+
public Message evaluate(Station station) {
29+
throw new IllegalArgumentException("Not supported!");
30+
}
31+
32+
@Override
33+
public Message evaluate(Channel channel) {
34+
if (channel == null) {
35+
return Result.success();
36+
}
37+
return this.evaluate(channel, channel.getResponse());
38+
}
39+
40+
@Override
41+
public Message evaluate(Channel channel, Response response) {
42+
if (isRestricted(channel)) {
43+
return Result.success();
44+
}
45+
if (this.required) {
46+
if (response == null) {
47+
return Result.error("expected response but was null");
48+
}
49+
}
50+
NestedMessage nestedMessage = new NestedMessage();
51+
boolean returnmessage = false;
52+
String inputUnit ="";
53+
String code = channel.getCode();
54+
try {
55+
if(channel.getResponse().getStage().size()==0) {
56+
throw new StationxmlException("Response is missing from input StationXML");
57+
}
58+
ResponseStage stage1 = channel.getResponse().getStage().get(0);
59+
if(stage1.getCoefficients() != null) {
60+
inputUnit = stage1.getCoefficients().getInputUnits().getName();
61+
}else if(stage1.getPolesZeros() != null){
62+
inputUnit = stage1.getPolesZeros().getInputUnits().getName();
63+
}else if(stage1.getResponseList() != null){
64+
inputUnit = stage1.getResponseList().getInputUnits().getName();
65+
}else if(stage1.getFIR()!=null) {
66+
inputUnit = stage1.getFIR().getInputUnits().getName();
67+
}else if(stage1.getPolynomial()!= null){
68+
inputUnit = stage1.getPolynomial().getInputUnits().getName();
69+
}else {
70+
return Result.success();
71+
}
72+
for (Restriction r : this.restrictions) {
73+
if (r.qualifies(channel)) {
74+
return Result.success();
75+
}
76+
}
77+
int lastindex = channel.getResponse().getStage().size()-1;
78+
ResponseStage stagelast = channel.getResponse().getStage().get(lastindex);
79+
String outputUnit ="";
80+
if(stagelast.getCoefficients() != null) {
81+
outputUnit = stagelast.getCoefficients().getOutputUnits().getName();
82+
}else if(stagelast.getPolesZeros() != null){
83+
outputUnit = stagelast.getPolesZeros().getOutputUnits().getName();
84+
}else if(stagelast.getResponseList() != null){
85+
outputUnit = stagelast.getResponseList().getOutputUnits().getName();
86+
}else if(stagelast.getFIR()!=null) {
87+
outputUnit = stagelast.getFIR().getOutputUnits().getName();
88+
}else if(stagelast.getPolynomial()!= null){
89+
outputUnit = stagelast.getPolynomial().getOutputUnits().getName();
90+
}else {
91+
return Result.success();
92+
}
93+
94+
95+
if (channel.getResponse().getInstrumentSensitivity() != null) {
96+
String instrumentInputUnit = channel.getResponse().
97+
getInstrumentSensitivity().getInputUnits().getName();
98+
String instrumentOutputUnit = channel.getResponse().
99+
getInstrumentSensitivity().getOutputUnits().getName();
100+
if(!inputUnit.equalsIgnoreCase(instrumentInputUnit)){
101+
nestedMessage.add(Result.error("InsturmentSensitivity input "
102+
+ "units "+ instrumentInputUnit+" must equal Stage[01] input "
103+
+ "units "+ inputUnit));
104+
returnmessage=true;
105+
}
106+
if(!outputUnit.equalsIgnoreCase(instrumentOutputUnit)){
107+
if (lastindex+1 < 10 ) {
108+
nestedMessage.add(Result.error("InsturmentSensitivity output "
109+
+ "units "+ instrumentOutputUnit+" must equal Stage["
110+
+String.format("%02d",(lastindex+1))+"] output units "+ outputUnit));
111+
returnmessage=true;
112+
}else {
113+
nestedMessage.add(Result.error("InsturmentSensitivity output "
114+
+ "units "+ instrumentOutputUnit+" must equal Stage["
115+
+(lastindex+1)+"] output units "+ outputUnit));
116+
returnmessage=true;
117+
}
118+
}
119+
120+
}else{
121+
String instrumentInputUnit = channel.getResponse().
122+
getInstrumentPolynomial().getInputUnits().getName();
123+
String instrumentOutputUnit = channel.getResponse().
124+
getInstrumentPolynomial().getOutputUnits().getName();
125+
if(!inputUnit.equalsIgnoreCase(instrumentInputUnit)){
126+
nestedMessage.add(Result.error("InsturmentPolynomial input "
127+
+ "units "+ instrumentInputUnit+" must equal Stage[01] input "
128+
+ "units "+ inputUnit));
129+
returnmessage=true;
130+
}
131+
if(!outputUnit.equalsIgnoreCase(instrumentOutputUnit)){
132+
if (lastindex+1 < 10 ) {
133+
nestedMessage.add(Result.error("InsturmentPolynomial output "
134+
+ "units "+ instrumentOutputUnit+" must equal Stage["
135+
+String.format("%02d",(lastindex+1))+"] output units "+ outputUnit));
136+
returnmessage=true;
137+
}else {
138+
nestedMessage.add(Result.error("InsturmentPolynomial output "
139+
+ "units "+ instrumentOutputUnit+" must equal Stage["
140+
+(lastindex+1)+"] output units "+ outputUnit));
141+
returnmessage=true;
142+
}
143+
}
144+
145+
}
146+
147+
148+
}catch(Exception e) {
149+
150+
}
151+
if(returnmessage==true) {
152+
return nestedMessage;
153+
}else {
154+
return Result.success();
155+
}
156+
}
157+
158+
}
159+
160+

0 commit comments

Comments
 (0)